import { LinkingController } from '@/Controllers/LinkingController' import { classNames } from '@standardnotes/utils' 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' import { ItemLink } from '@/Utils/Items/Search/ItemLink' import { LinkableItem } from '@/Utils/Items/Search/LinkableItem' import { getIconForItem } from '@/Utils/Items/Icons/getIconForItem' import { useApplication } from '../ApplicationProvider' import { getTitleForLinkedTag } from '@/Utils/Items/Display/getTitleForLinkedTag' import { getItemTitleInContextOfLinkBubble } from '@/Utils/Items/Search/doesItemMatchSearchQuery' type Props = { link: ItemLink activateItem?: (item: LinkableItem) => Promise unlinkItem: LinkingController['unlinkItemFromSelectedItem'] focusPreviousItem?: () => void focusNextItem?: () => void focusedId?: string | undefined setFocusedId?: (id: string) => void isBidirectional: boolean inlineFlex?: boolean className?: string readonly?: boolean } const LinkedItemBubble = ({ link, activateItem, unlinkItem, focusPreviousItem, focusNextItem, focusedId, setFocusedId, isBidirectional, inlineFlex, className, readonly, }: Props) => { const ref = useRef(null) const application = useApplication() 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) if (readonly) { return } void activateItem?.(link.item) } else { setWasClicked(true) } } const onUnlinkClick: MouseEventHandler = (event) => { event.stopPropagation() void unlinkItem(link.item) } const onKeyDown: KeyboardEventHandler = (event) => { switch (event.key) { case KeyboardKey.Backspace: { focusPreviousItem?.() void unlinkItem(link.item) break } case KeyboardKey.Left: focusPreviousItem?.() break case KeyboardKey.Right: focusNextItem?.() break } } const [icon, iconClassName] = getIconForItem(link.item, application) const tagTitle = getTitleForLinkedTag(link.item, application) useEffect(() => { if (link.id === focusedId) { ref.current?.focus() } }, [focusedId, link.id]) return ( ) } export default observer(LinkedItemBubble)