diff options
author | Minseo Lee <itoupluk427@gmail.com> | 2024-02-29 13:05:45 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-29 13:05:45 +0900 |
commit | 200c4c1d379e591e82d6d1bd065a443f6abc03f5 (patch) | |
tree | db7257f0178b2d9514642a7faf3e003d60d2b418 /src/state/dialogs/index.tsx | |
parent | a1127bfcfc7ad080a5bd6210c6561788f1643db8 (diff) | |
parent | a35976cdc9b6467ad8b6e0c4ff46ba684fee9064 (diff) | |
download | voidsky-200c4c1d379e591e82d6d1bd065a443f6abc03f5.tar.zst |
Merge branch 'bluesky-social:main' into patch-3
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}> |