-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathstore.ts
49 lines (43 loc) · 1.11 KB
/
store.ts
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
import { type OverlayControllerComponent } from './provider';
import { type OverlayReducerAction, overlayReducer } from './reducer';
type OverlayId = string;
export type OverlayItem = {
id: OverlayId;
isOpen: boolean;
controller: OverlayControllerComponent;
};
export type OverlayData =
| {
current: OverlayId | null;
overlayOrderList: OverlayId[];
overlayData: Record<OverlayId, OverlayItem>;
}
| undefined;
/**
* @description Using `OverlayProvider` will initialize the variable
*/
let overlays: OverlayData = undefined;
let listeners: Array<() => void> = [];
function emitChangeListener() {
for (const listener of listeners) {
listener();
}
}
export function dispatchOverlay(action: OverlayReducerAction) {
overlays = overlayReducer(overlays, action);
emitChangeListener();
}
/**
* @description for useSyncExternalStorage
*/
export const registerOverlaysStore = {
subscribe(listener: () => void) {
listeners = [...listeners, listener];
return () => {
listeners = listeners.filter((l) => l !== listener);
};
},
getSnapshot() {
return overlays;
},
};