forked from lxdao-official/gclx-official
-
Notifications
You must be signed in to change notification settings - Fork 0
/
store.js
66 lines (54 loc) · 1.44 KB
/
store.js
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
function setToLocalStorage(key, value) {
localStorage.setItem(key, JSON.stringify(value));
}
function getFromLocalStorage(key) {
const value = localStorage.getItem(key);
return JSON.parse(value);
}
function removeFromLocalStorage(key) {
localStorage.removeItem(key);
}
function Store() {
let store = getFromLocalStorage("store") || {};
let subscriptions = {};
function get(name) {
return store[name];
}
function set(name, value) {
store = { ...store, [name]: value };
setToLocalStorage("store", store);
if (subscriptions[name] && subscriptions[name].length) {
subscriptions[name]
.filter((callback) => callback !== null)
.forEach((callback) => {
callback(value);
});
}
}
function subscribe(name, callback) {
if (!subscriptions[name]) {
subscriptions[name] = [];
}
const existing = subscriptions[name].find((cb) => cb === callback);
if (existing) {
return () => {};
}
const length = subscriptions[name].push(callback);
const index = length - 1;
return () => {
subscriptions[name][index] = null;
};
}
function reset() {
store = {};
subscriptions = {};
removeFromLocalStorage("store");
}
return { get, set, subscribe, reset };
}
let storeInstance = {};
if (typeof window !== "undefined") {
storeInstance = Store();
}
const { get, set, subscribe, reset } = storeInstance;
export { get, set, subscribe, reset };