@azure/communication-react 1.5.1-alpha-202306080014 → 1.5.1-alpha-202306100013

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 (108) hide show
  1. package/dist/communication-react.d.ts +112 -38
  2. package/dist/dist-cjs/communication-react/index.js +267 -104
  3. package/dist/dist-cjs/communication-react/index.js.map +1 -1
  4. package/dist/dist-esm/acs-ui-common/src/identifier.js +1 -1
  5. package/dist/dist-esm/acs-ui-common/src/identifier.js.map +1 -1
  6. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  7. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  8. package/dist/dist-esm/calling-component-bindings/src/participantListSelector.js +1 -1
  9. package/dist/dist-esm/calling-component-bindings/src/participantListSelector.js.map +1 -1
  10. package/dist/dist-esm/calling-component-bindings/src/utils/callUtils.js +2 -1
  11. package/dist/dist-esm/calling-component-bindings/src/utils/callUtils.js.map +1 -1
  12. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.js +1 -1
  13. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.js.map +1 -1
  14. package/dist/dist-esm/calling-stateful-client/src/CallClientState.d.ts +1 -1
  15. package/dist/dist-esm/calling-stateful-client/src/CallClientState.js.map +1 -1
  16. package/dist/dist-esm/calling-stateful-client/src/CallContext.js +1 -1
  17. package/dist/dist-esm/calling-stateful-client/src/CallContext.js.map +1 -1
  18. package/dist/dist-esm/calling-stateful-client/src/Converter.js +1 -1
  19. package/dist/dist-esm/calling-stateful-client/src/Converter.js.map +1 -1
  20. package/dist/dist-esm/react-components/src/components/MentionPopover.js +1 -1
  21. package/dist/dist-esm/react-components/src/components/MentionPopover.js.map +1 -1
  22. package/dist/dist-esm/react-components/src/components/TextFieldWithMention/mentionTagUtils.d.ts +1 -0
  23. package/dist/dist-esm/react-components/src/components/TextFieldWithMention/mentionTagUtils.js +1 -0
  24. package/dist/dist-esm/react-components/src/components/TextFieldWithMention/mentionTagUtils.js.map +1 -1
  25. package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js +6 -2
  26. package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js.map +1 -1
  27. package/dist/dist-esm/react-components/src/components/VideoGallery.js +2 -1
  28. package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
  29. package/dist/dist-esm/react-components/src/components/styles/MessageThread.styles.js +1 -1
  30. package/dist/dist-esm/react-components/src/components/styles/MessageThread.styles.js.map +1 -1
  31. package/dist/dist-esm/react-components/src/components/styles/ParticipantList.styles.js +4 -1
  32. package/dist/dist-esm/react-components/src/components/styles/ParticipantList.styles.js.map +1 -1
  33. package/dist/dist-esm/react-components/src/localization/locales/ar-SA/strings.json +332 -0
  34. package/dist/dist-esm/react-components/src/localization/locales/fi-FI/strings.json +332 -0
  35. package/dist/dist-esm/react-components/src/localization/locales/he-IL/strings.json +332 -0
  36. package/dist/dist-esm/react-components/src/localization/locales/index.d.ts +36 -0
  37. package/dist/dist-esm/react-components/src/localization/locales/index.js +42 -0
  38. package/dist/dist-esm/react-components/src/localization/locales/index.js.map +1 -1
  39. package/dist/dist-esm/react-components/src/localization/locales/nb-NO/strings.json +332 -0
  40. package/dist/dist-esm/react-components/src/localization/locales/pl-PL/strings.json +332 -0
  41. package/dist/dist-esm/react-components/src/localization/locales/sv-SE/strings.json +332 -0
  42. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.d.ts +4 -2
  43. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js +9 -3
  44. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js.map +1 -1
  45. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.d.ts +4 -0
  46. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.js.map +1 -1
  47. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.d.ts +5 -5
  48. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js +35 -16
  49. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js.map +1 -1
  50. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.d.ts +9 -19
  51. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.js.map +1 -1
  52. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js +5 -1
  53. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js.map +1 -1
  54. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/MediaGallery.d.ts +1 -1
  55. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/MediaGallery.js +2 -6
  56. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/MediaGallery.js.map +1 -1
  57. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SidePane/useVideoEffectsPane.d.ts +16 -0
  58. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SidePane/useVideoEffectsPane.js +5 -11
  59. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SidePane/useVideoEffectsPane.js.map +1 -1
  60. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js +4 -2
  61. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js.map +1 -1
  62. package/dist/dist-esm/react-composites/src/composites/CallComposite/index.d.ts +1 -1
  63. package/dist/dist-esm/react-composites/src/composites/CallComposite/index.js.map +1 -1
  64. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.js +1 -1
  65. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.js.map +1 -1
  66. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/ConfigurationPage.js +5 -1
  67. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/ConfigurationPage.js.map +1 -1
  68. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/NoticePage.d.ts +4 -1
  69. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/NoticePage.js +3 -3
  70. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/NoticePage.js.map +1 -1
  71. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/activeVideoBackgroundEffectSelector.d.ts +2 -2
  72. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/activeVideoBackgroundEffectSelector.js +1 -1
  73. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/activeVideoBackgroundEffectSelector.js.map +1 -1
  74. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.d.ts +2 -2
  75. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.js +0 -1
  76. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.js.map +1 -1
  77. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/videoBackgroundErrorsSelector.js +0 -3
  78. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/videoBackgroundErrorsSelector.js.map +1 -1
  79. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/CallComposite.styles.d.ts +6 -1
  80. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/CallComposite.styles.js +7 -0
  81. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/CallComposite.styles.js.map +1 -1
  82. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.d.ts +3 -3
  83. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.js +3 -0
  84. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.js.map +1 -1
  85. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.d.ts +3 -5
  86. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js +3 -11
  87. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js.map +1 -1
  88. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.d.ts +4 -11
  89. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.js.map +1 -1
  90. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.d.ts +3 -5
  91. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js +2 -8
  92. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js.map +1 -1
  93. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/state/CallWithChatAdapterState.d.ts +2 -2
  94. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/state/CallWithChatAdapterState.js.map +1 -1
  95. package/dist/dist-esm/react-composites/src/composites/common/VideoEffectsPane.d.ts +2 -0
  96. package/dist/dist-esm/react-composites/src/composites/common/VideoEffectsPane.js +17 -6
  97. package/dist/dist-esm/react-composites/src/composites/common/VideoEffectsPane.js.map +1 -1
  98. package/dist/dist-esm/react-composites/src/composites/localization/locales/ar-SA/strings.json +194 -0
  99. package/dist/dist-esm/react-composites/src/composites/localization/locales/en-US/strings.json +1 -0
  100. package/dist/dist-esm/react-composites/src/composites/localization/locales/fi-FI/strings.json +194 -0
  101. package/dist/dist-esm/react-composites/src/composites/localization/locales/he-IL/strings.json +194 -0
  102. package/dist/dist-esm/react-composites/src/composites/localization/locales/index.d.ts +36 -0
  103. package/dist/dist-esm/react-composites/src/composites/localization/locales/index.js +61 -1
  104. package/dist/dist-esm/react-composites/src/composites/localization/locales/index.js.map +1 -1
  105. package/dist/dist-esm/react-composites/src/composites/localization/locales/nb-NO/strings.json +194 -0
  106. package/dist/dist-esm/react-composites/src/composites/localization/locales/pl-PL/strings.json +194 -0
  107. package/dist/dist-esm/react-composites/src/composites/localization/locales/sv-SE/strings.json +194 -0
  108. package/package.json +10 -8
@@ -1 +1 @@
1
- {"version":3,"file":"mentionTagUtils.js","sourceRoot":"","sources":["../../../../../../../react-components/src/components/TextFieldWithMention/mentionTagUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { ComponentStrings } from '../../localization';\nimport { Mention } from '../MentionPopover';\n\nconst MSFT_MENTION_TAG = 'msft-mention';\n\n/**\n * Props for finding a valid index in range.\n *\n * @private\n */\ntype ValidatedIndexRangeProps = {\n min: number;\n max: number;\n currentValue?: number;\n};\n\n/**\n * Get validated value for index between min and max values. If currentValue is not defined, -1 will be used instead.\n *\n * @private\n * @param props - Props for finding a valid index in range.\n * @returns Valid index in the range.\n */\nexport const getValidatedIndexInRange = (props: ValidatedIndexRangeProps): number => {\n const { min, max, currentValue } = props;\n let updatedValue = currentValue ?? -1;\n updatedValue = Math.max(min, updatedValue);\n updatedValue = Math.min(updatedValue, max);\n return updatedValue;\n};\n\n/**\n * Find mention tag for selection if exists.\n *\n * @private\n * @param tags - Existing list of tags.\n * @param selection - Selection index.\n * @returns Mention tag if exists, otherwise undefined.\n */\nexport const findMentionTagForSelection = (tags: TagData[], selection: number): TagData | undefined => {\n let mentionTag: TagData | undefined = undefined;\n tags.every((tag) => {\n const closingTagInfo = getTagClosingTagInfo(tag);\n if (tag.plainTextBeginIndex !== undefined && tag.plainTextBeginIndex > selection) {\n // no need to check further as the selection is before the tag\n return false;\n } else if (\n tag.plainTextBeginIndex !== undefined &&\n tag.plainTextBeginIndex <= selection &&\n selection <= closingTagInfo.plainTextEndIndex\n ) {\n // no need to check if tag doesn't contain selection\n if (tag.subTags !== undefined && tag.subTags.length !== 0) {\n const selectedTag = findMentionTagForSelection(tag.subTags, selection);\n if (selectedTag !== undefined) {\n mentionTag = selectedTag;\n return false;\n }\n } else if (tag.tagType === MSFT_MENTION_TAG) {\n mentionTag = tag;\n return false;\n }\n }\n return true;\n });\n return mentionTag;\n};\n\n/**\n * Get the indices of the word for the selection.\n * @private\n *\n */\nexport const rangeOfWordInSelection = ({\n textInput,\n selectionStart,\n selectionEnd,\n tag\n}: {\n textInput: string;\n selectionStart: number;\n selectionEnd?: number;\n tag: TagData;\n}): { start: number; end: number } => {\n if (tag.plainTextBeginIndex === undefined) {\n return { start: selectionStart, end: selectionEnd === undefined ? selectionStart : selectionEnd };\n }\n\n // Look at start word index and optionally end word index.\n // Select combination of the two and return the range.\n let start = selectionStart;\n let end = selectionEnd === undefined ? selectionStart : selectionEnd;\n const firstWordStartIndex = textInput.lastIndexOf(' ', selectionStart);\n if (firstWordStartIndex === tag.plainTextBeginIndex) {\n start = firstWordStartIndex;\n } else {\n start = Math.max(firstWordStartIndex + 1, tag.plainTextBeginIndex);\n }\n\n const firstWordEndIndex = textInput.indexOf(' ', selectionStart);\n end = Math.max(firstWordEndIndex + 1, tag.plainTextEndIndex ?? firstWordEndIndex + 1);\n\n if (selectionEnd !== undefined && tag.plainTextEndIndex !== undefined) {\n const lastWordEndIndex = textInput.indexOf(' ', selectionEnd);\n end = Math.max(lastWordEndIndex > -1 ? lastWordEndIndex : tag.plainTextEndIndex, selectionEnd);\n }\n return { start, end };\n};\n\n/**\n * Props for finding new selection index for mention\n *\n * @private\n */\ntype NewSelectionIndexForMentionProps = {\n tag: TagData;\n textValue: string;\n currentSelectionIndex: number;\n previousSelectionIndex: number;\n};\n\n/**\n * Find a new the selection index.\n *\n * @private\n * @param props - Props for finding new selection index for mention.\n * @returns New selection index if it is inside of a mention tag, otherwise the current selection.\n */\nexport const findNewSelectionIndexForMention = (props: NewSelectionIndexForMentionProps): number => {\n const { tag, textValue, currentSelectionIndex, previousSelectionIndex } = props;\n // check if this is a mention tag and selection should be updated\n if (\n tag.tagType !== MSFT_MENTION_TAG ||\n tag.plainTextBeginIndex === undefined ||\n currentSelectionIndex === previousSelectionIndex ||\n tag.plainTextEndIndex === undefined\n ) {\n return currentSelectionIndex;\n }\n let spaceIndex = 0;\n if (currentSelectionIndex <= previousSelectionIndex) {\n // the cursor is moved to the left, find the last index before the cursor\n spaceIndex = textValue.lastIndexOf(' ', currentSelectionIndex ?? 0);\n if (spaceIndex === -1) {\n // no space before the selection, use the beginning of the tag\n spaceIndex = tag.plainTextBeginIndex;\n }\n } else {\n // the cursor is moved to the right, find the fist index after the cursor\n spaceIndex = textValue.indexOf(' ', currentSelectionIndex ?? 0);\n if (spaceIndex === -1) {\n // no space after the selection, use the end of the tag\n spaceIndex = tag.plainTextEndIndex ?? tag.plainTextBeginIndex;\n }\n }\n spaceIndex = Math.max(tag.plainTextBeginIndex, spaceIndex);\n spaceIndex = Math.min(tag.plainTextEndIndex, spaceIndex);\n return spaceIndex;\n};\n\n/**\n * Props for mention update HTML function\n *\n * @private\n */\ntype MentionTagUpdateProps = {\n htmlText: string;\n oldPlainText: string;\n lastProcessedHTMLIndex: number;\n processedChange: string;\n change: string;\n tag: TagData;\n closeTagIdx: number;\n closeTagLength: number;\n plainTextEndIndex: number;\n startIndex: number;\n oldPlainTextEndIndex: number;\n mentionTagLength: number;\n};\n\n/**\n * Result for mention update HTML function\n *\n * @private\n */\ntype MentionTagUpdateResult = {\n result: string;\n updatedChange: string;\n htmlIndex: number;\n plainTextSelectionEndIndex?: number;\n};\n\n/**\n * Handle mention tag edit and by word deleting\n *\n * @private\n * @param props - Props for mention update HTML function.\n * @returns Updated texts and indexes.\n */\nconst handleMentionTagUpdate = (props: MentionTagUpdateProps): MentionTagUpdateResult => {\n const {\n htmlText,\n oldPlainText,\n change,\n tag,\n closeTagIdx,\n closeTagLength,\n plainTextEndIndex,\n startIndex,\n oldPlainTextEndIndex,\n mentionTagLength\n } = props;\n let processedChange = props.processedChange;\n let lastProcessedHTMLIndex = props.lastProcessedHTMLIndex;\n if (tag.tagType !== MSFT_MENTION_TAG || tag.plainTextBeginIndex === undefined) {\n // not a mention tag\n return {\n result: '',\n updatedChange: processedChange,\n htmlIndex: lastProcessedHTMLIndex,\n plainTextSelectionEndIndex: undefined\n };\n }\n let result = '';\n let plainTextSelectionEndIndex: number | undefined;\n let rangeStart: number;\n let rangeEnd: number;\n // check if space symbol is handled in case if string looks like '<1 2 3>'\n let isSpaceLengthHandled = false;\n rangeStart = oldPlainText.lastIndexOf(' ', startIndex);\n if (rangeStart !== -1 && rangeStart !== undefined && rangeStart > tag.plainTextBeginIndex) {\n isSpaceLengthHandled = true;\n }\n rangeEnd = oldPlainText.indexOf(' ', oldPlainTextEndIndex);\n if (rangeEnd === -1 || rangeEnd === undefined) {\n // check if space symbol is not found\n rangeEnd = plainTextEndIndex;\n } else if (!isSpaceLengthHandled) {\n // +1 to include the space symbol\n rangeEnd += 1;\n }\n isSpaceLengthHandled = true;\n\n if (rangeStart === -1 || rangeStart === undefined || rangeStart < tag.plainTextBeginIndex) {\n // rangeStart should be at least equal to tag.plainTextBeginIndex\n rangeStart = tag.plainTextBeginIndex;\n }\n if (rangeEnd > plainTextEndIndex) {\n // rangeEnd should be at most equal to plainTextEndIndex\n rangeEnd = plainTextEndIndex;\n }\n if (rangeStart === tag.plainTextBeginIndex && rangeEnd === plainTextEndIndex) {\n // the whole tag should be removed\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex) + processedChange;\n plainTextSelectionEndIndex = tag.plainTextBeginIndex + processedChange.length;\n processedChange = '';\n lastProcessedHTMLIndex = closeTagIdx + closeTagLength;\n } else {\n // only part of the tag should be removed\n let startChangeDiff = 0;\n let endChangeDiff = 0;\n // need to check only rangeStart > tag.plainTextBeginIndex as when rangeStart === tag.plainTextBeginIndex startChangeDiff = 0 and mentionTagLength shouldn't be subtracted\n if (rangeStart > tag.plainTextBeginIndex) {\n startChangeDiff = rangeStart - tag.plainTextBeginIndex - mentionTagLength;\n }\n endChangeDiff = rangeEnd - tag.plainTextBeginIndex - mentionTagLength;\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length + startChangeDiff);\n\n if (startIndex < tag.plainTextBeginIndex) {\n // if the change is before the tag, the selection should start from startIndex (rangeStart will be equal to tag.plainTextBeginIndex)\n plainTextSelectionEndIndex = startIndex + change.length;\n } else {\n // if the change is inside the tag, the selection should start with rangeStart\n plainTextSelectionEndIndex = rangeStart + processedChange.length;\n }\n lastProcessedHTMLIndex = tag.openTagIndex + tag.openTagBody.length + endChangeDiff;\n // processed change should not be changed as it should be added after the tag\n }\n return { result, updatedChange: processedChange, htmlIndex: lastProcessedHTMLIndex, plainTextSelectionEndIndex };\n};\n\n/**\n * Closing tag information\n *\n * @private\n */\ntype ClosingTagInfoResult = {\n plainTextEndIndex: number;\n closeTagIdx: number;\n closeTagLength: number;\n};\n\n/**\n * Get closing tag information if exists otherwise return information as for self closing tag\n *\n * @private\n * @param tag - Tag data.\n * @returns Closing tag information for the provided tag.\n */\nconst getTagClosingTagInfo = (tag: TagData): ClosingTagInfoResult => {\n let plainTextEndIndex = 0;\n let closeTagIdx = 0;\n let closeTagLength = 0;\n if (tag.plainTextEndIndex !== undefined && tag.closingTagIndex !== undefined) {\n // close tag exists\n plainTextEndIndex = tag.plainTextEndIndex;\n closeTagIdx = tag.closingTagIndex;\n // tag.tagType.length + </>\n closeTagLength = tag.tagType.length + 3;\n } else if (tag.plainTextBeginIndex !== undefined) {\n // no close tag\n plainTextEndIndex = tag.plainTextBeginIndex;\n closeTagIdx = tag.openTagIndex + tag.openTagBody.length;\n closeTagLength = 0;\n }\n return { plainTextEndIndex, closeTagIdx, closeTagLength };\n};\n\n/**\n * Props for update HTML function\n *\n * @private\n */\ntype UpdateHTMLProps = {\n htmlText: string;\n oldPlainText: string;\n newPlainText: string;\n tags: TagData[];\n startIndex: number;\n oldPlainTextEndIndex: number;\n change: string;\n mentionTrigger: string;\n};\n\n/**\n * Go through the text and update it with the changed text\n *\n * @private\n * @param props - Props for update HTML function.\n * @returns Updated HTML and selection index if the selection index should be set.\n */\nexport const updateHTML = (props: UpdateHTMLProps): { updatedHTML: string; updatedSelectionIndex?: number } => {\n const { htmlText, oldPlainText, newPlainText, tags, startIndex, oldPlainTextEndIndex, change, mentionTrigger } =\n props;\n if (tags.length === 0 || (startIndex === 0 && oldPlainTextEndIndex === oldPlainText.length - 1)) {\n // no tags added yet or the whole text is changed\n return { updatedHTML: newPlainText, updatedSelectionIndex: undefined };\n }\n let result = '';\n let lastProcessedHTMLIndex = 0;\n // the value can be updated with empty string when the change covers more than 1 place (tag + before or after the tag)\n // in this case change won't be added as part of the tag\n // e.g.: change is before and partially in tag => change will be added before the tag and outdated text in the tag will be removed\n // e.g.: change is after and partially in tag => change will be added after the tag and outdated text in the tag will be removed\n // e.g.: change is on the beginning of the tag => change will be added before the tag\n // e.g.: change is on the end of the tag => change will be added to the tag if it's not mention and after the tag if it's mention\n let processedChange = change;\n // end tag plain text index of the last processed tag\n let lastProcessedPlainTextTagEndIndex = 0;\n // as some tags/text can be removed fully, selection should be updated correctly\n let changeNewEndIndex: number | undefined;\n\n for (let i = 0; i < tags.length; i++) {\n const tag = tags[i];\n if (tag.plainTextBeginIndex === undefined) {\n continue;\n }\n // all plain text indexes includes trigger length for the mention that shouldn't be included in\n // htmlText.substring because html strings don't include the trigger\n // mentionTagLength will be set only for mention tag, otherwise should be 0\n let mentionTagLength = 0;\n let isMentionTag = false;\n if (tag.tagType === MSFT_MENTION_TAG) {\n mentionTagLength = mentionTrigger.length;\n isMentionTag = true;\n }\n if (startIndex <= tag.plainTextBeginIndex) {\n // change start is before the open tag\n // Math.max(lastProcessedPlainTextTagEndIndex, startIndex) is used as startIndex may not be in [[previous tag].plainTextEndIndex - tag.plainTextBeginIndex] range\n const startChangeDiff = tag.plainTextBeginIndex - Math.max(lastProcessedPlainTextTagEndIndex, startIndex);\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex - startChangeDiff) + processedChange;\n processedChange = '';\n if (oldPlainTextEndIndex <= tag.plainTextBeginIndex) {\n // the whole change is before tag start\n // mentionTag length can be ignored here as the change is before the tag\n const endChangeDiff = tag.plainTextBeginIndex - oldPlainTextEndIndex;\n lastProcessedHTMLIndex = tag.openTagIndex - endChangeDiff;\n // the change is handled; exit\n break;\n } else {\n // change continues in the tag\n lastProcessedHTMLIndex = tag.openTagIndex;\n // proceed to the next check\n }\n }\n const closingTagInfo = getTagClosingTagInfo(tag);\n if (startIndex <= closingTagInfo.plainTextEndIndex) {\n // change started before the end tag\n if (startIndex <= tag.plainTextBeginIndex && oldPlainTextEndIndex === closingTagInfo.plainTextEndIndex) {\n // the change is a tag or starts before the tag\n // tag should be removed, no matter if there are sub-tags\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex) + processedChange;\n processedChange = '';\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength;\n // the change is handled; exit\n break;\n } else if (startIndex >= tag.plainTextBeginIndex && oldPlainTextEndIndex <= closingTagInfo.plainTextEndIndex) {\n // the change is between the tag\n if (isMentionTag) {\n if (change !== '') {\n if (startIndex !== tag.plainTextBeginIndex && startIndex !== closingTagInfo.plainTextEndIndex) {\n // mention tag should be deleted when user tries to edit it in the middle\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex) + processedChange;\n changeNewEndIndex = tag.plainTextBeginIndex + processedChange.length;\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength;\n } else if (startIndex === tag.plainTextBeginIndex) {\n // non empty change at the beginning of the mention tag to be added before the mention tag\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex) + processedChange;\n changeNewEndIndex = tag.plainTextBeginIndex + processedChange.length;\n lastProcessedHTMLIndex = tag.openTagIndex;\n } else if (startIndex === closingTagInfo.plainTextEndIndex) {\n // non empty change at the end of the mention tag to be added after the mention tag\n result +=\n htmlText.substring(lastProcessedHTMLIndex, closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength) +\n processedChange;\n changeNewEndIndex = closingTagInfo.plainTextEndIndex + processedChange.length;\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength;\n }\n processedChange = '';\n } else {\n const updateMentionTagResult = handleMentionTagUpdate({\n htmlText,\n oldPlainText,\n lastProcessedHTMLIndex,\n processedChange,\n change,\n tag,\n closeTagIdx: closingTagInfo.closeTagIdx,\n closeTagLength: closingTagInfo.closeTagLength,\n plainTextEndIndex: closingTagInfo.plainTextEndIndex,\n startIndex,\n oldPlainTextEndIndex,\n mentionTagLength\n });\n result += updateMentionTagResult.result;\n changeNewEndIndex = updateMentionTagResult.plainTextSelectionEndIndex;\n processedChange = updateMentionTagResult.updatedChange;\n lastProcessedHTMLIndex = updateMentionTagResult.htmlIndex;\n }\n } else if (tag.subTags !== undefined && tag.subTags.length !== 0 && tag.content !== undefined) {\n // with subtags\n const stringBefore = htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length);\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx;\n const updatedContent = updateHTML({\n htmlText: tag.content,\n oldPlainText,\n newPlainText,\n tags: tag.subTags,\n startIndex,\n oldPlainTextEndIndex,\n change: processedChange,\n mentionTrigger\n });\n result += stringBefore + updatedContent.updatedHTML;\n changeNewEndIndex = updatedContent.updatedSelectionIndex;\n } else {\n // no subtags\n const startChangeDiff = startIndex - tag.plainTextBeginIndex;\n result +=\n htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length + startChangeDiff) +\n processedChange;\n processedChange = '';\n if (oldPlainTextEndIndex < closingTagInfo.plainTextEndIndex) {\n const endChangeDiff = oldPlainTextEndIndex - tag.plainTextBeginIndex;\n lastProcessedHTMLIndex = tag.openTagIndex + tag.openTagBody.length + endChangeDiff;\n } else if (oldPlainTextEndIndex === closingTagInfo.plainTextEndIndex) {\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx;\n }\n }\n // the change is handled; exit\n break;\n } else if (startIndex > tag.plainTextBeginIndex && oldPlainTextEndIndex > closingTagInfo.plainTextEndIndex) {\n // the change started in the tag but finishes somewhere further\n const startChangeDiff = startIndex - tag.plainTextBeginIndex - mentionTagLength;\n if (isMentionTag) {\n const updateMentionTagResult = handleMentionTagUpdate({\n htmlText,\n oldPlainText,\n lastProcessedHTMLIndex,\n processedChange: '',\n change,\n tag,\n closeTagIdx: closingTagInfo.closeTagIdx,\n closeTagLength: closingTagInfo.closeTagLength,\n plainTextEndIndex: closingTagInfo.plainTextEndIndex,\n startIndex,\n oldPlainTextEndIndex,\n mentionTagLength\n });\n result += updateMentionTagResult.result;\n lastProcessedHTMLIndex = updateMentionTagResult.htmlIndex;\n // no need to handle plainTextSelectionEndIndex as the change will be added later\n } else if (tag.subTags !== undefined && tag.subTags.length !== 0 && tag.content !== undefined) {\n // with subtags\n const stringBefore = htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length);\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx;\n const updatedContent = updateHTML({\n htmlText: tag.content,\n oldPlainText,\n newPlainText,\n tags: tag.subTags,\n startIndex,\n oldPlainTextEndIndex,\n change: '', // the part of the tag should be just deleted without processedChange update and change will be added after this tag\n mentionTrigger\n });\n result += stringBefore + updatedContent.updatedHTML;\n } else {\n // no subtags\n result += htmlText.substring(\n lastProcessedHTMLIndex,\n tag.openTagIndex + tag.openTagBody.length + startChangeDiff\n );\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx;\n }\n // proceed with the next calculations\n } else if (startIndex < tag.plainTextBeginIndex && oldPlainTextEndIndex > closingTagInfo.plainTextEndIndex) {\n // the change starts before the tag and finishes after it\n // tag should be removed, no matter if there are subtags\n // no need to save anything between lastProcessedHTMLIndex and closeTagIdx + closeTagLength\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength;\n // proceed with the next calculations\n } else if (startIndex === tag.plainTextBeginIndex && oldPlainTextEndIndex > closingTagInfo.plainTextEndIndex) {\n // the change starts in the tag and finishes after it\n // tag should be removed, no matter if there are subtags\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex);\n // processedChange shouldn't be updated as it will be added after the tag\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength;\n // proceed with the next calculations\n } else if (startIndex < tag.plainTextBeginIndex && oldPlainTextEndIndex < closingTagInfo.plainTextEndIndex) {\n // the change starts before the tag and ends in a tag\n if (isMentionTag) {\n // mention tag\n const updateMentionTagResult = handleMentionTagUpdate({\n htmlText,\n oldPlainText,\n lastProcessedHTMLIndex,\n processedChange: '', // the part of mention should be just deleted without processedChange update\n change,\n tag,\n closeTagIdx: closingTagInfo.closeTagIdx,\n closeTagLength: closingTagInfo.closeTagLength,\n plainTextEndIndex: closingTagInfo.plainTextEndIndex,\n startIndex,\n oldPlainTextEndIndex,\n mentionTagLength\n });\n changeNewEndIndex = updateMentionTagResult.plainTextSelectionEndIndex;\n result += updateMentionTagResult.result;\n lastProcessedHTMLIndex = updateMentionTagResult.htmlIndex;\n } else if (tag.subTags !== undefined && tag.subTags.length !== 0 && tag.content !== undefined) {\n // with subtags\n const stringBefore = htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length);\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx;\n const updatedContent = updateHTML({\n htmlText: tag.content,\n oldPlainText,\n newPlainText,\n tags: tag.subTags,\n startIndex,\n oldPlainTextEndIndex,\n change: processedChange, // processedChange should be equal '' and the part of the tag should be deleted as the change was handled before this tag\n mentionTrigger\n });\n processedChange = '';\n result += stringBefore + updatedContent.updatedHTML;\n } else {\n // no subtags\n result +=\n htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length) + processedChange;\n processedChange = '';\n // oldPlainTextEndIndex already includes mentionTag length\n const endChangeDiff = closingTagInfo.plainTextEndIndex - oldPlainTextEndIndex;\n // as change may be before the end of the tag, we need to add the rest of the tag\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx - endChangeDiff;\n }\n // the change is handled; exit\n break;\n }\n lastProcessedPlainTextTagEndIndex = closingTagInfo.plainTextEndIndex;\n }\n\n if (i === tags.length - 1 && oldPlainTextEndIndex >= closingTagInfo.plainTextEndIndex) {\n // the last tag should handle the end of the change if needed\n // oldPlainTextEndIndex already includes mentionTag length\n const endChangeDiff = oldPlainTextEndIndex - closingTagInfo.plainTextEndIndex;\n if (startIndex >= closingTagInfo.plainTextEndIndex) {\n const startChangeDiff = startIndex - closingTagInfo.plainTextEndIndex;\n result +=\n htmlText.substring(\n lastProcessedHTMLIndex,\n closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength + startChangeDiff\n ) + processedChange;\n } else {\n result +=\n htmlText.substring(lastProcessedHTMLIndex, closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength) +\n processedChange;\n }\n processedChange = '';\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength + endChangeDiff;\n // the change is handled; exit\n // break is not required here as this is the last element but added for consistency\n break;\n }\n }\n if (lastProcessedHTMLIndex < htmlText.length) {\n // add the rest of the html string\n result += htmlText.substring(lastProcessedHTMLIndex);\n }\n return { updatedHTML: result, updatedSelectionIndex: changeNewEndIndex };\n};\n\n/**\n * Props for finding strings diff indexes\n *\n * @private\n */\ntype DiffIndexesProps = {\n // the old text\n oldText: string;\n // the new text\n newText: string;\n // the start of previous selection, should be a valid position in the input field\n previousSelectionStart: number;\n // the end of previous selection, should be a valid position in the input field\n previousSelectionEnd: number;\n // the start of current selection, should be a valid position in the input field\n currentSelectionStart: number;\n // the end of current selection, should be a valid position in the input field\n currentSelectionEnd: number;\n};\n\n/**\n * Result of finding strings diff indexes function\n *\n * @private\n */\ntype DiffIndexesResult = {\n changeStart: number;\n oldChangeEnd: number;\n newChangeEnd: number;\n};\n\n/**\n * Given the oldText and newText, find the start index, old end index and new end index for the changes\n *\n * @private\n * @param props - Props for finding stings diff indexes function.\n * @returns Indexes for change start and ends in new and old texts. The old and new end indexes are exclusive.\n */\nexport const findStringsDiffIndexes = (props: DiffIndexesProps): DiffIndexesResult => {\n const { oldText, newText, previousSelectionStart, previousSelectionEnd, currentSelectionStart, currentSelectionEnd } =\n props;\n const newTextLength = newText.length;\n const oldTextLength = oldText.length;\n // let changeStart = 0;\n let newChangeEnd = newTextLength;\n let oldChangeEnd = oldTextLength;\n const previousSelectionStartValue = previousSelectionStart > -1 ? previousSelectionStart : oldTextLength;\n const previousSelectionEndValue = previousSelectionEnd > -1 ? previousSelectionEnd : oldTextLength;\n const currentSelectionStartValue = currentSelectionStart > -1 ? currentSelectionStart : newTextLength;\n const currentSelectionEndValue = currentSelectionEnd > -1 ? currentSelectionEnd : newTextLength;\n const changeStart = Math.min(\n previousSelectionStartValue,\n previousSelectionEndValue,\n currentSelectionStartValue,\n currentSelectionEndValue,\n newTextLength,\n oldTextLength\n );\n\n if (oldTextLength < newTextLength) {\n //insert or replacement\n if (oldTextLength === changeStart) {\n // when change was at the end of string\n // change is found\n newChangeEnd = newTextLength;\n oldChangeEnd = oldTextLength;\n } else {\n for (let i = 1; i < newTextLength && oldTextLength - i >= changeStart; i++) {\n newChangeEnd = newTextLength - i - 1;\n oldChangeEnd = oldTextLength - i - 1;\n\n if (newText[newChangeEnd] !== oldText[oldChangeEnd]) {\n // change is found\n break;\n }\n }\n // make indexes exclusive\n newChangeEnd += 1;\n oldChangeEnd += 1;\n }\n } else if (oldTextLength > newTextLength) {\n //deletion or replacement\n if (newTextLength === changeStart) {\n // when change was at the end of string\n // change is found\n newChangeEnd = newTextLength;\n oldChangeEnd = oldTextLength;\n } else {\n for (let i = 1; i < oldTextLength && newTextLength - i >= changeStart; i++) {\n newChangeEnd = newTextLength - i - 1;\n oldChangeEnd = oldTextLength - i - 1;\n if (newText[newChangeEnd] !== oldText[oldChangeEnd]) {\n // change is found\n break;\n }\n }\n // make indexes exclusive\n newChangeEnd += 1;\n oldChangeEnd += 1;\n }\n } else {\n // replacement\n for (let i = 1; i < oldTextLength && oldTextLength - i >= changeStart; i++) {\n newChangeEnd = newTextLength - i - 1;\n oldChangeEnd = oldTextLength - i - 1;\n\n if (newText[newChangeEnd] !== oldText[oldChangeEnd]) {\n // change is found\n break;\n }\n }\n // make indexes exclusive if they aren't equal to the length of the string\n if (newChangeEnd !== newText.length) {\n newChangeEnd += 1;\n }\n if (oldChangeEnd !== oldText.length) {\n oldChangeEnd += 1;\n }\n }\n return { changeStart, oldChangeEnd, newChangeEnd };\n};\n\n/**\n * Get the html string for the mention suggestion.\n *\n * @private\n * @param suggestion - The mention suggestion.\n * @param localeStrings - The locale strings.\n * @returns The html string for the mention suggestion.\n */\nexport const htmlStringForMentionSuggestion = (suggestion: Mention, localeStrings: ComponentStrings): string => {\n const idHTML = ' id=\"' + suggestion.id + '\"';\n const displayTextHTML = ' displayText=\"' + suggestion.displayText + '\"';\n const displayText = getDisplayNameForMentionSuggestion(suggestion, localeStrings);\n return '<' + MSFT_MENTION_TAG + idHTML + displayTextHTML + '>' + displayText + '</' + MSFT_MENTION_TAG + '>';\n};\n\n/**\n * Get display name for the mention suggestion.\n *\n * @private\n *\n * @param suggestion - The mention suggestion.\n * @param localeStrings - The locale strings.\n * @returns The display name for the mention suggestion or display name placeholder if display name is empty.\n */\nexport const getDisplayNameForMentionSuggestion = (suggestion: Mention, localeStrings: ComponentStrings): string => {\n const displayNamePlaceholder = localeStrings.participantItem.displayNamePlaceholder;\n return suggestion.displayText !== '' ? suggestion.displayText : displayNamePlaceholder ?? '';\n};\n\n/**\n * Tag data for a HTML tag in the string\n *\n * @private\n */\nexport type TagData = {\n tagType: string; // The type of tag (e.g. msft-mention)\n openTagIndex: number; // Start of the tag relative to the parent content\n openTagBody: string; // Complete open tag body\n content?: string; // All content between the open and close tags\n closingTagIndex?: number; // Start of the close tag relative to the parent content\n subTags?: TagData[]; // Any child tags\n plainTextBeginIndex?: number; // Absolute index of the open tag start should be in plain text\n plainTextEndIndex?: number; // Absolute index of the close tag start should be in plain text\n};\n\ntype HtmlTagType = 'open' | 'close' | 'self-closing';\n\ntype HtmlTag = {\n content: string;\n startIdx: number;\n type: HtmlTagType;\n};\n\n/**\n * Parse the text and return the tags and the plain text in one go\n * @private\n * @param text - The text to parse for HTML tags\n * @param trigger The trigger to show for the mention tag in plain text\n *\n * @returns An array of tags and the plain text representation\n */\nexport const textToTagParser = (text: string, trigger: string): { tags: TagData[]; plainText: string } => {\n const tags: TagData[] = []; // Tags passed back to the caller\n const tagParseStack: TagData[] = []; // Local stack to use while parsing\n\n let plainTextRepresentation = '';\n\n let parseIndex = 0;\n while (parseIndex < text.length) {\n const foundHtmlTag = findNextHtmlTag(text, parseIndex);\n\n if (!foundHtmlTag) {\n if (parseIndex !== 0) {\n // Add the remaining text to the plain text representation\n plainTextRepresentation += text.substring(parseIndex);\n } else {\n plainTextRepresentation = text;\n }\n break;\n }\n\n if (foundHtmlTag.type === 'open' || foundHtmlTag.type === 'self-closing') {\n const nextTag = parseOpenTag(foundHtmlTag.content, foundHtmlTag.startIdx);\n // Add the plain text between the last tag and this one found\n plainTextRepresentation += text.substring(parseIndex, foundHtmlTag.startIdx);\n nextTag.plainTextBeginIndex = plainTextRepresentation.length;\n\n if (foundHtmlTag.type === 'open') {\n tagParseStack.push(nextTag);\n } else {\n nextTag.content = '';\n nextTag.plainTextBeginIndex = plainTextRepresentation.length;\n nextTag.plainTextEndIndex = plainTextRepresentation.length;\n addTag(nextTag, tagParseStack, tags);\n }\n }\n\n if (foundHtmlTag.type === 'close') {\n const currentOpenTag = tagParseStack.pop();\n const closeTagType = foundHtmlTag.content.substring(2, foundHtmlTag.content.length - 1).toLowerCase();\n\n if (currentOpenTag && currentOpenTag.tagType === closeTagType) {\n // Tag startIdx is absolute to the text. This is updated later to be relative to the parent tag\n currentOpenTag.content = text.substring(\n currentOpenTag.openTagIndex + currentOpenTag.openTagBody.length,\n foundHtmlTag.startIdx\n );\n\n // Insert the plain text pieces for the sub tags\n if (currentOpenTag.tagType === MSFT_MENTION_TAG) {\n plainTextRepresentation =\n plainTextRepresentation.slice(0, currentOpenTag.plainTextBeginIndex) +\n trigger +\n plainTextRepresentation.slice(currentOpenTag.plainTextBeginIndex);\n }\n\n if (!currentOpenTag.subTags) {\n plainTextRepresentation += currentOpenTag.content;\n } else if (currentOpenTag.subTags.length > 0) {\n // Add text after the last tag\n const lastSubTag = currentOpenTag.subTags[currentOpenTag.subTags.length - 1];\n const startOfRemainingText =\n (lastSubTag.closingTagIndex ?? lastSubTag.openTagIndex) + lastSubTag.tagType.length + 3;\n const trailingText = currentOpenTag.content.substring(startOfRemainingText);\n plainTextRepresentation += trailingText;\n }\n\n currentOpenTag.plainTextEndIndex = plainTextRepresentation.length;\n addTag(currentOpenTag, tagParseStack, tags);\n } else {\n throw new Error(\n 'Unexpected close tag found. Got \"' +\n closeTagType +\n '\" but expected \"' +\n tagParseStack[tagParseStack.length - 1]?.tagType +\n '\"'\n );\n }\n }\n\n // Update parsing index; move past the end of the close tag\n parseIndex = foundHtmlTag.startIdx + foundHtmlTag.content.length;\n } // While parseIndex < text.length loop\n\n return { tags, plainText: plainTextRepresentation };\n};\n\nconst parseOpenTag = (tag: string, startIdx: number): TagData => {\n const tagType = tag\n .substring(1, tag.length - 1)\n .split(' ')[0]\n .toLowerCase()\n .replace('/', '');\n return {\n tagType,\n openTagIndex: startIdx,\n openTagBody: tag\n };\n};\n\nconst findNextHtmlTag = (text: string, startIndex: number): HtmlTag | undefined => {\n const tagStartIndex = text.indexOf('<', startIndex);\n if (tagStartIndex === -1) {\n // No more tags\n return undefined;\n }\n const tagEndIndex = text.indexOf('>', tagStartIndex);\n if (tagEndIndex === -1) {\n // No close tag\n return undefined;\n }\n const tag = text.substring(tagStartIndex, tagEndIndex + 1);\n let type: HtmlTagType = 'open';\n if (tag[1] === '/') {\n type = 'close';\n } else if (tag[tag.length - 2] === '/') {\n type = 'self-closing';\n }\n return {\n content: tag,\n startIdx: tagStartIndex,\n type\n };\n};\n\nconst addTag = (tag: TagData, parseStack: TagData[], tags: TagData[]): void => {\n // Add as sub-tag to the parent stack tag, if there is one\n const parentTag = parseStack[parseStack.length - 1];\n\n if (parentTag) {\n // Adjust the open tag index to be relative to the parent tag\n const parentContentStartIdx = parentTag.openTagIndex + parentTag.openTagBody.length;\n const relativeIdx = tag.openTagIndex - parentContentStartIdx;\n tag.openTagIndex = relativeIdx;\n }\n\n if (!tag.closingTagIndex) {\n // If the tag is self-closing, the close tag is the same as the open tag\n if (tag.openTagBody[tag.openTagBody.length - 2] === '/') {\n tag.closingTagIndex = tag.openTagIndex;\n } else {\n // Otherwise, the close tag index is the open tag index + the open tag body + the content length\n tag.closingTagIndex = tag.openTagIndex + tag.openTagBody.length + (tag.content ?? []).length;\n }\n }\n\n // Put the tag where it belongs\n if (!parentTag) {\n tags.push(tag);\n } else {\n if (!parentTag.subTags) {\n parentTag.subTags = [tag];\n } else {\n parentTag.subTags.push(tag);\n }\n }\n};\n"]}
1
+ {"version":3,"file":"mentionTagUtils.js","sourceRoot":"","sources":["../../../../../../../react-components/src/components/TextFieldWithMention/mentionTagUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { ComponentStrings } from '../../localization';\nimport { Mention } from '../MentionPopover';\n\nconst MSFT_MENTION_TAG = 'msft-mention';\n\n/**\n * Props for finding a valid index in range.\n *\n * @private\n */\ntype ValidatedIndexRangeProps = {\n min: number;\n max: number;\n currentValue?: number;\n};\n\n/**\n * Get validated value for index between min and max values. If currentValue is not defined, -1 will be used instead.\n *\n * @private\n * @param props - Props for finding a valid index in range.\n * @returns Valid index in the range.\n */\nexport const getValidatedIndexInRange = (props: ValidatedIndexRangeProps): number => {\n const { min, max, currentValue } = props;\n let updatedValue = currentValue ?? -1;\n updatedValue = Math.max(min, updatedValue);\n updatedValue = Math.min(updatedValue, max);\n return updatedValue;\n};\n\n/**\n * Find mention tag for selection if exists.\n *\n * @private\n * @param tags - Existing list of tags.\n * @param selection - Selection index.\n * @returns Mention tag if exists, otherwise undefined.\n */\nexport const findMentionTagForSelection = (tags: TagData[], selection: number): TagData | undefined => {\n let mentionTag: TagData | undefined = undefined;\n tags.every((tag) => {\n const closingTagInfo = getTagClosingTagInfo(tag);\n if (tag.plainTextBeginIndex !== undefined && tag.plainTextBeginIndex > selection) {\n // no need to check further as the selection is before the tag\n return false;\n } else if (\n tag.plainTextBeginIndex !== undefined &&\n tag.plainTextBeginIndex <= selection &&\n selection <= closingTagInfo.plainTextEndIndex\n ) {\n // no need to check if tag doesn't contain selection\n if (tag.subTags !== undefined && tag.subTags.length !== 0) {\n const selectedTag = findMentionTagForSelection(tag.subTags, selection);\n if (selectedTag !== undefined) {\n mentionTag = selectedTag;\n return false;\n }\n } else if (tag.tagType === MSFT_MENTION_TAG) {\n mentionTag = tag;\n return false;\n }\n }\n return true;\n });\n return mentionTag;\n};\n\n/**\n * Get the indices of the word for the selection.\n * Selects the whole tag by default\n * @private\n *\n */\nexport const rangeOfWordInSelection = ({\n textInput,\n selectionStart,\n selectionEnd,\n tag\n}: {\n textInput: string;\n selectionStart: number;\n selectionEnd?: number;\n tag: TagData;\n}): { start: number; end: number } => {\n if (tag.plainTextBeginIndex === undefined) {\n return { start: selectionStart, end: selectionEnd === undefined ? selectionStart : selectionEnd };\n }\n\n // Look at start word index and optionally end word index.\n // Select combination of the two and return the range.\n let start = selectionStart;\n let end = selectionEnd === undefined ? selectionStart : selectionEnd;\n const firstWordStartIndex = textInput.lastIndexOf(' ', selectionStart);\n if (firstWordStartIndex === tag.plainTextBeginIndex) {\n start = firstWordStartIndex;\n } else {\n start = Math.max(firstWordStartIndex + 1, tag.plainTextBeginIndex);\n }\n\n const firstWordEndIndex = textInput.indexOf(' ', selectionStart);\n end = Math.max(firstWordEndIndex + 1, tag.plainTextEndIndex ?? firstWordEndIndex + 1);\n\n if (selectionEnd !== undefined && tag.plainTextEndIndex !== undefined) {\n const lastWordEndIndex = textInput.indexOf(' ', selectionEnd);\n end = Math.max(lastWordEndIndex > -1 ? lastWordEndIndex : tag.plainTextEndIndex, selectionEnd);\n }\n return { start, end };\n};\n\n/**\n * Props for finding new selection index for mention\n *\n * @private\n */\ntype NewSelectionIndexForMentionProps = {\n tag: TagData;\n textValue: string;\n currentSelectionIndex: number;\n previousSelectionIndex: number;\n};\n\n/**\n * Find a new the selection index.\n *\n * @private\n * @param props - Props for finding new selection index for mention.\n * @returns New selection index if it is inside of a mention tag, otherwise the current selection.\n */\nexport const findNewSelectionIndexForMention = (props: NewSelectionIndexForMentionProps): number => {\n const { tag, textValue, currentSelectionIndex, previousSelectionIndex } = props;\n // check if this is a mention tag and selection should be updated\n if (\n tag.tagType !== MSFT_MENTION_TAG ||\n tag.plainTextBeginIndex === undefined ||\n currentSelectionIndex === previousSelectionIndex ||\n tag.plainTextEndIndex === undefined\n ) {\n return currentSelectionIndex;\n }\n let spaceIndex = 0;\n if (currentSelectionIndex <= previousSelectionIndex) {\n // the cursor is moved to the left, find the last index before the cursor\n spaceIndex = textValue.lastIndexOf(' ', currentSelectionIndex ?? 0);\n if (spaceIndex === -1) {\n // no space before the selection, use the beginning of the tag\n spaceIndex = tag.plainTextBeginIndex;\n }\n } else {\n // the cursor is moved to the right, find the fist index after the cursor\n spaceIndex = textValue.indexOf(' ', currentSelectionIndex ?? 0);\n if (spaceIndex === -1) {\n // no space after the selection, use the end of the tag\n spaceIndex = tag.plainTextEndIndex ?? tag.plainTextBeginIndex;\n }\n }\n spaceIndex = Math.max(tag.plainTextBeginIndex, spaceIndex);\n spaceIndex = Math.min(tag.plainTextEndIndex, spaceIndex);\n return spaceIndex;\n};\n\n/**\n * Props for mention update HTML function\n *\n * @private\n */\ntype MentionTagUpdateProps = {\n htmlText: string;\n oldPlainText: string;\n lastProcessedHTMLIndex: number;\n processedChange: string;\n change: string;\n tag: TagData;\n closeTagIdx: number;\n closeTagLength: number;\n plainTextEndIndex: number;\n startIndex: number;\n oldPlainTextEndIndex: number;\n mentionTagLength: number;\n};\n\n/**\n * Result for mention update HTML function\n *\n * @private\n */\ntype MentionTagUpdateResult = {\n result: string;\n updatedChange: string;\n htmlIndex: number;\n plainTextSelectionEndIndex?: number;\n};\n\n/**\n * Handle mention tag edit and by word deleting\n *\n * @private\n * @param props - Props for mention update HTML function.\n * @returns Updated texts and indexes.\n */\nconst handleMentionTagUpdate = (props: MentionTagUpdateProps): MentionTagUpdateResult => {\n const {\n htmlText,\n oldPlainText,\n change,\n tag,\n closeTagIdx,\n closeTagLength,\n plainTextEndIndex,\n startIndex,\n oldPlainTextEndIndex,\n mentionTagLength\n } = props;\n let processedChange = props.processedChange;\n let lastProcessedHTMLIndex = props.lastProcessedHTMLIndex;\n if (tag.tagType !== MSFT_MENTION_TAG || tag.plainTextBeginIndex === undefined) {\n // not a mention tag\n return {\n result: '',\n updatedChange: processedChange,\n htmlIndex: lastProcessedHTMLIndex,\n plainTextSelectionEndIndex: undefined\n };\n }\n let result = '';\n let plainTextSelectionEndIndex: number | undefined;\n let rangeStart: number;\n let rangeEnd: number;\n // check if space symbol is handled in case if string looks like '<1 2 3>'\n let isSpaceLengthHandled = false;\n rangeStart = oldPlainText.lastIndexOf(' ', startIndex);\n if (rangeStart !== -1 && rangeStart !== undefined && rangeStart > tag.plainTextBeginIndex) {\n isSpaceLengthHandled = true;\n }\n rangeEnd = oldPlainText.indexOf(' ', oldPlainTextEndIndex);\n if (rangeEnd === -1 || rangeEnd === undefined) {\n // check if space symbol is not found\n rangeEnd = plainTextEndIndex;\n } else if (!isSpaceLengthHandled) {\n // +1 to include the space symbol\n rangeEnd += 1;\n }\n isSpaceLengthHandled = true;\n\n if (rangeStart === -1 || rangeStart === undefined || rangeStart < tag.plainTextBeginIndex) {\n // rangeStart should be at least equal to tag.plainTextBeginIndex\n rangeStart = tag.plainTextBeginIndex;\n }\n if (rangeEnd > plainTextEndIndex) {\n // rangeEnd should be at most equal to plainTextEndIndex\n rangeEnd = plainTextEndIndex;\n }\n if (rangeStart === tag.plainTextBeginIndex && rangeEnd === plainTextEndIndex) {\n // the whole tag should be removed\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex) + processedChange;\n plainTextSelectionEndIndex = tag.plainTextBeginIndex + processedChange.length;\n processedChange = '';\n lastProcessedHTMLIndex = closeTagIdx + closeTagLength;\n } else {\n // only part of the tag should be removed\n let startChangeDiff = 0;\n let endChangeDiff = 0;\n // need to check only rangeStart > tag.plainTextBeginIndex as when rangeStart === tag.plainTextBeginIndex startChangeDiff = 0 and mentionTagLength shouldn't be subtracted\n if (rangeStart > tag.plainTextBeginIndex) {\n startChangeDiff = rangeStart - tag.plainTextBeginIndex - mentionTagLength;\n }\n endChangeDiff = rangeEnd - tag.plainTextBeginIndex - mentionTagLength;\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length + startChangeDiff);\n\n if (startIndex < tag.plainTextBeginIndex) {\n // if the change is before the tag, the selection should start from startIndex (rangeStart will be equal to tag.plainTextBeginIndex)\n plainTextSelectionEndIndex = startIndex + change.length;\n } else {\n // if the change is inside the tag, the selection should start with rangeStart\n plainTextSelectionEndIndex = rangeStart + processedChange.length;\n }\n lastProcessedHTMLIndex = tag.openTagIndex + tag.openTagBody.length + endChangeDiff;\n // processed change should not be changed as it should be added after the tag\n }\n return { result, updatedChange: processedChange, htmlIndex: lastProcessedHTMLIndex, plainTextSelectionEndIndex };\n};\n\n/**\n * Closing tag information\n *\n * @private\n */\ntype ClosingTagInfoResult = {\n plainTextEndIndex: number;\n closeTagIdx: number;\n closeTagLength: number;\n};\n\n/**\n * Get closing tag information if exists otherwise return information as for self closing tag\n *\n * @private\n * @param tag - Tag data.\n * @returns Closing tag information for the provided tag.\n */\nconst getTagClosingTagInfo = (tag: TagData): ClosingTagInfoResult => {\n let plainTextEndIndex = 0;\n let closeTagIdx = 0;\n let closeTagLength = 0;\n if (tag.plainTextEndIndex !== undefined && tag.closingTagIndex !== undefined) {\n // close tag exists\n plainTextEndIndex = tag.plainTextEndIndex;\n closeTagIdx = tag.closingTagIndex;\n // tag.tagType.length + </>\n closeTagLength = tag.tagType.length + 3;\n } else if (tag.plainTextBeginIndex !== undefined) {\n // no close tag\n plainTextEndIndex = tag.plainTextBeginIndex;\n closeTagIdx = tag.openTagIndex + tag.openTagBody.length;\n closeTagLength = 0;\n }\n return { plainTextEndIndex, closeTagIdx, closeTagLength };\n};\n\n/**\n * Props for update HTML function\n *\n * @private\n */\ntype UpdateHTMLProps = {\n htmlText: string;\n oldPlainText: string;\n newPlainText: string;\n tags: TagData[];\n startIndex: number;\n oldPlainTextEndIndex: number;\n change: string;\n mentionTrigger: string;\n};\n\n/**\n * Go through the text and update it with the changed text\n *\n * @private\n * @param props - Props for update HTML function.\n * @returns Updated HTML and selection index if the selection index should be set.\n */\nexport const updateHTML = (props: UpdateHTMLProps): { updatedHTML: string; updatedSelectionIndex?: number } => {\n const { htmlText, oldPlainText, newPlainText, tags, startIndex, oldPlainTextEndIndex, change, mentionTrigger } =\n props;\n if (tags.length === 0 || (startIndex === 0 && oldPlainTextEndIndex === oldPlainText.length - 1)) {\n // no tags added yet or the whole text is changed\n return { updatedHTML: newPlainText, updatedSelectionIndex: undefined };\n }\n let result = '';\n let lastProcessedHTMLIndex = 0;\n // the value can be updated with empty string when the change covers more than 1 place (tag + before or after the tag)\n // in this case change won't be added as part of the tag\n // e.g.: change is before and partially in tag => change will be added before the tag and outdated text in the tag will be removed\n // e.g.: change is after and partially in tag => change will be added after the tag and outdated text in the tag will be removed\n // e.g.: change is on the beginning of the tag => change will be added before the tag\n // e.g.: change is on the end of the tag => change will be added to the tag if it's not mention and after the tag if it's mention\n let processedChange = change;\n // end tag plain text index of the last processed tag\n let lastProcessedPlainTextTagEndIndex = 0;\n // as some tags/text can be removed fully, selection should be updated correctly\n let changeNewEndIndex: number | undefined;\n\n for (let i = 0; i < tags.length; i++) {\n const tag = tags[i];\n if (tag.plainTextBeginIndex === undefined) {\n continue;\n }\n // all plain text indexes includes trigger length for the mention that shouldn't be included in\n // htmlText.substring because html strings don't include the trigger\n // mentionTagLength will be set only for mention tag, otherwise should be 0\n let mentionTagLength = 0;\n let isMentionTag = false;\n if (tag.tagType === MSFT_MENTION_TAG) {\n mentionTagLength = mentionTrigger.length;\n isMentionTag = true;\n }\n if (startIndex <= tag.plainTextBeginIndex) {\n // change start is before the open tag\n // Math.max(lastProcessedPlainTextTagEndIndex, startIndex) is used as startIndex may not be in [[previous tag].plainTextEndIndex - tag.plainTextBeginIndex] range\n const startChangeDiff = tag.plainTextBeginIndex - Math.max(lastProcessedPlainTextTagEndIndex, startIndex);\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex - startChangeDiff) + processedChange;\n processedChange = '';\n if (oldPlainTextEndIndex <= tag.plainTextBeginIndex) {\n // the whole change is before tag start\n // mentionTag length can be ignored here as the change is before the tag\n const endChangeDiff = tag.plainTextBeginIndex - oldPlainTextEndIndex;\n lastProcessedHTMLIndex = tag.openTagIndex - endChangeDiff;\n // the change is handled; exit\n break;\n } else {\n // change continues in the tag\n lastProcessedHTMLIndex = tag.openTagIndex;\n // proceed to the next check\n }\n }\n const closingTagInfo = getTagClosingTagInfo(tag);\n if (startIndex <= closingTagInfo.plainTextEndIndex) {\n // change started before the end tag\n if (startIndex <= tag.plainTextBeginIndex && oldPlainTextEndIndex === closingTagInfo.plainTextEndIndex) {\n // the change is a tag or starts before the tag\n // tag should be removed, no matter if there are sub-tags\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex) + processedChange;\n processedChange = '';\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength;\n // the change is handled; exit\n break;\n } else if (startIndex >= tag.plainTextBeginIndex && oldPlainTextEndIndex <= closingTagInfo.plainTextEndIndex) {\n // the change is between the tag\n if (isMentionTag) {\n if (change !== '') {\n if (startIndex !== tag.plainTextBeginIndex && startIndex !== closingTagInfo.plainTextEndIndex) {\n // mention tag should be deleted when user tries to edit it in the middle\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex) + processedChange;\n changeNewEndIndex = tag.plainTextBeginIndex + processedChange.length;\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength;\n } else if (startIndex === tag.plainTextBeginIndex) {\n // non empty change at the beginning of the mention tag to be added before the mention tag\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex) + processedChange;\n changeNewEndIndex = tag.plainTextBeginIndex + processedChange.length;\n lastProcessedHTMLIndex = tag.openTagIndex;\n } else if (startIndex === closingTagInfo.plainTextEndIndex) {\n // non empty change at the end of the mention tag to be added after the mention tag\n result +=\n htmlText.substring(lastProcessedHTMLIndex, closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength) +\n processedChange;\n changeNewEndIndex = closingTagInfo.plainTextEndIndex + processedChange.length;\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength;\n }\n processedChange = '';\n } else {\n const updateMentionTagResult = handleMentionTagUpdate({\n htmlText,\n oldPlainText,\n lastProcessedHTMLIndex,\n processedChange,\n change,\n tag,\n closeTagIdx: closingTagInfo.closeTagIdx,\n closeTagLength: closingTagInfo.closeTagLength,\n plainTextEndIndex: closingTagInfo.plainTextEndIndex,\n startIndex,\n oldPlainTextEndIndex,\n mentionTagLength\n });\n result += updateMentionTagResult.result;\n changeNewEndIndex = updateMentionTagResult.plainTextSelectionEndIndex;\n processedChange = updateMentionTagResult.updatedChange;\n lastProcessedHTMLIndex = updateMentionTagResult.htmlIndex;\n }\n } else if (tag.subTags !== undefined && tag.subTags.length !== 0 && tag.content !== undefined) {\n // with subtags\n const stringBefore = htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length);\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx;\n const updatedContent = updateHTML({\n htmlText: tag.content,\n oldPlainText,\n newPlainText,\n tags: tag.subTags,\n startIndex,\n oldPlainTextEndIndex,\n change: processedChange,\n mentionTrigger\n });\n result += stringBefore + updatedContent.updatedHTML;\n changeNewEndIndex = updatedContent.updatedSelectionIndex;\n } else {\n // no subtags\n const startChangeDiff = startIndex - tag.plainTextBeginIndex;\n result +=\n htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length + startChangeDiff) +\n processedChange;\n processedChange = '';\n if (oldPlainTextEndIndex < closingTagInfo.plainTextEndIndex) {\n const endChangeDiff = oldPlainTextEndIndex - tag.plainTextBeginIndex;\n lastProcessedHTMLIndex = tag.openTagIndex + tag.openTagBody.length + endChangeDiff;\n } else if (oldPlainTextEndIndex === closingTagInfo.plainTextEndIndex) {\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx;\n }\n }\n // the change is handled; exit\n break;\n } else if (startIndex > tag.plainTextBeginIndex && oldPlainTextEndIndex > closingTagInfo.plainTextEndIndex) {\n // the change started in the tag but finishes somewhere further\n const startChangeDiff = startIndex - tag.plainTextBeginIndex - mentionTagLength;\n if (isMentionTag) {\n const updateMentionTagResult = handleMentionTagUpdate({\n htmlText,\n oldPlainText,\n lastProcessedHTMLIndex,\n processedChange: '',\n change,\n tag,\n closeTagIdx: closingTagInfo.closeTagIdx,\n closeTagLength: closingTagInfo.closeTagLength,\n plainTextEndIndex: closingTagInfo.plainTextEndIndex,\n startIndex,\n oldPlainTextEndIndex,\n mentionTagLength\n });\n result += updateMentionTagResult.result;\n lastProcessedHTMLIndex = updateMentionTagResult.htmlIndex;\n // no need to handle plainTextSelectionEndIndex as the change will be added later\n } else if (tag.subTags !== undefined && tag.subTags.length !== 0 && tag.content !== undefined) {\n // with subtags\n const stringBefore = htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length);\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx;\n const updatedContent = updateHTML({\n htmlText: tag.content,\n oldPlainText,\n newPlainText,\n tags: tag.subTags,\n startIndex,\n oldPlainTextEndIndex,\n change: '', // the part of the tag should be just deleted without processedChange update and change will be added after this tag\n mentionTrigger\n });\n result += stringBefore + updatedContent.updatedHTML;\n } else {\n // no subtags\n result += htmlText.substring(\n lastProcessedHTMLIndex,\n tag.openTagIndex + tag.openTagBody.length + startChangeDiff\n );\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx;\n }\n // proceed with the next calculations\n } else if (startIndex < tag.plainTextBeginIndex && oldPlainTextEndIndex > closingTagInfo.plainTextEndIndex) {\n // the change starts before the tag and finishes after it\n // tag should be removed, no matter if there are subtags\n // no need to save anything between lastProcessedHTMLIndex and closeTagIdx + closeTagLength\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength;\n // proceed with the next calculations\n } else if (startIndex === tag.plainTextBeginIndex && oldPlainTextEndIndex > closingTagInfo.plainTextEndIndex) {\n // the change starts in the tag and finishes after it\n // tag should be removed, no matter if there are subtags\n result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex);\n // processedChange shouldn't be updated as it will be added after the tag\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength;\n // proceed with the next calculations\n } else if (startIndex < tag.plainTextBeginIndex && oldPlainTextEndIndex < closingTagInfo.plainTextEndIndex) {\n // the change starts before the tag and ends in a tag\n if (isMentionTag) {\n // mention tag\n const updateMentionTagResult = handleMentionTagUpdate({\n htmlText,\n oldPlainText,\n lastProcessedHTMLIndex,\n processedChange: '', // the part of mention should be just deleted without processedChange update\n change,\n tag,\n closeTagIdx: closingTagInfo.closeTagIdx,\n closeTagLength: closingTagInfo.closeTagLength,\n plainTextEndIndex: closingTagInfo.plainTextEndIndex,\n startIndex,\n oldPlainTextEndIndex,\n mentionTagLength\n });\n changeNewEndIndex = updateMentionTagResult.plainTextSelectionEndIndex;\n result += updateMentionTagResult.result;\n lastProcessedHTMLIndex = updateMentionTagResult.htmlIndex;\n } else if (tag.subTags !== undefined && tag.subTags.length !== 0 && tag.content !== undefined) {\n // with subtags\n const stringBefore = htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length);\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx;\n const updatedContent = updateHTML({\n htmlText: tag.content,\n oldPlainText,\n newPlainText,\n tags: tag.subTags,\n startIndex,\n oldPlainTextEndIndex,\n change: processedChange, // processedChange should be equal '' and the part of the tag should be deleted as the change was handled before this tag\n mentionTrigger\n });\n processedChange = '';\n result += stringBefore + updatedContent.updatedHTML;\n } else {\n // no subtags\n result +=\n htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length) + processedChange;\n processedChange = '';\n // oldPlainTextEndIndex already includes mentionTag length\n const endChangeDiff = closingTagInfo.plainTextEndIndex - oldPlainTextEndIndex;\n // as change may be before the end of the tag, we need to add the rest of the tag\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx - endChangeDiff;\n }\n // the change is handled; exit\n break;\n }\n lastProcessedPlainTextTagEndIndex = closingTagInfo.plainTextEndIndex;\n }\n\n if (i === tags.length - 1 && oldPlainTextEndIndex >= closingTagInfo.plainTextEndIndex) {\n // the last tag should handle the end of the change if needed\n // oldPlainTextEndIndex already includes mentionTag length\n const endChangeDiff = oldPlainTextEndIndex - closingTagInfo.plainTextEndIndex;\n if (startIndex >= closingTagInfo.plainTextEndIndex) {\n const startChangeDiff = startIndex - closingTagInfo.plainTextEndIndex;\n result +=\n htmlText.substring(\n lastProcessedHTMLIndex,\n closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength + startChangeDiff\n ) + processedChange;\n } else {\n result +=\n htmlText.substring(lastProcessedHTMLIndex, closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength) +\n processedChange;\n }\n processedChange = '';\n lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength + endChangeDiff;\n // the change is handled; exit\n // break is not required here as this is the last element but added for consistency\n break;\n }\n }\n if (lastProcessedHTMLIndex < htmlText.length) {\n // add the rest of the html string\n result += htmlText.substring(lastProcessedHTMLIndex);\n }\n return { updatedHTML: result, updatedSelectionIndex: changeNewEndIndex };\n};\n\n/**\n * Props for finding strings diff indexes\n *\n * @private\n */\ntype DiffIndexesProps = {\n // the old text\n oldText: string;\n // the new text\n newText: string;\n // the start of previous selection, should be a valid position in the input field\n previousSelectionStart: number;\n // the end of previous selection, should be a valid position in the input field\n previousSelectionEnd: number;\n // the start of current selection, should be a valid position in the input field\n currentSelectionStart: number;\n // the end of current selection, should be a valid position in the input field\n currentSelectionEnd: number;\n};\n\n/**\n * Result of finding strings diff indexes function\n *\n * @private\n */\ntype DiffIndexesResult = {\n changeStart: number;\n oldChangeEnd: number;\n newChangeEnd: number;\n};\n\n/**\n * Given the oldText and newText, find the start index, old end index and new end index for the changes\n *\n * @private\n * @param props - Props for finding stings diff indexes function.\n * @returns Indexes for change start and ends in new and old texts. The old and new end indexes are exclusive.\n */\nexport const findStringsDiffIndexes = (props: DiffIndexesProps): DiffIndexesResult => {\n const { oldText, newText, previousSelectionStart, previousSelectionEnd, currentSelectionStart, currentSelectionEnd } =\n props;\n const newTextLength = newText.length;\n const oldTextLength = oldText.length;\n // let changeStart = 0;\n let newChangeEnd = newTextLength;\n let oldChangeEnd = oldTextLength;\n const previousSelectionStartValue = previousSelectionStart > -1 ? previousSelectionStart : oldTextLength;\n const previousSelectionEndValue = previousSelectionEnd > -1 ? previousSelectionEnd : oldTextLength;\n const currentSelectionStartValue = currentSelectionStart > -1 ? currentSelectionStart : newTextLength;\n const currentSelectionEndValue = currentSelectionEnd > -1 ? currentSelectionEnd : newTextLength;\n const changeStart = Math.min(\n previousSelectionStartValue,\n previousSelectionEndValue,\n currentSelectionStartValue,\n currentSelectionEndValue,\n newTextLength,\n oldTextLength\n );\n\n if (oldTextLength < newTextLength) {\n //insert or replacement\n if (oldTextLength === changeStart) {\n // when change was at the end of string\n // change is found\n newChangeEnd = newTextLength;\n oldChangeEnd = oldTextLength;\n } else {\n for (let i = 1; i < newTextLength && oldTextLength - i >= changeStart; i++) {\n newChangeEnd = newTextLength - i - 1;\n oldChangeEnd = oldTextLength - i - 1;\n\n if (newText[newChangeEnd] !== oldText[oldChangeEnd]) {\n // change is found\n break;\n }\n }\n // make indexes exclusive\n newChangeEnd += 1;\n oldChangeEnd += 1;\n }\n } else if (oldTextLength > newTextLength) {\n //deletion or replacement\n if (newTextLength === changeStart) {\n // when change was at the end of string\n // change is found\n newChangeEnd = newTextLength;\n oldChangeEnd = oldTextLength;\n } else {\n for (let i = 1; i < oldTextLength && newTextLength - i >= changeStart; i++) {\n newChangeEnd = newTextLength - i - 1;\n oldChangeEnd = oldTextLength - i - 1;\n if (newText[newChangeEnd] !== oldText[oldChangeEnd]) {\n // change is found\n break;\n }\n }\n // make indexes exclusive\n newChangeEnd += 1;\n oldChangeEnd += 1;\n }\n } else {\n // replacement\n for (let i = 1; i < oldTextLength && oldTextLength - i >= changeStart; i++) {\n newChangeEnd = newTextLength - i - 1;\n oldChangeEnd = oldTextLength - i - 1;\n\n if (newText[newChangeEnd] !== oldText[oldChangeEnd]) {\n // change is found\n break;\n }\n }\n // make indexes exclusive if they aren't equal to the length of the string\n if (newChangeEnd !== newText.length) {\n newChangeEnd += 1;\n }\n if (oldChangeEnd !== oldText.length) {\n oldChangeEnd += 1;\n }\n }\n return { changeStart, oldChangeEnd, newChangeEnd };\n};\n\n/**\n * Get the html string for the mention suggestion.\n *\n * @private\n * @param suggestion - The mention suggestion.\n * @param localeStrings - The locale strings.\n * @returns The html string for the mention suggestion.\n */\nexport const htmlStringForMentionSuggestion = (suggestion: Mention, localeStrings: ComponentStrings): string => {\n const idHTML = ' id=\"' + suggestion.id + '\"';\n const displayTextHTML = ' displayText=\"' + suggestion.displayText + '\"';\n const displayText = getDisplayNameForMentionSuggestion(suggestion, localeStrings);\n return '<' + MSFT_MENTION_TAG + idHTML + displayTextHTML + '>' + displayText + '</' + MSFT_MENTION_TAG + '>';\n};\n\n/**\n * Get display name for the mention suggestion.\n *\n * @private\n *\n * @param suggestion - The mention suggestion.\n * @param localeStrings - The locale strings.\n * @returns The display name for the mention suggestion or display name placeholder if display name is empty.\n */\nexport const getDisplayNameForMentionSuggestion = (suggestion: Mention, localeStrings: ComponentStrings): string => {\n const displayNamePlaceholder = localeStrings.participantItem.displayNamePlaceholder;\n return suggestion.displayText !== '' ? suggestion.displayText : displayNamePlaceholder ?? '';\n};\n\n/**\n * Tag data for a HTML tag in the string\n *\n * @private\n */\nexport type TagData = {\n tagType: string; // The type of tag (e.g. msft-mention)\n openTagIndex: number; // Start of the tag relative to the parent content\n openTagBody: string; // Complete open tag body\n content?: string; // All content between the open and close tags\n closingTagIndex?: number; // Start of the close tag relative to the parent content\n subTags?: TagData[]; // Any child tags\n plainTextBeginIndex?: number; // Absolute index of the open tag start should be in plain text\n plainTextEndIndex?: number; // Absolute index of the close tag start should be in plain text\n};\n\ntype HtmlTagType = 'open' | 'close' | 'self-closing';\n\ntype HtmlTag = {\n content: string;\n startIdx: number;\n type: HtmlTagType;\n};\n\n/**\n * Parse the text and return the tags and the plain text in one go\n * @private\n * @param text - The text to parse for HTML tags\n * @param trigger The trigger to show for the mention tag in plain text\n *\n * @returns An array of tags and the plain text representation\n */\nexport const textToTagParser = (text: string, trigger: string): { tags: TagData[]; plainText: string } => {\n const tags: TagData[] = []; // Tags passed back to the caller\n const tagParseStack: TagData[] = []; // Local stack to use while parsing\n\n let plainTextRepresentation = '';\n\n let parseIndex = 0;\n while (parseIndex < text.length) {\n const foundHtmlTag = findNextHtmlTag(text, parseIndex);\n\n if (!foundHtmlTag) {\n if (parseIndex !== 0) {\n // Add the remaining text to the plain text representation\n plainTextRepresentation += text.substring(parseIndex);\n } else {\n plainTextRepresentation = text;\n }\n break;\n }\n\n if (foundHtmlTag.type === 'open' || foundHtmlTag.type === 'self-closing') {\n const nextTag = parseOpenTag(foundHtmlTag.content, foundHtmlTag.startIdx);\n // Add the plain text between the last tag and this one found\n plainTextRepresentation += text.substring(parseIndex, foundHtmlTag.startIdx);\n nextTag.plainTextBeginIndex = plainTextRepresentation.length;\n\n if (foundHtmlTag.type === 'open') {\n tagParseStack.push(nextTag);\n } else {\n nextTag.content = '';\n nextTag.plainTextBeginIndex = plainTextRepresentation.length;\n nextTag.plainTextEndIndex = plainTextRepresentation.length;\n addTag(nextTag, tagParseStack, tags);\n }\n }\n\n if (foundHtmlTag.type === 'close') {\n const currentOpenTag = tagParseStack.pop();\n const closeTagType = foundHtmlTag.content.substring(2, foundHtmlTag.content.length - 1).toLowerCase();\n\n if (currentOpenTag && currentOpenTag.tagType === closeTagType) {\n // Tag startIdx is absolute to the text. This is updated later to be relative to the parent tag\n currentOpenTag.content = text.substring(\n currentOpenTag.openTagIndex + currentOpenTag.openTagBody.length,\n foundHtmlTag.startIdx\n );\n\n // Insert the plain text pieces for the sub tags\n if (currentOpenTag.tagType === MSFT_MENTION_TAG) {\n plainTextRepresentation =\n plainTextRepresentation.slice(0, currentOpenTag.plainTextBeginIndex) +\n trigger +\n plainTextRepresentation.slice(currentOpenTag.plainTextBeginIndex);\n }\n\n if (!currentOpenTag.subTags) {\n plainTextRepresentation += currentOpenTag.content;\n } else if (currentOpenTag.subTags.length > 0) {\n // Add text after the last tag\n const lastSubTag = currentOpenTag.subTags[currentOpenTag.subTags.length - 1];\n const startOfRemainingText =\n (lastSubTag.closingTagIndex ?? lastSubTag.openTagIndex) + lastSubTag.tagType.length + 3;\n const trailingText = currentOpenTag.content.substring(startOfRemainingText);\n plainTextRepresentation += trailingText;\n }\n\n currentOpenTag.plainTextEndIndex = plainTextRepresentation.length;\n addTag(currentOpenTag, tagParseStack, tags);\n } else {\n throw new Error(\n 'Unexpected close tag found. Got \"' +\n closeTagType +\n '\" but expected \"' +\n tagParseStack[tagParseStack.length - 1]?.tagType +\n '\"'\n );\n }\n }\n\n // Update parsing index; move past the end of the close tag\n parseIndex = foundHtmlTag.startIdx + foundHtmlTag.content.length;\n } // While parseIndex < text.length loop\n\n return { tags, plainText: plainTextRepresentation };\n};\n\nconst parseOpenTag = (tag: string, startIdx: number): TagData => {\n const tagType = tag\n .substring(1, tag.length - 1)\n .split(' ')[0]\n .toLowerCase()\n .replace('/', '');\n return {\n tagType,\n openTagIndex: startIdx,\n openTagBody: tag\n };\n};\n\nconst findNextHtmlTag = (text: string, startIndex: number): HtmlTag | undefined => {\n const tagStartIndex = text.indexOf('<', startIndex);\n if (tagStartIndex === -1) {\n // No more tags\n return undefined;\n }\n const tagEndIndex = text.indexOf('>', tagStartIndex);\n if (tagEndIndex === -1) {\n // No close tag\n return undefined;\n }\n const tag = text.substring(tagStartIndex, tagEndIndex + 1);\n let type: HtmlTagType = 'open';\n if (tag[1] === '/') {\n type = 'close';\n } else if (tag[tag.length - 2] === '/') {\n type = 'self-closing';\n }\n return {\n content: tag,\n startIdx: tagStartIndex,\n type\n };\n};\n\nconst addTag = (tag: TagData, parseStack: TagData[], tags: TagData[]): void => {\n // Add as sub-tag to the parent stack tag, if there is one\n const parentTag = parseStack[parseStack.length - 1];\n\n if (parentTag) {\n // Adjust the open tag index to be relative to the parent tag\n const parentContentStartIdx = parentTag.openTagIndex + parentTag.openTagBody.length;\n const relativeIdx = tag.openTagIndex - parentContentStartIdx;\n tag.openTagIndex = relativeIdx;\n }\n\n if (!tag.closingTagIndex) {\n // If the tag is self-closing, the close tag is the same as the open tag\n if (tag.openTagBody[tag.openTagBody.length - 2] === '/') {\n tag.closingTagIndex = tag.openTagIndex;\n } else {\n // Otherwise, the close tag index is the open tag index + the open tag body + the content length\n tag.closingTagIndex = tag.openTagIndex + tag.openTagBody.length + (tag.content ?? []).length;\n }\n }\n\n // Put the tag where it belongs\n if (!parentTag) {\n tags.push(tag);\n } else {\n if (!parentTag.subTags) {\n parentTag.subTags = [tag];\n } else {\n parentTag.subTags.push(tag);\n }\n }\n};\n"]}
@@ -72,17 +72,21 @@ export const FloatingLocalVideoLayout = (props) => {
72
72
  });
73
73
  const layerHostId = useId('layerhost');
74
74
  const localVideoSizeRem = useMemo(() => {
75
- if (isNarrow && /*@conditional-compile-remove(click-to-call) */ !(localVideoTileSize === '16:9')) {
75
+ if (isNarrow || /*@conditional-compile-remove(click-to-call) */ localVideoTileSize === '9:16') {
76
76
  return SMALL_FLOATING_MODAL_SIZE_REM;
77
77
  }
78
78
  /* @conditional-compile-remove(vertical-gallery) */
79
79
  if (overflowGalleryTiles.length > 0 && overflowGalleryPosition === 'VerticalRight') {
80
- return isNarrow && /*@conditional-compile-remove(click-to-call) */ !(localVideoTileSize === '16:9')
80
+ return isNarrow
81
81
  ? SMALL_FLOATING_MODAL_SIZE_REM
82
82
  : isShort
83
83
  ? SHORT_VERTICAL_GALLERY_FLOATING_MODAL_SIZE_REM
84
84
  : VERTICAL_GALLERY_FLOATING_MODAL_SIZE_REM;
85
85
  }
86
+ /*@conditional-compile-remove(click-to-call) */
87
+ if (overflowGalleryTiles.length > 0 && overflowGalleryPosition === 'HorizontalBottom') {
88
+ return localVideoTileSize === '16:9' || !isNarrow ? LARGE_FLOATING_MODAL_SIZE_REM : SMALL_FLOATING_MODAL_SIZE_REM;
89
+ }
86
90
  return LARGE_FLOATING_MODAL_SIZE_REM;
87
91
  }, [
88
92
  overflowGalleryTiles.length,
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingLocalVideoLayout.js","sourceRoot":"","sources":["../../../../../../../react-components/src/components/VideoGallery/FloatingLocalVideoLayout.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { LayerHost, mergeStyles, Stack } from '@fluentui/react';\nimport { useId } from '@fluentui/react-hooks';\nimport React, { useMemo, useRef, useState } from 'react';\nimport { useTheme } from '../../theming';\nimport { GridLayout } from '../GridLayout';\nimport { isNarrowWidth } from '../utils/responsive';\n/* @conditional-compile-remove(vertical-gallery) */\nimport { isShortHeight } from '../utils/responsive';\nimport { FloatingLocalVideo } from './FloatingLocalVideo';\nimport { LayoutProps } from './Layout';\nimport {\n LARGE_FLOATING_MODAL_SIZE_REM,\n localVideoTileContainerStyle,\n localVideoTileWithControlsContainerStyle,\n LOCAL_VIDEO_TILE_ZINDEX,\n SMALL_FLOATING_MODAL_SIZE_REM\n} from './styles/FloatingLocalVideo.styles';\n/* @conditional-compile-remove(vertical-gallery) */\nimport {\n SHORT_VERTICAL_GALLERY_FLOATING_MODAL_SIZE_REM,\n VERTICAL_GALLERY_FLOATING_MODAL_SIZE_REM\n} from './styles/FloatingLocalVideo.styles';\nimport { innerLayoutStyle, layerHostStyle, rootLayoutStyle } from './styles/FloatingLocalVideoLayout.styles';\nimport { videoGalleryLayoutGap } from './styles/Layout.styles';\nimport { useOrganizedParticipants } from './utils/videoGalleryLayoutUtils';\nimport { OverflowGallery } from './OverflowGallery';\n/* @conditional-compile-remove(click-to-call) */\nimport { LocalVideoTileSize } from '../VideoGallery';\n\n/**\n * Props for {@link FloatingLocalVideoLayout}.\n *\n * @private\n */\nexport interface FloatingLocalVideoLayoutProps extends LayoutProps {\n /**\n * Whether to display the local video camera switcher button\n */\n showCameraSwitcherInLocalPreview?: boolean;\n /**\n * Height of parent element\n */\n parentHeight?: number;\n /* @conditional-compile-remove(click-to-call) */\n /**\n * Local video tile mode\n */\n localVideoTileSize?: LocalVideoTileSize;\n}\n\n/**\n * FloatingLocalVideoLayout displays remote participants and a screen sharing component in\n * a grid and overflow gallery while floating the local video\n *\n * @private\n */\nexport const FloatingLocalVideoLayout = (props: FloatingLocalVideoLayoutProps): JSX.Element => {\n const {\n remoteParticipants = [],\n dominantSpeakers,\n localVideoComponent,\n screenShareComponent,\n onRenderRemoteParticipant,\n styles,\n maxRemoteVideoStreams,\n showCameraSwitcherInLocalPreview,\n parentWidth,\n parentHeight,\n /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition = 'HorizontalBottom',\n pinnedParticipantUserIds = [],\n /* @conditional-compile-remove(click-to-call) */ localVideoTileSize\n } = props;\n\n const theme = useTheme();\n\n const isNarrow = parentWidth ? isNarrowWidth(parentWidth) : false;\n\n /* @conditional-compile-remove(vertical-gallery) */\n const isShort = parentHeight ? isShortHeight(parentHeight) : false;\n\n // This is for tracking the number of children in the first page of overflow gallery.\n // This number will be used for the maxOverflowGalleryDominantSpeakers when organizing the remote participants.\n const childrenPerPage = useRef(4);\n const { gridParticipants, overflowGalleryParticipants } = useOrganizedParticipants({\n remoteParticipants,\n dominantSpeakers,\n maxRemoteVideoStreams,\n isScreenShareActive: !!screenShareComponent,\n maxOverflowGalleryDominantSpeakers: screenShareComponent\n ? childrenPerPage.current - (pinnedParticipantUserIds.length % childrenPerPage.current)\n : childrenPerPage.current,\n /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds\n });\n\n let activeVideoStreams = 0;\n\n const gridTiles = gridParticipants.map((p) => {\n return onRenderRemoteParticipant(\n p,\n maxRemoteVideoStreams && maxRemoteVideoStreams >= 0\n ? p.videoStream?.isAvailable && activeVideoStreams++ < maxRemoteVideoStreams\n : p.videoStream?.isAvailable\n );\n });\n\n const shouldFloatLocalVideo = remoteParticipants.length > 0;\n\n if (!shouldFloatLocalVideo && localVideoComponent) {\n gridTiles.push(localVideoComponent);\n }\n\n /**\n * instantiate indexes available to render with indexes available that would be on first page\n *\n * For some components which do not strictly follow the order of the array, we might\n * re-render the initial tiles -> dispose them -> create new tiles, we need to take care of\n * this case when those components are here\n */\n const [indexesToRender, setIndexesToRender] = useState<number[]>([\n ...Array(maxRemoteVideoStreams - activeVideoStreams).keys()\n ]);\n\n const overflowGalleryTiles = overflowGalleryParticipants.map((p, i) => {\n return onRenderRemoteParticipant(\n p,\n maxRemoteVideoStreams && maxRemoteVideoStreams >= 0\n ? p.videoStream?.isAvailable && indexesToRender.includes(i) && activeVideoStreams++ < maxRemoteVideoStreams\n : p.videoStream?.isAvailable\n );\n });\n\n const layerHostId = useId('layerhost');\n\n const localVideoSizeRem = useMemo(() => {\n if (isNarrow && /*@conditional-compile-remove(click-to-call) */ !(localVideoTileSize === '16:9')) {\n return SMALL_FLOATING_MODAL_SIZE_REM;\n }\n /* @conditional-compile-remove(vertical-gallery) */\n if (overflowGalleryTiles.length > 0 && overflowGalleryPosition === 'VerticalRight') {\n return isNarrow && /*@conditional-compile-remove(click-to-call) */ !(localVideoTileSize === '16:9')\n ? SMALL_FLOATING_MODAL_SIZE_REM\n : isShort\n ? SHORT_VERTICAL_GALLERY_FLOATING_MODAL_SIZE_REM\n : VERTICAL_GALLERY_FLOATING_MODAL_SIZE_REM;\n }\n return LARGE_FLOATING_MODAL_SIZE_REM;\n }, [\n overflowGalleryTiles.length,\n isNarrow,\n /* @conditional-compile-remove(vertical-gallery) */ isShort,\n /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,\n /* @conditional-compile-remove(click-to-call) */ localVideoTileSize\n ]);\n\n const wrappedLocalVideoComponent =\n localVideoComponent && shouldFloatLocalVideo ? (\n // When we use showCameraSwitcherInLocalPreview it disables dragging to allow keyboard navigation.\n showCameraSwitcherInLocalPreview ? (\n <Stack\n className={mergeStyles(localVideoTileWithControlsContainerStyle(theme, localVideoSizeRem), {\n boxShadow: theme.effects.elevation8,\n zIndex: LOCAL_VIDEO_TILE_ZINDEX\n })}\n >\n {localVideoComponent}\n </Stack>\n ) : overflowGalleryTiles.length > 0 ? (\n <Stack className={mergeStyles(localVideoTileContainerStyle(theme, localVideoSizeRem))}>\n {localVideoComponent}\n </Stack>\n ) : (\n <FloatingLocalVideo\n localVideoComponent={localVideoComponent}\n layerHostId={layerHostId}\n localVideoSizeRem={localVideoSizeRem}\n parentWidth={parentWidth}\n parentHeight={parentHeight}\n />\n )\n ) : undefined;\n\n const overflowGallery = useMemo(() => {\n if (overflowGalleryTiles.length === 0) {\n return null;\n }\n return (\n <OverflowGallery\n /* @conditional-compile-remove(vertical-gallery) */\n isShort={isShort}\n onFetchTilesToRender={setIndexesToRender}\n isNarrow={isNarrow}\n shouldFloatLocalVideo={true}\n overflowGalleryElements={overflowGalleryTiles}\n horizontalGalleryStyles={styles?.horizontalGallery}\n /* @conditional-compile-remove(vertical-gallery) */\n verticalGalleryStyles={styles?.verticalGallery}\n /* @conditional-compile-remove(vertical-gallery) */\n overflowGalleryPosition={overflowGalleryPosition}\n onChildrenPerPageChange={(n: number) => {\n childrenPerPage.current = n;\n }}\n />\n );\n }, [\n isNarrow,\n /* @conditional-compile-remove(vertical-gallery) */ isShort,\n overflowGalleryTiles,\n styles?.horizontalGallery,\n /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,\n setIndexesToRender,\n /* @conditional-compile-remove(vertical-gallery) */ styles?.verticalGallery\n ]);\n\n return (\n <Stack styles={rootLayoutStyle}>\n {wrappedLocalVideoComponent}\n <LayerHost id={layerHostId} className={mergeStyles(layerHostStyle)} />\n <Stack\n /* @conditional-compile-remove(vertical-gallery) */\n horizontal={overflowGalleryPosition === 'VerticalRight'}\n styles={innerLayoutStyle}\n tokens={videoGalleryLayoutGap}\n >\n {screenShareComponent ? (\n screenShareComponent\n ) : (\n <GridLayout key=\"grid-layout\" styles={styles?.gridLayout}>\n {gridTiles}\n </GridLayout>\n )}\n {overflowGallery}\n </Stack>\n </Stack>\n );\n};\n"]}
1
+ {"version":3,"file":"FloatingLocalVideoLayout.js","sourceRoot":"","sources":["../../../../../../../react-components/src/components/VideoGallery/FloatingLocalVideoLayout.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { LayerHost, mergeStyles, Stack } from '@fluentui/react';\nimport { useId } from '@fluentui/react-hooks';\nimport React, { useMemo, useRef, useState } from 'react';\nimport { useTheme } from '../../theming';\nimport { GridLayout } from '../GridLayout';\nimport { isNarrowWidth } from '../utils/responsive';\n/* @conditional-compile-remove(vertical-gallery) */\nimport { isShortHeight } from '../utils/responsive';\nimport { FloatingLocalVideo } from './FloatingLocalVideo';\nimport { LayoutProps } from './Layout';\nimport {\n LARGE_FLOATING_MODAL_SIZE_REM,\n localVideoTileContainerStyle,\n localVideoTileWithControlsContainerStyle,\n LOCAL_VIDEO_TILE_ZINDEX,\n SMALL_FLOATING_MODAL_SIZE_REM\n} from './styles/FloatingLocalVideo.styles';\n/* @conditional-compile-remove(vertical-gallery) */\nimport {\n SHORT_VERTICAL_GALLERY_FLOATING_MODAL_SIZE_REM,\n VERTICAL_GALLERY_FLOATING_MODAL_SIZE_REM\n} from './styles/FloatingLocalVideo.styles';\nimport { innerLayoutStyle, layerHostStyle, rootLayoutStyle } from './styles/FloatingLocalVideoLayout.styles';\nimport { videoGalleryLayoutGap } from './styles/Layout.styles';\nimport { useOrganizedParticipants } from './utils/videoGalleryLayoutUtils';\nimport { OverflowGallery } from './OverflowGallery';\n/* @conditional-compile-remove(click-to-call) */\nimport { LocalVideoTileSize } from '../VideoGallery';\n\n/**\n * Props for {@link FloatingLocalVideoLayout}.\n *\n * @private\n */\nexport interface FloatingLocalVideoLayoutProps extends LayoutProps {\n /**\n * Whether to display the local video camera switcher button\n */\n showCameraSwitcherInLocalPreview?: boolean;\n /**\n * Height of parent element\n */\n parentHeight?: number;\n /* @conditional-compile-remove(click-to-call) */\n /**\n * Local video tile mode\n */\n localVideoTileSize?: LocalVideoTileSize;\n}\n\n/**\n * FloatingLocalVideoLayout displays remote participants and a screen sharing component in\n * a grid and overflow gallery while floating the local video\n *\n * @private\n */\nexport const FloatingLocalVideoLayout = (props: FloatingLocalVideoLayoutProps): JSX.Element => {\n const {\n remoteParticipants = [],\n dominantSpeakers,\n localVideoComponent,\n screenShareComponent,\n onRenderRemoteParticipant,\n styles,\n maxRemoteVideoStreams,\n showCameraSwitcherInLocalPreview,\n parentWidth,\n parentHeight,\n /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition = 'HorizontalBottom',\n pinnedParticipantUserIds = [],\n /* @conditional-compile-remove(click-to-call) */ localVideoTileSize\n } = props;\n\n const theme = useTheme();\n\n const isNarrow = parentWidth ? isNarrowWidth(parentWidth) : false;\n\n /* @conditional-compile-remove(vertical-gallery) */\n const isShort = parentHeight ? isShortHeight(parentHeight) : false;\n\n // This is for tracking the number of children in the first page of overflow gallery.\n // This number will be used for the maxOverflowGalleryDominantSpeakers when organizing the remote participants.\n const childrenPerPage = useRef(4);\n const { gridParticipants, overflowGalleryParticipants } = useOrganizedParticipants({\n remoteParticipants,\n dominantSpeakers,\n maxRemoteVideoStreams,\n isScreenShareActive: !!screenShareComponent,\n maxOverflowGalleryDominantSpeakers: screenShareComponent\n ? childrenPerPage.current - (pinnedParticipantUserIds.length % childrenPerPage.current)\n : childrenPerPage.current,\n /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds\n });\n\n let activeVideoStreams = 0;\n\n const gridTiles = gridParticipants.map((p) => {\n return onRenderRemoteParticipant(\n p,\n maxRemoteVideoStreams && maxRemoteVideoStreams >= 0\n ? p.videoStream?.isAvailable && activeVideoStreams++ < maxRemoteVideoStreams\n : p.videoStream?.isAvailable\n );\n });\n\n const shouldFloatLocalVideo = remoteParticipants.length > 0;\n\n if (!shouldFloatLocalVideo && localVideoComponent) {\n gridTiles.push(localVideoComponent);\n }\n\n /**\n * instantiate indexes available to render with indexes available that would be on first page\n *\n * For some components which do not strictly follow the order of the array, we might\n * re-render the initial tiles -> dispose them -> create new tiles, we need to take care of\n * this case when those components are here\n */\n const [indexesToRender, setIndexesToRender] = useState<number[]>([\n ...Array(maxRemoteVideoStreams - activeVideoStreams).keys()\n ]);\n\n const overflowGalleryTiles = overflowGalleryParticipants.map((p, i) => {\n return onRenderRemoteParticipant(\n p,\n maxRemoteVideoStreams && maxRemoteVideoStreams >= 0\n ? p.videoStream?.isAvailable && indexesToRender.includes(i) && activeVideoStreams++ < maxRemoteVideoStreams\n : p.videoStream?.isAvailable\n );\n });\n\n const layerHostId = useId('layerhost');\n\n const localVideoSizeRem = useMemo(() => {\n if (isNarrow || /*@conditional-compile-remove(click-to-call) */ localVideoTileSize === '9:16') {\n return SMALL_FLOATING_MODAL_SIZE_REM;\n }\n /* @conditional-compile-remove(vertical-gallery) */\n if (overflowGalleryTiles.length > 0 && overflowGalleryPosition === 'VerticalRight') {\n return isNarrow\n ? SMALL_FLOATING_MODAL_SIZE_REM\n : isShort\n ? SHORT_VERTICAL_GALLERY_FLOATING_MODAL_SIZE_REM\n : VERTICAL_GALLERY_FLOATING_MODAL_SIZE_REM;\n }\n /*@conditional-compile-remove(click-to-call) */\n if (overflowGalleryTiles.length > 0 && overflowGalleryPosition === 'HorizontalBottom') {\n return localVideoTileSize === '16:9' || !isNarrow ? LARGE_FLOATING_MODAL_SIZE_REM : SMALL_FLOATING_MODAL_SIZE_REM;\n }\n return LARGE_FLOATING_MODAL_SIZE_REM;\n }, [\n overflowGalleryTiles.length,\n isNarrow,\n /* @conditional-compile-remove(vertical-gallery) */ isShort,\n /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,\n /* @conditional-compile-remove(click-to-call) */ localVideoTileSize\n ]);\n\n const wrappedLocalVideoComponent =\n localVideoComponent && shouldFloatLocalVideo ? (\n // When we use showCameraSwitcherInLocalPreview it disables dragging to allow keyboard navigation.\n showCameraSwitcherInLocalPreview ? (\n <Stack\n className={mergeStyles(localVideoTileWithControlsContainerStyle(theme, localVideoSizeRem), {\n boxShadow: theme.effects.elevation8,\n zIndex: LOCAL_VIDEO_TILE_ZINDEX\n })}\n >\n {localVideoComponent}\n </Stack>\n ) : overflowGalleryTiles.length > 0 ? (\n <Stack className={mergeStyles(localVideoTileContainerStyle(theme, localVideoSizeRem))}>\n {localVideoComponent}\n </Stack>\n ) : (\n <FloatingLocalVideo\n localVideoComponent={localVideoComponent}\n layerHostId={layerHostId}\n localVideoSizeRem={localVideoSizeRem}\n parentWidth={parentWidth}\n parentHeight={parentHeight}\n />\n )\n ) : undefined;\n\n const overflowGallery = useMemo(() => {\n if (overflowGalleryTiles.length === 0) {\n return null;\n }\n return (\n <OverflowGallery\n /* @conditional-compile-remove(vertical-gallery) */\n isShort={isShort}\n onFetchTilesToRender={setIndexesToRender}\n isNarrow={isNarrow}\n shouldFloatLocalVideo={true}\n overflowGalleryElements={overflowGalleryTiles}\n horizontalGalleryStyles={styles?.horizontalGallery}\n /* @conditional-compile-remove(vertical-gallery) */\n verticalGalleryStyles={styles?.verticalGallery}\n /* @conditional-compile-remove(vertical-gallery) */\n overflowGalleryPosition={overflowGalleryPosition}\n onChildrenPerPageChange={(n: number) => {\n childrenPerPage.current = n;\n }}\n />\n );\n }, [\n isNarrow,\n /* @conditional-compile-remove(vertical-gallery) */ isShort,\n overflowGalleryTiles,\n styles?.horizontalGallery,\n /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,\n setIndexesToRender,\n /* @conditional-compile-remove(vertical-gallery) */ styles?.verticalGallery\n ]);\n\n return (\n <Stack styles={rootLayoutStyle}>\n {wrappedLocalVideoComponent}\n <LayerHost id={layerHostId} className={mergeStyles(layerHostStyle)} />\n <Stack\n /* @conditional-compile-remove(vertical-gallery) */\n horizontal={overflowGalleryPosition === 'VerticalRight'}\n styles={innerLayoutStyle}\n tokens={videoGalleryLayoutGap}\n >\n {screenShareComponent ? (\n screenShareComponent\n ) : (\n <GridLayout key=\"grid-layout\" styles={styles?.gridLayout}>\n {gridTiles}\n </GridLayout>\n )}\n {overflowGallery}\n </Stack>\n </Stack>\n );\n};\n"]}
@@ -125,7 +125,8 @@ export const VideoGallery = (props) => {
125
125
  }, styles === null || styles === void 0 ? void 0 : styles.localVideo);
126
126
  const initialsName = !localParticipant.displayName ? '' : localParticipant.displayName;
127
127
  return (React.createElement(Stack, { key: "local-video-tile-key", tabIndex: 0, "aria-label": strings.localVideoMovementLabel, role: 'dialog' },
128
- React.createElement(_LocalVideoTile, { userId: localParticipant.userId, onCreateLocalStreamView: onCreateLocalStreamView, onDisposeLocalStreamView: onDisposeLocalStreamView, isAvailable: (_a = localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable, isMuted: localParticipant.isMuted, renderElement: (_b = localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.videoStream) === null || _b === void 0 ? void 0 : _b.renderElement, displayName: isNarrow ? '' : strings.localVideoLabel, initialsName: initialsName, localVideoViewOptions: localVideoViewOptions, onRenderAvatar: onRenderAvatar, showLabel: !(shouldFloatLocalVideo && isNarrow), showMuteIndicator: showMuteIndicator, showCameraSwitcherInLocalPreview: showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps: localVideoCameraCycleButtonProps, localVideoCameraSwitcherLabel: strings.localVideoCameraSwitcherLabel, localVideoSelectedDescription: strings.localVideoSelectedDescription, styles: localVideoTileStyles })));
128
+ React.createElement(_LocalVideoTile, { userId: localParticipant.userId, onCreateLocalStreamView: onCreateLocalStreamView, onDisposeLocalStreamView: onDisposeLocalStreamView, isAvailable: (_a = localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable, isMuted: localParticipant.isMuted, renderElement: (_b = localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.videoStream) === null || _b === void 0 ? void 0 : _b.renderElement, displayName: isNarrow ? '' : strings.localVideoLabel, initialsName: initialsName, localVideoViewOptions: localVideoViewOptions, onRenderAvatar: onRenderAvatar, showLabel: !((shouldFloatLocalVideo && isNarrow) ||
129
+ /*@conditional-compile-remove(click-to-call) */ localVideoTileSize === '9:16'), showMuteIndicator: showMuteIndicator, showCameraSwitcherInLocalPreview: showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps: localVideoCameraCycleButtonProps, localVideoCameraSwitcherLabel: strings.localVideoCameraSwitcherLabel, localVideoSelectedDescription: strings.localVideoSelectedDescription, styles: localVideoTileStyles })));
129
130
  }, [
130
131
  isNarrow,
131
132
  localParticipant,
@@ -1 +1 @@
1
- {"version":3,"file":"VideoGallery.js","sourceRoot":"","sources":["../../../../../../react-components/src/components/VideoGallery.tsx"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,eAAe,EAAU,WAAW,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE5D,sDAAsD;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,sDAAsD;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAUtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAIrE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,wCAAwC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,iDAAiD,CAAC;AAC9F,sDAAsD;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAI9C;;;GAGG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC;AAElD;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,qBAAqB,EAAE,MAAM;IAC7B,uBAAuB,EAAE,MAAM;IAC/B,kBAAkB,EAAE,MAAM;IAC1B,iBAAiB,EAAE,MAAM;IACzB,aAAa,EAAE,MAAM;CACtB,CAAC;AACF;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAC7C;;;GAGG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAG;IACpD,IAAI,EAAE,YAAY;CACnB,CAAC;AAEF,sDAAsD;AACtD;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC;AA0N/C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAwB,EAAe,EAAE;;IACpE,MAAM,EACJ,gBAAgB,EAChB,kBAAkB,GAAG,EAAE,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EACzB,MAAM,EACN,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,qBAAqB,GAAG,gCAAgC,EACxD,gCAAgC,EAChC,gCAAgC;IAChC,sDAAsD;IACtD,gBAAgB,EAAE,uBAAuB;IACzC,sDAAsD;IACtD,kBAAkB,EAAE,yBAAyB;IAC7C,sDAAsD;IACtD,0BAA0B,GAAG,sCAAsC;IACnE,mDAAmD;IACnD,uBAAuB,GAAG,kBAAkB;IAC5C,gDAAgD;IAChD,kBAAkB,GAAG,yBAAyB,EAC/C,GAAG,KAAK,CAAC;IAEV,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,aAAa,GAAG,SAAS,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;IACvD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,iCAAM,aAAa,GAAK,KAAK,CAAC,OAAO,EAAG,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAExG,sDAAsD;IACtD,MAAM,wBAAwB,GAC5B,0BAA0B,IAAI,0BAA0B,CAAC,IAAI,KAAK,QAAQ;QACxE,CAAC,CAAE,0BAAuD,CAAC,MAAM;QACjE,CAAC,CAAC,SAAS,CAAC;IAChB,sDAAsD;IACtD,MAAM,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,EAAE,wBAAwB,CAAC,CAAC;IAE3E,MAAM,qBAAqB,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,oBAAoB,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEnG,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACxD,MAAM,eAAe,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAExE,sDAAsD;IACtD,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAW,EAAE,CAAC,CAAC;IAC3F,sDAAsD;IACtD,SAAS,CAAC,GAAG,EAAE;;QACb,MAAA,KAAK,CAAC,kBAAkB,0CAAE,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;;YACnD,IAAI,CAAC,CAAA,MAAA,KAAK,CAAC,kBAAkB,0CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAA,EAAE;gBACvE,qGAAqG;gBACrG,OAAO,CAAC,IAAI,CAAC,qCAAqC,GAAG,cAAc,CAAC,CAAC;aACtE;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACzD,sDAAsD;IACtD,6GAA6G;IAC7G,MAAM,kBAAkB,GAAG,MAAA,KAAK,CAAC,kBAAkB,mCAAI,uBAAuB,CAAC;IAE/E,wCAAwC;IACxC,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IAEtC;;OAEG;IACH,MAAM,cAAc,GAAG,OAAO,CAAC,GAAqE,EAAE;;QACpG,wCAAwC;QACxC,IAAI,CAAC,WAAW,CAAC,YAAY,IAAI,gDAAgD,CAAC,kBAAkB,KAAK,QAAQ,EAAE;YACjH,OAAO,SAAS,CAAC;SAClB;QACD,IAAI,sBAAsB,EAAE;YAC1B,OAAO,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;SACjD;QAED,MAAM,oBAAoB,GAAG,eAAe,CAC1C,qBAAqB,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,EACxD;YACE,IAAI,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE;SACrD,EACD,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,CACnB,CAAC;QAEF,MAAM,YAAY,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAC;QAEvF,OAAO,CACL,oBAAC,KAAK,IAAC,GAAG,EAAC,sBAAsB,EAAC,QAAQ,EAAE,CAAC,gBAAc,OAAO,CAAC,uBAAuB,EAAE,IAAI,EAAE,QAAQ;YACxG,oBAAC,eAAe,IACd,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAC/B,uBAAuB,EAAE,uBAAuB,EAChD,wBAAwB,EAAE,wBAAwB,EAClD,WAAW,EAAE,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,WAAW,0CAAE,WAAW,EACvD,OAAO,EAAE,gBAAgB,CAAC,OAAO,EACjC,aAAa,EAAE,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,WAAW,0CAAE,aAAa,EAC3D,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EACpD,YAAY,EAAE,YAAY,EAC1B,qBAAqB,EAAE,qBAAqB,EAC5C,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,CAAC,CAAC,qBAAqB,IAAI,QAAQ,CAAC,EAC/C,iBAAiB,EAAE,iBAAiB,EACpC,gCAAgC,EAAE,gCAAgC,EAClE,gCAAgC,EAAE,gCAAgC,EAClE,6BAA6B,EAAE,OAAO,CAAC,6BAA6B,EACpE,6BAA6B,EAAE,OAAO,CAAC,6BAA6B,EACpE,MAAM,EAAE,oBAAoB,GAC5B,CACI,CACT,CAAC;IACJ,CAAC,EAAE;QACD,QAAQ;QACR,gBAAgB;QAChB,gCAAgC;QAChC,qBAAqB;QACrB,uBAAuB;QACvB,wBAAwB;QACxB,cAAc;QACd,sBAAsB;QACtB,qBAAqB;QACrB,gCAAgC;QAChC,iBAAiB;QACjB,OAAO,CAAC,6BAA6B;QACrC,OAAO,CAAC,eAAe;QACvB,OAAO,CAAC,uBAAuB;QAC/B,OAAO,CAAC,6BAA6B;QACrC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU;QAClB,KAAK,CAAC,OAAO,CAAC,cAAc;QAC5B,wCAAwC,CAAC,WAAW,CAAC,YAAY;QACjE,gDAAgD,CAAC,kBAAkB;KACpE,CAAC,CAAC;IAEH,sDAAsD;IACtD,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,MAAc,EAAE,EAAE;QACjB,IAAI,kBAAkB,CAAC,MAAM,IAAI,6BAA6B,EAAE;YAC9D,OAAO;SACR;QACD,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;YAC7C,0BAA0B,CAAC,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;SACpE;QACD,uBAAuB,aAAvB,uBAAuB,uBAAvB,uBAAuB,CAAG,MAAM,CAAC,CAAC;IACpC,CAAC,EACD,CAAC,kBAAkB,CAAC,MAAM,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,uBAAuB,CAAC,CAC1G,CAAC;IACF,sDAAsD;IACtD,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,MAAc,EAAE,EAAE;QACjB,0BAA0B,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;QAChF,yBAAyB,aAAzB,yBAAyB,uBAAzB,yBAAyB,CAAG,MAAM,CAAC,CAAC;IACtC,CAAC,EACD,CAAC,uBAAuB,EAAE,0BAA0B,EAAE,yBAAyB,CAAC,CACjF,CAAC;IAEF,sDAAsD;IACtD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAS,EAAE,CAAC,CAAC;IAC/E,sDAAsD;IACtD;;OAEG;IACH,MAAM,qBAAqB,GAAG,WAAW,CACvC,CAAC,YAAY,EAAE,EAAE;QACf,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACpC;;WAEG;QACH,UAAU,CAAC,GAAG,EAAE;YACd,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC,EACD,CAAC,qBAAqB,CAAC,CACxB,CAAC;IAEF,MAAM,wBAAwB,GAAG,WAAW,CAC1C,CAAC,WAA0C,EAAE,kBAA4B,EAAE,EAAE;QAC3E,MAAM,iBAAiB,GAAG,WAAW,CAAC,WAAW,CAAC;QAElD,sDAAsD;QACtD,MAAM,QAAQ,GAAG,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAElE,OAAO,CACL,oBAAC,gBAAgB,IACf,GAAG,EAAE,WAAW,CAAC,MAAM,EACvB,MAAM,EAAE,WAAW,CAAC,MAAM,EAC1B,iBAAiB,EAAE,WAAW,EAC9B,wBAAwB,EAAE,kBAAkB,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,SAAS,EACnF,yBAAyB,EAAE,kBAAkB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS,EACrF,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,WAAW,CAAC,CAAC,CAAC,KAAK,EACxE,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,WAAW,CAAC,CAAC,CAAC,KAAK,EACxE,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,aAAa,CAAC,CAAC,CAAC,SAAS,EAChF,sBAAsB,EAAE,kBAAkB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,SAAS,EAC/E,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,iBAAiB,EACpC,OAAO,EAAE,OAAO;YAChB,6CAA6C;YAC7C,gBAAgB,EAAE,WAAW,CAAC,KAAK;YACnC,sDAAsD;YACtD,QAAQ,EACN,0BAA0B;gBACxB,CAAC,CAAC,0BAA0B,CAAC,IAAI,KAAK,QAAQ;oBAC5C,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,YAAY;gBAChB,CAAC,CAAC,SAAS;YAEf,sDAAsD;YACtD,gBAAgB,EAAE,gBAAgB;YAClC,sDAAsD;YACtD,gBAAgB,EAAE,gBAAgB;YAClC,sDAAsD;YACtD,kBAAkB,EAAE,kBAAkB;YACtC,sDAAsD;YACtD,QAAQ,EAAE,QAAQ;YAClB,sDAAsD;YACtD,kBAAkB,EAAE,kBAAkB,CAAC,MAAM,IAAI,6BAA6B;YAC9E,sDAAsD;YACtD,qBAAqB,EAAE,qBAAqB,GAC5C,CACH,CAAC;IACJ,CAAC,EACD;QACE,wBAAwB;QACxB,yBAAyB;QACzB,sBAAsB;QACtB,cAAc;QACd,iBAAiB;QACjB,OAAO;QACP,sDAAsD,CAAC,gBAAgB;QACvE,sDAAsD,CAAC,0BAA0B;QACjF,sDAAsD,CAAC,kBAAkB;QACzE,sDAAsD,CAAC,gBAAgB;QACvE,sDAAsD,CAAC,kBAAkB;QACzE,sDAAsD,CAAC,qBAAqB;KAC7E,CACF,CAAC;IAEF,MAAM,sBAAsB,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,WAAC,OAAA,MAAA,WAAW,CAAC,iBAAiB,0CAAE,WAAW,CAAA,EAAA,CAAC,CAAC;IAEpH,MAAM,+BAA+B,GAAG,oBAAC,gBAAgB,IAAC,gBAAgB,EAAE,gBAAgB,GAAI,CAAC;IAEjG,MAAM,0BAA0B,GAAG,sBAAsB,IAAI,CAC3D,oBAAC,iBAAiB,oBACZ,sBAAsB,IAC1B,aAAa,EAAE,MAAA,sBAAsB,CAAC,iBAAiB,0CAAE,aAAa,EACtE,wBAAwB,EAAE,wBAAwB,EAClD,yBAAyB,EAAE,yBAAyB,EACpD,WAAW,EAAE,MAAA,sBAAsB,CAAC,iBAAiB,0CAAE,WAAW,IAClE,CACH,CAAC;IAEF,MAAM,oBAAoB,GAAG,0BAA0B;QACrD,CAAC,CAAC,0BAA0B;QAC5B,CAAC,CAAC,gBAAgB,CAAC,iBAAiB;YACpC,CAAC,CAAC,+BAA+B;YACjC,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC,CAAC;QACL,kBAAkB;QAClB,oBAAoB;QACpB,gCAAgC;QAChC,qBAAqB;QACrB,gBAAgB;QAChB,MAAM;QACN,yBAAyB,EAAE,uBAAuB,aAAvB,uBAAuB,cAAvB,uBAAuB,GAAI,wBAAwB;QAC9E,mBAAmB,EAAE,cAAc;QACnC,WAAW,EAAE,cAAc;QAC3B,YAAY,EAAE,eAAe;QAC7B,sDAAsD,CAAC,wBAAwB,EAAE,kBAAkB;QACnG,mDAAmD,CAAC,uBAAuB;QAC3E,gDAAgD,CAAC,kBAAkB;KACpE,CAAC,EACF;QACE,kBAAkB;QAClB,oBAAoB;QACpB,gCAAgC;QAChC,qBAAqB;QACrB,gBAAgB;QAChB,MAAM;QACN,cAAc;QACd,cAAc;QACd,eAAe;QACf,uBAAuB;QACvB,wBAAwB;QACxB,sDAAsD,CAAC,kBAAkB;QACzE,mDAAmD,CAAC,uBAAuB;QAC3E,gDAAgD,CAAC,kBAAkB;KACpE,CACF,CAAC;IAEF,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,EAAE;QACtC,IAAI,MAAM,KAAK,oBAAoB,EAAE;YACnC,OAAO,oBAAC,wBAAwB,oBAAK,WAAW,EAAI,CAAC;SACtD;QACD,OAAO,oBAAC,aAAa,oBAAK,WAAW,EAAI,CAAC;IAC5C,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAE1B,OAAO,CACL;QACE,sDAAsD;QACtD,4GAA4G;QAC5G,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,gBAC/C,GAAG,CAAC,YAAY,EAC5B,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,WAAW,CAAC,yBAAyB,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,EAAE,YAAY,CAAC;QAE5E,kBAAkB;QAEjB,sDAAsD;QACtD,oBAAC,SAAS,IAAC,kBAAkB,EAAE,kBAAkB,EAAE,QAAQ,EAAC,QAAQ,GAAG,CAErE,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { concatStyleSets, IStyle, mergeStyles, Stack } from '@fluentui/react';\nimport React, { useCallback, useMemo, useRef } from 'react';\nimport { GridLayoutStyles } from '.';\n/* @conditional-compile-remove(pinned-participants) */\nimport { Announcer } from './Announcer';\n/* @conditional-compile-remove(pinned-participants) */\nimport { useEffect } from 'react';\nimport { useLocale } from '../localization';\nimport { useTheme } from '../theming';\nimport {\n BaseCustomStyles,\n OnRenderAvatarCallback,\n VideoGalleryLocalParticipant,\n VideoGalleryRemoteParticipant,\n VideoStreamOptions,\n CreateVideoStreamViewResult\n} from '../types';\nimport { HorizontalGalleryStyles } from './HorizontalGallery';\nimport { _RemoteVideoTile } from './RemoteVideoTile';\nimport { isNarrowWidth, _useContainerHeight, _useContainerWidth } from './utils/responsive';\nimport { LocalScreenShare } from './VideoGallery/LocalScreenShare';\nimport { RemoteScreenShare } from './VideoGallery/RemoteScreenShare';\nimport { LocalVideoCameraCycleButtonProps } from './LocalVideoCameraButton';\nimport { _ICoordinates, _ModalClone } from './ModalClone/ModalClone';\nimport { _formatString } from '@internal/acs-ui-common';\nimport { _LocalVideoTile } from './LocalVideoTile';\n/* @conditional-compile-remove(rooms) */\nimport { _usePermissions } from '../permissions';\nimport { DefaultLayout } from './VideoGallery/DefaultLayout';\nimport { FloatingLocalVideoLayout } from './VideoGallery/FloatingLocalVideoLayout';\nimport { useIdentifiers } from '../identifiers';\nimport { videoGalleryOuterDivStyle } from './styles/VideoGallery.styles';\nimport { floatingLocalVideoTileStyle } from './VideoGallery/styles/FloatingLocalVideo.styles';\n/* @conditional-compile-remove(pinned-participants) */\nimport { useId } from '@fluentui/react-hooks';\n/* @conditional-compile-remove(vertical-gallery) */\nimport { VerticalGalleryStyles } from './VerticalGallery';\n\n/**\n * @private\n * Currently the Calling JS SDK supports up to 4 remote video streams\n */\nexport const DEFAULT_MAX_REMOTE_VIDEO_STREAMS = 4;\n\n/**\n * @private\n * Styles to disable the selectivity of a text in video gallery\n */\nexport const unselectable = {\n '-webkit-user-select': 'none',\n '-webkit-touch-callout': 'none',\n '-moz-user-select': 'none',\n '-ms-user-select': 'none',\n 'user-select': 'none'\n};\n/**\n * @private\n * Set aside only 6 dominant speakers for remaining audio participants\n */\nexport const MAX_AUDIO_DOMINANT_SPEAKERS = 6;\n/**\n * @private\n * Default remote video tile menu options\n */\nexport const DEFAULT_REMOTE_VIDEO_TILE_MENU_OPTIONS = {\n kind: 'contextual'\n};\n\n/* @conditional-compile-remove(pinned-participants) */\n/**\n * @private\n * Maximum number of remote video tiles that can be pinned\n */\nexport const MAX_PINNED_REMOTE_VIDEO_TILES = 4;\n\n/**\n * All strings that may be shown on the UI in the {@link VideoGallery}.\n *\n * @public\n */\nexport interface VideoGalleryStrings {\n /** String to notify that local user is sharing their screen */\n screenIsBeingSharedMessage: string;\n /** String to show when remote screen share stream is loading */\n screenShareLoadingMessage: string;\n /** String for local video label. Default is \"You\" */\n localVideoLabel: string;\n /** String for local video camera switcher */\n localVideoCameraSwitcherLabel: string;\n /** String for announcing the local video tile can be moved by keyboard controls */\n localVideoMovementLabel: string;\n /** String for announcing the selected camera */\n localVideoSelectedDescription: string;\n /** placeholder text for participants who does not have a display name*/\n displayNamePlaceholder: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Menu text shown in Video Tile contextual menu for setting a remote participants video to fit in frame */\n fitRemoteParticipantToFrame: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Menu text shown in Video Tile contextual menu for setting a remote participants video to fill the frame */\n fillRemoteParticipantFrame: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Menu text shown in Video Tile contextual menu for pinning a remote participant's video tile */\n pinParticipantForMe: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Menu text shown in Video Tile contextual menu for setting a remote participant's video tile */\n unpinParticipantForMe: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Aria label for pin participant menu item of remote participant's video tile */\n pinParticipantMenuItemAriaLabel: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Aria label for unpin participant menu item of remote participant's video tile */\n unpinParticipantMenuItemAriaLabel: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Aria label to announce when remote participant's video tile is pinned */\n pinnedParticipantAnnouncementAriaLabel: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Aria label to announce when remote participant's video tile is unpinned */\n unpinnedParticipantAnnouncementAriaLabel: string;\n}\n\n/**\n * @public\n */\nexport type VideoGalleryLayout = 'default' | 'floatingLocalVideo';\n\n/**\n * {@link VideoGallery} Component Styles.\n * @public\n */\nexport interface VideoGalleryStyles extends BaseCustomStyles {\n /** Styles for the grid layout */\n gridLayout?: GridLayoutStyles;\n /** Styles for the horizontal gallery */\n horizontalGallery?: HorizontalGalleryStyles;\n /** Styles for the local video */\n localVideo?: IStyle;\n /* @conditional-compile-remove(vertical-gallery) */\n /** Styles for the vertical gallery */\n verticalGallery?: VerticalGalleryStyles;\n}\n\n/* @conditional-compile-remove(vertical-gallery) */\n/**\n * Different modes and positions of the overflow gallery in the VideoGallery\n *\n * @beta\n */\nexport type OverflowGalleryPosition = 'HorizontalBottom' | 'VerticalRight';\n\n/* @conditional-compile-remove(click-to-call) */\n/**\n * different modes of the local video tile\n *\n * @beta\n */\nexport type LocalVideoTileSize = '9:16' | '16:9' | 'hidden' | 'followDeviceOrientation';\n\n/**\n * Props for {@link VideoGallery}.\n *\n * @public\n */\nexport interface VideoGalleryProps {\n /**\n * Allows users to pass an object containing custom CSS styles for the gallery container.\n *\n * @Example\n * ```\n * <VideoGallery styles={{ root: { border: 'solid 1px red' } }} />\n * ```\n */\n styles?: VideoGalleryStyles;\n /** Layout of the video tiles. */\n layout?: VideoGalleryLayout;\n /** Local video particpant */\n localParticipant: VideoGalleryLocalParticipant;\n /** List of remote video particpants */\n remoteParticipants?: VideoGalleryRemoteParticipant[];\n /** List of dominant speaker userIds in the order of their dominance. 0th index is the most dominant. */\n dominantSpeakers?: string[];\n /** Local video view options */\n localVideoViewOptions?: VideoStreamOptions;\n /** Remote videos view options */\n remoteVideoViewOptions?: VideoStreamOptions;\n /** Callback to create the local video stream view */\n onCreateLocalStreamView?: (options?: VideoStreamOptions) => Promise<void | CreateVideoStreamViewResult>;\n /** Callback to dispose of the local video stream view */\n onDisposeLocalStreamView?: () => void;\n /** Callback to render the local video tile*/\n onRenderLocalVideoTile?: (localParticipant: VideoGalleryLocalParticipant) => JSX.Element;\n /** Callback to create a remote video stream view */\n onCreateRemoteStreamView?: (\n userId: string,\n options?: VideoStreamOptions\n ) => Promise<void | CreateVideoStreamViewResult>;\n /** Callback to render a remote video tile */\n onRenderRemoteVideoTile?: (remoteParticipant: VideoGalleryRemoteParticipant) => JSX.Element;\n /** Callback to dispose a remote video stream view */\n onDisposeRemoteStreamView?: (userId: string) => Promise<void>;\n /** Callback to render a particpant avatar */\n onRenderAvatar?: OnRenderAvatarCallback;\n /**\n * Whether to display the local video camera switcher button\n */\n showCameraSwitcherInLocalPreview?: boolean;\n /**\n * Whether to display a mute icon beside the user's display name.\n * @defaultValue `true`\n */\n showMuteIndicator?: boolean;\n /** Optional strings to override in component */\n strings?: Partial<VideoGalleryStrings>;\n /**\n * Maximum number of participant remote video streams that is rendered.\n * @defaultValue 4\n */\n maxRemoteVideoStreams?: number;\n /**\n * Camera control information for button to switch cameras.\n */\n localVideoCameraCycleButtonProps?: LocalVideoCameraCycleButtonProps;\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * List of pinned participant userIds.\n */\n pinnedParticipants?: string[];\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * This callback will be called when a participant video tile is pinned.\n */\n onPinParticipant?: (userId: string) => void;\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * This callback will be called when a participant video tile is un-pinned.\n */\n onUnpinParticipant?: (userId: string) => void;\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * Options for showing the remote video tile menu.\n *\n * @defaultValue \\{ kind: 'contextual' \\}\n */\n remoteVideoTileMenuOptions?: false | VideoTileContextualMenuProps | VideoTileDrawerMenuProps;\n /* @conditional-compile-remove(vertical-gallery) */\n /**\n * Determines the layout of the overflowGallery inside the VideoGallery.\n * @defaultValue 'HorizontalBottom'\n */\n overflowGalleryPosition?: OverflowGalleryPosition;\n /* @conditional-compile-remove(click-to-call) */\n /**\n * Determines the aspect ratio of local video tile in the video gallery.\n * @remarks 'followDeviceOrientation' will be responsive to the screen orientation and will change between 9:16 (portrait) and\n * 16:9 (landscape) aspect ratios.\n * @defaultValue 'followDeviceOrientation'\n */\n localVideoTileSize?: LocalVideoTileSize;\n}\n\n/* @conditional-compile-remove(pinned-participants) */\n/**\n * Properties for showing contextual menu for remote {@link VideoTile} components in {@link VideoGallery}.\n *\n * @beta\n */\nexport interface VideoTileContextualMenuProps {\n /**\n * The menu property kind\n */\n kind: 'contextual';\n}\n\n/* @conditional-compile-remove(pinned-participants) */\n/**\n * Properties for showing drawer menu on remote {@link VideoTile} long touch in {@link VideoGallery}.\n *\n * @beta\n */\nexport interface VideoTileDrawerMenuProps {\n /**\n * The menu property kind\n */\n kind: 'drawer';\n /**\n * The optional id property provided on an element that the drawer menu should render within when a\n * remote participant video tile Drawer is shown. If an id is not provided, then a drawer menu will\n * render within the VideoGallery component.\n */\n hostId?: string;\n}\n/**\n * VideoGallery represents a layout of video tiles for a specific call.\n * It displays a {@link VideoTile} for the local user as well as for each remote participant who has joined the call.\n *\n * @public\n */\nexport const VideoGallery = (props: VideoGalleryProps): JSX.Element => {\n const {\n localParticipant,\n remoteParticipants = [],\n localVideoViewOptions,\n remoteVideoViewOptions,\n dominantSpeakers,\n onRenderLocalVideoTile,\n onRenderRemoteVideoTile,\n onCreateLocalStreamView,\n onDisposeLocalStreamView,\n onCreateRemoteStreamView,\n onDisposeRemoteStreamView,\n styles,\n layout,\n onRenderAvatar,\n showMuteIndicator,\n maxRemoteVideoStreams = DEFAULT_MAX_REMOTE_VIDEO_STREAMS,\n showCameraSwitcherInLocalPreview,\n localVideoCameraCycleButtonProps,\n /* @conditional-compile-remove(pinned-participants) */\n onPinParticipant: onPinParticipantHandler,\n /* @conditional-compile-remove(pinned-participants) */\n onUnpinParticipant: onUnpinParticipantHandler,\n /* @conditional-compile-remove(pinned-participants) */\n remoteVideoTileMenuOptions = DEFAULT_REMOTE_VIDEO_TILE_MENU_OPTIONS,\n /* @conditional-compile-remove(vertical-gallery) */\n overflowGalleryPosition = 'HorizontalBottom',\n /* @conditional-compile-remove(click-to-call) */\n localVideoTileSize = 'followDeviceOrientation'\n } = props;\n\n const ids = useIdentifiers();\n const theme = useTheme();\n const localeStrings = useLocale().strings.videoGallery;\n const strings = useMemo(() => ({ ...localeStrings, ...props.strings }), [localeStrings, props.strings]);\n\n /* @conditional-compile-remove(pinned-participants) */\n const drawerMenuHostIdFromProp =\n remoteVideoTileMenuOptions && remoteVideoTileMenuOptions.kind === 'drawer'\n ? (remoteVideoTileMenuOptions as VideoTileDrawerMenuProps).hostId\n : undefined;\n /* @conditional-compile-remove(pinned-participants) */\n const drawerMenuHostId = useId('drawerMenuHost', drawerMenuHostIdFromProp);\n\n const shouldFloatLocalVideo = !!(layout === 'floatingLocalVideo' && remoteParticipants.length > 0);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const containerWidth = _useContainerWidth(containerRef);\n const containerHeight = _useContainerHeight(containerRef);\n const isNarrow = containerWidth ? isNarrowWidth(containerWidth) : false;\n\n /* @conditional-compile-remove(pinned-participants) */\n const [pinnedParticipantsState, setPinnedParticipantsState] = React.useState<string[]>([]);\n /* @conditional-compile-remove(pinned-participants) */\n useEffect(() => {\n props.pinnedParticipants?.forEach((pinParticipant) => {\n if (!props.remoteParticipants?.find((t) => t.userId === pinParticipant)) {\n // warning will be logged in the console when invalid participant id is passed in pinned participants\n console.warn('Invalid pinned participant UserId :' + pinParticipant);\n }\n });\n }, [props.pinnedParticipants, props.remoteParticipants]);\n /* @conditional-compile-remove(pinned-participants) */\n // Use pinnedParticipants from props but if it is not defined use the maintained state of pinned participants\n const pinnedParticipants = props.pinnedParticipants ?? pinnedParticipantsState;\n\n /* @conditional-compile-remove(rooms) */\n const permissions = _usePermissions();\n\n /**\n * Utility function for memoized rendering of LocalParticipant.\n */\n const localVideoTile = useMemo((): JSX.Element /* @conditional-compile-remove(rooms) */ | undefined => {\n /* @conditional-compile-remove(rooms) */\n if (!permissions.cameraButton || /* @conditional-compile-remove(click-to-call) */ localVideoTileSize === 'hidden') {\n return undefined;\n }\n if (onRenderLocalVideoTile) {\n return onRenderLocalVideoTile(localParticipant);\n }\n\n const localVideoTileStyles = concatStyleSets(\n shouldFloatLocalVideo ? floatingLocalVideoTileStyle : {},\n {\n root: { borderRadius: theme.effects.roundedCorner4 }\n },\n styles?.localVideo\n );\n\n const initialsName = !localParticipant.displayName ? '' : localParticipant.displayName;\n\n return (\n <Stack key=\"local-video-tile-key\" tabIndex={0} aria-label={strings.localVideoMovementLabel} role={'dialog'}>\n <_LocalVideoTile\n userId={localParticipant.userId}\n onCreateLocalStreamView={onCreateLocalStreamView}\n onDisposeLocalStreamView={onDisposeLocalStreamView}\n isAvailable={localParticipant?.videoStream?.isAvailable}\n isMuted={localParticipant.isMuted}\n renderElement={localParticipant?.videoStream?.renderElement}\n displayName={isNarrow ? '' : strings.localVideoLabel}\n initialsName={initialsName}\n localVideoViewOptions={localVideoViewOptions}\n onRenderAvatar={onRenderAvatar}\n showLabel={!(shouldFloatLocalVideo && isNarrow)}\n showMuteIndicator={showMuteIndicator}\n showCameraSwitcherInLocalPreview={showCameraSwitcherInLocalPreview}\n localVideoCameraCycleButtonProps={localVideoCameraCycleButtonProps}\n localVideoCameraSwitcherLabel={strings.localVideoCameraSwitcherLabel}\n localVideoSelectedDescription={strings.localVideoSelectedDescription}\n styles={localVideoTileStyles}\n />\n </Stack>\n );\n }, [\n isNarrow,\n localParticipant,\n localVideoCameraCycleButtonProps,\n localVideoViewOptions,\n onCreateLocalStreamView,\n onDisposeLocalStreamView,\n onRenderAvatar,\n onRenderLocalVideoTile,\n shouldFloatLocalVideo,\n showCameraSwitcherInLocalPreview,\n showMuteIndicator,\n strings.localVideoCameraSwitcherLabel,\n strings.localVideoLabel,\n strings.localVideoMovementLabel,\n strings.localVideoSelectedDescription,\n styles?.localVideo,\n theme.effects.roundedCorner4,\n /* @conditional-compile-remove(rooms) */ permissions.cameraButton,\n /* @conditional-compile-remove(click-to-call) */ localVideoTileSize\n ]);\n\n /* @conditional-compile-remove(pinned-participants) */\n const onPinParticipant = useCallback(\n (userId: string) => {\n if (pinnedParticipants.length >= MAX_PINNED_REMOTE_VIDEO_TILES) {\n return;\n }\n if (!pinnedParticipantsState.includes(userId)) {\n setPinnedParticipantsState(pinnedParticipantsState.concat(userId));\n }\n onPinParticipantHandler?.(userId);\n },\n [pinnedParticipants.length, pinnedParticipantsState, setPinnedParticipantsState, onPinParticipantHandler]\n );\n /* @conditional-compile-remove(pinned-participants) */\n const onUnpinParticipant = useCallback(\n (userId: string) => {\n setPinnedParticipantsState(pinnedParticipantsState.filter((p) => p !== userId));\n onUnpinParticipantHandler?.(userId);\n },\n [pinnedParticipantsState, setPinnedParticipantsState, onUnpinParticipantHandler]\n );\n\n /* @conditional-compile-remove(pinned-participants) */\n const [announcementString, setAnnouncementString] = React.useState<string>('');\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * sets the announcement string for VideoGallery actions so that the screenreader will trigger\n */\n const toggleAnnouncerString = useCallback(\n (announcement) => {\n setAnnouncementString(announcement);\n /**\n * Clears the announcer string after VideoGallery action allowing it to be re-announced.\n */\n setTimeout(() => {\n setAnnouncementString('');\n }, 3000);\n },\n [setAnnouncementString]\n );\n\n const defaultOnRenderVideoTile = useCallback(\n (participant: VideoGalleryRemoteParticipant, isVideoParticipant?: boolean) => {\n const remoteVideoStream = participant.videoStream;\n\n /* @conditional-compile-remove(pinned-participants) */\n const isPinned = pinnedParticipants?.includes(participant.userId);\n\n return (\n <_RemoteVideoTile\n key={participant.userId}\n userId={participant.userId}\n remoteParticipant={participant}\n onCreateRemoteStreamView={isVideoParticipant ? onCreateRemoteStreamView : undefined}\n onDisposeRemoteStreamView={isVideoParticipant ? onDisposeRemoteStreamView : undefined}\n isAvailable={isVideoParticipant ? remoteVideoStream?.isAvailable : false}\n isReceiving={isVideoParticipant ? remoteVideoStream?.isReceiving : false}\n renderElement={isVideoParticipant ? remoteVideoStream?.renderElement : undefined}\n remoteVideoViewOptions={isVideoParticipant ? remoteVideoViewOptions : undefined}\n onRenderAvatar={onRenderAvatar}\n showMuteIndicator={showMuteIndicator}\n strings={strings}\n /* @conditional-compile-remove(PSTN-calls) */\n participantState={participant.state}\n /* @conditional-compile-remove(pinned-participants) */\n menuKind={\n remoteVideoTileMenuOptions\n ? remoteVideoTileMenuOptions.kind === 'drawer'\n ? 'drawer'\n : 'contextual'\n : undefined\n }\n /* @conditional-compile-remove(pinned-participants) */\n drawerMenuHostId={drawerMenuHostId}\n /* @conditional-compile-remove(pinned-participants) */\n onPinParticipant={onPinParticipant}\n /* @conditional-compile-remove(pinned-participants) */\n onUnpinParticipant={onUnpinParticipant}\n /* @conditional-compile-remove(pinned-participants) */\n isPinned={isPinned}\n /* @conditional-compile-remove(pinned-participants) */\n disablePinMenuItem={pinnedParticipants.length >= MAX_PINNED_REMOTE_VIDEO_TILES}\n /* @conditional-compile-remove(pinned-participants) */\n toggleAnnouncerString={toggleAnnouncerString}\n />\n );\n },\n [\n onCreateRemoteStreamView,\n onDisposeRemoteStreamView,\n remoteVideoViewOptions,\n onRenderAvatar,\n showMuteIndicator,\n strings,\n /* @conditional-compile-remove(pinned-participants) */ drawerMenuHostId,\n /* @conditional-compile-remove(pinned-participants) */ remoteVideoTileMenuOptions,\n /* @conditional-compile-remove(pinned-participants) */ pinnedParticipants,\n /* @conditional-compile-remove(pinned-participants) */ onPinParticipant,\n /* @conditional-compile-remove(pinned-participants) */ onUnpinParticipant,\n /* @conditional-compile-remove(pinned-participants) */ toggleAnnouncerString\n ]\n );\n\n const screenShareParticipant = remoteParticipants.find((participant) => participant.screenShareStream?.isAvailable);\n\n const localScreenShareStreamComponent = <LocalScreenShare localParticipant={localParticipant} />;\n\n const remoteScreenShareComponent = screenShareParticipant && (\n <RemoteScreenShare\n {...screenShareParticipant}\n renderElement={screenShareParticipant.screenShareStream?.renderElement}\n onCreateRemoteStreamView={onCreateRemoteStreamView}\n onDisposeRemoteStreamView={onDisposeRemoteStreamView}\n isReceiving={screenShareParticipant.screenShareStream?.isReceiving}\n />\n );\n\n const screenShareComponent = remoteScreenShareComponent\n ? remoteScreenShareComponent\n : localParticipant.isScreenSharingOn\n ? localScreenShareStreamComponent\n : undefined;\n\n const layoutProps = useMemo(\n () => ({\n remoteParticipants,\n screenShareComponent,\n showCameraSwitcherInLocalPreview,\n maxRemoteVideoStreams,\n dominantSpeakers,\n styles,\n onRenderRemoteParticipant: onRenderRemoteVideoTile ?? defaultOnRenderVideoTile,\n localVideoComponent: localVideoTile,\n parentWidth: containerWidth,\n parentHeight: containerHeight,\n /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds: pinnedParticipants,\n /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,\n /* @conditional-compile-remove(click-to-call) */ localVideoTileSize\n }),\n [\n remoteParticipants,\n screenShareComponent,\n showCameraSwitcherInLocalPreview,\n maxRemoteVideoStreams,\n dominantSpeakers,\n styles,\n localVideoTile,\n containerWidth,\n containerHeight,\n onRenderRemoteVideoTile,\n defaultOnRenderVideoTile,\n /* @conditional-compile-remove(pinned-participants) */ pinnedParticipants,\n /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,\n /* @conditional-compile-remove(click-to-call) */ localVideoTileSize\n ]\n );\n\n const videoGalleryLayout = useMemo(() => {\n if (layout === 'floatingLocalVideo') {\n return <FloatingLocalVideoLayout {...layoutProps} />;\n }\n return <DefaultLayout {...layoutProps} />;\n }, [layout, layoutProps]);\n\n return (\n <div\n /* @conditional-compile-remove(pinned-participants) */\n // We don't assign an drawer menu host id to the VideoGallery when a drawerMenuHostId is assigned from props\n id={drawerMenuHostIdFromProp ? undefined : drawerMenuHostId}\n data-ui-id={ids.videoGallery}\n ref={containerRef}\n className={mergeStyles(videoGalleryOuterDivStyle, styles?.root, unselectable)}\n >\n {videoGalleryLayout}\n {\n /* @conditional-compile-remove(pinned-participants) */\n <Announcer announcementString={announcementString} ariaLive=\"polite\" />\n }\n </div>\n );\n};\n\"../../../acs-ui-common/src\""]}
1
+ {"version":3,"file":"VideoGallery.js","sourceRoot":"","sources":["../../../../../../react-components/src/components/VideoGallery.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { concatStyleSets, IStyle, mergeStyles, Stack } from '@fluentui/react';\nimport React, { useCallback, useMemo, useRef } from 'react';\nimport { GridLayoutStyles } from '.';\n/* @conditional-compile-remove(pinned-participants) */\nimport { Announcer } from './Announcer';\n/* @conditional-compile-remove(pinned-participants) */\nimport { useEffect } from 'react';\nimport { useLocale } from '../localization';\nimport { useTheme } from '../theming';\nimport {\n BaseCustomStyles,\n OnRenderAvatarCallback,\n VideoGalleryLocalParticipant,\n VideoGalleryRemoteParticipant,\n VideoStreamOptions,\n CreateVideoStreamViewResult\n} from '../types';\nimport { HorizontalGalleryStyles } from './HorizontalGallery';\nimport { _RemoteVideoTile } from './RemoteVideoTile';\nimport { isNarrowWidth, _useContainerHeight, _useContainerWidth } from './utils/responsive';\nimport { LocalScreenShare } from './VideoGallery/LocalScreenShare';\nimport { RemoteScreenShare } from './VideoGallery/RemoteScreenShare';\nimport { LocalVideoCameraCycleButtonProps } from './LocalVideoCameraButton';\nimport { _ICoordinates, _ModalClone } from './ModalClone/ModalClone';\nimport { _formatString } from '@internal/acs-ui-common';\nimport { _LocalVideoTile } from './LocalVideoTile';\n/* @conditional-compile-remove(rooms) */\nimport { _usePermissions } from '../permissions';\nimport { DefaultLayout } from './VideoGallery/DefaultLayout';\nimport { FloatingLocalVideoLayout } from './VideoGallery/FloatingLocalVideoLayout';\nimport { useIdentifiers } from '../identifiers';\nimport { videoGalleryOuterDivStyle } from './styles/VideoGallery.styles';\nimport { floatingLocalVideoTileStyle } from './VideoGallery/styles/FloatingLocalVideo.styles';\n/* @conditional-compile-remove(pinned-participants) */\nimport { useId } from '@fluentui/react-hooks';\n/* @conditional-compile-remove(vertical-gallery) */\nimport { VerticalGalleryStyles } from './VerticalGallery';\n\n/**\n * @private\n * Currently the Calling JS SDK supports up to 4 remote video streams\n */\nexport const DEFAULT_MAX_REMOTE_VIDEO_STREAMS = 4;\n\n/**\n * @private\n * Styles to disable the selectivity of a text in video gallery\n */\nexport const unselectable = {\n '-webkit-user-select': 'none',\n '-webkit-touch-callout': 'none',\n '-moz-user-select': 'none',\n '-ms-user-select': 'none',\n 'user-select': 'none'\n};\n/**\n * @private\n * Set aside only 6 dominant speakers for remaining audio participants\n */\nexport const MAX_AUDIO_DOMINANT_SPEAKERS = 6;\n/**\n * @private\n * Default remote video tile menu options\n */\nexport const DEFAULT_REMOTE_VIDEO_TILE_MENU_OPTIONS = {\n kind: 'contextual'\n};\n\n/* @conditional-compile-remove(pinned-participants) */\n/**\n * @private\n * Maximum number of remote video tiles that can be pinned\n */\nexport const MAX_PINNED_REMOTE_VIDEO_TILES = 4;\n\n/**\n * All strings that may be shown on the UI in the {@link VideoGallery}.\n *\n * @public\n */\nexport interface VideoGalleryStrings {\n /** String to notify that local user is sharing their screen */\n screenIsBeingSharedMessage: string;\n /** String to show when remote screen share stream is loading */\n screenShareLoadingMessage: string;\n /** String for local video label. Default is \"You\" */\n localVideoLabel: string;\n /** String for local video camera switcher */\n localVideoCameraSwitcherLabel: string;\n /** String for announcing the local video tile can be moved by keyboard controls */\n localVideoMovementLabel: string;\n /** String for announcing the selected camera */\n localVideoSelectedDescription: string;\n /** placeholder text for participants who does not have a display name*/\n displayNamePlaceholder: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Menu text shown in Video Tile contextual menu for setting a remote participants video to fit in frame */\n fitRemoteParticipantToFrame: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Menu text shown in Video Tile contextual menu for setting a remote participants video to fill the frame */\n fillRemoteParticipantFrame: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Menu text shown in Video Tile contextual menu for pinning a remote participant's video tile */\n pinParticipantForMe: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Menu text shown in Video Tile contextual menu for setting a remote participant's video tile */\n unpinParticipantForMe: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Aria label for pin participant menu item of remote participant's video tile */\n pinParticipantMenuItemAriaLabel: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Aria label for unpin participant menu item of remote participant's video tile */\n unpinParticipantMenuItemAriaLabel: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Aria label to announce when remote participant's video tile is pinned */\n pinnedParticipantAnnouncementAriaLabel: string;\n /* @conditional-compile-remove(pinned-participants) */\n /** Aria label to announce when remote participant's video tile is unpinned */\n unpinnedParticipantAnnouncementAriaLabel: string;\n}\n\n/**\n * @public\n */\nexport type VideoGalleryLayout = 'default' | 'floatingLocalVideo';\n\n/**\n * {@link VideoGallery} Component Styles.\n * @public\n */\nexport interface VideoGalleryStyles extends BaseCustomStyles {\n /** Styles for the grid layout */\n gridLayout?: GridLayoutStyles;\n /** Styles for the horizontal gallery */\n horizontalGallery?: HorizontalGalleryStyles;\n /** Styles for the local video */\n localVideo?: IStyle;\n /* @conditional-compile-remove(vertical-gallery) */\n /** Styles for the vertical gallery */\n verticalGallery?: VerticalGalleryStyles;\n}\n\n/* @conditional-compile-remove(vertical-gallery) */\n/**\n * Different modes and positions of the overflow gallery in the VideoGallery\n *\n * @beta\n */\nexport type OverflowGalleryPosition = 'HorizontalBottom' | 'VerticalRight';\n\n/* @conditional-compile-remove(click-to-call) */\n/**\n * different modes of the local video tile\n *\n * @beta\n */\nexport type LocalVideoTileSize = '9:16' | '16:9' | 'hidden' | 'followDeviceOrientation';\n\n/**\n * Props for {@link VideoGallery}.\n *\n * @public\n */\nexport interface VideoGalleryProps {\n /**\n * Allows users to pass an object containing custom CSS styles for the gallery container.\n *\n * @Example\n * ```\n * <VideoGallery styles={{ root: { border: 'solid 1px red' } }} />\n * ```\n */\n styles?: VideoGalleryStyles;\n /** Layout of the video tiles. */\n layout?: VideoGalleryLayout;\n /** Local video particpant */\n localParticipant: VideoGalleryLocalParticipant;\n /** List of remote video particpants */\n remoteParticipants?: VideoGalleryRemoteParticipant[];\n /** List of dominant speaker userIds in the order of their dominance. 0th index is the most dominant. */\n dominantSpeakers?: string[];\n /** Local video view options */\n localVideoViewOptions?: VideoStreamOptions;\n /** Remote videos view options */\n remoteVideoViewOptions?: VideoStreamOptions;\n /** Callback to create the local video stream view */\n onCreateLocalStreamView?: (options?: VideoStreamOptions) => Promise<void | CreateVideoStreamViewResult>;\n /** Callback to dispose of the local video stream view */\n onDisposeLocalStreamView?: () => void;\n /** Callback to render the local video tile*/\n onRenderLocalVideoTile?: (localParticipant: VideoGalleryLocalParticipant) => JSX.Element;\n /** Callback to create a remote video stream view */\n onCreateRemoteStreamView?: (\n userId: string,\n options?: VideoStreamOptions\n ) => Promise<void | CreateVideoStreamViewResult>;\n /** Callback to render a remote video tile */\n onRenderRemoteVideoTile?: (remoteParticipant: VideoGalleryRemoteParticipant) => JSX.Element;\n /** Callback to dispose a remote video stream view */\n onDisposeRemoteStreamView?: (userId: string) => Promise<void>;\n /** Callback to render a particpant avatar */\n onRenderAvatar?: OnRenderAvatarCallback;\n /**\n * Whether to display the local video camera switcher button\n */\n showCameraSwitcherInLocalPreview?: boolean;\n /**\n * Whether to display a mute icon beside the user's display name.\n * @defaultValue `true`\n */\n showMuteIndicator?: boolean;\n /** Optional strings to override in component */\n strings?: Partial<VideoGalleryStrings>;\n /**\n * Maximum number of participant remote video streams that is rendered.\n * @defaultValue 4\n */\n maxRemoteVideoStreams?: number;\n /**\n * Camera control information for button to switch cameras.\n */\n localVideoCameraCycleButtonProps?: LocalVideoCameraCycleButtonProps;\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * List of pinned participant userIds.\n */\n pinnedParticipants?: string[];\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * This callback will be called when a participant video tile is pinned.\n */\n onPinParticipant?: (userId: string) => void;\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * This callback will be called when a participant video tile is un-pinned.\n */\n onUnpinParticipant?: (userId: string) => void;\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * Options for showing the remote video tile menu.\n *\n * @defaultValue \\{ kind: 'contextual' \\}\n */\n remoteVideoTileMenuOptions?: false | VideoTileContextualMenuProps | VideoTileDrawerMenuProps;\n /* @conditional-compile-remove(vertical-gallery) */\n /**\n * Determines the layout of the overflowGallery inside the VideoGallery.\n * @defaultValue 'HorizontalBottom'\n */\n overflowGalleryPosition?: OverflowGalleryPosition;\n /* @conditional-compile-remove(click-to-call) */\n /**\n * Determines the aspect ratio of local video tile in the video gallery.\n * @remarks 'followDeviceOrientation' will be responsive to the screen orientation and will change between 9:16 (portrait) and\n * 16:9 (landscape) aspect ratios.\n * @defaultValue 'followDeviceOrientation'\n */\n localVideoTileSize?: LocalVideoTileSize;\n}\n\n/* @conditional-compile-remove(pinned-participants) */\n/**\n * Properties for showing contextual menu for remote {@link VideoTile} components in {@link VideoGallery}.\n *\n * @beta\n */\nexport interface VideoTileContextualMenuProps {\n /**\n * The menu property kind\n */\n kind: 'contextual';\n}\n\n/* @conditional-compile-remove(pinned-participants) */\n/**\n * Properties for showing drawer menu on remote {@link VideoTile} long touch in {@link VideoGallery}.\n *\n * @beta\n */\nexport interface VideoTileDrawerMenuProps {\n /**\n * The menu property kind\n */\n kind: 'drawer';\n /**\n * The optional id property provided on an element that the drawer menu should render within when a\n * remote participant video tile Drawer is shown. If an id is not provided, then a drawer menu will\n * render within the VideoGallery component.\n */\n hostId?: string;\n}\n/**\n * VideoGallery represents a layout of video tiles for a specific call.\n * It displays a {@link VideoTile} for the local user as well as for each remote participant who has joined the call.\n *\n * @public\n */\nexport const VideoGallery = (props: VideoGalleryProps): JSX.Element => {\n const {\n localParticipant,\n remoteParticipants = [],\n localVideoViewOptions,\n remoteVideoViewOptions,\n dominantSpeakers,\n onRenderLocalVideoTile,\n onRenderRemoteVideoTile,\n onCreateLocalStreamView,\n onDisposeLocalStreamView,\n onCreateRemoteStreamView,\n onDisposeRemoteStreamView,\n styles,\n layout,\n onRenderAvatar,\n showMuteIndicator,\n maxRemoteVideoStreams = DEFAULT_MAX_REMOTE_VIDEO_STREAMS,\n showCameraSwitcherInLocalPreview,\n localVideoCameraCycleButtonProps,\n /* @conditional-compile-remove(pinned-participants) */\n onPinParticipant: onPinParticipantHandler,\n /* @conditional-compile-remove(pinned-participants) */\n onUnpinParticipant: onUnpinParticipantHandler,\n /* @conditional-compile-remove(pinned-participants) */\n remoteVideoTileMenuOptions = DEFAULT_REMOTE_VIDEO_TILE_MENU_OPTIONS,\n /* @conditional-compile-remove(vertical-gallery) */\n overflowGalleryPosition = 'HorizontalBottom',\n /* @conditional-compile-remove(click-to-call) */\n localVideoTileSize = 'followDeviceOrientation'\n } = props;\n\n const ids = useIdentifiers();\n const theme = useTheme();\n const localeStrings = useLocale().strings.videoGallery;\n const strings = useMemo(() => ({ ...localeStrings, ...props.strings }), [localeStrings, props.strings]);\n\n /* @conditional-compile-remove(pinned-participants) */\n const drawerMenuHostIdFromProp =\n remoteVideoTileMenuOptions && remoteVideoTileMenuOptions.kind === 'drawer'\n ? (remoteVideoTileMenuOptions as VideoTileDrawerMenuProps).hostId\n : undefined;\n /* @conditional-compile-remove(pinned-participants) */\n const drawerMenuHostId = useId('drawerMenuHost', drawerMenuHostIdFromProp);\n\n const shouldFloatLocalVideo = !!(layout === 'floatingLocalVideo' && remoteParticipants.length > 0);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const containerWidth = _useContainerWidth(containerRef);\n const containerHeight = _useContainerHeight(containerRef);\n const isNarrow = containerWidth ? isNarrowWidth(containerWidth) : false;\n\n /* @conditional-compile-remove(pinned-participants) */\n const [pinnedParticipantsState, setPinnedParticipantsState] = React.useState<string[]>([]);\n /* @conditional-compile-remove(pinned-participants) */\n useEffect(() => {\n props.pinnedParticipants?.forEach((pinParticipant) => {\n if (!props.remoteParticipants?.find((t) => t.userId === pinParticipant)) {\n // warning will be logged in the console when invalid participant id is passed in pinned participants\n console.warn('Invalid pinned participant UserId :' + pinParticipant);\n }\n });\n }, [props.pinnedParticipants, props.remoteParticipants]);\n /* @conditional-compile-remove(pinned-participants) */\n // Use pinnedParticipants from props but if it is not defined use the maintained state of pinned participants\n const pinnedParticipants = props.pinnedParticipants ?? pinnedParticipantsState;\n\n /* @conditional-compile-remove(rooms) */\n const permissions = _usePermissions();\n\n /**\n * Utility function for memoized rendering of LocalParticipant.\n */\n const localVideoTile = useMemo((): JSX.Element /* @conditional-compile-remove(rooms) */ | undefined => {\n /* @conditional-compile-remove(rooms) */\n if (!permissions.cameraButton || /* @conditional-compile-remove(click-to-call) */ localVideoTileSize === 'hidden') {\n return undefined;\n }\n if (onRenderLocalVideoTile) {\n return onRenderLocalVideoTile(localParticipant);\n }\n\n const localVideoTileStyles = concatStyleSets(\n shouldFloatLocalVideo ? floatingLocalVideoTileStyle : {},\n {\n root: { borderRadius: theme.effects.roundedCorner4 }\n },\n styles?.localVideo\n );\n\n const initialsName = !localParticipant.displayName ? '' : localParticipant.displayName;\n\n return (\n <Stack key=\"local-video-tile-key\" tabIndex={0} aria-label={strings.localVideoMovementLabel} role={'dialog'}>\n <_LocalVideoTile\n userId={localParticipant.userId}\n onCreateLocalStreamView={onCreateLocalStreamView}\n onDisposeLocalStreamView={onDisposeLocalStreamView}\n isAvailable={localParticipant?.videoStream?.isAvailable}\n isMuted={localParticipant.isMuted}\n renderElement={localParticipant?.videoStream?.renderElement}\n displayName={isNarrow ? '' : strings.localVideoLabel}\n initialsName={initialsName}\n localVideoViewOptions={localVideoViewOptions}\n onRenderAvatar={onRenderAvatar}\n showLabel={\n !(\n (shouldFloatLocalVideo && isNarrow) ||\n /*@conditional-compile-remove(click-to-call) */ localVideoTileSize === '9:16'\n )\n }\n showMuteIndicator={showMuteIndicator}\n showCameraSwitcherInLocalPreview={showCameraSwitcherInLocalPreview}\n localVideoCameraCycleButtonProps={localVideoCameraCycleButtonProps}\n localVideoCameraSwitcherLabel={strings.localVideoCameraSwitcherLabel}\n localVideoSelectedDescription={strings.localVideoSelectedDescription}\n styles={localVideoTileStyles}\n />\n </Stack>\n );\n }, [\n isNarrow,\n localParticipant,\n localVideoCameraCycleButtonProps,\n localVideoViewOptions,\n onCreateLocalStreamView,\n onDisposeLocalStreamView,\n onRenderAvatar,\n onRenderLocalVideoTile,\n shouldFloatLocalVideo,\n showCameraSwitcherInLocalPreview,\n showMuteIndicator,\n strings.localVideoCameraSwitcherLabel,\n strings.localVideoLabel,\n strings.localVideoMovementLabel,\n strings.localVideoSelectedDescription,\n styles?.localVideo,\n theme.effects.roundedCorner4,\n /* @conditional-compile-remove(rooms) */ permissions.cameraButton,\n /* @conditional-compile-remove(click-to-call) */ localVideoTileSize\n ]);\n\n /* @conditional-compile-remove(pinned-participants) */\n const onPinParticipant = useCallback(\n (userId: string) => {\n if (pinnedParticipants.length >= MAX_PINNED_REMOTE_VIDEO_TILES) {\n return;\n }\n if (!pinnedParticipantsState.includes(userId)) {\n setPinnedParticipantsState(pinnedParticipantsState.concat(userId));\n }\n onPinParticipantHandler?.(userId);\n },\n [pinnedParticipants.length, pinnedParticipantsState, setPinnedParticipantsState, onPinParticipantHandler]\n );\n /* @conditional-compile-remove(pinned-participants) */\n const onUnpinParticipant = useCallback(\n (userId: string) => {\n setPinnedParticipantsState(pinnedParticipantsState.filter((p) => p !== userId));\n onUnpinParticipantHandler?.(userId);\n },\n [pinnedParticipantsState, setPinnedParticipantsState, onUnpinParticipantHandler]\n );\n\n /* @conditional-compile-remove(pinned-participants) */\n const [announcementString, setAnnouncementString] = React.useState<string>('');\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * sets the announcement string for VideoGallery actions so that the screenreader will trigger\n */\n const toggleAnnouncerString = useCallback(\n (announcement) => {\n setAnnouncementString(announcement);\n /**\n * Clears the announcer string after VideoGallery action allowing it to be re-announced.\n */\n setTimeout(() => {\n setAnnouncementString('');\n }, 3000);\n },\n [setAnnouncementString]\n );\n\n const defaultOnRenderVideoTile = useCallback(\n (participant: VideoGalleryRemoteParticipant, isVideoParticipant?: boolean) => {\n const remoteVideoStream = participant.videoStream;\n\n /* @conditional-compile-remove(pinned-participants) */\n const isPinned = pinnedParticipants?.includes(participant.userId);\n\n return (\n <_RemoteVideoTile\n key={participant.userId}\n userId={participant.userId}\n remoteParticipant={participant}\n onCreateRemoteStreamView={isVideoParticipant ? onCreateRemoteStreamView : undefined}\n onDisposeRemoteStreamView={isVideoParticipant ? onDisposeRemoteStreamView : undefined}\n isAvailable={isVideoParticipant ? remoteVideoStream?.isAvailable : false}\n isReceiving={isVideoParticipant ? remoteVideoStream?.isReceiving : false}\n renderElement={isVideoParticipant ? remoteVideoStream?.renderElement : undefined}\n remoteVideoViewOptions={isVideoParticipant ? remoteVideoViewOptions : undefined}\n onRenderAvatar={onRenderAvatar}\n showMuteIndicator={showMuteIndicator}\n strings={strings}\n /* @conditional-compile-remove(PSTN-calls) */\n participantState={participant.state}\n /* @conditional-compile-remove(pinned-participants) */\n menuKind={\n remoteVideoTileMenuOptions\n ? remoteVideoTileMenuOptions.kind === 'drawer'\n ? 'drawer'\n : 'contextual'\n : undefined\n }\n /* @conditional-compile-remove(pinned-participants) */\n drawerMenuHostId={drawerMenuHostId}\n /* @conditional-compile-remove(pinned-participants) */\n onPinParticipant={onPinParticipant}\n /* @conditional-compile-remove(pinned-participants) */\n onUnpinParticipant={onUnpinParticipant}\n /* @conditional-compile-remove(pinned-participants) */\n isPinned={isPinned}\n /* @conditional-compile-remove(pinned-participants) */\n disablePinMenuItem={pinnedParticipants.length >= MAX_PINNED_REMOTE_VIDEO_TILES}\n /* @conditional-compile-remove(pinned-participants) */\n toggleAnnouncerString={toggleAnnouncerString}\n />\n );\n },\n [\n onCreateRemoteStreamView,\n onDisposeRemoteStreamView,\n remoteVideoViewOptions,\n onRenderAvatar,\n showMuteIndicator,\n strings,\n /* @conditional-compile-remove(pinned-participants) */ drawerMenuHostId,\n /* @conditional-compile-remove(pinned-participants) */ remoteVideoTileMenuOptions,\n /* @conditional-compile-remove(pinned-participants) */ pinnedParticipants,\n /* @conditional-compile-remove(pinned-participants) */ onPinParticipant,\n /* @conditional-compile-remove(pinned-participants) */ onUnpinParticipant,\n /* @conditional-compile-remove(pinned-participants) */ toggleAnnouncerString\n ]\n );\n\n const screenShareParticipant = remoteParticipants.find((participant) => participant.screenShareStream?.isAvailable);\n\n const localScreenShareStreamComponent = <LocalScreenShare localParticipant={localParticipant} />;\n\n const remoteScreenShareComponent = screenShareParticipant && (\n <RemoteScreenShare\n {...screenShareParticipant}\n renderElement={screenShareParticipant.screenShareStream?.renderElement}\n onCreateRemoteStreamView={onCreateRemoteStreamView}\n onDisposeRemoteStreamView={onDisposeRemoteStreamView}\n isReceiving={screenShareParticipant.screenShareStream?.isReceiving}\n />\n );\n\n const screenShareComponent = remoteScreenShareComponent\n ? remoteScreenShareComponent\n : localParticipant.isScreenSharingOn\n ? localScreenShareStreamComponent\n : undefined;\n\n const layoutProps = useMemo(\n () => ({\n remoteParticipants,\n screenShareComponent,\n showCameraSwitcherInLocalPreview,\n maxRemoteVideoStreams,\n dominantSpeakers,\n styles,\n onRenderRemoteParticipant: onRenderRemoteVideoTile ?? defaultOnRenderVideoTile,\n localVideoComponent: localVideoTile,\n parentWidth: containerWidth,\n parentHeight: containerHeight,\n /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds: pinnedParticipants,\n /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,\n /* @conditional-compile-remove(click-to-call) */ localVideoTileSize\n }),\n [\n remoteParticipants,\n screenShareComponent,\n showCameraSwitcherInLocalPreview,\n maxRemoteVideoStreams,\n dominantSpeakers,\n styles,\n localVideoTile,\n containerWidth,\n containerHeight,\n onRenderRemoteVideoTile,\n defaultOnRenderVideoTile,\n /* @conditional-compile-remove(pinned-participants) */ pinnedParticipants,\n /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,\n /* @conditional-compile-remove(click-to-call) */ localVideoTileSize\n ]\n );\n\n const videoGalleryLayout = useMemo(() => {\n if (layout === 'floatingLocalVideo') {\n return <FloatingLocalVideoLayout {...layoutProps} />;\n }\n return <DefaultLayout {...layoutProps} />;\n }, [layout, layoutProps]);\n\n return (\n <div\n /* @conditional-compile-remove(pinned-participants) */\n // We don't assign an drawer menu host id to the VideoGallery when a drawerMenuHostId is assigned from props\n id={drawerMenuHostIdFromProp ? undefined : drawerMenuHostId}\n data-ui-id={ids.videoGallery}\n ref={containerRef}\n className={mergeStyles(videoGalleryOuterDivStyle, styles?.root, unselectable)}\n >\n {videoGalleryLayout}\n {\n /* @conditional-compile-remove(pinned-participants) */\n <Announcer announcementString={announcementString} ariaLive=\"polite\" />\n }\n </div>\n );\n};\n\"../../../acs-ui-common/src\""]}