-
Notifications
You must be signed in to change notification settings - Fork 52
Expand file tree
/
Copy pathcreateStorage.ts
More file actions
46 lines (40 loc) · 1.09 KB
/
createStorage.ts
File metadata and controls
46 lines (40 loc) · 1.09 KB
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
40
41
42
43
44
45
46
import { createObserver } from "./createObserver.ts";
const memoryStorage = () => {
const state: Record<string, string> = {};
return {
getItem: (key: string) => state[key],
setItem: (key: string, value: string) => {
state[key] = value;
},
removeItem: (key: string) => {
delete state[key];
},
};
};
export const createStorage = <T>(
key: string,
storage = typeof window !== "undefined" ? window.localStorage : memoryStorage(),
) => {
let data: T | null = JSON.parse(storage.getItem(key) ?? "null");
const { subscribe, notify } = createObserver();
const get = () => data;
const set = (value: T) => {
try {
data = value;
storage.setItem(key, JSON.stringify(data));
notify();
} catch (error) {
console.error(`Error setting storage item for key "${key}":`, error);
}
};
const reset = () => {
try {
data = null;
storage.removeItem(key);
notify();
} catch (error) {
console.error(`Error removing storage item for key "${key}":`, error);
}
};
return { get, set, reset, subscribe };
};