{"version":3,"file":"richTextImagePaste.utils.cjs","sources":["../../../../../src/components/forms/rich-text-editor/utils/richTextImagePaste.utils.ts"],"sourcesContent":["import type { EditorView } from '@tiptap/pm/view'\r\n\r\nimport { normalizeRichTextUrl } from '@components/forms/rich-text-editor/utils/richText.utils.ts'\r\n\r\nconst IMAGE_URL_PATTERN = /^https?:\\/\\/[^\\s]+?\\.(?:avif|gif|jpe?g|png|svg|webp)(?:[?#][^\\s]*)?$/i\r\n\r\nconst getSafeImageUrl = (value: string): string | undefined => {\r\n    const url = value.trim()\r\n\r\n    if (url.startsWith('data:image/')) {\r\n        return url\r\n    }\r\n\r\n    const normalizedUrl = normalizeRichTextUrl(url)\r\n\r\n    return normalizedUrl && /^https?:\\/\\//i.test(normalizedUrl)\r\n        ? normalizedUrl\r\n        : undefined\r\n}\r\n\r\nconst insertImage = (view: EditorView, src: string, alt?: string) => {\r\n    const imageNode = view.state.schema.nodes.image.create({\r\n        src,\r\n        ...(alt ? { alt } : {}),\r\n    })\r\n\r\n    view.dispatch(view.state.tr.replaceSelectionWith(imageNode).scrollIntoView())\r\n}\r\n\r\nexport const handleRichTextImagePaste = (view: EditorView, event: ClipboardEvent): boolean => {\r\n    const clipboardData = event.clipboardData\r\n\r\n    if (!clipboardData) {\r\n        return false\r\n    }\r\n\r\n    const imageFile = Array.from(clipboardData.items)\r\n        .find((item) => item.kind === 'file' && item.type.startsWith('image/'))\r\n        ?.getAsFile()\r\n\r\n    if (imageFile) {\r\n        const reader = new FileReader()\r\n        reader.onload = () => {\r\n            if (typeof reader.result === 'string') {\r\n                insertImage(view, reader.result)\r\n            }\r\n        }\r\n        reader.readAsDataURL(imageFile)\r\n        return true\r\n    }\r\n\r\n    const html = clipboardData.getData('text/html')\r\n    const imageElement = html\r\n        ? new DOMParser().parseFromString(html, 'text/html').querySelector('img')\r\n        : null\r\n    const htmlImageUrl = imageElement ? getSafeImageUrl(imageElement.src) : undefined\r\n\r\n    if (htmlImageUrl) {\r\n        insertImage(view, htmlImageUrl, imageElement?.alt)\r\n        return true\r\n    }\r\n\r\n    const text = clipboardData.getData('text/plain').trim()\r\n    const imageUrl = IMAGE_URL_PATTERN.test(text) ? getSafeImageUrl(text) : undefined\r\n\r\n    if (imageUrl) {\r\n        insertImage(view, imageUrl)\r\n        return true\r\n    }\r\n\r\n    return false\r\n}\r\n"],"names":["IMAGE_URL_PATTERN","getSafeImageUrl","value","url","normalizedUrl","normalizeRichTextUrl","insertImage","view","src","alt","imageNode","handleRichTextImagePaste","event","clipboardData","imageFile","item","reader","html","imageElement","htmlImageUrl","text","imageUrl"],"mappings":"wHAIMA,EAAoB,wEAEpBC,EAAmBC,GAAsC,CAC3D,MAAMC,EAAMD,EAAM,KAAA,EAElB,GAAIC,EAAI,WAAW,aAAa,EAC5B,OAAOA,EAGX,MAAMC,EAAgBC,EAAAA,qBAAqBF,CAAG,EAE9C,OAAOC,GAAiB,gBAAgB,KAAKA,CAAa,EACpDA,EACA,MACV,EAEME,EAAc,CAACC,EAAkBC,EAAaC,IAAiB,CACjE,MAAMC,EAAYH,EAAK,MAAM,OAAO,MAAM,MAAM,OAAO,CACnD,IAAAC,EACA,GAAIC,EAAM,CAAE,IAAAA,GAAQ,CAAA,CAAC,CACxB,EAEDF,EAAK,SAASA,EAAK,MAAM,GAAG,qBAAqBG,CAAS,EAAE,gBAAgB,CAChF,EAEaC,EAA2B,CAACJ,EAAkBK,IAAmC,CAC1F,MAAMC,EAAgBD,EAAM,cAE5B,GAAI,CAACC,EACD,MAAO,GAGX,MAAMC,EAAY,MAAM,KAAKD,EAAc,KAAK,EAC3C,KAAME,GAASA,EAAK,OAAS,QAAUA,EAAK,KAAK,WAAW,QAAQ,CAAC,GACpE,UAAA,EAEN,GAAID,EAAW,CACX,MAAME,EAAS,IAAI,WACnB,OAAAA,EAAO,OAAS,IAAM,CACd,OAAOA,EAAO,QAAW,UACzBV,EAAYC,EAAMS,EAAO,MAAM,CAEvC,EACAA,EAAO,cAAcF,CAAS,EACvB,EACX,CAEA,MAAMG,EAAOJ,EAAc,QAAQ,WAAW,EACxCK,EAAeD,EACf,IAAI,YAAY,gBAAgBA,EAAM,WAAW,EAAE,cAAc,KAAK,EACtE,KACAE,EAAeD,EAAejB,EAAgBiB,EAAa,GAAG,EAAI,OAExE,GAAIC,EACA,OAAAb,EAAYC,EAAMY,EAAcD,GAAc,GAAG,EAC1C,GAGX,MAAME,EAAOP,EAAc,QAAQ,YAAY,EAAE,KAAA,EAC3CQ,EAAWrB,EAAkB,KAAKoB,CAAI,EAAInB,EAAgBmB,CAAI,EAAI,OAExE,OAAIC,GACAf,EAAYC,EAAMc,CAAQ,EACnB,IAGJ,EACX"}