aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/store.js
blob: 18a8824f0f4f801a72bc7c2f0b6536908a1147aa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import { get, writable } from 'svelte/store';
import { browser } from '$app/env';

// creates a Svelte store synced to sessionStorage with the given key and default value
const persistSession = (key, defaultValue) => {
	let s = writable(
		browser && sessionStorage.getItem(key) && sessionStorage.getItem(key) !== 'undefined'
			? JSON.parse(sessionStorage.getItem(key))
			: defaultValue
	);

	s.subscribe((v) => browser && sessionStorage.setItem(key, JSON.stringify(v)));

	return s;
};

// creates a Svelte store synced to localStorage with the given key and default value
const persistLocal = (key, defaultValue) => {
	let s = writable(
		browser && localStorage.getItem(key) && localStorage.getItem(key) !== 'undefined'
			? JSON.parse(localStorage.getItem(key))
			: defaultValue
	);

	s.subscribe((v) => browser && localStorage.setItem(key, JSON.stringify(v)));

	return s;
};

export const rate = writable();
export const rates = writable();
export const selectedRate = writable();
export const user = writable();
export const invoiceAmount = writable();
export const invoiceAmountFiat = writable();
export const token = persistSession('token');
export const invoices = writable({});
export const newPayment = persistLocal('newPayment');
export const colorTheme = writable('from-primary to-gradient');
/span>=> ({ id() { last.set(Date.now()); }, invoice() { invoice.set(data); }, event() { data.seen = Math.round(Date.now() / 1000); events[data.id] = data; q.push(data.id); $events.set(events); while (q.length > 10000) delete events[q.shift()]; localStorage.setItem( 'events', JSON.stringify(q.slice(-100).reduce((a, b) => (a = { ...a, [b]: events[b] }), {})) ); }, rate() { rate.set(data); }, request() { request.set(data); invalidate('app:invoice'); }, async payment() { let { amount, invoice } = data; invalidate('app:invoice'); let p = get(payments); let i = p.findIndex((p) => p.id === data.id); if (~i) { p[i] = data; payments.set(p); } else newPayment.set(true); invalidate((url) => url.pathname === '/payments'); if (amount > 0) { success(`${data.confirmed ? 'Received' : 'Detected'} ${sat(amount)}!`); } else { // success(`Sent ${sat(amount)}!`); } }, connected: auth }); const initialReconnectDelay = 1000; const maxReconnectDelay = 16000; let currentReconnectDelay = initialReconnectDelay; export function connect(t) { token = t; if (socket) return auth(); socket = new WebSocket(PUBLIC_SOCKET); socket.addEventListener('open', onWebsocketOpen); socket.addEventListener('close', onWebsocketClose); socket.addEventListener('message', onWebsocketMessage); } export function close() { if (socket) socket.close(); } function onWebsocketMessage(msg) { let { type, data } = JSON.parse(msg.data); messages(data)[type] && messages(data)[type](); } function onWebsocketOpen() { currentReconnectDelay = initialReconnectDelay; } function onWebsocketClose() { socket = null; setTimeout(() => { reconnectToWebsocket(); }, currentReconnectDelay + Math.floor(Math.random() * 3000)); } function reconnectToWebsocket() { if (currentReconnectDelay < maxReconnectDelay) { currentReconnectDelay *= 2; } connect(token); }