aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/socket.js34
-rw-r--r--src/lib/store.js22
-rw-r--r--src/lib/utils.js49
3 files changed, 86 insertions, 19 deletions
diff --git a/src/lib/socket.js b/src/lib/socket.js
index efc2651b..66091d76 100644
--- a/src/lib/socket.js
+++ b/src/lib/socket.js
@@ -1,23 +1,31 @@
-import { get } from "svelte/store";
-import { rate, user, token, ws } from '$lib/store';
+import { get } from 'svelte/store';
+import { rate, user, token, invoices, preferredCurrency } from '$lib/store';
let interval, socket;
+export const auth = () => {
+ let t = get(token);
+ if (t) send('login', t);
+};
+
+export const send = (type, data) => {
+ socket?.readyState === 1 && socket.send(JSON.stringify({ type, data }));
+};
+
export const messages = (data) => ({
rate() {
rate.set(data);
},
payment() {
- console.log(data);
+ invoices.set({ ...get(invoices), [data.invoice.uuid]: data.invoice });
},
- connected() {
- socket.send(JSON.stringify({ type: 'login', data: { token: get(token) } }));
- },
+ connected: auth,
login() {
user.set(data);
+ preferredCurrency.set(data.currency);
}
});
@@ -29,18 +37,18 @@ let currentReconnectDelay = initialReconnectDelay;
export function connect() {
clearInterval(interval);
- if (socket) socket.close();
+ if (socket) return auth();
+
socket = new WebSocket('ws://localhost:3119/ws');
socket.addEventListener('open', onWebsocketOpen);
socket.addEventListener('close', onWebsocketClose);
socket.addEventListener('message', onWebsocketMessage);
- interval = setInterval(
- () => socket.readyState === 1 && socket.send(JSON.stringify({ type: 'heartbeat' })),
- 5000
- );
+ interval = setInterval(() => send('heartbeat'), 5000);
+}
- ws.set(socket);
+export function close() {
+ if (socket) socket.close();
}
function onWebsocketMessage(msg) {
@@ -53,7 +61,7 @@ function onWebsocketOpen() {
}
function onWebsocketClose() {
- ws.set(null);
+ socket = null;
setTimeout(() => {
reconnectToWebsocket();
}, currentReconnectDelay + Math.floor(Math.random() * 3000));
diff --git a/src/lib/store.js b/src/lib/store.js
index 3963f55a..b20fd10f 100644
--- a/src/lib/store.js
+++ b/src/lib/store.js
@@ -1,6 +1,22 @@
-import { writable } from 'svelte/store';
+import { get, writable } from 'svelte/store';
+import { browser } from '$app/env';
+
+const persisted = (k, i) => {
+ let s = writable(
+ browser && sessionStorage.getItem(k) && sessionStorage.getItem(k) !== 'undefined'
+ ? JSON.parse(sessionStorage.getItem(k))
+ : i
+ );
+
+ s.subscribe((v) => browser && sessionStorage.setItem(k, JSON.stringify(v)));
+
+ return s;
+};
export const rate = writable();
export const user = writable();
-export const token = writable();
-export const ws = writable();
+export const invoiceAmount = writable();
+export const invoiceAmountFiat = writable();
+export const token = persisted('token');
+export const invoices = writable({});
+export const preferredCurrency = writable();
diff --git a/src/lib/utils.js b/src/lib/utils.js
index 595d2dd8..669b2b5e 100644
--- a/src/lib/utils.js
+++ b/src/lib/utils.js
@@ -1,10 +1,53 @@
+import { browser } from '$app/env';
+
export function scroll(section) {
section.scrollIntoView({ behavior: 'smooth' });
}
+const base = browser ? '' : import.meta.env.VITE_COINOS_URL;
+
+export const get = (url, headers = { accept: 'application/json' }) =>
+ fetch(base + url, { headers })
+ .then((r) => r.text())
+ .then((body) => {
+ try {
+ return JSON.parse(body);
+ } catch (e) {
+ throw new Error(body);
+ }
+ });
+
export const post = (url, body) =>
- fetch(url, {
+ fetch(base + url, {
method: 'POST',
body: JSON.stringify(body),
- headers: { 'accept': 'application/json', 'content-type': 'application/json' }
- });
+ headers: { accept: 'application/json', 'content-type': 'application/json' }
+ })
+ .then((r) => r.text())
+ .then((body) => {
+ try {
+ body = JSON.parse(body);
+ } catch (e) {
+ throw new Error(body);
+ }
+
+ if (body instanceof Error) throw body;
+ if (body.name === 'Error') throw new Error(body.message);
+
+ return body;
+ });
+
+export const copy = (text) => {
+ navigator.clipboard.writeText(text);
+};
+
+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 = [/receive/, /customers/, /dashboard/, /settings/, /transactions/];