import { FeatureName } from '@/Controllers/FeatureName' import { classNames } from '@standardnotes/utils' import { getLinkingSearchResults } from '@/Utils/Items/Search/getSearchResults' import { observer } from 'mobx-react-lite' import { useCallback, useRef, useState } from 'react' import { useApplication } from '../ApplicationProvider' import ClearInputButton from '../ClearInputButton/ClearInputButton' import Icon from '../Icon/Icon' import DecoratedInput from '../Input/DecoratedInput' import LinkedItemSearchResults from './LinkedItemSearchResults' import { LinkedItemsSectionItem } from './LinkedItemsSectionItem' import { DecryptedItem } from '@standardnotes/snjs' import { useItemLinks } from '@/Hooks/useItemLinks' import { mergeRefs } from '@/Hooks/mergeRefs' const LinkedItemsPanel = ({ item }: { item: DecryptedItem }) => { const application = useApplication() const { linkItems, unlinkItems, activateItem, createAndAddNewTag, isEntitledToNoteLinking } = application.linkingController const { notesLinkedToItem, notesLinkingToItem, filesLinkedToItem, filesLinkingToItem, tagsLinkedToItem } = useItemLinks(item) const { entitledToFiles } = application.featuresController const searchInputRef = useRef(null) const [searchQuery, setSearchQuery] = useState('') const isSearching = !!searchQuery.length const { linkedResults, unlinkedItems, shouldShowCreateTag } = getLinkingSearchResults(searchQuery, application, item) const focusInput = useCallback((element: HTMLInputElement | null) => { if (element) { element.focus() } }, []) const selectAndUploadFiles = async () => { if (!entitledToFiles) { void application.featuresController.showPremiumAlert(FeatureName.Files) return } void application.filesController.selectAndUploadNewFiles((file) => { void linkItems(item, file) }) } return (
{ setSearchQuery('') searchInputRef.current?.focus() }} /> ), ]} />
{isSearching ? ( <> {(!!unlinkedItems.length || shouldShowCreateTag) && (
Unlinked
{ setSearchQuery('') searchInputRef.current?.focus() }} item={item} />
)} {!!linkedResults.length && (
Linked
{linkedResults.map((link) => ( unlinkItems(item, link.item)} activateItem={activateItem} handleFileAction={application.filesController.handleFileAction} /> ))}
)} ) : ( <> {!!tagsLinkedToItem.length && (
Linked Tags
{tagsLinkedToItem.map((link) => ( unlinkItems(item, link.item)} activateItem={activateItem} handleFileAction={application.filesController.handleFileAction} /> ))}
)}
Linked Files
{filesLinkedToItem.map((link) => ( unlinkItems(item, link.item)} activateItem={activateItem} handleFileAction={application.filesController.handleFileAction} /> ))}
{!!filesLinkingToItem.length && (
Files Linking To Current File
{filesLinkingToItem.map((link) => ( unlinkItems(item, link.item)} activateItem={activateItem} handleFileAction={application.filesController.handleFileAction} /> ))}
)} {!!notesLinkedToItem.length && (
Linked Notes
{notesLinkedToItem.map((link) => ( unlinkItems(item, link.item)} activateItem={activateItem} handleFileAction={application.filesController.handleFileAction} /> ))}
)} {!!notesLinkingToItem.length && (
Notes Linking To This Note
{notesLinkingToItem.map((link) => ( unlinkItems(item, link.item)} activateItem={activateItem} handleFileAction={application.filesController.handleFileAction} /> ))}
)} )}
) } export default observer(LinkedItemsPanel)