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