import React from 'react' import { Dimensions, Modal, StyleSheet, View } from 'react-native' import { useSafeAreaInsets } from 'react-native-safe-area-context' import { useTheme } from '@utils/styles/ThemeManager' import { StyleConstants } from '@utils/styles/constants' import Button from '@components/Button' import { PanGestureHandler } from 'react-native-gesture-handler' import Animated, { Extrapolate, interpolate, runOnJS, useAnimatedGestureHandler, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated' export interface Props { children: React.ReactNode visible: boolean handleDismiss: () => void } const BottomSheet: React.FC = ({ children, visible, handleDismiss }) => { const { theme } = useTheme() const insets = useSafeAreaInsets() const screenHeight = Dimensions.get('screen').height const panY = useSharedValue(0) const styleTop = useAnimatedStyle(() => { return { top: interpolate( panY.value, [0, screenHeight], [0, screenHeight], Extrapolate.CLAMP ) } }) const callDismiss = () => { handleDismiss() } const onGestureEvent = useAnimatedGestureHandler({ onActive: ({ translationY }) => { panY.value = translationY }, onEnd: ({ velocityY }) => { if (velocityY > 500) { runOnJS(callDismiss)() } else { panY.value = withTiming(0) } } }) return ( {children}