Skip to content

Commit cd50409

Browse files
committed
fix: add persistentWritable
1 parent 6cb3189 commit cd50409

File tree

3 files changed

+52
-2
lines changed

3 files changed

+52
-2
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
"@mateoroldos/svelte.bones": "^1.2.0",
7474
"@types/prismjs": "^1.26.0",
7575
"cssnano": "^5.1.14",
76+
"devalue": "^4.3.2",
7677
"js-cookie": "^3.0.5",
7778
"prismjs": "^1.29.0"
7879
},
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { writable, type Writable } from 'svelte/store';
2+
import { browser } from '$app/environment';
3+
import * as devalue from 'devalue';
4+
import Cookies from 'js-cookie';
5+
6+
function persistentWritable<T>(key: string, defaultValue: T, useCookies: boolean = false) {
7+
// Create a writable store.
8+
const { subscribe, set, update }: Writable<T> = writable();
9+
10+
let storedValue: string | undefined | null;
11+
// Get stored value.
12+
if (browser) {
13+
storedValue = useCookies ? Cookies.get(key) : localStorage.getItem(key);
14+
}
15+
16+
// Determine resolved value.
17+
const resolvedValue: T | string | null =
18+
storedValue === undefined || storedValue === null ? defaultValue : storedValue;
19+
if (resolvedValue && isJsonString(resolvedValue)) {
20+
set(devalue.parse(resolvedValue as string));
21+
} else {
22+
set(resolvedValue as T);
23+
}
24+
25+
// Subscribe to changes.
26+
subscribe((value) => {
27+
// Store the new value.
28+
if (browser) {
29+
if (useCookies) {
30+
Cookies.set(key, value);
31+
} else {
32+
localStorage.setItem(key, devalue.stringify(value));
33+
}
34+
}
35+
});
36+
37+
return { subscribe, set, update };
38+
}
39+
40+
function isJsonString<T>(str: T | string) {
41+
try {
42+
devalue.parse(str as string);
43+
} catch (e) {
44+
return false;
45+
}
46+
return true;
47+
}
48+
49+
export default persistentWritable;

0 commit comments

Comments
 (0)