import { ItemLink, LinkableItem, LinkingController } from '@/Controllers/LinkingController' import { classNames } from '@/Utils/ConcatenateClassNames' import { KeyboardKey } from '@standardnotes/ui-services' import { observer } from 'mobx-react-lite' import { KeyboardEventHandler, MouseEventHandler, useEffect, useRef, useState } from 'react' import { ContentType } from '@standardnotes/snjs' import Icon from '../Icon/Icon' type Props = { link: ItemLink getItemIcon: LinkingController['getLinkedItemIcon'] getTitleForLinkedTag: LinkingController['getTitleForLinkedTag'] activateItem: (item: LinkableItem) => Promise unlinkItem: LinkingController['unlinkItemFromSelectedItem'] focusPreviousItem: () => void focusNextItem: () => void focusedId: string | undefined setFocusedId: (id: string) => void isBidirectional: boolean } const LinkedItemBubble = ({ link, getItemIcon, getTitleForLinkedTag, activateItem, unlinkItem, focusPreviousItem, focusNextItem, focusedId, setFocusedId, isBidirectional, }: Props) => { const ref = useRef(null) const [showUnlinkButton, setShowUnlinkButton] = useState(false) const unlinkButtonRef = useRef(null) const [wasClicked, setWasClicked] = useState(false) const handleFocus = () => { if (focusedId !== link.id) { setFocusedId(link.id) } setShowUnlinkButton(true) } const onBlur = () => { setShowUnlinkButton(false) setWasClicked(false) } const onClick: MouseEventHandler = (event) => { if (wasClicked && event.target !== unlinkButtonRef.current) { setWasClicked(false) void activateItem(link.item) } else { setWasClicked(true) } } const onUnlinkClick: MouseEventHandler = (event) => { event.stopPropagation() unlinkItem(link) } const onKeyDown: KeyboardEventHandler = (event) => { switch (event.key) { case KeyboardKey.Backspace: { focusPreviousItem() unlinkItem(link) break } case KeyboardKey.Left: focusPreviousItem() break case KeyboardKey.Right: focusNextItem() break } } const [icon, iconClassName] = getItemIcon(link.item) const tagTitle = getTitleForLinkedTag(link.item) useEffect(() => { if (link.id === focusedId) { ref.current?.focus() } }, [focusedId, link.id]) return ( ) } export default observer(LinkedItemBubble)