aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/socket.js
diff options
context:
space:
mode:
authorsecondl1ght <[email protected]>2022-08-22 18:00:00 -0400
committersecondl1ght <[email protected]>2022-08-22 18:00:00 -0400
commit2aa7156e12200798c45a53878dbcc37c77625752 (patch)
tree85d0cb70ec847bb7df8ca08ee5f5328ebc2600f4 /src/lib/socket.js
parentbc77cf10532a4060d97b0f804111b4f582151120 (diff)
downloadcoinos-ui-2aa7156e12200798c45a53878dbcc37c77625752.tar.gz
coinos-ui-2aa7156e12200798c45a53878dbcc37c77625752.zip
finish hooking up currency selection
Diffstat (limited to 'src/lib/socket.js')
-rw-r--r--src/lib/socket.js3
1 files changed, 1 insertions, 2 deletions
diff --git a/src/lib/socket.js b/src/lib/socket.js
index a30d4376..e85e8f15 100644
--- a/src/lib/socket.js
+++ b/src/lib/socket.js
@@ -1,5 +1,5 @@
import { get } from 'svelte/store';
-import { rate, user, token, invoices, preferredCurrency, newPayment } from '$lib/store';
+import { rate, user, token, invoices, newPayment } from '$lib/store';
import { success } from '$lib/utils';
let interval, socket;
@@ -32,7 +32,6 @@ export const messages = (data) => ({
login() {
user.set(data);
- preferredCurrency.set('USD');
}
});
id='n160' href='#n160'>160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
import { browser } from "$app/environment";
import { toast } from "@zerodevx/svelte-toast";
import { goto } from "$app/navigation";
import { PUBLIC_COINOS_URL } from "$env/static/public";
import { page } from "$app/stores";
import { get as getStore } from "svelte/store";

export function scroll(section) {
  if (getStore(page).url.pathname !== "/") goto("/");
  setTimeout(() => section.scrollIntoView({ behavior: "smooth" }), 500);
}

let base = browser ? "" : PUBLIC_COINOS_URL;

export let punk = (k) =>
  Math.floor((parseInt(k.slice(-2), 16) / 256) * 64) + 1 + ".webp";

export let g = (url, fetch, headers) =>
  fetch(base + url, { headers })
    .then((r) => r.text())
    .then((body) => {
      try {
        return JSON.parse(body);
      } catch (e) {
        throw new Error(body);
      }
    });

export let get = (url, headers = {}) => {
  return fetch(base + url, { headers })
    .then(async (r) => {
      if (r.ok) return r.text();
      throw new Error(await r.text());
    })
    .then((body) => {
      try {
        return JSON.parse(body);
      } catch (e) {
        return body;
      }
    });
};

export let post = async (url, body, headers, timeout = 8000) => {
  headers = {
    "content-type": "application/json",
    accept: "application/json",
    ...headers,
  };

  let controller = new AbortController();
  let id = setTimeout(() => {
    controller.abort(new Error("Operation timed out"));
  }, timeout);

  let response = await fetch(base + url, {
    method: "POST",
    body: JSON.stringify(body),
    headers,
    signal: controller.signal,
  })
    .then(async (r) => {
      if (r.ok) return r.text();
      let text = await r.text();

      let message;
      try {
        ({ message } = JSON.parse(text));
      } catch (e) {}

      if (message) throw new Error(message);
      throw new Error(text);
    })
    .then((body) => {
      try {
        body = JSON.parse(body);
      } catch (e) {
        throw new Error(body);
      }

      if (body.error instanceof Error) throw body.error;
      if (body instanceof Error) throw body;
      if (body.name === "Error") throw new Error(body.message);

      return body;
    });

  clearTimeout(id);
  return response;
};

export let copy = (text) => {
  navigator.clipboard.writeText(text);
  success("Copied!");
};

export let copyNoNewlines = (text) => {
  let stripped = text.replace(/\n/g, " ").replace(/\s+/g, " ");
  navigator.clipboard.writeText(stripped);
  success("Copied!");
};

export function reverseFormat(val, locale) {
  let parts = new Intl.NumberFormat(locale).formatToParts(1111.1);
  let group = parts.find((part) => part.type === "group").value;
  let decimal = parts.find((part) => part.type === "decimal").value;
  let reversedVal = val.replace(new RegExp("\\" + group, "g"), "");
  reversedVal = reversedVal.replace(new RegExp("\\" + decimal, "g"), ".");
  return Number.isNaN(reversedVal) ? 0 : +reversedVal;
}

export let protectedRoutes = [/customers/, /settings/, /payments/];

let recent = [];
export let success = (m, clear = true) => {
  if (recent.includes(m)) return;
  recent.push(m);
  setTimeout(() => (recent = []), 5000);
  if (clear) toast.pop();
  toast.push(m, {
    theme: {
      "--toastBarBackground": "#F5F7FA",
    },
  });
};

export let warning = (m, clear = true) => {
  if (clear) toast.pop();
  toast.push(m, {
    theme: {
      "--toastBarBackground": "#FFCE22",
    },
  });
};
export let fail = (m, clear = true) => {
  if (clear) toast.pop();
  toast.push(m, {
    theme: {
      "--toastBarBackground": "#E93535",
    },
  });
};
export let info = (m) => {
  toast.pop();
  toast.push(m, {
    theme: {
      "--toastBarBackground": "white",
    },
  });
};

export let login = async (user, cookies, ip) => {
  let maxAge = 380 * 24 * 60 * 60;

  let res = await fetch(base + "/login", {
    method: "POST",
    body: JSON.stringify(user),
    headers: {
      "content-type": "application/json",
      accept: "application/json",
      "cf-connecting-ip": ip,
    },
  });
  if (res.status === 401) {
    let text = await res.text();
    if (text.startsWith("2fa")) throw new Error("2fa");
  }

  let { user: u, token } = await res.json();
  if (!token) throw new Error("Login failed");

  let expires = new Date();
  expires.setSeconds(expires.getSeconds() + maxAge);

  let opts = { path: "/", expires };
  if (u.language) cookies.set("lang", u.language, opts);
  cookies.set("username", user.username, opts);
  cookies.set("token", token, opts);
};

export let auth = (cookies) => ({
  authorization: `Bearer ${cookies.get("token")}`,
});

export let btc = (fiat, rate) => Math.round((fiat * sats) / rate);
export let fiat = (amount, rate) => (amount * rate) / sats;
export let fd = async (req) => {
  let obj = Object.fromEntries(await req.formData());
  for (let k in obj)
    (obj[k] === "undefined" && (obj[k] = undefined)) ||
      (obj[k] === "false" && (obj[k] = false));
  return obj;
};

export let f = (s, currency) =>
  new Intl.NumberFormat("en-US", {
    style: "currency",
    currency,
  })
    .format(s)
    .replace("CA", "");

export let s = (s) =>
  new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 }).format(s);

export let sat = (s) => {
  s = Math.abs(s);
  let p = Math.floor(Math.log(s) / Math.LN10 + 0.000000001);
  let d = Math.floor((p + 1) / 3);

  return (
    "⚡️" +
    (parseInt(s) > 0
      ? new Intl.NumberFormat("en-US", { maximumFractionDigits: 2 }).format(
          s / Math.pow(1000, d)
        ) + ["", "K", "M", "G", "T", "P", "E", "Z"][d]
      : 0
    ).toString()
  );
};

export let sats = 100000000;

export let back = () =>
  browser && (history.length ? history.go(-1) : goto("/"));

export let focus = (el) =>
  browser && screen.width > 1280 && setTimeout(() => el.focus(), 1);

export let select = (el) =>
  browser && screen.width > 1280 && setTimeout(() => el.select(), 1);

export let sleep = (n) => new Promise((r) => setTimeout(r, n));
export let wait = async (f, n = 100, s = 300) => {
  let i = 0;
  while (!(await f()) && i < s) (await sleep(n)) && i++;
  if (i >= s) throw new Error("timeout");
  return f();
};

export let stretch = async (password, salt) =>
  crypto.subtle.deriveKey(
    {
      name: "PBKDF2",
      salt,
      iterations: 100000,
      hash: "SHA-256",
    },
    await crypto.subtle.importKey(
      "raw",
      new TextEncoder().encode(password),
      { name: "PBKDF2" },
      false,
      ["deriveBits", "deriveKey"]
    ),
    { name: "AES-GCM", length: 256 },
    true,
    ["encrypt", "decrypt"]
  );

function get_bigrams(string) {
  var s = string.toLowerCase();
  var v = s.split("");
  for (var i = 0; i < v.length; i++) {
    v[i] = s.slice(i, i + 2);
  }
  return v;
}

export function ss(str1, str2) {
  if (str1.length > 0 && str2.length > 0) {
    var pairs1 = get_bigrams(str1);
    var pairs2 = get_bigrams(str2);
    var union = pairs1.length + pairs2.length;
    var hits = 0;
    for (var x = 0; x < pairs1.length; x++) {
      for (var y = 0; y < pairs2.length; y++) {
        if (pairs1[x] == pairs2[y]) hit_count++;
      }
    }
    if (hits > 0) return (2.0 * hits) / union;
  }

  return 0.0;
}

export let types = {
  bitcoin: "bitcoin",
  liquid: "liquid",
  lightning: "lightning",
  internal: "internal",
  fund: "fund",
};

export let ease = (t) =>
  t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;

export function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
}

export let closest = (a, n) =>
  a.reduce((prev, curr) =>
    Math.abs(curr - n) < Math.abs(prev - n) ? curr : prev
  );

export let isLiquid = (text) =>
  text.startsWith("Az") ||
  text.startsWith("lq1") ||
  text.startsWith("VJL") ||
  text.startsWith("VT") ||
  text.startsWith("XR") ||
  text.startsWith("XC") ||
  ((text.startsWith("H") || text.startsWith("G") || text.startsWith("Q")) &&
    text.length === 34) ||
  (text.startsWith("ert1q") && text.length === 43) ||
  (text.startsWith("ex1q") && text.length === 42) ||
  text.startsWith("el1qq") ||
  text.startsWith("lq1qq");

export function getCookie(name) {
  let nameEQ = name + "=";
  let ca = document.cookie.split(";");
  for (let i = 0; i < ca.length; i++) {
    let c = ca[i];
    while (c.charAt(0) === " ") c = c.substring(1);
    if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
  }
  return null;
}

export function setCookie(name, value, seconds) {
  const now = new Date();
  now.setTime(now.getTime() + seconds * 1000);
  const expires = "expires=" + now.toUTCString();
  document.cookie = name + "=" + value + ";" + expires + ";path=/";
}