Skip to content
File

Blob: src/client/components/confirm-store.ts

typescript45 lines
1interface ConfirmOptions {
2 title: string;
3 message: string;
4 confirmLabel?: string;
5 cancelLabel?: string;
6 variant?: "danger" | "default";
7}
8 
9export interface ConfirmState extends ConfirmOptions {
10 open: boolean;
11}
12 
13let resolver: ((value: boolean) => void) | null = null;
14let current: ConfirmState | null = null;
15const listeners = new Set<() => void>();
16 
17function emit() {
18 for (const listener of listeners) listener();
19}
20 
21export function subscribeConfirm(listener: () => void) {
22 listeners.add(listener);
23 return () => listeners.delete(listener);
24}
25 
26export function getConfirmSnapshot() {
27 return current;
28}
29 
30export function dismissConfirm(value: boolean) {
31 if (resolver) resolver(value);
32 resolver = null;
33 current = null;
34 emit();
35}
36 
37export function confirm(opts: ConfirmOptions): Promise<boolean> {
38 if (resolver) resolver(false);
39 return new Promise<boolean>((resolve) => {
40 resolver = resolve;
41 current = { ...opts, open: true };
42 emit();
43 });
44}