import { t } from "../../services/i18n"; import Modal from "../react/Modal"; import ReactBasicWidget from "../react/ReactBasicWidget"; import Button from "../react/Button"; import FormRadioGroup from "../react/FormRadioGroup"; import NoteAutocomplete from "../react/NoteAutocomplete"; import { useRef, useState, useEffect } from "preact/hooks"; import tree from "../../services/tree"; import note_autocomplete, { Suggestion } from "../../services/note_autocomplete"; import { default as TextTypeWidget } from "../type_widgets/editable_text.js"; import { logError } from "../../services/ws"; import FormGroup from "../react/FormGroup.js"; import { refToJQuerySelector } from "../react/react_utils"; import useTriliumEvent from "../react/hooks"; type LinkType = "reference-link" | "external-link" | "hyper-link"; function AddLinkDialogComponent() { const [ textTypeWidget, setTextTypeWidget ] = useState(); const initialText = useRef(); const [ linkTitle, setLinkTitle ] = useState(""); const hasSelection = textTypeWidget?.hasSelection(); const [ linkType, setLinkType ] = useState(hasSelection ? "hyper-link" : "reference-link"); const [ suggestion, setSuggestion ] = useState(null); const [ shown, setShown ] = useState(false); useTriliumEvent("showAddLinkDialog", ( { textTypeWidget, text }) => { setTextTypeWidget(textTypeWidget); initialText.current = text; setShown(true); }); async function setDefaultLinkTitle(noteId: string) { const noteTitle = await tree.getNoteTitle(noteId); setLinkTitle(noteTitle); } function resetExternalLink() { if (linkType === "external-link") { setLinkType("reference-link"); } } useEffect(() => { if (!suggestion) { resetExternalLink(); return; } if (suggestion.notePath) { const noteId = tree.getNoteIdFromUrl(suggestion.notePath); if (noteId) { setDefaultLinkTitle(noteId); } resetExternalLink(); } if (suggestion.externalLink) { setLinkTitle(suggestion.externalLink); setLinkType("external-link"); } }, [suggestion]); function onShown() { const $autocompleteEl = refToJQuerySelector(autocompleteRef); if (!initialText.current) { note_autocomplete.showRecentNotes($autocompleteEl); } else { note_autocomplete.setText($autocompleteEl, initialText.current); } // to be able to quickly remove entered text $autocompleteEl .trigger("focus") .trigger("select"); } function onSubmit() { if (suggestion?.notePath) { // Handle note link setShown(false); textTypeWidget?.addLink(suggestion.notePath, linkType === "reference-link" ? null : linkTitle); } else if (suggestion?.externalLink) { // Handle external link setShown(false); textTypeWidget?.addLink(suggestion.externalLink, linkTitle, true); } else { logError("No link to add."); } } const autocompleteRef = useRef(null); return ( } onSubmit={onSubmit} onShown={onShown} onHidden={() => { setSuggestion(null); setShown(false); }} show={shown} > {!hasSelection && (
{(linkType !== "external-link") && ( <> setLinkType(newValue as LinkType)} /> )} {(linkType !== "reference-link" && (

))}
)}
); } export default class AddLinkDialog extends ReactBasicWidget { get component() { return ; } }