payload-richtext-tiptap 0.0.129 → 0.0.131

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/dist/src/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.d.ts.map +1 -1
  2. package/dist/src/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.js +17 -2
  3. package/dist/src/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.js.map +1 -1
  4. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.d.ts.map +1 -1
  5. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.js +29 -17
  6. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.js.map +1 -1
  7. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.d.ts.map +1 -1
  8. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.js +40 -16
  9. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.js.map +1 -1
  10. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.d.ts.map +1 -1
  11. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.js +17 -13
  12. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.js.map +1 -1
  13. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.d.ts.map +1 -1
  14. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.js +16 -6
  15. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.js.map +1 -1
  16. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Youtube/youtube.d.ts.map +1 -1
  17. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Youtube/youtube.js +30 -25
  18. package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Youtube/youtube.js.map +1 -1
  19. package/dist/src/fields/TiptapEditor/extensions/VideoBlock/VideoBlock.d.ts.map +1 -1
  20. package/dist/src/fields/TiptapEditor/extensions/VideoBlock/VideoBlock.js +17 -2
  21. package/dist/src/fields/TiptapEditor/extensions/VideoBlock/VideoBlock.js.map +1 -1
  22. package/dist/tsconfig.tsbuildinfo +1 -1
  23. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ImageBlock.d.ts","sourceRoot":"","sources":["../../../../../../src/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,EAAE,MAAM,cAAc,CAAC;AAKtD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,UAAU,EAAE;YACV,aAAa,EAAE,CAAC,UAAU,EAAE;gBAC1B,GAAG,EAAE,MAAM,CAAC;gBACZ,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,KAAK,UAAU,CAAC;YACjB,eAAe,EAAE,CAAC,UAAU,EAAE;gBAC5B,GAAG,EAAE,MAAM,CAAC;gBACZ,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;gBACpB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,KAAK,UAAU,CAAC;YACjB,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,KAAK,UAAU,CAAC;YACvE,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC;YAClD,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,CAAC;SAClD,CAAC;KACH;CACF;AAED,eAAO,MAAM,UAAU,mFA0GrB,CAAC;AAEH,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"ImageBlock.d.ts","sourceRoot":"","sources":["../../../../../../src/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,EAAE,MAAM,cAAc,CAAC;AAKtD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,UAAU,EAAE;YACV,aAAa,EAAE,CAAC,UAAU,EAAE;gBAC1B,GAAG,EAAE,MAAM,CAAC;gBACZ,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,KAAK,UAAU,CAAC;YACjB,eAAe,EAAE,CAAC,UAAU,EAAE;gBAC5B,GAAG,EAAE,MAAM,CAAC;gBACZ,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;gBACpB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,KAAK,UAAU,CAAC;YACjB,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,KAAK,UAAU,CAAC;YACvE,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC;YAClD,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,CAAC;SAClD,CAAC;KACH;CACF;AAED,eAAO,MAAM,UAAU,mFAiHrB,CAAC;AAEH,eAAe,UAAU,CAAC"}
@@ -56,8 +56,23 @@ export const ImageBlock = Image.extend({
56
56
  },
57
57
  renderHTML ({ HTMLAttributes }) {
58
58
  return [
59
- "img",
60
- mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)
59
+ 'div',
60
+ {
61
+ class: "imageBlock"
62
+ },
63
+ [
64
+ "img",
65
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)
66
+ ],
67
+ [
68
+ "textarea",
69
+ mergeAttributes({
70
+ class: "w-full text-gray-400 h-16 mb-2 placeholder-black p-1 text-sm text-gray-400 border-0 rounded appearance-none"
71
+ }, {
72
+ defaultValue: HTMLAttributes.caption
73
+ }),
74
+ HTMLAttributes.caption
75
+ ]
61
76
  ];
62
77
  },
63
78
  addCommands () {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.ts"],"sourcesContent":["\"use client\";\n\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { mergeAttributes, Range } from \"@tiptap/core\";\n\nimport { ImageBlockView } from \"./components/ImageBlockView.js\";\nimport { Image } from \"../Image/Image.js\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n imageBlock: {\n setImageBlock: (attributes: {\n src: string;\n assetId?: string;\n caption?: string;\n }) => ReturnType;\n setImageBlockAt: (attributes: {\n src: string;\n pos: number | Range;\n assetId?: string;\n caption?: string;\n }) => ReturnType;\n setImageBlockAlign: (align: \"left\" | \"center\" | \"right\") => ReturnType;\n setImageBlockWidth: (width: number) => ReturnType;\n setImageCaption: (caption: string) => ReturnType;\n };\n }\n}\n\nexport const ImageBlock = Image.extend({\n name: \"imageBlock\",\n\n group: \"block\",\n\n defining: true,\n\n isolating: true,\n\n addAttributes() {\n return {\n src: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"src\"),\n renderHTML: (attributes) => ({\n src: attributes.src,\n }),\n },\n width: {\n default: \"100%\",\n parseHTML: (element) => element.getAttribute(\"data-width\"),\n renderHTML: (attributes) => ({\n \"data-width\": attributes.width,\n }),\n },\n align: {\n default: \"center\",\n parseHTML: (element) => element.getAttribute(\"data-align\"),\n renderHTML: (attributes) => ({\n \"data-align\": attributes.align,\n }),\n },\n alt: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"alt\"),\n renderHTML: (attributes) => ({\n alt: attributes.alt,\n }),\n },\n caption: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"caption\"),\n renderHTML: (attributes) => ({\n caption: attributes.caption,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'img[src*=\"tiptap.dev\"]:not([src^=\"data:\"]), img[src*=\"windows.net\"]:not([src^=\"data:\"])',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"img\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n ];\n },\n\n addCommands() {\n return {\n setImageBlock:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContent({\n type: \"imageBlock\",\n attrs: { src: attrs.src, caption: attrs.caption },\n });\n },\n\n setImageBlockAt:\n (attrs) =>\n ({ commands }) => {\n console.log(attrs);\n return commands.insertContentAt(attrs.pos, {\n type: \"imageBlock\",\n attrs: { src: attrs.src, caption: attrs.caption },\n });\n },\n setImageCaption:\n (caption) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", { caption }),\n setImageBlockAlign:\n (align) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", { align }),\n\n setImageBlockWidth:\n (width) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", {\n width: `${Math.max(0, Math.min(100, width))}%`,\n }),\n };\n },\n\n addNodeView() {\n //@ts-ignore\n return ReactNodeViewRenderer(ImageBlockView);\n },\n});\n\nexport default ImageBlock;\n"],"names":["ReactNodeViewRenderer","mergeAttributes","ImageBlockView","Image","ImageBlock","extend","name","group","defining","isolating","addAttributes","src","default","parseHTML","element","getAttribute","renderHTML","attributes","width","align","alt","caption","tag","HTMLAttributes","options","addCommands","setImageBlock","attrs","commands","insertContent","type","setImageBlockAt","console","log","insertContentAt","pos","setImageCaption","updateAttributes","setImageBlockAlign","setImageBlockWidth","Math","max","min","addNodeView"],"mappings":"AAAA;AAEA,SAASA,qBAAqB,QAAQ,gBAAgB;AACtD,SAASC,eAAe,QAAe,eAAe;AAEtD,SAASC,cAAc,QAAQ,iCAAiC;AAChE,SAASC,KAAK,QAAQ,oBAAoB;AAuB1C,OAAO,MAAMC,aAAaD,MAAME,MAAM,CAAC;IACrCC,MAAM;IAENC,OAAO;IAEPC,UAAU;IAEVC,WAAW;IAEXC;QACE,OAAO;YACLC,KAAK;gBACHC,SAAS;gBACTC,WAAW,CAACC,UAAYA,QAAQC,YAAY,CAAC;gBAC7CC,YAAY,CAACC,aAAgB,CAAA;wBAC3BN,KAAKM,WAAWN,GAAG;oBACrB,CAAA;YACF;YACAO,OAAO;gBACLN,SAAS;gBACTC,WAAW,CAACC,UAAYA,QAAQC,YAAY,CAAC;gBAC7CC,YAAY,CAACC,aAAgB,CAAA;wBAC3B,cAAcA,WAAWC,KAAK;oBAChC,CAAA;YACF;YACAC,OAAO;gBACLP,SAAS;gBACTC,WAAW,CAACC,UAAYA,QAAQC,YAAY,CAAC;gBAC7CC,YAAY,CAACC,aAAgB,CAAA;wBAC3B,cAAcA,WAAWE,KAAK;oBAChC,CAAA;YACF;YACAC,KAAK;gBACHR,SAAS;gBACTC,WAAW,CAACC,UAAYA,QAAQC,YAAY,CAAC;gBAC7CC,YAAY,CAACC,aAAgB,CAAA;wBAC3BG,KAAKH,WAAWG,GAAG;oBACrB,CAAA;YACF;YACAC,SAAS;gBACPT,SAAS;gBACTC,WAAW,CAACC,UAAYA,QAAQC,YAAY,CAAC;gBAC7CC,YAAY,CAACC,aAAgB,CAAA;wBAC3BI,SAASJ,WAAWI,OAAO;oBAC7B,CAAA;YACF;QACF;IACF;IAEAR;QACE,OAAO;YACL;gBACES,KAAK;YACP;SACD;IACH;IAEAN,YAAW,EAAEO,cAAc,EAAE;QAC3B,OAAO;YACL;YACAtB,gBAAgB,IAAI,CAACuB,OAAO,CAACD,cAAc,EAAEA;SAC9C;IACH;IAEAE;QACE,OAAO;YACLC,eACE,CAACC,QACD,CAAC,EAAEC,QAAQ,EAAE;oBACX,OAAOA,SAASC,aAAa,CAAC;wBAC5BC,MAAM;wBACNH,OAAO;4BAAEhB,KAAKgB,MAAMhB,GAAG;4BAAEU,SAASM,MAAMN,OAAO;wBAAC;oBAClD;gBACF;YAEFU,iBACE,CAACJ,QACD,CAAC,EAAEC,QAAQ,EAAE;oBACXI,QAAQC,GAAG,CAACN;oBACZ,OAAOC,SAASM,eAAe,CAACP,MAAMQ,GAAG,EAAE;wBACzCL,MAAM;wBACNH,OAAO;4BAAEhB,KAAKgB,MAAMhB,GAAG;4BAAEU,SAASM,MAAMN,OAAO;wBAAC;oBAClD;gBACF;YACFe,iBACE,CAACf,UACD,CAAC,EAAEO,QAAQ,EAAE,GACXA,SAASS,gBAAgB,CAAC,cAAc;wBAAEhB;oBAAQ;YACtDiB,oBACE,CAACnB,QACD,CAAC,EAAES,QAAQ,EAAE,GACXA,SAASS,gBAAgB,CAAC,cAAc;wBAAElB;oBAAM;YAEpDoB,oBACE,CAACrB,QACD,CAAC,EAAEU,QAAQ,EAAE,GACXA,SAASS,gBAAgB,CAAC,cAAc;wBACtCnB,OAAO,CAAC,EAAEsB,KAAKC,GAAG,CAAC,GAAGD,KAAKE,GAAG,CAAC,KAAKxB,QAAQ,CAAC,CAAC;oBAChD;QACN;IACF;IAEAyB;QACE,YAAY;QACZ,OAAO3C,sBAAsBE;IAC/B;AACF,GAAG;AAEH,eAAeE,WAAW"}
1
+ {"version":3,"sources":["../../../../../../src/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.ts"],"sourcesContent":["\"use client\";\n\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { mergeAttributes, Range } from \"@tiptap/core\";\n\nimport { ImageBlockView } from \"./components/ImageBlockView.js\";\nimport { Image } from \"../Image/Image.js\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n imageBlock: {\n setImageBlock: (attributes: {\n src: string;\n assetId?: string;\n caption?: string;\n }) => ReturnType;\n setImageBlockAt: (attributes: {\n src: string;\n pos: number | Range;\n assetId?: string;\n caption?: string;\n }) => ReturnType;\n setImageBlockAlign: (align: \"left\" | \"center\" | \"right\") => ReturnType;\n setImageBlockWidth: (width: number) => ReturnType;\n setImageCaption: (caption: string) => ReturnType;\n };\n }\n}\n\nexport const ImageBlock = Image.extend({\n name: \"imageBlock\",\n\n group: \"block\",\n\n defining: true,\n\n isolating: true,\n\n addAttributes() {\n return {\n src: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"src\"),\n renderHTML: (attributes) => ({\n src: attributes.src,\n }),\n },\n width: {\n default: \"100%\",\n parseHTML: (element) => element.getAttribute(\"data-width\"),\n renderHTML: (attributes) => ({\n \"data-width\": attributes.width,\n }),\n },\n align: {\n default: \"center\",\n parseHTML: (element) => element.getAttribute(\"data-align\"),\n renderHTML: (attributes) => ({\n \"data-align\": attributes.align,\n }),\n },\n alt: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"alt\"),\n renderHTML: (attributes) => ({\n alt: attributes.alt,\n }),\n },\n caption: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"caption\"),\n renderHTML: (attributes) => ({\n caption: attributes.caption,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'img[src*=\"tiptap.dev\"]:not([src^=\"data:\"]), img[src*=\"windows.net\"]:not([src^=\"data:\"])',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n { class: \"imageBlock\" },\n [\n \"img\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n ],\n [\"textarea\", mergeAttributes({\n class: \"w-full text-gray-400 h-16 mb-2 placeholder-black p-1 text-sm text-gray-400 border-0 rounded appearance-none\"\n }, { defaultValue: HTMLAttributes.caption }), HTMLAttributes.caption],\n ];\n },\n\n addCommands() {\n return {\n setImageBlock:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContent({\n type: \"imageBlock\",\n attrs: { src: attrs.src, caption: attrs.caption },\n });\n },\n\n setImageBlockAt:\n (attrs) =>\n ({ commands }) => {\n console.log(attrs);\n return commands.insertContentAt(attrs.pos, {\n type: \"imageBlock\",\n attrs: { src: attrs.src, caption: attrs.caption },\n });\n },\n setImageCaption:\n (caption) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", { caption }),\n setImageBlockAlign:\n (align) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", { align }),\n\n setImageBlockWidth:\n (width) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", {\n width: `${Math.max(0, Math.min(100, width))}%`,\n }),\n };\n },\n\n addNodeView() {\n //@ts-ignore\n return ReactNodeViewRenderer(ImageBlockView);\n },\n});\n\nexport default ImageBlock;\n"],"names":["ReactNodeViewRenderer","mergeAttributes","ImageBlockView","Image","ImageBlock","extend","name","group","defining","isolating","addAttributes","src","default","parseHTML","element","getAttribute","renderHTML","attributes","width","align","alt","caption","tag","HTMLAttributes","class","options","defaultValue","addCommands","setImageBlock","attrs","commands","insertContent","type","setImageBlockAt","console","log","insertContentAt","pos","setImageCaption","updateAttributes","setImageBlockAlign","setImageBlockWidth","Math","max","min","addNodeView"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"facebook.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,QAAQ,EAAE;YACR;;eAEG;YAEH,cAAc,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SACjE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAA;AAIpD,eAAO,MAAM,QAAQ,gBAmGnB,CAAA"}
1
+ {"version":3,"file":"facebook.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,QAAQ,EAAE;YACR;;eAEG;YAEH,cAAc,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SACjE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAA;AAIpD,eAAO,MAAM,QAAQ,gBA2GnB,CAAA"}
@@ -26,7 +26,7 @@ export const Facebook = Node.create({
26
26
  default: null
27
27
  },
28
28
  width: {
29
- default: '550'
29
+ default: '100%'
30
30
  },
31
31
  showText: {
32
32
  default: true
@@ -56,26 +56,38 @@ export const Facebook = Node.create({
56
56
  }),
57
57
  [
58
58
  'div',
59
- mergeAttributes({
59
+ {
60
60
  class: 'rsme-embed rsme-facebook-embed'
61
- }, HTMLAttributes),
61
+ },
62
62
  [
63
63
  'div',
64
64
  {
65
- class: 'fb-post',
66
- 'data-href': HTMLAttributes.src,
67
- 'data-width': HTMLAttributes.width,
68
- 'data-show-text': HTMLAttributes.showText
69
- }
70
- ],
71
- [
72
- 'script',
73
- {
74
- async: true,
75
- defer: true,
76
- crossorigin: 'anonymous',
77
- src: 'https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v22.0&appId=990160422555057'
78
- }
65
+ class: 'rsme-d-none'
66
+ },
67
+ [
68
+ 'div',
69
+ {
70
+ id: 'fb-root'
71
+ }
72
+ ],
73
+ [
74
+ 'div',
75
+ mergeAttributes(HTMLAttributes, {
76
+ class: 'fb-post',
77
+ 'data-href': HTMLAttributes.url,
78
+ 'data-width': '500',
79
+ 'data-show-text': "true"
80
+ })
81
+ ],
82
+ [
83
+ 'script',
84
+ {
85
+ async: true,
86
+ defer: true,
87
+ crossorigin: 'anonymous',
88
+ src: 'https://connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v22.0'
89
+ }
90
+ ]
79
91
  ]
80
92
  ]
81
93
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n facebook: {\n /**\n * Add an image\n */\n\n insertFacebook: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport FacebookEmbed from './FacebookEmbed.js'\n\nexport const Facebook = Node.create({\n name: 'facebook',\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"facebook-post\"]',\n },\n ]\n },\n\n addAttributes() {\n return {\n url: { default: null },\n class: { default: null },\n src: {\n default: null,\n },\n width: {\n default: '550',\n },\n showText: {\n default: true,\n },\n }\n },\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => {\n return this.editor\n .chain()\n .insertContentAt(this.editor.state.selection.head, {\n type: this.type.name,\n })\n .focus()\n .run()\n },\n }\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"facebook\",\n class: `react-renderer node-facebook ${HTMLAttributes.class ?? \"\"}`,\n }), [\n 'div',\n mergeAttributes(\n { class: 'socialMediaContainer' },\n ),\n ['div', mergeAttributes({ class: 'rsme-embed rsme-facebook-embed', }, HTMLAttributes),\n\n [\n 'div',\n {\n class: 'fb-post',\n 'data-href': HTMLAttributes.src,\n 'data-width': HTMLAttributes.width,\n 'data-show-text': HTMLAttributes.showText,\n },\n ],\n [\n 'script',\n {\n async: true,\n defer: true,\n crossorigin: 'anonymous',\n src: 'https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v22.0&appId=990160422555057',\n },\n ],\n ]\n ]]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(FacebookEmbed)\n },\n\n addCommands() {\n return {\n insertFacebook:\n (url, className) =>\n ({ commands, state }) => {\n return commands.insertContent({\n type: 'facebook',\n attrs: {\n url,\n class: className,\n src: url,\n },\n })\n },\n }\n },\n})\n\nfunction isValidHttpUrl(string: string) {\n let url\n\n try {\n url = new URL(string)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n"],"names":["Node","mergeAttributes","ReactNodeViewRenderer","FacebookEmbed","Facebook","create","name","group","content","draggable","parseHTML","tag","addAttributes","url","default","class","src","width","showText","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","renderHTML","HTMLAttributes","async","defer","crossorigin","addNodeView","addCommands","insertFacebook","className","commands","insertContent","attrs","isValidHttpUrl","string","URL","_","protocol"],"mappings":"AAYA,SAASA,IAAI,EAAEC,eAAe,QAAQ,eAAc;AACpD,SAASC,qBAAqB,QAAQ,gBAAe;AACrD,OAAOC,mBAAmB,qBAAoB;AAE9C,OAAO,MAAMC,WAAWJ,KAAKK,MAAM,CAAC;IAClCC,MAAM;IACNC,OAAO;IACPC,SAAS;IACTC,WAAW;IAEX,sBAAsB;IACtBC;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IAEAC;QACE,OAAO;YACLC,KAAK;gBAAEC,SAAS;YAAK;YACrBC,OAAO;gBAAED,SAAS;YAAK;YACvBE,KAAK;gBACHF,SAAS;YACX;YACAG,OAAO;gBACLH,SAAS;YACX;YACAI,UAAU;gBACRJ,SAAS;YACX;QACF;IACF;IACAK;QACE,OAAO;YACL,aAAa;gBACX,OAAO,IAAI,CAACC,MAAM,CACfC,KAAK,GACLC,eAAe,CAAC,IAAI,CAACF,MAAM,CAACG,KAAK,CAACC,SAAS,CAACC,IAAI,EAAE;oBACjDC,MAAM,IAAI,CAACA,IAAI,CAACpB,IAAI;gBACtB,GACCqB,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACA7B,gBAAgB6B,gBAAgB;gBAC9B,aAAa;gBACbf,OAAO,CAAC,6BAA6B,EAAEe,eAAef,KAAK,IAAI,GAAG,CAAC;YACrE;YAAI;gBACF;gBACAd,gBACE;oBAAEc,OAAO;gBAAuB;gBAElC;oBAAC;oBAAOd,gBAAgB;wBAAEc,OAAO;oBAAkC,GAAGe;oBAEpE;wBACE;wBACA;4BACEf,OAAO;4BACP,aAAae,eAAed,GAAG;4BAC/B,cAAcc,eAAeb,KAAK;4BAClC,kBAAkBa,eAAeZ,QAAQ;wBAC3C;qBACD;oBACD;wBACE;wBACA;4BACEa,OAAO;4BACPC,OAAO;4BACPC,aAAa;4BACbjB,KAAK;wBACP;qBACD;iBACF;aACF;SAAC;IACN;IAEAkB;QACE,OAAOhC,sBAAsBC;IAC/B;IAEAgC;QACE,OAAO;YACLC,gBACE,CAACvB,KAAKwB,YACJ,CAAC,EAAEC,QAAQ,EAAEf,KAAK,EAAE;oBAClB,OAAOe,SAASC,aAAa,CAAC;wBAC5Bb,MAAM;wBACNc,OAAO;4BACL3B;4BACAE,OAAOsB;4BACPrB,KAAKH;wBACP;oBACF;gBACF;QACN;IACF;AACF,GAAE;AAEF,SAAS4B,eAAeC,MAAc;IACpC,IAAI7B;IAEJ,IAAI;QACFA,MAAM,IAAI8B,IAAID;IAChB,EAAE,OAAOE,GAAG;QACV,OAAO;IACT;IAEA,OAAO/B,IAAIgC,QAAQ,KAAK,WAAWhC,IAAIgC,QAAQ,KAAK;AACtD"}
1
+ {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n facebook: {\n /**\n * Add an image\n */\n\n insertFacebook: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport FacebookEmbed from './FacebookEmbed.js'\n\nexport const Facebook = Node.create({\n name: 'facebook',\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"facebook-post\"]',\n },\n ]\n },\n\n addAttributes() {\n return {\n url: { default: null },\n class: { default: null },\n src: {\n default: null,\n },\n width: {\n default: '100%',\n },\n\n showText: {\n default: true,\n },\n }\n },\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => {\n return this.editor\n .chain()\n .insertContentAt(this.editor.state.selection.head, {\n type: this.type.name,\n })\n .focus()\n .run()\n },\n }\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"facebook\",\n class: `react-renderer node-facebook ${HTMLAttributes.class ?? \"\"}`,\n }), [\n 'div',\n mergeAttributes(\n { class: 'socialMediaContainer' },\n ),\n ['div', { class: 'rsme-embed rsme-facebook-embed', },\n [\n 'div',\n { class: 'rsme-d-none' },\n ['div', { id: 'fb-root' }],\n [\n 'div',\n mergeAttributes(HTMLAttributes, {\n class: 'fb-post',\n 'data-href': HTMLAttributes.url,\n 'data-width': '500',\n 'data-show-text': \"true\",\n })\n ],\n [\n 'script',\n {\n async: true,\n defer: true,\n crossorigin: 'anonymous',\n src: 'https://connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v22.0',\n\n },\n ],\n ]\n ]\n\n ]]\n },\n\n\n addNodeView() {\n return ReactNodeViewRenderer(FacebookEmbed)\n },\n\n addCommands() {\n return {\n insertFacebook:\n (url, className) =>\n ({ commands, state }) => {\n return commands.insertContent({\n type: 'facebook',\n attrs: {\n url,\n class: className,\n src: url,\n },\n })\n },\n }\n },\n})\n\nfunction isValidHttpUrl(string: string) {\n let url\n\n try {\n url = new URL(string)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n"],"names":["Node","mergeAttributes","ReactNodeViewRenderer","FacebookEmbed","Facebook","create","name","group","content","draggable","parseHTML","tag","addAttributes","url","default","class","src","width","showText","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","renderHTML","HTMLAttributes","id","async","defer","crossorigin","addNodeView","addCommands","insertFacebook","className","commands","insertContent","attrs","isValidHttpUrl","string","URL","_","protocol"],"mappings":"AAYA,SAASA,IAAI,EAAEC,eAAe,QAAQ,eAAc;AACpD,SAASC,qBAAqB,QAAQ,gBAAe;AACrD,OAAOC,mBAAmB,qBAAoB;AAE9C,OAAO,MAAMC,WAAWJ,KAAKK,MAAM,CAAC;IAClCC,MAAM;IACNC,OAAO;IACPC,SAAS;IACTC,WAAW;IAEX,sBAAsB;IACtBC;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IAEAC;QACE,OAAO;YACLC,KAAK;gBAAEC,SAAS;YAAK;YACrBC,OAAO;gBAAED,SAAS;YAAK;YACvBE,KAAK;gBACHF,SAAS;YACX;YACAG,OAAO;gBACLH,SAAS;YACX;YAEAI,UAAU;gBACRJ,SAAS;YACX;QACF;IACF;IACAK;QACE,OAAO;YACL,aAAa;gBACX,OAAO,IAAI,CAACC,MAAM,CACfC,KAAK,GACLC,eAAe,CAAC,IAAI,CAACF,MAAM,CAACG,KAAK,CAACC,SAAS,CAACC,IAAI,EAAE;oBACjDC,MAAM,IAAI,CAACA,IAAI,CAACpB,IAAI;gBACtB,GACCqB,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACA7B,gBAAgB6B,gBAAgB;gBAC9B,aAAa;gBACbf,OAAO,CAAC,6BAA6B,EAAEe,eAAef,KAAK,IAAI,GAAG,CAAC;YACrE;YAAI;gBACF;gBACAd,gBACE;oBAAEc,OAAO;gBAAuB;gBAElC;oBAAC;oBAAO;wBAAEA,OAAO;oBAAkC;oBACjD;wBACE;wBACA;4BAAEA,OAAO;wBAAc;wBACvB;4BAAC;4BAAO;gCAAEgB,IAAI;4BAAU;yBAAE;wBAC1B;4BACE;4BACA9B,gBAAgB6B,gBAAgB;gCAC9Bf,OAAO;gCACP,aAAae,eAAejB,GAAG;gCAC/B,cAAc;gCACd,kBAAkB;4BACpB;yBACD;wBACD;4BACE;4BACA;gCACEmB,OAAO;gCACPC,OAAO;gCACPC,aAAa;gCACblB,KAAK;4BAEP;yBACD;qBACF;iBACF;aAEF;SAAC;IACN;IAGAmB;QACE,OAAOjC,sBAAsBC;IAC/B;IAEAiC;QACE,OAAO;YACLC,gBACE,CAACxB,KAAKyB,YACJ,CAAC,EAAEC,QAAQ,EAAEhB,KAAK,EAAE;oBAClB,OAAOgB,SAASC,aAAa,CAAC;wBAC5Bd,MAAM;wBACNe,OAAO;4BACL5B;4BACAE,OAAOuB;4BACPtB,KAAKH;wBACP;oBACF;gBACF;QACN;IACF;AACF,GAAE;AAEF,SAAS6B,eAAeC,MAAc;IACpC,IAAI9B;IAEJ,IAAI;QACFA,MAAM,IAAI+B,IAAID;IAChB,EAAE,OAAOE,GAAG;QACV,OAAO;IACT;IAEA,OAAOhC,IAAIiC,QAAQ,KAAK,WAAWjC,IAAIiC,QAAQ,KAAK;AACtD"}
@@ -1 +1 @@
1
- {"version":3,"file":"instagram.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,SAAS,EAAE;YACT;;eAEG;YAEH,eAAe,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAClE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAA;AAIpD,eAAO,MAAM,SAAS,gBAwGpB,CAAA"}
1
+ {"version":3,"file":"instagram.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,SAAS,EAAE;YACT;;eAEG;YAEH,eAAe,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAClE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAA;AAIpD,eAAO,MAAM,SAAS,gBA0HpB,CAAA"}
@@ -22,7 +22,7 @@ export const Instagram = Node.create({
22
22
  default: '328px'
23
23
  },
24
24
  height: {
25
- default: '100%'
25
+ default: '550px'
26
26
  },
27
27
  frameborder: {
28
28
  default: '0'
@@ -57,15 +57,36 @@ export const Instagram = Node.create({
57
57
  [
58
58
  'div',
59
59
  mergeAttributes({
60
- class: 'rsme-embed rsme-instagram-embed max-w-[328px]',
61
- style: 'overflow: hidden; width: 328px; border-radius: 3px; position: relative;'
60
+ class: 'rsme-embed rsme-instagram-embed'
62
61
  }),
63
62
  [
64
- 'iframe',
65
- mergeAttributes({
66
- src: HTMLAttributes.src,
67
- class: "instagram-media instagram-media-rendered"
68
- }, HTMLAttributes)
63
+ 'blockquote',
64
+ mergeAttributes(HTMLAttributes, {
65
+ class: 'instagram-media',
66
+ style: "background:#FFF; border:0; margin:1px; max-width:540px; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);",
67
+ "data-instgrm-captioned": true,
68
+ "data-instgrm-permalink": `${convertInstaUrlToEmbed(HTMLAttributes.url)}?utm_source=ig_embed&utm_campaign=loading`,
69
+ "data-instgrm-version": "14"
70
+ }),
71
+ [
72
+ 'div',
73
+ {
74
+ class: 'instagram-media-pre-embed rsme-d-none'
75
+ }
76
+ ]
77
+ ],
78
+ [
79
+ 'script',
80
+ {
81
+ async: true,
82
+ src: 'https://www.instagram.com/embed.js',
83
+ charset: 'utf-8',
84
+ onload: `() => {
85
+ if (window.instgrm) {
86
+ window.instgrm.Embeds.process();
87
+ }
88
+ }`
89
+ }
69
90
  ]
70
91
  ]
71
92
  ]
@@ -88,14 +109,7 @@ export const Instagram = Node.create({
88
109
  insertInstagram: (url, className)=>({ commands, state })=>{
89
110
  let embedUrl = "";
90
111
  if (url) {
91
- // Convert URL to embed format
92
- const urlObj = new URL(url);
93
- const path = urlObj.pathname;
94
- const postId = path.split('/').filter(Boolean)[1] // Get the post ID after /p/
95
- ;
96
- if (postId) {
97
- embedUrl = `https://www.instagram.com/p/${postId}/embed/`;
98
- }
112
+ embedUrl = convertInstaUrlToEmbed(url);
99
113
  }
100
114
  return commands.insertContent({
101
115
  type: 'instagram',
@@ -109,6 +123,16 @@ export const Instagram = Node.create({
109
123
  };
110
124
  }
111
125
  });
126
+ function convertInstaUrlToEmbed(url) {
127
+ if (!url) return undefined;
128
+ try {
129
+ const urlWithNoQueryOrUsername = url.split(/[?#]/)[0].replace(/\.com\/.*?\/p/, '.com/p').replace(/\.com\/.*?\/reel/, '.com/reel');
130
+ const cleanUrlWithEndingSlash = `${urlWithNoQueryOrUsername}${urlWithNoQueryOrUsername.endsWith('/') ? '' : '/'}`;
131
+ return cleanUrlWithEndingSlash;
132
+ } catch {
133
+ return undefined;
134
+ }
135
+ }
112
136
  function isValidHttpUrl(string) {
113
137
  let url;
114
138
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n instagram: {\n /**\n * Add an image\n */\n\n insertInstagram: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport InstagramEmbed from './InstagramEmbed.js'\n\nexport const Instagram = Node.create({\n name: 'instagram',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n // content: 'inline*',\n\n addAttributes() {\n return {\n url: { default: null },\n class: { default: null },\n src: {\n default: null,\n },\n width: {\n default: '328px',\n },\n height: {\n default: '100%',\n },\n frameborder: {\n default: '0',\n },\n scrolling: {\n default: 'no',\n },\n allowtransparency: {\n default: 'true',\n },\n }\n },\n\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"instagram\"]',\n },\n ]\n },\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"instagram\",\n class: `react-renderer node-instagram ${HTMLAttributes.class ?? \"\"}`,\n }), [\n 'div',\n mergeAttributes(\n { class: 'socialMediaContainer' },\n ),\n ['div', mergeAttributes({ class: 'rsme-embed rsme-instagram-embed max-w-[328px]', style: 'overflow: hidden; width: 328px; border-radius: 3px; position: relative;' }),\n\n ['iframe', mergeAttributes({ src: HTMLAttributes.src, class: \"instagram-media instagram-media-rendered\" }, HTMLAttributes)],\n ]\n ]\n ]\n },\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => {\n return this.editor\n .chain()\n .insertContentAt(this.editor.state.selection.head, {\n type: this.type.name,\n })\n .focus()\n .run()\n },\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(InstagramEmbed)\n },\n\n addCommands() {\n return {\n insertInstagram:\n (url, className) =>\n ({ commands, state }) => {\n let embedUrl = \"\"\n if (url) {\n\n // Convert URL to embed format\n const urlObj = new URL(url)\n const path = urlObj.pathname\n const postId = path.split('/').filter(Boolean)[1] // Get the post ID after /p/\n if (postId) {\n embedUrl = `https://www.instagram.com/p/${postId}/embed/`\n }\n }\n return commands.insertContent({\n type: 'instagram',\n attrs: {\n url: url,\n class: className,\n src: embedUrl,\n },\n })\n },\n }\n },\n})\n\nfunction isValidHttpUrl(string: string) {\n let url\n\n try {\n url = new URL(string)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n"],"names":["Node","mergeAttributes","ReactNodeViewRenderer","InstagramEmbed","Instagram","create","name","group","content","draggable","addAttributes","url","default","class","src","width","height","frameborder","scrolling","allowtransparency","parseHTML","tag","renderHTML","HTMLAttributes","style","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","addNodeView","addCommands","insertInstagram","className","commands","embedUrl","urlObj","URL","path","pathname","postId","split","filter","Boolean","insertContent","attrs","isValidHttpUrl","string","_","protocol"],"mappings":"AAYA,SAASA,IAAI,EAAEC,eAAe,QAAQ,eAAc;AACpD,SAASC,qBAAqB,QAAQ,gBAAe;AACrD,OAAOC,oBAAoB,sBAAqB;AAEhD,OAAO,MAAMC,YAAYJ,KAAKK,MAAM,CAAC;IACnCC,MAAM;IAENC,OAAO;IACPC,SAAS;IACTC,WAAW;IACX,sBAAsB;IAEtBC;QACE,OAAO;YACLC,KAAK;gBAAEC,SAAS;YAAK;YACrBC,OAAO;gBAAED,SAAS;YAAK;YACvBE,KAAK;gBACHF,SAAS;YACX;YACAG,OAAO;gBACLH,SAAS;YACX;YACAI,QAAQ;gBACNJ,SAAS;YACX;YACAK,aAAa;gBACXL,SAAS;YACX;YACAM,WAAW;gBACTN,SAAS;YACX;YACAO,mBAAmB;gBACjBP,SAAS;YACX;QACF;IACF;IAGAQ;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IACAC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACAtB,gBAAgBsB,gBAAgB;gBAC9B,aAAa;gBACbV,OAAO,CAAC,8BAA8B,EAAEU,eAAeV,KAAK,IAAI,GAAG,CAAC;YACtE;YAAI;gBACF;gBACAZ,gBACE;oBAAEY,OAAO;gBAAuB;gBAElC;oBAAC;oBAAOZ,gBAAgB;wBAAEY,OAAO;wBAAiDW,OAAO;oBAA0E;oBAEjK;wBAAC;wBAAUvB,gBAAgB;4BAAEa,KAAKS,eAAeT,GAAG;4BAAED,OAAO;wBAA2C,GAAGU;qBAAgB;iBAC5H;aACF;SACF;IACH;IACAE;QACE,OAAO;YACL,aAAa;gBACX,OAAO,IAAI,CAACC,MAAM,CACfC,KAAK,GACLC,eAAe,CAAC,IAAI,CAACF,MAAM,CAACG,KAAK,CAACC,SAAS,CAACC,IAAI,EAAE;oBACjDC,MAAM,IAAI,CAACA,IAAI,CAAC1B,IAAI;gBACtB,GACC2B,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC;QACE,OAAOjC,sBAAsBC;IAC/B;IAEAiC;QACE,OAAO;YACLC,iBACE,CAAC1B,KAAK2B,YACJ,CAAC,EAAEC,QAAQ,EAAEV,KAAK,EAAE;oBAClB,IAAIW,WAAW;oBACf,IAAI7B,KAAK;wBAEP,8BAA8B;wBAC9B,MAAM8B,SAAS,IAAIC,IAAI/B;wBACvB,MAAMgC,OAAOF,OAAOG,QAAQ;wBAC5B,MAAMC,SAASF,KAAKG,KAAK,CAAC,KAAKC,MAAM,CAACC,QAAQ,CAAC,EAAE,CAAC,4BAA4B;;wBAC9E,IAAIH,QAAQ;4BACVL,WAAW,CAAC,4BAA4B,EAAEK,OAAO,OAAO,CAAC;wBAC3D;oBACF;oBACA,OAAON,SAASU,aAAa,CAAC;wBAC5BjB,MAAM;wBACNkB,OAAO;4BACLvC,KAAKA;4BACLE,OAAOyB;4BACPxB,KAAK0B;wBACP;oBACF;gBACF;QACN;IACF;AACF,GAAE;AAEF,SAASW,eAAeC,MAAc;IACpC,IAAIzC;IAEJ,IAAI;QACFA,MAAM,IAAI+B,IAAIU;IAChB,EAAE,OAAOC,GAAG;QACV,OAAO;IACT;IAEA,OAAO1C,IAAI2C,QAAQ,KAAK,WAAW3C,IAAI2C,QAAQ,KAAK;AACtD"}
1
+ {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n instagram: {\n /**\n * Add an image\n */\n\n insertInstagram: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport InstagramEmbed from './InstagramEmbed.js'\n\nexport const Instagram = Node.create({\n name: 'instagram',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n // content: 'inline*',\n\n addAttributes() {\n return {\n url: { default: null },\n class: { default: null },\n src: {\n default: null,\n },\n width: {\n default: '328px',\n },\n height: {\n default: '550px',\n },\n frameborder: {\n default: '0',\n },\n scrolling: {\n default: 'no',\n },\n allowtransparency: {\n default: 'true',\n },\n }\n },\n\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"instagram\"]',\n },\n ]\n },\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"instagram\",\n class: `react-renderer node-instagram ${HTMLAttributes.class ?? \"\"}`,\n }), [\n 'div',\n mergeAttributes(\n { class: 'socialMediaContainer' },\n ),\n ['div', mergeAttributes({ class: 'rsme-embed rsme-instagram-embed', }),\n\n [\n 'blockquote',\n mergeAttributes(HTMLAttributes, {\n class: 'instagram-media',\n style: \"background:#FFF; border:0; margin:1px; max-width:540px; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);\",\n \"data-instgrm-captioned\": true,\n \"data-instgrm-permalink\": `${convertInstaUrlToEmbed(HTMLAttributes.url)}?utm_source=ig_embed&utm_campaign=loading`,\n \"data-instgrm-version\": \"14\"\n }),\n ['div', { class: 'instagram-media-pre-embed rsme-d-none' },]\n ],\n [\n 'script',\n {\n async: true,\n src: 'https://www.instagram.com/embed.js',\n charset: 'utf-8',\n onload: `() => {\n if (window.instgrm) {\n window.instgrm.Embeds.process();\n }\n }`,\n },\n ],\n ],\n\n ]\n ]\n },\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => {\n return this.editor\n .chain()\n .insertContentAt(this.editor.state.selection.head, {\n type: this.type.name,\n })\n .focus()\n .run()\n },\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(InstagramEmbed)\n },\n\n addCommands() {\n return {\n insertInstagram:\n (url, className) =>\n ({ commands, state }) => {\n let embedUrl = \"\"\n if (url) {\n embedUrl = convertInstaUrlToEmbed(url)\n\n }\n return commands.insertContent({\n type: 'instagram',\n attrs: {\n url: url,\n class: className,\n src: embedUrl,\n },\n })\n },\n }\n },\n})\nfunction convertInstaUrlToEmbed(url: string): string | undefined {\n if (!url) return undefined;\n try {\n const urlWithNoQueryOrUsername = url.split(/[?#]/)[0].replace(/\\.com\\/.*?\\/p/, '.com/p').replace(/\\.com\\/.*?\\/reel/, '.com/reel');\n const cleanUrlWithEndingSlash = `${urlWithNoQueryOrUsername}${urlWithNoQueryOrUsername.endsWith('/') ? '' : '/'}`;\n return cleanUrlWithEndingSlash\n } catch {\n return undefined;\n }\n}\n\nfunction isValidHttpUrl(string: string) {\n let url\n\n try {\n url = new URL(string)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n"],"names":["Node","mergeAttributes","ReactNodeViewRenderer","InstagramEmbed","Instagram","create","name","group","content","draggable","addAttributes","url","default","class","src","width","height","frameborder","scrolling","allowtransparency","parseHTML","tag","renderHTML","HTMLAttributes","style","convertInstaUrlToEmbed","async","charset","onload","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","addNodeView","addCommands","insertInstagram","className","commands","embedUrl","insertContent","attrs","undefined","urlWithNoQueryOrUsername","split","replace","cleanUrlWithEndingSlash","endsWith","isValidHttpUrl","string","URL","_","protocol"],"mappings":"AAYA,SAASA,IAAI,EAAEC,eAAe,QAAQ,eAAc;AACpD,SAASC,qBAAqB,QAAQ,gBAAe;AACrD,OAAOC,oBAAoB,sBAAqB;AAEhD,OAAO,MAAMC,YAAYJ,KAAKK,MAAM,CAAC;IACnCC,MAAM;IAENC,OAAO;IACPC,SAAS;IACTC,WAAW;IACX,sBAAsB;IAEtBC;QACE,OAAO;YACLC,KAAK;gBAAEC,SAAS;YAAK;YACrBC,OAAO;gBAAED,SAAS;YAAK;YACvBE,KAAK;gBACHF,SAAS;YACX;YACAG,OAAO;gBACLH,SAAS;YACX;YACAI,QAAQ;gBACNJ,SAAS;YACX;YACAK,aAAa;gBACXL,SAAS;YACX;YACAM,WAAW;gBACTN,SAAS;YACX;YACAO,mBAAmB;gBACjBP,SAAS;YACX;QACF;IACF;IAGAQ;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IACAC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACAtB,gBAAgBsB,gBAAgB;gBAC9B,aAAa;gBACbV,OAAO,CAAC,8BAA8B,EAAEU,eAAeV,KAAK,IAAI,GAAG,CAAC;YACtE;YAAI;gBACF;gBACAZ,gBACE;oBAAEY,OAAO;gBAAuB;gBAElC;oBAAC;oBAAOZ,gBAAgB;wBAAEY,OAAO;oBAAmC;oBAElE;wBACE;wBACAZ,gBAAgBsB,gBAAgB;4BAC9BV,OAAO;4BACPW,OAAO;4BACP,0BAA0B;4BAC1B,0BAA0B,CAAC,EAAEC,uBAAuBF,eAAeZ,GAAG,EAAE,yCAAyC,CAAC;4BAClH,wBAAwB;wBAC1B;wBACA;4BAAC;4BAAO;gCAAEE,OAAO;4BAAwC;yBAAG;qBAC7D;oBACD;wBACE;wBACA;4BACEa,OAAO;4BACPZ,KAAK;4BACLa,SAAS;4BACTC,QAAQ,CAAC;;;;iBAIN,CAAC;wBACN;qBACD;iBACF;aAEF;SACF;IACH;IACAC;QACE,OAAO;YACL,aAAa;gBACX,OAAO,IAAI,CAACC,MAAM,CACfC,KAAK,GACLC,eAAe,CAAC,IAAI,CAACF,MAAM,CAACG,KAAK,CAACC,SAAS,CAACC,IAAI,EAAE;oBACjDC,MAAM,IAAI,CAACA,IAAI,CAAC9B,IAAI;gBACtB,GACC+B,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC;QACE,OAAOrC,sBAAsBC;IAC/B;IAEAqC;QACE,OAAO;YACLC,iBACE,CAAC9B,KAAK+B,YACJ,CAAC,EAAEC,QAAQ,EAAEV,KAAK,EAAE;oBAClB,IAAIW,WAAW;oBACf,IAAIjC,KAAK;wBACPiC,WAAWnB,uBAAuBd;oBAEpC;oBACA,OAAOgC,SAASE,aAAa,CAAC;wBAC5BT,MAAM;wBACNU,OAAO;4BACLnC,KAAKA;4BACLE,OAAO6B;4BACP5B,KAAK8B;wBACP;oBACF;gBACF;QACN;IACF;AACF,GAAE;AACF,SAASnB,uBAAuBd,GAAW;IACzC,IAAI,CAACA,KAAK,OAAOoC;IACjB,IAAI;QACF,MAAMC,2BAA2BrC,IAAIsC,KAAK,CAAC,OAAO,CAAC,EAAE,CAACC,OAAO,CAAC,iBAAiB,UAAUA,OAAO,CAAC,oBAAoB;QACrH,MAAMC,0BAA0B,CAAC,EAAEH,yBAAyB,EAAEA,yBAAyBI,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC;QACjH,OAAOD;IACT,EAAE,OAAM;QACN,OAAOJ;IACT;AACF;AAEA,SAASM,eAAeC,MAAc;IACpC,IAAI3C;IAEJ,IAAI;QACFA,MAAM,IAAI4C,IAAID;IAChB,EAAE,OAAOE,GAAG;QACV,OAAO;IACT;IAEA,OAAO7C,IAAI8C,QAAQ,KAAK,WAAW9C,IAAI8C,QAAQ,KAAK;AACtD"}
@@ -1 +1 @@
1
- {"version":3,"file":"tiktok.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,MAAM,EAAE;YACN;;eAEG;YAEH,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAC/D,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAA;AAIpD,eAAO,MAAM,MAAM,gBA0GjB,CAAA"}
1
+ {"version":3,"file":"tiktok.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,MAAM,EAAE;YACN;;eAEG;YAEH,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAC/D,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAA;AAIpD,eAAO,MAAM,MAAM,gBAoGjB,CAAA"}
@@ -22,7 +22,7 @@ export const Tiktok = Node.create({
22
22
  default: '328px'
23
23
  },
24
24
  height: {
25
- default: '100%'
25
+ default: '550px'
26
26
  },
27
27
  frameborder: {
28
28
  default: '0'
@@ -67,9 +67,9 @@ export const Tiktok = Node.create({
67
67
  },
68
68
  [
69
69
  'iframe',
70
- mergeAttributes({
71
- src: HTMLAttributes.src
72
- }, HTMLAttributes)
70
+ mergeAttributes(HTMLAttributes, {
71
+ src: convertTikTokUrlToEmbed(HTMLAttributes.url)
72
+ })
73
73
  ]
74
74
  ]
75
75
  ]
@@ -92,15 +92,8 @@ export const Tiktok = Node.create({
92
92
  return {
93
93
  insertTiktok: (url, className)=>({ commands, state })=>{
94
94
  let embedUrl;
95
- if (url) {
96
- const urlObj = new URL(url);
97
- const path = urlObj.pathname;
98
- const videoId = path.split('/').filter(Boolean)[2] // Get video ID from path
99
- ;
100
- if (videoId) {
101
- embedUrl = `https://www.tiktok.com/embed/v3/${videoId}`;
102
- }
103
- }
95
+ // Usage in the original location:
96
+ embedUrl = url ? convertTikTokUrlToEmbed(url) : undefined;
104
97
  return commands.insertContent({
105
98
  type: 'tiktok',
106
99
  attrs: {
@@ -113,6 +106,17 @@ export const Tiktok = Node.create({
113
106
  };
114
107
  }
115
108
  });
109
+ function convertTikTokUrlToEmbed(url) {
110
+ if (!url) return undefined;
111
+ try {
112
+ const urlObj = new URL(url);
113
+ const path = urlObj.pathname;
114
+ const videoId = path.split('/').filter(Boolean)[2];
115
+ return videoId ? `https://www.tiktok.com/embed/v3/${videoId}` : undefined;
116
+ } catch {
117
+ return undefined;
118
+ }
119
+ }
116
120
  function isValidHttpUrl(string) {
117
121
  let url;
118
122
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n tiktok: {\n /**\n * Add an image\n */\n\n insertTiktok: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport TiktokEmbed from './TiktokEmbed.js'\n\nexport const Tiktok = Node.create({\n name: 'tiktok',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n\n addAttributes() {\n return {\n url: { default: null },\n class: { default: null },\n src: {\n default: null,\n },\n width: {\n default: '328px',\n },\n height: {\n default: '100%',\n },\n frameborder: {\n default: '0',\n },\n scrolling: {\n default: 'no',\n },\n allowtransparency: {\n default: 'true',\n },\n }\n },\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"tiktok\"]',\n },\n ]\n },\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes({\n \"data-type\": \"tiktok\",\n class: `react-renderer node-tiktok ${HTMLAttributes.class ?? \"\"}`,\n }), [\n 'div',\n mergeAttributes(\n { class: 'socialMediaContainer' },\n ),\n ['div', mergeAttributes({ class: 'rsme-embed rsme-tiktok-embed', style: 'overflow: hidden; border-radius: 8px;' }),\n ['div', { class: 'tiktok-embed-container' },\n ['iframe', mergeAttributes({ src: HTMLAttributes.src }, HTMLAttributes)],\n ]\n ]\n ]\n ]\n },\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => {\n return this.editor\n .chain()\n .insertContentAt(this.editor.state.selection.head, {\n type: this.type.name,\n })\n .focus()\n .run()\n },\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(TiktokEmbed)\n },\n\n addCommands() {\n return {\n insertTiktok:\n (url, className) =>\n ({ commands, state }) => {\n\n\n let embedUrl\n if (url) { // Convert URL to embed format\n const urlObj = new URL(url)\n const path = urlObj.pathname\n const videoId = path.split('/').filter(Boolean)[2] // Get video ID from path\n\n\n if (videoId) {\n embedUrl = `https://www.tiktok.com/embed/v3/${videoId}`\n }\n }\n return commands.insertContent({\n type: 'tiktok',\n attrs: {\n url,\n class: className,\n src: embedUrl,\n },\n })\n },\n }\n },\n})\n\nfunction isValidHttpUrl(string: string) {\n let url\n\n try {\n url = new URL(string)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n"],"names":["Node","mergeAttributes","ReactNodeViewRenderer","TiktokEmbed","Tiktok","create","name","group","content","draggable","addAttributes","url","default","class","src","width","height","frameborder","scrolling","allowtransparency","parseHTML","tag","renderHTML","HTMLAttributes","style","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","addNodeView","addCommands","insertTiktok","className","commands","embedUrl","urlObj","URL","path","pathname","videoId","split","filter","Boolean","insertContent","attrs","isValidHttpUrl","string","_","protocol"],"mappings":"AAYA,SAASA,IAAI,EAAEC,eAAe,QAAQ,eAAc;AACpD,SAASC,qBAAqB,QAAQ,gBAAe;AACrD,OAAOC,iBAAiB,mBAAkB;AAE1C,OAAO,MAAMC,SAASJ,KAAKK,MAAM,CAAC;IAChCC,MAAM;IAENC,OAAO;IACPC,SAAS;IACTC,WAAW;IAEX,sBAAsB;IAEtBC;QACE,OAAO;YACLC,KAAK;gBAAEC,SAAS;YAAK;YACrBC,OAAO;gBAAED,SAAS;YAAK;YACvBE,KAAK;gBACHF,SAAS;YACX;YACAG,OAAO;gBACLH,SAAS;YACX;YACAI,QAAQ;gBACNJ,SAAS;YACX;YACAK,aAAa;gBACXL,SAAS;YACX;YACAM,WAAW;gBACTN,SAAS;YACX;YACAO,mBAAmB;gBACjBP,SAAS;YACX;QACF;IACF;IACAQ;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IACAC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACAtB,gBAAgB;gBACd,aAAa;gBACbY,OAAO,CAAC,2BAA2B,EAAEU,eAAeV,KAAK,IAAI,GAAG,CAAC;YACnE;YAAI;gBACF;gBACAZ,gBACE;oBAAEY,OAAO;gBAAuB;gBAElC;oBAAC;oBAAOZ,gBAAgB;wBAAEY,OAAO;wBAAgCW,OAAO;oBAAwC;oBAC9G;wBAAC;wBAAO;4BAAEX,OAAO;wBAAyB;wBACxC;4BAAC;4BAAUZ,gBAAgB;gCAAEa,KAAKS,eAAeT,GAAG;4BAAC,GAAGS;yBAAgB;qBACzE;iBACF;aACF;SACF;IACH;IACAE;QACE,OAAO;YACL,aAAa;gBACX,OAAO,IAAI,CAACC,MAAM,CACfC,KAAK,GACLC,eAAe,CAAC,IAAI,CAACF,MAAM,CAACG,KAAK,CAACC,SAAS,CAACC,IAAI,EAAE;oBACjDC,MAAM,IAAI,CAACA,IAAI,CAAC1B,IAAI;gBACtB,GACC2B,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC;QACE,OAAOjC,sBAAsBC;IAC/B;IAEAiC;QACE,OAAO;YACLC,cACE,CAAC1B,KAAK2B,YACJ,CAAC,EAAEC,QAAQ,EAAEV,KAAK,EAAE;oBAGlB,IAAIW;oBACJ,IAAI7B,KAAK;wBACP,MAAM8B,SAAS,IAAIC,IAAI/B;wBACvB,MAAMgC,OAAOF,OAAOG,QAAQ;wBAC5B,MAAMC,UAAUF,KAAKG,KAAK,CAAC,KAAKC,MAAM,CAACC,QAAQ,CAAC,EAAE,CAAC,yBAAyB;;wBAG5E,IAAIH,SAAS;4BACXL,WAAW,CAAC,gCAAgC,EAAEK,QAAQ,CAAC;wBACzD;oBACF;oBACA,OAAON,SAASU,aAAa,CAAC;wBAC5BjB,MAAM;wBACNkB,OAAO;4BACLvC;4BACAE,OAAOyB;4BACPxB,KAAK0B;wBACP;oBACF;gBACF;QACN;IACF;AACF,GAAE;AAEF,SAASW,eAAeC,MAAc;IACpC,IAAIzC;IAEJ,IAAI;QACFA,MAAM,IAAI+B,IAAIU;IAChB,EAAE,OAAOC,GAAG;QACV,OAAO;IACT;IAEA,OAAO1C,IAAI2C,QAAQ,KAAK,WAAW3C,IAAI2C,QAAQ,KAAK;AACtD"}
1
+ {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n tiktok: {\n /**\n * Add an image\n */\n\n insertTiktok: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport TiktokEmbed from './TiktokEmbed.js'\n\nexport const Tiktok = Node.create({\n name: 'tiktok',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n\n addAttributes() {\n return {\n url: { default: null },\n class: { default: null },\n src: {\n default: null,\n },\n width: {\n default: '328px',\n },\n height: {\n default: '550px',\n },\n frameborder: {\n default: '0',\n },\n scrolling: {\n default: 'no',\n },\n allowtransparency: {\n default: 'true',\n },\n }\n },\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"tiktok\"]',\n },\n ]\n },\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes({\n \"data-type\": \"tiktok\",\n class: `react-renderer node-tiktok ${HTMLAttributes.class ?? \"\"}`,\n }), [\n 'div',\n mergeAttributes(\n { class: 'socialMediaContainer' },\n ),\n ['div', mergeAttributes({ class: 'rsme-embed rsme-tiktok-embed', style: 'overflow: hidden; border-radius: 8px;' }),\n ['div', { class: 'tiktok-embed-container' },\n ['iframe', mergeAttributes(HTMLAttributes, { src: convertTikTokUrlToEmbed(HTMLAttributes.url) },)],\n ]\n ]\n ]\n ]\n },\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => {\n return this.editor\n .chain()\n .insertContentAt(this.editor.state.selection.head, {\n type: this.type.name,\n })\n .focus()\n .run()\n },\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(TiktokEmbed)\n },\n\n addCommands() {\n return {\n insertTiktok:\n (url, className) =>\n ({ commands, state }) => {\n\n\n let embedUrl\n\n\n // Usage in the original location:\n embedUrl = url ? convertTikTokUrlToEmbed(url) : undefined;\n return commands.insertContent({\n type: 'tiktok',\n attrs: {\n url,\n class: className,\n src: embedUrl,\n },\n })\n },\n }\n },\n})\n\nfunction convertTikTokUrlToEmbed(url: string): string | undefined {\n if (!url) return undefined;\n try {\n const urlObj = new URL(url);\n const path = urlObj.pathname;\n const videoId = path.split('/').filter(Boolean)[2];\n return videoId ? `https://www.tiktok.com/embed/v3/${videoId}` : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isValidHttpUrl(string: string) {\n let url\n\n try {\n url = new URL(string)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n"],"names":["Node","mergeAttributes","ReactNodeViewRenderer","TiktokEmbed","Tiktok","create","name","group","content","draggable","addAttributes","url","default","class","src","width","height","frameborder","scrolling","allowtransparency","parseHTML","tag","renderHTML","HTMLAttributes","style","convertTikTokUrlToEmbed","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","addNodeView","addCommands","insertTiktok","className","commands","embedUrl","undefined","insertContent","attrs","urlObj","URL","path","pathname","videoId","split","filter","Boolean","isValidHttpUrl","string","_","protocol"],"mappings":"AAYA,SAASA,IAAI,EAAEC,eAAe,QAAQ,eAAc;AACpD,SAASC,qBAAqB,QAAQ,gBAAe;AACrD,OAAOC,iBAAiB,mBAAkB;AAE1C,OAAO,MAAMC,SAASJ,KAAKK,MAAM,CAAC;IAChCC,MAAM;IAENC,OAAO;IACPC,SAAS;IACTC,WAAW;IAEX,sBAAsB;IAEtBC;QACE,OAAO;YACLC,KAAK;gBAAEC,SAAS;YAAK;YACrBC,OAAO;gBAAED,SAAS;YAAK;YACvBE,KAAK;gBACHF,SAAS;YACX;YACAG,OAAO;gBACLH,SAAS;YACX;YACAI,QAAQ;gBACNJ,SAAS;YACX;YACAK,aAAa;gBACXL,SAAS;YACX;YACAM,WAAW;gBACTN,SAAS;YACX;YACAO,mBAAmB;gBACjBP,SAAS;YACX;QACF;IACF;IACAQ;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IACAC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACAtB,gBAAgB;gBACd,aAAa;gBACbY,OAAO,CAAC,2BAA2B,EAAEU,eAAeV,KAAK,IAAI,GAAG,CAAC;YACnE;YAAI;gBACF;gBACAZ,gBACE;oBAAEY,OAAO;gBAAuB;gBAElC;oBAAC;oBAAOZ,gBAAgB;wBAAEY,OAAO;wBAAgCW,OAAO;oBAAwC;oBAC9G;wBAAC;wBAAO;4BAAEX,OAAO;wBAAyB;wBACxC;4BAAC;4BAAUZ,gBAAgBsB,gBAAgB;gCAAET,KAAKW,wBAAwBF,eAAeZ,GAAG;4BAAE;yBAAI;qBACnG;iBACF;aACF;SACF;IACH;IACAe;QACE,OAAO;YACL,aAAa;gBACX,OAAO,IAAI,CAACC,MAAM,CACfC,KAAK,GACLC,eAAe,CAAC,IAAI,CAACF,MAAM,CAACG,KAAK,CAACC,SAAS,CAACC,IAAI,EAAE;oBACjDC,MAAM,IAAI,CAACA,IAAI,CAAC3B,IAAI;gBACtB,GACC4B,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC;QACE,OAAOlC,sBAAsBC;IAC/B;IAEAkC;QACE,OAAO;YACLC,cACE,CAAC3B,KAAK4B,YACJ,CAAC,EAAEC,QAAQ,EAAEV,KAAK,EAAE;oBAGlB,IAAIW;oBAGJ,kCAAkC;oBAClCA,WAAW9B,MAAMc,wBAAwBd,OAAO+B;oBAChD,OAAOF,SAASG,aAAa,CAAC;wBAC5BV,MAAM;wBACNW,OAAO;4BACLjC;4BACAE,OAAO0B;4BACPzB,KAAK2B;wBACP;oBACF;gBACF;QACN;IACF;AACF,GAAE;AAEF,SAAShB,wBAAwBd,GAAW;IAC1C,IAAI,CAACA,KAAK,OAAO+B;IACjB,IAAI;QACF,MAAMG,SAAS,IAAIC,IAAInC;QACvB,MAAMoC,OAAOF,OAAOG,QAAQ;QAC5B,MAAMC,UAAUF,KAAKG,KAAK,CAAC,KAAKC,MAAM,CAACC,QAAQ,CAAC,EAAE;QAClD,OAAOH,UAAU,CAAC,gCAAgC,EAAEA,QAAQ,CAAC,GAAGP;IAClE,EAAE,OAAM;QACN,OAAOA;IACT;AACF;AAEA,SAASW,eAAeC,MAAc;IACpC,IAAI3C;IAEJ,IAAI;QACFA,MAAM,IAAImC,IAAIQ;IAChB,EAAE,OAAOC,GAAG;QACV,OAAO;IACT;IAEA,OAAO5C,IAAI6C,QAAQ,KAAK,WAAW7C,IAAI6C,QAAQ,KAAK;AACtD"}
@@ -1 +1 @@
1
- {"version":3,"file":"twitter.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,OAAO,EAAE;YACP;;eAEG;YAEH,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAChE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAA6C,MAAM,cAAc,CAAA;AAI9E,eAAO,MAAM,OAAO,gBA0GlB,CAAA"}
1
+ {"version":3,"file":"twitter.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,OAAO,EAAE;YACP;;eAEG;YAEH,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAChE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAA6C,MAAM,cAAc,CAAA;AAI9E,eAAO,MAAM,OAAO,gBAsGlB,CAAA"}
@@ -69,7 +69,7 @@ export const Twitter = Node.create({
69
69
  [
70
70
  'a',
71
71
  {
72
- href: HTMLAttributes.src ?? HTMLAttributes.url
72
+ href: convertYoutubeUrlToEmbed(HTMLAttributes.url) ?? HTMLAttributes.src
73
73
  },
74
74
  ''
75
75
  ]
@@ -94,11 +94,7 @@ export const Twitter = Node.create({
94
94
  insertTwitter: (url, className)=>({ commands, state })=>{
95
95
  let formattedUrl = url;
96
96
  if (url) {
97
- const tweetMatch = url.match(/(?:twitter\.com|x\.com)\/([^\/]+)\/status\/(\d+)/);
98
- if (tweetMatch) {
99
- const [_, username, tweetId] = tweetMatch;
100
- formattedUrl = `https://twitter.com/${username}/status/${tweetId}`;
101
- }
97
+ formattedUrl = convertYoutubeUrlToEmbed(url);
102
98
  }
103
99
  return commands.insertContent({
104
100
  type: 'twitter',
@@ -112,6 +108,20 @@ export const Twitter = Node.create({
112
108
  };
113
109
  }
114
110
  });
111
+ function convertYoutubeUrlToEmbed(url) {
112
+ if (!url) return undefined;
113
+ try {
114
+ let formattedUrl;
115
+ const tweetMatch = url.match(/(?:twitter\.com|x\.com)\/([^\/]+)\/status\/(\d+)/);
116
+ if (tweetMatch) {
117
+ const [_, username, tweetId] = tweetMatch;
118
+ formattedUrl = `https://twitter.com/${username}/status/${tweetId}`;
119
+ }
120
+ return formattedUrl ? formattedUrl : undefined;
121
+ } catch {
122
+ return undefined;
123
+ }
124
+ }
115
125
  function isValidHttpUrl(string) {
116
126
  let url;
117
127
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n twitter: {\n /**\n * Add an image\n */\n\n insertTwitter: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, PasteRule, markPasteRule, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport TwitterEmbed from './TwitterEmbed.js'\n\nexport const Twitter = Node.create({\n name: 'twitter',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"twitter\"]',\n },\n ]\n },\n\n addAttributes() {\n return {\n url: { default: null },\n src: { default: null },\n class: { default: null },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => {\n return this.editor\n .chain()\n .insertContentAt(this.editor.state.selection.head, {\n type: this.type.name,\n })\n .focus()\n .run()\n },\n }\n },\n\n // renderHTML({ HTMLAttributes }) {\n // return [\n // \"div\",\n // mergeAttributes(HTMLAttributes, { \"data-type\": \"twitter\" }),\n // 0,\n // ];\n // },\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"twitter\",\n class: `react-renderer node-twitter ${HTMLAttributes.class ?? \"\"}`,\n }), [\n 'div',\n mergeAttributes(\n { class: 'socialMediaContainer' },\n ),\n ['div', mergeAttributes({ class: 'rsme-embed rsme-twitter-embed', style: 'overflow: hidden; width: 325px; border-radius: 12px;' }),\n\n [\n 'blockquote',\n { class: 'twitter-tweet' },\n ['a', { href: HTMLAttributes.src ?? HTMLAttributes.url }, ''],\n ],\n [\n 'script',\n {\n async: true,\n src: 'https://platform.twitter.com/widgets.js',\n charset: 'utf-8',\n },\n ],\n ]\n ]\n ]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(TwitterEmbed)\n },\n\n addCommands() {\n return {\n insertTwitter:\n (url, className) =>\n ({ commands, state }) => {\n let formattedUrl = url\n if (url) {\n\n const tweetMatch = url.match(/(?:twitter\\.com|x\\.com)\\/([^\\/]+)\\/status\\/(\\d+)/)\n if (tweetMatch) {\n const [_, username, tweetId] = tweetMatch\n formattedUrl = `https://twitter.com/${username}/status/${tweetId}`\n }\n }\n return commands.insertContent({\n type: 'twitter',\n attrs: {\n url: url,\n class: className,\n src: formattedUrl,\n },\n })\n },\n }\n },\n})\n\nfunction isValidHttpUrl(string: string) {\n let url\n\n try {\n url = new URL(string)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n"],"names":["Node","mergeAttributes","ReactNodeViewRenderer","TwitterEmbed","Twitter","create","name","group","content","draggable","parseHTML","tag","addAttributes","url","default","src","class","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","renderHTML","HTMLAttributes","style","href","async","charset","addNodeView","addCommands","insertTwitter","className","commands","formattedUrl","tweetMatch","match","_","username","tweetId","insertContent","attrs","isValidHttpUrl","string","URL","protocol"],"mappings":"AAYA,SAASA,IAAI,EAA4BC,eAAe,QAAQ,eAAc;AAC9E,SAASC,qBAAqB,QAAQ,gBAAe;AACrD,OAAOC,kBAAkB,oBAAmB;AAE5C,OAAO,MAAMC,UAAUJ,KAAKK,MAAM,CAAC;IACjCC,MAAM;IAENC,OAAO;IACPC,SAAS;IACTC,WAAW;IAEX,sBAAsB;IAEtBC;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IAEAC;QACE,OAAO;YACLC,KAAK;gBAAEC,SAAS;YAAK;YACrBC,KAAK;gBAAED,SAAS;YAAK;YACrBE,OAAO;gBAAEF,SAAS;YAAK;QACzB;IACF;IAEAG;QACE,OAAO;YACL,aAAa;gBACX,OAAO,IAAI,CAACC,MAAM,CACfC,KAAK,GACLC,eAAe,CAAC,IAAI,CAACF,MAAM,CAACG,KAAK,CAACC,SAAS,CAACC,IAAI,EAAE;oBACjDC,MAAM,IAAI,CAACA,IAAI,CAAClB,IAAI;gBACtB,GACCmB,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEA,mCAAmC;IACnC,aAAa;IACb,aAAa;IACb,mEAAmE;IACnE,SAAS;IACT,OAAO;IACP,KAAK;IACLC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACA3B,gBAAgB2B,gBAAgB;gBAC9B,aAAa;gBACbZ,OAAO,CAAC,4BAA4B,EAAEY,eAAeZ,KAAK,IAAI,GAAG,CAAC;YACpE;YAAI;gBACF;gBACAf,gBACE;oBAAEe,OAAO;gBAAuB;gBAElC;oBAAC;oBAAOf,gBAAgB;wBAAEe,OAAO;wBAAiCa,OAAO;oBAAuD;oBAE9H;wBACE;wBACA;4BAAEb,OAAO;wBAAgB;wBACzB;4BAAC;4BAAK;gCAAEc,MAAMF,eAAeb,GAAG,IAAIa,eAAef,GAAG;4BAAC;4BAAG;yBAAG;qBAC9D;oBACD;wBACE;wBACA;4BACEkB,OAAO;4BACPhB,KAAK;4BACLiB,SAAS;wBACX;qBACD;iBACF;aACF;SACF;IACH;IAEAC;QACE,OAAO/B,sBAAsBC;IAC/B;IAEA+B;QACE,OAAO;YACLC,eACE,CAACtB,KAAKuB,YACJ,CAAC,EAAEC,QAAQ,EAAEhB,KAAK,EAAE;oBAClB,IAAIiB,eAAezB;oBACnB,IAAIA,KAAK;wBAEP,MAAM0B,aAAa1B,IAAI2B,KAAK,CAAC;wBAC7B,IAAID,YAAY;4BACd,MAAM,CAACE,GAAGC,UAAUC,QAAQ,GAAGJ;4BAC/BD,eAAe,CAAC,oBAAoB,EAAEI,SAAS,QAAQ,EAAEC,QAAQ,CAAC;wBACpE;oBACF;oBACA,OAAON,SAASO,aAAa,CAAC;wBAC5BpB,MAAM;wBACNqB,OAAO;4BACLhC,KAAKA;4BACLG,OAAOoB;4BACPrB,KAAKuB;wBACP;oBACF;gBACF;QACN;IACF;AACF,GAAE;AAEF,SAASQ,eAAeC,MAAc;IACpC,IAAIlC;IAEJ,IAAI;QACFA,MAAM,IAAImC,IAAID;IAChB,EAAE,OAAON,GAAG;QACV,OAAO;IACT;IAEA,OAAO5B,IAAIoC,QAAQ,KAAK,WAAWpC,IAAIoC,QAAQ,KAAK;AACtD"}
1
+ {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n twitter: {\n /**\n * Add an image\n */\n\n insertTwitter: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, PasteRule, markPasteRule, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport TwitterEmbed from './TwitterEmbed.js'\n\nexport const Twitter = Node.create({\n name: 'twitter',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"twitter\"]',\n },\n ]\n },\n\n addAttributes() {\n return {\n url: { default: null },\n src: { default: null },\n class: { default: null },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => {\n return this.editor\n .chain()\n .insertContentAt(this.editor.state.selection.head, {\n type: this.type.name,\n })\n .focus()\n .run()\n },\n }\n },\n\n // renderHTML({ HTMLAttributes }) {\n // return [\n // \"div\",\n // mergeAttributes(HTMLAttributes, { \"data-type\": \"twitter\" }),\n // 0,\n // ];\n // },\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"twitter\",\n class: `react-renderer node-twitter ${HTMLAttributes.class ?? \"\"}`,\n }), [\n 'div',\n mergeAttributes(\n { class: 'socialMediaContainer' },\n ),\n ['div', mergeAttributes({ class: 'rsme-embed rsme-twitter-embed', style: 'overflow: hidden; width: 325px; border-radius: 12px;' }),\n\n [\n 'blockquote',\n { class: 'twitter-tweet' },\n ['a', { href: convertYoutubeUrlToEmbed(HTMLAttributes.url) ?? HTMLAttributes.src }, ''],\n ],\n [\n 'script',\n {\n async: true,\n src: 'https://platform.twitter.com/widgets.js',\n charset: 'utf-8',\n },\n ],\n ]\n ]\n ]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(TwitterEmbed)\n },\n\n addCommands() {\n return {\n insertTwitter:\n (url, className) =>\n ({ commands, state }) => {\n let formattedUrl = url\n if (url) {\n\n formattedUrl = convertYoutubeUrlToEmbed(url)\n }\n return commands.insertContent({\n type: 'twitter',\n attrs: {\n url: url,\n class: className,\n src: formattedUrl,\n },\n })\n },\n }\n },\n})\n\nfunction convertYoutubeUrlToEmbed(url: string): string | undefined {\n if (!url) return undefined;\n try {\n let formattedUrl\n const tweetMatch = url.match(/(?:twitter\\.com|x\\.com)\\/([^\\/]+)\\/status\\/(\\d+)/)\n if (tweetMatch) {\n const [_, username, tweetId] = tweetMatch\n formattedUrl = `https://twitter.com/${username}/status/${tweetId}`\n }\n return formattedUrl ? formattedUrl : undefined;\n } catch {\n return undefined;\n }\n}\nfunction isValidHttpUrl(string: string) {\n let url\n\n try {\n url = new URL(string)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n"],"names":["Node","mergeAttributes","ReactNodeViewRenderer","TwitterEmbed","Twitter","create","name","group","content","draggable","parseHTML","tag","addAttributes","url","default","src","class","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","renderHTML","HTMLAttributes","style","href","convertYoutubeUrlToEmbed","async","charset","addNodeView","addCommands","insertTwitter","className","commands","formattedUrl","insertContent","attrs","undefined","tweetMatch","match","_","username","tweetId","isValidHttpUrl","string","URL","protocol"],"mappings":"AAYA,SAASA,IAAI,EAA4BC,eAAe,QAAQ,eAAc;AAC9E,SAASC,qBAAqB,QAAQ,gBAAe;AACrD,OAAOC,kBAAkB,oBAAmB;AAE5C,OAAO,MAAMC,UAAUJ,KAAKK,MAAM,CAAC;IACjCC,MAAM;IAENC,OAAO;IACPC,SAAS;IACTC,WAAW;IAEX,sBAAsB;IAEtBC;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IAEAC;QACE,OAAO;YACLC,KAAK;gBAAEC,SAAS;YAAK;YACrBC,KAAK;gBAAED,SAAS;YAAK;YACrBE,OAAO;gBAAEF,SAAS;YAAK;QACzB;IACF;IAEAG;QACE,OAAO;YACL,aAAa;gBACX,OAAO,IAAI,CAACC,MAAM,CACfC,KAAK,GACLC,eAAe,CAAC,IAAI,CAACF,MAAM,CAACG,KAAK,CAACC,SAAS,CAACC,IAAI,EAAE;oBACjDC,MAAM,IAAI,CAACA,IAAI,CAAClB,IAAI;gBACtB,GACCmB,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEA,mCAAmC;IACnC,aAAa;IACb,aAAa;IACb,mEAAmE;IACnE,SAAS;IACT,OAAO;IACP,KAAK;IACLC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACA3B,gBAAgB2B,gBAAgB;gBAC9B,aAAa;gBACbZ,OAAO,CAAC,4BAA4B,EAAEY,eAAeZ,KAAK,IAAI,GAAG,CAAC;YACpE;YAAI;gBACF;gBACAf,gBACE;oBAAEe,OAAO;gBAAuB;gBAElC;oBAAC;oBAAOf,gBAAgB;wBAAEe,OAAO;wBAAiCa,OAAO;oBAAuD;oBAE9H;wBACE;wBACA;4BAAEb,OAAO;wBAAgB;wBACzB;4BAAC;4BAAK;gCAAEc,MAAMC,yBAAyBH,eAAef,GAAG,KAAKe,eAAeb,GAAG;4BAAC;4BAAG;yBAAG;qBACxF;oBACD;wBACE;wBACA;4BACEiB,OAAO;4BACPjB,KAAK;4BACLkB,SAAS;wBACX;qBACD;iBACF;aACF;SACF;IACH;IAEAC;QACE,OAAOhC,sBAAsBC;IAC/B;IAEAgC;QACE,OAAO;YACLC,eACE,CAACvB,KAAKwB,YACJ,CAAC,EAAEC,QAAQ,EAAEjB,KAAK,EAAE;oBAClB,IAAIkB,eAAe1B;oBACnB,IAAIA,KAAK;wBAEP0B,eAAeR,yBAAyBlB;oBAC1C;oBACA,OAAOyB,SAASE,aAAa,CAAC;wBAC5BhB,MAAM;wBACNiB,OAAO;4BACL5B,KAAKA;4BACLG,OAAOqB;4BACPtB,KAAKwB;wBACP;oBACF;gBACF;QACN;IACF;AACF,GAAE;AAEF,SAASR,yBAAyBlB,GAAW;IAC3C,IAAI,CAACA,KAAK,OAAO6B;IACjB,IAAI;QACF,IAAIH;QACJ,MAAMI,aAAa9B,IAAI+B,KAAK,CAAC;QAC7B,IAAID,YAAY;YACd,MAAM,CAACE,GAAGC,UAAUC,QAAQ,GAAGJ;YAC/BJ,eAAe,CAAC,oBAAoB,EAAEO,SAAS,QAAQ,EAAEC,QAAQ,CAAC;QACpE;QACA,OAAOR,eAAeA,eAAeG;IACvC,EAAE,OAAM;QACN,OAAOA;IACT;AACF;AACA,SAASM,eAAeC,MAAc;IACpC,IAAIpC;IAEJ,IAAI;QACFA,MAAM,IAAIqC,IAAID;IAChB,EAAE,OAAOJ,GAAG;QACV,OAAO;IACT;IAEA,OAAOhC,IAAIsC,QAAQ,KAAK,WAAWtC,IAAIsC,QAAQ,KAAK;AACtD"}
@@ -1 +1 @@
1
- {"version":3,"file":"youtube.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Youtube/youtube.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,OAAO,EAAE;YACP;;eAEG;YAEH,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAChE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAA6C,MAAM,cAAc,CAAA;AAI9E,eAAO,MAAM,OAAO,gBA0HlB,CAAA"}
1
+ {"version":3,"file":"youtube.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Youtube/youtube.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,OAAO,EAAE;YACP;;eAEG;YAEH,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAChE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAA6C,MAAM,cAAc,CAAA;AAI9E,eAAO,MAAM,OAAO,gBAgGlB,CAAA"}
@@ -73,9 +73,9 @@ export const Youtube = Node.create({
73
73
  },
74
74
  [
75
75
  'iframe',
76
- mergeAttributes({
77
- src: HTMLAttributes.src
78
- }, HTMLAttributes)
76
+ mergeAttributes(HTMLAttributes, {
77
+ src: convertYoutubeUrlToEmbed(HTMLAttributes.url)
78
+ })
79
79
  ]
80
80
  ]
81
81
  ]
@@ -90,28 +90,7 @@ export const Youtube = Node.create({
90
90
  insertYoutube: (url, className)=>({ commands, state })=>{
91
91
  let embedUrl = '';
92
92
  if (url) {
93
- // Extract video ID from various YouTube URL formats
94
- const urlObj = new URL(url);
95
- let videoId = '';
96
- if (urlObj.hostname === 'youtu.be') {
97
- // Handle youtu.be format
98
- videoId = urlObj.pathname.slice(1);
99
- } else {
100
- // Handle youtube.com formats
101
- const searchParams = new URLSearchParams(urlObj.search);
102
- videoId = searchParams.get('v') || '';
103
- if (!videoId) {
104
- // Try extracting from pathname for embed URLs
105
- const matches = urlObj.pathname.match(/\/embed\/([^/?]+)/);
106
- if (matches) {
107
- videoId = matches[1];
108
- }
109
- }
110
- }
111
- if (videoId) {
112
- // Convert to embed URL
113
- embedUrl = `https://www.youtube.com/embed/${videoId}`;
114
- }
93
+ embedUrl = convertYoutubeUrlToEmbed(url);
115
94
  }
116
95
  return commands.insertContent({
117
96
  type: 'youtube',
@@ -125,6 +104,32 @@ export const Youtube = Node.create({
125
104
  };
126
105
  }
127
106
  });
107
+ function convertYoutubeUrlToEmbed(url) {
108
+ if (!url) return undefined;
109
+ try {
110
+ // Extract video ID from various YouTube URL formats
111
+ const urlObj = new URL(url);
112
+ let videoId = '';
113
+ if (urlObj.hostname === 'youtu.be') {
114
+ // Handle youtu.be format
115
+ videoId = urlObj.pathname.slice(1);
116
+ } else {
117
+ // Handle youtube.com formats
118
+ const searchParams = new URLSearchParams(urlObj.search);
119
+ videoId = searchParams.get('v') || '';
120
+ if (!videoId) {
121
+ // Try extracting from pathname for embed URLs
122
+ const matches = urlObj.pathname.match(/\/embed\/([^/?]+)/);
123
+ if (matches) {
124
+ videoId = matches[1];
125
+ }
126
+ }
127
+ }
128
+ return videoId ? `https://www.youtube.com/embed/${videoId}` : undefined;
129
+ } catch {
130
+ return undefined;
131
+ }
132
+ }
128
133
  function isValidHttpUrl(string) {
129
134
  let url;
130
135
  try {