Bluesky app fork with some witchin' additions 馃挮
at main 95 lines 2.7 kB view raw
1import {Fragment, useEffect, useRef} from 'react' 2import {StyleSheet} from 'react-native' 3import {SafeAreaView} from 'react-native-safe-area-context' 4import BottomSheet from '@discord/bottom-sheet/src' 5 6import {usePalette} from '#/lib/hooks/usePalette' 7import {useModalControls, useModals} from '#/state/modals' 8import {FullWindowOverlay} from '#/components/FullWindowOverlay' 9import {createCustomBackdrop} from '../util/BottomSheetCustomBackdrop' 10import * as UserAddRemoveListsModal from './UserAddRemoveLists' 11 12const DEFAULT_SNAPPOINTS = ['90%'] 13const HANDLE_HEIGHT = 24 14 15export function ModalsContainer() { 16 const {isModalActive, activeModals} = useModals() 17 const {closeModal} = useModalControls() 18 const bottomSheetRef = useRef<BottomSheet>(null) 19 const pal = usePalette('default') 20 const activeModal = activeModals[activeModals.length - 1] 21 22 const onBottomSheetChange = async (snapPoint: number) => { 23 if (snapPoint === -1) { 24 closeModal() 25 } 26 } 27 28 const onClose = () => { 29 bottomSheetRef.current?.close() 30 closeModal() 31 } 32 33 useEffect(() => { 34 if (isModalActive) { 35 bottomSheetRef.current?.snapToIndex(0) 36 } else { 37 bottomSheetRef.current?.close() 38 } 39 }, [isModalActive, bottomSheetRef, activeModal?.name]) 40 41 let snapPoints: (string | number)[] = DEFAULT_SNAPPOINTS 42 let element 43 if (activeModal?.name === 'user-add-remove-lists') { 44 snapPoints = UserAddRemoveListsModal.snapPoints 45 element = <UserAddRemoveListsModal.Component {...activeModal} /> 46 } else { 47 return null 48 } 49 50 if (snapPoints[0] === 'fullscreen') { 51 return ( 52 <SafeAreaView style={[styles.fullscreenContainer, pal.view]}> 53 {element} 54 </SafeAreaView> 55 ) 56 } 57 58 const Container = activeModal ? FullWindowOverlay : Fragment 59 60 return ( 61 <Container> 62 <BottomSheet 63 ref={bottomSheetRef} 64 snapPoints={snapPoints} 65 handleHeight={HANDLE_HEIGHT} 66 index={isModalActive ? 0 : -1} 67 enablePanDownToClose 68 android_keyboardInputMode="adjustResize" 69 keyboardBlurBehavior="restore" 70 backdropComponent={ 71 isModalActive ? createCustomBackdrop(onClose) : undefined 72 } 73 handleIndicatorStyle={{backgroundColor: pal.text.color}} 74 handleStyle={[styles.handle, pal.view]} 75 backgroundStyle={pal.view} 76 onChange={onBottomSheetChange}> 77 {element} 78 </BottomSheet> 79 </Container> 80 ) 81} 82 83const styles = StyleSheet.create({ 84 handle: { 85 borderTopLeftRadius: 10, 86 borderTopRightRadius: 10, 87 }, 88 fullscreenContainer: { 89 position: 'absolute', 90 top: 0, 91 left: 0, 92 bottom: 0, 93 right: 0, 94 }, 95})