payload-richtext-tiptap 0.0.127 → 0.0.128

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.
@@ -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,gBAkGpB,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,gBAgGpB,CAAA"}
@@ -38,7 +38,7 @@ export const Instagram = Node.create({
38
38
  parseHTML () {
39
39
  return [
40
40
  {
41
- tag: 'iframe[src*="instagram.com"]'
41
+ tag: 'div[data-type="instagram"]'
42
42
  }
43
43
  ];
44
44
  },
@@ -52,7 +52,7 @@ export const Instagram = Node.create({
52
52
  [
53
53
  'iframe',
54
54
  mergeAttributes({
55
- src: HTMLAttributes.url
55
+ src: HTMLAttributes.src
56
56
  }, HTMLAttributes)
57
57
  ]
58
58
  ];
@@ -72,22 +72,21 @@ export const Instagram = Node.create({
72
72
  addCommands () {
73
73
  return {
74
74
  insertInstagram: (url, className)=>({ commands, state })=>{
75
- if (!isValidHttpUrl(url)) {
76
- return false;
77
- }
78
- // Convert URL to embed format
79
- const urlObj = new URL(url);
80
- const path = urlObj.pathname;
81
- const postId = path.split('/').filter(Boolean)[1] // Get the post ID after /p/
82
- ;
83
- if (!postId) {
84
- return false;
75
+ let embedUrl = "";
76
+ if (url) {
77
+ // Convert URL to embed format
78
+ const urlObj = new URL(url);
79
+ const path = urlObj.pathname;
80
+ const postId = path.split('/').filter(Boolean)[1] // Get the post ID after /p/
81
+ ;
82
+ if (postId) {
83
+ embedUrl = `https://www.instagram.com/p/${postId}/embed/`;
84
+ }
85
85
  }
86
- const embedUrl = `https://www.instagram.com/p/${postId}/embed/`;
87
86
  return commands.insertContent({
88
87
  type: 'instagram',
89
88
  attrs: {
90
- url: embedUrl,
89
+ url: url,
91
90
  class: className,
92
91
  src: embedUrl
93
92
  }
@@ -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: '400',\n },\n height: {\n default: '480',\n },\n frameborder: {\n default: '0',\n },\n scrolling: {\n default: 'no',\n },\n allowtransparency: {\n default: 'true',\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'iframe[src*=\"instagram.com\"]',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes({\n 'data-type': 'instagram',\n class: 'socialMediaContainer',\n }),\n ['iframe', mergeAttributes({ src: HTMLAttributes.url }, HTMLAttributes)],\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 if (!isValidHttpUrl(url)) {\n return false\n }\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 return false\n }\n\n const embedUrl = `https://www.instagram.com/p/${postId}/embed/`\n return commands.insertContent({\n type: 'instagram',\n attrs: {\n url: embedUrl,\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","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","addNodeView","addCommands","insertInstagram","className","commands","isValidHttpUrl","urlObj","URL","path","pathname","postId","split","filter","Boolean","embedUrl","insertContent","attrs","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;IAEAQ;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IAEAC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACAtB,gBAAgB;gBACd,aAAa;gBACbY,OAAO;YACT;YACA;gBAAC;gBAAUZ,gBAAgB;oBAAEa,KAAKS,eAAeZ,GAAG;gBAAC,GAAGY;aAAgB;SACzE;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,CAACzB,IAAI;gBACtB,GACC0B,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC;QACE,OAAOhC,sBAAsBC;IAC/B;IAEAgC;QACE,OAAO;YACLC,iBACE,CAACzB,KAAK0B,YACN,CAAC,EAAEC,QAAQ,EAAEV,KAAK,EAAE;oBAClB,IAAI,CAACW,eAAe5B,MAAM;wBACxB,OAAO;oBACT;oBAEA,8BAA8B;oBAC9B,MAAM6B,SAAS,IAAIC,IAAI9B;oBACvB,MAAM+B,OAAOF,OAAOG,QAAQ;oBAC5B,MAAMC,SAASF,KAAKG,KAAK,CAAC,KAAKC,MAAM,CAACC,QAAQ,CAAC,EAAE,CAAC,4BAA4B;;oBAC9E,IAAI,CAACH,QAAQ;wBACX,OAAO;oBACT;oBAEA,MAAMI,WAAW,CAAC,4BAA4B,EAAEJ,OAAO,OAAO,CAAC;oBAC/D,OAAON,SAASW,aAAa,CAAC;wBAC5BlB,MAAM;wBACNmB,OAAO;4BACLvC,KAAKqC;4BACLnC,OAAOwB;4BACPvB,KAAKkC;wBACP;oBACF;gBACF;QACJ;IACF;AACF,GAAE;AAEF,SAAST,eAAeY,MAAc;IACpC,IAAIxC;IAEJ,IAAI;QACFA,MAAM,IAAI8B,IAAIU;IAChB,EAAE,OAAOC,GAAG;QACV,OAAO;IACT;IAEA,OAAOzC,IAAI0C,QAAQ,KAAK,WAAW1C,IAAI0C,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: '400',\n },\n height: {\n default: '480',\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({\n 'data-type': 'instagram',\n class: 'socialMediaContainer',\n }),\n ['iframe', mergeAttributes({ src: HTMLAttributes.src }, HTMLAttributes)],\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","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,gBAAgB;gBACd,aAAa;gBACbY,OAAO;YACT;YACA;gBAAC;gBAAUZ,gBAAgB;oBAAEa,KAAKS,eAAeT,GAAG;gBAAC,GAAGS;aAAgB;SACzE;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,CAACzB,IAAI;gBACtB,GACC0B,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC;QACE,OAAOhC,sBAAsBC;IAC/B;IAEAgC;QACE,OAAO;YACLC,iBACE,CAACzB,KAAK0B,YACJ,CAAC,EAAEC,QAAQ,EAAEV,KAAK,EAAE;oBAClB,IAAIW,WAAW;oBACf,IAAI5B,KAAK;wBAEP,8BAA8B;wBAC9B,MAAM6B,SAAS,IAAIC,IAAI9B;wBACvB,MAAM+B,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;4BACLtC,KAAKA;4BACLE,OAAOwB;4BACPvB,KAAKyB;wBACP;oBACF;gBACF;QACN;IACF;AACF,GAAE;AAEF,SAASW,eAAeC,MAAc;IACpC,IAAIxC;IAEJ,IAAI;QACFA,MAAM,IAAI8B,IAAIU;IAChB,EAAE,OAAOC,GAAG;QACV,OAAO;IACT;IAEA,OAAOzC,IAAI0C,QAAQ,KAAK,WAAW1C,IAAI0C,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,gBAmGjB,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,gBAiGjB,CAAA"}
@@ -38,7 +38,7 @@ export const Tiktok = Node.create({
38
38
  parseHTML () {
39
39
  return [
40
40
  {
41
- tag: 'iframe[src*="tiktok.com"]'
41
+ tag: 'div[data-type="tiktok"]'
42
42
  }
43
43
  ];
44
44
  },
@@ -52,7 +52,7 @@ export const Tiktok = Node.create({
52
52
  [
53
53
  'iframe',
54
54
  mergeAttributes({
55
- src: HTMLAttributes.url
55
+ src: HTMLAttributes.src
56
56
  }, HTMLAttributes)
57
57
  ]
58
58
  ];
@@ -72,24 +72,22 @@ export const Tiktok = Node.create({
72
72
  addCommands () {
73
73
  return {
74
74
  insertTiktok: (url, className)=>({ commands, state })=>{
75
- if (!isValidHttpUrl(url)) {
76
- return false;
77
- }
78
- // Convert URL to embed format
79
- const urlObj = new URL(url);
80
- const path = urlObj.pathname;
81
- const videoId = path.split('/').filter(Boolean)[2] // Get video ID from path
82
- ;
83
- if (!videoId) {
84
- return false;
75
+ let embedUrl;
76
+ if (url) {
77
+ const urlObj = new URL(url);
78
+ const path = urlObj.pathname;
79
+ const videoId = path.split('/').filter(Boolean)[2] // Get video ID from path
80
+ ;
81
+ if (videoId) {
82
+ embedUrl = `https://www.tiktok.com/embed/v3/${videoId}`;
83
+ }
85
84
  }
86
- url = `https://www.tiktok.com/embed/v3/${videoId}`;
87
85
  return commands.insertContent({
88
86
  type: 'tiktok',
89
87
  attrs: {
90
88
  url,
91
89
  class: className,
92
- src: url
90
+ src: embedUrl
93
91
  }
94
92
  });
95
93
  }
@@ -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: '400',\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 parseHTML() {\n return [\n {\n tag: 'iframe[src*=\"tiktok.com\"]',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes({\n 'data-type': 'tiktok',\n class: 'socialMediaContainer',\n }),\n ['iframe', mergeAttributes({ src: HTMLAttributes.url }, HTMLAttributes)],\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 if (!isValidHttpUrl(url)) {\n return false\n }\n\n // 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 if (!videoId) {\n return false\n }\n\n url = `https://www.tiktok.com/embed/v3/${videoId}`\n return commands.insertContent({\n type: 'tiktok',\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","TiktokEmbed","Tiktok","create","name","group","content","draggable","addAttributes","url","default","class","src","width","height","frameborder","scrolling","allowtransparency","parseHTML","tag","renderHTML","HTMLAttributes","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","addNodeView","addCommands","insertTiktok","className","commands","isValidHttpUrl","urlObj","URL","path","pathname","videoId","split","filter","Boolean","insertContent","attrs","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;IAEAQ;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IAEAC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACAtB,gBAAgB;gBACd,aAAa;gBACbY,OAAO;YACT;YACA;gBAAC;gBAAUZ,gBAAgB;oBAAEa,KAAKS,eAAeZ,GAAG;gBAAC,GAAGY;aAAgB;SACzE;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,CAACzB,IAAI;gBACtB,GACC0B,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC;QACE,OAAOhC,sBAAsBC;IAC/B;IAEAgC;QACE,OAAO;YACLC,cACE,CAACzB,KAAK0B,YACN,CAAC,EAAEC,QAAQ,EAAEV,KAAK,EAAE;oBAClB,IAAI,CAACW,eAAe5B,MAAM;wBACxB,OAAO;oBACT;oBAEA,8BAA8B;oBAC9B,MAAM6B,SAAS,IAAIC,IAAI9B;oBACvB,MAAM+B,OAAOF,OAAOG,QAAQ;oBAC5B,MAAMC,UAAUF,KAAKG,KAAK,CAAC,KAAKC,MAAM,CAACC,QAAQ,CAAC,EAAE,CAAC,yBAAyB;;oBAC5E,IAAI,CAACH,SAAS;wBACZ,OAAO;oBACT;oBAEAjC,MAAM,CAAC,gCAAgC,EAAEiC,QAAQ,CAAC;oBAClD,OAAON,SAASU,aAAa,CAAC;wBAC5BjB,MAAM;wBACNkB,OAAO;4BACLtC;4BACAE,OAAOwB;4BACPvB,KAAKH;wBACP;oBACF;gBACF;QACJ;IACF;AACF,GAAE;AAEF,SAAS4B,eAAeW,MAAc;IACpC,IAAIvC;IAEJ,IAAI;QACFA,MAAM,IAAI8B,IAAIS;IAChB,EAAE,OAAOC,GAAG;QACV,OAAO;IACT;IAEA,OAAOxC,IAAIyC,QAAQ,KAAK,WAAWzC,IAAIyC,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: '400',\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: 'socialMediaContainer',\n }),\n ['iframe', mergeAttributes({ src: HTMLAttributes.src }, HTMLAttributes)],\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","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;YACT;YACA;gBAAC;gBAAUZ,gBAAgB;oBAAEa,KAAKS,eAAeT,GAAG;gBAAC,GAAGS;aAAgB;SACzE;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,CAACzB,IAAI;gBACtB,GACC0B,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC;QACE,OAAOhC,sBAAsBC;IAC/B;IAEAgC;QACE,OAAO;YACLC,cACE,CAACzB,KAAK0B,YACJ,CAAC,EAAEC,QAAQ,EAAEV,KAAK,EAAE;oBAGlB,IAAIW;oBACJ,IAAI5B,KAAK;wBACP,MAAM6B,SAAS,IAAIC,IAAI9B;wBACvB,MAAM+B,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;4BACLtC;4BACAE,OAAOwB;4BACPvB,KAAKyB;wBACP;oBACF;gBACF;QACN;IACF;AACF,GAAE;AAEF,SAASW,eAAeC,MAAc;IACpC,IAAIxC;IAEJ,IAAI;QACFA,MAAM,IAAI8B,IAAIU;IAChB,EAAE,OAAOC,GAAG;QACV,OAAO;IACT;IAEA,OAAOzC,IAAI0C,QAAQ,KAAK,WAAW1C,IAAI0C,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,gBA8FlB,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,gBAiGlB,CAAA"}
@@ -59,7 +59,7 @@ export const Twitter = Node.create({
59
59
  [
60
60
  'a',
61
61
  {
62
- href: HTMLAttributes.url ?? HTMLAttributes.src
62
+ href: HTMLAttributes.src ?? HTMLAttributes.url
63
63
  },
64
64
  ''
65
65
  ]
@@ -80,17 +80,19 @@ export const Twitter = Node.create({
80
80
  addCommands () {
81
81
  return {
82
82
  insertTwitter: (url, className)=>({ commands, state })=>{
83
- const tweetMatch = url.match(/(?:twitter\.com|x\.com)\/([^\/]+)\/status\/(\d+)/);
84
83
  let formattedUrl = url;
85
- if (tweetMatch) {
86
- const [_, username, tweetId] = tweetMatch;
87
- formattedUrl = `https://twitter.com/${username}/status/${tweetId}`;
84
+ if (url) {
85
+ const tweetMatch = url.match(/(?:twitter\.com|x\.com)\/([^\/]+)\/status\/(\d+)/);
86
+ if (tweetMatch) {
87
+ const [_, username, tweetId] = tweetMatch;
88
+ formattedUrl = `https://twitter.com/${username}/status/${tweetId}`;
89
+ }
88
90
  }
89
91
  console.log('URL', url);
90
92
  return commands.insertContent({
91
93
  type: 'twitter',
92
94
  attrs: {
93
- url: formattedUrl,
95
+ url: url,
94
96
  class: className,
95
97
  src: formattedUrl
96
98
  }
@@ -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 console.log('HTMLAttributes', HTMLAttributes)\n return [\n 'div',\n mergeAttributes({ 'data-type': 'twitter', class: 'socialMediaContainer' }, HTMLAttributes),\n [\n 'blockquote',\n { class: 'twitter-tweet' },\n ['a', { href: 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 addNodeView() {\n return ReactNodeViewRenderer(TwitterEmbed)\n },\n\n addCommands() {\n return {\n insertTwitter:\n (url, className) =>\n ({ commands, state }) => {\n const tweetMatch = url.match(/(?:twitter\\.com|x\\.com)\\/([^\\/]+)\\/status\\/(\\d+)/)\n let formattedUrl = url\n if (tweetMatch) {\n const [_, username, tweetId] = tweetMatch\n formattedUrl = `https://twitter.com/${username}/status/${tweetId}`\n }\n console.log('URL', url)\n return commands.insertContent({\n type: 'twitter',\n attrs: {\n url: formattedUrl,\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","console","log","href","async","charset","addNodeView","addCommands","insertTwitter","className","commands","tweetMatch","match","formattedUrl","_","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;QAC3BC,QAAQC,GAAG,CAAC,kBAAkBF;QAC9B,OAAO;YACL;YACA3B,gBAAgB;gBAAE,aAAa;gBAAWe,OAAO;YAAuB,GAAGY;YAC3E;gBACE;gBACA;oBAAEZ,OAAO;gBAAgB;gBACzB;oBAAC;oBAAK;wBAAEe,MAAMH,eAAef,GAAG,IAAIe,eAAeb,GAAG;oBAAC;oBAAG;iBAAG;aAC9D;YACD;gBACE;gBACA;oBACEiB,OAAO;oBACPjB,KAAK;oBACLkB,SAAS;gBACX;aACD;SACF;IACH;IAEAC;QACE,OAAOhC,sBAAsBC;IAC/B;IAEAgC;QACE,OAAO;YACLC,eACE,CAACvB,KAAKwB,YACN,CAAC,EAAEC,QAAQ,EAAEjB,KAAK,EAAE;oBAClB,MAAMkB,aAAa1B,IAAI2B,KAAK,CAAC;oBAC7B,IAAIC,eAAe5B;oBACnB,IAAI0B,YAAY;wBACd,MAAM,CAACG,GAAGC,UAAUC,QAAQ,GAAGL;wBAC/BE,eAAe,CAAC,oBAAoB,EAAEE,SAAS,QAAQ,EAAEC,QAAQ,CAAC;oBACpE;oBACAf,QAAQC,GAAG,CAAC,OAAOjB;oBACnB,OAAOyB,SAASO,aAAa,CAAC;wBAC5BrB,MAAM;wBACNsB,OAAO;4BACLjC,KAAK4B;4BACLzB,OAAOqB;4BACPtB,KAAK0B;wBACP;oBACF;gBACF;QACJ;IACF;AACF,GAAE;AAEF,SAASM,eAAeC,MAAc;IACpC,IAAInC;IAEJ,IAAI;QACFA,MAAM,IAAIoC,IAAID;IAChB,EAAE,OAAON,GAAG;QACV,OAAO;IACT;IAEA,OAAO7B,IAAIqC,QAAQ,KAAK,WAAWrC,IAAIqC,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 console.log('HTMLAttributes', HTMLAttributes)\n return [\n 'div',\n mergeAttributes({ 'data-type': 'twitter', class: 'socialMediaContainer' }, HTMLAttributes),\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 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 console.log('URL', url)\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","console","log","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;QAC3BC,QAAQC,GAAG,CAAC,kBAAkBF;QAC9B,OAAO;YACL;YACA3B,gBAAgB;gBAAE,aAAa;gBAAWe,OAAO;YAAuB,GAAGY;YAC3E;gBACE;gBACA;oBAAEZ,OAAO;gBAAgB;gBACzB;oBAAC;oBAAK;wBAAEe,MAAKH,eAAeb,GAAG,IAAKa,eAAef,GAAG;oBAAE;oBAAG;iBAAG;aAC/D;YACD;gBACE;gBACA;oBACEmB,OAAO;oBACPjB,KAAK;oBACLkB,SAAS;gBACX;aACD;SACF;IACH;IAEAC;QACE,OAAOhC,sBAAsBC;IAC/B;IAEAgC;QACE,OAAO;YACLC,eACE,CAACvB,KAAKwB,YACN,CAAC,EAAEC,QAAQ,EAAEjB,KAAK,EAAE;oBAClB,IAAIkB,eAAe1B;oBACnB,IAAGA,KAAI;wBAEL,MAAM2B,aAAa3B,IAAI4B,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;oBACAf,QAAQC,GAAG,CAAC,OAAOjB;oBACnB,OAAOyB,SAASO,aAAa,CAAC;wBAC5BrB,MAAM;wBACNsB,OAAO;4BACLjC,KAAKA;4BACLG,OAAOqB;4BACPtB,KAAKwB;wBACP;oBACF;gBACF;QACJ;IACF;AACF,GAAE;AAEF,SAASQ,eAAeC,MAAc;IACpC,IAAInC;IAEJ,IAAI;QACFA,MAAM,IAAIoC,IAAID;IAChB,EAAE,OAAON,GAAG;QACV,OAAO;IACT;IAEA,OAAO7B,IAAIqC,QAAQ,KAAK,WAAWrC,IAAIqC,QAAQ,KAAK;AACtD"}
@@ -10,7 +10,7 @@ export const Youtube = Node.create({
10
10
  parseHTML () {
11
11
  return [
12
12
  {
13
- tag: 'iframe[src]'
13
+ tag: 'div[data-type="youtube"]'
14
14
  }
15
15
  ];
16
16
  },
@@ -58,7 +58,7 @@ export const Youtube = Node.create({
58
58
  [
59
59
  'iframe',
60
60
  mergeAttributes({
61
- src: HTMLAttributes.url
61
+ src: HTMLAttributes.src
62
62
  }, HTMLAttributes)
63
63
  ]
64
64
  ];
@@ -69,38 +69,37 @@ export const Youtube = Node.create({
69
69
  addCommands () {
70
70
  return {
71
71
  insertYoutube: (url, className)=>({ commands, state })=>{
72
- if (!isValidHttpUrl(url)) {
73
- return false;
74
- }
75
- // Extract video ID from various YouTube URL formats
76
- const urlObj = new URL(url);
77
- let videoId = '';
78
- if (urlObj.hostname === 'youtu.be') {
79
- // Handle youtu.be format
80
- videoId = urlObj.pathname.slice(1);
81
- } else {
82
- // Handle youtube.com formats
83
- const searchParams = new URLSearchParams(urlObj.search);
84
- videoId = searchParams.get('v') || '';
85
- if (!videoId) {
86
- // Try extracting from pathname for embed URLs
87
- const matches = urlObj.pathname.match(/\/embed\/([^/?]+)/);
88
- if (matches) {
89
- videoId = matches[1];
72
+ let embedUrl = '';
73
+ if (url) {
74
+ // Extract video ID from various YouTube URL formats
75
+ const urlObj = new URL(url);
76
+ let videoId = '';
77
+ if (urlObj.hostname === 'youtu.be') {
78
+ // Handle youtu.be format
79
+ videoId = urlObj.pathname.slice(1);
80
+ } else {
81
+ // Handle youtube.com formats
82
+ const searchParams = new URLSearchParams(urlObj.search);
83
+ videoId = searchParams.get('v') || '';
84
+ if (!videoId) {
85
+ // Try extracting from pathname for embed URLs
86
+ const matches = urlObj.pathname.match(/\/embed\/([^/?]+)/);
87
+ if (matches) {
88
+ videoId = matches[1];
89
+ }
90
90
  }
91
91
  }
92
+ if (videoId) {
93
+ // Convert to embed URL
94
+ embedUrl = `https://www.youtube.com/embed/${videoId}`;
95
+ }
92
96
  }
93
- if (!videoId) {
94
- return false;
95
- }
96
- // Convert to embed URL
97
- url = `https://www.youtube.com/embed/${videoId}`;
98
97
  return commands.insertContent({
99
98
  type: 'youtube',
100
99
  attrs: {
101
100
  url,
102
101
  class: className,
103
- src: url
102
+ src: embedUrl
104
103
  }
105
104
  });
106
105
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Youtube/youtube.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n youtube: {\n /**\n * Add an image\n */\n\n insertYoutube: (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 './YoutubeEmbed.js'\n\nexport const Youtube = Node.create({\n name: 'youtube',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n parseHTML() {\n return [\n {\n tag: 'iframe[src]',\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: '560',\n },\n height: {\n default: '315',\n },\n frameborder: {\n default: '0',\n },\n allowfullscreen: {\n default: true,\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 renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes({\n 'data-type': 'youtube',\n class: 'socialMediaContainer',\n }),\n ['iframe', mergeAttributes({ src: HTMLAttributes.url }, HTMLAttributes)],\n ]\n },\n addNodeView() {\n return ReactNodeViewRenderer(TwitterEmbed)\n },\n\n addCommands() {\n return {\n insertYoutube:\n (url, className) =>\n ({ commands, state }) => {\n if (!isValidHttpUrl(url)) {\n return false\n }\n\n // Extract video ID from various YouTube URL formats\n const urlObj = new URL(url)\n let videoId = ''\n\n if (urlObj.hostname === 'youtu.be') {\n // Handle youtu.be format\n videoId = urlObj.pathname.slice(1)\n } else {\n // Handle youtube.com formats\n const searchParams = new URLSearchParams(urlObj.search)\n videoId = searchParams.get('v') || ''\n\n if (!videoId) {\n // Try extracting from pathname for embed URLs\n const matches = urlObj.pathname.match(/\\/embed\\/([^/?]+)/)\n if (matches) {\n videoId = matches[1]\n }\n }\n }\n\n if (!videoId) {\n return false\n }\n\n // Convert to embed URL\n url = `https://www.youtube.com/embed/${videoId}`\n return commands.insertContent({\n type: 'youtube',\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","TwitterEmbed","Youtube","create","name","group","content","draggable","parseHTML","tag","addAttributes","url","default","class","src","width","height","frameborder","allowfullscreen","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","renderHTML","HTMLAttributes","addNodeView","addCommands","insertYoutube","className","commands","isValidHttpUrl","urlObj","URL","videoId","hostname","pathname","slice","searchParams","URLSearchParams","search","get","matches","match","insertContent","attrs","string","_","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;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,QAAQ;gBACNJ,SAAS;YACX;YACAK,aAAa;gBACXL,SAAS;YACX;YACAM,iBAAiB;gBACfN,SAAS;YACX;QACF;IACF;IAEAO;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,CAACtB,IAAI;gBACtB,GACCuB,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACA/B,gBAAgB;gBACd,aAAa;gBACbc,OAAO;YACT;YACA;gBAAC;gBAAUd,gBAAgB;oBAAEe,KAAKgB,eAAenB,GAAG;gBAAC,GAAGmB;aAAgB;SACzE;IACH;IACAC;QACE,OAAO/B,sBAAsBC;IAC/B;IAEA+B;QACE,OAAO;YACLC,eACE,CAACtB,KAAKuB,YACN,CAAC,EAAEC,QAAQ,EAAEZ,KAAK,EAAE;oBAClB,IAAI,CAACa,eAAezB,MAAM;wBACxB,OAAO;oBACT;oBAEA,oDAAoD;oBACpD,MAAM0B,SAAS,IAAIC,IAAI3B;oBACvB,IAAI4B,UAAU;oBAEd,IAAIF,OAAOG,QAAQ,KAAK,YAAY;wBAClC,yBAAyB;wBACzBD,UAAUF,OAAOI,QAAQ,CAACC,KAAK,CAAC;oBAClC,OAAO;wBACL,6BAA6B;wBAC7B,MAAMC,eAAe,IAAIC,gBAAgBP,OAAOQ,MAAM;wBACtDN,UAAUI,aAAaG,GAAG,CAAC,QAAQ;wBAEnC,IAAI,CAACP,SAAS;4BACZ,8CAA8C;4BAC9C,MAAMQ,UAAUV,OAAOI,QAAQ,CAACO,KAAK,CAAC;4BACtC,IAAID,SAAS;gCACXR,UAAUQ,OAAO,CAAC,EAAE;4BACtB;wBACF;oBACF;oBAEA,IAAI,CAACR,SAAS;wBACZ,OAAO;oBACT;oBAEA,uBAAuB;oBACvB5B,MAAM,CAAC,8BAA8B,EAAE4B,QAAQ,CAAC;oBAChD,OAAOJ,SAASc,aAAa,CAAC;wBAC5BvB,MAAM;wBACNwB,OAAO;4BACLvC;4BACAE,OAAOqB;4BACPpB,KAAKH;wBACP;oBACF;gBACF;QACJ;IACF;AACF,GAAE;AAEF,SAASyB,eAAee,MAAc;IACpC,IAAIxC;IAEJ,IAAI;QACFA,MAAM,IAAI2B,IAAIa;IAChB,EAAE,OAAOC,GAAG;QACV,OAAO;IACT;IAEA,OAAOzC,IAAI0C,QAAQ,KAAK,WAAW1C,IAAI0C,QAAQ,KAAK;AACtD"}
1
+ {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Youtube/youtube.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n youtube: {\n /**\n * Add an image\n */\n\n insertYoutube: (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 './YoutubeEmbed.js'\n\nexport const Youtube = Node.create({\n name: 'youtube',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"youtube\"]',\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: '560',\n },\n height: {\n default: '315',\n },\n frameborder: {\n default: '0',\n },\n allowfullscreen: {\n default: true,\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 renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes({\n 'data-type': 'youtube',\n class: 'socialMediaContainer',\n }),\n ['iframe', mergeAttributes({ src: HTMLAttributes.src }, HTMLAttributes)],\n ]\n },\n addNodeView() {\n return ReactNodeViewRenderer(TwitterEmbed)\n },\n\n addCommands() {\n return {\n insertYoutube:\n (url, className) =>\n ({ commands, state }) => {\n let embedUrl = ''\n \n if(url){\n\n\n // Extract video ID from various YouTube URL formats\n const urlObj = new URL(url)\n let videoId = ''\n\n if (urlObj.hostname === 'youtu.be') {\n // Handle youtu.be format\n videoId = urlObj.pathname.slice(1)\n } else {\n // Handle youtube.com formats\n const searchParams = new URLSearchParams(urlObj.search)\n videoId = searchParams.get('v') || ''\n\n if (!videoId) {\n // Try extracting from pathname for embed URLs\n const matches = urlObj.pathname.match(/\\/embed\\/([^/?]+)/)\n if (matches) {\n videoId = matches[1]\n }\n }\n }\n\n if (videoId) {\n // Convert to embed URL\n embedUrl = `https://www.youtube.com/embed/${videoId}`\n }\n }\n\n return commands.insertContent({\n type: 'youtube',\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","TwitterEmbed","Youtube","create","name","group","content","draggable","parseHTML","tag","addAttributes","url","default","class","src","width","height","frameborder","allowfullscreen","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","renderHTML","HTMLAttributes","addNodeView","addCommands","insertYoutube","className","commands","embedUrl","urlObj","URL","videoId","hostname","pathname","slice","searchParams","URLSearchParams","search","get","matches","match","insertContent","attrs","isValidHttpUrl","string","_","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;IACtBC;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IACAC;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,iBAAiB;gBACfN,SAAS;YACX;QACF;IACF;IAEAO;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,CAACtB,IAAI;gBACtB,GACCuB,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACA/B,gBAAgB;gBACd,aAAa;gBACbc,OAAO;YACT;YACA;gBAAC;gBAAUd,gBAAgB;oBAAEe,KAAKgB,eAAehB,GAAG;gBAAC,GAAGgB;aAAgB;SACzE;IACH;IACAC;QACE,OAAO/B,sBAAsBC;IAC/B;IAEA+B;QACE,OAAO;YACLC,eACE,CAACtB,KAAKuB,YACN,CAAC,EAAEC,QAAQ,EAAEZ,KAAK,EAAE;oBAClB,IAAIa,WAAW;oBAEf,IAAGzB,KAAI;wBAGP,oDAAoD;wBACpD,MAAM0B,SAAS,IAAIC,IAAI3B;wBACvB,IAAI4B,UAAU;wBAEd,IAAIF,OAAOG,QAAQ,KAAK,YAAY;4BAClC,yBAAyB;4BACzBD,UAAUF,OAAOI,QAAQ,CAACC,KAAK,CAAC;wBAClC,OAAO;4BACL,6BAA6B;4BAC7B,MAAMC,eAAe,IAAIC,gBAAgBP,OAAOQ,MAAM;4BACtDN,UAAUI,aAAaG,GAAG,CAAC,QAAQ;4BAEnC,IAAI,CAACP,SAAS;gCACZ,8CAA8C;gCAC9C,MAAMQ,UAAUV,OAAOI,QAAQ,CAACO,KAAK,CAAC;gCACtC,IAAID,SAAS;oCACXR,UAAUQ,OAAO,CAAC,EAAE;gCACtB;4BACF;wBACF;wBAEA,IAAIR,SAAS;4BACX,uBAAuB;4BACvBH,WAAW,CAAC,8BAA8B,EAAEG,QAAQ,CAAC;wBACvD;oBACF;oBAEE,OAAOJ,SAASc,aAAa,CAAC;wBAC5BvB,MAAM;wBACNwB,OAAO;4BACLvC;4BACAE,OAAOqB;4BACPpB,KAAKsB;wBACP;oBACF;gBACF;QACJ;IACF;AACF,GAAE;AAEF,SAASe,eAAeC,MAAc;IACpC,IAAIzC;IAEJ,IAAI;QACFA,MAAM,IAAI2B,IAAIc;IAChB,EAAE,OAAOC,GAAG;QACV,OAAO;IACT;IAEA,OAAO1C,IAAI2C,QAAQ,KAAK,WAAW3C,IAAI2C,QAAQ,KAAK;AACtD"}