diff options
author | Eric Bailey <git@esb.lol> | 2024-02-28 13:27:54 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-28 11:27:54 -0800 |
commit | d2c6edacb6464b52513dbe467c8b5713abd6a9fc (patch) | |
tree | 05c5bfb188c129b0d682d2e99597f55b53176292 /src | |
parent | 0c3d55db6ff03cf38b5033c0ae9851e8cd5ea5f7 (diff) | |
download | voidsky-d2c6edacb6464b52513dbe467c8b5713abd6a9fc.tar.zst |
Protect against non functions being passed to close callback (#3019)
Diffstat (limited to 'src')
-rw-r--r-- | src/components/Dialog/index.tsx | 15 | ||||
-rw-r--r-- | src/components/Dialog/index.web.tsx | 2 | ||||
-rw-r--r-- | src/components/Dialog/types.ts | 12 | ||||
-rw-r--r-- | src/components/Prompt.tsx | 2 | ||||
-rw-r--r-- | src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx | 2 |
5 files changed, 21 insertions, 12 deletions
diff --git a/src/components/Dialog/index.tsx b/src/components/Dialog/index.tsx index 27f43afd3..5c0350274 100644 --- a/src/components/Dialog/index.tsx +++ b/src/components/Dialog/index.tsx @@ -11,6 +11,7 @@ import {useSafeAreaInsets} from 'react-native-safe-area-context' import {useTheme, atoms as a, flatten} from '#/alf' import {Portal} from '#/components/Portal' import {createInput} from '#/components/forms/TextField' +import {logger} from '#/logger' import { DialogOuterProps, @@ -56,7 +57,7 @@ export function Outer({ ) const close = React.useCallback<DialogControlProps['close']>(cb => { - if (cb) { + if (cb && typeof cb === 'function') { closeCallback.current = cb } sheet.current?.close() @@ -74,8 +75,16 @@ export function Outer({ const onChange = React.useCallback( (index: number) => { if (index === -1) { - closeCallback.current?.() - closeCallback.current = undefined + try { + closeCallback.current?.() + } catch (e: any) { + logger.error(`Dialog closeCallback failed`, { + message: e.message, + }) + } finally { + closeCallback.current = undefined + } + onClose?.() setOpenIndex(-1) } diff --git a/src/components/Dialog/index.web.tsx b/src/components/Dialog/index.web.tsx index fa29fbd6c..ff05fed91 100644 --- a/src/components/Dialog/index.web.tsx +++ b/src/components/Dialog/index.web.tsx @@ -190,7 +190,7 @@ export function Close() { variant="ghost" color="secondary" shape="round" - onPress={close} + onPress={() => close()} label={_(msg`Close active dialog`)}> <ButtonIcon icon={X} size="md" /> </Button> diff --git a/src/components/Dialog/types.ts b/src/components/Dialog/types.ts index 75ba825ac..161c03734 100644 --- a/src/components/Dialog/types.ts +++ b/src/components/Dialog/types.ts @@ -6,8 +6,13 @@ import {ViewStyleProp} from '#/alf' type A11yProps = Required<AccessibilityProps> +export type DialogControlProps = { + open: (options?: DialogControlOpenOptions) => void + close: (callback?: () => void) => void +} + export type DialogContextProps = { - close: () => void + close: DialogControlProps['close'] } export type DialogControlOpenOptions = { @@ -20,11 +25,6 @@ export type DialogControlOpenOptions = { index?: number } -export type DialogControlProps = { - open: (options?: DialogControlOpenOptions) => void - close: (callback?: () => void) => void -} - export type DialogOuterProps = { control: { ref: React.RefObject<DialogControlProps> diff --git a/src/components/Prompt.tsx b/src/components/Prompt.tsx index 411679102..8e55bd834 100644 --- a/src/components/Prompt.tsx +++ b/src/components/Prompt.tsx @@ -89,7 +89,7 @@ export function Cancel({ color="secondary" size="small" label={_(msg`Cancel`)} - onPress={close}> + onPress={() => close()}> {children} </Button> ) diff --git a/src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx b/src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx index b38b3df1e..360025c02 100644 --- a/src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx +++ b/src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx @@ -114,7 +114,7 @@ export function AdultContentEnabledPref({ </Trans> </Prompt.Description> <Prompt.Actions> - <Prompt.Action onPress={prompt.close}>OK</Prompt.Action> + <Prompt.Action onPress={() => prompt.close()}>OK</Prompt.Action> </Prompt.Actions> </Prompt.Outer> </> |