diff options
Diffstat (limited to 'src/state/dialogs/index.tsx')
-rw-r--r-- | src/state/dialogs/index.tsx | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/src/state/dialogs/index.tsx b/src/state/dialogs/index.tsx index ae762bd97..9fc70c178 100644 --- a/src/state/dialogs/index.tsx +++ b/src/state/dialogs/index.tsx @@ -1,21 +1,32 @@ import React from 'react' -import {DialogControlProps} from '#/components/Dialog' +import {DialogControlRefProps} from '#/components/Dialog' import {Provider as GlobalDialogsProvider} from '#/components/dialogs/Context' const DialogContext = React.createContext<{ + /** + * The currently active `useDialogControl` hooks. + */ activeDialogs: React.MutableRefObject< - Map<string, React.MutableRefObject<DialogControlProps>> + Map<string, React.MutableRefObject<DialogControlRefProps>> > + /** + * The currently open dialogs, referenced by their IDs, generated from + * `useId`. + */ + openDialogs: React.MutableRefObject<Set<string>> }>({ activeDialogs: { current: new Map(), }, + openDialogs: { + current: new Set(), + }, }) const DialogControlContext = React.createContext<{ - closeAllDialogs(): void + closeAllDialogs(): boolean }>({ - closeAllDialogs: () => {}, + closeAllDialogs: () => false, }) export function useDialogStateContext() { @@ -28,13 +39,18 @@ export function useDialogStateControlContext() { export function Provider({children}: React.PropsWithChildren<{}>) { const activeDialogs = React.useRef< - Map<string, React.MutableRefObject<DialogControlProps>> + Map<string, React.MutableRefObject<DialogControlRefProps>> >(new Map()) + const openDialogs = React.useRef<Set<string>>(new Set()) + const closeAllDialogs = React.useCallback(() => { activeDialogs.current.forEach(dialog => dialog.current.close()) + return openDialogs.current.size > 0 }, []) - const context = React.useMemo(() => ({activeDialogs}), []) + + const context = React.useMemo(() => ({activeDialogs, openDialogs}), []) const controls = React.useMemo(() => ({closeAllDialogs}), [closeAllDialogs]) + return ( <DialogContext.Provider value={context}> <DialogControlContext.Provider value={controls}> |