fix: menu should remain open when showing trash alert
This commit is contained in:
@@ -10,7 +10,7 @@ type Props = {
|
|||||||
|
|
||||||
const NotesContextMenu = observer(({ appState }: Props) => {
|
const NotesContextMenu = observer(({ appState }: Props) => {
|
||||||
const contextMenuRef = useRef<HTMLDivElement>();
|
const contextMenuRef = useRef<HTMLDivElement>();
|
||||||
const [closeOnBlur, setLockCloseOnBlur] = useCloseOnBlur(
|
const [closeOnBlur, blurLocked, setLockCloseOnBlur] = useCloseOnBlur(
|
||||||
contextMenuRef,
|
contextMenuRef,
|
||||||
(open: boolean) => appState.notes.setContextMenuOpen(open)
|
(open: boolean) => appState.notes.setContextMenuOpen(open)
|
||||||
);
|
);
|
||||||
@@ -37,6 +37,7 @@ const NotesContextMenu = observer(({ appState }: Props) => {
|
|||||||
<NotesOptions
|
<NotesOptions
|
||||||
appState={appState}
|
appState={appState}
|
||||||
closeOnBlur={closeOnBlur}
|
closeOnBlur={closeOnBlur}
|
||||||
|
blurLocked={blurLocked}
|
||||||
setLockCloseOnBlur={setLockCloseOnBlur}
|
setLockCloseOnBlur={setLockCloseOnBlur}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { AppState } from '@/ui_models/app_state';
|
|||||||
import { Icon, IconType } from './Icon';
|
import { Icon, IconType } from './Icon';
|
||||||
import { Switch } from './Switch';
|
import { Switch } from './Switch';
|
||||||
import { observer } from 'mobx-react-lite';
|
import { observer } from 'mobx-react-lite';
|
||||||
import { useRef, useState } from 'preact/hooks';
|
import { useEffect, useRef, useState } from 'preact/hooks';
|
||||||
import {
|
import {
|
||||||
Disclosure,
|
Disclosure,
|
||||||
DisclosureButton,
|
DisclosureButton,
|
||||||
@@ -12,16 +12,18 @@ import {
|
|||||||
type Props = {
|
type Props = {
|
||||||
appState: AppState;
|
appState: AppState;
|
||||||
closeOnBlur: (event: { relatedTarget: EventTarget | null }) => void;
|
closeOnBlur: (event: { relatedTarget: EventTarget | null }) => void;
|
||||||
|
blurLocked: boolean;
|
||||||
setLockCloseOnBlur: (lock: boolean) => void;
|
setLockCloseOnBlur: (lock: boolean) => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const NotesOptions = observer(
|
export const NotesOptions = observer(
|
||||||
({ appState, closeOnBlur, setLockCloseOnBlur }: Props) => {
|
({ appState, closeOnBlur, blurLocked, setLockCloseOnBlur }: Props) => {
|
||||||
const [tagsMenuOpen, setTagsMenuOpen] = useState(false);
|
const [tagsMenuOpen, setTagsMenuOpen] = useState(false);
|
||||||
const [tagsMenuPosition, setTagsMenuPosition] = useState({
|
const [tagsMenuPosition, setTagsMenuPosition] = useState({
|
||||||
top: 0,
|
top: 0,
|
||||||
right: 0,
|
right: 0,
|
||||||
});
|
});
|
||||||
|
const [shouldTrashNotes, setShouldTrashNotes] = useState(false);
|
||||||
|
|
||||||
const notes = Object.values(appState.notes.selectedNotes);
|
const notes = Object.values(appState.notes.selectedNotes);
|
||||||
const hidePreviews = !notes.some((note) => !note.hidePreview);
|
const hidePreviews = !notes.some((note) => !note.hidePreview);
|
||||||
@@ -39,6 +41,23 @@ export const NotesOptions = observer(
|
|||||||
'cursor-pointer hover:bg-contrast color-text bg-transparent px-3 ' +
|
'cursor-pointer hover:bg-contrast color-text bg-transparent px-3 ' +
|
||||||
'text-left';
|
'text-left';
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const openTrashAlert = async () => {
|
||||||
|
if (shouldTrashNotes && blurLocked) {
|
||||||
|
await appState.notes.setTrashSelectedNotes(!trashed, trashButtonRef);
|
||||||
|
setShouldTrashNotes(false);
|
||||||
|
setLockCloseOnBlur(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
openTrashAlert();
|
||||||
|
}, [
|
||||||
|
appState.notes,
|
||||||
|
blurLocked,
|
||||||
|
setLockCloseOnBlur,
|
||||||
|
shouldTrashNotes,
|
||||||
|
trashed,
|
||||||
|
]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Switch
|
<Switch
|
||||||
@@ -167,12 +186,8 @@ export const NotesOptions = observer(
|
|||||||
onBlur={closeOnBlur}
|
onBlur={closeOnBlur}
|
||||||
className={`${buttonClass} py-1.5`}
|
className={`${buttonClass} py-1.5`}
|
||||||
onClick={async () => {
|
onClick={async () => {
|
||||||
|
setShouldTrashNotes(true);
|
||||||
setLockCloseOnBlur(true);
|
setLockCloseOnBlur(true);
|
||||||
await appState.notes.setTrashSelectedNotes(
|
|
||||||
!trashed,
|
|
||||||
trashButtonRef
|
|
||||||
);
|
|
||||||
setLockCloseOnBlur(false);
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Icon type={IconType.Trash} className={iconClass} />
|
<Icon type={IconType.Trash} className={iconClass} />
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export const NotesOptionsPanel = observer(({ appState }: Props) => {
|
|||||||
});
|
});
|
||||||
const buttonRef = useRef<HTMLButtonElement>();
|
const buttonRef = useRef<HTMLButtonElement>();
|
||||||
const panelRef = useRef<HTMLDivElement>();
|
const panelRef = useRef<HTMLDivElement>();
|
||||||
const [closeOnBlur, setLockCloseOnBlur] = useCloseOnBlur(panelRef, setOpen);
|
const [closeOnBlur, blurLocked, setLockCloseOnBlur] = useCloseOnBlur(panelRef, setOpen);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Disclosure
|
<Disclosure
|
||||||
@@ -71,6 +71,7 @@ export const NotesOptionsPanel = observer(({ appState }: Props) => {
|
|||||||
<NotesOptions
|
<NotesOptions
|
||||||
appState={appState}
|
appState={appState}
|
||||||
closeOnBlur={closeOnBlur}
|
closeOnBlur={closeOnBlur}
|
||||||
|
blurLocked={blurLocked}
|
||||||
setLockCloseOnBlur={setLockCloseOnBlur}
|
setLockCloseOnBlur={setLockCloseOnBlur}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ export function useCloseOnBlur(
|
|||||||
setOpen: (open: boolean) => void
|
setOpen: (open: boolean) => void
|
||||||
): [
|
): [
|
||||||
(event: { relatedTarget: EventTarget | null }) => void,
|
(event: { relatedTarget: EventTarget | null }) => void,
|
||||||
|
boolean,
|
||||||
StateUpdater<boolean>
|
StateUpdater<boolean>
|
||||||
] {
|
] {
|
||||||
const [locked, setLocked] = useState(false);
|
const [locked, setLocked] = useState(false);
|
||||||
@@ -26,6 +27,7 @@ export function useCloseOnBlur(
|
|||||||
},
|
},
|
||||||
[container, setOpen, locked]
|
[container, setOpen, locked]
|
||||||
),
|
),
|
||||||
|
locked,
|
||||||
setLocked,
|
setLocked,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user