diff options
| author | Adrien Hopkins <[email protected]> | 2022-08-02 13:13:27 -0500 |
|---|---|---|
| committer | Adrien Hopkins <[email protected]> | 2022-08-02 13:13:27 -0500 |
| commit | c21ee41b206db79b2157d8743b0473a094448dfb (patch) | |
| tree | fac1a595e451c0b32ceedfe4fb70855270456377 /src/lib | |
| parent | 3b216dd6c170a7d71d21a391098c554008c8bdb4 (diff) | |
| parent | 05f5001fc7d325e31d9c777be11343604c72fbfd (diff) | |
| download | coinos-ui-c21ee41b206db79b2157d8743b0473a094448dfb.tar.gz coinos-ui-c21ee41b206db79b2157d8743b0473a094448dfb.zip | |
Merge branch 'master' into i18n
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/socket.js | 34 | ||||
| -rw-r--r-- | src/lib/store.js | 22 | ||||
| -rw-r--r-- | src/lib/utils.js | 49 |
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/]; |
