about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEric Bailey <git@esb.lol>2024-02-28 13:27:54 -0600
committerGitHub <noreply@github.com>2024-02-28 11:27:54 -0800
commitd2c6edacb6464b52513dbe467c8b5713abd6a9fc (patch)
tree05c5bfb188c129b0d682d2e99597f55b53176292
parent0c3d55db6ff03cf38b5033c0ae9851e8cd5ea5f7 (diff)
downloadvoidsky-d2c6edacb6464b52513dbe467c8b5713abd6a9fc.tar.zst
Protect against non functions being passed to close callback (#3019)
-rw-r--r--src/components/Dialog/index.tsx15
-rw-r--r--src/components/Dialog/index.web.tsx2
-rw-r--r--src/components/Dialog/types.ts12
-rw-r--r--src/components/Prompt.tsx2
-rw-r--r--src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx2
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>
     </>