diff options
author | Samuel Newman <mozzius@protonmail.com> | 2024-10-08 20:00:49 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-08 20:00:49 +0300 |
commit | fc82d2f6d5e8a93f0e7ce4861c5205c8a4b49c30 (patch) | |
tree | 51e618db283d28ef241f0e6f2f6180004e6cb6e7 /src/components/Dialog/index.web.tsx | |
parent | efcf8a6ae59d9767bc2289af927a2e12bc39a054 (diff) | |
download | voidsky-fc82d2f6d5e8a93f0e7ce4861c5205c8a4b49c30.tar.zst |
Move Dialogs to Radix (#5648)
* Use Redix FocusTrap (#5638) * Use Redix FocusTrap * force resolutions on radix libs * add focus guards * use @radix-ui/dismissable-layer for escape handling * fix banner menu keypress by using `Pressable` * add menu in dialog example to storybook --------- Co-authored-by: Samuel Newman <mozzius@protonmail.com> * use DismissableLayer/FocusScope for composer * fix storybook dialog * thread Portal through Prompt and avatar/banner * fix dialog style regression * remove tamagui --------- Co-authored-by: Eric Bailey <git@esb.lol>
Diffstat (limited to 'src/components/Dialog/index.web.tsx')
-rw-r--r-- | src/components/Dialog/index.web.tsx | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/src/components/Dialog/index.web.tsx b/src/components/Dialog/index.web.tsx index 7b9cfb693..1a20311d3 100644 --- a/src/components/Dialog/index.web.tsx +++ b/src/components/Dialog/index.web.tsx @@ -10,7 +10,9 @@ import { import Animated, {FadeIn, FadeInDown} from 'react-native-reanimated' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {FocusScope} from '@tamagui/focus-scope' +import {DismissableLayer} from '@radix-ui/react-dismissable-layer' +import {useFocusGuards} from '@radix-ui/react-focus-guards' +import {FocusScope} from '@radix-ui/react-focus-scope' import {logger} from '#/logger' import {useDialogStateControlContext} from '#/state/dialogs' @@ -31,6 +33,7 @@ export * from '#/components/Dialog/utils' export {Input} from '#/components/forms/TextField' const stopPropagation = (e: any) => e.stopPropagation() +const preventDefault = (e: any) => e.preventDefault() export function Outer({ children, @@ -85,21 +88,6 @@ export function Outer({ [close, open], ) - React.useEffect(() => { - if (!isOpen) return - - function handler(e: KeyboardEvent) { - if (e.key === 'Escape') { - e.stopPropagation() - close() - } - } - - document.addEventListener('keydown', handler) - - return () => document.removeEventListener('keydown', handler) - }, [close, isOpen]) - const context = React.useMemo( () => ({ close, @@ -168,9 +156,11 @@ export function Inner({ accessibilityDescribedBy, }: DialogInnerProps) { const t = useTheme() + const {close} = React.useContext(Context) const {gtMobile} = useBreakpoints() + useFocusGuards() return ( - <FocusScope loop enabled trapped> + <FocusScope loop asChild trapped> <Animated.View role="dialog" aria-role="dialog" @@ -183,7 +173,7 @@ export function Inner({ onTouchEnd={stopPropagation} entering={FadeInDown.duration(100)} // exiting={FadeOut.duration(100)} - style={[ + style={flatten([ a.relative, a.rounded_md, a.w_full, @@ -198,8 +188,14 @@ export function Inner({ shadowRadius: 30, }, flatten(style), - ]}> - {children} + ])}> + <DismissableLayer + onInteractOutside={preventDefault} + onFocusOutside={preventDefault} + onDismiss={close} + style={{display: 'flex', flexDirection: 'column'}}> + {children} + </DismissableLayer> </Animated.View> </FocusScope> ) |