xref: /MusicFree/src/components/dialogs/useDialog.ts (revision 4060c00a75883036bbd315fb25c90065209312b3)
1import {atom, useAtom} from 'jotai';
2import {IDialogKey, IDialogType} from './components';
3
4type injectedProps = 'visible' | 'hideDialog';
5const dialogNameAtom = atom<IDialogKey | null>(null);
6const payloadAtom = atom<
7    | Omit<Parameters<IDialogType[keyof IDialogType]>[0], injectedProps>
8    | undefined
9>(undefined);
10
11// type IDialogType = {
12//   'simple-dialog': {
13//     title: string;
14//     content: string;
15//     onOk?: () => void;
16//   };
17// };
18
19export default function useDialog() {
20    const [dialogName, setDialogName] = useAtom(dialogNameAtom);
21    const [payload, setPayload] = useAtom(payloadAtom);
22
23    function showDialog<T extends keyof IDialogType>(
24        name: T,
25        payload?: Omit<Parameters<IDialogType[T]>[0], injectedProps>,
26    ) {
27        setDialogName(name);
28        setPayload(payload);
29    }
30
31    function hideDialog() {
32        setDialogName(null);
33        setPayload(undefined);
34    }
35
36    return {dialogName, payload, showDialog, hideDialog};
37}
38