diff options
-rw-r--r-- | src/components/Dialog/index.web.tsx | 10 | ||||
-rw-r--r-- | src/components/Dialog/types.ts | 21 | ||||
-rw-r--r-- | src/screens/Profile/Header/EditProfileDialog.tsx | 24 |
3 files changed, 27 insertions, 28 deletions
diff --git a/src/components/Dialog/index.web.tsx b/src/components/Dialog/index.web.tsx index 1417e9e91..7e10dfadc 100644 --- a/src/components/Dialog/index.web.tsx +++ b/src/components/Dialog/index.web.tsx @@ -2,6 +2,7 @@ import React, {useImperativeHandle} from 'react' import { FlatList, type FlatListProps, + type GestureResponderEvent, type StyleProp, TouchableWithoutFeedback, View, @@ -75,9 +76,12 @@ export function Outer({ [control.id, onClose, setDialogIsOpen], ) - const handleBackgroundPress = React.useCallback(async () => { - close() - }, [close]) + const handleBackgroundPress = React.useCallback( + async (e: GestureResponderEvent) => { + webOptions?.onBackgroundPress ? webOptions.onBackgroundPress(e) : close() + }, + [webOptions, close], + ) useImperativeHandle( control.ref, diff --git a/src/components/Dialog/types.ts b/src/components/Dialog/types.ts index 3ca64a321..1308e625c 100644 --- a/src/components/Dialog/types.ts +++ b/src/components/Dialog/types.ts @@ -1,15 +1,15 @@ -import React from 'react' -import type { - AccessibilityProps, - GestureResponderEvent, - ScrollViewProps, +import { + type AccessibilityProps, + type GestureResponderEvent, + type ScrollViewProps, + type StyleProp, + type ViewStyle, } from 'react-native' -import {ViewStyle} from 'react-native' -import {StyleProp} from 'react-native' +import type React from 'react' -import {ViewStyleProp} from '#/alf' -import {BottomSheetViewProps} from '../../../modules/bottom-sheet' -import {BottomSheetSnapPoint} from '../../../modules/bottom-sheet/src/BottomSheet.types' +import {type ViewStyleProp} from '#/alf' +import {type BottomSheetViewProps} from '../../../modules/bottom-sheet' +import {type BottomSheetSnapPoint} from '../../../modules/bottom-sheet/src/BottomSheet.types' type A11yProps = Required<AccessibilityProps> @@ -64,6 +64,7 @@ export type DialogOuterProps = { nativeOptions?: Omit<BottomSheetViewProps, 'children'> webOptions?: { alignCenter?: boolean + onBackgroundPress?: (e: GestureResponderEvent) => void } testID?: string } diff --git a/src/screens/Profile/Header/EditProfileDialog.tsx b/src/screens/Profile/Header/EditProfileDialog.tsx index 95160ce86..2317ff57a 100644 --- a/src/screens/Profile/Header/EditProfileDialog.tsx +++ b/src/screens/Profile/Header/EditProfileDialog.tsx @@ -8,7 +8,6 @@ import {urls} from '#/lib/constants' import {cleanError} from '#/lib/strings/errors' import {useWarnMaxGraphemeCount} from '#/lib/strings/helpers' import {logger} from '#/logger' -import {isWeb} from '#/platform/detection' import {type ImageMeta} from '#/state/gallery' import {useProfileUpdateMutation} from '#/state/queries/profile' import {ErrorMessage} from '#/view/com/util/error/ErrorMessage' @@ -44,20 +43,6 @@ export function EditProfileDialog({ const cancelControl = Dialog.useDialogControl() const [dirty, setDirty] = useState(false) - // 'You might lose unsaved changes' warning - useEffect(() => { - if (isWeb && dirty) { - const abortController = new AbortController() - const {signal} = abortController - window.addEventListener('beforeunload', evt => evt.preventDefault(), { - signal, - }) - return () => { - abortController.abort() - } - } - }, [dirty]) - const onPressCancel = useCallback(() => { if (dirty) { cancelControl.open() @@ -73,6 +58,15 @@ export function EditProfileDialog({ preventDismiss: dirty, minHeight: SCREEN_HEIGHT, }} + webOptions={{ + onBackgroundPress: () => { + if (dirty) { + cancelControl.open() + } else { + control.close() + } + }, + }} testID="editProfileModal"> <DialogInner profile={profile} |