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