diff --git a/app/assets/javascripts/components/NoteTag.tsx b/app/assets/javascripts/components/NoteTag.tsx index ec703d78c..d3c7a937d 100644 --- a/app/assets/javascripts/components/NoteTag.tsx +++ b/app/assets/javascripts/components/NoteTag.tsx @@ -3,8 +3,6 @@ import { FunctionalComponent } from 'preact'; import { useRef, useState } from 'preact/hooks'; import { AppState } from '@/ui_models/app_state'; import { SNTag } from '@standardnotes/snjs/dist/@types'; -import { useEffect } from 'react'; -import { useCloseOnBlur, useCloseOnClickOutside } from './utils'; type Props = { appState: AppState; @@ -16,14 +14,8 @@ export const NoteTag: FunctionalComponent = ({ appState, tag }) => { tagsContainerMaxWidth, } = appState.activeNote; - const [contextMenuOpen, setContextMenuOpen] = useState(false); - const [contextMenuPosition, setContextMenuPosition] = useState({ top: 0, left: 0 }); - - const contextMenuRef = useRef(); - const tagRef = useRef(); - - const [closeOnBlur] = useCloseOnBlur(contextMenuRef, setContextMenuOpen); - useCloseOnClickOutside(contextMenuRef, setContextMenuOpen); + const [showDeleteButton, setShowDeleteButton] = useState(false); + const deleteTagRef = useRef(); const deleteTag = () => { appState.activeNote.removeTagFromActiveNote(tag); @@ -33,66 +25,54 @@ export const NoteTag: FunctionalComponent = ({ appState, tag }) => { appState.setSelectedTag(tag); }; - const contextMenuListener = (event: MouseEvent) => { - event.preventDefault(); - setContextMenuPosition({ - top: event.clientY, - left: event.clientX, - }); - setContextMenuOpen(true); + const onFocus = () => { + setShowDeleteButton(true); }; - useEffect(() => { - tagRef.current.addEventListener('contextmenu', contextMenuListener); - return () => { - tagRef.current.removeEventListener('contextmenu', contextMenuListener); - }; - }, []); + const onBlur = (event: FocusEvent) => { + const relatedTarget = event.relatedTarget as Node; + if (relatedTarget !== deleteTagRef.current) { + setShowDeleteButton(false); + } + }; return ( - <> - - {contextMenuOpen && ( -
{ + if (element) { + appState.activeNote.setTagElement(tag, element); + } + }} + className="sn-tag pl-1 pr-2 mr-2" + style={{ maxWidth: tagsContainerMaxWidth }} + onClick={onTagClick} + onKeyUp={(event) => { + if (event.key === 'Backspace') { + deleteTag(); + } + }} + onFocus={onFocus} + onBlur={onBlur} + > + + + {tag.title} + + {showDeleteButton && ( + -
+ + )} - + ); };