aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Utility/persistentStore.ts
blob: a3837a5b73b4fdd19b3abac26804948a77e33fca (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
import { writable, type Writable } from "svelte/store";
import { browser } from "$app/environment";

export const persistentStore = <T>(key: string, initial: T): Writable<T> => {
	const store = writable<T>(initial);

	if (browser)
		import("localforage").then(async (localforage) => {
			let hydrated = false;
			let pendingValue = initial;

			store.subscribe((value) => {
				pendingValue = value;

				if (hydrated) localforage.default.setItem(key, value);
			});

			const value = await localforage.default.getItem<T>(key);

			if (value !== null) store.set(value);

			hydrated = true;

			await localforage.default.setItem(key, pendingValue);
		});

	return store;
};