File
Blob: src/client/components/confirm-store.ts
| 1 | interface ConfirmOptions { |
| 2 | title: string; |
| 3 | message: string; |
| 4 | confirmLabel?: string; |
| 5 | cancelLabel?: string; |
| 6 | variant?: "danger" | "default"; |
| 7 | } |
| 8 | |
| 9 | export interface ConfirmState extends ConfirmOptions { |
| 10 | open: boolean; |
| 11 | } |
| 12 | |
| 13 | let resolver: ((value: boolean) => void) | null = null; |
| 14 | let current: ConfirmState | null = null; |
| 15 | const listeners = new Set<() => void>(); |
| 16 | |
| 17 | function emit() { |
| 18 | for (const listener of listeners) listener(); |
| 19 | } |
| 20 | |
| 21 | export function subscribeConfirm(listener: () => void) { |
| 22 | listeners.add(listener); |
| 23 | return () => listeners.delete(listener); |
| 24 | } |
| 25 | |
| 26 | export function getConfirmSnapshot() { |
| 27 | return current; |
| 28 | } |
| 29 | |
| 30 | export function dismissConfirm(value: boolean) { |
| 31 | if (resolver) resolver(value); |
| 32 | resolver = null; |
| 33 | current = null; |
| 34 | emit(); |
| 35 | } |
| 36 | |
| 37 | export 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 | } |