diff options
author | Eric Bailey <git@esb.lol> | 2024-02-20 18:20:59 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-20 18:20:59 -0600 |
commit | f88b16525498584f81ea7f594a63623fc5dc7ce9 (patch) | |
tree | 0f87d5dc87778da6b4451be536437a432adfbf91 /src | |
parent | 6413b8ba8cbf73678d0f1687153b16f3a44f08b0 (diff) | |
download | voidsky-f88b16525498584f81ea7f594a63623fc5dc7ce9.tar.zst |
Add optional close callback to Dialog (#2947)
* Add optional close callback * No emitter
Diffstat (limited to 'src')
-rw-r--r-- | src/components/Dialog/context.ts | 10 | ||||
-rw-r--r-- | src/components/Dialog/index.tsx | 8 | ||||
-rw-r--r-- | src/components/Dialog/types.ts | 6 | ||||
-rw-r--r-- | src/view/screens/Storybook/Dialogs.tsx | 6 |
4 files changed, 21 insertions, 9 deletions
diff --git a/src/components/Dialog/context.ts b/src/components/Dialog/context.ts index b28b9f5a2..f0c7c983a 100644 --- a/src/components/Dialog/context.ts +++ b/src/components/Dialog/context.ts @@ -1,7 +1,11 @@ import React from 'react' import {useDialogStateContext} from '#/state/dialogs' -import {DialogContextProps, DialogControlProps} from '#/components/Dialog/types' +import { + DialogContextProps, + DialogControlProps, + DialogOuterProps, +} from '#/components/Dialog/types' export const Context = React.createContext<DialogContextProps>({ close: () => {}, @@ -11,7 +15,7 @@ export function useDialogContext() { return React.useContext(Context) } -export function useDialogControl() { +export function useDialogControl(): DialogOuterProps['control'] { const id = React.useId() const control = React.useRef<DialogControlProps>({ open: () => {}, @@ -30,6 +34,6 @@ export function useDialogControl() { return { ref: control, open: () => control.current.open(), - close: () => control.current.close(), + close: cb => control.current.close(cb), } } diff --git a/src/components/Dialog/index.tsx b/src/components/Dialog/index.tsx index 529535051..27f43afd3 100644 --- a/src/components/Dialog/index.tsx +++ b/src/components/Dialog/index.tsx @@ -35,6 +35,7 @@ export function Outer({ const sheetOptions = nativeOptions?.sheet || {} const hasSnapPoints = !!sheetOptions.snapPoints const insets = useSafeAreaInsets() + const closeCallback = React.useRef<() => void>() /* * Used to manage open/closed, but index is otherwise handled internally by `BottomSheet` @@ -54,7 +55,10 @@ export function Outer({ [setOpenIndex], ) - const close = React.useCallback(() => { + const close = React.useCallback<DialogControlProps['close']>(cb => { + if (cb) { + closeCallback.current = cb + } sheet.current?.close() }, []) @@ -70,6 +74,8 @@ export function Outer({ const onChange = React.useCallback( (index: number) => { if (index === -1) { + closeCallback.current?.() + closeCallback.current = undefined onClose?.() setOpenIndex(-1) } diff --git a/src/components/Dialog/types.ts b/src/components/Dialog/types.ts index 00178926a..75ba825ac 100644 --- a/src/components/Dialog/types.ts +++ b/src/components/Dialog/types.ts @@ -22,15 +22,13 @@ export type DialogControlOpenOptions = { export type DialogControlProps = { open: (options?: DialogControlOpenOptions) => void - close: () => void + close: (callback?: () => void) => void } export type DialogOuterProps = { control: { ref: React.RefObject<DialogControlProps> - open: (index?: number) => void - close: () => void - } + } & DialogControlProps onClose?: () => void nativeOptions?: { sheet?: Omit<BottomSheetProps, 'children'> diff --git a/src/view/screens/Storybook/Dialogs.tsx b/src/view/screens/Storybook/Dialogs.tsx index 821ac3c88..09be124db 100644 --- a/src/view/screens/Storybook/Dialogs.tsx +++ b/src/view/screens/Storybook/Dialogs.tsx @@ -110,7 +110,11 @@ export function Dialogs() { variant="outline" color="primary" size="small" - onPress={() => scrollable.close()} + onPress={() => + scrollable.close(() => { + console.log('CLOSED') + }) + } label="Open basic dialog"> Close dialog </Button> |