import React, { memo, forwardRef } from 'react'; import { Modal } from '../../composites/Modal'; import type { IActionsheetContentProps } from './types'; import { usePropsResolution } from '../../../hooks'; import { Animated, PanResponder } from 'react-native'; import { ModalContext } from '../Modal/Context'; import Box from '../../primitives/Box'; import { ActionSheetContext } from './ActionSheetContext'; import { useHasResponsiveProps } from '../../../hooks/useHasResponsiveProps'; const Content = memo( forwardRef( ( { hideDragIndicator, children, handleClose, pan, sheetHeight, ...props }: any, ref: any ) => { const { _dragIndicator, _dragIndicatorWrapperOffSet, _dragIndicatorWrapper, ...resolvedProps } = usePropsResolution('ActionsheetContent', props); const handleCloseRef = React.useRef(null); const handleCloseCallback = React.useCallback(() => { let handleCloseCurrent = handleCloseRef.current; //@ts-ignore return handleCloseCurrent(); }, []); React.useEffect(() => { handleCloseRef.current = handleClose; }, [handleClose]); const panResponder = React.useRef( PanResponder.create({ onStartShouldSetPanResponder: () => true, onMoveShouldSetPanResponder: (_evt, gestureState) => { return gestureState.dy > 15; }, onPanResponderMove: (e, gestureState) => { if (gestureState.dy > 0) { Animated.event([null, { dy: pan.y }], { useNativeDriver: false, })(e, gestureState); } }, onPanResponderRelease: (_e, gestureState) => { // If sheet is dragged 1/4th of it's height, close it if (sheetHeight.current / 4 - gestureState.dy < 0) { Animated.timing(pan, { toValue: { x: 0, y: sheetHeight.current }, duration: 150, useNativeDriver: true, }).start(handleCloseCallback); setTimeout(() => { Animated.timing(pan, { toValue: { x: 0, y: 0 }, duration: 150, useNativeDriver: true, }).start(); }, 300); } else { Animated.spring(pan, { toValue: { x: 0, y: 0 }, overshootClamping: true, useNativeDriver: true, }).start(); } }, }) ).current; return ( <> {!hideDragIndicator ? ( <> {/* To increase the draggable area */} ) : null} {!hideDragIndicator ? ( <> {/* Hack. Fix later. Add -2 negative margin to remove the padding added by ActionSheetContent */} ) : null} {children} ); } ) ); const ActionsheetContent = ( { children, ...props }: IActionsheetContentProps, ref?: any ) => { // return null; const { handleClose } = React.useContext(ModalContext); const { hideDragIndicator } = React.useContext(ActionSheetContext); const pan = React.useRef(new Animated.ValueXY()).current; const sheetHeight = React.useRef(0); const handleCloseCallback = React.useCallback(handleClose, [ ModalContext, handleClose, ]); // useEffect(() => { // }, []) //TODO: refactor for responsive prop if (useHasResponsiveProps(props)) { return null; } return ( { const { height } = event.nativeEvent.layout; sheetHeight.current = height; }} pointerEvents="box-none" > ); }; export default memo(forwardRef(ActionsheetContent));