xref: /MusicFree/src/components/dialogs/useDialog.ts (revision 5d19d26c98d1c233995663070b95e5f28b5b9e1c)
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
11export default function useDialog() {
12    const [dialogName, setDialogName] = useAtom(dialogNameAtom);
13    const [payload, setPayload] = useAtom(payloadAtom);
14
15    function showDialog<T extends keyof IDialogType>(
16        name: T,
17        payload?: Omit<Parameters<IDialogType[T]>[0], injectedProps>,
18    ) {
19        setDialogName(name);
20        setPayload(payload);
21    }
22
23    function hideDialog() {
24        setDialogName(null);
25        setPayload(undefined);
26    }
27
28    return {dialogName, payload, showDialog, hideDialog};
29}
30