import type { Editor } from '@tiptap/core' import type { MarkType } from '@tiptap/pm/model' import { Plugin, PluginKey } from '@tiptap/pm/state' import { find } from 'linkifyjs' import type { LinkOptions } from '../link.js' type PasteHandlerOptions = { editor: Editor defaultProtocol: string type: MarkType shouldAutoLink?: LinkOptions['shouldAutoLink'] } export function pasteHandler(options: PasteHandlerOptions): Plugin { return new Plugin({ key: new PluginKey('handlePasteLink'), props: { handlePaste: (view, _event, slice) => { const { shouldAutoLink } = options const { state } = view const { selection } = state const { empty } = selection if (empty) { return false } let textContent = '' slice.content.forEach(node => { textContent += node.textContent }) const link = find(textContent, { defaultProtocol: options.defaultProtocol }).find( item => item.isLink && item.value === textContent, ) if (!textContent || !link || (shouldAutoLink !== undefined && !shouldAutoLink(link.value))) { return false } return options.editor.commands.setMark(options.type, { href: link.href, }) }, }, }) }