import React from 'react' import {TouchableWithoutFeedback, StyleSheet, View} from 'react-native' import Animated, {FadeIn, FadeOut} from 'react-native-reanimated' import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {useWebBodyScrollLock} from '#/lib/hooks/useWebBodyScrollLock' import {useModals, useModalControls} from '#/state/modals' import type {Modal as ModalIface} from '#/state/modals' import * as ConfirmModal from './Confirm' import * as EditProfileModal from './EditProfile' import * as ServerInputModal from './ServerInput' import * as ReportModal from './report/Modal' import * as AppealLabelModal from './AppealLabel' import * as CreateOrEditListModal from './CreateOrEditList' import * as UserAddRemoveLists from './UserAddRemoveLists' import * as ListAddUserModal from './ListAddRemoveUsers' import * as DeleteAccountModal from './DeleteAccount' import * as RepostModal from './Repost' import * as SelfLabelModal from './SelfLabel' import * as ThreadgateModal from './Threadgate' import * as CropImageModal from './crop-image/CropImage.web' import * as AltTextImageModal from './AltImage' import * as EditImageModal from './EditImage' import * as ChangeHandleModal from './ChangeHandle' import * as WaitlistModal from './Waitlist' import * as InviteCodesModal from './InviteCodes' import * as AddAppPassword from './AddAppPasswords' import * as ContentFilteringSettingsModal from './ContentFilteringSettings' import * as ContentLanguagesSettingsModal from './lang-settings/ContentLanguagesSettings' import * as PostLanguagesSettingsModal from './lang-settings/PostLanguagesSettings' import * as ModerationDetailsModal from './ModerationDetails' import * as BirthDateSettingsModal from './BirthDateSettings' import * as VerifyEmailModal from './VerifyEmail' import * as ChangeEmailModal from './ChangeEmail' import * as ChangePasswordModal from './ChangePassword' import * as LinkWarningModal from './LinkWarning' import * as EmbedConsentModal from './EmbedConsent' export function ModalsContainer() { const {isModalActive, activeModals} = useModals() useWebBodyScrollLock(isModalActive) if (!isModalActive) { return null } return ( <> {activeModals.map((modal, i) => ( ))} ) } function Modal({modal}: {modal: ModalIface}) { const {isModalActive} = useModals() const {closeModal} = useModalControls() const pal = usePalette('default') const {isMobile} = useWebMediaQueries() if (!isModalActive) { return null } const onPressMask = () => { if ( modal.name === 'crop-image' || modal.name === 'edit-image' || modal.name === 'alt-text-image' ) { return // dont close on mask presses during crop } closeModal() } const onInnerPress = () => { // TODO: can we use prevent default? // do nothing, we just want to stop it from bubbling } let element if (modal.name === 'confirm') { element = } else if (modal.name === 'edit-profile') { element = } else if (modal.name === 'server-input') { element = } else if (modal.name === 'report') { element = } else if (modal.name === 'appeal-label') { element = } else if (modal.name === 'create-or-edit-list') { element = } else if (modal.name === 'user-add-remove-lists') { element = } else if (modal.name === 'list-add-remove-users') { element = } else if (modal.name === 'crop-image') { element = } else if (modal.name === 'delete-account') { element = } else if (modal.name === 'repost') { element = } else if (modal.name === 'self-label') { element = } else if (modal.name === 'threadgate') { element = } else if (modal.name === 'change-handle') { element = } else if (modal.name === 'waitlist') { element = } else if (modal.name === 'invite-codes') { element = } else if (modal.name === 'add-app-password') { element = } else if (modal.name === 'content-filtering-settings') { element = } else if (modal.name === 'content-languages-settings') { element = } else if (modal.name === 'post-languages-settings') { element = } else if (modal.name === 'alt-text-image') { element = } else if (modal.name === 'edit-image') { element = } else if (modal.name === 'moderation-details') { element = } else if (modal.name === 'birth-date-settings') { element = } else if (modal.name === 'verify-email') { element = } else if (modal.name === 'change-email') { element = } else if (modal.name === 'change-password') { element = } else if (modal.name === 'link-warning') { element = } else if (modal.name === 'embed-consent') { element = } else { return null } return ( // eslint-disable-next-line react-native-a11y/has-valid-accessibility-descriptors {/* eslint-disable-next-line react-native-a11y/has-valid-accessibility-descriptors */} {element} ) } const styles = StyleSheet.create({ mask: { // @ts-ignore position: 'fixed', top: 0, left: 0, width: '100%', height: '100%', backgroundColor: '#000c', alignItems: 'center', justifyContent: 'center', }, container: { width: 600, // @ts-ignore web only maxWidth: '100vw', // @ts-ignore web only maxHeight: '90vh', paddingVertical: 20, paddingHorizontal: 24, borderRadius: 8, borderWidth: 1, }, containerMobile: { borderRadius: 0, paddingHorizontal: 0, }, })