import React, {Fragment, ReactText, useEffect, useRef, useState} from 'react'; import { Modal, StyleSheet, TouchableWithoutFeedback, View, ViewProps, } from 'react-native'; import Animated, {interpolateColors} from 'react-native-reanimated'; import BottomSheet from 'reanimated-bottom-sheet'; import {SCREEN_HEIGHT, SCREEN_WIDTH} from '../../utils'; interface BottomDrawerProps extends ViewProps { initialSnapPosition?: ReactText; isOpen: boolean; setIsOpen: (open: boolean) => void; showHeader: boolean; } // More examples here: // https://github.com/osdnk/react-native-reanimated-bottom-sheet/tree/master/Example const BottomDrawer: React.FC = (props) => { const {isOpen, setIsOpen, showHeader, initialSnapPosition} = props; const drawerRef = useRef(null); const [modalVisible, setModalVisible] = useState(isOpen); const bgAlpha = new Animated.Value(isOpen ? 1 : 0); useEffect(() => { if (isOpen) { setModalVisible(true); } else { bgAlpha.setValue(0); drawerRef.current && drawerRef.current.snapTo(1); } }, [isOpen]); const renderContent = () => { return {props.children}; }; const renderHeader = () => { return showHeader ? ( ) : ( ); }; const backgroundColor = interpolateColors(bgAlpha, { inputRange: [0, 1], outputColorRange: ['rgba(0,0,0,0.3)', 'rgba(0,0,0,0)'], }); return ( { drawerRef.current && drawerRef.current.snapTo(0); }}> { setModalVisible(false); setIsOpen(false); }} /> { setIsOpen(false); }}> ); }; const styles = StyleSheet.create({ header: { backgroundColor: '#f7f5eee8', shadowColor: '#000000', paddingTop: 20, borderTopLeftRadius: 20, borderTopRightRadius: 20, }, panelHeader: { alignItems: 'center', }, panelHandle: { width: 40, height: 8, borderRadius: 4, backgroundColor: '#00000040', marginBottom: 10, }, backgroundView: { height: SCREEN_HEIGHT, width: SCREEN_WIDTH, }, }); export default BottomDrawer;