Integrate new dialogs into old back handling (#3023)

This commit is contained in:
Eric Bailey 2024-02-28 20:06:26 -06:00 committed by GitHub
parent 7fd13cacfe
commit 2440975bd2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 64 additions and 20 deletions

View file

@ -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}>

View file

@ -3,7 +3,7 @@ import {useLightboxControls} from './lightbox'
import {useModalControls} from './modals'
import {useComposerControls} from './shell/composer'
import {useSetDrawerOpen} from './shell/drawer-open'
import {useDialogStateControlContext} from 'state/dialogs'
import {useDialogStateControlContext} from '#/state/dialogs'
/**
* returns true if something was closed
@ -13,6 +13,7 @@ export function useCloseAnyActiveElement() {
const {closeLightbox} = useLightboxControls()
const {closeModal} = useModalControls()
const {closeComposer} = useComposerControls()
const {closeAllDialogs} = useDialogStateControlContext()
const setDrawerOpen = useSetDrawerOpen()
return useCallback(() => {
if (closeLightbox()) {
@ -24,9 +25,12 @@ export function useCloseAnyActiveElement() {
if (closeComposer()) {
return true
}
if (closeAllDialogs()) {
return true
}
setDrawerOpen(false)
return false
}, [closeLightbox, closeModal, closeComposer, setDrawerOpen])
}, [closeLightbox, closeModal, closeComposer, setDrawerOpen, closeAllDialogs])
}
/**