-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathglobal-dialog.ts
More file actions
63 lines (53 loc) · 1.36 KB
/
Copy pathglobal-dialog.ts
File metadata and controls
63 lines (53 loc) · 1.36 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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import type { VariantProps } from "class-variance-authority";
import { atom } from "jotai";
import type { ReactNode } from "react";
import type { buttonVariants } from "@/components/ui/button";
export type GlobalDialogBase = {
title: ReactNode;
description?: ReactNode;
confirmText?: string;
cancelText?: string;
confirmVariant?: VariantProps<typeof buttonVariants>["variant"];
};
export type GlobalAlertDialog = GlobalDialogBase & {
type: "alert";
};
export type GlobalConfirmDialog = GlobalDialogBase & {
type: "confirm";
};
export type GlobalDialogDefinition = GlobalAlertDialog | GlobalConfirmDialog;
type GlobalDialogRequest = {
id: number;
definition: GlobalDialogDefinition;
resolve: (accepted: boolean) => void;
};
let nextGlobalDialogId = 1;
export const globalDialogAtom = atom<GlobalDialogRequest | null>(null);
export const openGlobalDialogAtom = atom(
null,
(
_get,
set,
params: {
definition: GlobalDialogDefinition;
resolve: (accepted: boolean) => void;
},
) => {
set(globalDialogAtom, {
id: nextGlobalDialogId++,
definition: params.definition,
resolve: params.resolve,
});
},
);
export const closeGlobalDialogAtom = atom(
null,
(get, set, accepted: boolean) => {
const currentDialog = get(globalDialogAtom);
if (!currentDialog) {
return;
}
set(globalDialogAtom, null);
currentDialog.resolve(accepted);
},
);