forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
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})