mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
fork

Configure Feed

Select the types of activity you want to include in your feed.

at patch-version 143 lines 4.7 kB view raw
1import {StyleSheet, TouchableWithoutFeedback, View} from 'react-native' 2import Animated, {FadeIn, FadeOut} from 'react-native-reanimated' 3import {RemoveScrollBar} from 'react-remove-scroll-bar' 4 5import {usePalette} from '#/lib/hooks/usePalette' 6import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 7import type {Modal as ModalIface} from '#/state/modals' 8import {useModalControls, useModals} from '#/state/modals' 9import * as ChangeEmailModal from './ChangeEmail' 10import * as ChangePasswordModal from './ChangePassword' 11import * as CreateOrEditListModal from './CreateOrEditList' 12import * as CropImageModal from './CropImage.web' 13import * as DeleteAccountModal from './DeleteAccount' 14import * as EditProfileModal from './EditProfile' 15import * as InviteCodesModal from './InviteCodes' 16import * as ContentLanguagesSettingsModal from './lang-settings/ContentLanguagesSettings' 17import * as PostLanguagesSettingsModal from './lang-settings/PostLanguagesSettings' 18import * as LinkWarningModal from './LinkWarning' 19import * as ListAddUserModal from './ListAddRemoveUsers' 20import * as UserAddRemoveLists from './UserAddRemoveLists' 21import * as VerifyEmailModal from './VerifyEmail' 22 23export function ModalsContainer() { 24 const {isModalActive, activeModals} = useModals() 25 26 if (!isModalActive) { 27 return null 28 } 29 30 return ( 31 <> 32 <RemoveScrollBar /> 33 {activeModals.map((modal, i) => ( 34 <Modal key={`modal-${i}`} modal={modal} /> 35 ))} 36 </> 37 ) 38} 39 40function Modal({modal}: {modal: ModalIface}) { 41 const {isModalActive} = useModals() 42 const {closeModal} = useModalControls() 43 const pal = usePalette('default') 44 const {isMobile} = useWebMediaQueries() 45 46 if (!isModalActive) { 47 return null 48 } 49 50 const onPressMask = () => { 51 if (modal.name === 'crop-image') { 52 return // dont close on mask presses during crop 53 } 54 closeModal() 55 } 56 const onInnerPress = () => { 57 // TODO: can we use prevent default? 58 // do nothing, we just want to stop it from bubbling 59 } 60 61 let element 62 if (modal.name === 'edit-profile') { 63 element = <EditProfileModal.Component {...modal} /> 64 } else if (modal.name === 'create-or-edit-list') { 65 element = <CreateOrEditListModal.Component {...modal} /> 66 } else if (modal.name === 'user-add-remove-lists') { 67 element = <UserAddRemoveLists.Component {...modal} /> 68 } else if (modal.name === 'list-add-remove-users') { 69 element = <ListAddUserModal.Component {...modal} /> 70 } else if (modal.name === 'crop-image') { 71 element = <CropImageModal.Component {...modal} /> 72 } else if (modal.name === 'delete-account') { 73 element = <DeleteAccountModal.Component /> 74 } else if (modal.name === 'invite-codes') { 75 element = <InviteCodesModal.Component /> 76 } else if (modal.name === 'content-languages-settings') { 77 element = <ContentLanguagesSettingsModal.Component /> 78 } else if (modal.name === 'post-languages-settings') { 79 element = <PostLanguagesSettingsModal.Component /> 80 } else if (modal.name === 'verify-email') { 81 element = <VerifyEmailModal.Component {...modal} /> 82 } else if (modal.name === 'change-email') { 83 element = <ChangeEmailModal.Component /> 84 } else if (modal.name === 'change-password') { 85 element = <ChangePasswordModal.Component /> 86 } else if (modal.name === 'link-warning') { 87 element = <LinkWarningModal.Component {...modal} /> 88 } else { 89 return null 90 } 91 92 return ( 93 // eslint-disable-next-line react-native-a11y/has-valid-accessibility-descriptors 94 <TouchableWithoutFeedback onPress={onPressMask}> 95 <Animated.View 96 style={styles.mask} 97 entering={FadeIn.duration(150)} 98 exiting={FadeOut}> 99 {/* eslint-disable-next-line react-native-a11y/has-valid-accessibility-descriptors */} 100 <TouchableWithoutFeedback onPress={onInnerPress}> 101 <View 102 style={[ 103 styles.container, 104 isMobile && styles.containerMobile, 105 pal.view, 106 pal.border, 107 ]}> 108 {element} 109 </View> 110 </TouchableWithoutFeedback> 111 </Animated.View> 112 </TouchableWithoutFeedback> 113 ) 114} 115 116const styles = StyleSheet.create({ 117 mask: { 118 // @ts-ignore 119 position: 'fixed', 120 top: 0, 121 left: 0, 122 width: '100%', 123 height: '100%', 124 backgroundColor: '#000c', 125 alignItems: 'center', 126 justifyContent: 'center', 127 }, 128 container: { 129 width: 600, 130 // @ts-ignore web only 131 maxWidth: '100vw', 132 // @ts-ignore web only 133 maxHeight: '90vh', 134 paddingVertical: 20, 135 paddingHorizontal: 24, 136 borderRadius: 8, 137 borderWidth: 1, 138 }, 139 containerMobile: { 140 borderRadius: 0, 141 paddingHorizontal: 0, 142 }, 143})