chore: fix modal close on escape
This commit is contained in:
@@ -237,7 +237,7 @@ const ChallengeModal: FunctionComponent<Props> = ({
|
||||
})
|
||||
|
||||
return (
|
||||
<ModalOverlay isOpen={true} key={challenge.id} ref={setModalElement}>
|
||||
<ModalOverlay isOpen={true} key={challenge.id} ref={setModalElement} close={cancelChallenge}>
|
||||
<Modal
|
||||
title="Authenticate"
|
||||
close={cancelChallenge}
|
||||
|
||||
@@ -255,7 +255,7 @@ const ChangeEditorMenu: FunctionComponent<ChangeEditorMenuProps> = ({
|
||||
)
|
||||
})}
|
||||
</Menu>
|
||||
<ModalOverlay isOpen={showSuperNoteImporter}>
|
||||
<ModalOverlay isOpen={showSuperNoteImporter} close={closeSuperNoteImporter}>
|
||||
{note && (
|
||||
<SuperNoteImporter
|
||||
note={note}
|
||||
@@ -265,7 +265,7 @@ const ChangeEditorMenu: FunctionComponent<ChangeEditorMenuProps> = ({
|
||||
/>
|
||||
)}
|
||||
</ModalOverlay>
|
||||
<ModalOverlay isOpen={showSuperNoteConverter}>
|
||||
<ModalOverlay isOpen={showSuperNoteConverter} close={closeSuperNoteConverter}>
|
||||
{note && pendingConversionItem && (
|
||||
<SuperNoteConverter
|
||||
note={note}
|
||||
|
||||
@@ -180,7 +180,7 @@ const ChangeMultipleMenu = ({ application, notes, setDisableClickOutside }: Prop
|
||||
</Fragment>
|
||||
))}
|
||||
</Menu>
|
||||
<ModalOverlay isOpen={showSuperImporter}>
|
||||
<ModalOverlay isOpen={showSuperImporter} close={closeCurrentSuperNoteImporter}>
|
||||
{confirmationQueue[0] && (
|
||||
<SuperNoteImporter
|
||||
note={confirmationQueue[0]}
|
||||
|
||||
@@ -108,10 +108,10 @@ const AddItemMenuButton = ({
|
||||
</MenuItem>
|
||||
</Menu>
|
||||
</Popover>
|
||||
<ModalOverlay isOpen={captureType === 'photo'}>
|
||||
<ModalOverlay isOpen={captureType === 'photo'} close={closeCaptureModal}>
|
||||
<PhotoCaptureModal filesController={filesController} close={closeCaptureModal} />
|
||||
</ModalOverlay>
|
||||
<ModalOverlay isOpen={captureType === 'video'}>
|
||||
<ModalOverlay isOpen={captureType === 'video'} close={closeCaptureModal}>
|
||||
<VideoCaptureModal filesController={filesController} close={closeCaptureModal} />
|
||||
</ModalOverlay>
|
||||
</>
|
||||
|
||||
@@ -8,7 +8,7 @@ import RadioButtonGroup from '../RadioButtonGroup/RadioButtonGroup'
|
||||
import { EditorMargins, EditorMaxWidths } from './EditorWidths'
|
||||
import { useApplication } from '../ApplicationProvider'
|
||||
import ModalOverlay from '../Modal/ModalOverlay'
|
||||
import { CHANGE_EDITOR_WIDTH_COMMAND, ESCAPE_COMMAND } from '@standardnotes/ui-services'
|
||||
import { CHANGE_EDITOR_WIDTH_COMMAND } from '@standardnotes/ui-services'
|
||||
import { PrefDefaults } from '@/Constants/PrefDefaults'
|
||||
import { observer } from 'mobx-react-lite'
|
||||
import Switch from '../Switch/Switch'
|
||||
@@ -37,7 +37,6 @@ const EditorWidthSelectionModal = ({
|
||||
close: () => void
|
||||
note: SNNote | undefined
|
||||
}) => {
|
||||
const application = useApplication()
|
||||
const isMobileScreen = useMediaQuery(MutuallyExclusiveMediaQueryBreakpoints.sm)
|
||||
|
||||
const [value, setValue] = useState<EditorLineWidth>(() => initialValue)
|
||||
@@ -88,16 +87,6 @@ const EditorWidthSelectionModal = ({
|
||||
[accept, close],
|
||||
)
|
||||
|
||||
useEffect(() => {
|
||||
return application.keyboardService.addCommandHandler({
|
||||
command: ESCAPE_COMMAND,
|
||||
onKeyDown() {
|
||||
close()
|
||||
return true
|
||||
},
|
||||
})
|
||||
}, [application.keyboardService, close])
|
||||
|
||||
const DynamicMargin = (
|
||||
<div className="text-center text-sm text-passive-2">
|
||||
<div className={value !== EditorLineWidth.Dynamic ? 'hidden' : ''}>
|
||||
@@ -207,7 +196,7 @@ const EditorWidthSelectionModalWrapper = () => {
|
||||
}, [application, toggle])
|
||||
|
||||
return (
|
||||
<ModalOverlay isOpen={isOpen}>
|
||||
<ModalOverlay isOpen={isOpen} close={toggle}>
|
||||
<EditorWidthSelectionModal initialValue={lineWidth} handleChange={setLineWidth} close={toggle} note={note} />
|
||||
</ModalOverlay>
|
||||
)
|
||||
|
||||
@@ -285,7 +285,11 @@ FilePreviewModal.displayName = 'FilePreviewModal'
|
||||
|
||||
const FilePreviewModalWrapper: FunctionComponent<Props> = ({ application, viewControllerManager }) => {
|
||||
return (
|
||||
<ModalOverlay aria-label="File preview modal" isOpen={viewControllerManager.filePreviewModalController.isOpen}>
|
||||
<ModalOverlay
|
||||
aria-label="File preview modal"
|
||||
isOpen={viewControllerManager.filePreviewModalController.isOpen}
|
||||
close={viewControllerManager.filePreviewModalController.dismiss}
|
||||
>
|
||||
<FilePreviewModal application={application} viewControllerManager={viewControllerManager} />
|
||||
</ModalOverlay>
|
||||
)
|
||||
|
||||
@@ -33,7 +33,7 @@ const ImportModal = ({ importModalController }: { importModalController: ImportM
|
||||
)
|
||||
|
||||
return (
|
||||
<ModalOverlay isOpen={isVisible}>
|
||||
<ModalOverlay isOpen={isVisible} close={close}>
|
||||
<Modal title="Import" close={close} actions={modalActions}>
|
||||
<div className="px-4 py-4">
|
||||
{!files.length && <ImportModalInitialPage setFiles={setFiles} />}
|
||||
|
||||
@@ -7,13 +7,19 @@ type Props = {
|
||||
isOpen: boolean
|
||||
children: ReactNode
|
||||
animationVariant?: 'horizontal' | 'vertical'
|
||||
close: () => void
|
||||
}
|
||||
|
||||
const ModalOverlay = forwardRef(
|
||||
({ isOpen, children, animationVariant, ...props }: Props, ref: ForwardedRef<HTMLDivElement>) => {
|
||||
({ isOpen, children, animationVariant, close, ...props }: Props, ref: ForwardedRef<HTMLDivElement>) => {
|
||||
const [isMounted, setElement] = useModalAnimation(isOpen, animationVariant)
|
||||
const dialog = useDialogStore({
|
||||
open: isMounted,
|
||||
setOpen: (open) => {
|
||||
if (!open) {
|
||||
close()
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
if (!isMounted) {
|
||||
|
||||
@@ -413,7 +413,7 @@ const NotesOptions = ({
|
||||
</>
|
||||
) : null}
|
||||
|
||||
<ModalOverlay isOpen={showExportSuperModal}>
|
||||
<ModalOverlay isOpen={showExportSuperModal} close={closeSuperExportModal}>
|
||||
<SuperExportModal exportNotes={downloadSelectedItems} close={closeSuperExportModal} />
|
||||
</ModalOverlay>
|
||||
</>
|
||||
|
||||
@@ -44,7 +44,7 @@ const PermissionsModalWrapper: FunctionComponent<Props> = ({ application }) => {
|
||||
}, [application, onAppStart])
|
||||
|
||||
return (
|
||||
<ModalOverlay isOpen={!!dialog}>
|
||||
<ModalOverlay isOpen={!!dialog} close={dismissPermissionsDialog}>
|
||||
{dialog && (
|
||||
<PermissionsModal
|
||||
callback={dialog.callback}
|
||||
|
||||
@@ -58,12 +58,12 @@ const Credentials: FunctionComponent<Props> = ({ application }: Props) => {
|
||||
Current password was set on <span className="font-bold">{passwordCreatedOn}</span>
|
||||
</Text>
|
||||
<Button className="mt-3 min-w-20" label="Change password" onClick={presentPasswordWizard} />
|
||||
<ModalOverlay isOpen={isChangeEmailDialogOpen}>
|
||||
<ModalOverlay isOpen={isChangeEmailDialogOpen} close={closeChangeEmailDialog}>
|
||||
<ChangeEmail onCloseDialog={closeChangeEmailDialog} application={application} />
|
||||
</ModalOverlay>
|
||||
</PreferencesSegment>
|
||||
</PreferencesGroup>
|
||||
<ModalOverlay isOpen={shouldShowPasswordWizard}>
|
||||
<ModalOverlay isOpen={shouldShowPasswordWizard} close={dismissPasswordWizard}>
|
||||
<PasswordWizard application={application} dismissModal={dismissPasswordWizard} />
|
||||
</ModalOverlay>
|
||||
</>
|
||||
|
||||
@@ -48,7 +48,7 @@ const SubscriptionSharing: FunctionComponent<Props> = ({ application, viewContro
|
||||
{!subscriptionState.allInvitationsUsed && (
|
||||
<Button className="min-w-20" label="Invite" onClick={() => setIsInviteDialogOpen(true)} />
|
||||
)}
|
||||
<ModalOverlay isOpen={isInviteDialogOpen}>
|
||||
<ModalOverlay isOpen={isInviteDialogOpen} close={closeInviteDialog}>
|
||||
<Invite
|
||||
onCloseDialog={closeInviteDialog}
|
||||
application={application}
|
||||
|
||||
@@ -89,10 +89,13 @@ const SmartViews = ({ application, featuresController }: Props) => {
|
||||
)}
|
||||
</PreferencesSegment>
|
||||
</PreferencesGroup>
|
||||
<ModalOverlay isOpen={!!editSmartViewModalController.view}>
|
||||
<ModalOverlay isOpen={!!editSmartViewModalController.view} close={editSmartViewModalController.closeDialog}>
|
||||
<EditSmartViewModal controller={editSmartViewModalController} platform={application.platform} />
|
||||
</ModalOverlay>
|
||||
<ModalOverlay isOpen={addSmartViewModalController.isAddingSmartView}>
|
||||
<ModalOverlay
|
||||
isOpen={addSmartViewModalController.isAddingSmartView}
|
||||
close={addSmartViewModalController.closeModal}
|
||||
>
|
||||
<AddSmartViewModal controller={addSmartViewModalController} platform={application.platform} />
|
||||
</ModalOverlay>
|
||||
</>
|
||||
|
||||
@@ -113,7 +113,7 @@ const TwoFactorAuthView: FunctionComponent<Props> = ({ auth, application }) => {
|
||||
</PreferencesSegment>
|
||||
)}
|
||||
</PreferencesGroup>
|
||||
<ModalOverlay isOpen={shouldShowActivationModal}>
|
||||
<ModalOverlay isOpen={shouldShowActivationModal} close={closeActivationModal}>
|
||||
<Modal title={activationModalTitle} close={closeActivationModal} actions={activationModalActions}>
|
||||
{shouldShowActivationModal && <TwoFactorActivationView activation={auth.status} />}
|
||||
</Modal>
|
||||
|
||||
@@ -76,7 +76,7 @@ const U2FView: FunctionComponent<Props> = ({ application, userProvider }) => {
|
||||
</PreferencesSegment>
|
||||
)}
|
||||
</PreferencesGroup>
|
||||
<ModalOverlay isOpen={showDeviceAddingModal}>
|
||||
<ModalOverlay isOpen={showDeviceAddingModal} close={() => setShowDeviceAddingModal(false)}>
|
||||
<U2FAddDeviceView
|
||||
onDeviceAddingModalToggle={setShowDeviceAddingModal}
|
||||
onDeviceAdded={loadAuthenticatorDevices}
|
||||
|
||||
@@ -7,8 +7,6 @@ import { PreferencesProps } from './PreferencesProps'
|
||||
import { useAndroidBackHandler } from '@/NativeMobileWeb/useAndroidBackHandler'
|
||||
import Modal, { ModalAction } from '../Modal/Modal'
|
||||
import { classNames } from '@standardnotes/snjs'
|
||||
import { useCommandService } from '../CommandProvider'
|
||||
import { ESCAPE_COMMAND } from '@standardnotes/ui-services'
|
||||
import { useAvailableSafeAreaPadding } from '@/Hooks/useSafeAreaPadding'
|
||||
import { MutuallyExclusiveMediaQueryBreakpoints, useMediaQuery } from '@/Hooks/useMediaQuery'
|
||||
import Icon from '../Icon/Icon'
|
||||
@@ -20,8 +18,6 @@ const PreferencesView: FunctionComponent<PreferencesProps> = ({
|
||||
userProvider,
|
||||
mfaProvider,
|
||||
}) => {
|
||||
const commandService = useCommandService()
|
||||
|
||||
const menu = useMemo(
|
||||
() => new PreferencesMenu(application, viewControllerManager.enableUnfinishedFeatures),
|
||||
[viewControllerManager.enableUnfinishedFeatures, application],
|
||||
@@ -47,16 +43,6 @@ const PreferencesView: FunctionComponent<PreferencesProps> = ({
|
||||
}
|
||||
}, [addAndroidBackHandler, closePreferences])
|
||||
|
||||
useEffect(() => {
|
||||
return commandService.addCommandHandler({
|
||||
command: ESCAPE_COMMAND,
|
||||
onKeyDown: () => {
|
||||
closePreferences()
|
||||
return true
|
||||
},
|
||||
})
|
||||
}, [commandService, closePreferences])
|
||||
|
||||
const { hasTopInset } = useAvailableSafeAreaPadding()
|
||||
|
||||
const modalActions = useMemo(
|
||||
|
||||
@@ -51,6 +51,7 @@ const PreferencesViewWrapper: FunctionComponent<PreferencesViewWrapperProps> = (
|
||||
isOpen={viewControllerManager.preferencesController.isOpen}
|
||||
ref={setElement}
|
||||
animationVariant="horizontal"
|
||||
close={viewControllerManager.preferencesController.closePreferences}
|
||||
>
|
||||
<PreferencesView
|
||||
closePreferences={viewControllerManager.preferencesController.closePreferences}
|
||||
|
||||
@@ -212,7 +212,10 @@ const SessionsModal: FunctionComponent<{
|
||||
application: WebApplication
|
||||
}> = ({ viewControllerManager, application }) => {
|
||||
return (
|
||||
<ModalOverlay isOpen={viewControllerManager.isSessionsModalVisible}>
|
||||
<ModalOverlay
|
||||
isOpen={viewControllerManager.isSessionsModalVisible}
|
||||
close={viewControllerManager.closeSessionsModal}
|
||||
>
|
||||
<SessionsModalContent application={application} viewControllerManager={viewControllerManager} />
|
||||
</ModalOverlay>
|
||||
)
|
||||
|
||||
@@ -234,7 +234,7 @@ export const SuperEditor: FunctionComponent<Props> = ({
|
||||
</BlocksEditorComposer>
|
||||
</FilesControllerProvider>
|
||||
</LinkingControllerProvider>
|
||||
<ModalOverlay isOpen={showMarkdownPreview}>
|
||||
<ModalOverlay isOpen={showMarkdownPreview} close={closeMarkdownPreview}>
|
||||
<SuperNoteMarkdownPreview note={note.current} closeDialog={closeMarkdownPreview} />
|
||||
</ModalOverlay>
|
||||
</ErrorBoundary>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { SNNote } from '@standardnotes/snjs'
|
||||
import { FunctionComponent, useCallback, useEffect, useMemo, useState } from 'react'
|
||||
import { FunctionComponent, useCallback, useMemo, useState } from 'react'
|
||||
import { ErrorBoundary } from '@/Utils/ErrorBoundary'
|
||||
import MarkdownPreviewPlugin from './Plugins/MarkdownPreviewPlugin/MarkdownPreviewPlugin'
|
||||
import { copyTextToClipboard } from '../../Utils/copyTextToClipboard'
|
||||
@@ -7,8 +7,6 @@ import Modal, { ModalAction } from '@/Components/Modal/Modal'
|
||||
import { BlocksEditor } from './BlocksEditor'
|
||||
import { BlocksEditorComposer } from './BlocksEditorComposer'
|
||||
import { MutuallyExclusiveMediaQueryBreakpoints, useMediaQuery } from '@/Hooks/useMediaQuery'
|
||||
import { useApplication } from '../ApplicationProvider'
|
||||
import { ESCAPE_COMMAND } from '@standardnotes/ui-services'
|
||||
|
||||
type Props = {
|
||||
note: SNNote
|
||||
@@ -16,8 +14,6 @@ type Props = {
|
||||
}
|
||||
|
||||
export const SuperNoteMarkdownPreview: FunctionComponent<Props> = ({ note, closeDialog }) => {
|
||||
const application = useApplication()
|
||||
|
||||
const [markdown, setMarkdown] = useState('')
|
||||
const [didCopy, setDidCopy] = useState(false)
|
||||
|
||||
@@ -54,16 +50,6 @@ export const SuperNoteMarkdownPreview: FunctionComponent<Props> = ({ note, close
|
||||
[closeDialog, copy, didCopy, isMobileScreen],
|
||||
)
|
||||
|
||||
useEffect(() => {
|
||||
return application.keyboardService.addCommandHandler({
|
||||
command: ESCAPE_COMMAND,
|
||||
onKeyDown: () => {
|
||||
closeDialog()
|
||||
return true
|
||||
},
|
||||
})
|
||||
}, [application.keyboardService, closeDialog])
|
||||
|
||||
return (
|
||||
<Modal title="Markdown Preview" close={closeDialog} actions={modalActions}>
|
||||
<div className="relative w-full px-4 py-4">
|
||||
|
||||
@@ -54,10 +54,13 @@ const SmartViewsSection: FunctionComponent<Props> = ({ application, navigationCo
|
||||
featuresController={featuresController}
|
||||
setEditingSmartView={editSmartViewModalController.setView}
|
||||
/>
|
||||
<ModalOverlay isOpen={!!editSmartViewModalController.view}>
|
||||
<ModalOverlay isOpen={!!editSmartViewModalController.view} close={editSmartViewModalController.closeDialog}>
|
||||
<EditSmartViewModal controller={editSmartViewModalController} platform={application.platform} />
|
||||
</ModalOverlay>
|
||||
<ModalOverlay isOpen={addSmartViewModalController.isAddingSmartView}>
|
||||
<ModalOverlay
|
||||
isOpen={addSmartViewModalController.isAddingSmartView}
|
||||
close={addSmartViewModalController.closeModal}
|
||||
>
|
||||
<AddSmartViewModal controller={addSmartViewModalController} platform={application.platform} />
|
||||
</ModalOverlay>
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user