@azure/communication-react 1.14.0-alpha-202403060013 → 1.14.0-alpha-202403080013

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 (112) hide show
  1. package/dist/communication-react.d.ts +127 -51
  2. package/dist/dist-cjs/communication-react/RichTextSendBoxWrapper-CQnsLK4_.js +51 -0
  3. package/dist/dist-cjs/communication-react/RichTextSendBoxWrapper-CQnsLK4_.js.map +1 -0
  4. package/dist/dist-cjs/communication-react/index--vbi3hW5.js +38028 -0
  5. package/dist/dist-cjs/communication-react/index--vbi3hW5.js.map +1 -0
  6. package/dist/dist-cjs/communication-react/index.js +157 -37619
  7. package/dist/dist-cjs/communication-react/index.js.map +1 -1
  8. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  9. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  10. package/dist/dist-esm/chat-component-bindings/src/hooks/usePropsFor.d.ts +2 -1
  11. package/dist/dist-esm/chat-component-bindings/src/hooks/usePropsFor.js +5 -0
  12. package/dist/dist-esm/chat-component-bindings/src/hooks/usePropsFor.js.map +1 -1
  13. package/dist/dist-esm/chat-component-bindings/src/messageThreadSelector.js +15 -9
  14. package/dist/dist-esm/chat-component-bindings/src/messageThreadSelector.js.map +1 -1
  15. package/dist/dist-esm/chat-stateful-client/src/ChatContext.js +4 -4
  16. package/dist/dist-esm/chat-stateful-client/src/ChatContext.js.map +1 -1
  17. package/dist/dist-esm/chat-stateful-client/src/ResourceDownloadQueue.d.ts +0 -11
  18. package/dist/dist-esm/chat-stateful-client/src/ResourceDownloadQueue.js +19 -47
  19. package/dist/dist-esm/chat-stateful-client/src/ResourceDownloadQueue.js.map +1 -1
  20. package/dist/dist-esm/chat-stateful-client/src/index.d.ts +1 -0
  21. package/dist/dist-esm/chat-stateful-client/src/index.js.map +1 -1
  22. package/dist/dist-esm/chat-stateful-client/src/types/ChatMessageWithStatus.d.ts +9 -1
  23. package/dist/dist-esm/chat-stateful-client/src/types/ChatMessageWithStatus.js.map +1 -1
  24. package/dist/dist-esm/communication-react/src/index.d.ts +3 -2
  25. package/dist/dist-esm/communication-react/src/index.js +2 -0
  26. package/dist/dist-esm/communication-react/src/index.js.map +1 -1
  27. package/dist/dist-esm/react-components/src/components/CaptionsSettingsModal.js +4 -4
  28. package/dist/dist-esm/react-components/src/components/CaptionsSettingsModal.js.map +1 -1
  29. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.d.ts +2 -2
  30. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.js +16 -34
  31. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.js.map +1 -1
  32. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsRichTextEditBox.d.ts +18 -0
  33. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsRichTextEditBox.js +102 -0
  34. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsRichTextEditBox.js.map +1 -0
  35. package/dist/dist-esm/react-components/src/components/FileDownloadCards.d.ts +1 -7
  36. package/dist/dist-esm/react-components/src/components/FileDownloadCards.js +5 -17
  37. package/dist/dist-esm/react-components/src/components/FileDownloadCards.js.map +1 -1
  38. package/dist/dist-esm/react-components/src/components/{RTE → RichTextEditor}/RichTextEditor.d.ts +14 -2
  39. package/dist/dist-esm/react-components/src/components/{RTE → RichTextEditor}/RichTextEditor.js +22 -21
  40. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextEditor.js.map +1 -0
  41. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextInputBoxComponent.d.ts +28 -0
  42. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextInputBoxComponent.js +50 -0
  43. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextInputBoxComponent.js.map +1 -0
  44. package/dist/dist-esm/react-components/src/components/{RTE/RTERibbonButtons.d.ts → RichTextEditor/RichTextRibbonButtons.d.ts} +2 -2
  45. package/dist/dist-esm/react-components/src/components/{RTE/RTERibbonButtons.js → RichTextEditor/RichTextRibbonButtons.js} +9 -9
  46. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextRibbonButtons.js.map +1 -0
  47. package/dist/dist-esm/react-components/src/components/{RTE/RTESendBox.d.ts → RichTextEditor/RichTextSendBox.d.ts} +5 -1
  48. package/dist/dist-esm/react-components/src/components/{RTE/RTESendBox.js → RichTextEditor/RichTextSendBox.js} +33 -20
  49. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextSendBox.js.map +1 -0
  50. package/dist/dist-esm/react-components/src/components/{RTE/RTESendBoxErrors.d.ts → RichTextEditor/RichTextSendBoxErrors.d.ts} +3 -3
  51. package/dist/dist-esm/react-components/src/components/{RTE/RTESendBoxErrors.js → RichTextEditor/RichTextSendBoxErrors.js} +2 -2
  52. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextSendBoxErrors.js.map +1 -0
  53. package/dist/dist-esm/react-components/src/components/SendBox.js +2 -2
  54. package/dist/dist-esm/react-components/src/components/SendBox.js.map +1 -1
  55. package/dist/dist-esm/react-components/src/components/index.d.ts +4 -2
  56. package/dist/dist-esm/react-components/src/components/index.js +4 -1
  57. package/dist/dist-esm/react-components/src/components/index.js.map +1 -1
  58. package/dist/dist-esm/react-components/src/components/styles/ChatMessageComponent.styles.d.ts +4 -0
  59. package/dist/dist-esm/react-components/src/components/styles/ChatMessageComponent.styles.js +10 -0
  60. package/dist/dist-esm/react-components/src/components/styles/ChatMessageComponent.styles.js.map +1 -1
  61. package/dist/dist-esm/react-components/src/components/styles/EditBox.styles.d.ts +10 -4
  62. package/dist/dist-esm/react-components/src/components/styles/EditBox.styles.js +17 -4
  63. package/dist/dist-esm/react-components/src/components/styles/EditBox.styles.js.map +1 -1
  64. package/dist/dist-esm/react-components/src/components/styles/RichTextEditor.styles.d.ts +34 -2
  65. package/dist/dist-esm/react-components/src/components/styles/RichTextEditor.styles.js +72 -11
  66. package/dist/dist-esm/react-components/src/components/styles/RichTextEditor.styles.js.map +1 -1
  67. package/dist/dist-esm/react-components/src/components/styles/RichTextInputBoxComponent.styles.d.ts +17 -0
  68. package/dist/dist-esm/react-components/src/components/styles/RichTextInputBoxComponent.styles.js +30 -0
  69. package/dist/dist-esm/react-components/src/components/styles/RichTextInputBoxComponent.styles.js.map +1 -0
  70. package/dist/dist-esm/react-components/src/components/styles/SendBox.styles.d.ts +15 -0
  71. package/dist/dist-esm/react-components/src/components/styles/SendBox.styles.js +22 -11
  72. package/dist/dist-esm/react-components/src/components/styles/SendBox.styles.js.map +1 -1
  73. package/dist/dist-esm/react-components/src/components/utils/ChatMessageComponentAsEditBoxUtils.d.ts +23 -0
  74. package/dist/dist-esm/react-components/src/components/utils/ChatMessageComponentAsEditBoxUtils.js +44 -0
  75. package/dist/dist-esm/react-components/src/components/utils/ChatMessageComponentAsEditBoxUtils.js.map +1 -0
  76. package/dist/dist-esm/react-components/src/components/utils/SendBoxUtils.d.ts +1 -1
  77. package/dist/dist-esm/react-components/src/components/utils/SendBoxUtils.js +1 -1
  78. package/dist/dist-esm/react-components/src/components/utils/SendBoxUtils.js.map +1 -1
  79. package/dist/dist-esm/react-components/src/localization/LocalizationProvider.d.ts +2 -2
  80. package/dist/dist-esm/react-components/src/localization/LocalizationProvider.js.map +1 -1
  81. package/dist/dist-esm/react-components/src/localization/locales/en-US/strings.json +2 -1
  82. package/dist/dist-esm/react-components/src/theming/icons.d.ts +10 -8
  83. package/dist/dist-esm/react-components/src/theming/icons.js +13 -9
  84. package/dist/dist-esm/react-components/src/theming/icons.js.map +1 -1
  85. package/dist/dist-esm/react-components/src/types/ChatMessage.d.ts +3 -3
  86. package/dist/dist-esm/react-components/src/types/ChatMessage.js.map +1 -1
  87. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js +6 -1
  88. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js.map +1 -1
  89. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatComposite.d.ts +14 -0
  90. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatComposite.js.map +1 -1
  91. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.d.ts +0 -1
  92. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js +6 -15
  93. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js.map +1 -1
  94. package/dist/dist-esm/react-composites/src/composites/ChatComposite/file-sharing/FileUpload.js.map +1 -1
  95. package/dist/dist-esm/react-composites/src/composites/ChatComposite/index.d.ts +1 -0
  96. package/dist/dist-esm/react-composites/src/composites/ChatComposite/index.js.map +1 -1
  97. package/dist/dist-esm/react-composites/src/composites/ChatComposite/selectors/fileUploadsSelector.d.ts +2 -2
  98. package/dist/dist-esm/react-composites/src/composites/common/RichTextSendBoxWrapper.d.ts +9 -0
  99. package/dist/dist-esm/react-composites/src/composites/common/RichTextSendBoxWrapper.js +20 -0
  100. package/dist/dist-esm/react-composites/src/composites/common/RichTextSendBoxWrapper.js.map +1 -0
  101. package/dist/dist-esm/react-composites/src/composites/common/SendBox.d.ts +17 -0
  102. package/dist/dist-esm/react-composites/src/composites/common/SendBox.js +46 -0
  103. package/dist/dist-esm/react-composites/src/composites/common/SendBox.js.map +1 -0
  104. package/dist/dist-esm/react-composites/src/composites/common/icons.d.ts +10 -8
  105. package/package.json +1 -1
  106. package/dist/dist-esm/react-components/src/components/RTE/RTEInputBoxComponent.d.ts +0 -25
  107. package/dist/dist-esm/react-components/src/components/RTE/RTEInputBoxComponent.js +0 -21
  108. package/dist/dist-esm/react-components/src/components/RTE/RTEInputBoxComponent.js.map +0 -1
  109. package/dist/dist-esm/react-components/src/components/RTE/RTERibbonButtons.js.map +0 -1
  110. package/dist/dist-esm/react-components/src/components/RTE/RTESendBox.js.map +0 -1
  111. package/dist/dist-esm/react-components/src/components/RTE/RTESendBoxErrors.js.map +0 -1
  112. package/dist/dist-esm/react-components/src/components/RTE/RichTextEditor.js.map +0 -1
@@ -2,5 +2,5 @@
2
2
  // Copyright (c) Microsoft Corporation.
3
3
  // Licensed under the MIT License.
4
4
  // GENERATED FILE. DO NOT EDIT MANUALLY.
5
- module.exports = '1.14.0-alpha-202403060013';
5
+ module.exports = '1.14.0-alpha-202403080013';
6
6
  //# sourceMappingURL=telemetryVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"telemetryVersion.js","sourceRoot":"","sources":["../../../../../acs-ui-common/src/telemetryVersion.js"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;AAElC,wCAAwC;AAExC,MAAM,CAAC,OAAO,GAAG,2BAA2B,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n// GENERATED FILE. DO NOT EDIT MANUALLY.\n\nmodule.exports = '1.14.0-alpha-202403060013';\n"]}
1
+ {"version":3,"file":"telemetryVersion.js","sourceRoot":"","sources":["../../../../../acs-ui-common/src/telemetryVersion.js"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;AAElC,wCAAwC;AAExC,MAAM,CAAC,OAAO,GAAG,2BAA2B,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n// GENERATED FILE. DO NOT EDIT MANUALLY.\n\nmodule.exports = '1.14.0-alpha-202403080013';\n"]}
@@ -1,5 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { ErrorBar, MessageThread, ParticipantList, SendBox, TypingIndicator } from "../../../react-components/src";
3
+ import { RichTextSendBox } from "../../../react-components/src";
3
4
  import { SendBoxSelector } from '../sendBoxSelector';
4
5
  import { MessageThreadSelector } from '../messageThreadSelector';
5
6
  import { TypingIndicatorSelector } from '../typingIndicatorSelector';
@@ -31,7 +32,7 @@ export declare const usePropsFor: <Component extends (props: any) => JSX.Element
31
32
  *
32
33
  * @public
33
34
  */
34
- export type GetSelector<Component extends (props: any) => JSX.Element | undefined> = AreEqual<Component, typeof SendBox> extends true ? SendBoxSelector : AreEqual<Component, typeof MessageThread> extends true ? MessageThreadSelector : AreEqual<Component, typeof TypingIndicator> extends true ? TypingIndicatorSelector : AreEqual<Component, typeof ParticipantList> extends true ? ChatParticipantListSelector : AreEqual<Component, typeof ErrorBar> extends true ? ErrorBarSelector : undefined;
35
+ export type GetSelector<Component extends (props: any) => JSX.Element | undefined> = AreEqual<Component, typeof SendBox> extends true ? SendBoxSelector : AreEqual<Component, typeof RichTextSendBox> extends true ? SendBoxSelector : AreEqual<Component, typeof MessageThread> extends true ? MessageThreadSelector : AreEqual<Component, typeof TypingIndicator> extends true ? TypingIndicatorSelector : AreEqual<Component, typeof ParticipantList> extends true ? ChatParticipantListSelector : AreEqual<Component, typeof ErrorBar> extends true ? ErrorBarSelector : undefined;
35
36
  /**
36
37
  * Get the selector for a specified component.
37
38
  *
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT License.
3
3
  import { ErrorBar, MessageThread, ParticipantList, SendBox, TypingIndicator } from "../../../react-components/src";
4
+ /* @conditional-compile-remove(rich-text-editor) */
5
+ import { RichTextSendBox } from "../../../react-components/src";
4
6
  import { useHandlers } from './useHandlers';
5
7
  import { useSelector } from './useSelector';
6
8
  import { sendBoxSelector } from '../sendBoxSelector';
@@ -66,6 +68,9 @@ const findSelector = (component) => {
66
68
  switch (component) {
67
69
  case SendBox:
68
70
  return sendBoxSelector;
71
+ /* @conditional-compile-remove(rich-text-editor) */
72
+ case RichTextSendBox:
73
+ return sendBoxSelector;
69
74
  case MessageThread:
70
75
  return getMessageThreadSelector();
71
76
  case TypingIndicator:
@@ -1 +1 @@
1
- {"version":3,"file":"usePropsFor.js","sourceRoot":"","sources":["../../../../../../chat-component-bindings/src/hooks/usePropsFor.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE,sCAAmC;AAEhH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAmB,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAyB,+BAA+B,EAAE,MAAM,0BAA0B,CAAC;AAClG,OAAO,EAA2B,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAG9F,OAAO,EAA+B,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC1G,OAAO,EAAoB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,SAAoB,EAGR,EAAE;IACd,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,WAAW,CAA2B,SAAS,CAAC,CAAC;IAClE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,gCAAK,KAAK,GAAK,QAAQ,CAAS,CAAC;IAC1C,CAAC;IACD,OAAO,SAAgB,CAAC;AAC1B,CAAC,CAAC;AAsBF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,SAAoB,EACI,EAAE;IAC1B,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,8BAA8B,GAA6C,EAAE,CAAC;AAEpF,MAAM,YAAY,GAAG,CAAC,SAAkD,EAAO,EAAE;IAC/E,8EAA8E;IAC9E,8FAA8F;IAC9F,yBAAyB;IACzB,MAAM,wBAAwB,GAAgC,GAAG,EAAE;;QACjE,MAAM,QAAQ,GAAG,MAAA,MAAA,UAAU,CAAC,uBAAuB,CAAC,0CAAE,QAAQ,mCAAI,iCAAiC,CAAC;QACpG,IAAI,yBAAyB,GAAG,8BAA8B,CAAC,QAAQ,CAAC,CAAC;QACzE,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAC/B,8BAA8B,CAAC,QAAQ,CAAC,GAAG,+BAA+B,EAAE,CAAC;YAC7E,yBAAyB,GAAG,8BAA8B,CAAC,QAAQ,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,yBAAyB,CAAC;IACnC,CAAC,CAAC;IAEF,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,eAAe,CAAC;QACzB,KAAK,aAAa;YAChB,OAAO,wBAAwB,EAAE,CAAC;QACpC,KAAK,eAAe;YAClB,OAAO,uBAAuB,CAAC;QACjC,KAAK,eAAe;YAClB,OAAO,2BAA2B,CAAC;QACrC,KAAK,QAAQ;YACX,OAAO,gBAAgB,CAAC;IAC5B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport { ErrorBar, MessageThread, ParticipantList, SendBox, TypingIndicator } from '@internal/react-components';\n\nimport { useHandlers } from './useHandlers';\nimport { useSelector } from './useSelector';\nimport { SendBoxSelector, sendBoxSelector } from '../sendBoxSelector';\nimport { MessageThreadSelector, messageThreadSelectorWithThread } from '../messageThreadSelector';\nimport { TypingIndicatorSelector, typingIndicatorSelector } from '../typingIndicatorSelector';\nimport { Common, AreEqual } from '@internal/acs-ui-common';\nimport { ChatHandlers } from '../handlers/createHandlers';\nimport { ChatParticipantListSelector, chatParticipantListSelector } from '../chatParticipantListSelector';\nimport { ErrorBarSelector, errorBarSelector } from '../errorBarSelector';\nimport { ChatThreadClientContext } from '../providers/ChatThreadClientProvider';\nimport { useContext } from 'react';\n\n/**\n * Primary hook to get all hooks necessary for a chat Component.\n *\n * Most straightforward usage of chat components looks like:\n *\n * @example\n * ```\n * import { ParticipantList, usePropsFor } from '@azure/communication-react';\n *\n * const App = (): JSX.Element => {\n * // ... code to setup Providers ...\n *\n * return <ParticipantList {...usePropsFor(ParticipantList)}/>\n * }\n * ```\n *\n * @public\n */\nexport const usePropsFor = <Component extends (props: any) => JSX.Element>(\n component: Component\n): GetSelector<Component> extends (props: any) => any\n ? ReturnType<GetSelector<Component>> & Common<ChatHandlers, Parameters<Component>[0]>\n : undefined => {\n const selector = getSelector(component);\n const props = useSelector(selector);\n const handlers = useHandlers<Parameters<Component>[0]>(component);\n if (props !== undefined) {\n return { ...props, ...handlers } as any;\n }\n return undefined as any;\n};\n\n/**\n * Specific type of the selector applicable to a given Component.\n *\n * @public\n */\nexport type GetSelector<Component extends (props: any) => JSX.Element | undefined> = AreEqual<\n Component,\n typeof SendBox\n> extends true\n ? SendBoxSelector\n : AreEqual<Component, typeof MessageThread> extends true\n ? MessageThreadSelector\n : AreEqual<Component, typeof TypingIndicator> extends true\n ? TypingIndicatorSelector\n : AreEqual<Component, typeof ParticipantList> extends true\n ? ChatParticipantListSelector\n : AreEqual<Component, typeof ErrorBar> extends true\n ? ErrorBarSelector\n : undefined;\n\n/**\n * Get the selector for a specified component.\n *\n * Useful when implementing a custom component that utilizes the providers\n * exported from this library.\n *\n * @public\n */\nexport const getSelector = <Component extends (props: any) => JSX.Element | undefined>(\n component: Component\n): GetSelector<Component> => {\n return findSelector(component);\n};\n\nconst messageThreadSelectorsByThread: { [key: string]: MessageThreadSelector } = {};\n\nconst findSelector = (component: (props: any) => JSX.Element | undefined): any => {\n // For the message thread selector we need to create a new one for each thread\n // If we have just one for the entire app, then we will have updates when not expecting due to\n // the arguments changing\n const getMessageThreadSelector: () => MessageThreadSelector = () => {\n const threadId = useContext(ChatThreadClientContext)?.threadId ?? 'default-id-when-not-in-provider';\n let messageThreadSelectorImpl = messageThreadSelectorsByThread[threadId];\n if (!messageThreadSelectorImpl) {\n messageThreadSelectorsByThread[threadId] = messageThreadSelectorWithThread();\n messageThreadSelectorImpl = messageThreadSelectorsByThread[threadId];\n }\n return messageThreadSelectorImpl;\n };\n\n switch (component) {\n case SendBox:\n return sendBoxSelector;\n case MessageThread:\n return getMessageThreadSelector();\n case TypingIndicator:\n return typingIndicatorSelector;\n case ParticipantList:\n return chatParticipantListSelector;\n case ErrorBar:\n return errorBarSelector;\n }\n return undefined;\n};\n"]}
1
+ {"version":3,"file":"usePropsFor.js","sourceRoot":"","sources":["../../../../../../chat-component-bindings/src/hooks/usePropsFor.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE,sCAAmC;AAEhH,mDAAmD;AACnD,OAAO,EAAE,eAAe,EAAE,sCAAmC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAmB,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAyB,+BAA+B,EAAE,MAAM,0BAA0B,CAAC;AAClG,OAAO,EAA2B,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAG9F,OAAO,EAA+B,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC1G,OAAO,EAAoB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,SAAoB,EAGR,EAAE;IACd,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,WAAW,CAA2B,SAAS,CAAC,CAAC;IAClE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,gCAAK,KAAK,GAAK,QAAQ,CAAS,CAAC;IAC1C,CAAC;IACD,OAAO,SAAgB,CAAC;AAC1B,CAAC,CAAC;AAwBF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,SAAoB,EACI,EAAE;IAC1B,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,8BAA8B,GAA6C,EAAE,CAAC;AAEpF,MAAM,YAAY,GAAG,CAAC,SAAkD,EAAO,EAAE;IAC/E,8EAA8E;IAC9E,8FAA8F;IAC9F,yBAAyB;IACzB,MAAM,wBAAwB,GAAgC,GAAG,EAAE;;QACjE,MAAM,QAAQ,GAAG,MAAA,MAAA,UAAU,CAAC,uBAAuB,CAAC,0CAAE,QAAQ,mCAAI,iCAAiC,CAAC;QACpG,IAAI,yBAAyB,GAAG,8BAA8B,CAAC,QAAQ,CAAC,CAAC;QACzE,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAC/B,8BAA8B,CAAC,QAAQ,CAAC,GAAG,+BAA+B,EAAE,CAAC;YAC7E,yBAAyB,GAAG,8BAA8B,CAAC,QAAQ,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,yBAAyB,CAAC;IACnC,CAAC,CAAC;IAEF,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,eAAe,CAAC;QACzB,mDAAmD;QACnD,KAAK,eAAe;YAClB,OAAO,eAAe,CAAC;QACzB,KAAK,aAAa;YAChB,OAAO,wBAAwB,EAAE,CAAC;QACpC,KAAK,eAAe;YAClB,OAAO,uBAAuB,CAAC;QACjC,KAAK,eAAe;YAClB,OAAO,2BAA2B,CAAC;QACrC,KAAK,QAAQ;YACX,OAAO,gBAAgB,CAAC;IAC5B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport { ErrorBar, MessageThread, ParticipantList, SendBox, TypingIndicator } from '@internal/react-components';\n\n/* @conditional-compile-remove(rich-text-editor) */\nimport { RichTextSendBox } from '@internal/react-components';\n\nimport { useHandlers } from './useHandlers';\nimport { useSelector } from './useSelector';\nimport { SendBoxSelector, sendBoxSelector } from '../sendBoxSelector';\nimport { MessageThreadSelector, messageThreadSelectorWithThread } from '../messageThreadSelector';\nimport { TypingIndicatorSelector, typingIndicatorSelector } from '../typingIndicatorSelector';\nimport { Common, AreEqual } from '@internal/acs-ui-common';\nimport { ChatHandlers } from '../handlers/createHandlers';\nimport { ChatParticipantListSelector, chatParticipantListSelector } from '../chatParticipantListSelector';\nimport { ErrorBarSelector, errorBarSelector } from '../errorBarSelector';\nimport { ChatThreadClientContext } from '../providers/ChatThreadClientProvider';\nimport { useContext } from 'react';\n\n/**\n * Primary hook to get all hooks necessary for a chat Component.\n *\n * Most straightforward usage of chat components looks like:\n *\n * @example\n * ```\n * import { ParticipantList, usePropsFor } from '@azure/communication-react';\n *\n * const App = (): JSX.Element => {\n * // ... code to setup Providers ...\n *\n * return <ParticipantList {...usePropsFor(ParticipantList)}/>\n * }\n * ```\n *\n * @public\n */\nexport const usePropsFor = <Component extends (props: any) => JSX.Element>(\n component: Component\n): GetSelector<Component> extends (props: any) => any\n ? ReturnType<GetSelector<Component>> & Common<ChatHandlers, Parameters<Component>[0]>\n : undefined => {\n const selector = getSelector(component);\n const props = useSelector(selector);\n const handlers = useHandlers<Parameters<Component>[0]>(component);\n if (props !== undefined) {\n return { ...props, ...handlers } as any;\n }\n return undefined as any;\n};\n\n/**\n * Specific type of the selector applicable to a given Component.\n *\n * @public\n */\nexport type GetSelector<Component extends (props: any) => JSX.Element | undefined> = AreEqual<\n Component,\n typeof SendBox\n> extends true\n ? SendBoxSelector\n : AreEqual<Component, typeof RichTextSendBox> extends true\n ? /* @conditional-compile-remove(rich-text-editor) */ SendBoxSelector\n : AreEqual<Component, typeof MessageThread> extends true\n ? MessageThreadSelector\n : AreEqual<Component, typeof TypingIndicator> extends true\n ? TypingIndicatorSelector\n : AreEqual<Component, typeof ParticipantList> extends true\n ? ChatParticipantListSelector\n : AreEqual<Component, typeof ErrorBar> extends true\n ? ErrorBarSelector\n : undefined;\n\n/**\n * Get the selector for a specified component.\n *\n * Useful when implementing a custom component that utilizes the providers\n * exported from this library.\n *\n * @public\n */\nexport const getSelector = <Component extends (props: any) => JSX.Element | undefined>(\n component: Component\n): GetSelector<Component> => {\n return findSelector(component);\n};\n\nconst messageThreadSelectorsByThread: { [key: string]: MessageThreadSelector } = {};\n\nconst findSelector = (component: (props: any) => JSX.Element | undefined): any => {\n // For the message thread selector we need to create a new one for each thread\n // If we have just one for the entire app, then we will have updates when not expecting due to\n // the arguments changing\n const getMessageThreadSelector: () => MessageThreadSelector = () => {\n const threadId = useContext(ChatThreadClientContext)?.threadId ?? 'default-id-when-not-in-provider';\n let messageThreadSelectorImpl = messageThreadSelectorsByThread[threadId];\n if (!messageThreadSelectorImpl) {\n messageThreadSelectorsByThread[threadId] = messageThreadSelectorWithThread();\n messageThreadSelectorImpl = messageThreadSelectorsByThread[threadId];\n }\n return messageThreadSelectorImpl;\n };\n\n switch (component) {\n case SendBox:\n return sendBoxSelector;\n /* @conditional-compile-remove(rich-text-editor) */\n case RichTextSendBox:\n return sendBoxSelector;\n case MessageThread:\n return getMessageThreadSelector();\n case TypingIndicator:\n return typingIndicatorSelector;\n case ParticipantList:\n return chatParticipantListSelector;\n case ErrorBar:\n return errorBarSelector;\n }\n return undefined;\n};\n"]}
@@ -49,7 +49,6 @@ const extractTeamsAttachmentsMetadata = (attachments) => {
49
49
  /* @conditional-compile-remove(file-sharing) */
50
50
  if (attachmentType === 'file') {
51
51
  files.push({
52
- attachmentType: attachmentType,
53
52
  id: attachment.id,
54
53
  name: (_a = attachment.name) !== null && _a !== void 0 ? _a : '',
55
54
  extension: contentType !== null && contentType !== void 0 ? contentType : '',
@@ -91,9 +90,7 @@ const mapAttachmentType = (attachmentType) => {
91
90
  };
92
91
  /* @conditional-compile-remove(file-sharing) */
93
92
  const extractAttachmentUrl = (attachment) => {
94
- /* @conditional-compile-remove(file-sharing) */
95
- return attachment.attachmentType === 'file' && attachment.previewUrl ? attachment.previewUrl : attachment.url || '';
96
- return attachment.url || '';
93
+ return attachment.previewUrl ? attachment.previewUrl : attachment.url || '';
97
94
  };
98
95
  const processChatMessageContent = (message) => {
99
96
  var _a, _b, _c, _d;
@@ -108,11 +105,11 @@ const processChatMessageContent = (message) => {
108
105
  if (content) {
109
106
  const document = new DOMParser().parseFromString(content !== null && content !== void 0 ? content : '', 'text/html');
110
107
  document.querySelectorAll('img').forEach((img) => {
111
- var _a, _b, _c;
108
+ var _a, _b;
112
109
  const attachmentPreviewUrl = (_a = attachments.find((attachment) => attachment.id === img.id)) === null || _a === void 0 ? void 0 : _a.previewUrl;
113
110
  if (attachmentPreviewUrl) {
114
- const src = (_c = (_b = message.resourceCache) === null || _b === void 0 ? void 0 : _b[attachmentPreviewUrl]) !== null && _c !== void 0 ? _c : '';
115
- img.src = src;
111
+ const resourceCache = (_b = message.resourceCache) === null || _b === void 0 ? void 0 : _b[attachmentPreviewUrl];
112
+ img.src = getResourceSourceUrl(resourceCache);
116
113
  }
117
114
  });
118
115
  content = document.body.innerHTML;
@@ -134,15 +131,24 @@ const processChatMessageContent = (message) => {
134
131
  };
135
132
  /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
136
133
  const generateImageAttachmentImgHtml = (message, attachment) => {
137
- var _a, _b;
134
+ var _a;
138
135
  if (attachment.previewUrl !== undefined) {
139
136
  const contentType = extractAttachmentContentTypeFromName(attachment.name);
140
- const src = (_b = (_a = message.resourceCache) === null || _a === void 0 ? void 0 : _a[attachment.previewUrl]) !== null && _b !== void 0 ? _b : '';
137
+ const resourceCache = (_a = message.resourceCache) === null || _a === void 0 ? void 0 : _a[attachment.previewUrl];
138
+ const src = getResourceSourceUrl(resourceCache);
141
139
  return `\r\n<p><img alt="image" src="${src}" itemscope="${contentType}" id="${attachment.id}"></p>`;
142
140
  }
143
141
  return '';
144
142
  };
145
143
  /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
144
+ const getResourceSourceUrl = (result) => {
145
+ let src = 'blob://';
146
+ if (result && result.error === undefined) {
147
+ src = result.sourceUrl;
148
+ }
149
+ return src;
150
+ };
151
+ /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
146
152
  const extractAttachmentContentTypeFromName = (name) => {
147
153
  if (name === undefined) {
148
154
  return '';
@@ -1 +1 @@
1
- {"version":3,"file":"messageThreadSelector.js","sourceRoot":"","sources":["../../../../../chat-component-bindings/src/messageThreadSelector.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport {\n ChatBaseSelectorProps,\n getChatMessages,\n getIsLargeGroup,\n getLatestReadTime,\n getParticipants,\n getReadReceipts,\n getUserId\n} from './baseSelectors';\nimport { toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport { ChatClientState, ChatMessageWithStatus } from '@internal/chat-stateful-client';\nimport { memoizeFnAll } from '@internal/acs-ui-common';\nimport {\n ChatMessage,\n Message,\n CommunicationParticipant,\n SystemMessage,\n MessageContentType,\n ReadReceiptsBySenderId\n} from '@internal/react-components';\n/* @conditional-compile-remove(data-loss-prevention) */\nimport { BlockedMessage } from '@internal/react-components';\nimport { createSelector } from 'reselect';\n/* @conditional-compile-remove(data-loss-prevention) */\nimport { DEFAULT_DATA_LOSS_PREVENTION_POLICY_URL } from './utils/constants';\nimport { ACSKnownMessageType } from './utils/constants';\nimport { updateMessagesWithAttached } from './utils/updateMessagesWithAttached';\n/* @conditional-compile-remove(file-sharing) */\nimport { FileMetadata } from '@internal/react-components';\n/* @conditional-compile-remove(file-sharing) */\nimport { ChatAttachmentType } from '@azure/communication-chat';\nimport { ChatAttachment } from '@azure/communication-chat';\nimport type { ChatParticipant } from '@azure/communication-chat';\n/* @conditional-compile-remove(file-sharing) */\nimport { ChatAttachmentType as AttachmentType } from '@internal/react-components';\n\nconst memoizedAllConvertChatMessage = memoizeFnAll(\n (\n _key: string,\n chatMessage: ChatMessageWithStatus,\n userId: string,\n isSeen: boolean,\n isLargeGroup: boolean\n ): Message => {\n const messageType = chatMessage.type.toLowerCase();\n /* @conditional-compile-remove(data-loss-prevention) */\n if (chatMessage.policyViolation) {\n return convertToUiBlockedMessage(chatMessage, userId, isSeen, isLargeGroup);\n }\n if (\n messageType === ACSKnownMessageType.text ||\n messageType === ACSKnownMessageType.richtextHtml ||\n messageType === ACSKnownMessageType.html\n ) {\n return convertToUiChatMessage(chatMessage, userId, isSeen, isLargeGroup);\n } else {\n return convertToUiSystemMessage(chatMessage);\n }\n }\n);\n\n/* @conditional-compile-remove(file-sharing) */\nconst extractAttachedFilesMetadata = (metadata: Record<string, string>): FileMetadata[] => {\n const fileMetadata = metadata.fileSharingMetadata;\n if (!fileMetadata) {\n return [];\n }\n try {\n return JSON.parse(fileMetadata);\n } catch (e) {\n console.error(e);\n return [];\n }\n};\n/* @conditional-compile-remove(file-sharing) */\nconst extractTeamsAttachmentsMetadata = (\n attachments: ChatAttachment[]\n): {\n /* @conditional-compile-remove(file-sharing) */ files: FileMetadata[];\n} => {\n /* @conditional-compile-remove(file-sharing) */\n const files: FileMetadata[] = [];\n attachments.forEach((attachment) => {\n const attachmentType = mapAttachmentType(attachment.attachmentType);\n /* @conditional-compile-remove(file-sharing) */\n const contentType = extractAttachmentContentTypeFromName(attachment.name);\n /* @conditional-compile-remove(file-sharing) */\n if (attachmentType === 'file') {\n files.push({\n attachmentType: attachmentType,\n id: attachment.id,\n name: attachment.name ?? '',\n extension: contentType ?? '',\n url: extractAttachmentUrl(attachment),\n payload: { teamsFileAttachment: 'true' }\n });\n }\n });\n return {\n /* @conditional-compile-remove(file-sharing) */ files\n };\n};\n\n/* @conditional-compile-remove(data-loss-prevention) */\nconst convertToUiBlockedMessage = (\n message: ChatMessageWithStatus,\n userId: string,\n isSeen: boolean,\n isLargeGroup: boolean\n): BlockedMessage => {\n const messageSenderId = message.sender !== undefined ? toFlatCommunicationIdentifier(message.sender) : userId;\n return {\n messageType: 'blocked',\n createdOn: message.createdOn,\n warningText: undefined,\n status: !isLargeGroup && message.status === 'delivered' && isSeen ? 'seen' : message.status,\n senderDisplayName: message.senderDisplayName,\n senderId: messageSenderId,\n messageId: message.id,\n deletedOn: message.deletedOn,\n mine: messageSenderId === userId,\n link: DEFAULT_DATA_LOSS_PREVENTION_POLICY_URL\n };\n};\n\n/* @conditional-compile-remove(file-sharing) */\nconst mapAttachmentType = (attachmentType: ChatAttachmentType): AttachmentType => {\n if (attachmentType === 'image') {\n return 'inlineImage';\n }\n /* @conditional-compile-remove(file-sharing) */\n if (attachmentType === 'file') {\n return 'file';\n }\n return 'unknown';\n};\n\n/* @conditional-compile-remove(file-sharing) */\nconst extractAttachmentUrl = (attachment: ChatAttachment): string => {\n /* @conditional-compile-remove(file-sharing) */\n return attachment.attachmentType === 'file' && attachment.previewUrl ? attachment.previewUrl : attachment.url || '';\n return attachment.url || '';\n};\nconst processChatMessageContent = (message: ChatMessageWithStatus): string | undefined => {\n let content = message.content?.message;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n\n if (\n message.content?.attachments &&\n message.content?.attachments.length > 0 &&\n sanitizedMessageContentType(message.type).includes('html')\n ) {\n const attachments: ChatAttachment[] = message.content?.attachments;\n // Fill in the src here\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n if (content) {\n const document = new DOMParser().parseFromString(content ?? '', 'text/html');\n document.querySelectorAll('img').forEach((img) => {\n const attachmentPreviewUrl = attachments.find((attachment) => attachment.id === img.id)?.previewUrl;\n if (attachmentPreviewUrl) {\n const src = message.resourceCache?.[attachmentPreviewUrl] ?? '';\n img.src = src;\n }\n });\n content = document.body.innerHTML;\n }\n\n const teamsImageHtmlContent = attachments\n .filter(\n (attachment) =>\n attachment.attachmentType === 'image' &&\n attachment.previewUrl !== undefined &&\n !message.content?.message?.includes(attachment.id)\n )\n .map((attachment) => generateImageAttachmentImgHtml(message, attachment))\n .join('');\n if (teamsImageHtmlContent) {\n return (content ?? '') + teamsImageHtmlContent;\n }\n }\n return content;\n};\n\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nconst generateImageAttachmentImgHtml = (message: ChatMessageWithStatus, attachment: ChatAttachment): string => {\n if (attachment.previewUrl !== undefined) {\n const contentType = extractAttachmentContentTypeFromName(attachment.name);\n const src = message.resourceCache?.[attachment.previewUrl] ?? '';\n return `\\r\\n<p><img alt=\"image\" src=\"${src}\" itemscope=\"${contentType}\" id=\"${attachment.id}\"></p>`;\n }\n\n return '';\n};\n\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nconst extractAttachmentContentTypeFromName = (name?: string): string => {\n if (name === undefined) {\n return '';\n }\n const indexOfLastDot = name.lastIndexOf('.');\n if (indexOfLastDot === undefined || indexOfLastDot < 0) {\n return '';\n }\n const contentType = name.substring(indexOfLastDot + 1);\n return contentType;\n};\n\n/* @conditional-compile-remove(file-sharing) @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nconst extractAttachmentsMetadata = (\n message: ChatMessageWithStatus\n): {\n /* @conditional-compile-remove(file-sharing) */ files: FileMetadata[];\n} => {\n /* @conditional-compile-remove(file-sharing) */\n let files: FileMetadata[] = [];\n\n /* @conditional-compile-remove(file-sharing) */\n if (message.metadata) {\n files = files.concat(extractAttachedFilesMetadata(message.metadata));\n }\n\n /* @conditional-compile-remove(file-sharing) */\n if (message.content?.attachments) {\n const teamsAttachments = extractTeamsAttachmentsMetadata(message.content?.attachments);\n /* @conditional-compile-remove(file-sharing) */\n files = files.concat(teamsAttachments.files);\n }\n\n return {\n /* @conditional-compile-remove(file-sharing) */ files\n };\n};\nconst convertToUiChatMessage = (\n message: ChatMessageWithStatus,\n userId: string,\n isSeen: boolean,\n isLargeGroup: boolean\n): ChatMessage => {\n const messageSenderId = message.sender !== undefined ? toFlatCommunicationIdentifier(message.sender) : userId;\n /* @conditional-compile-remove(file-sharing) @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n const { /* @conditional-compile-remove(file-sharing) */ files } = extractAttachmentsMetadata(message);\n return {\n messageType: 'chat',\n createdOn: message.createdOn,\n content: processChatMessageContent(message),\n contentType: sanitizedMessageContentType(message.type),\n status: !isLargeGroup && message.status === 'delivered' && isSeen ? 'seen' : message.status,\n senderDisplayName: message.senderDisplayName,\n senderId: messageSenderId,\n messageId: message.id,\n clientMessageId: message.clientMessageId,\n editedOn: message.editedOn,\n deletedOn: message.deletedOn,\n mine: messageSenderId === userId,\n metadata: message.metadata,\n /* @conditional-compile-remove(file-sharing) */\n files\n };\n};\nconst convertToUiSystemMessage = (message: ChatMessageWithStatus): SystemMessage => {\n const systemMessageType = message.type;\n if (systemMessageType === 'participantAdded' || systemMessageType === 'participantRemoved') {\n return {\n messageType: 'system',\n systemMessageType,\n createdOn: message.createdOn,\n participants:\n message.content?.participants\n // TODO: In our moderator logic, we use undefined name as our displayName for moderator, which should be filtered out\n // Once we have a better solution to identify the moderator, remove this line\n ?.filter((participant: ChatParticipant) => participant.displayName && participant.displayName !== '')\n .map(\n (participant: ChatParticipant): CommunicationParticipant => ({\n userId: toFlatCommunicationIdentifier(participant.id),\n displayName: participant.displayName\n })\n ) ?? [],\n messageId: message.id,\n iconName: systemMessageType === 'participantAdded' ? 'PeopleAdd' : 'PeopleBlock'\n };\n } else {\n // Only topic updated type left, according to ACSKnown type\n return {\n messageType: 'system',\n systemMessageType: 'topicUpdated',\n createdOn: message.createdOn,\n topic: message.content?.topic ?? '',\n messageId: message.id,\n iconName: 'Edit'\n };\n }\n};\n\n/**\n * Selector type for {@link MessageThread} component.\n *\n * @public\n */\nexport type MessageThreadSelector = (\n state: ChatClientState,\n props: ChatBaseSelectorProps\n) => {\n userId: string;\n showMessageStatus: boolean;\n messages: Message[];\n};\n\n/** Returns `true` if the message has participants and at least one participant has a display name. */\nconst hasValidParticipant = (chatMessage: ChatMessageWithStatus): boolean =>\n !!chatMessage.content?.participants && chatMessage.content.participants.some((p: ChatParticipant) => !!p.displayName);\n\n/**\n *\n * @private\n */\nexport const messageThreadSelectorWithThread: () => MessageThreadSelector = () =>\n createSelector(\n [getUserId, getChatMessages, getLatestReadTime, getIsLargeGroup, getReadReceipts, getParticipants],\n (userId, chatMessages, latestReadTime, isLargeGroup, readReceipts, participants) => {\n // We can't get displayName in teams meeting interop for now, disable rr feature when it is teams interop\n const isTeamsInterop = Object.values(participants).find((p) => 'microsoftTeamsUserId' in p.id) !== undefined;\n\n // get number of participants\n // filter out the non valid participants (no display name)\n // Read Receipt details will be disabled when participant count is 0\n const participantCount = isTeamsInterop\n ? undefined\n : Object.values(participants).filter((p) => p.displayName && p.displayName !== '').length;\n\n // creating key value pairs of senderID: last read message information\n\n const readReceiptsBySenderId: ReadReceiptsBySenderId = {};\n\n // readReceiptsBySenderId[senderID] gets updated every time a new message is read by this sender\n // in this way we can make sure that we are only saving the latest read message id and read on time for each sender\n readReceipts\n .filter((r) => r.sender && toFlatCommunicationIdentifier(r.sender) !== userId)\n .forEach((r) => {\n readReceiptsBySenderId[toFlatCommunicationIdentifier(r.sender)] = {\n lastReadMessage: r.chatMessageId,\n displayName: participants[toFlatCommunicationIdentifier(r.sender)]?.displayName ?? ''\n };\n });\n\n // A function takes parameter above and generate return value\n const convertedMessages = memoizedAllConvertChatMessage((memoizedFn) =>\n Object.values(chatMessages)\n .filter(\n (message) =>\n message.type.toLowerCase() === ACSKnownMessageType.text ||\n message.type.toLowerCase() === ACSKnownMessageType.richtextHtml ||\n message.type.toLowerCase() === ACSKnownMessageType.html ||\n (message.type === ACSKnownMessageType.participantAdded && hasValidParticipant(message)) ||\n (message.type === ACSKnownMessageType.participantRemoved && hasValidParticipant(message)) ||\n // TODO: Add support for topicUpdated system messages in MessageThread component.\n // message.type === ACSKnownMessageType.topicUpdated ||\n message.clientMessageId !== undefined\n )\n .filter(isMessageValidToRender)\n .map((message) => {\n return memoizedFn(\n message.id ?? message.clientMessageId,\n message,\n userId,\n message.createdOn <= latestReadTime,\n isLargeGroup\n );\n })\n );\n updateMessagesWithAttached(convertedMessages);\n return {\n userId,\n showMessageStatus: true,\n messages: convertedMessages,\n participantCount,\n readReceiptsBySenderId\n };\n }\n );\nconst sanitizedMessageContentType = (type: string): MessageContentType => {\n const lowerCaseType = type.toLowerCase();\n return lowerCaseType === 'text' || lowerCaseType === 'html' || lowerCaseType === 'richtext/html'\n ? lowerCaseType\n : 'unknown';\n};\nconst isMessageValidToRender = (message: ChatMessageWithStatus): boolean => {\n if (message.deletedOn) {\n return false;\n }\n if (\n message.metadata?.fileSharingMetadata ||\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */ message.content?.attachments\n ) {\n return true;\n }\n /* @conditional-compile-remove(data-loss-prevention) */\n if (message.policyViolation) {\n return true;\n }\n return !!(message.content && message.content?.message !== '');\n};\n\n/**\n * Selector for {@link MessageThread} component.\n *\n * @public\n */\nexport const messageThreadSelector: MessageThreadSelector = messageThreadSelectorWithThread();\n"]}
1
+ {"version":3,"file":"messageThreadSelector.js","sourceRoot":"","sources":["../../../../../chat-component-bindings/src/messageThreadSelector.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport {\n ChatBaseSelectorProps,\n getChatMessages,\n getIsLargeGroup,\n getLatestReadTime,\n getParticipants,\n getReadReceipts,\n getUserId\n} from './baseSelectors';\nimport { toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport { ChatClientState, ChatMessageWithStatus, ResourceFetchResult } from '@internal/chat-stateful-client';\nimport { memoizeFnAll } from '@internal/acs-ui-common';\nimport {\n ChatMessage,\n Message,\n CommunicationParticipant,\n SystemMessage,\n MessageContentType,\n ReadReceiptsBySenderId\n} from '@internal/react-components';\n/* @conditional-compile-remove(data-loss-prevention) */\nimport { BlockedMessage } from '@internal/react-components';\nimport { createSelector } from 'reselect';\n/* @conditional-compile-remove(data-loss-prevention) */\nimport { DEFAULT_DATA_LOSS_PREVENTION_POLICY_URL } from './utils/constants';\nimport { ACSKnownMessageType } from './utils/constants';\nimport { updateMessagesWithAttached } from './utils/updateMessagesWithAttached';\n/* @conditional-compile-remove(file-sharing) */\nimport { AttachmentMetadata } from '@internal/react-components';\n/* @conditional-compile-remove(file-sharing) */\nimport { ChatAttachmentType } from '@azure/communication-chat';\nimport { ChatAttachment } from '@azure/communication-chat';\nimport type { ChatParticipant } from '@azure/communication-chat';\n/* @conditional-compile-remove(file-sharing) */\nimport { ChatAttachmentType as AttachmentType } from '@internal/react-components';\n\nconst memoizedAllConvertChatMessage = memoizeFnAll(\n (\n _key: string,\n chatMessage: ChatMessageWithStatus,\n userId: string,\n isSeen: boolean,\n isLargeGroup: boolean\n ): Message => {\n const messageType = chatMessage.type.toLowerCase();\n /* @conditional-compile-remove(data-loss-prevention) */\n if (chatMessage.policyViolation) {\n return convertToUiBlockedMessage(chatMessage, userId, isSeen, isLargeGroup);\n }\n if (\n messageType === ACSKnownMessageType.text ||\n messageType === ACSKnownMessageType.richtextHtml ||\n messageType === ACSKnownMessageType.html\n ) {\n return convertToUiChatMessage(chatMessage, userId, isSeen, isLargeGroup);\n } else {\n return convertToUiSystemMessage(chatMessage);\n }\n }\n);\n\n/* @conditional-compile-remove(file-sharing) */\nconst extractAttachedFilesMetadata = (metadata: Record<string, string>): AttachmentMetadata[] => {\n const fileMetadata = metadata.fileSharingMetadata;\n if (!fileMetadata) {\n return [];\n }\n try {\n return JSON.parse(fileMetadata);\n } catch (e) {\n console.error(e);\n return [];\n }\n};\n/* @conditional-compile-remove(file-sharing) */\nconst extractTeamsAttachmentsMetadata = (\n attachments: ChatAttachment[]\n): {\n /* @conditional-compile-remove(file-sharing) */ files: AttachmentMetadata[];\n} => {\n /* @conditional-compile-remove(file-sharing) */\n const files: AttachmentMetadata[] = [];\n attachments.forEach((attachment) => {\n const attachmentType = mapAttachmentType(attachment.attachmentType);\n /* @conditional-compile-remove(file-sharing) */\n const contentType = extractAttachmentContentTypeFromName(attachment.name);\n /* @conditional-compile-remove(file-sharing) */\n if (attachmentType === 'file') {\n files.push({\n id: attachment.id,\n name: attachment.name ?? '',\n extension: contentType ?? '',\n url: extractAttachmentUrl(attachment),\n payload: { teamsFileAttachment: 'true' }\n });\n }\n });\n return {\n /* @conditional-compile-remove(file-sharing) */ files\n };\n};\n\n/* @conditional-compile-remove(data-loss-prevention) */\nconst convertToUiBlockedMessage = (\n message: ChatMessageWithStatus,\n userId: string,\n isSeen: boolean,\n isLargeGroup: boolean\n): BlockedMessage => {\n const messageSenderId = message.sender !== undefined ? toFlatCommunicationIdentifier(message.sender) : userId;\n return {\n messageType: 'blocked',\n createdOn: message.createdOn,\n warningText: undefined,\n status: !isLargeGroup && message.status === 'delivered' && isSeen ? 'seen' : message.status,\n senderDisplayName: message.senderDisplayName,\n senderId: messageSenderId,\n messageId: message.id,\n deletedOn: message.deletedOn,\n mine: messageSenderId === userId,\n link: DEFAULT_DATA_LOSS_PREVENTION_POLICY_URL\n };\n};\n\n/* @conditional-compile-remove(file-sharing) */\nconst mapAttachmentType = (attachmentType: ChatAttachmentType): AttachmentType => {\n if (attachmentType === 'image') {\n return 'inlineImage';\n }\n /* @conditional-compile-remove(file-sharing) */\n if (attachmentType === 'file') {\n return 'file';\n }\n return 'unknown';\n};\n\n/* @conditional-compile-remove(file-sharing) */\nconst extractAttachmentUrl = (attachment: ChatAttachment): string => {\n return attachment.previewUrl ? attachment.previewUrl : attachment.url || '';\n};\nconst processChatMessageContent = (message: ChatMessageWithStatus): string | undefined => {\n let content = message.content?.message;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n\n if (\n message.content?.attachments &&\n message.content?.attachments.length > 0 &&\n sanitizedMessageContentType(message.type).includes('html')\n ) {\n const attachments: ChatAttachment[] = message.content?.attachments;\n // Fill in the src here\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n if (content) {\n const document = new DOMParser().parseFromString(content ?? '', 'text/html');\n document.querySelectorAll('img').forEach((img) => {\n const attachmentPreviewUrl = attachments.find((attachment) => attachment.id === img.id)?.previewUrl;\n if (attachmentPreviewUrl) {\n const resourceCache = message.resourceCache?.[attachmentPreviewUrl];\n img.src = getResourceSourceUrl(resourceCache);\n }\n });\n content = document.body.innerHTML;\n }\n\n const teamsImageHtmlContent = attachments\n .filter(\n (attachment) =>\n attachment.attachmentType === 'image' &&\n attachment.previewUrl !== undefined &&\n !message.content?.message?.includes(attachment.id)\n )\n .map((attachment) => generateImageAttachmentImgHtml(message, attachment))\n .join('');\n if (teamsImageHtmlContent) {\n return (content ?? '') + teamsImageHtmlContent;\n }\n }\n return content;\n};\n\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nconst generateImageAttachmentImgHtml = (message: ChatMessageWithStatus, attachment: ChatAttachment): string => {\n if (attachment.previewUrl !== undefined) {\n const contentType = extractAttachmentContentTypeFromName(attachment.name);\n const resourceCache = message.resourceCache?.[attachment.previewUrl];\n const src = getResourceSourceUrl(resourceCache);\n\n return `\\r\\n<p><img alt=\"image\" src=\"${src}\" itemscope=\"${contentType}\" id=\"${attachment.id}\"></p>`;\n }\n\n return '';\n};\n\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nconst getResourceSourceUrl = (result?: ResourceFetchResult): string => {\n let src = 'blob://';\n if (result && result.error === undefined) {\n src = result.sourceUrl;\n }\n return src;\n};\n\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nconst extractAttachmentContentTypeFromName = (name?: string): string => {\n if (name === undefined) {\n return '';\n }\n const indexOfLastDot = name.lastIndexOf('.');\n if (indexOfLastDot === undefined || indexOfLastDot < 0) {\n return '';\n }\n const contentType = name.substring(indexOfLastDot + 1);\n return contentType;\n};\n\n/* @conditional-compile-remove(file-sharing) @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nconst extractAttachmentsMetadata = (\n message: ChatMessageWithStatus\n): {\n /* @conditional-compile-remove(file-sharing) */ files: AttachmentMetadata[];\n} => {\n /* @conditional-compile-remove(file-sharing) */\n let files: AttachmentMetadata[] = [];\n\n /* @conditional-compile-remove(file-sharing) */\n if (message.metadata) {\n files = files.concat(extractAttachedFilesMetadata(message.metadata));\n }\n\n /* @conditional-compile-remove(file-sharing) */\n if (message.content?.attachments) {\n const teamsAttachments = extractTeamsAttachmentsMetadata(message.content?.attachments);\n /* @conditional-compile-remove(file-sharing) */\n files = files.concat(teamsAttachments.files);\n }\n\n return {\n /* @conditional-compile-remove(file-sharing) */ files\n };\n};\nconst convertToUiChatMessage = (\n message: ChatMessageWithStatus,\n userId: string,\n isSeen: boolean,\n isLargeGroup: boolean\n): ChatMessage => {\n const messageSenderId = message.sender !== undefined ? toFlatCommunicationIdentifier(message.sender) : userId;\n /* @conditional-compile-remove(file-sharing) @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n const { /* @conditional-compile-remove(file-sharing) */ files } = extractAttachmentsMetadata(message);\n return {\n messageType: 'chat',\n createdOn: message.createdOn,\n content: processChatMessageContent(message),\n contentType: sanitizedMessageContentType(message.type),\n status: !isLargeGroup && message.status === 'delivered' && isSeen ? 'seen' : message.status,\n senderDisplayName: message.senderDisplayName,\n senderId: messageSenderId,\n messageId: message.id,\n clientMessageId: message.clientMessageId,\n editedOn: message.editedOn,\n deletedOn: message.deletedOn,\n mine: messageSenderId === userId,\n metadata: message.metadata,\n /* @conditional-compile-remove(file-sharing) */\n files\n };\n};\nconst convertToUiSystemMessage = (message: ChatMessageWithStatus): SystemMessage => {\n const systemMessageType = message.type;\n if (systemMessageType === 'participantAdded' || systemMessageType === 'participantRemoved') {\n return {\n messageType: 'system',\n systemMessageType,\n createdOn: message.createdOn,\n participants:\n message.content?.participants\n // TODO: In our moderator logic, we use undefined name as our displayName for moderator, which should be filtered out\n // Once we have a better solution to identify the moderator, remove this line\n ?.filter((participant: ChatParticipant) => participant.displayName && participant.displayName !== '')\n .map(\n (participant: ChatParticipant): CommunicationParticipant => ({\n userId: toFlatCommunicationIdentifier(participant.id),\n displayName: participant.displayName\n })\n ) ?? [],\n messageId: message.id,\n iconName: systemMessageType === 'participantAdded' ? 'PeopleAdd' : 'PeopleBlock'\n };\n } else {\n // Only topic updated type left, according to ACSKnown type\n return {\n messageType: 'system',\n systemMessageType: 'topicUpdated',\n createdOn: message.createdOn,\n topic: message.content?.topic ?? '',\n messageId: message.id,\n iconName: 'Edit'\n };\n }\n};\n\n/**\n * Selector type for {@link MessageThread} component.\n *\n * @public\n */\nexport type MessageThreadSelector = (\n state: ChatClientState,\n props: ChatBaseSelectorProps\n) => {\n userId: string;\n showMessageStatus: boolean;\n messages: Message[];\n};\n\n/** Returns `true` if the message has participants and at least one participant has a display name. */\nconst hasValidParticipant = (chatMessage: ChatMessageWithStatus): boolean =>\n !!chatMessage.content?.participants && chatMessage.content.participants.some((p: ChatParticipant) => !!p.displayName);\n\n/**\n *\n * @private\n */\nexport const messageThreadSelectorWithThread: () => MessageThreadSelector = () =>\n createSelector(\n [getUserId, getChatMessages, getLatestReadTime, getIsLargeGroup, getReadReceipts, getParticipants],\n (userId, chatMessages, latestReadTime, isLargeGroup, readReceipts, participants) => {\n // We can't get displayName in teams meeting interop for now, disable rr feature when it is teams interop\n const isTeamsInterop = Object.values(participants).find((p) => 'microsoftTeamsUserId' in p.id) !== undefined;\n\n // get number of participants\n // filter out the non valid participants (no display name)\n // Read Receipt details will be disabled when participant count is 0\n const participantCount = isTeamsInterop\n ? undefined\n : Object.values(participants).filter((p) => p.displayName && p.displayName !== '').length;\n\n // creating key value pairs of senderID: last read message information\n\n const readReceiptsBySenderId: ReadReceiptsBySenderId = {};\n\n // readReceiptsBySenderId[senderID] gets updated every time a new message is read by this sender\n // in this way we can make sure that we are only saving the latest read message id and read on time for each sender\n readReceipts\n .filter((r) => r.sender && toFlatCommunicationIdentifier(r.sender) !== userId)\n .forEach((r) => {\n readReceiptsBySenderId[toFlatCommunicationIdentifier(r.sender)] = {\n lastReadMessage: r.chatMessageId,\n displayName: participants[toFlatCommunicationIdentifier(r.sender)]?.displayName ?? ''\n };\n });\n\n // A function takes parameter above and generate return value\n const convertedMessages = memoizedAllConvertChatMessage((memoizedFn) =>\n Object.values(chatMessages)\n .filter(\n (message) =>\n message.type.toLowerCase() === ACSKnownMessageType.text ||\n message.type.toLowerCase() === ACSKnownMessageType.richtextHtml ||\n message.type.toLowerCase() === ACSKnownMessageType.html ||\n (message.type === ACSKnownMessageType.participantAdded && hasValidParticipant(message)) ||\n (message.type === ACSKnownMessageType.participantRemoved && hasValidParticipant(message)) ||\n // TODO: Add support for topicUpdated system messages in MessageThread component.\n // message.type === ACSKnownMessageType.topicUpdated ||\n message.clientMessageId !== undefined\n )\n .filter(isMessageValidToRender)\n .map((message) => {\n return memoizedFn(\n message.id ?? message.clientMessageId,\n message,\n userId,\n message.createdOn <= latestReadTime,\n isLargeGroup\n );\n })\n );\n updateMessagesWithAttached(convertedMessages);\n return {\n userId,\n showMessageStatus: true,\n messages: convertedMessages,\n participantCount,\n readReceiptsBySenderId\n };\n }\n );\nconst sanitizedMessageContentType = (type: string): MessageContentType => {\n const lowerCaseType = type.toLowerCase();\n return lowerCaseType === 'text' || lowerCaseType === 'html' || lowerCaseType === 'richtext/html'\n ? lowerCaseType\n : 'unknown';\n};\nconst isMessageValidToRender = (message: ChatMessageWithStatus): boolean => {\n if (message.deletedOn) {\n return false;\n }\n if (\n message.metadata?.fileSharingMetadata ||\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */ message.content?.attachments\n ) {\n return true;\n }\n /* @conditional-compile-remove(data-loss-prevention) */\n if (message.policyViolation) {\n return true;\n }\n return !!(message.content && message.content?.message !== '');\n};\n\n/**\n * Selector for {@link MessageThread} component.\n *\n * @public\n */\nexport const messageThreadSelector: MessageThreadSelector = messageThreadSelectorWithThread();\n"]}
@@ -74,8 +74,8 @@ export class ChatContext {
74
74
  const cache = thread.chatMessages[messageId].resourceCache;
75
75
  if (cache) {
76
76
  Object.keys(cache).forEach((resourceUrl) => {
77
- const blobUrl = cache[resourceUrl];
78
- URL.revokeObjectURL(blobUrl);
77
+ const resource = cache[resourceUrl];
78
+ URL.revokeObjectURL(resource.sourceUrl);
79
79
  });
80
80
  }
81
81
  thread.chatMessages[messageId].resourceCache = undefined;
@@ -107,8 +107,8 @@ export class ChatContext {
107
107
  var _a;
108
108
  const message = (_a = draft.threads[threadId]) === null || _a === void 0 ? void 0 : _a.chatMessages[messageId];
109
109
  if (message && message.resourceCache) {
110
- const blobUrl = message.resourceCache[resourceUrl];
111
- URL.revokeObjectURL(blobUrl);
110
+ const resource = message.resourceCache[resourceUrl];
111
+ URL.revokeObjectURL(resource.sourceUrl);
112
112
  delete message.resourceCache[resourceUrl];
113
113
  }
114
114
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ChatContext.js","sourceRoot":"","sources":["../../../../../chat-stateful-client/src/ChatContext.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport EventEmitter from 'events';\nimport { enableMapSet, enablePatches, produce, Patch } from 'immer';\nimport {\n ChatClientState,\n ChatErrors,\n ChatThreadClientState,\n ChatThreadProperties,\n ChatErrorTarget,\n ChatError\n} from './ChatClientState';\nimport { ChatMessageWithStatus } from './types/ChatMessageWithStatus';\nimport { ChatMessageReadReceipt, ChatParticipant } from '@azure/communication-chat';\nimport { CommunicationIdentifierKind, UnknownIdentifierKind } from '@azure/communication-common';\nimport { AzureLogger, createClientLogger, getLogLevel } from '@azure/logger';\nimport { _safeJSONStringify, toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport { Constants } from './Constants';\nimport { TypingIndicatorReceivedEvent } from '@azure/communication-chat';\nimport { chatStatefulLogger } from './Logger';\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nimport type { CommunicationTokenCredential } from '@azure/communication-common';\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nimport { ResourceDownloadQueue, fetchImageSource } from './ResourceDownloadQueue';\n\nenableMapSet();\n// Needed to generate state diff for verbose logging.\nenablePatches();\n\n/**\n * @internal\n */\nexport class ChatContext {\n private _state: ChatClientState = {\n userId: { id: '' } as UnknownIdentifierKind,\n displayName: '',\n threads: {},\n latestErrors: {} as ChatErrors\n };\n private _batchMode = false;\n private _logger: AzureLogger;\n private _emitter: EventEmitter;\n private typingIndicatorInterval: number | undefined = undefined;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n private _inlineImageQueue: ResourceDownloadQueue | undefined = undefined;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n private _fullsizeImageQueue: ResourceDownloadQueue | undefined = undefined;\n constructor(\n maxListeners?: number,\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */ credential?: CommunicationTokenCredential\n ) {\n this._logger = createClientLogger('communication-react:chat-context');\n this._emitter = new EventEmitter();\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n if (credential) {\n this._inlineImageQueue = new ResourceDownloadQueue(this, credential);\n this._fullsizeImageQueue = new ResourceDownloadQueue(this, credential);\n }\n if (maxListeners) {\n this._emitter.setMaxListeners(maxListeners);\n }\n }\n\n public getState(): ChatClientState {\n return this._state;\n }\n\n public modifyState(modifier: (draft: ChatClientState) => void): void {\n const priorState = this._state;\n this._state = produce(this._state, modifier, (patches: Patch[]) => {\n if (getLogLevel() === 'verbose') {\n // Log to `info` because AzureLogger.verbose() doesn't show up in console.\n this._logger.info(`State change: ${_safeJSONStringify(patches)}`);\n }\n });\n if (!this._batchMode && this._state !== priorState) {\n this._emitter.emit('stateChanged', this._state);\n }\n }\n\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n public dispose(): void {\n this.modifyState((draft: ChatClientState) => {\n Object.keys(draft.threads).forEach((threadId) => {\n const thread = draft.threads[threadId];\n Object.keys(thread.chatMessages).forEach((messageId) => {\n const cache = thread.chatMessages[messageId].resourceCache;\n if (cache) {\n Object.keys(cache).forEach((resourceUrl) => {\n const blobUrl = cache[resourceUrl];\n URL.revokeObjectURL(blobUrl);\n });\n }\n thread.chatMessages[messageId].resourceCache = undefined;\n });\n });\n });\n // Any item in queue should be removed.\n }\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n public async downloadResourceToCache(threadId: string, messageId: string, resourceUrl: string): Promise<void> {\n let message = this.getState().threads[threadId]?.chatMessages[messageId];\n if (message && this._fullsizeImageQueue) {\n if (!message.resourceCache) {\n message = { ...message, resourceCache: {} };\n }\n // Need to discuss retry logic in case of failure\n this._fullsizeImageQueue.addMessage(message);\n await this._fullsizeImageQueue.startQueue(threadId, fetchImageSource, {\n singleUrl: resourceUrl\n });\n }\n }\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n public removeResourceFromCache(threadId: string, messageId: string, resourceUrl: string): void {\n this.modifyState((draft: ChatClientState) => {\n const message = draft.threads[threadId]?.chatMessages[messageId];\n if (message && message.resourceCache) {\n const blobUrl = message.resourceCache[resourceUrl];\n URL.revokeObjectURL(blobUrl);\n delete message.resourceCache[resourceUrl];\n }\n });\n }\n\n public setThread(threadId: string, threadState: ChatThreadClientState): void {\n this.modifyState((draft: ChatClientState) => {\n draft.threads[threadId] = threadState;\n });\n }\n\n public createThread(threadId: string, properties?: ChatThreadProperties): void {\n this.modifyState((draft: ChatClientState) => {\n draft.threads[threadId] = {\n chatMessages: {},\n threadId: threadId,\n properties: properties,\n participants: {},\n readReceipts: [],\n typingIndicators: [],\n latestReadTime: new Date(0)\n };\n });\n }\n\n public updateChatConfig(userId: CommunicationIdentifierKind, displayName: string): void {\n this.modifyState((draft: ChatClientState) => {\n draft.displayName = displayName;\n draft.userId = userId;\n });\n }\n\n public createThreadIfNotExist(threadId: string, properties?: ChatThreadProperties): boolean {\n const exists = Object.prototype.hasOwnProperty.call(this.getState().threads, threadId);\n if (!exists) {\n this.createThread(threadId, properties);\n return true;\n }\n return false;\n }\n\n public updateThread(threadId: string, properties?: ChatThreadProperties): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n if (thread) {\n thread.properties = properties;\n }\n });\n }\n\n public updateThreadTopic(threadId: string, topic?: string): void {\n this.modifyState((draft: ChatClientState) => {\n if (topic === undefined) {\n return;\n }\n const thread = draft.threads[threadId];\n if (thread && !thread.properties) {\n thread.properties = { topic: topic };\n } else if (thread && thread.properties) {\n thread.properties.topic = topic;\n }\n });\n }\n\n public deleteThread(threadId: string): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n if (thread) {\n delete draft.threads[threadId];\n }\n });\n }\n\n public setChatMessages(threadId: string, messages: { [key: string]: ChatMessageWithStatus }): void {\n this.modifyState((draft: ChatClientState) => {\n const threadState = draft.threads[threadId];\n if (threadState) {\n threadState.chatMessages = messages;\n }\n\n // remove typing indicator when receive messages\n const thread = draft.threads[threadId];\n if (thread) {\n for (const message of Object.values(messages)) {\n this.filterTypingIndicatorForUser(thread, message.sender);\n }\n }\n });\n }\n\n public updateChatMessageContent(threadId: string, messagesId: string, content: string | undefined): void {\n this.modifyState((draft: ChatClientState) => {\n const chatMessage = draft.threads[threadId]?.chatMessages[messagesId];\n if (chatMessage) {\n if (!chatMessage.content) {\n chatMessage.content = {};\n }\n chatMessage.content.message = content;\n }\n });\n }\n\n public deleteLocalMessage(threadId: string, localId: string): boolean {\n let localMessageDeleted = false;\n this.modifyState((draft: ChatClientState) => {\n const chatMessages = draft.threads[threadId]?.chatMessages;\n const message: ChatMessageWithStatus | undefined = chatMessages ? chatMessages[localId] : undefined;\n if (chatMessages && message && message.clientMessageId) {\n delete chatMessages[message.clientMessageId];\n localMessageDeleted = true;\n }\n });\n return localMessageDeleted;\n }\n\n public deleteMessage(threadId: string, id: string): void {\n this.modifyState((draft: ChatClientState) => {\n const chatMessages = draft.threads[threadId]?.chatMessages;\n if (chatMessages) {\n delete chatMessages[id];\n }\n });\n }\n\n public setParticipant(threadId: string, participant: ChatParticipant): void {\n this.modifyState((draft: ChatClientState) => {\n const participants = draft.threads[threadId]?.participants;\n if (participants) {\n participants[toFlatCommunicationIdentifier(participant.id)] = participant;\n }\n });\n }\n\n public setParticipants(threadId: string, participants: ChatParticipant[]): void {\n this.modifyState((draft: ChatClientState) => {\n const participantsMap = draft.threads[threadId]?.participants;\n if (participantsMap) {\n for (const participant of participants) {\n participantsMap[toFlatCommunicationIdentifier(participant.id)] = participant;\n }\n }\n });\n }\n\n public deleteParticipants(threadId: string, participantIds: CommunicationIdentifierKind[]): void {\n this.modifyState((draft: ChatClientState) => {\n const participants = draft.threads[threadId]?.participants;\n if (participants) {\n participantIds.forEach((id) => {\n delete participants[toFlatCommunicationIdentifier(id)];\n });\n }\n });\n }\n\n public deleteParticipant(threadId: string, participantId: CommunicationIdentifierKind): void {\n this.modifyState((draft: ChatClientState) => {\n const participants = draft.threads[threadId]?.participants;\n if (participants) {\n delete participants[toFlatCommunicationIdentifier(participantId)];\n }\n });\n }\n\n public addReadReceipt(threadId: string, readReceipt: ChatMessageReadReceipt): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n const readReceipts = thread?.readReceipts;\n if (thread && readReceipts) {\n // TODO(prprabhu): Replace `this.getState()` with `draft`?\n if (readReceipt.sender !== this.getState().userId && thread.latestReadTime < readReceipt.readOn) {\n thread.latestReadTime = readReceipt.readOn;\n }\n readReceipts.push(readReceipt);\n }\n });\n }\n\n private startTypingIndicatorCleanUp(): void {\n if (this.typingIndicatorInterval) {\n return;\n }\n this.typingIndicatorInterval = window.setInterval(() => {\n let isTypingActive = false;\n this.modifyState((draft: ChatClientState) => {\n for (const thread of Object.values(draft.threads)) {\n const filteredTypingIndicators = thread.typingIndicators.filter((typingIndicator) => {\n const timeGap = Date.now() - typingIndicator.receivedOn.getTime();\n return timeGap < Constants.TYPING_INDICATOR_MAINTAIN_TIME;\n });\n\n if (thread.typingIndicators.length !== filteredTypingIndicators.length) {\n thread.typingIndicators = filteredTypingIndicators;\n }\n if (thread.typingIndicators.length > 0) {\n isTypingActive = true;\n }\n }\n });\n\n if (!isTypingActive && this.typingIndicatorInterval) {\n window.clearInterval(this.typingIndicatorInterval);\n this.typingIndicatorInterval = undefined;\n }\n }, 1000);\n }\n\n public addTypingIndicator(threadId: string, typingIndicator: TypingIndicatorReceivedEvent): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n if (thread) {\n const typingIndicators = thread.typingIndicators;\n typingIndicators.push(typingIndicator);\n }\n });\n\n // Make sure we only maintain a period of typing indicator for perf purposes\n this.startTypingIndicatorCleanUp();\n }\n\n public setChatMessage(threadId: string, message: ChatMessageWithStatus): void {\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n this.parseAttachments(threadId, message);\n const { id: messageId, clientMessageId } = message;\n if (messageId || clientMessageId) {\n this.modifyState((draft: ChatClientState) => {\n const threadMessages = draft.threads[threadId]?.chatMessages;\n const isLocalIdInMap = threadMessages && clientMessageId && threadMessages[clientMessageId];\n const messageKey = !messageId || isLocalIdInMap ? clientMessageId : messageId;\n\n if (threadMessages && messageKey) {\n threadMessages[messageKey] = message;\n }\n\n // remove typing indicator when receive a message from a user\n const thread = draft.threads[threadId];\n if (thread) {\n this.filterTypingIndicatorForUser(thread, message.sender);\n }\n });\n }\n }\n\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n private parseAttachments(threadId: string, message: ChatMessageWithStatus): void {\n const attachments = message.content?.attachments;\n if (message.type === 'html' && attachments && attachments.length > 0) {\n if (\n this._inlineImageQueue &&\n !this._inlineImageQueue.containsMessageWithSameAttachments(message) &&\n message.resourceCache === undefined\n ) {\n // Need to discuss retry logic in case of failure\n this._inlineImageQueue.addMessage(message);\n this._inlineImageQueue.startQueue(threadId, fetchImageSource);\n }\n }\n }\n\n /**\n * Tees any errors encountered in an async function to the state.\n *\n * @param f Async function to execute.\n * @param target The error target to tee error to.\n * @returns Result of calling `f`. Also re-raises any exceptions thrown from `f`.\n * @throws ChatError. Exceptions thrown from `f` are tagged with the failed `target.\n */\n public withAsyncErrorTeedToState<Args extends unknown[], R>(\n f: (...args: Args) => Promise<R>,\n target: ChatErrorTarget\n ): (...args: Args) => Promise<R> {\n return async (...args: Args): Promise<R> => {\n try {\n return await f(...args);\n } catch (error) {\n const chatError = toChatError(target, error);\n this.setLatestError(target, chatError);\n throw chatError;\n }\n };\n }\n\n /**\n * Tees any errors encountered in an function to the state.\n *\n * @param f Function to execute.\n * @param target The error target to tee error to.\n * @returns Result of calling `f`. Also re-raises any exceptions thrown from `f`.\n * @throws ChatError. Exceptions thrown from `f` are tagged with the failed `target.\n */\n public withErrorTeedToState<Args extends unknown[], R>(\n f: (...args: Args) => R,\n target: ChatErrorTarget\n ): (...args: Args) => R {\n return (...args: Args): R => {\n try {\n chatStatefulLogger.info(`Chat stateful client target function called: ${target}`);\n return f(...args);\n } catch (error) {\n const chatError = toChatError(target, error);\n this.setLatestError(target, chatError);\n throw chatError;\n }\n };\n }\n\n private setLatestError(target: ChatErrorTarget, error: ChatError): void {\n this.modifyState((draft: ChatClientState) => {\n draft.latestErrors[target] = error;\n });\n }\n\n // This is a mutating function, only use it inside of a produce() function\n private filterTypingIndicatorForUser(thread: ChatThreadClientState, userId?: CommunicationIdentifierKind): void {\n if (!userId) {\n return;\n }\n const typingIndicators = thread.typingIndicators;\n const userIdAsKey = toFlatCommunicationIdentifier(userId);\n const filteredTypingIndicators = typingIndicators.filter(\n (typingIndicator) => toFlatCommunicationIdentifier(typingIndicator.sender) !== userIdAsKey\n );\n if (filteredTypingIndicators.length !== typingIndicators.length) {\n thread.typingIndicators = filteredTypingIndicators;\n }\n }\n\n /**\n * Batch updates to minimize `stateChanged` events across related operations.\n *\n * - A maximum of one `stateChanged` event is emitted, at the end of the operations.\n * - No `stateChanged` event is emitted if the state did not change through the operations.\n * - In case of an exception, state is reset to the prior value and no `stateChanged` event is emitted.\n *\n * All operations finished in this batch should be synchronous.\n * This function is not reentrant -- do not call batch() from within another batch().\n */\n public batch(operations: () => void): void {\n if (this._batchMode) {\n throw new Error('batch() called from within another batch()');\n }\n\n this._batchMode = true;\n const priorState = this._state;\n try {\n operations();\n if (this._state !== priorState) {\n this._emitter.emit('stateChanged', this._state);\n }\n } catch (e) {\n this._state = priorState;\n if (getLogLevel() === 'verbose') {\n this._logger.warning(`State rollback to: ${_safeJSONStringify(priorState)}`);\n }\n throw e;\n } finally {\n this._batchMode = false;\n }\n }\n\n public onStateChange(handler: (state: ChatClientState) => void): void {\n this._emitter.on('stateChanged', handler);\n }\n\n public offStateChange(handler: (state: ChatClientState) => void): void {\n this._emitter.off('stateChanged', handler);\n }\n}\n\nconst toChatError = (target: ChatErrorTarget, error: unknown): ChatError => {\n if (error instanceof Error) {\n return new ChatError(target, error);\n }\n return new ChatError(target, new Error(`${error}`));\n};\n"]}
1
+ {"version":3,"file":"ChatContext.js","sourceRoot":"","sources":["../../../../../chat-stateful-client/src/ChatContext.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;;;;;;;;;;AAElC,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAS,MAAM,OAAO,CAAC;AACpE,OAAO,EAML,SAAS,EACV,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAe,kBAAkB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,gCAAgC;AAC5F,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAG9C,uEAAuE;AACvE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAElF,YAAY,EAAE,CAAC;AACf,qDAAqD;AACrD,aAAa,EAAE,CAAC;AAEhB;;GAEG;AACH,MAAM,OAAO,WAAW;IAetB,YACE,YAAqB;IACrB,uEAAuE,CAAC,UAAyC;QAhB3G,WAAM,GAAoB;YAChC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAA2B;YAC3C,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,EAAE;YACX,YAAY,EAAE,EAAgB;SAC/B,CAAC;QACM,eAAU,GAAG,KAAK,CAAC;QAGnB,4BAAuB,GAAuB,SAAS,CAAC;QAChE,uEAAuE;QAC/D,sBAAiB,GAAsC,SAAS,CAAC;QACzE,uEAAuE;QAC/D,wBAAmB,GAAsC,SAAS,CAAC;QAKzE,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC,kCAAkC,CAAC,CAAC;QACtE,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QACnC,uEAAuE;QACvE,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,iBAAiB,GAAG,IAAI,qBAAqB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACrE,IAAI,CAAC,mBAAmB,GAAG,IAAI,qBAAqB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEM,WAAW,CAAC,QAA0C;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAgB,EAAE,EAAE;YAChE,IAAI,WAAW,EAAE,KAAK,SAAS,EAAE,CAAC;gBAChC,0EAA0E;gBAC1E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,uEAAuE;IAChE,OAAO;QACZ,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;oBACrD,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC;oBAC3D,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;4BACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;4BACpC,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;wBAC1C,CAAC,CAAC,CAAC;oBACL,CAAC;oBACD,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,aAAa,GAAG,SAAS,CAAC;gBAC3D,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,uCAAuC;IACzC,CAAC;IACD,uEAAuE;IAC1D,uBAAuB,CAAC,QAAgB,EAAE,SAAiB,EAAE,WAAmB;;;YAC3F,IAAI,OAAO,GAAG,MAAA,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACzE,IAAI,OAAO,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACxC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;oBAC3B,OAAO,mCAAQ,OAAO,KAAE,aAAa,EAAE,EAAE,GAAE,CAAC;gBAC9C,CAAC;gBACD,iDAAiD;gBACjD,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC7C,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,QAAQ,EAAE,gBAAgB,EAAE;oBACpE,SAAS,EAAE,WAAW;iBACvB,CAAC,CAAC;YACL,CAAC;;KACF;IACD,uEAAuE;IAChE,uBAAuB,CAAC,QAAgB,EAAE,SAAiB,EAAE,WAAmB;QACrF,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,OAAO,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACjE,IAAI,OAAO,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;gBACpD,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACxC,OAAO,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,SAAS,CAAC,QAAgB,EAAE,WAAkC;QACnE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,YAAY,CAAC,QAAgB,EAAE,UAAiC;QACrE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG;gBACxB,YAAY,EAAE,EAAE;gBAChB,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,UAAU;gBACtB,YAAY,EAAE,EAAE;gBAChB,YAAY,EAAE,EAAE;gBAChB,gBAAgB,EAAE,EAAE;gBACpB,cAAc,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;aAC5B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,gBAAgB,CAAC,MAAmC,EAAE,WAAmB;QAC9E,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;YAChC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,sBAAsB,CAAC,QAAgB,EAAE,UAAiC;QAC/E,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACvF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,YAAY,CAAC,QAAgB,EAAE,UAAiC;QACrE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,iBAAiB,CAAC,QAAgB,EAAE,KAAc;QACvD,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACjC,MAAM,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YACvC,CAAC;iBAAM,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACvC,MAAM,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,YAAY,CAAC,QAAgB;QAClC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,eAAe,CAAC,QAAgB,EAAE,QAAkD;QACzF,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,YAAY,GAAG,QAAQ,CAAC;YACtC,CAAC;YAED,gDAAgD;YAChD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,wBAAwB,CAAC,QAAgB,EAAE,UAAkB,EAAE,OAA2B;QAC/F,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,WAAW,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC,UAAU,CAAC,CAAC;YACtE,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzB,WAAW,CAAC,OAAO,GAAG,EAAE,CAAC;gBAC3B,CAAC;gBACD,WAAW,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,kBAAkB,CAAC,QAAgB,EAAE,OAAe;QACzD,IAAI,mBAAmB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,YAAY,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;YAC3D,MAAM,OAAO,GAAsC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpG,IAAI,YAAY,IAAI,OAAO,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;gBACvD,OAAO,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;gBAC7C,mBAAmB,GAAG,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAEM,aAAa,CAAC,QAAgB,EAAE,EAAU;QAC/C,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,YAAY,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;YAC3D,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,YAAY,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,QAAgB,EAAE,WAA4B;QAClE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,YAAY,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;YAC3D,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,6BAA6B,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC;YAC5E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,eAAe,CAAC,QAAgB,EAAE,YAA+B;QACtE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,eAAe,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;YAC9D,IAAI,eAAe,EAAE,CAAC;gBACpB,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;oBACvC,eAAe,CAAC,6BAA6B,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC;gBAC/E,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,kBAAkB,CAAC,QAAgB,EAAE,cAA6C;QACvF,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,YAAY,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;YAC3D,IAAI,YAAY,EAAE,CAAC;gBACjB,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;oBAC5B,OAAO,YAAY,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzD,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,iBAAiB,CAAC,QAAgB,EAAE,aAA0C;QACnF,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,YAAY,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;YAC3D,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,YAAY,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,QAAgB,EAAE,WAAmC;QACzE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,YAAY,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,YAAY,CAAC;YAC1C,IAAI,MAAM,IAAI,YAAY,EAAE,CAAC;gBAC3B,0DAA0D;gBAC1D,IAAI,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,cAAc,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;oBAChG,MAAM,CAAC,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;gBAC7C,CAAC;gBACD,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,2BAA2B;QACjC,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,uBAAuB,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE;YACrD,IAAI,cAAc,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;gBAC1C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClD,MAAM,wBAAwB,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,EAAE;wBAClF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;wBAClE,OAAO,OAAO,GAAG,SAAS,CAAC,8BAA8B,CAAC;oBAC5D,CAAC,CAAC,CAAC;oBAEH,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,KAAK,wBAAwB,CAAC,MAAM,EAAE,CAAC;wBACvE,MAAM,CAAC,gBAAgB,GAAG,wBAAwB,CAAC;oBACrD,CAAC;oBACD,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACvC,cAAc,GAAG,IAAI,CAAC;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBACpD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBACnD,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;YAC3C,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC;IAEM,kBAAkB,CAAC,QAAgB,EAAE,eAA6C;QACvF,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBACjD,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,4EAA4E;QAC5E,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IAEM,cAAc,CAAC,QAAgB,EAAE,OAA8B;QACpE,uEAAuE;QACvE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;QACnD,IAAI,SAAS,IAAI,eAAe,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;gBAC1C,MAAM,cAAc,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;gBAC7D,MAAM,cAAc,GAAG,cAAc,IAAI,eAAe,IAAI,cAAc,CAAC,eAAe,CAAC,CAAC;gBAC5F,MAAM,UAAU,GAAG,CAAC,SAAS,IAAI,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;gBAE9E,IAAI,cAAc,IAAI,UAAU,EAAE,CAAC;oBACjC,cAAc,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;gBACvC,CAAC;gBAED,6DAA6D;gBAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACvC,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,uEAAuE;IAC/D,gBAAgB,CAAC,QAAgB,EAAE,OAA8B;;QACvE,MAAM,WAAW,GAAG,MAAA,OAAO,CAAC,OAAO,0CAAE,WAAW,CAAC;QACjD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrE,IACE,IAAI,CAAC,iBAAiB;gBACtB,CAAC,IAAI,CAAC,iBAAiB,CAAC,kCAAkC,CAAC,OAAO,CAAC;gBACnE,OAAO,CAAC,aAAa,KAAK,SAAS,EACnC,CAAC;gBACD,iDAAiD;gBACjD,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC3C,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACI,yBAAyB,CAC9B,CAAgC,EAChC,MAAuB;QAEvB,OAAO,CAAO,GAAG,IAAU,EAAc,EAAE;YACzC,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC7C,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACvC,MAAM,SAAS,CAAC;YAClB,CAAC;QACH,CAAC,CAAA,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACI,oBAAoB,CACzB,CAAuB,EACvB,MAAuB;QAEvB,OAAO,CAAC,GAAG,IAAU,EAAK,EAAE;YAC1B,IAAI,CAAC;gBACH,kBAAkB,CAAC,IAAI,CAAC,gDAAgD,MAAM,EAAE,CAAC,CAAC;gBAClF,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC7C,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACvC,MAAM,SAAS,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,MAAuB,EAAE,KAAgB;QAC9D,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAClE,4BAA4B,CAAC,MAA6B,EAAE,MAAoC;QACtG,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACjD,MAAM,WAAW,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,wBAAwB,GAAG,gBAAgB,CAAC,MAAM,CACtD,CAAC,eAAe,EAAE,EAAE,CAAC,6BAA6B,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,WAAW,CAC3F,CAAC;QACF,IAAI,wBAAwB,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAChE,MAAM,CAAC,gBAAgB,GAAG,wBAAwB,CAAC;QACrD,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACI,KAAK,CAAC,UAAsB;QACjC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC;YACH,UAAU,EAAE,CAAC;YACb,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;YACzB,IAAI,WAAW,EAAE,KAAK,SAAS,EAAE,CAAC;gBAChC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAEM,aAAa,CAAC,OAAyC;QAC5D,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAEM,cAAc,CAAC,OAAyC;QAC7D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;CACF;AAED,MAAM,WAAW,GAAG,CAAC,MAAuB,EAAE,KAAc,EAAa,EAAE;IACzE,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport EventEmitter from 'events';\nimport { enableMapSet, enablePatches, produce, Patch } from 'immer';\nimport {\n ChatClientState,\n ChatErrors,\n ChatThreadClientState,\n ChatThreadProperties,\n ChatErrorTarget,\n ChatError\n} from './ChatClientState';\nimport { ChatMessageWithStatus } from './types/ChatMessageWithStatus';\nimport { ChatMessageReadReceipt, ChatParticipant } from '@azure/communication-chat';\nimport { CommunicationIdentifierKind, UnknownIdentifierKind } from '@azure/communication-common';\nimport { AzureLogger, createClientLogger, getLogLevel } from '@azure/logger';\nimport { _safeJSONStringify, toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport { Constants } from './Constants';\nimport { TypingIndicatorReceivedEvent } from '@azure/communication-chat';\nimport { chatStatefulLogger } from './Logger';\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nimport type { CommunicationTokenCredential } from '@azure/communication-common';\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nimport { ResourceDownloadQueue, fetchImageSource } from './ResourceDownloadQueue';\n\nenableMapSet();\n// Needed to generate state diff for verbose logging.\nenablePatches();\n\n/**\n * @internal\n */\nexport class ChatContext {\n private _state: ChatClientState = {\n userId: { id: '' } as UnknownIdentifierKind,\n displayName: '',\n threads: {},\n latestErrors: {} as ChatErrors\n };\n private _batchMode = false;\n private _logger: AzureLogger;\n private _emitter: EventEmitter;\n private typingIndicatorInterval: number | undefined = undefined;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n private _inlineImageQueue: ResourceDownloadQueue | undefined = undefined;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n private _fullsizeImageQueue: ResourceDownloadQueue | undefined = undefined;\n constructor(\n maxListeners?: number,\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */ credential?: CommunicationTokenCredential\n ) {\n this._logger = createClientLogger('communication-react:chat-context');\n this._emitter = new EventEmitter();\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n if (credential) {\n this._inlineImageQueue = new ResourceDownloadQueue(this, credential);\n this._fullsizeImageQueue = new ResourceDownloadQueue(this, credential);\n }\n if (maxListeners) {\n this._emitter.setMaxListeners(maxListeners);\n }\n }\n\n public getState(): ChatClientState {\n return this._state;\n }\n\n public modifyState(modifier: (draft: ChatClientState) => void): void {\n const priorState = this._state;\n this._state = produce(this._state, modifier, (patches: Patch[]) => {\n if (getLogLevel() === 'verbose') {\n // Log to `info` because AzureLogger.verbose() doesn't show up in console.\n this._logger.info(`State change: ${_safeJSONStringify(patches)}`);\n }\n });\n if (!this._batchMode && this._state !== priorState) {\n this._emitter.emit('stateChanged', this._state);\n }\n }\n\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n public dispose(): void {\n this.modifyState((draft: ChatClientState) => {\n Object.keys(draft.threads).forEach((threadId) => {\n const thread = draft.threads[threadId];\n Object.keys(thread.chatMessages).forEach((messageId) => {\n const cache = thread.chatMessages[messageId].resourceCache;\n if (cache) {\n Object.keys(cache).forEach((resourceUrl) => {\n const resource = cache[resourceUrl];\n URL.revokeObjectURL(resource.sourceUrl);\n });\n }\n thread.chatMessages[messageId].resourceCache = undefined;\n });\n });\n });\n // Any item in queue should be removed.\n }\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n public async downloadResourceToCache(threadId: string, messageId: string, resourceUrl: string): Promise<void> {\n let message = this.getState().threads[threadId]?.chatMessages[messageId];\n if (message && this._fullsizeImageQueue) {\n if (!message.resourceCache) {\n message = { ...message, resourceCache: {} };\n }\n // Need to discuss retry logic in case of failure\n this._fullsizeImageQueue.addMessage(message);\n await this._fullsizeImageQueue.startQueue(threadId, fetchImageSource, {\n singleUrl: resourceUrl\n });\n }\n }\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n public removeResourceFromCache(threadId: string, messageId: string, resourceUrl: string): void {\n this.modifyState((draft: ChatClientState) => {\n const message = draft.threads[threadId]?.chatMessages[messageId];\n if (message && message.resourceCache) {\n const resource = message.resourceCache[resourceUrl];\n URL.revokeObjectURL(resource.sourceUrl);\n delete message.resourceCache[resourceUrl];\n }\n });\n }\n\n public setThread(threadId: string, threadState: ChatThreadClientState): void {\n this.modifyState((draft: ChatClientState) => {\n draft.threads[threadId] = threadState;\n });\n }\n\n public createThread(threadId: string, properties?: ChatThreadProperties): void {\n this.modifyState((draft: ChatClientState) => {\n draft.threads[threadId] = {\n chatMessages: {},\n threadId: threadId,\n properties: properties,\n participants: {},\n readReceipts: [],\n typingIndicators: [],\n latestReadTime: new Date(0)\n };\n });\n }\n\n public updateChatConfig(userId: CommunicationIdentifierKind, displayName: string): void {\n this.modifyState((draft: ChatClientState) => {\n draft.displayName = displayName;\n draft.userId = userId;\n });\n }\n\n public createThreadIfNotExist(threadId: string, properties?: ChatThreadProperties): boolean {\n const exists = Object.prototype.hasOwnProperty.call(this.getState().threads, threadId);\n if (!exists) {\n this.createThread(threadId, properties);\n return true;\n }\n return false;\n }\n\n public updateThread(threadId: string, properties?: ChatThreadProperties): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n if (thread) {\n thread.properties = properties;\n }\n });\n }\n\n public updateThreadTopic(threadId: string, topic?: string): void {\n this.modifyState((draft: ChatClientState) => {\n if (topic === undefined) {\n return;\n }\n const thread = draft.threads[threadId];\n if (thread && !thread.properties) {\n thread.properties = { topic: topic };\n } else if (thread && thread.properties) {\n thread.properties.topic = topic;\n }\n });\n }\n\n public deleteThread(threadId: string): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n if (thread) {\n delete draft.threads[threadId];\n }\n });\n }\n\n public setChatMessages(threadId: string, messages: { [key: string]: ChatMessageWithStatus }): void {\n this.modifyState((draft: ChatClientState) => {\n const threadState = draft.threads[threadId];\n if (threadState) {\n threadState.chatMessages = messages;\n }\n\n // remove typing indicator when receive messages\n const thread = draft.threads[threadId];\n if (thread) {\n for (const message of Object.values(messages)) {\n this.filterTypingIndicatorForUser(thread, message.sender);\n }\n }\n });\n }\n\n public updateChatMessageContent(threadId: string, messagesId: string, content: string | undefined): void {\n this.modifyState((draft: ChatClientState) => {\n const chatMessage = draft.threads[threadId]?.chatMessages[messagesId];\n if (chatMessage) {\n if (!chatMessage.content) {\n chatMessage.content = {};\n }\n chatMessage.content.message = content;\n }\n });\n }\n\n public deleteLocalMessage(threadId: string, localId: string): boolean {\n let localMessageDeleted = false;\n this.modifyState((draft: ChatClientState) => {\n const chatMessages = draft.threads[threadId]?.chatMessages;\n const message: ChatMessageWithStatus | undefined = chatMessages ? chatMessages[localId] : undefined;\n if (chatMessages && message && message.clientMessageId) {\n delete chatMessages[message.clientMessageId];\n localMessageDeleted = true;\n }\n });\n return localMessageDeleted;\n }\n\n public deleteMessage(threadId: string, id: string): void {\n this.modifyState((draft: ChatClientState) => {\n const chatMessages = draft.threads[threadId]?.chatMessages;\n if (chatMessages) {\n delete chatMessages[id];\n }\n });\n }\n\n public setParticipant(threadId: string, participant: ChatParticipant): void {\n this.modifyState((draft: ChatClientState) => {\n const participants = draft.threads[threadId]?.participants;\n if (participants) {\n participants[toFlatCommunicationIdentifier(participant.id)] = participant;\n }\n });\n }\n\n public setParticipants(threadId: string, participants: ChatParticipant[]): void {\n this.modifyState((draft: ChatClientState) => {\n const participantsMap = draft.threads[threadId]?.participants;\n if (participantsMap) {\n for (const participant of participants) {\n participantsMap[toFlatCommunicationIdentifier(participant.id)] = participant;\n }\n }\n });\n }\n\n public deleteParticipants(threadId: string, participantIds: CommunicationIdentifierKind[]): void {\n this.modifyState((draft: ChatClientState) => {\n const participants = draft.threads[threadId]?.participants;\n if (participants) {\n participantIds.forEach((id) => {\n delete participants[toFlatCommunicationIdentifier(id)];\n });\n }\n });\n }\n\n public deleteParticipant(threadId: string, participantId: CommunicationIdentifierKind): void {\n this.modifyState((draft: ChatClientState) => {\n const participants = draft.threads[threadId]?.participants;\n if (participants) {\n delete participants[toFlatCommunicationIdentifier(participantId)];\n }\n });\n }\n\n public addReadReceipt(threadId: string, readReceipt: ChatMessageReadReceipt): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n const readReceipts = thread?.readReceipts;\n if (thread && readReceipts) {\n // TODO(prprabhu): Replace `this.getState()` with `draft`?\n if (readReceipt.sender !== this.getState().userId && thread.latestReadTime < readReceipt.readOn) {\n thread.latestReadTime = readReceipt.readOn;\n }\n readReceipts.push(readReceipt);\n }\n });\n }\n\n private startTypingIndicatorCleanUp(): void {\n if (this.typingIndicatorInterval) {\n return;\n }\n this.typingIndicatorInterval = window.setInterval(() => {\n let isTypingActive = false;\n this.modifyState((draft: ChatClientState) => {\n for (const thread of Object.values(draft.threads)) {\n const filteredTypingIndicators = thread.typingIndicators.filter((typingIndicator) => {\n const timeGap = Date.now() - typingIndicator.receivedOn.getTime();\n return timeGap < Constants.TYPING_INDICATOR_MAINTAIN_TIME;\n });\n\n if (thread.typingIndicators.length !== filteredTypingIndicators.length) {\n thread.typingIndicators = filteredTypingIndicators;\n }\n if (thread.typingIndicators.length > 0) {\n isTypingActive = true;\n }\n }\n });\n\n if (!isTypingActive && this.typingIndicatorInterval) {\n window.clearInterval(this.typingIndicatorInterval);\n this.typingIndicatorInterval = undefined;\n }\n }, 1000);\n }\n\n public addTypingIndicator(threadId: string, typingIndicator: TypingIndicatorReceivedEvent): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n if (thread) {\n const typingIndicators = thread.typingIndicators;\n typingIndicators.push(typingIndicator);\n }\n });\n\n // Make sure we only maintain a period of typing indicator for perf purposes\n this.startTypingIndicatorCleanUp();\n }\n\n public setChatMessage(threadId: string, message: ChatMessageWithStatus): void {\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n this.parseAttachments(threadId, message);\n const { id: messageId, clientMessageId } = message;\n if (messageId || clientMessageId) {\n this.modifyState((draft: ChatClientState) => {\n const threadMessages = draft.threads[threadId]?.chatMessages;\n const isLocalIdInMap = threadMessages && clientMessageId && threadMessages[clientMessageId];\n const messageKey = !messageId || isLocalIdInMap ? clientMessageId : messageId;\n\n if (threadMessages && messageKey) {\n threadMessages[messageKey] = message;\n }\n\n // remove typing indicator when receive a message from a user\n const thread = draft.threads[threadId];\n if (thread) {\n this.filterTypingIndicatorForUser(thread, message.sender);\n }\n });\n }\n }\n\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n private parseAttachments(threadId: string, message: ChatMessageWithStatus): void {\n const attachments = message.content?.attachments;\n if (message.type === 'html' && attachments && attachments.length > 0) {\n if (\n this._inlineImageQueue &&\n !this._inlineImageQueue.containsMessageWithSameAttachments(message) &&\n message.resourceCache === undefined\n ) {\n // Need to discuss retry logic in case of failure\n this._inlineImageQueue.addMessage(message);\n this._inlineImageQueue.startQueue(threadId, fetchImageSource);\n }\n }\n }\n\n /**\n * Tees any errors encountered in an async function to the state.\n *\n * @param f Async function to execute.\n * @param target The error target to tee error to.\n * @returns Result of calling `f`. Also re-raises any exceptions thrown from `f`.\n * @throws ChatError. Exceptions thrown from `f` are tagged with the failed `target.\n */\n public withAsyncErrorTeedToState<Args extends unknown[], R>(\n f: (...args: Args) => Promise<R>,\n target: ChatErrorTarget\n ): (...args: Args) => Promise<R> {\n return async (...args: Args): Promise<R> => {\n try {\n return await f(...args);\n } catch (error) {\n const chatError = toChatError(target, error);\n this.setLatestError(target, chatError);\n throw chatError;\n }\n };\n }\n\n /**\n * Tees any errors encountered in an function to the state.\n *\n * @param f Function to execute.\n * @param target The error target to tee error to.\n * @returns Result of calling `f`. Also re-raises any exceptions thrown from `f`.\n * @throws ChatError. Exceptions thrown from `f` are tagged with the failed `target.\n */\n public withErrorTeedToState<Args extends unknown[], R>(\n f: (...args: Args) => R,\n target: ChatErrorTarget\n ): (...args: Args) => R {\n return (...args: Args): R => {\n try {\n chatStatefulLogger.info(`Chat stateful client target function called: ${target}`);\n return f(...args);\n } catch (error) {\n const chatError = toChatError(target, error);\n this.setLatestError(target, chatError);\n throw chatError;\n }\n };\n }\n\n private setLatestError(target: ChatErrorTarget, error: ChatError): void {\n this.modifyState((draft: ChatClientState) => {\n draft.latestErrors[target] = error;\n });\n }\n\n // This is a mutating function, only use it inside of a produce() function\n private filterTypingIndicatorForUser(thread: ChatThreadClientState, userId?: CommunicationIdentifierKind): void {\n if (!userId) {\n return;\n }\n const typingIndicators = thread.typingIndicators;\n const userIdAsKey = toFlatCommunicationIdentifier(userId);\n const filteredTypingIndicators = typingIndicators.filter(\n (typingIndicator) => toFlatCommunicationIdentifier(typingIndicator.sender) !== userIdAsKey\n );\n if (filteredTypingIndicators.length !== typingIndicators.length) {\n thread.typingIndicators = filteredTypingIndicators;\n }\n }\n\n /**\n * Batch updates to minimize `stateChanged` events across related operations.\n *\n * - A maximum of one `stateChanged` event is emitted, at the end of the operations.\n * - No `stateChanged` event is emitted if the state did not change through the operations.\n * - In case of an exception, state is reset to the prior value and no `stateChanged` event is emitted.\n *\n * All operations finished in this batch should be synchronous.\n * This function is not reentrant -- do not call batch() from within another batch().\n */\n public batch(operations: () => void): void {\n if (this._batchMode) {\n throw new Error('batch() called from within another batch()');\n }\n\n this._batchMode = true;\n const priorState = this._state;\n try {\n operations();\n if (this._state !== priorState) {\n this._emitter.emit('stateChanged', this._state);\n }\n } catch (e) {\n this._state = priorState;\n if (getLogLevel() === 'verbose') {\n this._logger.warning(`State rollback to: ${_safeJSONStringify(priorState)}`);\n }\n throw e;\n } finally {\n this._batchMode = false;\n }\n }\n\n public onStateChange(handler: (state: ChatClientState) => void): void {\n this._emitter.on('stateChanged', handler);\n }\n\n public offStateChange(handler: (state: ChatClientState) => void): void {\n this._emitter.off('stateChanged', handler);\n }\n}\n\nconst toChatError = (target: ChatErrorTarget, error: unknown): ChatError => {\n if (error instanceof Error) {\n return new ChatError(target, error);\n }\n return new ChatError(target, new Error(`${error}`));\n};\n"]}
@@ -19,10 +19,6 @@ export declare class ResourceDownloadQueue {
19
19
  private downloadAllPreviewUrls;
20
20
  private downloadResource;
21
21
  }
22
- /**
23
- * @private
24
- */
25
- export declare const requestPreviewUrl: (message: ChatMessageWithStatus, credential: CommunicationTokenCredential) => Promise<ChatMessageWithStatus>;
26
22
  /**
27
23
  * @private
28
24
  */
@@ -30,12 +26,5 @@ export declare const fetchImageSource: (src: string, credential: CommunicationTo
30
26
  interface ImageRequest {
31
27
  (request: string, credential: CommunicationTokenCredential): Promise<string>;
32
28
  }
33
- /**
34
- * @private
35
- */
36
- export declare class ResourceDownloadError extends Error {
37
- chatMessageWithStatus: ChatMessageWithStatus;
38
- constructor(chatMessageWithStatus: ChatMessageWithStatus);
39
- }
40
29
  export {};
41
30
  //# sourceMappingURL=ResourceDownloadQueue.d.ts.map
@@ -66,8 +66,15 @@ export class ResourceDownloadQueue {
66
66
  }
67
67
  downloadSingleUrl(message, resourceUrl, operation) {
68
68
  return __awaiter(this, void 0, void 0, function* () {
69
- const blobUrl = yield this.downloadResource(operation, resourceUrl);
70
- message = Object.assign(Object.assign({}, message), { resourceCache: Object.assign(Object.assign({}, message.resourceCache), { [resourceUrl]: blobUrl }) });
69
+ const response = { sourceUrl: '' };
70
+ try {
71
+ const blobUrl = yield this.downloadResource(operation, resourceUrl);
72
+ response.sourceUrl = blobUrl;
73
+ }
74
+ catch (error) {
75
+ response.error = error;
76
+ }
77
+ message = Object.assign(Object.assign({}, message), { resourceCache: Object.assign(Object.assign({}, message.resourceCache), { [resourceUrl]: response }) });
71
78
  return message;
72
79
  });
73
80
  }
@@ -81,8 +88,15 @@ export class ResourceDownloadQueue {
81
88
  }
82
89
  for (const attachment of attachments) {
83
90
  if (attachment.previewUrl && attachment.attachmentType === 'image') {
84
- const blobUrl = yield this.downloadResource(operation, attachment.previewUrl);
85
- message.resourceCache[attachment.previewUrl] = blobUrl;
91
+ const response = { sourceUrl: '' };
92
+ try {
93
+ const blobUrl = yield this.downloadResource(operation, attachment.previewUrl);
94
+ response.sourceUrl = blobUrl;
95
+ }
96
+ catch (error) {
97
+ response.error = error;
98
+ }
99
+ message.resourceCache[attachment.previewUrl] = response;
86
100
  }
87
101
  }
88
102
  }
@@ -91,44 +105,12 @@ export class ResourceDownloadQueue {
91
105
  }
92
106
  downloadResource(operation, url) {
93
107
  return __awaiter(this, void 0, void 0, function* () {
94
- let blobUrl = URL.createObjectURL(new Blob());
95
- try {
96
- blobUrl = yield operation(url, this._credential);
97
- }
98
- catch (error) {
99
- console.log('Downloading Resource error: ', error);
100
- }
108
+ const blobUrl = yield operation(url, this._credential);
101
109
  return blobUrl;
102
110
  });
103
111
  }
104
112
  }
105
113
  /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
106
- /**
107
- * @private
108
- */
109
- export const requestPreviewUrl = (message, credential) => __awaiter(void 0, void 0, void 0, function* () {
110
- var _a;
111
- const attachments = (_a = message.content) === null || _a === void 0 ? void 0 : _a.attachments;
112
- if (message.type === 'html' && attachments) {
113
- if (message.resourceCache === undefined) {
114
- message.resourceCache = {};
115
- }
116
- for (const attachment of attachments) {
117
- if (attachment.previewUrl) {
118
- const previewUrl = attachment.previewUrl;
119
- try {
120
- const src = yield fetchImageSource(previewUrl, credential);
121
- message.resourceCache[previewUrl] = src;
122
- }
123
- catch (error) {
124
- throw new ResourceDownloadError(message);
125
- }
126
- }
127
- }
128
- }
129
- return message;
130
- });
131
- /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
132
114
  /**
133
115
  * @private
134
116
  */
@@ -161,14 +143,4 @@ export const fetchImageSource = (src, credential) => __awaiter(void 0, void 0, v
161
143
  const blob = yield response.blob();
162
144
  return URL.createObjectURL(blob);
163
145
  });
164
- /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
165
- /**
166
- * @private
167
- */
168
- export class ResourceDownloadError extends Error {
169
- constructor(chatMessageWithStatus) {
170
- super();
171
- this.chatMessageWithStatus = chatMessageWithStatus;
172
- }
173
- }
174
146
  //# sourceMappingURL=ResourceDownloadQueue.js.map