import React, {useImperativeHandle} from 'react' import {View, Dimensions} from 'react-native' import BottomSheet, { BottomSheetBackdrop, BottomSheetScrollView, BottomSheetTextInput, BottomSheetView, } from '@gorhom/bottom-sheet' 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 { DialogOuterProps, DialogControlProps, DialogInnerProps, } from '#/components/Dialog/types' import {Context} from '#/components/Dialog/context' export {useDialogControl, useDialogContext} from '#/components/Dialog/context' export * from '#/components/Dialog/types' // @ts-ignore export const Input = createInput(BottomSheetTextInput) export function Outer({ children, control, onClose, nativeOptions, }: React.PropsWithChildren) { const t = useTheme() const sheet = React.useRef(null) 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` */ const [openIndex, setOpenIndex] = React.useState(-1) /* * `openIndex` is the index of the snap point to open the bottom sheet to. If >0, the bottom sheet is open. */ const isOpen = openIndex > -1 const open = React.useCallback( ({index} = {}) => { // can be set to any index of `snapPoints`, but `0` is the first i.e. "open" setOpenIndex(index || 0) }, [setOpenIndex], ) const close = React.useCallback(cb => { if (cb) { closeCallback.current = cb } sheet.current?.close() }, []) useImperativeHandle( control.ref, () => ({ open, close, }), [open, close], ) const onChange = React.useCallback( (index: number) => { if (index === -1) { closeCallback.current?.() closeCallback.current = undefined onClose?.() setOpenIndex(-1) } }, [onClose, setOpenIndex], ) const context = React.useMemo(() => ({close}), [close]) return ( isOpen && ( ( )} handleIndicatorStyle={{backgroundColor: t.palette.primary_500}} handleStyle={{display: 'none'}} onChange={onChange}> {children} ) ) } export function Inner({children, style}: DialogInnerProps) { const insets = useSafeAreaInsets() return ( {children} ) } export function ScrollableInner({children, style}: DialogInnerProps) { const insets = useSafeAreaInsets() return ( {children} ) } export function Handle() { const t = useTheme() return ( ) } export function Close() { return null }