@azure/communication-react 1.19.0-alpha-202408010015 → 1.19.0-alpha-202408030014

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 (105) hide show
  1. package/dist/communication-react.d.ts +39 -32
  2. package/dist/dist-cjs/communication-react/{ChatMessageComponentAsRichTextEditBox-B0zbyF6Z.js → ChatMessageComponentAsRichTextEditBox-BBTJIosO.js} +52 -33
  3. package/dist/dist-cjs/communication-react/ChatMessageComponentAsRichTextEditBox-BBTJIosO.js.map +1 -0
  4. package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-BVOysnsq.js → RichTextSendBoxWrapper-C1Ev6MKx.js} +3 -3
  5. package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-BVOysnsq.js.map → RichTextSendBoxWrapper-C1Ev6MKx.js.map} +1 -1
  6. package/dist/dist-cjs/communication-react/{index-YIP5Cyt3.js → index-B74o7NiP.js} +587 -280
  7. package/dist/dist-cjs/communication-react/index-B74o7NiP.js.map +1 -0
  8. package/dist/dist-cjs/communication-react/index.js +2 -2
  9. package/dist/dist-esm/acs-ui-common/src/constants.d.ts +5 -0
  10. package/dist/dist-esm/acs-ui-common/src/constants.js +6 -0
  11. package/dist/dist-esm/acs-ui-common/src/constants.js.map +1 -1
  12. package/dist/dist-esm/acs-ui-common/src/index.d.ts +1 -0
  13. package/dist/dist-esm/acs-ui-common/src/index.js +2 -0
  14. package/dist/dist-esm/acs-ui-common/src/index.js.map +1 -1
  15. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  16. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  17. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.d.ts +1 -0
  18. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.js +31 -9
  19. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.js.map +1 -1
  20. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.d.ts +5 -1
  21. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.js +6 -2
  22. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.js.map +1 -1
  23. package/dist/dist-esm/calling-component-bindings/src/videoGallerySelector.js +2 -1
  24. package/dist/dist-esm/calling-component-bindings/src/videoGallerySelector.js.map +1 -1
  25. package/dist/dist-esm/chat-component-bindings/src/handlers/createHandlers.js +6 -1
  26. package/dist/dist-esm/chat-component-bindings/src/handlers/createHandlers.js.map +1 -1
  27. package/dist/dist-esm/communication-react/src/index.d.ts +1 -1
  28. package/dist/dist-esm/communication-react/src/index.js.map +1 -1
  29. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentWrapper.d.ts +3 -3
  30. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentWrapper.js.map +1 -1
  31. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMessageComponentAsEditBoxPicker.d.ts +3 -3
  32. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMessageComponentAsEditBoxPicker.js.map +1 -1
  33. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMessageComponentAsRichTextEditBox.d.ts +3 -3
  34. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMessageComponentAsRichTextEditBox.js +53 -32
  35. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMessageComponentAsRichTextEditBox.js.map +1 -1
  36. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponent.d.ts +3 -3
  37. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponent.js +2 -2
  38. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponent.js.map +1 -1
  39. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/FluentChatMyMessageComponent.js +6 -6
  40. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/FluentChatMyMessageComponent.js.map +1 -1
  41. package/dist/dist-esm/react-components/src/components/MessageThread.d.ts +18 -6
  42. package/dist/dist-esm/react-components/src/components/MessageThread.js +3 -3
  43. package/dist/dist-esm/react-components/src/components/MessageThread.js.map +1 -1
  44. package/dist/dist-esm/react-components/src/components/RichTextEditor/Plugins/CopyPastePlugin.d.ts +2 -2
  45. package/dist/dist-esm/react-components/src/components/RichTextEditor/Plugins/CopyPastePlugin.js +18 -34
  46. package/dist/dist-esm/react-components/src/components/RichTextEditor/Plugins/CopyPastePlugin.js.map +1 -1
  47. package/dist/dist-esm/react-components/src/components/RichTextEditor/Plugins/UndoRedoPlugin.d.ts +14 -0
  48. package/dist/dist-esm/react-components/src/components/RichTextEditor/Plugins/UndoRedoPlugin.js +56 -0
  49. package/dist/dist-esm/react-components/src/components/RichTextEditor/Plugins/UndoRedoPlugin.js.map +1 -0
  50. package/dist/dist-esm/react-components/src/components/RichTextEditor/Plugins/UpdateContentPlugin.d.ts +1 -1
  51. package/dist/dist-esm/react-components/src/components/RichTextEditor/Plugins/UpdateContentPlugin.js +10 -16
  52. package/dist/dist-esm/react-components/src/components/RichTextEditor/Plugins/UpdateContentPlugin.js.map +1 -1
  53. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextEditor.d.ts +2 -2
  54. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextEditor.js +85 -8
  55. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextEditor.js.map +1 -1
  56. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextInputBoxComponent.d.ts +2 -2
  57. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextInputBoxComponent.js.map +1 -1
  58. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextSendBox.d.ts +16 -27
  59. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextSendBox.js +33 -35
  60. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextSendBox.js.map +1 -1
  61. package/dist/dist-esm/react-components/src/components/VideoGallery/LocalScreenShare.d.ts +5 -1
  62. package/dist/dist-esm/react-components/src/components/VideoGallery/LocalScreenShare.js +15 -12
  63. package/dist/dist-esm/react-components/src/components/VideoGallery/LocalScreenShare.js.map +1 -1
  64. package/dist/dist-esm/react-components/src/components/VideoGallery/RemoteScreenShare.d.ts +9 -0
  65. package/dist/dist-esm/react-components/src/components/VideoGallery/RemoteScreenShare.js +7 -1
  66. package/dist/dist-esm/react-components/src/components/VideoGallery/RemoteScreenShare.js.map +1 -1
  67. package/dist/dist-esm/react-components/src/components/VideoGallery.d.ts +4 -0
  68. package/dist/dist-esm/react-components/src/components/VideoGallery.js +4 -4
  69. package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
  70. package/dist/dist-esm/react-components/src/components/index.d.ts +1 -1
  71. package/dist/dist-esm/react-components/src/components/index.js.map +1 -1
  72. package/dist/dist-esm/react-components/src/components/styles/RichTextEditor.styles.js +3 -1
  73. package/dist/dist-esm/react-components/src/components/styles/RichTextEditor.styles.js.map +1 -1
  74. package/dist/dist-esm/react-components/src/components/utils/RichTextEditorUtils.d.ts +34 -0
  75. package/dist/dist-esm/react-components/src/components/utils/RichTextEditorUtils.js +121 -0
  76. package/dist/dist-esm/react-components/src/components/utils/RichTextEditorUtils.js.map +1 -1
  77. package/dist/dist-esm/react-components/src/components/utils/SendBoxUtils.d.ts +15 -13
  78. package/dist/dist-esm/react-components/src/components/utils/SendBoxUtils.js +42 -32
  79. package/dist/dist-esm/react-components/src/components/utils/SendBoxUtils.js.map +1 -1
  80. package/dist/dist-esm/react-components/src/localization/locales/en-US/strings.json +1 -0
  81. package/dist/dist-esm/react-components/src/types/VideoGalleryParticipant.d.ts +2 -0
  82. package/dist/dist-esm/react-components/src/types/VideoGalleryParticipant.js.map +1 -1
  83. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js +6 -1
  84. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js.map +1 -1
  85. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js +3 -0
  86. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js.map +1 -1
  87. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/TrackCapabilityChangedNotifications.js +19 -6
  88. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/TrackCapabilityChangedNotifications.js.map +1 -1
  89. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js +21 -12
  90. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js.map +1 -1
  91. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ImageUpload/ImageUploadUtils.d.ts +5 -5
  92. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ImageUpload/ImageUploadUtils.js +61 -31
  93. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ImageUpload/ImageUploadUtils.js.map +1 -1
  94. package/dist/dist-esm/react-composites/src/composites/common/SendBoxPicker.d.ts +32 -2
  95. package/dist/dist-esm/react-composites/src/composites/common/SendBoxPicker.js +3 -3
  96. package/dist/dist-esm/react-composites/src/composites/common/SendBoxPicker.js.map +1 -1
  97. package/dist/dist-esm/react-composites/src/composites/common/constants.d.ts +5 -0
  98. package/dist/dist-esm/react-composites/src/composites/common/constants.js +6 -0
  99. package/dist/dist-esm/react-composites/src/composites/common/constants.js.map +1 -1
  100. package/package.json +6 -6
  101. package/dist/dist-cjs/communication-react/ChatMessageComponentAsRichTextEditBox-B0zbyF6Z.js.map +0 -1
  102. package/dist/dist-cjs/communication-react/index-YIP5Cyt3.js.map +0 -1
  103. package/dist/dist-esm/react-components/src/components/VideoGallery/styles/LocalScreenShare.styles.d.ts +0 -22
  104. package/dist/dist-esm/react-components/src/components/VideoGallery/styles/LocalScreenShare.styles.js +0 -44
  105. package/dist/dist-esm/react-components/src/components/VideoGallery/styles/LocalScreenShare.styles.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextEditorUtils.js","sourceRoot":"","sources":["../../../../../../../react-components/src/components/utils/RichTextEditorUtils.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC;;;GAGG;AACH,MAAM,CAAN,IAAY,eASX;AATD,WAAY,eAAe;IACzB,8CAA2B,CAAA;IAC3B,kDAA+B,CAAA;IAC/B,oDAAiC,CAAA;IACjC,kCAAe,CAAA;IACf,sCAAmB,CAAA;IACnB,8CAA2B,CAAA;IAC3B,8CAA2B,CAAA;IAC3B,sCAAmB,CAAA;AACrB,CAAC,EATW,eAAe,KAAf,eAAe,QAS1B;AAED;;;GAGG;AACH,MAAM,CAAN,IAAY,yBAEX;AAFD,WAAY,yBAAyB;IACnC,4CAAe,CAAA;AACjB,CAAC,EAFW,yBAAyB,KAAzB,yBAAyB,QAEpC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAoB,EAAE,OAAoB,EAAE,OAA0B,EAAQ,EAAE;IAC5G,IAAI,OAAO,YAAY,oBAAoB,EAAE,CAAC;QAC5C,kCAAkC;QAClC,wCAAwC;QACxC,iCAAiC;IACnC,CAAC;SAAM,IAAI,OAAO,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC;QAChD,4CAA4C;QAC5C,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;AACH,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAqB,EAAE,OAAoB,EAAE,OAA0B,EAAQ,EAAE;IAC9G,IAAI,OAAO,YAAY,gBAAgB,EAAE,CAAC;QACxC,oCAAoC;QACpC,wCAAwC;QACxC,iCAAiC;IACnC,CAAC;SAAM,IAAI,OAAO,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC;QACjD,4CAA4C;QAC5C,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;AACH,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { BorderFormat, DatasetFormat, ModelToDomContext } from 'roosterjs-content-model-types';\n\n/**\n * Plugin event type for RoosterJS plugins\n * @private\n */\nexport enum PluginEventType {\n EditorReady = 'editorReady',\n BeforeDispose = 'beforeDispose',\n ContentChanged = 'contentChanged',\n Input = 'input',\n KeyDown = 'keyDown',\n BeforePaste = 'beforePaste',\n ZoomChanged = 'zoomChanged',\n MouseUp = 'mouseUp'\n}\n\n/**\n * ContentChanged event source for RoosterJS\n * @private\n */\nexport enum ContentChangedEventSource {\n Paste = 'Paste'\n}\n\n/**\n * Applies the border format to the specified element.\n * If the element is an HTMLTableCellElement, it skips setting editing info\n * and to use classes instead of inline styles.\n * For all other cases, the default format applier is used.\n */\nexport const borderApplier = (format: BorderFormat, element: HTMLElement, context: ModelToDomContext): void => {\n if (element instanceof HTMLTableCellElement) {\n // don't set format for table cell\n // as it will set inline styles for them\n // we want to use classes instead\n } else if (context.defaultFormatAppliers.border) {\n // apply default formats for all other cases\n context.defaultFormatAppliers.border(format, element, context);\n }\n};\n\n/**\n * Applies the dataset format to the given HTML element.\n * If the element is an HTMLTableElement, it skips setting editing info\n * and to use classes instead of inline styles.\n * For all other cases, it applies the default formats.\n */\nexport const dataSetApplier = (format: DatasetFormat, element: HTMLElement, context: ModelToDomContext): void => {\n if (element instanceof HTMLTableElement) {\n // don't set editing info for tables\n // as it will set inline styles for them\n // we want to use classes instead\n } else if (context.defaultFormatAppliers.dataset) {\n // apply default formats for all other cases\n context.defaultFormatAppliers.dataset(format, element, context);\n }\n};\n"]}
1
+ {"version":3,"file":"RichTextEditorUtils.js","sourceRoot":"","sources":["../../../../../../../react-components/src/components/utils/RichTextEditorUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { BorderFormat, DatasetFormat, ModelToDomContext } from 'roosterjs-content-model-types';\n\n/**\n * Plugin event type for RoosterJS plugins\n * @private\n */\nexport enum PluginEventType {\n EditorReady = 'editorReady',\n BeforeDispose = 'beforeDispose',\n ContentChanged = 'contentChanged',\n BeforeSetContent = 'beforeSetContent',\n Input = 'input',\n KeyDown = 'keyDown',\n BeforePaste = 'beforePaste',\n ZoomChanged = 'zoomChanged',\n MouseUp = 'mouseUp'\n}\n\n/**\n * ContentChanged event source for RoosterJS\n * @private\n */\nexport enum ContentChangedEventSource {\n Paste = 'Paste'\n}\n\n/**\n * Applies the border format to the specified element.\n * If the element is an HTMLTableCellElement, it skips setting editing info\n * and to use classes instead of inline styles.\n * For all other cases, the default format applier is used.\n */\nexport const borderApplier = (format: BorderFormat, element: HTMLElement, context: ModelToDomContext): void => {\n if (element instanceof HTMLTableCellElement) {\n // don't set format for table cell\n // as it will set inline styles for them\n // we want to use classes instead\n } else if (context.defaultFormatAppliers.border) {\n // apply default formats for all other cases\n context.defaultFormatAppliers.border(format, element, context);\n }\n};\n\n/**\n * Applies the dataset format to the given HTML element.\n * If the element is an HTMLTableElement, it skips setting editing info\n * and to use classes instead of inline styles.\n * For all other cases, it applies the default formats.\n */\nexport const dataSetApplier = (format: DatasetFormat, element: HTMLElement, context: ModelToDomContext): void => {\n if (element instanceof HTMLTableElement) {\n // don't set editing info for tables\n // as it will set inline styles for them\n // we want to use classes instead\n } else if (context.defaultFormatAppliers.dataset) {\n // apply default formats for all other cases\n context.defaultFormatAppliers.dataset(format, element, context);\n }\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * @internal\n */\nexport const getPreviousInlineImages = (content?: string): Record<string, string>[] => {\n if (!content) {\n return [];\n }\n const previousInlineImages: Record<string, string>[] = [];\n const document = new DOMParser().parseFromString(content ?? '', 'text/html');\n document.querySelectorAll('img').forEach((img) => {\n const imageAttributes = getInlineImageAttributes(img);\n previousInlineImages.push(imageAttributes);\n });\n return previousInlineImages;\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * @internal\n */\nexport const getRemovedInlineImages = (\n content: string,\n previousInlineImages: Record<string, string>[]\n): Record<string, string>[] => {\n const document = new DOMParser().parseFromString(content ?? '', 'text/html');\n const currentContentIds = Array.from(document.querySelectorAll('img')).map((img) => img.id);\n previousInlineImages = previousInlineImages?.filter((img) => !currentContentIds?.includes(img.id));\n\n const removedInlineImages = [...previousInlineImages];\n return removedInlineImages;\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * @internal\n */\nexport const getInsertedInlineImages = (\n content: string,\n previousInlineImages: NodeListOf<HTMLImageElement>\n): HTMLImageElement[] => {\n const document = new DOMParser().parseFromString(content ?? '', 'text/html');\n const currentContentInlineImages = Array.from(document.querySelectorAll('img'));\n const previousContentIds = Array.from(previousInlineImages).map((img) => img.id);\n // if check is updated, also update getRemovedInlineImages\n const insertedInlineImages = currentContentInlineImages.filter((img) => !previousContentIds.includes(img.id));\n return insertedInlineImages;\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * @internal\n */\nexport const getInlineImageAttributes = (image: HTMLImageElement): Record<string, string> => {\n const imageAttributes: Record<string, string> = {};\n image.getAttributeNames().forEach((attrName) => {\n const attrValue = image.getAttribute(attrName);\n if (attrValue) {\n imageAttributes[attrName] = attrValue;\n }\n });\n return imageAttributes;\n};\n\n/* @conditional-compile-remove(rich-text-editor) */\n/**\n * @internal\n */\n/**\n * Update the scroll position of the editor to ensure the content is visible.\n */\nexport const scrollToBottomRichTextEditor = (): void => {\n // Get the current selection in the document\n const selection = document.getSelection();\n\n // Check if a selection exists and it has at least one range\n if (!selection || selection.rangeCount <= 0) {\n // If no selection or range, exit the function\n return;\n }\n\n // Get the first range of the selection\n // A user can normally only select one range at a time, so the rangeCount will usually be 1\n const range = selection.getRangeAt(0);\n\n // If the common ancestor container of the range is the document itself,\n // it might mean that the editable element is getting removed from the DOM\n // In such cases, especially in Safari, trying to modify the range might throw a HierarchyRequest error\n if (range.commonAncestorContainer === document) {\n return;\n }\n\n // Create a temporary span element to use as an anchor for scrolling\n // We can't use the anchor node directly because if it's a Text node, calling scrollIntoView() on it will throw an error\n const tempElement = document.createElement('span');\n // Collapse the range to its end point\n // This means the start and end points of the range will be the same, and it will not contain any content\n range.collapse(false);\n // Insert the temporary element at the cursor's position at the end of the range\n range.insertNode(tempElement);\n // Scroll the temporary element into view\n // the element will be aligned at the center of the scroll container, otherwise, text and images may be positioned incorrectly\n tempElement.scrollIntoView({\n block: 'center'\n });\n tempElement.remove();\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * Revoke the blob urls in the removedInlineImages and remove them from the currentLocalBlobMap\n * @internal\n */\nexport const removeLocalBlobs = (\n currentLocalBlobMap: Record<string, string>,\n removedInlineImages: Record<string, string>[]\n): void => {\n removedInlineImages.forEach((image) => {\n removeSingleLocalBlob(currentLocalBlobMap, image.id);\n });\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * Revoke all the blob urls in the currentLocalBlobMap and clean up the currentLocalBlobMap\n * @internal\n */\nexport const cleanAllLocalBlobs = (currentLocalBlobMap: Record<string, string>): void => {\n Object.keys(currentLocalBlobMap).forEach((imageId) => {\n removeSingleLocalBlob(currentLocalBlobMap, imageId);\n });\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\nconst removeSingleLocalBlob = (currentLocalBlobMap: Record<string, string>, imageId: string): void => {\n const blobUrl = currentLocalBlobMap[imageId];\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n delete currentLocalBlobMap[imageId];\n }\n};\n"]}
@@ -13,9 +13,19 @@ export declare const hasIncompleteAttachmentUploads: (attachmentsWithProgress: A
13
13
  */
14
14
  export declare const isAttachmentUploadCompleted: (attachmentsWithProgress: AttachmentMetadataInProgress[] | undefined) => boolean;
15
15
  /**
16
+ * Check if the content has inline image.
16
17
  * @internal
17
18
  */
18
- export declare const addUploadedImagesToMessage: (message: string, inlineImages: AttachmentMetadataInProgress[]) => Promise<string>;
19
+ export declare const hasInlineImageContent: (content: string) => boolean;
20
+ /**
21
+ * @internal
22
+ *
23
+ * @param message - The message content to update.
24
+ * @param initialInlineImages - The initial inline images that comes with the message before editing.
25
+ *
26
+ * @returns The updated message content.
27
+ */
28
+ export declare const updateStylesOfInlineImages: (message: string, initialInlineImages: Record<string, string>[]) => Promise<string>;
19
29
  /**
20
30
  * @private
21
31
  */
@@ -39,28 +49,20 @@ export declare const isSendBoxButtonAriaDisabled: ({ hasContent, hasCompletedAtt
39
49
  hasError: boolean;
40
50
  disabled: boolean;
41
51
  }) => boolean;
42
- interface CancelInlineImageUploadProps {
43
- imageSrcArray: string[] | undefined;
44
- inlineImages: AttachmentMetadataInProgress[] | undefined;
45
- messageId?: string;
46
- editBoxOnCancelInlineImageUpload?: (id: string, messageId: string) => void;
47
- sendBoxOnCancelInlineImageUpload?: (id: string) => void;
48
- }
49
52
  /**
50
53
  * @internal
51
54
  */
52
- export declare const cancelInlineImageUpload: (props: CancelInlineImageUploadProps) => void;
55
+ export declare const toAttachmentMetadata: (attachmentsWithProgress: AttachmentMetadataInProgress[] | undefined) => AttachmentMetadata[] | undefined;
53
56
  /**
54
57
  * @internal
55
58
  */
56
- export declare const toAttachmentMetadata: (attachmentsWithProgress: AttachmentMetadataInProgress[] | undefined) => AttachmentMetadata[] | undefined;
59
+ export declare const modifyInlineImagesInContentString: (content: string, initialInlineImages: Record<string, string>[], onCompleted?: (content: string) => void) => Promise<void>;
57
60
  /**
58
61
  * @internal
59
62
  */
60
- export declare const insertImagesToContentString: (content: string, inlineImages?: AttachmentMetadataInProgress[], onCompleted?: (content: string) => void) => Promise<void>;
63
+ export declare const removeBrokenImageContentAndClearImageSizeStyles: (content: string) => string;
61
64
  /**
62
65
  * @internal
63
66
  */
64
- export declare const removeBrokenImageContentAndClearImageSizeStyles: (content: string) => string;
65
- export {};
67
+ export declare const getContentWithUpdatedInlineImagesInfo: (content: string, inlineImageWithProgress: AttachmentMetadataInProgress[]) => string;
66
68
  //# sourceMappingURL=SendBoxUtils.d.ts.map
@@ -33,32 +33,40 @@ export const isAttachmentUploadCompleted = (attachmentsWithProgress) => {
33
33
  };
34
34
  /* @conditional-compile-remove(rich-text-editor-image-upload) */
35
35
  /**
36
+ * Check if the content has inline image.
36
37
  * @internal
37
38
  */
38
- // Before sending the image, we need to add the image id we get back after uploading the images to the message content.
39
- export const addUploadedImagesToMessage = (message, inlineImages) => __awaiter(void 0, void 0, void 0, function* () {
39
+ export const hasInlineImageContent = (content) => {
40
+ const document = new DOMParser().parseFromString(content, 'text/html');
41
+ return !!document.querySelector('img');
42
+ };
43
+ /* @conditional-compile-remove(rich-text-editor-image-upload) */
44
+ /**
45
+ * @internal
46
+ *
47
+ * @param message - The message content to update.
48
+ * @param initialInlineImages - The initial inline images that comes with the message before editing.
49
+ *
50
+ * @returns The updated message content.
51
+ */
52
+ export const updateStylesOfInlineImages = (message, initialInlineImages) => __awaiter(void 0, void 0, void 0, function* () {
40
53
  if (message === '') {
41
54
  return message;
42
55
  }
56
+ const initialInlineImagesIds = initialInlineImages.map((initialInlineImage) => initialInlineImage.id);
43
57
  const document = new DOMParser().parseFromString(message !== null && message !== void 0 ? message : '', 'text/html');
44
58
  const imagesPromise = Array.from(document.querySelectorAll('img')).map((img) => {
45
59
  return new Promise((resolve, rejects) => {
46
- const uploadInlineImage = inlineImages.find((inlineImage) => !inlineImage.error && (inlineImage.url === img.src || inlineImage.id === img.id));
47
- // The message might content images that comes with the message before editing, those images are not in the uploadInlineImages array.
48
- // This function should only modify the message content for images in the uploadInlineImages array.
49
- if (!uploadInlineImage) {
60
+ // The message might content images that comes with the message before editing.
61
+ // This function should only modify the message content for images that are newly added.
62
+ if (initialInlineImagesIds.includes(img.id)) {
50
63
  resolve();
51
64
  return;
52
65
  }
53
66
  const imageElement = new Image();
54
67
  imageElement.src = img.src;
55
68
  imageElement.onload = () => {
56
- var _a;
57
69
  // imageElement is a copy of original img element, so changes need to be made to the original img element
58
- img.id = (_a = uploadInlineImage === null || uploadInlineImage === void 0 ? void 0 : uploadInlineImage.id) !== null && _a !== void 0 ? _a : '';
59
- if (uploadInlineImage === null || uploadInlineImage === void 0 ? void 0 : uploadInlineImage.url) {
60
- img.src = uploadInlineImage.url;
61
- }
62
70
  img.width = imageElement.width;
63
71
  img.height = imageElement.height;
64
72
  img.style.aspectRatio = `${imageElement.width} / ${imageElement.height}`;
@@ -114,21 +122,6 @@ hasCompletedAttachmentUploads, hasError, disabled }) => {
114
122
  hasError ||
115
123
  disabled);
116
124
  };
117
- /* @conditional-compile-remove(rich-text-editor-image-upload) */
118
- /**
119
- * @internal
120
- */
121
- export const cancelInlineImageUpload = (props) => {
122
- const { imageSrcArray, inlineImages, messageId, editBoxOnCancelInlineImageUpload, sendBoxOnCancelInlineImageUpload } = props;
123
- if (imageSrcArray && inlineImages && (inlineImages === null || inlineImages === void 0 ? void 0 : inlineImages.length) > 0) {
124
- inlineImages === null || inlineImages === void 0 ? void 0 : inlineImages.map((inlineImage) => {
125
- if (inlineImage.url && !(imageSrcArray === null || imageSrcArray === void 0 ? void 0 : imageSrcArray.includes(inlineImage.url))) {
126
- sendBoxOnCancelInlineImageUpload && sendBoxOnCancelInlineImageUpload(inlineImage.id);
127
- editBoxOnCancelInlineImageUpload && editBoxOnCancelInlineImageUpload(inlineImage.id, messageId || '');
128
- }
129
- });
130
- }
131
- };
132
125
  /* @conditional-compile-remove(file-sharing-acs) */
133
126
  /**
134
127
  * @internal
@@ -146,15 +139,13 @@ export const toAttachmentMetadata = (attachmentsWithProgress) => {
146
139
  };
147
140
  });
148
141
  };
149
- /* @conditional-compile-remove(rich-text-editor-image-upload) */
150
142
  /**
151
143
  * @internal
152
144
  */
153
- export const insertImagesToContentString = (content, inlineImages, onCompleted) => __awaiter(void 0, void 0, void 0, function* () {
154
- if (!inlineImages || inlineImages.length <= 0) {
155
- onCompleted === null || onCompleted === void 0 ? void 0 : onCompleted(content);
156
- }
157
- const newContent = yield addUploadedImagesToMessage(content, inlineImages !== null && inlineImages !== void 0 ? inlineImages : []);
145
+ export const modifyInlineImagesInContentString = (content, initialInlineImages, onCompleted) => __awaiter(void 0, void 0, void 0, function* () {
146
+ let newContent = content;
147
+ /* @conditional-compile-remove(rich-text-editor-image-upload) */
148
+ newContent = yield updateStylesOfInlineImages(content, initialInlineImages);
158
149
  onCompleted === null || onCompleted === void 0 ? void 0 : onCompleted(newContent);
159
150
  });
160
151
  /* @conditional-compile-remove(rich-text-editor-image-upload) */
@@ -183,4 +174,23 @@ export const removeBrokenImageContentAndClearImageSizeStyles = (content) => {
183
174
  });
184
175
  return document.body.innerHTML;
185
176
  };
177
+ /* @conditional-compile-remove(rich-text-editor-image-upload) */
178
+ /**
179
+ * @internal
180
+ */
181
+ export const getContentWithUpdatedInlineImagesInfo = (content, inlineImageWithProgress) => {
182
+ if (!inlineImageWithProgress || inlineImageWithProgress.length <= 0) {
183
+ return content;
184
+ }
185
+ const document = new DOMParser().parseFromString(content, 'text/html');
186
+ document.querySelectorAll('img').forEach((img) => {
187
+ const imageId = img.id;
188
+ const inlineImage = inlineImageWithProgress.find((image) => !image.error && image.progress === 1 && image.id === imageId);
189
+ if (inlineImage) {
190
+ img.id = inlineImage.id;
191
+ img.src = inlineImage.url || img.src;
192
+ }
193
+ });
194
+ return document.body.innerHTML;
195
+ };
186
196
  //# sourceMappingURL=SendBoxUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SendBoxUtils.js","sourceRoot":"","sources":["../../../../../../../react-components/src/components/utils/SendBoxUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/* @conditional-compile-remove(file-sharing-acs) */\nimport { AttachmentMetadataInProgress } from '@internal/acs-ui-common';\n/* @conditional-compile-remove(file-sharing-acs) */\nimport { AttachmentMetadata } from '@internal/acs-ui-common';\n\n/**\n * @private\n */\nexport const MAXIMUM_LENGTH_OF_MESSAGE = 8000;\nconst EMPTY_MESSAGE_REGEX = /^\\s*$/;\n\n/* @conditional-compile-remove(file-sharing-acs) */\n/**\n * @private\n */\nexport const hasIncompleteAttachmentUploads = (\n attachmentsWithProgress: AttachmentMetadataInProgress[] | undefined\n): boolean => {\n return !!(\n attachmentsWithProgress?.length &&\n !attachmentsWithProgress\n .filter((attachmentUpload) => !attachmentUpload.error)\n .every((attachmentUpload) => attachmentUpload.progress === 1 && attachmentUpload.progress !== undefined)\n );\n};\n\n/* @conditional-compile-remove(file-sharing-acs) */\n/**\n * @private\n */\nexport const isAttachmentUploadCompleted = (\n attachmentsWithProgress: AttachmentMetadataInProgress[] | undefined\n): boolean => {\n return !!attachmentsWithProgress?.find((attachment) => !attachment.error);\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * @internal\n */\n// Before sending the image, we need to add the image id we get back after uploading the images to the message content.\nexport const addUploadedImagesToMessage = async (\n message: string,\n inlineImages: AttachmentMetadataInProgress[]\n): Promise<string> => {\n if (message === '') {\n return message;\n }\n const document = new DOMParser().parseFromString(message ?? '', 'text/html');\n const imagesPromise = Array.from(document.querySelectorAll('img')).map((img) => {\n return new Promise<void>((resolve, rejects) => {\n const uploadInlineImage = inlineImages.find(\n (inlineImage) => !inlineImage.error && (inlineImage.url === img.src || inlineImage.id === img.id)\n );\n // The message might content images that comes with the message before editing, those images are not in the uploadInlineImages array.\n // This function should only modify the message content for images in the uploadInlineImages array.\n if (!uploadInlineImage) {\n resolve();\n return;\n }\n const imageElement = new Image();\n imageElement.src = img.src;\n imageElement.onload = () => {\n // imageElement is a copy of original img element, so changes need to be made to the original img element\n img.id = uploadInlineImage?.id ?? '';\n if (uploadInlineImage?.url) {\n img.src = uploadInlineImage.url;\n }\n img.width = imageElement.width;\n img.height = imageElement.height;\n img.style.aspectRatio = `${imageElement.width} / ${imageElement.height}`;\n // Clear maxWidth and maxHeight styles that are set by roosterJS.\n // This is so that they can be set in messageThread styles without using the important flag.\n img.style.maxWidth = '';\n img.style.maxHeight = '';\n resolve();\n };\n imageElement.onerror = () => {\n console.log('Error loading image', img.src);\n rejects();\n };\n });\n });\n await Promise.all(imagesPromise);\n const newMessage = document.body.innerHTML;\n return newMessage;\n};\n\n/**\n * @private\n */\nexport const isMessageTooLong = (valueLength: number): boolean => {\n return valueLength > MAXIMUM_LENGTH_OF_MESSAGE;\n};\n\n/**\n * @private\n */\nexport const sanitizeText = (message: string): string => {\n if (EMPTY_MESSAGE_REGEX.test(message)) {\n return '';\n } else {\n return message;\n }\n};\n\n/**\n * Determines whether the send box should be disabled for ARIA accessibility.\n *\n * @param hasContent - Indicates whether the send box has content.\n * @param hasCompletedAttachmentUploads - Indicates whether attachment uploads have completed.\n * @param hasError - Indicates whether there is an error.\n * @param disabled - Indicates whether the send box is disabled.\n * @returns A boolean value indicating whether the send box should be disabled for ARIA accessibility.\n */\nexport const isSendBoxButtonAriaDisabled = ({\n hasContent,\n /* @conditional-compile-remove(file-sharing-acs) */\n hasCompletedAttachmentUploads,\n hasError,\n disabled\n}: {\n hasContent: boolean;\n /* @conditional-compile-remove(file-sharing-acs) */\n hasCompletedAttachmentUploads: boolean;\n hasError: boolean;\n disabled: boolean;\n}): boolean => {\n return (\n // no content\n !(hasContent || /* @conditional-compile-remove(file-sharing-acs) */ hasCompletedAttachmentUploads) ||\n //error message exists\n hasError ||\n disabled\n );\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\ninterface CancelInlineImageUploadProps {\n imageSrcArray: string[] | undefined;\n inlineImages: AttachmentMetadataInProgress[] | undefined;\n messageId?: string;\n editBoxOnCancelInlineImageUpload?: (id: string, messageId: string) => void;\n sendBoxOnCancelInlineImageUpload?: (id: string) => void;\n}\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * @internal\n */\nexport const cancelInlineImageUpload = (props: CancelInlineImageUploadProps): void => {\n const { imageSrcArray, inlineImages, messageId, editBoxOnCancelInlineImageUpload, sendBoxOnCancelInlineImageUpload } =\n props;\n if (imageSrcArray && inlineImages && inlineImages?.length > 0) {\n inlineImages?.map((inlineImage) => {\n if (inlineImage.url && !imageSrcArray?.includes(inlineImage.url)) {\n sendBoxOnCancelInlineImageUpload && sendBoxOnCancelInlineImageUpload(inlineImage.id);\n editBoxOnCancelInlineImageUpload && editBoxOnCancelInlineImageUpload(inlineImage.id, messageId || '');\n }\n });\n }\n};\n\n/* @conditional-compile-remove(file-sharing-acs) */\n/**\n * @internal\n */\nexport const toAttachmentMetadata = (\n attachmentsWithProgress: AttachmentMetadataInProgress[] | undefined\n): AttachmentMetadata[] | undefined => {\n return attachmentsWithProgress\n ?.filter((attachment) => {\n return !('error' in attachment) && !attachment.error?.message;\n })\n .map((attachment) => {\n return {\n id: attachment.id,\n name: attachment.name,\n url: attachment.url ?? ''\n };\n });\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * @internal\n */\nexport const insertImagesToContentString = async (\n content: string,\n inlineImages?: AttachmentMetadataInProgress[],\n onCompleted?: (content: string) => void\n): Promise<void> => {\n if (!inlineImages || inlineImages.length <= 0) {\n onCompleted?.(content);\n }\n const newContent = await addUploadedImagesToMessage(content, inlineImages ?? []);\n onCompleted?.(newContent);\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * @internal\n */\nexport const removeBrokenImageContentAndClearImageSizeStyles = (content: string): string => {\n const document = new DOMParser().parseFromString(content, 'text/html');\n document.querySelectorAll('img').forEach((img) => {\n // Before submitting/resend the message, we need to trim the unnecessary attributes such as src,\n // which is set to a local svg of a broken image icon at this point.\n // Once message is submitted/resent, it will be fetched again and might not be a broken image anymore,\n // That's why we need to remove the class and data-ui-id attribute of 'broken-image-wrapper'\n if (img.className === 'broken-image-wrapper') {\n img.removeAttribute('class');\n img.removeAttribute('src');\n img.removeAttribute('data-ui-id');\n }\n // Clear maxWidth and maxHeight styles that are set by roosterJS.\n // Clear width and height styles as the width and height is set in attributes\n // This is so that they can be set in messageThread styles without using the important flag.\n img.style.width = '';\n img.style.height = '';\n img.style.maxWidth = '';\n img.style.maxHeight = '';\n });\n return document.body.innerHTML;\n};\n"]}
1
+ {"version":3,"file":"SendBoxUtils.js","sourceRoot":"","sources":["../../../../../../../react-components/src/components/utils/SendBoxUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/* @conditional-compile-remove(file-sharing-acs) */\nimport { AttachmentMetadataInProgress } from '@internal/acs-ui-common';\n/* @conditional-compile-remove(file-sharing-acs) */\nimport { AttachmentMetadata } from '@internal/acs-ui-common';\n\n/**\n * @private\n */\nexport const MAXIMUM_LENGTH_OF_MESSAGE = 8000;\nconst EMPTY_MESSAGE_REGEX = /^\\s*$/;\n\n/* @conditional-compile-remove(file-sharing-acs) */\n/**\n * @private\n */\nexport const hasIncompleteAttachmentUploads = (\n attachmentsWithProgress: AttachmentMetadataInProgress[] | undefined\n): boolean => {\n return !!(\n attachmentsWithProgress?.length &&\n !attachmentsWithProgress\n .filter((attachmentUpload) => !attachmentUpload.error)\n .every((attachmentUpload) => attachmentUpload.progress === 1 && attachmentUpload.progress !== undefined)\n );\n};\n\n/* @conditional-compile-remove(file-sharing-acs) */\n/**\n * @private\n */\nexport const isAttachmentUploadCompleted = (\n attachmentsWithProgress: AttachmentMetadataInProgress[] | undefined\n): boolean => {\n return !!attachmentsWithProgress?.find((attachment) => !attachment.error);\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * Check if the content has inline image.\n * @internal\n */\nexport const hasInlineImageContent = (content: string): boolean => {\n const document = new DOMParser().parseFromString(content, 'text/html');\n return !!document.querySelector('img');\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * @internal\n *\n * @param message - The message content to update.\n * @param initialInlineImages - The initial inline images that comes with the message before editing.\n *\n * @returns The updated message content.\n */\nexport const updateStylesOfInlineImages = async (\n message: string,\n initialInlineImages: Record<string, string>[]\n): Promise<string> => {\n if (message === '') {\n return message;\n }\n const initialInlineImagesIds = initialInlineImages.map((initialInlineImage) => initialInlineImage.id);\n const document = new DOMParser().parseFromString(message ?? '', 'text/html');\n const imagesPromise = Array.from(document.querySelectorAll('img')).map((img) => {\n return new Promise<void>((resolve, rejects) => {\n // The message might content images that comes with the message before editing.\n // This function should only modify the message content for images that are newly added.\n if (initialInlineImagesIds.includes(img.id)) {\n resolve();\n return;\n }\n const imageElement = new Image();\n imageElement.src = img.src;\n imageElement.onload = () => {\n // imageElement is a copy of original img element, so changes need to be made to the original img element\n img.width = imageElement.width;\n img.height = imageElement.height;\n img.style.aspectRatio = `${imageElement.width} / ${imageElement.height}`;\n // Clear maxWidth and maxHeight styles that are set by roosterJS.\n // This is so that they can be set in messageThread styles without using the important flag.\n img.style.maxWidth = '';\n img.style.maxHeight = '';\n resolve();\n };\n imageElement.onerror = () => {\n console.log('Error loading image', img.src);\n rejects();\n };\n });\n });\n await Promise.all(imagesPromise);\n const newMessage = document.body.innerHTML;\n return newMessage;\n};\n\n/**\n * @private\n */\nexport const isMessageTooLong = (valueLength: number): boolean => {\n return valueLength > MAXIMUM_LENGTH_OF_MESSAGE;\n};\n\n/**\n * @private\n */\nexport const sanitizeText = (message: string): string => {\n if (EMPTY_MESSAGE_REGEX.test(message)) {\n return '';\n } else {\n return message;\n }\n};\n\n/**\n * Determines whether the send box should be disabled for ARIA accessibility.\n *\n * @param hasContent - Indicates whether the send box has content.\n * @param hasCompletedAttachmentUploads - Indicates whether attachment uploads have completed.\n * @param hasError - Indicates whether there is an error.\n * @param disabled - Indicates whether the send box is disabled.\n * @returns A boolean value indicating whether the send box should be disabled for ARIA accessibility.\n */\nexport const isSendBoxButtonAriaDisabled = ({\n hasContent,\n /* @conditional-compile-remove(file-sharing-acs) */\n hasCompletedAttachmentUploads,\n hasError,\n disabled\n}: {\n hasContent: boolean;\n /* @conditional-compile-remove(file-sharing-acs) */\n hasCompletedAttachmentUploads: boolean;\n hasError: boolean;\n disabled: boolean;\n}): boolean => {\n return (\n // no content\n !(hasContent || /* @conditional-compile-remove(file-sharing-acs) */ hasCompletedAttachmentUploads) ||\n //error message exists\n hasError ||\n disabled\n );\n};\n\n/* @conditional-compile-remove(file-sharing-acs) */\n/**\n * @internal\n */\nexport const toAttachmentMetadata = (\n attachmentsWithProgress: AttachmentMetadataInProgress[] | undefined\n): AttachmentMetadata[] | undefined => {\n return attachmentsWithProgress\n ?.filter((attachment) => {\n return !('error' in attachment) && !attachment.error?.message;\n })\n .map((attachment) => {\n return {\n id: attachment.id,\n name: attachment.name,\n url: attachment.url ?? ''\n };\n });\n};\n\n/**\n * @internal\n */\nexport const modifyInlineImagesInContentString = async (\n content: string,\n initialInlineImages: Record<string, string>[],\n onCompleted?: (content: string) => void\n): Promise<void> => {\n let newContent = content;\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n newContent = await updateStylesOfInlineImages(content, initialInlineImages);\n onCompleted?.(newContent);\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * @internal\n */\nexport const removeBrokenImageContentAndClearImageSizeStyles = (content: string): string => {\n const document = new DOMParser().parseFromString(content, 'text/html');\n document.querySelectorAll('img').forEach((img) => {\n // Before submitting/resend the message, we need to trim the unnecessary attributes such as src,\n // which is set to a local svg of a broken image icon at this point.\n // Once message is submitted/resent, it will be fetched again and might not be a broken image anymore,\n // That's why we need to remove the class and data-ui-id attribute of 'broken-image-wrapper'\n if (img.className === 'broken-image-wrapper') {\n img.removeAttribute('class');\n img.removeAttribute('src');\n img.removeAttribute('data-ui-id');\n }\n // Clear maxWidth and maxHeight styles that are set by roosterJS.\n // Clear width and height styles as the width and height is set in attributes\n // This is so that they can be set in messageThread styles without using the important flag.\n img.style.width = '';\n img.style.height = '';\n img.style.maxWidth = '';\n img.style.maxHeight = '';\n });\n return document.body.innerHTML;\n};\n\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\n/**\n * @internal\n */\nexport const getContentWithUpdatedInlineImagesInfo = (\n content: string,\n inlineImageWithProgress: AttachmentMetadataInProgress[]\n): string => {\n if (!inlineImageWithProgress || inlineImageWithProgress.length <= 0) {\n return content;\n }\n const document = new DOMParser().parseFromString(content, 'text/html');\n document.querySelectorAll('img').forEach((img) => {\n const imageId = img.id;\n const inlineImage = inlineImageWithProgress.find(\n (image) => !image.error && image.progress === 1 && image.id === imageId\n );\n if (inlineImage) {\n img.id = inlineImage.id;\n img.src = inlineImage.url || img.src;\n }\n });\n return document.body.innerHTML;\n};\n"]}
@@ -457,6 +457,7 @@
457
457
  "videoGallery": {
458
458
  "screenIsBeingSharedMessage": "You are sharing your screen",
459
459
  "screenShareLoadingMessage": "Loading {participant}'s screen",
460
+ "localScreenShareLoadingMessage": "Loading your screen",
460
461
  "localVideoLabel": "You",
461
462
  "localVideoCameraSwitcherLabel": "Switch camera",
462
463
  "localVideoMovementLabel": "Movable Local Video Tile",
@@ -91,6 +91,8 @@ export interface VideoGalleryLocalParticipant extends VideoGalleryParticipant {
91
91
  *
92
92
  * */
93
93
  reaction?: Reaction;
94
+ /** Video stream of shared screen */
95
+ screenShareStream?: VideoGalleryStream;
94
96
  }
95
97
  /**
96
98
  * The state of a remote participant in the {@link VideoGallery}.
@@ -1 +1 @@
1
- {"version":3,"file":"VideoGalleryParticipant.js","sourceRoot":"","sources":["../../../../../../react-components/src/types/VideoGalleryParticipant.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/* @conditional-compile-remove(one-to-n-calling) */\n/* @conditional-compile-remove(PSTN-calls) */\nimport { ParticipantState } from './ParticipantListParticipant';\n\nimport { RaisedHand } from './ParticipantListParticipant';\nimport { Reaction } from './ParticipantListParticipant';\nimport { Spotlight } from './ParticipantListParticipant';\n/**\n * Scaling mode of a {@link VideoGalleryStream}.\n *\n * @public\n */\nexport type ViewScalingMode = 'Stretch' | 'Crop' | 'Fit';\n\n/**\n * Options to control how video streams are rendered.\n *\n * @public\n */\nexport declare interface VideoStreamOptions {\n /** Whether the video stream is mirrored or not */\n isMirrored?: boolean;\n /** Scaling mode. It can be `Stretch`, `Crop` or `Fit` */\n scalingMode?: ViewScalingMode;\n}\n\n/**\n * The state of a participant in the {@link VideoGallery}.\n *\n * @public\n */\nexport type VideoGalleryParticipant = {\n /** User ID of participant */\n userId: string;\n /** Whether participant is muted */\n isMuted?: boolean;\n /** Display name of participant */\n displayName?: string;\n /** Video stream of participant */\n videoStream?: VideoGalleryStream;\n /** Whether participant is screen sharing or not */\n isScreenSharingOn?: boolean;\n /** Whether participant is spotlighted **/\n spotlight?: Spotlight;\n};\n\n/**\n * Video stream of a participant in {@link VideoGallery}.\n *\n * @public\n */\nexport interface VideoGalleryStream {\n /** ID of the video stream */\n id?: number;\n /** Whether the video stream is available or not */\n isAvailable?: boolean;\n /** Whether the video stream is receiving data or not */\n isReceiving?: boolean;\n /** Whether the video stream is mirrored or not */\n isMirrored?: boolean;\n /** Render element of the video stream */\n renderElement?: HTMLElement;\n /** Scaling mode of the video stream */\n scalingMode?: ViewScalingMode;\n /** Stream Size of the video stream */\n streamSize?: { width: number; height: number };\n}\n\n/**\n * Object returned after creating a local or remote VideoStream.\n * This contains helper functions to manipulate the render of the stream.\n *\n * @public\n */\nexport interface CreateVideoStreamViewResult {\n /** View handle of the rendered video stream */\n view: {\n /**\n * Update the scale mode for this view.\n * @param scalingMode - The new scale mode.\n */\n updateScalingMode: (scalingMode: ViewScalingMode) => Promise<void>;\n };\n}\n\n// set the required attribs in selector. (Further simplifying our component logic) For example\n// isLocalVideoReady can be calculated inside selector.\n/**\n * The state of the local participant in the {@link VideoGallery}.\n *\n * @public\n */\nexport interface VideoGalleryLocalParticipant extends VideoGalleryParticipant {\n /** Whether local participant is raised a hand */\n raisedHand?: RaisedHand;\n /**\n * Whether local participant has reacted\n *\n * */\n reaction?: Reaction;\n}\n\n/**\n * The state of a remote participant in the {@link VideoGallery}.\n *\n * @public\n */\nexport interface VideoGalleryRemoteParticipant extends VideoGalleryParticipant {\n /** Whether participant is speaking or not */\n isSpeaking?: boolean;\n /** Video stream of shared screen */\n screenShareStream?: VideoGalleryStream;\n /* @conditional-compile-remove(one-to-n-calling) */\n /* @conditional-compile-remove(PSTN-calls) */\n /**\n * @beta\n * The connection state of the participant. For example, 'Hold', 'Connecting' etc.\n */\n state?: ParticipantState;\n /** Whether participant is raised a hand */\n raisedHand?: RaisedHand;\n /**\n * Whether participant has reacted\n *\n * @public\n * */\n reaction?: Reaction;\n}\n"]}
1
+ {"version":3,"file":"VideoGalleryParticipant.js","sourceRoot":"","sources":["../../../../../../react-components/src/types/VideoGalleryParticipant.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/* @conditional-compile-remove(one-to-n-calling) */\n/* @conditional-compile-remove(PSTN-calls) */\nimport { ParticipantState } from './ParticipantListParticipant';\n\nimport { RaisedHand } from './ParticipantListParticipant';\nimport { Reaction } from './ParticipantListParticipant';\nimport { Spotlight } from './ParticipantListParticipant';\n/**\n * Scaling mode of a {@link VideoGalleryStream}.\n *\n * @public\n */\nexport type ViewScalingMode = 'Stretch' | 'Crop' | 'Fit';\n\n/**\n * Options to control how video streams are rendered.\n *\n * @public\n */\nexport declare interface VideoStreamOptions {\n /** Whether the video stream is mirrored or not */\n isMirrored?: boolean;\n /** Scaling mode. It can be `Stretch`, `Crop` or `Fit` */\n scalingMode?: ViewScalingMode;\n}\n\n/**\n * The state of a participant in the {@link VideoGallery}.\n *\n * @public\n */\nexport type VideoGalleryParticipant = {\n /** User ID of participant */\n userId: string;\n /** Whether participant is muted */\n isMuted?: boolean;\n /** Display name of participant */\n displayName?: string;\n /** Video stream of participant */\n videoStream?: VideoGalleryStream;\n /** Whether participant is screen sharing or not */\n isScreenSharingOn?: boolean;\n /** Whether participant is spotlighted **/\n spotlight?: Spotlight;\n};\n\n/**\n * Video stream of a participant in {@link VideoGallery}.\n *\n * @public\n */\nexport interface VideoGalleryStream {\n /** ID of the video stream */\n id?: number;\n /** Whether the video stream is available or not */\n isAvailable?: boolean;\n /** Whether the video stream is receiving data or not */\n isReceiving?: boolean;\n /** Whether the video stream is mirrored or not */\n isMirrored?: boolean;\n /** Render element of the video stream */\n renderElement?: HTMLElement;\n /** Scaling mode of the video stream */\n scalingMode?: ViewScalingMode;\n /** Stream Size of the video stream */\n streamSize?: { width: number; height: number };\n}\n\n/**\n * Object returned after creating a local or remote VideoStream.\n * This contains helper functions to manipulate the render of the stream.\n *\n * @public\n */\nexport interface CreateVideoStreamViewResult {\n /** View handle of the rendered video stream */\n view: {\n /**\n * Update the scale mode for this view.\n * @param scalingMode - The new scale mode.\n */\n updateScalingMode: (scalingMode: ViewScalingMode) => Promise<void>;\n };\n}\n\n// set the required attribs in selector. (Further simplifying our component logic) For example\n// isLocalVideoReady can be calculated inside selector.\n/**\n * The state of the local participant in the {@link VideoGallery}.\n *\n * @public\n */\nexport interface VideoGalleryLocalParticipant extends VideoGalleryParticipant {\n /** Whether local participant is raised a hand */\n raisedHand?: RaisedHand;\n /**\n * Whether local participant has reacted\n *\n * */\n reaction?: Reaction;\n /** Video stream of shared screen */\n screenShareStream?: VideoGalleryStream;\n}\n\n/**\n * The state of a remote participant in the {@link VideoGallery}.\n *\n * @public\n */\nexport interface VideoGalleryRemoteParticipant extends VideoGalleryParticipant {\n /** Whether participant is speaking or not */\n isSpeaking?: boolean;\n /** Video stream of shared screen */\n screenShareStream?: VideoGalleryStream;\n /* @conditional-compile-remove(one-to-n-calling) */\n /* @conditional-compile-remove(PSTN-calls) */\n /**\n * @beta\n * The connection state of the participant. For example, 'Hold', 'Connecting' etc.\n */\n state?: ParticipantState;\n /** Whether participant is raised a hand */\n raisedHand?: RaisedHand;\n /**\n * Whether participant has reacted\n *\n * @public\n * */\n reaction?: Reaction;\n}\n"]}
@@ -506,7 +506,12 @@ export class AzureCommunicationCallAdapter {
506
506
  }
507
507
  disposeScreenShareStreamView(remoteUserId) {
508
508
  return __awaiter(this, void 0, void 0, function* () {
509
- yield this.handlers.onDisposeRemoteScreenShareStreamView(remoteUserId);
509
+ if (remoteUserId !== '') {
510
+ yield this.handlers.onDisposeRemoteScreenShareStreamView(remoteUserId);
511
+ }
512
+ else {
513
+ yield this.handlers.onDisposeLocalScreenShareStreamView();
514
+ }
510
515
  });
511
516
  }
512
517
  disposeRemoteVideoStreamView(remoteUserId) {