@liveblocks/react-ui 2.25.0-aiprivatebeta9 → 3.0.0

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 (132) hide show
  1. package/_private/package.json +2 -2
  2. package/dist/_private/index.cjs +4 -0
  3. package/dist/_private/index.cjs.map +1 -1
  4. package/dist/_private/index.d.cts +8 -4
  5. package/dist/_private/index.d.ts +8 -4
  6. package/dist/_private/index.js +2 -0
  7. package/dist/_private/index.js.map +1 -1
  8. package/dist/components/AiChat.cjs +15 -19
  9. package/dist/components/AiChat.cjs.map +1 -1
  10. package/dist/components/AiChat.js +16 -20
  11. package/dist/components/AiChat.js.map +1 -1
  12. package/dist/components/AiTool.cjs +52 -28
  13. package/dist/components/AiTool.cjs.map +1 -1
  14. package/dist/components/AiTool.js +53 -29
  15. package/dist/components/AiTool.js.map +1 -1
  16. package/dist/components/Comment.cjs +254 -235
  17. package/dist/components/Comment.cjs.map +1 -1
  18. package/dist/components/Comment.js +255 -236
  19. package/dist/components/Comment.js.map +1 -1
  20. package/dist/components/Composer.cjs +42 -30
  21. package/dist/components/Composer.cjs.map +1 -1
  22. package/dist/components/Composer.js +44 -32
  23. package/dist/components/Composer.js.map +1 -1
  24. package/dist/components/Thread.cjs +7 -1
  25. package/dist/components/Thread.cjs.map +1 -1
  26. package/dist/components/Thread.js +8 -2
  27. package/dist/components/Thread.js.map +1 -1
  28. package/dist/components/internal/AiChatAssistantMessage.cjs +38 -6
  29. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  30. package/dist/components/internal/AiChatAssistantMessage.js +39 -7
  31. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  32. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  33. package/dist/components/internal/AiChatComposer.js.map +1 -1
  34. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  35. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  36. package/dist/components/internal/CodeBlock.cjs +6 -3
  37. package/dist/components/internal/CodeBlock.cjs.map +1 -1
  38. package/dist/components/internal/CodeBlock.js +6 -3
  39. package/dist/components/internal/CodeBlock.js.map +1 -1
  40. package/dist/components/internal/Dropdown.cjs +1 -1
  41. package/dist/components/internal/Dropdown.cjs.map +1 -1
  42. package/dist/components/internal/Dropdown.js +2 -2
  43. package/dist/components/internal/Dropdown.js.map +1 -1
  44. package/dist/components/internal/EmojiPicker.cjs +1 -1
  45. package/dist/components/internal/EmojiPicker.cjs.map +1 -1
  46. package/dist/components/internal/EmojiPicker.js +2 -2
  47. package/dist/components/internal/EmojiPicker.js.map +1 -1
  48. package/dist/components/internal/InboxNotificationThread.cjs +5 -2
  49. package/dist/components/internal/InboxNotificationThread.cjs.map +1 -1
  50. package/dist/components/internal/InboxNotificationThread.js +6 -3
  51. package/dist/components/internal/InboxNotificationThread.js.map +1 -1
  52. package/dist/components/internal/Tooltip.cjs +1 -1
  53. package/dist/components/internal/Tooltip.cjs.map +1 -1
  54. package/dist/components/internal/Tooltip.js +2 -2
  55. package/dist/components/internal/Tooltip.js.map +1 -1
  56. package/dist/config.cjs +9 -9
  57. package/dist/config.cjs.map +1 -1
  58. package/dist/config.js +8 -8
  59. package/dist/config.js.map +1 -1
  60. package/dist/icons/CrossCircleFill.cjs +25 -0
  61. package/dist/icons/CrossCircleFill.cjs.map +1 -0
  62. package/dist/icons/CrossCircleFill.js +23 -0
  63. package/dist/icons/CrossCircleFill.js.map +1 -0
  64. package/dist/icons/MinusCircle.cjs +23 -0
  65. package/dist/icons/MinusCircle.cjs.map +1 -0
  66. package/dist/icons/MinusCircle.js +21 -0
  67. package/dist/icons/MinusCircle.js.map +1 -0
  68. package/dist/icons/index.cjs +4 -0
  69. package/dist/icons/index.cjs.map +1 -1
  70. package/dist/icons/index.js +2 -0
  71. package/dist/icons/index.js.map +1 -1
  72. package/dist/index.cjs +1 -1
  73. package/dist/index.cjs.map +1 -1
  74. package/dist/index.d.cts +232 -25
  75. package/dist/index.d.ts +232 -25
  76. package/dist/index.js +1 -1
  77. package/dist/index.js.map +1 -1
  78. package/dist/overrides.cjs +5 -1
  79. package/dist/overrides.cjs.map +1 -1
  80. package/dist/overrides.js +5 -1
  81. package/dist/overrides.js.map +1 -1
  82. package/dist/primitives/AiMessage/index.cjs +11 -67
  83. package/dist/primitives/AiMessage/index.cjs.map +1 -1
  84. package/dist/primitives/AiMessage/index.js +13 -69
  85. package/dist/primitives/AiMessage/index.js.map +1 -1
  86. package/dist/primitives/AiMessage/tool-invocation.cjs +70 -0
  87. package/dist/primitives/AiMessage/tool-invocation.cjs.map +1 -0
  88. package/dist/primitives/AiMessage/tool-invocation.js +68 -0
  89. package/dist/primitives/AiMessage/tool-invocation.js.map +1 -0
  90. package/dist/primitives/Collapsible/index.cjs +3 -3
  91. package/dist/primitives/Collapsible/index.cjs.map +1 -1
  92. package/dist/primitives/Collapsible/index.js +3 -3
  93. package/dist/primitives/Collapsible/index.js.map +1 -1
  94. package/dist/primitives/Comment/index.cjs +5 -4
  95. package/dist/primitives/Comment/index.cjs.map +1 -1
  96. package/dist/primitives/Comment/index.js +5 -4
  97. package/dist/primitives/Comment/index.js.map +1 -1
  98. package/dist/primitives/Composer/index.cjs +49 -41
  99. package/dist/primitives/Composer/index.cjs.map +1 -1
  100. package/dist/primitives/Composer/index.js +50 -42
  101. package/dist/primitives/Composer/index.js.map +1 -1
  102. package/dist/primitives/Composer/slate/plugins/mentions.cjs +4 -4
  103. package/dist/primitives/Composer/slate/plugins/mentions.cjs.map +1 -1
  104. package/dist/primitives/Composer/slate/plugins/mentions.js +4 -4
  105. package/dist/primitives/Composer/slate/plugins/mentions.js.map +1 -1
  106. package/dist/primitives/Composer/utils.cjs +3 -6
  107. package/dist/primitives/Composer/utils.cjs.map +1 -1
  108. package/dist/primitives/Composer/utils.js +3 -6
  109. package/dist/primitives/Composer/utils.js.map +1 -1
  110. package/dist/primitives/Markdown.cjs +6 -2
  111. package/dist/primitives/Markdown.cjs.map +1 -1
  112. package/dist/primitives/Markdown.js +6 -2
  113. package/dist/primitives/Markdown.js.map +1 -1
  114. package/dist/primitives/index.d.cts +18 -18
  115. package/dist/primitives/index.d.ts +18 -18
  116. package/dist/utils/use-controllable-state.cjs +25 -2
  117. package/dist/utils/use-controllable-state.cjs.map +1 -1
  118. package/dist/utils/use-controllable-state.js +25 -3
  119. package/dist/utils/use-controllable-state.js.map +1 -1
  120. package/dist/utils/use-visible.cjs +3 -1
  121. package/dist/utils/use-visible.cjs.map +1 -1
  122. package/dist/utils/use-visible.js +3 -1
  123. package/dist/utils/use-visible.js.map +1 -1
  124. package/dist/version.cjs +1 -1
  125. package/dist/version.cjs.map +1 -1
  126. package/dist/version.js +1 -1
  127. package/dist/version.js.map +1 -1
  128. package/package.json +16 -5
  129. package/primitives/package.json +2 -2
  130. package/src/styles/index.css +22 -4
  131. package/styles.css +1 -1
  132. package/styles.css.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"mentions.js","sources":["../../../../../src/primitives/Composer/slate/plugins/mentions.ts"],"sourcesContent":["import type { Node as SlateNode } from \"slate\";\nimport {\n Editor as SlateEditor,\n Element as SlateElement,\n Range as SlateRange,\n Transforms as SlateTransforms,\n} from \"slate\";\n\nimport { MENTION_CHARACTER } from \"../../../../constants\";\nimport type { ComposerBodyMention } from \"../../../../types\";\nimport {\n getCharacterAfter,\n getCharacterBefore,\n} from \"../../../slate/utils/get-character\";\nimport { getMatchRange } from \"../../../slate/utils/get-match-range\";\nimport { isEmptyString } from \"../../../slate/utils/is-empty-string\";\nimport { isWhitespaceCharacter } from \"../../../slate/utils/is-whitespace-character\";\n\nexport type MentionDraft = {\n range: SlateRange;\n text: string;\n};\n\nexport function getMentionDraftAtSelection(\n editor: SlateEditor\n): MentionDraft | undefined {\n const { selection } = editor;\n\n if (!selection || !SlateRange.isCollapsed(selection)) {\n return;\n }\n\n // Walk backwards from the selection until \"@\" is found, unless the character\n // before isn't whitespace (or \"@\" is the block's first character)\n const match = getMatchRange(editor, selection, [\"@\"], {\n include: true,\n allowConsecutiveWhitespace: false,\n ignoreTerminator: (_, point) => {\n const characterBefore = getCharacterBefore(editor, point);\n\n // Ignore \"@\" if it's preceded by a non-whitespace character\n if (characterBefore && !isWhitespaceCharacter(characterBefore.text)) {\n return true;\n }\n\n return false;\n },\n });\n\n if (!match) {\n return;\n }\n\n const matchText = SlateEditor.string(editor, match);\n\n // Check if the match starts with the mention character (not followed by a whitespace character)\n if (\n !matchText.startsWith(MENTION_CHARACTER) ||\n (matchText.length > 1 && isWhitespaceCharacter(matchText[1]))\n ) {\n return;\n }\n\n return {\n range: match,\n // Exclude the mention character from the text\n text: matchText.substring(1),\n };\n}\n\nexport function isComposerBodyMention(\n node: SlateNode\n): node is ComposerBodyMention {\n return SlateElement.isElement(node) && node.type === \"mention\";\n}\n\nexport function insertMention(editor: SlateEditor, userId: string) {\n const mention: ComposerBodyMention = {\n type: \"mention\",\n id: userId,\n children: [{ text: \"\" }],\n };\n\n // Insert the mention\n SlateTransforms.insertNodes(editor, mention);\n SlateTransforms.move(editor);\n\n const afterCharacter = editor.selection\n ? getCharacterAfter(editor, editor.selection)\n : undefined;\n\n if (!afterCharacter || afterCharacter.void) {\n // Insert a following space if needed\n SlateTransforms.insertText(editor, \" \");\n } else if (isEmptyString(afterCharacter.text)) {\n // Move the selection if it's already followed by a space\n SlateTransforms.move(editor);\n }\n}\n\nexport function insertMentionCharacter(editor: SlateEditor) {\n if (!editor.selection) {\n return;\n }\n\n // Check if the selection is preceded or followed by a non-whitespace character\n const beforeCharacter = getCharacterBefore(editor, editor.selection, {\n filterVoids: true,\n });\n const afterCharacter = getCharacterAfter(editor, editor.selection, {\n filterVoids: true,\n });\n const shouldInsertSpaceBefore =\n beforeCharacter && !isEmptyString(beforeCharacter.text);\n const shouldInsertSpaceAfter =\n afterCharacter && !isEmptyString(afterCharacter.text);\n\n if (!SlateRange.isCollapsed(editor.selection)) {\n const text =\n (shouldInsertSpaceBefore ? \" \" : \"\") +\n MENTION_CHARACTER +\n (shouldInsertSpaceAfter ? \" \" : \"\");\n\n // If the selection is collapsed, insert the mention character at the current selection\n editor.insertText(text);\n\n // If a following space was inserted, move the selection back by one\n if (shouldInsertSpaceAfter) {\n SlateTransforms.move(editor, {\n distance: 1,\n unit: \"character\",\n reverse: true,\n });\n }\n } else {\n const beforeText = (shouldInsertSpaceBefore ? \" \" : \"\") + MENTION_CHARACTER;\n\n // If the selection is not collapsed, insert the mention character before the selection\n editor.insertText(beforeText, { at: SlateRange.start(editor.selection) });\n\n if (shouldInsertSpaceAfter) {\n editor.insertText(\" \", { at: SlateRange.end(editor.selection) });\n }\n\n // Collapse the selection at its end\n SlateTransforms.collapse(editor, { edge: \"end\" });\n }\n}\n\nexport function withMentions<T extends SlateEditor>(editor: T): T {\n const { isInline, isVoid, markableVoid, deleteBackward } = editor;\n\n editor.isInline = (element) => {\n return isComposerBodyMention(element) || isInline(element);\n };\n\n editor.isVoid = (element) => {\n return isComposerBodyMention(element) || isVoid(element);\n };\n\n editor.markableVoid = (element) => {\n return isComposerBodyMention(element) || markableVoid(element);\n };\n\n editor.deleteBackward = (unit) => {\n const { selection } = editor;\n\n if (selection && SlateRange.isCollapsed(selection)) {\n const [mention] = SlateEditor.nodes(editor, {\n at:\n unit === \"character\"\n ? SlateEditor.before(editor, selection, { unit: \"character\" })\n : selection,\n match: isComposerBodyMention,\n });\n\n deleteBackward(unit);\n\n if (mention) {\n SlateTransforms.insertText(editor, MENTION_CHARACTER);\n }\n } else {\n deleteBackward(unit);\n }\n };\n\n return editor;\n}\n"],"names":["SlateRange","SlateEditor","SlateElement","SlateTransforms"],"mappings":";;;;;;;AAuBO,SAAS,2BACd,MAC0B,EAAA;AAC1B,EAAM,MAAA,EAAE,WAAc,GAAA,MAAA,CAAA;AAEtB,EAAA,IAAI,CAAC,SAAa,IAAA,CAACA,KAAW,CAAA,WAAA,CAAY,SAAS,CAAG,EAAA;AACpD,IAAA,OAAA;AAAA,GACF;AAIA,EAAA,MAAM,QAAQ,aAAc,CAAA,MAAA,EAAQ,SAAW,EAAA,CAAC,GAAG,CAAG,EAAA;AAAA,IACpD,OAAS,EAAA,IAAA;AAAA,IACT,0BAA4B,EAAA,KAAA;AAAA,IAC5B,gBAAA,EAAkB,CAAC,CAAA,EAAG,KAAU,KAAA;AAC9B,MAAM,MAAA,eAAA,GAAkB,kBAAmB,CAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AAGxD,MAAA,IAAI,eAAmB,IAAA,CAAC,qBAAsB,CAAA,eAAA,CAAgB,IAAI,CAAG,EAAA;AACnE,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAEA,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAAA,GACD,CAAA,CAAA;AAED,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAA,OAAA;AAAA,GACF;AAEA,EAAA,MAAM,SAAY,GAAAC,MAAA,CAAY,MAAO,CAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AAGlD,EACE,IAAA,CAAC,SAAU,CAAA,UAAA,CAAW,iBAAiB,CAAA,IACtC,SAAU,CAAA,MAAA,GAAS,CAAK,IAAA,qBAAA,CAAsB,SAAU,CAAA,CAAA,CAAE,CAC3D,EAAA;AACA,IAAA,OAAA;AAAA,GACF;AAEA,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,KAAA;AAAA,IAEP,IAAA,EAAM,SAAU,CAAA,SAAA,CAAU,CAAC,CAAA;AAAA,GAC7B,CAAA;AACF,CAAA;AAEO,SAAS,sBACd,IAC6B,EAAA;AAC7B,EAAA,OAAOC,OAAa,CAAA,SAAA,CAAU,IAAI,CAAA,IAAK,KAAK,IAAS,KAAA,SAAA,CAAA;AACvD,CAAA;AAEgB,SAAA,aAAA,CAAc,QAAqB,MAAgB,EAAA;AACjE,EAAA,MAAM,OAA+B,GAAA;AAAA,IACnC,IAAM,EAAA,SAAA;AAAA,IACN,EAAI,EAAA,MAAA;AAAA,IACJ,QAAU,EAAA,CAAC,EAAE,IAAA,EAAM,IAAI,CAAA;AAAA,GACzB,CAAA;AAGA,EAAgBC,UAAA,CAAA,WAAA,CAAY,QAAQ,OAAO,CAAA,CAAA;AAC3C,EAAAA,UAAA,CAAgB,KAAK,MAAM,CAAA,CAAA;AAE3B,EAAA,MAAM,iBAAiB,MAAO,CAAA,SAAA,GAC1B,kBAAkB,MAAQ,EAAA,MAAA,CAAO,SAAS,CAC1C,GAAA,KAAA,CAAA,CAAA;AAEJ,EAAI,IAAA,CAAC,cAAkB,IAAA,cAAA,CAAe,IAAM,EAAA;AAE1C,IAAgBA,UAAA,CAAA,UAAA,CAAW,QAAQ,GAAG,CAAA,CAAA;AAAA,GAC7B,MAAA,IAAA,aAAA,CAAc,cAAe,CAAA,IAAI,CAAG,EAAA;AAE7C,IAAAA,UAAA,CAAgB,KAAK,MAAM,CAAA,CAAA;AAAA,GAC7B;AACF,CAAA;AAEO,SAAS,uBAAuB,MAAqB,EAAA;AAC1D,EAAI,IAAA,CAAC,OAAO,SAAW,EAAA;AACrB,IAAA,OAAA;AAAA,GACF;AAGA,EAAA,MAAM,eAAkB,GAAA,kBAAA,CAAmB,MAAQ,EAAA,MAAA,CAAO,SAAW,EAAA;AAAA,IACnE,WAAa,EAAA,IAAA;AAAA,GACd,CAAA,CAAA;AACD,EAAA,MAAM,cAAiB,GAAA,iBAAA,CAAkB,MAAQ,EAAA,MAAA,CAAO,SAAW,EAAA;AAAA,IACjE,WAAa,EAAA,IAAA;AAAA,GACd,CAAA,CAAA;AACD,EAAA,MAAM,uBACJ,GAAA,eAAA,IAAmB,CAAC,aAAA,CAAc,gBAAgB,IAAI,CAAA,CAAA;AACxD,EAAA,MAAM,sBACJ,GAAA,cAAA,IAAkB,CAAC,aAAA,CAAc,eAAe,IAAI,CAAA,CAAA;AAEtD,EAAA,IAAI,CAACH,KAAA,CAAW,WAAY,CAAA,MAAA,CAAO,SAAS,CAAG,EAAA;AAC7C,IAAA,MAAM,QACH,uBAA0B,GAAA,GAAA,GAAM,EACjC,IAAA,iBAAA,IACC,yBAAyB,GAAM,GAAA,EAAA,CAAA,CAAA;AAGlC,IAAA,MAAA,CAAO,WAAW,IAAI,CAAA,CAAA;AAGtB,IAAA,IAAI,sBAAwB,EAAA;AAC1B,MAAAG,UAAA,CAAgB,KAAK,MAAQ,EAAA;AAAA,QAC3B,QAAU,EAAA,CAAA;AAAA,QACV,IAAM,EAAA,WAAA;AAAA,QACN,OAAS,EAAA,IAAA;AAAA,OACV,CAAA,CAAA;AAAA,KACH;AAAA,GACK,MAAA;AACL,IAAM,MAAA,UAAA,GAAA,CAAc,uBAA0B,GAAA,GAAA,GAAM,EAAM,IAAA,iBAAA,CAAA;AAG1D,IAAO,MAAA,CAAA,UAAA,CAAW,YAAY,EAAE,EAAA,EAAIH,MAAW,KAAM,CAAA,MAAA,CAAO,SAAS,CAAA,EAAG,CAAA,CAAA;AAExE,IAAA,IAAI,sBAAwB,EAAA;AAC1B,MAAO,MAAA,CAAA,UAAA,CAAW,KAAK,EAAE,EAAA,EAAIA,MAAW,GAAI,CAAA,MAAA,CAAO,SAAS,CAAA,EAAG,CAAA,CAAA;AAAA,KACjE;AAGA,IAAAG,UAAA,CAAgB,QAAS,CAAA,MAAA,EAAQ,EAAE,IAAA,EAAM,OAAO,CAAA,CAAA;AAAA,GAClD;AACF,CAAA;AAEO,SAAS,aAAoC,MAAc,EAAA;AAChE,EAAA,MAAM,EAAE,QAAA,EAAU,MAAQ,EAAA,YAAA,EAAc,gBAAmB,GAAA,MAAA,CAAA;AAE3D,EAAO,MAAA,CAAA,QAAA,GAAW,CAAC,OAAY,KAAA;AAC7B,IAAA,OAAO,qBAAsB,CAAA,OAAO,CAAK,IAAA,QAAA,CAAS,OAAO,CAAA,CAAA;AAAA,GAC3D,CAAA;AAEA,EAAO,MAAA,CAAA,MAAA,GAAS,CAAC,OAAY,KAAA;AAC3B,IAAA,OAAO,qBAAsB,CAAA,OAAO,CAAK,IAAA,MAAA,CAAO,OAAO,CAAA,CAAA;AAAA,GACzD,CAAA;AAEA,EAAO,MAAA,CAAA,YAAA,GAAe,CAAC,OAAY,KAAA;AACjC,IAAA,OAAO,qBAAsB,CAAA,OAAO,CAAK,IAAA,YAAA,CAAa,OAAO,CAAA,CAAA;AAAA,GAC/D,CAAA;AAEA,EAAO,MAAA,CAAA,cAAA,GAAiB,CAAC,IAAS,KAAA;AAChC,IAAM,MAAA,EAAE,WAAc,GAAA,MAAA,CAAA;AAEtB,IAAA,IAAI,SAAa,IAAAH,KAAA,CAAW,WAAY,CAAA,SAAS,CAAG,EAAA;AAClD,MAAA,MAAM,CAAC,OAAO,CAAI,GAAAC,MAAA,CAAY,MAAM,MAAQ,EAAA;AAAA,QAC1C,EAAA,EACE,IAAS,KAAA,WAAA,GACLA,MAAY,CAAA,MAAA,CAAO,MAAQ,EAAA,SAAA,EAAW,EAAE,IAAA,EAAM,WAAY,EAAC,CAC3D,GAAA,SAAA;AAAA,QACN,KAAO,EAAA,qBAAA;AAAA,OACR,CAAA,CAAA;AAED,MAAA,cAAA,CAAe,IAAI,CAAA,CAAA;AAEnB,MAAA,IAAI,OAAS,EAAA;AACX,QAAgBE,UAAA,CAAA,UAAA,CAAW,QAAQ,iBAAiB,CAAA,CAAA;AAAA,OACtD;AAAA,KACK,MAAA;AACL,MAAA,cAAA,CAAe,IAAI,CAAA,CAAA;AAAA,KACrB;AAAA,GACF,CAAA;AAEA,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"mentions.js","sources":["../../../../../src/primitives/Composer/slate/plugins/mentions.ts"],"sourcesContent":["import type { MentionData } from \"@liveblocks/core\";\nimport type { Node as SlateNode } from \"slate\";\nimport {\n Editor as SlateEditor,\n Element as SlateElement,\n Range as SlateRange,\n Transforms as SlateTransforms,\n} from \"slate\";\n\nimport { MENTION_CHARACTER } from \"../../../../constants\";\nimport type { ComposerBodyMention } from \"../../../../types\";\nimport {\n getCharacterAfter,\n getCharacterBefore,\n} from \"../../../slate/utils/get-character\";\nimport { getMatchRange } from \"../../../slate/utils/get-match-range\";\nimport { isEmptyString } from \"../../../slate/utils/is-empty-string\";\nimport { isWhitespaceCharacter } from \"../../../slate/utils/is-whitespace-character\";\n\nexport type MentionDraft = {\n range: SlateRange;\n text: string;\n};\n\nexport function getMentionDraftAtSelection(\n editor: SlateEditor\n): MentionDraft | undefined {\n const { selection } = editor;\n\n if (!selection || !SlateRange.isCollapsed(selection)) {\n return;\n }\n\n // Walk backwards from the selection until \"@\" is found, unless the character\n // before isn't whitespace (or \"@\" is the block's first character)\n const match = getMatchRange(editor, selection, [\"@\"], {\n include: true,\n allowConsecutiveWhitespace: false,\n ignoreTerminator: (_, point) => {\n const characterBefore = getCharacterBefore(editor, point);\n\n // Ignore \"@\" if it's preceded by a non-whitespace character\n if (characterBefore && !isWhitespaceCharacter(characterBefore.text)) {\n return true;\n }\n\n return false;\n },\n });\n\n if (!match) {\n return;\n }\n\n const matchText = SlateEditor.string(editor, match);\n\n // Check if the match starts with the mention character (not followed by a whitespace character)\n if (\n !matchText.startsWith(MENTION_CHARACTER) ||\n (matchText.length > 1 && isWhitespaceCharacter(matchText[1]))\n ) {\n return;\n }\n\n return {\n range: match,\n // Exclude the mention character from the text\n text: matchText.substring(1),\n };\n}\n\nexport function isComposerBodyMention(\n node: SlateNode\n): node is ComposerBodyMention {\n return SlateElement.isElement(node) && node.type === \"mention\";\n}\n\nexport function insertMention(editor: SlateEditor, mention: MentionData) {\n const mentionNode: ComposerBodyMention = {\n type: \"mention\",\n ...mention,\n children: [{ text: \"\" }],\n };\n\n // Insert the mention\n SlateTransforms.insertNodes(editor, mentionNode);\n SlateTransforms.move(editor);\n\n const afterCharacter = editor.selection\n ? getCharacterAfter(editor, editor.selection)\n : undefined;\n\n if (!afterCharacter || afterCharacter.void) {\n // Insert a following space if needed\n SlateTransforms.insertText(editor, \" \");\n } else if (isEmptyString(afterCharacter.text)) {\n // Move the selection if it's already followed by a space\n SlateTransforms.move(editor);\n }\n}\n\nexport function insertMentionCharacter(editor: SlateEditor) {\n if (!editor.selection) {\n return;\n }\n\n // Check if the selection is preceded or followed by a non-whitespace character\n const beforeCharacter = getCharacterBefore(editor, editor.selection, {\n filterVoids: true,\n });\n const afterCharacter = getCharacterAfter(editor, editor.selection, {\n filterVoids: true,\n });\n const shouldInsertSpaceBefore =\n beforeCharacter && !isEmptyString(beforeCharacter.text);\n const shouldInsertSpaceAfter =\n afterCharacter && !isEmptyString(afterCharacter.text);\n\n if (!SlateRange.isCollapsed(editor.selection)) {\n const text =\n (shouldInsertSpaceBefore ? \" \" : \"\") +\n MENTION_CHARACTER +\n (shouldInsertSpaceAfter ? \" \" : \"\");\n\n // If the selection is collapsed, insert the mention character at the current selection\n editor.insertText(text);\n\n // If a following space was inserted, move the selection back by one\n if (shouldInsertSpaceAfter) {\n SlateTransforms.move(editor, {\n distance: 1,\n unit: \"character\",\n reverse: true,\n });\n }\n } else {\n const beforeText = (shouldInsertSpaceBefore ? \" \" : \"\") + MENTION_CHARACTER;\n\n // If the selection is not collapsed, insert the mention character before the selection\n editor.insertText(beforeText, { at: SlateRange.start(editor.selection) });\n\n if (shouldInsertSpaceAfter) {\n editor.insertText(\" \", { at: SlateRange.end(editor.selection) });\n }\n\n // Collapse the selection at its end\n SlateTransforms.collapse(editor, { edge: \"end\" });\n }\n}\n\nexport function withMentions<T extends SlateEditor>(editor: T): T {\n const { isInline, isVoid, markableVoid, deleteBackward } = editor;\n\n editor.isInline = (element) => {\n return isComposerBodyMention(element) || isInline(element);\n };\n\n editor.isVoid = (element) => {\n return isComposerBodyMention(element) || isVoid(element);\n };\n\n editor.markableVoid = (element) => {\n return isComposerBodyMention(element) || markableVoid(element);\n };\n\n editor.deleteBackward = (unit) => {\n const { selection } = editor;\n\n if (selection && SlateRange.isCollapsed(selection)) {\n const [mention] = SlateEditor.nodes(editor, {\n at:\n unit === \"character\"\n ? SlateEditor.before(editor, selection, { unit: \"character\" })\n : selection,\n match: isComposerBodyMention,\n });\n\n deleteBackward(unit);\n\n if (mention) {\n SlateTransforms.insertText(editor, MENTION_CHARACTER);\n }\n } else {\n deleteBackward(unit);\n }\n };\n\n return editor;\n}\n"],"names":["SlateRange","SlateEditor","SlateElement","SlateTransforms"],"mappings":"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"}
@@ -18,10 +18,8 @@ var customLinks = require('./slate/plugins/custom-links.cjs');
18
18
  var mentions = require('./slate/plugins/mentions.cjs');
19
19
 
20
20
  function composerBodyMentionToCommentBodyMention(mention) {
21
- return {
22
- type: "mention",
23
- id: mention.id
24
- };
21
+ const { children: _, ...commentBodyMention } = mention;
22
+ return commentBodyMention;
25
23
  }
26
24
  function composerBodyAutoLinkToCommentBodyLink(link) {
27
25
  return {
@@ -38,8 +36,7 @@ function composerBodyCustomLinkToCommentBodyLink(link) {
38
36
  }
39
37
  function commentBodyMentionToComposerBodyMention(mention) {
40
38
  return {
41
- type: "mention",
42
- id: mention.id,
39
+ ...mention,
43
40
  children: [{ text: "" }]
44
41
  };
45
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","sources":["../../../src/primitives/Composer/utils.ts"],"sourcesContent":["import type {\n DetectOverflowOptions,\n Placement,\n UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport {\n autoUpdate,\n flip,\n hide,\n inline,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport type {\n Client,\n CommentAttachment,\n CommentBody,\n CommentBodyLink,\n CommentBodyMention,\n CommentLocalAttachment,\n CommentMixedAttachment,\n} from \"@liveblocks/core\";\nimport { HttpError, kInternal, makeEventSource } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport type { DragEvent } from \"react\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\n\nimport {\n FLOATING_ELEMENT_COLLISION_PADDING,\n FLOATING_ELEMENT_SIDE_OFFSET,\n} from \"../../constants\";\nimport type {\n ComposerBody,\n ComposerBodyAutoLink,\n ComposerBodyCustomLink,\n ComposerBodyMention,\n ComposerBodyText,\n Direction,\n} from \"../../types\";\nimport { getFiles } from \"../../utils/data-transfer\";\nimport { exists } from \"../../utils/exists\";\nimport { useInitial } from \"../../utils/use-initial\";\nimport { useLatest } from \"../../utils/use-latest\";\nimport {\n isCommentBodyLink,\n isCommentBodyMention,\n isCommentBodyText,\n} from \"../Comment/utils\";\nimport { isText } from \"../slate/utils/is-text\";\nimport { useComposer, useComposerAttachmentsContext } from \"./contexts\";\nimport { isComposerBodyAutoLink } from \"./slate/plugins/auto-links\";\nimport { isComposerBodyCustomLink } from \"./slate/plugins/custom-links\";\nimport { isComposerBodyMention } from \"./slate/plugins/mentions\";\nimport type { FloatingAlignment, FloatingPosition } from \"./types\";\n\nexport function composerBodyMentionToCommentBodyMention(\n mention: ComposerBodyMention\n): CommentBodyMention {\n return {\n type: \"mention\",\n id: mention.id,\n };\n}\n\nexport function composerBodyAutoLinkToCommentBodyLink(\n link: ComposerBodyAutoLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n };\n}\n\nexport function composerBodyCustomLinkToCommentBodyLink(\n link: ComposerBodyCustomLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n text: link.children.map((child) => child.text).join(\"\"),\n };\n}\n\nexport function commentBodyMentionToComposerBodyMention(\n mention: CommentBodyMention\n): ComposerBodyMention {\n return {\n type: \"mention\",\n id: mention.id,\n children: [{ text: \"\" }],\n };\n}\n\nexport function commentBodyLinkToComposerBodyLink(\n link: CommentBodyLink\n): ComposerBodyAutoLink | ComposerBodyCustomLink {\n if (link.text) {\n return {\n type: \"custom-link\",\n url: link.url,\n children: [{ text: link.text }],\n };\n } else {\n return {\n type: \"auto-link\",\n url: link.url,\n children: [{ text: link.url }],\n };\n }\n}\n\nexport function composerBodyToCommentBody(body: ComposerBody): CommentBody {\n return {\n version: 1,\n content: body\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isComposerBodyMention(inline)) {\n return composerBodyMentionToCommentBodyMention(inline);\n }\n\n if (isComposerBodyAutoLink(inline)) {\n return composerBodyAutoLinkToCommentBodyLink(inline);\n }\n\n if (isComposerBodyCustomLink(inline)) {\n return composerBodyCustomLinkToCommentBodyLink(inline);\n }\n\n if (isText(inline)) {\n return inline;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists),\n };\n}\n\nconst emptyComposerBody: ComposerBody = [];\n\nexport function commentBodyToComposerBody(body: CommentBody): ComposerBody {\n if (!body || !body?.content) {\n return emptyComposerBody;\n }\n\n return body.content\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isCommentBodyMention(inline)) {\n return commentBodyMentionToComposerBodyMention(inline);\n }\n\n if (isCommentBodyLink(inline)) {\n return commentBodyLinkToComposerBodyLink(inline);\n }\n\n if (isCommentBodyText(inline)) {\n return inline as ComposerBodyText;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists);\n}\n\nexport function getRtlFloatingAlignment(\n alignment: FloatingAlignment\n): FloatingAlignment {\n switch (alignment) {\n case \"start\":\n return \"end\";\n case \"end\":\n return \"start\";\n default:\n return \"center\";\n }\n}\n\nexport function getSideAndAlignFromFloatingPlacement(placement: Placement) {\n const [side, align = \"center\"] = placement.split(\"-\");\n\n return [side, align] as const;\n}\n\n// Copy `z-index` from content to wrapper.\n// Inspired by https://github.com/radix-ui/primitives/blob/main/packages/react/popper/src/Popper.tsx\nexport function useContentZIndex() {\n const [content, setContent] = useState<HTMLDivElement | null>(null);\n const contentRef = useCallback(setContent, [setContent]);\n const [contentZIndex, setContentZIndex] = useState<string>();\n\n useLayoutEffect(() => {\n if (content) {\n setContentZIndex(window.getComputedStyle(content).zIndex);\n }\n }, [content]);\n\n return [contentRef, contentZIndex] as const;\n}\n\nexport function useFloatingWithOptions({\n type = \"bounds\",\n position,\n alignment,\n dir,\n open,\n}: {\n type?: \"bounds\" | \"range\";\n position: FloatingPosition;\n alignment: FloatingAlignment;\n dir: Direction | undefined;\n open: boolean;\n}) {\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: FLOATING_ELEMENT_COLLISION_PADDING,\n };\n\n const middleware = [\n type === \"range\" ? inline(detectOverflowOptions) : null,\n flip({ ...detectOverflowOptions, crossAxis: false }),\n hide(detectOverflowOptions),\n shift({\n ...detectOverflowOptions,\n limiter: limitShift(),\n }),\n type === \"range\" ? offset(FLOATING_ELEMENT_SIDE_OFFSET) : null,\n size({\n ...detectOverflowOptions,\n apply({ availableWidth, availableHeight, elements }) {\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-width\",\n `${availableWidth}px`\n );\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-height\",\n `${availableHeight}px`\n );\n },\n }),\n ];\n\n return {\n strategy: \"fixed\",\n placement:\n alignment === \"center\"\n ? position\n : (`${position}-${dir === \"rtl\" ? getRtlFloatingAlignment(alignment) : alignment}` as Placement),\n middleware,\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [alignment, position, dir, type]);\n\n return useFloating({\n ...floatingOptions,\n open,\n });\n}\n\nexport function useComposerAttachmentsDropArea<\n T extends HTMLElement = HTMLElement,\n>({\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n disabled,\n}: {\n onDragEnter?: (event: DragEvent<T>) => void;\n onDragLeave?: (event: DragEvent<T>) => void;\n onDragOver?: (event: DragEvent<T>) => void;\n onDrop?: (event: DragEvent<T>) => void;\n disabled?: boolean;\n}) {\n const { isDisabled: isComposerDisabled } = useComposer();\n const isDisabled = isComposerDisabled || disabled;\n const { createAttachments } = useComposerAttachmentsContext();\n const [isDraggingOver, setDraggingOver] = useState(false);\n const latestIsDraggingOver = useLatest(isDraggingOver);\n\n const handleDragEnter = useCallback(\n (event: DragEvent<T>) => {\n onDragEnter?.(event);\n\n if (\n latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n const dataTransfer = event.dataTransfer;\n\n if (!dataTransfer.types.includes(\"Files\")) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(true);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragEnter, isDisabled]\n );\n\n const handleDragLeave = useCallback(\n (event: DragEvent<T>) => {\n onDragLeave?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n // Ignore drag leave events that are not actually leaving the drop area\n if (\n event.relatedTarget\n ? event.relatedTarget === event.currentTarget ||\n event.currentTarget.contains(event.relatedTarget as HTMLElement)\n : event.currentTarget !== event.target\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragLeave, isDisabled]\n );\n\n const handleDragOver = useCallback(\n (event: DragEvent<T>) => {\n onDragOver?.(event);\n\n if (isDisabled || event.isDefaultPrevented()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n },\n [onDragOver, isDisabled]\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<T>) => {\n onDrop?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n\n const files = getFiles(event.dataTransfer);\n\n createAttachments(files);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDrop, isDisabled, createAttachments]\n );\n\n return [\n isDraggingOver,\n {\n onDragEnter: handleDragEnter,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n \"data-drop\": isDraggingOver ? \"\" : undefined,\n \"data-disabled\": isDisabled ? \"\" : undefined,\n } as const,\n ] as const;\n}\n\ninterface ComposerAttachmentsManagerOptions {\n maxFileSize: number;\n roomId: string;\n}\n\nexport class AttachmentTooLargeError extends Error {\n origin: \"client\" | \"server\";\n name = \"AttachmentTooLargeError\";\n\n constructor(message: string, origin: \"client\" | \"server\" = \"client\") {\n super(message);\n this.origin = origin;\n }\n}\n\nfunction createComposerAttachmentsManager(\n client: Client,\n roomId: string,\n options: ComposerAttachmentsManagerOptions\n) {\n const attachments: Map<string, CommentMixedAttachment> = new Map();\n const abortControllers: Map<string, AbortController> = new Map();\n const eventSource = makeEventSource<void>();\n let cachedSnapshot: CommentMixedAttachment[] | null = null;\n\n function notifySubscribers() {\n // Invalidate the cached snapshot\n cachedSnapshot = null;\n eventSource.notify();\n }\n\n function uploadAttachment(attachment: CommentLocalAttachment) {\n const abortController = new AbortController();\n abortControllers.set(attachment.id, abortController);\n\n client[kInternal].httpClient\n .uploadAttachment({\n roomId,\n attachment,\n signal: abortController.signal,\n })\n .then(() => {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploaded\",\n });\n notifySubscribers();\n })\n .catch((error) => {\n if (\n error instanceof Error &&\n error.name !== \"AbortError\" &&\n error.name !== \"TimeoutError\"\n ) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error:\n error instanceof HttpError && error.status === 413\n ? new AttachmentTooLargeError(\"File is too large.\", \"server\")\n : error,\n });\n notifySubscribers();\n }\n });\n }\n\n function addAttachments(addedAttachments: CommentMixedAttachment[]) {\n if (addedAttachments.length === 0) {\n return;\n }\n\n // Ignore attachments that are already in the manager\n const newAttachments = addedAttachments.filter(\n (attachment) => !attachments.has(attachment.id)\n );\n\n const attachmentsToUpload: CommentLocalAttachment[] = [];\n\n // Add all the new attachments to the manager\n for (const attachment of newAttachments) {\n if (attachment.type === \"localAttachment\") {\n // The file is too large to be uploaded\n if (attachment.file.size > options.maxFileSize) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error: new AttachmentTooLargeError(\"File is too large.\", \"client\"),\n });\n\n continue;\n }\n\n // Otherwise, mark the attachment to be uploaded\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploading\",\n });\n attachmentsToUpload.push(attachment);\n } else {\n attachments.set(attachment.id, attachment);\n }\n }\n\n // Notify subscribers about the new attachments that were added\n if (newAttachments.length > 0) {\n notifySubscribers();\n }\n\n // Upload all the new local attachments\n for (const attachment of attachmentsToUpload) {\n uploadAttachment(attachment);\n }\n }\n\n function removeAttachment(attachmentId: string) {\n const abortController = abortControllers.get(attachmentId);\n\n abortController?.abort();\n\n attachments.delete(attachmentId);\n abortControllers.delete(attachmentId);\n\n notifySubscribers();\n }\n\n function getSnapshot() {\n if (!cachedSnapshot) {\n cachedSnapshot = Array.from(attachments.values());\n }\n\n return cachedSnapshot;\n }\n\n // Clear all attachments and abort all ongoing uploads\n function clear() {\n abortControllers.forEach((controller) => controller.abort());\n abortControllers.clear();\n attachments.clear();\n\n notifySubscribers();\n }\n\n return {\n addAttachments,\n removeAttachment,\n getSnapshot,\n subscribe: eventSource.subscribe,\n clear,\n };\n}\n\nfunction preventBeforeUnloadDefault(event: BeforeUnloadEvent) {\n event.preventDefault();\n}\n\nexport function useComposerAttachmentsManager(\n defaultAttachments: CommentAttachment[],\n options: ComposerAttachmentsManagerOptions\n) {\n const client = useClient();\n const frozenDefaultAttachments = useInitial(defaultAttachments);\n const frozenAttachmentsManager = useInitial(() =>\n createComposerAttachmentsManager(client, options.roomId, options)\n );\n\n // Initialize default attachments on mount\n useEffect(() => {\n frozenAttachmentsManager.addAttachments(frozenDefaultAttachments);\n }, [frozenDefaultAttachments, frozenAttachmentsManager]);\n\n // Clear on unmount\n useEffect(() => {\n return () => {\n frozenAttachmentsManager.clear();\n };\n }, [frozenAttachmentsManager]);\n\n const attachments = useSyncExternalStore(\n frozenAttachmentsManager.subscribe,\n frozenAttachmentsManager.getSnapshot,\n frozenAttachmentsManager.getSnapshot\n );\n\n const isUploadingAttachments = useMemo(() => {\n return attachments.some(\n (attachment) =>\n attachment.type === \"localAttachment\" &&\n attachment.status === \"uploading\"\n );\n }, [attachments]);\n\n useEffect(() => {\n if (!isUploadingAttachments) {\n return;\n }\n\n window.addEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n\n return () => {\n window.removeEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n };\n }, [isUploadingAttachments]);\n\n return {\n attachments,\n isUploadingAttachments,\n addAttachments: frozenAttachmentsManager.addAttachments,\n removeAttachment: frozenAttachmentsManager.removeAttachment,\n clearAttachments: frozenAttachmentsManager.clear,\n };\n}\n"],"names":["inline","isComposerBodyMention","isComposerBodyAutoLink","isComposerBodyCustomLink","isText","exists","isCommentBodyMention","isCommentBodyLink","isCommentBodyText","useState","useCallback","useLayoutEffect","useMemo","FLOATING_ELEMENT_COLLISION_PADDING","flip","hide","shift","limitShift","offset","FLOATING_ELEMENT_SIDE_OFFSET","size","autoUpdate","useFloating","useComposer","useComposerAttachmentsContext","useLatest","getFiles","makeEventSource","kInternal","HttpError","useClient","useInitial","useEffect","useSyncExternalStore"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","sources":["../../../src/primitives/Composer/utils.ts"],"sourcesContent":["import type {\n DetectOverflowOptions,\n Placement,\n UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport {\n autoUpdate,\n flip,\n hide,\n inline,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport type {\n Client,\n CommentAttachment,\n CommentBody,\n CommentBodyLink,\n CommentBodyMention,\n CommentLocalAttachment,\n CommentMixedAttachment,\n} from \"@liveblocks/core\";\nimport { HttpError, kInternal, makeEventSource } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport type { DragEvent } from \"react\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\n\nimport {\n FLOATING_ELEMENT_COLLISION_PADDING,\n FLOATING_ELEMENT_SIDE_OFFSET,\n} from \"../../constants\";\nimport type {\n ComposerBody,\n ComposerBodyAutoLink,\n ComposerBodyCustomLink,\n ComposerBodyMention,\n ComposerBodyText,\n Direction,\n} from \"../../types\";\nimport { getFiles } from \"../../utils/data-transfer\";\nimport { exists } from \"../../utils/exists\";\nimport { useInitial } from \"../../utils/use-initial\";\nimport { useLatest } from \"../../utils/use-latest\";\nimport {\n isCommentBodyLink,\n isCommentBodyMention,\n isCommentBodyText,\n} from \"../Comment/utils\";\nimport { isText } from \"../slate/utils/is-text\";\nimport { useComposer, useComposerAttachmentsContext } from \"./contexts\";\nimport { isComposerBodyAutoLink } from \"./slate/plugins/auto-links\";\nimport { isComposerBodyCustomLink } from \"./slate/plugins/custom-links\";\nimport { isComposerBodyMention } from \"./slate/plugins/mentions\";\nimport type { FloatingAlignment, FloatingPosition } from \"./types\";\n\nexport function composerBodyMentionToCommentBodyMention(\n mention: ComposerBodyMention\n): CommentBodyMention {\n const { children: _, ...commentBodyMention } = mention;\n\n return commentBodyMention;\n}\n\nexport function composerBodyAutoLinkToCommentBodyLink(\n link: ComposerBodyAutoLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n };\n}\n\nexport function composerBodyCustomLinkToCommentBodyLink(\n link: ComposerBodyCustomLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n text: link.children.map((child) => child.text).join(\"\"),\n };\n}\n\nexport function commentBodyMentionToComposerBodyMention(\n mention: CommentBodyMention\n): ComposerBodyMention {\n return {\n ...mention,\n children: [{ text: \"\" }],\n };\n}\n\nexport function commentBodyLinkToComposerBodyLink(\n link: CommentBodyLink\n): ComposerBodyAutoLink | ComposerBodyCustomLink {\n if (link.text) {\n return {\n type: \"custom-link\",\n url: link.url,\n children: [{ text: link.text }],\n };\n } else {\n return {\n type: \"auto-link\",\n url: link.url,\n children: [{ text: link.url }],\n };\n }\n}\n\nexport function composerBodyToCommentBody(body: ComposerBody): CommentBody {\n return {\n version: 1,\n content: body\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isComposerBodyMention(inline)) {\n return composerBodyMentionToCommentBodyMention(inline);\n }\n\n if (isComposerBodyAutoLink(inline)) {\n return composerBodyAutoLinkToCommentBodyLink(inline);\n }\n\n if (isComposerBodyCustomLink(inline)) {\n return composerBodyCustomLinkToCommentBodyLink(inline);\n }\n\n if (isText(inline)) {\n return inline;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists),\n };\n}\n\nconst emptyComposerBody: ComposerBody = [];\n\nexport function commentBodyToComposerBody(body: CommentBody): ComposerBody {\n if (!body || !body?.content) {\n return emptyComposerBody;\n }\n\n return body.content\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isCommentBodyMention(inline)) {\n return commentBodyMentionToComposerBodyMention(inline);\n }\n\n if (isCommentBodyLink(inline)) {\n return commentBodyLinkToComposerBodyLink(inline);\n }\n\n if (isCommentBodyText(inline)) {\n return inline as ComposerBodyText;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists);\n}\n\nexport function getRtlFloatingAlignment(\n alignment: FloatingAlignment\n): FloatingAlignment {\n switch (alignment) {\n case \"start\":\n return \"end\";\n case \"end\":\n return \"start\";\n default:\n return \"center\";\n }\n}\n\nexport function getSideAndAlignFromFloatingPlacement(placement: Placement) {\n const [side, align = \"center\"] = placement.split(\"-\");\n\n return [side, align] as const;\n}\n\n// Copy `z-index` from content to wrapper.\n// Inspired by https://github.com/radix-ui/primitives/blob/main/packages/react/popper/src/Popper.tsx\nexport function useContentZIndex() {\n const [content, setContent] = useState<HTMLDivElement | null>(null);\n const contentRef = useCallback(setContent, [setContent]);\n const [contentZIndex, setContentZIndex] = useState<string>();\n\n useLayoutEffect(() => {\n if (content) {\n setContentZIndex(window.getComputedStyle(content).zIndex);\n }\n }, [content]);\n\n return [contentRef, contentZIndex] as const;\n}\n\nexport function useFloatingWithOptions({\n type = \"bounds\",\n position,\n alignment,\n dir,\n open,\n}: {\n type?: \"bounds\" | \"range\";\n position: FloatingPosition;\n alignment: FloatingAlignment;\n dir: Direction | undefined;\n open: boolean;\n}) {\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: FLOATING_ELEMENT_COLLISION_PADDING,\n };\n\n const middleware = [\n type === \"range\" ? inline(detectOverflowOptions) : null,\n flip({ ...detectOverflowOptions, crossAxis: false }),\n hide(detectOverflowOptions),\n shift({\n ...detectOverflowOptions,\n limiter: limitShift(),\n }),\n type === \"range\" ? offset(FLOATING_ELEMENT_SIDE_OFFSET) : null,\n size({\n ...detectOverflowOptions,\n apply({ availableWidth, availableHeight, elements }) {\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-width\",\n `${availableWidth}px`\n );\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-height\",\n `${availableHeight}px`\n );\n },\n }),\n ];\n\n return {\n strategy: \"fixed\",\n placement:\n alignment === \"center\"\n ? position\n : (`${position}-${dir === \"rtl\" ? getRtlFloatingAlignment(alignment) : alignment}` as Placement),\n middleware,\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [alignment, position, dir, type]);\n\n return useFloating({\n ...floatingOptions,\n open,\n });\n}\n\nexport function useComposerAttachmentsDropArea<\n T extends HTMLElement = HTMLElement,\n>({\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n disabled,\n}: {\n onDragEnter?: (event: DragEvent<T>) => void;\n onDragLeave?: (event: DragEvent<T>) => void;\n onDragOver?: (event: DragEvent<T>) => void;\n onDrop?: (event: DragEvent<T>) => void;\n disabled?: boolean;\n}) {\n const { isDisabled: isComposerDisabled } = useComposer();\n const isDisabled = isComposerDisabled || disabled;\n const { createAttachments } = useComposerAttachmentsContext();\n const [isDraggingOver, setDraggingOver] = useState(false);\n const latestIsDraggingOver = useLatest(isDraggingOver);\n\n const handleDragEnter = useCallback(\n (event: DragEvent<T>) => {\n onDragEnter?.(event);\n\n if (\n latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n const dataTransfer = event.dataTransfer;\n\n if (!dataTransfer.types.includes(\"Files\")) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(true);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragEnter, isDisabled]\n );\n\n const handleDragLeave = useCallback(\n (event: DragEvent<T>) => {\n onDragLeave?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n // Ignore drag leave events that are not actually leaving the drop area\n if (\n event.relatedTarget\n ? event.relatedTarget === event.currentTarget ||\n event.currentTarget.contains(event.relatedTarget as HTMLElement)\n : event.currentTarget !== event.target\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragLeave, isDisabled]\n );\n\n const handleDragOver = useCallback(\n (event: DragEvent<T>) => {\n onDragOver?.(event);\n\n if (isDisabled || event.isDefaultPrevented()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n },\n [onDragOver, isDisabled]\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<T>) => {\n onDrop?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n\n const files = getFiles(event.dataTransfer);\n\n createAttachments(files);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDrop, isDisabled, createAttachments]\n );\n\n return [\n isDraggingOver,\n {\n onDragEnter: handleDragEnter,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n \"data-drop\": isDraggingOver ? \"\" : undefined,\n \"data-disabled\": isDisabled ? \"\" : undefined,\n } as const,\n ] as const;\n}\n\ninterface ComposerAttachmentsManagerOptions {\n maxFileSize: number;\n roomId: string;\n}\n\nexport class AttachmentTooLargeError extends Error {\n origin: \"client\" | \"server\";\n name = \"AttachmentTooLargeError\";\n\n constructor(message: string, origin: \"client\" | \"server\" = \"client\") {\n super(message);\n this.origin = origin;\n }\n}\n\nfunction createComposerAttachmentsManager(\n client: Client,\n roomId: string,\n options: ComposerAttachmentsManagerOptions\n) {\n const attachments: Map<string, CommentMixedAttachment> = new Map();\n const abortControllers: Map<string, AbortController> = new Map();\n const eventSource = makeEventSource<void>();\n let cachedSnapshot: CommentMixedAttachment[] | null = null;\n\n function notifySubscribers() {\n // Invalidate the cached snapshot\n cachedSnapshot = null;\n eventSource.notify();\n }\n\n function uploadAttachment(attachment: CommentLocalAttachment) {\n const abortController = new AbortController();\n abortControllers.set(attachment.id, abortController);\n\n client[kInternal].httpClient\n .uploadAttachment({\n roomId,\n attachment,\n signal: abortController.signal,\n })\n .then(() => {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploaded\",\n });\n notifySubscribers();\n })\n .catch((error) => {\n if (\n error instanceof Error &&\n error.name !== \"AbortError\" &&\n error.name !== \"TimeoutError\"\n ) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error:\n error instanceof HttpError && error.status === 413\n ? new AttachmentTooLargeError(\"File is too large.\", \"server\")\n : error,\n });\n notifySubscribers();\n }\n });\n }\n\n function addAttachments(addedAttachments: CommentMixedAttachment[]) {\n if (addedAttachments.length === 0) {\n return;\n }\n\n // Ignore attachments that are already in the manager\n const newAttachments = addedAttachments.filter(\n (attachment) => !attachments.has(attachment.id)\n );\n\n const attachmentsToUpload: CommentLocalAttachment[] = [];\n\n // Add all the new attachments to the manager\n for (const attachment of newAttachments) {\n if (attachment.type === \"localAttachment\") {\n // The file is too large to be uploaded\n if (attachment.file.size > options.maxFileSize) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error: new AttachmentTooLargeError(\"File is too large.\", \"client\"),\n });\n\n continue;\n }\n\n // Otherwise, mark the attachment to be uploaded\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploading\",\n });\n attachmentsToUpload.push(attachment);\n } else {\n attachments.set(attachment.id, attachment);\n }\n }\n\n // Notify subscribers about the new attachments that were added\n if (newAttachments.length > 0) {\n notifySubscribers();\n }\n\n // Upload all the new local attachments\n for (const attachment of attachmentsToUpload) {\n uploadAttachment(attachment);\n }\n }\n\n function removeAttachment(attachmentId: string) {\n const abortController = abortControllers.get(attachmentId);\n\n abortController?.abort();\n\n attachments.delete(attachmentId);\n abortControllers.delete(attachmentId);\n\n notifySubscribers();\n }\n\n function getSnapshot() {\n if (!cachedSnapshot) {\n cachedSnapshot = Array.from(attachments.values());\n }\n\n return cachedSnapshot;\n }\n\n // Clear all attachments and abort all ongoing uploads\n function clear() {\n abortControllers.forEach((controller) => controller.abort());\n abortControllers.clear();\n attachments.clear();\n\n notifySubscribers();\n }\n\n return {\n addAttachments,\n removeAttachment,\n getSnapshot,\n subscribe: eventSource.subscribe,\n clear,\n };\n}\n\nfunction preventBeforeUnloadDefault(event: BeforeUnloadEvent) {\n event.preventDefault();\n}\n\nexport function useComposerAttachmentsManager(\n defaultAttachments: CommentAttachment[],\n options: ComposerAttachmentsManagerOptions\n) {\n const client = useClient();\n const frozenDefaultAttachments = useInitial(defaultAttachments);\n const frozenAttachmentsManager = useInitial(() =>\n createComposerAttachmentsManager(client, options.roomId, options)\n );\n\n // Initialize default attachments on mount\n useEffect(() => {\n frozenAttachmentsManager.addAttachments(frozenDefaultAttachments);\n }, [frozenDefaultAttachments, frozenAttachmentsManager]);\n\n // Clear on unmount\n useEffect(() => {\n return () => {\n frozenAttachmentsManager.clear();\n };\n }, [frozenAttachmentsManager]);\n\n const attachments = useSyncExternalStore(\n frozenAttachmentsManager.subscribe,\n frozenAttachmentsManager.getSnapshot,\n frozenAttachmentsManager.getSnapshot\n );\n\n const isUploadingAttachments = useMemo(() => {\n return attachments.some(\n (attachment) =>\n attachment.type === \"localAttachment\" &&\n attachment.status === \"uploading\"\n );\n }, [attachments]);\n\n useEffect(() => {\n if (!isUploadingAttachments) {\n return;\n }\n\n window.addEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n\n return () => {\n window.removeEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n };\n }, [isUploadingAttachments]);\n\n return {\n attachments,\n isUploadingAttachments,\n addAttachments: frozenAttachmentsManager.addAttachments,\n removeAttachment: frozenAttachmentsManager.removeAttachment,\n clearAttachments: frozenAttachmentsManager.clear,\n };\n}\n"],"names":["inline","isComposerBodyMention","isComposerBodyAutoLink","isComposerBodyCustomLink","isText","exists","isCommentBodyMention","isCommentBodyLink","isCommentBodyText","useState","useCallback","useLayoutEffect","useMemo","FLOATING_ELEMENT_COLLISION_PADDING","flip","hide","shift","limitShift","offset","FLOATING_ELEMENT_SIDE_OFFSET","size","autoUpdate","useFloating","useComposer","useComposerAttachmentsContext","useLatest","getFiles","makeEventSource","kInternal","HttpError","useClient","useInitial","useEffect","useSyncExternalStore"],"mappings":"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"}
@@ -16,10 +16,8 @@ import { isComposerBodyCustomLink } from './slate/plugins/custom-links.js';
16
16
  import { isComposerBodyMention } from './slate/plugins/mentions.js';
17
17
 
18
18
  function composerBodyMentionToCommentBodyMention(mention) {
19
- return {
20
- type: "mention",
21
- id: mention.id
22
- };
19
+ const { children: _, ...commentBodyMention } = mention;
20
+ return commentBodyMention;
23
21
  }
24
22
  function composerBodyAutoLinkToCommentBodyLink(link) {
25
23
  return {
@@ -36,8 +34,7 @@ function composerBodyCustomLinkToCommentBodyLink(link) {
36
34
  }
37
35
  function commentBodyMentionToComposerBodyMention(mention) {
38
36
  return {
39
- type: "mention",
40
- id: mention.id,
37
+ ...mention,
41
38
  children: [{ text: "" }]
42
39
  };
43
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/primitives/Composer/utils.ts"],"sourcesContent":["import type {\n DetectOverflowOptions,\n Placement,\n UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport {\n autoUpdate,\n flip,\n hide,\n inline,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport type {\n Client,\n CommentAttachment,\n CommentBody,\n CommentBodyLink,\n CommentBodyMention,\n CommentLocalAttachment,\n CommentMixedAttachment,\n} from \"@liveblocks/core\";\nimport { HttpError, kInternal, makeEventSource } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport type { DragEvent } from \"react\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\n\nimport {\n FLOATING_ELEMENT_COLLISION_PADDING,\n FLOATING_ELEMENT_SIDE_OFFSET,\n} from \"../../constants\";\nimport type {\n ComposerBody,\n ComposerBodyAutoLink,\n ComposerBodyCustomLink,\n ComposerBodyMention,\n ComposerBodyText,\n Direction,\n} from \"../../types\";\nimport { getFiles } from \"../../utils/data-transfer\";\nimport { exists } from \"../../utils/exists\";\nimport { useInitial } from \"../../utils/use-initial\";\nimport { useLatest } from \"../../utils/use-latest\";\nimport {\n isCommentBodyLink,\n isCommentBodyMention,\n isCommentBodyText,\n} from \"../Comment/utils\";\nimport { isText } from \"../slate/utils/is-text\";\nimport { useComposer, useComposerAttachmentsContext } from \"./contexts\";\nimport { isComposerBodyAutoLink } from \"./slate/plugins/auto-links\";\nimport { isComposerBodyCustomLink } from \"./slate/plugins/custom-links\";\nimport { isComposerBodyMention } from \"./slate/plugins/mentions\";\nimport type { FloatingAlignment, FloatingPosition } from \"./types\";\n\nexport function composerBodyMentionToCommentBodyMention(\n mention: ComposerBodyMention\n): CommentBodyMention {\n return {\n type: \"mention\",\n id: mention.id,\n };\n}\n\nexport function composerBodyAutoLinkToCommentBodyLink(\n link: ComposerBodyAutoLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n };\n}\n\nexport function composerBodyCustomLinkToCommentBodyLink(\n link: ComposerBodyCustomLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n text: link.children.map((child) => child.text).join(\"\"),\n };\n}\n\nexport function commentBodyMentionToComposerBodyMention(\n mention: CommentBodyMention\n): ComposerBodyMention {\n return {\n type: \"mention\",\n id: mention.id,\n children: [{ text: \"\" }],\n };\n}\n\nexport function commentBodyLinkToComposerBodyLink(\n link: CommentBodyLink\n): ComposerBodyAutoLink | ComposerBodyCustomLink {\n if (link.text) {\n return {\n type: \"custom-link\",\n url: link.url,\n children: [{ text: link.text }],\n };\n } else {\n return {\n type: \"auto-link\",\n url: link.url,\n children: [{ text: link.url }],\n };\n }\n}\n\nexport function composerBodyToCommentBody(body: ComposerBody): CommentBody {\n return {\n version: 1,\n content: body\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isComposerBodyMention(inline)) {\n return composerBodyMentionToCommentBodyMention(inline);\n }\n\n if (isComposerBodyAutoLink(inline)) {\n return composerBodyAutoLinkToCommentBodyLink(inline);\n }\n\n if (isComposerBodyCustomLink(inline)) {\n return composerBodyCustomLinkToCommentBodyLink(inline);\n }\n\n if (isText(inline)) {\n return inline;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists),\n };\n}\n\nconst emptyComposerBody: ComposerBody = [];\n\nexport function commentBodyToComposerBody(body: CommentBody): ComposerBody {\n if (!body || !body?.content) {\n return emptyComposerBody;\n }\n\n return body.content\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isCommentBodyMention(inline)) {\n return commentBodyMentionToComposerBodyMention(inline);\n }\n\n if (isCommentBodyLink(inline)) {\n return commentBodyLinkToComposerBodyLink(inline);\n }\n\n if (isCommentBodyText(inline)) {\n return inline as ComposerBodyText;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists);\n}\n\nexport function getRtlFloatingAlignment(\n alignment: FloatingAlignment\n): FloatingAlignment {\n switch (alignment) {\n case \"start\":\n return \"end\";\n case \"end\":\n return \"start\";\n default:\n return \"center\";\n }\n}\n\nexport function getSideAndAlignFromFloatingPlacement(placement: Placement) {\n const [side, align = \"center\"] = placement.split(\"-\");\n\n return [side, align] as const;\n}\n\n// Copy `z-index` from content to wrapper.\n// Inspired by https://github.com/radix-ui/primitives/blob/main/packages/react/popper/src/Popper.tsx\nexport function useContentZIndex() {\n const [content, setContent] = useState<HTMLDivElement | null>(null);\n const contentRef = useCallback(setContent, [setContent]);\n const [contentZIndex, setContentZIndex] = useState<string>();\n\n useLayoutEffect(() => {\n if (content) {\n setContentZIndex(window.getComputedStyle(content).zIndex);\n }\n }, [content]);\n\n return [contentRef, contentZIndex] as const;\n}\n\nexport function useFloatingWithOptions({\n type = \"bounds\",\n position,\n alignment,\n dir,\n open,\n}: {\n type?: \"bounds\" | \"range\";\n position: FloatingPosition;\n alignment: FloatingAlignment;\n dir: Direction | undefined;\n open: boolean;\n}) {\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: FLOATING_ELEMENT_COLLISION_PADDING,\n };\n\n const middleware = [\n type === \"range\" ? inline(detectOverflowOptions) : null,\n flip({ ...detectOverflowOptions, crossAxis: false }),\n hide(detectOverflowOptions),\n shift({\n ...detectOverflowOptions,\n limiter: limitShift(),\n }),\n type === \"range\" ? offset(FLOATING_ELEMENT_SIDE_OFFSET) : null,\n size({\n ...detectOverflowOptions,\n apply({ availableWidth, availableHeight, elements }) {\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-width\",\n `${availableWidth}px`\n );\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-height\",\n `${availableHeight}px`\n );\n },\n }),\n ];\n\n return {\n strategy: \"fixed\",\n placement:\n alignment === \"center\"\n ? position\n : (`${position}-${dir === \"rtl\" ? getRtlFloatingAlignment(alignment) : alignment}` as Placement),\n middleware,\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [alignment, position, dir, type]);\n\n return useFloating({\n ...floatingOptions,\n open,\n });\n}\n\nexport function useComposerAttachmentsDropArea<\n T extends HTMLElement = HTMLElement,\n>({\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n disabled,\n}: {\n onDragEnter?: (event: DragEvent<T>) => void;\n onDragLeave?: (event: DragEvent<T>) => void;\n onDragOver?: (event: DragEvent<T>) => void;\n onDrop?: (event: DragEvent<T>) => void;\n disabled?: boolean;\n}) {\n const { isDisabled: isComposerDisabled } = useComposer();\n const isDisabled = isComposerDisabled || disabled;\n const { createAttachments } = useComposerAttachmentsContext();\n const [isDraggingOver, setDraggingOver] = useState(false);\n const latestIsDraggingOver = useLatest(isDraggingOver);\n\n const handleDragEnter = useCallback(\n (event: DragEvent<T>) => {\n onDragEnter?.(event);\n\n if (\n latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n const dataTransfer = event.dataTransfer;\n\n if (!dataTransfer.types.includes(\"Files\")) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(true);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragEnter, isDisabled]\n );\n\n const handleDragLeave = useCallback(\n (event: DragEvent<T>) => {\n onDragLeave?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n // Ignore drag leave events that are not actually leaving the drop area\n if (\n event.relatedTarget\n ? event.relatedTarget === event.currentTarget ||\n event.currentTarget.contains(event.relatedTarget as HTMLElement)\n : event.currentTarget !== event.target\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragLeave, isDisabled]\n );\n\n const handleDragOver = useCallback(\n (event: DragEvent<T>) => {\n onDragOver?.(event);\n\n if (isDisabled || event.isDefaultPrevented()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n },\n [onDragOver, isDisabled]\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<T>) => {\n onDrop?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n\n const files = getFiles(event.dataTransfer);\n\n createAttachments(files);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDrop, isDisabled, createAttachments]\n );\n\n return [\n isDraggingOver,\n {\n onDragEnter: handleDragEnter,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n \"data-drop\": isDraggingOver ? \"\" : undefined,\n \"data-disabled\": isDisabled ? \"\" : undefined,\n } as const,\n ] as const;\n}\n\ninterface ComposerAttachmentsManagerOptions {\n maxFileSize: number;\n roomId: string;\n}\n\nexport class AttachmentTooLargeError extends Error {\n origin: \"client\" | \"server\";\n name = \"AttachmentTooLargeError\";\n\n constructor(message: string, origin: \"client\" | \"server\" = \"client\") {\n super(message);\n this.origin = origin;\n }\n}\n\nfunction createComposerAttachmentsManager(\n client: Client,\n roomId: string,\n options: ComposerAttachmentsManagerOptions\n) {\n const attachments: Map<string, CommentMixedAttachment> = new Map();\n const abortControllers: Map<string, AbortController> = new Map();\n const eventSource = makeEventSource<void>();\n let cachedSnapshot: CommentMixedAttachment[] | null = null;\n\n function notifySubscribers() {\n // Invalidate the cached snapshot\n cachedSnapshot = null;\n eventSource.notify();\n }\n\n function uploadAttachment(attachment: CommentLocalAttachment) {\n const abortController = new AbortController();\n abortControllers.set(attachment.id, abortController);\n\n client[kInternal].httpClient\n .uploadAttachment({\n roomId,\n attachment,\n signal: abortController.signal,\n })\n .then(() => {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploaded\",\n });\n notifySubscribers();\n })\n .catch((error) => {\n if (\n error instanceof Error &&\n error.name !== \"AbortError\" &&\n error.name !== \"TimeoutError\"\n ) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error:\n error instanceof HttpError && error.status === 413\n ? new AttachmentTooLargeError(\"File is too large.\", \"server\")\n : error,\n });\n notifySubscribers();\n }\n });\n }\n\n function addAttachments(addedAttachments: CommentMixedAttachment[]) {\n if (addedAttachments.length === 0) {\n return;\n }\n\n // Ignore attachments that are already in the manager\n const newAttachments = addedAttachments.filter(\n (attachment) => !attachments.has(attachment.id)\n );\n\n const attachmentsToUpload: CommentLocalAttachment[] = [];\n\n // Add all the new attachments to the manager\n for (const attachment of newAttachments) {\n if (attachment.type === \"localAttachment\") {\n // The file is too large to be uploaded\n if (attachment.file.size > options.maxFileSize) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error: new AttachmentTooLargeError(\"File is too large.\", \"client\"),\n });\n\n continue;\n }\n\n // Otherwise, mark the attachment to be uploaded\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploading\",\n });\n attachmentsToUpload.push(attachment);\n } else {\n attachments.set(attachment.id, attachment);\n }\n }\n\n // Notify subscribers about the new attachments that were added\n if (newAttachments.length > 0) {\n notifySubscribers();\n }\n\n // Upload all the new local attachments\n for (const attachment of attachmentsToUpload) {\n uploadAttachment(attachment);\n }\n }\n\n function removeAttachment(attachmentId: string) {\n const abortController = abortControllers.get(attachmentId);\n\n abortController?.abort();\n\n attachments.delete(attachmentId);\n abortControllers.delete(attachmentId);\n\n notifySubscribers();\n }\n\n function getSnapshot() {\n if (!cachedSnapshot) {\n cachedSnapshot = Array.from(attachments.values());\n }\n\n return cachedSnapshot;\n }\n\n // Clear all attachments and abort all ongoing uploads\n function clear() {\n abortControllers.forEach((controller) => controller.abort());\n abortControllers.clear();\n attachments.clear();\n\n notifySubscribers();\n }\n\n return {\n addAttachments,\n removeAttachment,\n getSnapshot,\n subscribe: eventSource.subscribe,\n clear,\n };\n}\n\nfunction preventBeforeUnloadDefault(event: BeforeUnloadEvent) {\n event.preventDefault();\n}\n\nexport function useComposerAttachmentsManager(\n defaultAttachments: CommentAttachment[],\n options: ComposerAttachmentsManagerOptions\n) {\n const client = useClient();\n const frozenDefaultAttachments = useInitial(defaultAttachments);\n const frozenAttachmentsManager = useInitial(() =>\n createComposerAttachmentsManager(client, options.roomId, options)\n );\n\n // Initialize default attachments on mount\n useEffect(() => {\n frozenAttachmentsManager.addAttachments(frozenDefaultAttachments);\n }, [frozenDefaultAttachments, frozenAttachmentsManager]);\n\n // Clear on unmount\n useEffect(() => {\n return () => {\n frozenAttachmentsManager.clear();\n };\n }, [frozenAttachmentsManager]);\n\n const attachments = useSyncExternalStore(\n frozenAttachmentsManager.subscribe,\n frozenAttachmentsManager.getSnapshot,\n frozenAttachmentsManager.getSnapshot\n );\n\n const isUploadingAttachments = useMemo(() => {\n return attachments.some(\n (attachment) =>\n attachment.type === \"localAttachment\" &&\n attachment.status === \"uploading\"\n );\n }, [attachments]);\n\n useEffect(() => {\n if (!isUploadingAttachments) {\n return;\n }\n\n window.addEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n\n return () => {\n window.removeEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n };\n }, [isUploadingAttachments]);\n\n return {\n attachments,\n isUploadingAttachments,\n addAttachments: frozenAttachmentsManager.addAttachments,\n removeAttachment: frozenAttachmentsManager.removeAttachment,\n clearAttachments: frozenAttachmentsManager.clear,\n };\n}\n"],"names":["inline"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/primitives/Composer/utils.ts"],"sourcesContent":["import type {\n DetectOverflowOptions,\n Placement,\n UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport {\n autoUpdate,\n flip,\n hide,\n inline,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport type {\n Client,\n CommentAttachment,\n CommentBody,\n CommentBodyLink,\n CommentBodyMention,\n CommentLocalAttachment,\n CommentMixedAttachment,\n} from \"@liveblocks/core\";\nimport { HttpError, kInternal, makeEventSource } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport type { DragEvent } from \"react\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\n\nimport {\n FLOATING_ELEMENT_COLLISION_PADDING,\n FLOATING_ELEMENT_SIDE_OFFSET,\n} from \"../../constants\";\nimport type {\n ComposerBody,\n ComposerBodyAutoLink,\n ComposerBodyCustomLink,\n ComposerBodyMention,\n ComposerBodyText,\n Direction,\n} from \"../../types\";\nimport { getFiles } from \"../../utils/data-transfer\";\nimport { exists } from \"../../utils/exists\";\nimport { useInitial } from \"../../utils/use-initial\";\nimport { useLatest } from \"../../utils/use-latest\";\nimport {\n isCommentBodyLink,\n isCommentBodyMention,\n isCommentBodyText,\n} from \"../Comment/utils\";\nimport { isText } from \"../slate/utils/is-text\";\nimport { useComposer, useComposerAttachmentsContext } from \"./contexts\";\nimport { isComposerBodyAutoLink } from \"./slate/plugins/auto-links\";\nimport { isComposerBodyCustomLink } from \"./slate/plugins/custom-links\";\nimport { isComposerBodyMention } from \"./slate/plugins/mentions\";\nimport type { FloatingAlignment, FloatingPosition } from \"./types\";\n\nexport function composerBodyMentionToCommentBodyMention(\n mention: ComposerBodyMention\n): CommentBodyMention {\n const { children: _, ...commentBodyMention } = mention;\n\n return commentBodyMention;\n}\n\nexport function composerBodyAutoLinkToCommentBodyLink(\n link: ComposerBodyAutoLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n };\n}\n\nexport function composerBodyCustomLinkToCommentBodyLink(\n link: ComposerBodyCustomLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n text: link.children.map((child) => child.text).join(\"\"),\n };\n}\n\nexport function commentBodyMentionToComposerBodyMention(\n mention: CommentBodyMention\n): ComposerBodyMention {\n return {\n ...mention,\n children: [{ text: \"\" }],\n };\n}\n\nexport function commentBodyLinkToComposerBodyLink(\n link: CommentBodyLink\n): ComposerBodyAutoLink | ComposerBodyCustomLink {\n if (link.text) {\n return {\n type: \"custom-link\",\n url: link.url,\n children: [{ text: link.text }],\n };\n } else {\n return {\n type: \"auto-link\",\n url: link.url,\n children: [{ text: link.url }],\n };\n }\n}\n\nexport function composerBodyToCommentBody(body: ComposerBody): CommentBody {\n return {\n version: 1,\n content: body\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isComposerBodyMention(inline)) {\n return composerBodyMentionToCommentBodyMention(inline);\n }\n\n if (isComposerBodyAutoLink(inline)) {\n return composerBodyAutoLinkToCommentBodyLink(inline);\n }\n\n if (isComposerBodyCustomLink(inline)) {\n return composerBodyCustomLinkToCommentBodyLink(inline);\n }\n\n if (isText(inline)) {\n return inline;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists),\n };\n}\n\nconst emptyComposerBody: ComposerBody = [];\n\nexport function commentBodyToComposerBody(body: CommentBody): ComposerBody {\n if (!body || !body?.content) {\n return emptyComposerBody;\n }\n\n return body.content\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isCommentBodyMention(inline)) {\n return commentBodyMentionToComposerBodyMention(inline);\n }\n\n if (isCommentBodyLink(inline)) {\n return commentBodyLinkToComposerBodyLink(inline);\n }\n\n if (isCommentBodyText(inline)) {\n return inline as ComposerBodyText;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists);\n}\n\nexport function getRtlFloatingAlignment(\n alignment: FloatingAlignment\n): FloatingAlignment {\n switch (alignment) {\n case \"start\":\n return \"end\";\n case \"end\":\n return \"start\";\n default:\n return \"center\";\n }\n}\n\nexport function getSideAndAlignFromFloatingPlacement(placement: Placement) {\n const [side, align = \"center\"] = placement.split(\"-\");\n\n return [side, align] as const;\n}\n\n// Copy `z-index` from content to wrapper.\n// Inspired by https://github.com/radix-ui/primitives/blob/main/packages/react/popper/src/Popper.tsx\nexport function useContentZIndex() {\n const [content, setContent] = useState<HTMLDivElement | null>(null);\n const contentRef = useCallback(setContent, [setContent]);\n const [contentZIndex, setContentZIndex] = useState<string>();\n\n useLayoutEffect(() => {\n if (content) {\n setContentZIndex(window.getComputedStyle(content).zIndex);\n }\n }, [content]);\n\n return [contentRef, contentZIndex] as const;\n}\n\nexport function useFloatingWithOptions({\n type = \"bounds\",\n position,\n alignment,\n dir,\n open,\n}: {\n type?: \"bounds\" | \"range\";\n position: FloatingPosition;\n alignment: FloatingAlignment;\n dir: Direction | undefined;\n open: boolean;\n}) {\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: FLOATING_ELEMENT_COLLISION_PADDING,\n };\n\n const middleware = [\n type === \"range\" ? inline(detectOverflowOptions) : null,\n flip({ ...detectOverflowOptions, crossAxis: false }),\n hide(detectOverflowOptions),\n shift({\n ...detectOverflowOptions,\n limiter: limitShift(),\n }),\n type === \"range\" ? offset(FLOATING_ELEMENT_SIDE_OFFSET) : null,\n size({\n ...detectOverflowOptions,\n apply({ availableWidth, availableHeight, elements }) {\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-width\",\n `${availableWidth}px`\n );\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-height\",\n `${availableHeight}px`\n );\n },\n }),\n ];\n\n return {\n strategy: \"fixed\",\n placement:\n alignment === \"center\"\n ? position\n : (`${position}-${dir === \"rtl\" ? getRtlFloatingAlignment(alignment) : alignment}` as Placement),\n middleware,\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [alignment, position, dir, type]);\n\n return useFloating({\n ...floatingOptions,\n open,\n });\n}\n\nexport function useComposerAttachmentsDropArea<\n T extends HTMLElement = HTMLElement,\n>({\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n disabled,\n}: {\n onDragEnter?: (event: DragEvent<T>) => void;\n onDragLeave?: (event: DragEvent<T>) => void;\n onDragOver?: (event: DragEvent<T>) => void;\n onDrop?: (event: DragEvent<T>) => void;\n disabled?: boolean;\n}) {\n const { isDisabled: isComposerDisabled } = useComposer();\n const isDisabled = isComposerDisabled || disabled;\n const { createAttachments } = useComposerAttachmentsContext();\n const [isDraggingOver, setDraggingOver] = useState(false);\n const latestIsDraggingOver = useLatest(isDraggingOver);\n\n const handleDragEnter = useCallback(\n (event: DragEvent<T>) => {\n onDragEnter?.(event);\n\n if (\n latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n const dataTransfer = event.dataTransfer;\n\n if (!dataTransfer.types.includes(\"Files\")) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(true);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragEnter, isDisabled]\n );\n\n const handleDragLeave = useCallback(\n (event: DragEvent<T>) => {\n onDragLeave?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n // Ignore drag leave events that are not actually leaving the drop area\n if (\n event.relatedTarget\n ? event.relatedTarget === event.currentTarget ||\n event.currentTarget.contains(event.relatedTarget as HTMLElement)\n : event.currentTarget !== event.target\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragLeave, isDisabled]\n );\n\n const handleDragOver = useCallback(\n (event: DragEvent<T>) => {\n onDragOver?.(event);\n\n if (isDisabled || event.isDefaultPrevented()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n },\n [onDragOver, isDisabled]\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<T>) => {\n onDrop?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n\n const files = getFiles(event.dataTransfer);\n\n createAttachments(files);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDrop, isDisabled, createAttachments]\n );\n\n return [\n isDraggingOver,\n {\n onDragEnter: handleDragEnter,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n \"data-drop\": isDraggingOver ? \"\" : undefined,\n \"data-disabled\": isDisabled ? \"\" : undefined,\n } as const,\n ] as const;\n}\n\ninterface ComposerAttachmentsManagerOptions {\n maxFileSize: number;\n roomId: string;\n}\n\nexport class AttachmentTooLargeError extends Error {\n origin: \"client\" | \"server\";\n name = \"AttachmentTooLargeError\";\n\n constructor(message: string, origin: \"client\" | \"server\" = \"client\") {\n super(message);\n this.origin = origin;\n }\n}\n\nfunction createComposerAttachmentsManager(\n client: Client,\n roomId: string,\n options: ComposerAttachmentsManagerOptions\n) {\n const attachments: Map<string, CommentMixedAttachment> = new Map();\n const abortControllers: Map<string, AbortController> = new Map();\n const eventSource = makeEventSource<void>();\n let cachedSnapshot: CommentMixedAttachment[] | null = null;\n\n function notifySubscribers() {\n // Invalidate the cached snapshot\n cachedSnapshot = null;\n eventSource.notify();\n }\n\n function uploadAttachment(attachment: CommentLocalAttachment) {\n const abortController = new AbortController();\n abortControllers.set(attachment.id, abortController);\n\n client[kInternal].httpClient\n .uploadAttachment({\n roomId,\n attachment,\n signal: abortController.signal,\n })\n .then(() => {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploaded\",\n });\n notifySubscribers();\n })\n .catch((error) => {\n if (\n error instanceof Error &&\n error.name !== \"AbortError\" &&\n error.name !== \"TimeoutError\"\n ) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error:\n error instanceof HttpError && error.status === 413\n ? new AttachmentTooLargeError(\"File is too large.\", \"server\")\n : error,\n });\n notifySubscribers();\n }\n });\n }\n\n function addAttachments(addedAttachments: CommentMixedAttachment[]) {\n if (addedAttachments.length === 0) {\n return;\n }\n\n // Ignore attachments that are already in the manager\n const newAttachments = addedAttachments.filter(\n (attachment) => !attachments.has(attachment.id)\n );\n\n const attachmentsToUpload: CommentLocalAttachment[] = [];\n\n // Add all the new attachments to the manager\n for (const attachment of newAttachments) {\n if (attachment.type === \"localAttachment\") {\n // The file is too large to be uploaded\n if (attachment.file.size > options.maxFileSize) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error: new AttachmentTooLargeError(\"File is too large.\", \"client\"),\n });\n\n continue;\n }\n\n // Otherwise, mark the attachment to be uploaded\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploading\",\n });\n attachmentsToUpload.push(attachment);\n } else {\n attachments.set(attachment.id, attachment);\n }\n }\n\n // Notify subscribers about the new attachments that were added\n if (newAttachments.length > 0) {\n notifySubscribers();\n }\n\n // Upload all the new local attachments\n for (const attachment of attachmentsToUpload) {\n uploadAttachment(attachment);\n }\n }\n\n function removeAttachment(attachmentId: string) {\n const abortController = abortControllers.get(attachmentId);\n\n abortController?.abort();\n\n attachments.delete(attachmentId);\n abortControllers.delete(attachmentId);\n\n notifySubscribers();\n }\n\n function getSnapshot() {\n if (!cachedSnapshot) {\n cachedSnapshot = Array.from(attachments.values());\n }\n\n return cachedSnapshot;\n }\n\n // Clear all attachments and abort all ongoing uploads\n function clear() {\n abortControllers.forEach((controller) => controller.abort());\n abortControllers.clear();\n attachments.clear();\n\n notifySubscribers();\n }\n\n return {\n addAttachments,\n removeAttachment,\n getSnapshot,\n subscribe: eventSource.subscribe,\n clear,\n };\n}\n\nfunction preventBeforeUnloadDefault(event: BeforeUnloadEvent) {\n event.preventDefault();\n}\n\nexport function useComposerAttachmentsManager(\n defaultAttachments: CommentAttachment[],\n options: ComposerAttachmentsManagerOptions\n) {\n const client = useClient();\n const frozenDefaultAttachments = useInitial(defaultAttachments);\n const frozenAttachmentsManager = useInitial(() =>\n createComposerAttachmentsManager(client, options.roomId, options)\n );\n\n // Initialize default attachments on mount\n useEffect(() => {\n frozenAttachmentsManager.addAttachments(frozenDefaultAttachments);\n }, [frozenDefaultAttachments, frozenAttachmentsManager]);\n\n // Clear on unmount\n useEffect(() => {\n return () => {\n frozenAttachmentsManager.clear();\n };\n }, [frozenAttachmentsManager]);\n\n const attachments = useSyncExternalStore(\n frozenAttachmentsManager.subscribe,\n frozenAttachmentsManager.getSnapshot,\n frozenAttachmentsManager.getSnapshot\n );\n\n const isUploadingAttachments = useMemo(() => {\n return attachments.some(\n (attachment) =>\n attachment.type === \"localAttachment\" &&\n attachment.status === \"uploading\"\n );\n }, [attachments]);\n\n useEffect(() => {\n if (!isUploadingAttachments) {\n return;\n }\n\n window.addEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n\n return () => {\n window.removeEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n };\n }, [isUploadingAttachments]);\n\n return {\n attachments,\n isUploadingAttachments,\n addAttachments: frozenAttachmentsManager.addAttachments,\n removeAttachment: frozenAttachmentsManager.removeAttachment,\n clearAttachments: frozenAttachmentsManager.clear,\n };\n}\n"],"names":["inline"],"mappings":"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"}
@@ -423,9 +423,13 @@ function MarkdownInlineToken({
423
423
  case "link": {
424
424
  let href;
425
425
  try {
426
- const url = new URL(token.href);
426
+ const url = new URL(token.href, window.location.href);
427
427
  if (url.protocol === "http:" || url.protocol === "https:") {
428
- href = url.toString();
428
+ if (url.origin === window.location.origin) {
429
+ href = url.pathname + url.search + url.hash;
430
+ } else {
431
+ href = url.toString();
432
+ }
429
433
  } else {
430
434
  href = null;
431
435
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Markdown.cjs","sources":["../../src/primitives/Markdown.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport { Lexer, type Tokens } from \"marked\";\nimport {\n type ComponentType,\n forwardRef,\n memo,\n type ReactNode,\n useMemo,\n} from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\n\nexport type MarkdownComponents = {\n CodeBlock: ComponentType<MarkdownComponentsCodeBlockProps>;\n Link: ComponentType<MarkdownComponentsLinkProps>;\n Heading: ComponentType<MarkdownComponentsHeadingProps>;\n Image: ComponentType<MarkdownComponentsImageProps>;\n Blockquote: ComponentType<MarkdownComponentsBlockquoteProps>;\n\n // Paragraph\n // Inline (text, strong, em, code, del)\n // Table\n // List\n // Separator (hr)\n};\n\nexport interface MarkdownComponentsBlockquoteProps {\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsImageProps {\n src: string;\n alt: string;\n title?: string;\n}\n\nexport interface MarkdownComponentsHeadingProps {\n level: 1 | 2 | 3 | 4 | 5 | 6;\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsLinkProps {\n href: string;\n title?: string;\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsCodeBlockProps {\n code: string;\n language?: string;\n}\n\nexport interface MarkdownProps\n extends Omit<ComponentPropsWithSlot<\"div\">, \"children\"> {\n content: string;\n components?: Partial<MarkdownComponents>;\n}\n\n/**\n * Block level tokens include:\n * - space\n * - code\n * - blockquote\n * - html\n * - heading\n * - hr\n * - list\n * - paragraph\n * - table\n */\nexport type BlockToken =\n | Tokens.Space\n | Tokens.Code\n | Tokens.Blockquote\n | Tokens.HTML\n | Tokens.Heading\n | Tokens.Hr\n | Tokens.List\n | Tokens.Paragraph\n | Tokens.Table;\n\n/**\n * Inline tokens include:\n * - strong\n * - em\n * - codespan\n * - br\n * - del\n * - link\n * - image\n * - text\n */\ntype InlineToken =\n | Tokens.Strong\n | Tokens.Em\n | Tokens.Codespan\n | Tokens.Br\n | Tokens.Del\n | Tokens.Link\n | Tokens.Image\n | Tokens.Text\n | Tokens.Escape;\n\nconst defaultComponents: MarkdownComponents = {\n CodeBlock: ({ language, code }) => {\n return (\n <pre data-language={language ?? undefined}>\n <code>{code}</code>\n </pre>\n );\n },\n Link: ({ href, title, children }) => {\n return (\n <a href={href} title={title} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </a>\n );\n },\n Heading: ({ level, children }) => {\n const Heading = `h${level}` as const;\n\n return <Heading>{children}</Heading>;\n },\n Image: ({ src, alt, title }) => {\n return <img src={src} alt={alt} title={title} />;\n },\n Blockquote: ({ children }) => {\n return <blockquote>{children}</blockquote>;\n },\n};\n\nexport const Markdown = forwardRef<HTMLDivElement, MarkdownProps>(\n ({ content, components, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"div\";\n const tokens = useMemo(() => {\n return new Lexer().lex(content);\n }, [content]);\n\n return (\n <Component {...props} ref={forwardedRef}>\n {tokens.map((token, index) => {\n return (\n <MemoizedMarkdownBlockToken\n token={token as BlockToken}\n key={index}\n components={components}\n />\n );\n })}\n </Component>\n );\n }\n);\n\nconst MemoizedMarkdownBlockToken = memo(\n ({\n token,\n components,\n }: {\n token: BlockToken;\n components?: Partial<MarkdownComponents>;\n }) => {\n return <MarkdownBlockToken token={token} components={components} />;\n },\n (prevProps, nextProps) => {\n const prevToken = prevProps.token;\n const nextToken = nextProps.token;\n if (prevToken.raw.length !== nextToken.raw.length) {\n return false;\n }\n if (prevToken.type !== nextToken.type) {\n return false;\n }\n return prevToken.raw === nextToken.raw;\n }\n);\n\nexport function MarkdownBlockToken({\n token,\n components,\n}: {\n token: BlockToken;\n components: Partial<MarkdownComponents> | undefined;\n}) {\n switch (token.type) {\n case \"space\": {\n return null;\n }\n case \"code\": {\n let language: string | undefined = undefined;\n if (token.lang !== undefined) {\n language = token.lang.match(/^\\S*/)?.[0] ?? undefined;\n }\n\n const CodeBlock = components?.CodeBlock ?? defaultComponents.CodeBlock;\n\n return <CodeBlock language={language} code={token.text} />;\n }\n case \"blockquote\": {\n const tokens: BlockToken[] = [];\n for (let i = 0; i < token.tokens.length; i++) {\n switch (token.tokens[i]!.type) {\n case \"space\":\n case \"code\":\n case \"blockquote\":\n case \"html\":\n case \"heading\":\n case \"hr\":\n case \"list\":\n case \"paragraph\":\n case \"table\": {\n tokens.push(token.tokens[i] as BlockToken);\n break;\n }\n case \"text\": {\n const texts: Tokens.Text[] = [token.tokens[i] as Tokens.Text];\n while (\n i + 1 < token.tokens.length &&\n token.tokens[i + 1]!.type === \"text\"\n ) {\n i++;\n texts.push(token.tokens[i] as Tokens.Text);\n }\n tokens.push({\n type: \"paragraph\",\n tokens: texts,\n raw: texts.map((text) => text.raw).join(\"\"),\n text: texts.map((text) => text.text).join(\"\"),\n } satisfies Tokens.Paragraph);\n break;\n }\n default: {\n continue;\n }\n }\n }\n\n const Blockquote = components?.Blockquote ?? defaultComponents.Blockquote;\n\n return (\n <Blockquote>\n {tokens.map((token, index) => {\n return (\n <MarkdownBlockToken\n token={token}\n key={index}\n components={components}\n />\n );\n })}\n </Blockquote>\n );\n }\n case \"html\": {\n return token.text;\n }\n case \"heading\": {\n const Heading = components?.Heading ?? defaultComponents.Heading;\n\n return (\n <Heading level={clampHeadingLevel(token.depth)}>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </Heading>\n );\n }\n case \"hr\": {\n return <hr />;\n }\n case \"list\": {\n const ListTag = token.ordered ? \"ol\" : \"ul\";\n\n return (\n <ListTag>\n {token.items.map((item, index) => {\n // A 'loose' list item in Markdown is one where the content is wrapped in a paragraph (or potentially other block) token\n if (item.loose) {\n // If the list item is a task list item, we need to add a checkbox to the start of the token\n if (item.task) {\n const tokens = [...item.tokens];\n if (tokens[0]?.type === \"paragraph\") {\n const token = tokens[0] as Tokens.Paragraph;\n token.tokens.unshift(\n {\n type: \"checkbox\",\n checked: item.checked,\n raw: \"\",\n },\n {\n type: \"text\",\n text: \" \",\n raw: \" \",\n escaped: false,\n }\n );\n } else {\n tokens.unshift(\n {\n type: \"checkbox\",\n checked: item.checked,\n raw: \"\",\n },\n {\n type: \"text\",\n text: \" \",\n raw: \" \",\n escaped: false,\n }\n );\n }\n\n const items: BlockToken[] = [];\n for (let i = 0; i < tokens.length; i++) {\n switch (tokens[i]!.type) {\n case \"space\":\n case \"code\":\n case \"blockquote\":\n case \"html\":\n case \"heading\":\n case \"hr\":\n case \"list\":\n case \"paragraph\":\n case \"table\": {\n items.push(tokens[i] as BlockToken);\n break;\n }\n case \"text\":\n case \"checkbox\": {\n const texts: (\n | Tokens.Text\n | {\n type: \"checkbox\";\n checked: boolean;\n raw: string;\n text: string;\n }\n )[] = [\n tokens[i] as\n | Tokens.Text\n | {\n type: \"checkbox\";\n checked: boolean;\n raw: string;\n text: string;\n },\n ];\n while (\n i + 1 < tokens.length &&\n tokens[i + 1]!.type === \"text\"\n ) {\n i++;\n texts.push(tokens[i] as Tokens.Text);\n }\n items.push({\n type: \"paragraph\",\n tokens: texts,\n raw: texts.map((text) => text.raw).join(\"\"),\n text: texts.map((text) => text.text).join(\"\"),\n } satisfies Tokens.Paragraph);\n break;\n }\n default: {\n continue;\n }\n }\n }\n\n return (\n <li key={index}>\n {items.map((token, index) => {\n return (\n <MarkdownBlockToken\n token={token}\n key={index}\n components={components}\n />\n );\n })}\n </li>\n );\n } else {\n const tokens: BlockToken[] = [];\n for (let i = 0; i < item.tokens.length; i++) {\n switch (item.tokens[i]!.type) {\n case \"space\":\n case \"code\":\n case \"blockquote\":\n case \"html\":\n case \"heading\":\n case \"hr\":\n case \"list\":\n case \"paragraph\":\n case \"table\": {\n tokens.push(item.tokens[i] as BlockToken);\n break;\n }\n case \"text\": {\n const texts: Tokens.Text[] = [\n item.tokens[i] as Tokens.Text,\n ];\n while (\n i + 1 < item.tokens.length &&\n item.tokens[i + 1]!.type === \"text\"\n ) {\n i++;\n texts.push(item.tokens[i] as Tokens.Text);\n }\n tokens.push({\n type: \"paragraph\",\n tokens: texts,\n raw: texts.map((text) => text.raw).join(\"\"),\n text: texts.map((text) => text.text).join(\"\"),\n } satisfies Tokens.Paragraph);\n break;\n }\n default: {\n continue;\n }\n }\n }\n\n return (\n <li key={index}>\n {tokens.map((token, index) => {\n return (\n <MarkdownBlockToken\n token={token}\n key={index}\n components={components}\n />\n );\n })}\n </li>\n );\n }\n } else {\n const Items: ReactNode = item.tokens.map((token, index) => {\n switch (token.type) {\n case \"space\":\n case \"code\":\n case \"blockquote\":\n case \"html\":\n case \"heading\":\n case \"hr\":\n case \"list\":\n case \"paragraph\":\n case \"table\": {\n return (\n <MarkdownBlockToken\n token={token as BlockToken}\n key={index}\n components={components}\n />\n );\n }\n case \"text\": {\n return (\n <MarkdownInlineToken\n token={token as Tokens.Text}\n key={index}\n components={components}\n />\n );\n }\n default: {\n return null;\n }\n }\n });\n if (item.task) {\n return (\n <li key={index}>\n <input type=\"checkbox\" disabled checked={item.checked} />{\" \"}\n {Items}\n </li>\n );\n } else {\n return <li key={index}>{Items}</li>;\n }\n }\n })}\n </ListTag>\n );\n }\n case \"paragraph\": {\n return (\n <p>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </p>\n );\n }\n case \"table\": {\n return (\n <table>\n <thead>\n <tr>\n {token.header.map((cell, index) => {\n return (\n <th key={index} align={cell.align ?? undefined}>\n {cell.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {token.rows.map((row, index) => {\n return (\n <tr key={index}>\n {row.map((cell, index) => {\n return (\n <td key={index} align={cell.align ?? undefined}>\n {cell.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n }\n }\n}\n\nfunction MarkdownInlineToken({\n token,\n components,\n}: {\n token: InlineToken | { type: \"checkbox\"; checked: boolean };\n components: Partial<MarkdownComponents> | undefined;\n}) {\n switch (token.type) {\n case \"strong\": {\n return (\n <strong>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </strong>\n );\n }\n case \"em\": {\n return (\n <em>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </em>\n );\n }\n case \"codespan\": {\n return <code>{parseHtmlEntities(token.text)}</code>;\n }\n case \"br\": {\n return <br />;\n }\n case \"del\": {\n return (\n <del>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </del>\n );\n }\n case \"link\": {\n let href: string | null;\n try {\n const url = new URL(token.href);\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n href = url.toString();\n } else {\n href = null;\n }\n } catch {\n href = null;\n }\n\n if (href === null) {\n return token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ));\n }\n\n const Link = components?.Link ?? defaultComponents.Link;\n\n return (\n <Link href={href} title={token.title ?? undefined}>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </Link>\n );\n }\n case \"image\": {\n let href: string | null;\n try {\n const url = new URL(token.href);\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n href = url.toString();\n } else {\n href = null;\n }\n } catch {\n href = null;\n }\n\n if (href === null) {\n return token.text;\n }\n\n const Image = components?.Image ?? defaultComponents.Image;\n\n return (\n <Image src={href} alt={token.text} title={token.title ?? undefined} />\n );\n }\n case \"text\": {\n if (token.tokens !== undefined) {\n return token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ));\n } else {\n return parseHtmlEntities(token.text);\n }\n }\n case \"escape\": {\n return token.text;\n }\n case \"checkbox\": {\n return <input type=\"checkbox\" disabled checked={token.checked} />;\n }\n default: {\n return null;\n }\n }\n}\n\nfunction parseHtmlEntities(input: string) {\n const document = new DOMParser().parseFromString(\n `<!doctype html><body>${input}`,\n \"text/html\"\n );\n\n return document.body.textContent;\n}\n\nfunction clampHeadingLevel(level: number) {\n return Math.max(1, Math.min(6, level)) as 1 | 2 | 3 | 4 | 5 | 6;\n}\n"],"names":["jsx","forwardRef","Slot","useMemo","Lexer","memo","token","index","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"Markdown.cjs","sources":["../../src/primitives/Markdown.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport { Lexer, type Tokens } from \"marked\";\nimport {\n type ComponentType,\n forwardRef,\n memo,\n type ReactNode,\n useMemo,\n} from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\n\nexport type MarkdownComponents = {\n CodeBlock: ComponentType<MarkdownComponentsCodeBlockProps>;\n Link: ComponentType<MarkdownComponentsLinkProps>;\n Heading: ComponentType<MarkdownComponentsHeadingProps>;\n Image: ComponentType<MarkdownComponentsImageProps>;\n Blockquote: ComponentType<MarkdownComponentsBlockquoteProps>;\n\n // Paragraph\n // Inline (text, strong, em, code, del)\n // Table\n // List\n // Separator (hr)\n};\n\nexport interface MarkdownComponentsBlockquoteProps {\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsImageProps {\n src: string;\n alt: string;\n title?: string;\n}\n\nexport interface MarkdownComponentsHeadingProps {\n level: 1 | 2 | 3 | 4 | 5 | 6;\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsLinkProps {\n href: string;\n title?: string;\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsCodeBlockProps {\n code: string;\n language?: string;\n}\n\nexport interface MarkdownProps extends ComponentPropsWithSlot<\"div\"> {\n content: string;\n components?: Partial<MarkdownComponents>;\n}\n\n/**\n * Block level tokens include:\n * - space\n * - code\n * - blockquote\n * - html\n * - heading\n * - hr\n * - list\n * - paragraph\n * - table\n */\nexport type BlockToken =\n | Tokens.Space\n | Tokens.Code\n | Tokens.Blockquote\n | Tokens.HTML\n | Tokens.Heading\n | Tokens.Hr\n | Tokens.List\n | Tokens.Paragraph\n | Tokens.Table;\n\n/**\n * Inline tokens include:\n * - strong\n * - em\n * - codespan\n * - br\n * - del\n * - link\n * - image\n * - text\n */\ntype InlineToken =\n | Tokens.Strong\n | Tokens.Em\n | Tokens.Codespan\n | Tokens.Br\n | Tokens.Del\n | Tokens.Link\n | Tokens.Image\n | Tokens.Text\n | Tokens.Escape;\n\nconst defaultComponents: MarkdownComponents = {\n CodeBlock: ({ language, code }) => {\n return (\n <pre data-language={language ?? undefined}>\n <code>{code}</code>\n </pre>\n );\n },\n Link: ({ href, title, children }) => {\n return (\n <a href={href} title={title} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </a>\n );\n },\n Heading: ({ level, children }) => {\n const Heading = `h${level}` as const;\n\n return <Heading>{children}</Heading>;\n },\n Image: ({ src, alt, title }) => {\n return <img src={src} alt={alt} title={title} />;\n },\n Blockquote: ({ children }) => {\n return <blockquote>{children}</blockquote>;\n },\n};\n\nexport const Markdown = forwardRef<HTMLDivElement, MarkdownProps>(\n ({ content, components, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"div\";\n const tokens = useMemo(() => {\n return new Lexer().lex(content);\n }, [content]);\n\n return (\n <Component {...props} ref={forwardedRef}>\n {tokens.map((token, index) => {\n return (\n <MemoizedMarkdownBlockToken\n token={token as BlockToken}\n key={index}\n components={components}\n />\n );\n })}\n </Component>\n );\n }\n);\n\nconst MemoizedMarkdownBlockToken = memo(\n ({\n token,\n components,\n }: {\n token: BlockToken;\n components?: Partial<MarkdownComponents>;\n }) => {\n return <MarkdownBlockToken token={token} components={components} />;\n },\n (prevProps, nextProps) => {\n const prevToken = prevProps.token;\n const nextToken = nextProps.token;\n if (prevToken.raw.length !== nextToken.raw.length) {\n return false;\n }\n if (prevToken.type !== nextToken.type) {\n return false;\n }\n return prevToken.raw === nextToken.raw;\n }\n);\n\nexport function MarkdownBlockToken({\n token,\n components,\n}: {\n token: BlockToken;\n components: Partial<MarkdownComponents> | undefined;\n}) {\n switch (token.type) {\n case \"space\": {\n return null;\n }\n case \"code\": {\n let language: string | undefined = undefined;\n if (token.lang !== undefined) {\n language = token.lang.match(/^\\S*/)?.[0] ?? undefined;\n }\n\n const CodeBlock = components?.CodeBlock ?? defaultComponents.CodeBlock;\n\n return <CodeBlock language={language} code={token.text} />;\n }\n case \"blockquote\": {\n const tokens: BlockToken[] = [];\n for (let i = 0; i < token.tokens.length; i++) {\n switch (token.tokens[i]!.type) {\n case \"space\":\n case \"code\":\n case \"blockquote\":\n case \"html\":\n case \"heading\":\n case \"hr\":\n case \"list\":\n case \"paragraph\":\n case \"table\": {\n tokens.push(token.tokens[i] as BlockToken);\n break;\n }\n case \"text\": {\n const texts: Tokens.Text[] = [token.tokens[i] as Tokens.Text];\n while (\n i + 1 < token.tokens.length &&\n token.tokens[i + 1]!.type === \"text\"\n ) {\n i++;\n texts.push(token.tokens[i] as Tokens.Text);\n }\n tokens.push({\n type: \"paragraph\",\n tokens: texts,\n raw: texts.map((text) => text.raw).join(\"\"),\n text: texts.map((text) => text.text).join(\"\"),\n } satisfies Tokens.Paragraph);\n break;\n }\n default: {\n continue;\n }\n }\n }\n\n const Blockquote = components?.Blockquote ?? defaultComponents.Blockquote;\n\n return (\n <Blockquote>\n {tokens.map((token, index) => {\n return (\n <MarkdownBlockToken\n token={token}\n key={index}\n components={components}\n />\n );\n })}\n </Blockquote>\n );\n }\n case \"html\": {\n return token.text;\n }\n case \"heading\": {\n const Heading = components?.Heading ?? defaultComponents.Heading;\n\n return (\n <Heading level={clampHeadingLevel(token.depth)}>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </Heading>\n );\n }\n case \"hr\": {\n return <hr />;\n }\n case \"list\": {\n const ListTag = token.ordered ? \"ol\" : \"ul\";\n\n return (\n <ListTag>\n {token.items.map((item, index) => {\n // A 'loose' list item in Markdown is one where the content is wrapped in a paragraph (or potentially other block) token\n if (item.loose) {\n // If the list item is a task list item, we need to add a checkbox to the start of the token\n if (item.task) {\n const tokens = [...item.tokens];\n if (tokens[0]?.type === \"paragraph\") {\n const token = tokens[0] as Tokens.Paragraph;\n token.tokens.unshift(\n {\n type: \"checkbox\",\n checked: item.checked,\n raw: \"\",\n },\n {\n type: \"text\",\n text: \" \",\n raw: \" \",\n escaped: false,\n }\n );\n } else {\n tokens.unshift(\n {\n type: \"checkbox\",\n checked: item.checked,\n raw: \"\",\n },\n {\n type: \"text\",\n text: \" \",\n raw: \" \",\n escaped: false,\n }\n );\n }\n\n const items: BlockToken[] = [];\n for (let i = 0; i < tokens.length; i++) {\n switch (tokens[i]!.type) {\n case \"space\":\n case \"code\":\n case \"blockquote\":\n case \"html\":\n case \"heading\":\n case \"hr\":\n case \"list\":\n case \"paragraph\":\n case \"table\": {\n items.push(tokens[i] as BlockToken);\n break;\n }\n case \"text\":\n case \"checkbox\": {\n const texts: (\n | Tokens.Text\n | {\n type: \"checkbox\";\n checked: boolean;\n raw: string;\n text: string;\n }\n )[] = [\n tokens[i] as\n | Tokens.Text\n | {\n type: \"checkbox\";\n checked: boolean;\n raw: string;\n text: string;\n },\n ];\n while (\n i + 1 < tokens.length &&\n tokens[i + 1]!.type === \"text\"\n ) {\n i++;\n texts.push(tokens[i] as Tokens.Text);\n }\n items.push({\n type: \"paragraph\",\n tokens: texts,\n raw: texts.map((text) => text.raw).join(\"\"),\n text: texts.map((text) => text.text).join(\"\"),\n } satisfies Tokens.Paragraph);\n break;\n }\n default: {\n continue;\n }\n }\n }\n\n return (\n <li key={index}>\n {items.map((token, index) => {\n return (\n <MarkdownBlockToken\n token={token}\n key={index}\n components={components}\n />\n );\n })}\n </li>\n );\n } else {\n const tokens: BlockToken[] = [];\n for (let i = 0; i < item.tokens.length; i++) {\n switch (item.tokens[i]!.type) {\n case \"space\":\n case \"code\":\n case \"blockquote\":\n case \"html\":\n case \"heading\":\n case \"hr\":\n case \"list\":\n case \"paragraph\":\n case \"table\": {\n tokens.push(item.tokens[i] as BlockToken);\n break;\n }\n case \"text\": {\n const texts: Tokens.Text[] = [\n item.tokens[i] as Tokens.Text,\n ];\n while (\n i + 1 < item.tokens.length &&\n item.tokens[i + 1]!.type === \"text\"\n ) {\n i++;\n texts.push(item.tokens[i] as Tokens.Text);\n }\n tokens.push({\n type: \"paragraph\",\n tokens: texts,\n raw: texts.map((text) => text.raw).join(\"\"),\n text: texts.map((text) => text.text).join(\"\"),\n } satisfies Tokens.Paragraph);\n break;\n }\n default: {\n continue;\n }\n }\n }\n\n return (\n <li key={index}>\n {tokens.map((token, index) => {\n return (\n <MarkdownBlockToken\n token={token}\n key={index}\n components={components}\n />\n );\n })}\n </li>\n );\n }\n } else {\n const Items: ReactNode = item.tokens.map((token, index) => {\n switch (token.type) {\n case \"space\":\n case \"code\":\n case \"blockquote\":\n case \"html\":\n case \"heading\":\n case \"hr\":\n case \"list\":\n case \"paragraph\":\n case \"table\": {\n return (\n <MarkdownBlockToken\n token={token as BlockToken}\n key={index}\n components={components}\n />\n );\n }\n case \"text\": {\n return (\n <MarkdownInlineToken\n token={token as Tokens.Text}\n key={index}\n components={components}\n />\n );\n }\n default: {\n return null;\n }\n }\n });\n if (item.task) {\n return (\n <li key={index}>\n <input type=\"checkbox\" disabled checked={item.checked} />{\" \"}\n {Items}\n </li>\n );\n } else {\n return <li key={index}>{Items}</li>;\n }\n }\n })}\n </ListTag>\n );\n }\n case \"paragraph\": {\n return (\n <p>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </p>\n );\n }\n case \"table\": {\n return (\n <table>\n <thead>\n <tr>\n {token.header.map((cell, index) => {\n return (\n <th key={index} align={cell.align ?? undefined}>\n {cell.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {token.rows.map((row, index) => {\n return (\n <tr key={index}>\n {row.map((cell, index) => {\n return (\n <td key={index} align={cell.align ?? undefined}>\n {cell.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n }\n }\n}\n\nfunction MarkdownInlineToken({\n token,\n components,\n}: {\n token: InlineToken | { type: \"checkbox\"; checked: boolean };\n components: Partial<MarkdownComponents> | undefined;\n}) {\n switch (token.type) {\n case \"strong\": {\n return (\n <strong>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </strong>\n );\n }\n case \"em\": {\n return (\n <em>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </em>\n );\n }\n case \"codespan\": {\n return <code>{parseHtmlEntities(token.text)}</code>;\n }\n case \"br\": {\n return <br />;\n }\n case \"del\": {\n return (\n <del>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </del>\n );\n }\n case \"link\": {\n let href: string | null;\n try {\n const url = new URL(token.href, window.location.href);\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n // If the link is relative to the current origin, we use the pathname, search, and hash to create a relative link.\n if (url.origin === window.location.origin) {\n href = url.pathname + url.search + url.hash;\n }\n // If the link is absolute, we use the full URL.\n else {\n href = url.toString();\n }\n } else {\n href = null;\n }\n } catch {\n href = null;\n }\n\n if (href === null) {\n return token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ));\n }\n\n const Link = components?.Link ?? defaultComponents.Link;\n\n return (\n <Link href={href} title={token.title ?? undefined}>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </Link>\n );\n }\n case \"image\": {\n let href: string | null;\n try {\n const url = new URL(token.href);\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n href = url.toString();\n } else {\n href = null;\n }\n } catch {\n href = null;\n }\n\n if (href === null) {\n return token.text;\n }\n\n const Image = components?.Image ?? defaultComponents.Image;\n\n return (\n <Image src={href} alt={token.text} title={token.title ?? undefined} />\n );\n }\n case \"text\": {\n if (token.tokens !== undefined) {\n return token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ));\n } else {\n return parseHtmlEntities(token.text);\n }\n }\n case \"escape\": {\n return token.text;\n }\n case \"checkbox\": {\n return <input type=\"checkbox\" disabled checked={token.checked} />;\n }\n default: {\n return null;\n }\n }\n}\n\nfunction parseHtmlEntities(input: string) {\n const document = new DOMParser().parseFromString(\n `<!doctype html><body>${input}`,\n \"text/html\"\n );\n\n return document.body.textContent;\n}\n\nfunction clampHeadingLevel(level: number) {\n return Math.max(1, Math.min(6, level)) as 1 | 2 | 3 | 4 | 5 | 6;\n}\n"],"names":["jsx","forwardRef","Slot","useMemo","Lexer","memo","token","index","jsxs"],"mappings":"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"}
@@ -421,9 +421,13 @@ function MarkdownInlineToken({
421
421
  case "link": {
422
422
  let href;
423
423
  try {
424
- const url = new URL(token.href);
424
+ const url = new URL(token.href, window.location.href);
425
425
  if (url.protocol === "http:" || url.protocol === "https:") {
426
- href = url.toString();
426
+ if (url.origin === window.location.origin) {
427
+ href = url.pathname + url.search + url.hash;
428
+ } else {
429
+ href = url.toString();
430
+ }
427
431
  } else {
428
432
  href = null;
429
433
  }