diff --git a/packages/web/src/javascripts/Components/ClipperView/getSuperJSONFromClipHTML.tsx b/packages/web/src/javascripts/Components/ClipperView/getSuperJSONFromClipHTML.tsx index 694ee3680..22d177808 100644 --- a/packages/web/src/javascripts/Components/ClipperView/getSuperJSONFromClipHTML.tsx +++ b/packages/web/src/javascripts/Components/ClipperView/getSuperJSONFromClipHTML.tsx @@ -1,9 +1,12 @@ -import { $createParagraphNode, $getRoot, $insertNodes, LexicalNode } from 'lexical' +import { $createParagraphNode, $getRoot, $insertNodes, $nodesOfType, LexicalNode } from 'lexical' import { $generateNodesFromDOM } from '@lexical/html' import { createHeadlessEditor } from '@lexical/headless' import { BlockEditorNodes } from '../SuperEditor/Lexical/Nodes/AllNodes' import BlocksEditorTheme from '../SuperEditor/Lexical/Theme/Theme' import { ClipPayload } from '@standardnotes/clipper/src/types/message' +import { LinkNode } from '@lexical/link' + +const AbsoluteLinkRegExp = new RegExp('^(?:[a-z+]+:)?//', 'i') export const getSuperJSONFromClipPayload = async (clipPayload: ClipPayload) => { const editor = createHeadlessEditor({ @@ -14,6 +17,8 @@ export const getSuperJSONFromClipPayload = async (clipPayload: ClipPayload) => { nodes: [...BlockEditorNodes], }) + const clipURL = new URL(clipPayload.url) + await new Promise((resolve) => { editor.update(() => { const parser = new DOMParser() @@ -59,5 +64,21 @@ export const getSuperJSONFromClipPayload = async (clipPayload: ClipPayload) => { }) }) + await new Promise((resolve) => { + editor.update(() => { + $nodesOfType(LinkNode).forEach((linkNode) => { + const url = linkNode.getURL() + const isAbsoluteLink = AbsoluteLinkRegExp.test(url) + + if (!isAbsoluteLink) { + const fixedURL = new URL(url, clipURL) + linkNode.setURL(fixedURL.toString()) + } + }) + + resolve() + }) + }) + return JSON.stringify(editor.getEditorState().toJSON()) } diff --git a/packages/web/src/javascripts/Components/ItemSelectionDropdown/ItemSelectionDropdown.tsx b/packages/web/src/javascripts/Components/ItemSelectionDropdown/ItemSelectionDropdown.tsx index 2a995e922..8d1f8557e 100644 --- a/packages/web/src/javascripts/Components/ItemSelectionDropdown/ItemSelectionDropdown.tsx +++ b/packages/web/src/javascripts/Components/ItemSelectionDropdown/ItemSelectionDropdown.tsx @@ -30,9 +30,11 @@ const ItemSelectionDropdown = ({ contentTypes, placeholder, onSelection, combobo const combobox = useComboboxStore(comboboxProps) const value = combobox.useState('value') const open = combobox.useState('open') - if (value.length < 1 && open) { - combobox.setOpen(false) - } + useEffect(() => { + if (value.length < 1 && open) { + combobox.setOpen(false) + } + }, [combobox, open, value.length]) const searchQuery = useDeferredValue(value) const [items, setItems] = useState([])