@azure/communication-react 1.19.0-alpha-202409130015 → 1.19.0-alpha-202409170013
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.
- package/dist/communication-react.d.ts +3 -3
- package/dist/dist-cjs/communication-react/{ChatMessageComponentAsRichTextEditBox-BKNh4sxG.js → ChatMessageComponentAsRichTextEditBox-DczaGPAx.js} +2 -2
- package/dist/dist-cjs/communication-react/{ChatMessageComponentAsRichTextEditBox-BKNh4sxG.js.map → ChatMessageComponentAsRichTextEditBox-DczaGPAx.js.map} +1 -1
- package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-Bb0K4skk.js → RichTextSendBoxWrapper-f3qwoP3I.js} +2 -2
- package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-Bb0K4skk.js.map → RichTextSendBoxWrapper-f3qwoP3I.js.map} +1 -1
- package/dist/dist-cjs/communication-react/{index-KnxxQRA5.js → index-D-uZsyQQ.js} +62 -97
- package/dist/dist-cjs/communication-react/index-D-uZsyQQ.js.map +1 -0
- package/dist/dist-cjs/communication-react/index.js +1 -1
- package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
- package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionMenu.js +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionMenu.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionsFlyout.js +2 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionsFlyout.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/MessageComponents/ChatMessageComponentAsMessageBubble.js +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/MessageComponents/ChatMessageComponentAsMessageBubble.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMessageComponentAsEditBox.js +2 -2
- package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMessageComponentAsEditBox.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponent.d.ts +4 -2
- package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponent.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponentAsMessageBubble.js +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponentAsMessageBubble.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.js +28 -71
- package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.js.map +1 -1
- package/dist/dist-esm/react-components/src/localization/locales/ar-SA/strings.json +17 -10
- package/dist/dist-esm/react-components/src/localization/locales/cs-CZ/strings.json +15 -8
- package/dist/dist-esm/react-components/src/localization/locales/de-DE/strings.json +16 -9
- package/dist/dist-esm/react-components/src/localization/locales/en-GB/strings.json +17 -10
- package/dist/dist-esm/react-components/src/localization/locales/es-ES/strings.json +17 -10
- package/dist/dist-esm/react-components/src/localization/locales/fi-FI/strings.json +15 -8
- package/dist/dist-esm/react-components/src/localization/locales/fr-FR/strings.json +17 -10
- package/dist/dist-esm/react-components/src/localization/locales/he-IL/strings.json +16 -9
- package/dist/dist-esm/react-components/src/localization/locales/it-IT/strings.json +15 -8
- package/dist/dist-esm/react-components/src/localization/locales/ja-JP/strings.json +16 -9
- package/dist/dist-esm/react-components/src/localization/locales/ko-KR/strings.json +15 -8
- package/dist/dist-esm/react-components/src/localization/locales/nb-NO/strings.json +15 -8
- package/dist/dist-esm/react-components/src/localization/locales/nl-NL/strings.json +17 -10
- package/dist/dist-esm/react-components/src/localization/locales/pl-PL/strings.json +15 -8
- package/dist/dist-esm/react-components/src/localization/locales/pt-BR/strings.json +17 -10
- package/dist/dist-esm/react-components/src/localization/locales/ru-RU/strings.json +15 -8
- package/dist/dist-esm/react-components/src/localization/locales/sv-SE/strings.json +16 -9
- package/dist/dist-esm/react-components/src/localization/locales/tr-TR/strings.json +16 -9
- package/dist/dist-esm/react-components/src/localization/locales/zh-CN/strings.json +15 -8
- package/dist/dist-esm/react-components/src/localization/locales/zh-TW/strings.json +18 -11
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.d.ts +2 -2
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/state/CallWithChatAdapterState.d.ts +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/state/CallWithChatAdapterState.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/localization/locales/fr-FR/strings.json +10 -10
- package/package.json +1 -1
- package/dist/dist-cjs/communication-react/index-KnxxQRA5.js.map +0 -1
package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.js
CHANGED
@@ -9,12 +9,19 @@ const DEFAULT_MAX_VIDEO_SREAMS = 4;
|
|
9
9
|
*/
|
10
10
|
export const MAX_GRID_PARTICIPANTS_NOT_LARGE_GALLERY = 9;
|
11
11
|
const getOrganizedParticipants = (props) => {
|
12
|
-
const { remoteParticipants = [], dominantSpeakers = [], maxGridParticipants = DEFAULT_MAX_VIDEO_SREAMS, maxOverflowGalleryDominantSpeakers = DEFAULT_MAX_OVERFLOW_GALLERY_DOMINANT_SPEAKERS,
|
13
|
-
|
12
|
+
const { remoteParticipants = [], dominantSpeakers = [], maxGridParticipants = DEFAULT_MAX_VIDEO_SREAMS, maxOverflowGalleryDominantSpeakers = DEFAULT_MAX_OVERFLOW_GALLERY_DOMINANT_SPEAKERS, layout, previousGridParticipants = [], previousOverflowParticipants = [] } = props;
|
13
|
+
/* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
|
14
|
+
const callingParticipants = remoteParticipants.filter((p) => p.state === ('Connecting' || 'Ringing'));
|
15
|
+
/* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
|
16
|
+
const callingParticipantsSet = new Set(callingParticipants.map((p) => p.userId));
|
17
|
+
let connectedParticipants = remoteParticipants;
|
18
|
+
/* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
|
19
|
+
connectedParticipants = connectedParticipants.filter((p) => !callingParticipantsSet.has(p.userId));
|
20
|
+
const remoteParticipantsOrdered = putVideoParticipantsFirst(connectedParticipants);
|
14
21
|
const videoParticipants = remoteParticipants.filter((p) => { var _a; return (_a = p.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable; });
|
15
|
-
const
|
22
|
+
const participantsForGrid = layout === 'floatingLocalVideo' && videoParticipants.length > 0 ? videoParticipants : remoteParticipantsOrdered;
|
16
23
|
let newGridParticipants = smartDominantSpeakerParticipants({
|
17
|
-
participants:
|
24
|
+
participants: participantsForGrid,
|
18
25
|
dominantSpeakers,
|
19
26
|
currentParticipants: previousGridParticipants,
|
20
27
|
maxDominantSpeakers: maxGridParticipants
|
@@ -28,31 +35,21 @@ const getOrganizedParticipants = (props) => {
|
|
28
35
|
newGridParticipants = dominantSpeakerToGrid;
|
29
36
|
}
|
30
37
|
const gridParticipantSet = new Set(newGridParticipants.map((p) => p.userId));
|
31
|
-
/* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
|
32
|
-
const callingParticipants = remoteParticipantsOrdered.filter((p) => p.state === ('Connecting' || 'Ringing'));
|
33
|
-
/* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
|
34
|
-
const callingParticipantsSet = new Set(callingParticipants.map((p) => p.userId));
|
35
38
|
const newOverflowGalleryParticipants = smartDominantSpeakerParticipants({
|
36
|
-
participants: remoteParticipantsOrdered.filter((p) => !gridParticipantSet.has(p.userId)
|
37
|
-
/* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */ !callingParticipantsSet.has(p.userId)),
|
39
|
+
participants: remoteParticipantsOrdered.filter((p) => !gridParticipantSet.has(p.userId)),
|
38
40
|
dominantSpeakers: dominantSpeakers,
|
39
41
|
currentParticipants: previousOverflowParticipants,
|
40
42
|
maxDominantSpeakers: maxOverflowGalleryDominantSpeakers
|
41
43
|
});
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
gridParticipants: newGridParticipants,
|
52
|
-
overflowGalleryParticipants: newOverflowGalleryParticipants,
|
53
|
-
maxGridParticipants: maxGridParticipants,
|
54
|
-
/* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */ callingParticipants
|
55
|
-
});
|
44
|
+
let gridParticipants = newGridParticipants;
|
45
|
+
let overflowGalleryParticipants = newOverflowGalleryParticipants;
|
46
|
+
/* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
|
47
|
+
if (gridParticipants.length + callingParticipants.length <= maxGridParticipants) {
|
48
|
+
gridParticipants = gridParticipants.concat(callingParticipants);
|
49
|
+
}
|
50
|
+
else {
|
51
|
+
overflowGalleryParticipants = overflowGalleryParticipants.concat(callingParticipants);
|
52
|
+
}
|
56
53
|
return { gridParticipants, overflowGalleryParticipants };
|
57
54
|
};
|
58
55
|
/**
|
@@ -76,60 +73,20 @@ export const useOrganizedParticipants = (props) => {
|
|
76
73
|
const currentGridParticipants = useRef([]);
|
77
74
|
const currentOverflowGalleryParticipants = useRef([]);
|
78
75
|
const unfocusedParticipants = props.remoteParticipants.filter((p) => !focusedParticipantUserIdSet.has(p.userId));
|
79
|
-
const
|
76
|
+
const organizedParticipantsArgs = Object.assign(Object.assign({}, props), {
|
80
77
|
// if there are focused participants then leave no room in the grid by setting maxGridParticipants to 0
|
81
78
|
maxGridParticipants: focusedParticipants.length > 0 || props.isScreenShareActive ? 0 : props.maxGridParticipants, remoteParticipants: unfocusedParticipants, previousGridParticipants: currentGridParticipants.current, previousOverflowParticipants: currentOverflowGalleryParticipants.current });
|
82
|
-
const
|
83
|
-
currentGridParticipants.current =
|
84
|
-
currentOverflowGalleryParticipants.current =
|
79
|
+
const organizedParticipants = getOrganizedParticipants(organizedParticipantsArgs);
|
80
|
+
currentGridParticipants.current = organizedParticipants.gridParticipants;
|
81
|
+
currentOverflowGalleryParticipants.current = organizedParticipants.overflowGalleryParticipants;
|
85
82
|
return focusedParticipants.length > 0
|
86
83
|
? {
|
87
84
|
gridParticipants: props.isScreenShareActive ? [] : focusedParticipants,
|
88
85
|
overflowGalleryParticipants: props.isScreenShareActive
|
89
|
-
? focusedParticipants.concat(
|
90
|
-
:
|
86
|
+
? focusedParticipants.concat(organizedParticipants.overflowGalleryParticipants)
|
87
|
+
: organizedParticipants.overflowGalleryParticipants
|
91
88
|
}
|
92
|
-
:
|
93
|
-
};
|
94
|
-
const getGridParticipants = (args) => {
|
95
|
-
if (args.isScreenShareActive) {
|
96
|
-
return [];
|
97
|
-
}
|
98
|
-
// if we have no grid participants we need to cap the max number of overflowGallery participants in the grid
|
99
|
-
// we will use the max streams provided to the function to find the max participants that can go in the grid
|
100
|
-
// if there are less participants than max streams then we will use all participants including joining in the grid
|
101
|
-
/* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
|
102
|
-
return args.gridParticipants.length > 0
|
103
|
-
? args.gridParticipants
|
104
|
-
: args.overflowGalleryParticipants.length > args.maxGridParticipants
|
105
|
-
? args.overflowGalleryParticipants.slice(0, args.maxGridParticipants)
|
106
|
-
: args.overflowGalleryParticipants.slice(0, args.maxGridParticipants).concat(args.callingParticipants);
|
107
|
-
return args.gridParticipants.length > 0
|
108
|
-
? args.gridParticipants
|
109
|
-
: args.overflowGalleryParticipants.slice(0, args.maxGridParticipants);
|
110
|
-
};
|
111
|
-
const getOverflowGalleryRemoteParticipants = (args) => {
|
112
|
-
if (args.isScreenShareActive) {
|
113
|
-
// If screen sharing is active, assign video and audio participants as overflow gallery participants
|
114
|
-
/* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
|
115
|
-
return args.gridParticipants.concat(args.overflowGalleryParticipants.concat(args.callingParticipants));
|
116
|
-
return args.gridParticipants.concat(args.overflowGalleryParticipants);
|
117
|
-
}
|
118
|
-
else {
|
119
|
-
// If screen sharing is not active, then assign all video tiles as grid tiles.
|
120
|
-
// If there are no video tiles, then assign audio tiles as grid tiles.
|
121
|
-
// if there are more overflow tiles than max streams then find the tiles that don't fit in the grid and put them in overflow
|
122
|
-
// overflow should be empty if total participants including calling participants is less than max streams
|
123
|
-
/* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
|
124
|
-
return args.gridParticipants.length > 0
|
125
|
-
? args.overflowGalleryParticipants.concat(args.callingParticipants)
|
126
|
-
: args.overflowGalleryParticipants.length > args.maxGridParticipants
|
127
|
-
? args.overflowGalleryParticipants.slice(args.maxGridParticipants).concat(args.callingParticipants)
|
128
|
-
: [];
|
129
|
-
return args.gridParticipants.length > 0
|
130
|
-
? args.overflowGalleryParticipants
|
131
|
-
: args.overflowGalleryParticipants.slice(args.maxGridParticipants);
|
132
|
-
}
|
89
|
+
: organizedParticipants;
|
133
90
|
};
|
134
91
|
const putVideoParticipantsFirst = (remoteParticipants) => {
|
135
92
|
const videoParticipants = [];
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"videoGalleryLayoutUtils.js","sourceRoot":"","sources":["../../../../../../../../react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { useRef } from 'react';\nimport { smartDominantSpeakerParticipants } from '../../../gallery';\nimport { VideoGalleryParticipant, VideoGalleryRemoteParticipant } from '../../../types';\nimport { ReactionResources } from '../../..';\nimport { VideoGalleryLayout } from '../../VideoGallery';\n\n/**\n * Arguments used to determine a {@link OrganizedParticipantsResult}\n * @private\n */\nexport interface OrganizedParticipantsArgs {\n remoteParticipants: VideoGalleryRemoteParticipant[];\n localParticipant?: VideoGalleryParticipant;\n dominantSpeakers?: string[];\n maxGridParticipants?: number;\n maxOverflowGalleryDominantSpeakers?: number;\n isScreenShareActive?: boolean;\n pinnedParticipantUserIds?: string[];\n layout?: VideoGalleryLayout;\n spotlightedParticipantUserIds?: string[];\n previousGridParticipants?: VideoGalleryRemoteParticipant[];\n previousOverflowParticipants?: VideoGalleryRemoteParticipant[];\n}\n\n/**\n * A result that defines grid participants and overflow gallery participants in the VideoGallery\n * @private\n */\nexport interface OrganizedParticipantsResult {\n gridParticipants: VideoGalleryParticipant[];\n overflowGalleryParticipants: VideoGalleryParticipant[];\n}\n\nconst DEFAULT_MAX_OVERFLOW_GALLERY_DOMINANT_SPEAKERS = 6;\nconst DEFAULT_MAX_VIDEO_SREAMS = 4;\n/**\n * @private\n */\nexport const MAX_GRID_PARTICIPANTS_NOT_LARGE_GALLERY = 9;\n\nconst getOrganizedParticipants = (props: OrganizedParticipantsArgs): OrganizedParticipantsResult => {\n const {\n remoteParticipants = [],\n dominantSpeakers = [],\n maxGridParticipants = DEFAULT_MAX_VIDEO_SREAMS,\n maxOverflowGalleryDominantSpeakers = DEFAULT_MAX_OVERFLOW_GALLERY_DOMINANT_SPEAKERS,\n isScreenShareActive = false,\n layout,\n previousGridParticipants = [],\n previousOverflowParticipants = []\n } = props;\n\n const remoteParticipantsOrdered = putVideoParticipantsFirst(remoteParticipants);\n const videoParticipants = remoteParticipants.filter((p) => p.videoStream?.isAvailable);\n const participants =\n layout === 'floatingLocalVideo' && videoParticipants.length > 0 ? videoParticipants : remoteParticipantsOrdered;\n\n let newGridParticipants = smartDominantSpeakerParticipants({\n participants: participants,\n dominantSpeakers,\n currentParticipants: previousGridParticipants,\n maxDominantSpeakers: maxGridParticipants\n }).slice(0, maxGridParticipants);\n\n const dominantSpeakerToGrid =\n layout === 'speaker'\n ? dominantSpeakers && dominantSpeakers[0]\n ? newGridParticipants.filter((p) => p.userId === dominantSpeakers[0])\n : [newGridParticipants[0]]\n : [];\n\n if (dominantSpeakerToGrid[0]) {\n newGridParticipants = dominantSpeakerToGrid;\n }\n\n const gridParticipantSet = new Set(newGridParticipants.map((p) => p.userId));\n\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */\n const callingParticipants = remoteParticipantsOrdered.filter((p) => p.state === ('Connecting' || 'Ringing'));\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */\n const callingParticipantsSet = new Set(callingParticipants.map((p) => p.userId));\n\n const newOverflowGalleryParticipants = smartDominantSpeakerParticipants({\n participants: remoteParticipantsOrdered.filter(\n (p) =>\n !gridParticipantSet.has(p.userId) &&\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */ !callingParticipantsSet.has(\n p.userId\n )\n ),\n dominantSpeakers: dominantSpeakers,\n currentParticipants: previousOverflowParticipants,\n maxDominantSpeakers: maxOverflowGalleryDominantSpeakers\n });\n\n const gridParticipants = getGridParticipants({\n isScreenShareActive,\n gridParticipants: newGridParticipants,\n overflowGalleryParticipants: newOverflowGalleryParticipants,\n maxGridParticipants: maxGridParticipants,\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */ callingParticipants\n });\n\n const overflowGalleryParticipants = getOverflowGalleryRemoteParticipants({\n isScreenShareActive,\n gridParticipants: newGridParticipants,\n overflowGalleryParticipants: newOverflowGalleryParticipants,\n maxGridParticipants: maxGridParticipants,\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */ callingParticipants\n });\n\n return { gridParticipants, overflowGalleryParticipants };\n};\n\ninterface SortedRemoteParticipants {\n [key: string]: VideoGalleryRemoteParticipant;\n}\n\n/**\n * Hook to determine which participants should be in grid and overflow gallery and their order respectively\n * @private\n */\nexport const useOrganizedParticipants = (props: OrganizedParticipantsArgs): OrganizedParticipantsResult => {\n // map remote participants by userId\n const remoteParticipantMap = props.remoteParticipants.reduce((map, remoteParticipant) => {\n map[remoteParticipant.userId] = remoteParticipant;\n return map;\n }, {} as SortedRemoteParticipants);\n\n const spotlightedParticipantUserIds = props.spotlightedParticipantUserIds ?? [];\n const pinnedParticipantUserIds = props.pinnedParticipantUserIds ?? [];\n // declare set of focused participant user ids as spotlighted participants user ids followed by\n // pinned participants user ids which is deduplicated while maintaining order\n const focusedParticipantUserIdSet = new Set(\n spotlightedParticipantUserIds.concat(pinnedParticipantUserIds).filter((p) => remoteParticipantMap[p])\n );\n // get focused participants from map of remote participants in the order of the user ids\n const focusedParticipants: VideoGalleryRemoteParticipant[] = [...focusedParticipantUserIdSet].map(\n (p) => remoteParticipantMap[p]\n );\n\n const currentGridParticipants = useRef<VideoGalleryRemoteParticipant[]>([]);\n const currentOverflowGalleryParticipants = useRef<VideoGalleryRemoteParticipant[]>([]);\n\n const unfocusedParticipants = props.remoteParticipants.filter((p) => !focusedParticipantUserIdSet.has(p.userId));\n\n const useOrganizedParticipantsProps: OrganizedParticipantsArgs = {\n ...props,\n // if there are focused participants then leave no room in the grid by setting maxGridParticipants to 0\n maxGridParticipants: focusedParticipants.length > 0 || props.isScreenShareActive ? 0 : props.maxGridParticipants,\n remoteParticipants: unfocusedParticipants,\n previousGridParticipants: currentGridParticipants.current,\n previousOverflowParticipants: currentOverflowGalleryParticipants.current\n };\n\n const useOrganizedParticipantsResult = getOrganizedParticipants(useOrganizedParticipantsProps);\n\n currentGridParticipants.current = useOrganizedParticipantsResult.gridParticipants;\n currentOverflowGalleryParticipants.current = useOrganizedParticipantsResult.overflowGalleryParticipants;\n\n return focusedParticipants.length > 0\n ? {\n gridParticipants: props.isScreenShareActive ? [] : focusedParticipants,\n overflowGalleryParticipants: props.isScreenShareActive\n ? focusedParticipants.concat(useOrganizedParticipantsResult.overflowGalleryParticipants)\n : useOrganizedParticipantsResult.overflowGalleryParticipants\n }\n : useOrganizedParticipantsResult;\n};\n\nconst getGridParticipants = (args: {\n isScreenShareActive: boolean;\n gridParticipants: VideoGalleryParticipant[];\n overflowGalleryParticipants: VideoGalleryParticipant[];\n maxGridParticipants: number;\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */ callingParticipants: VideoGalleryParticipant[];\n}): VideoGalleryRemoteParticipant[] => {\n if (args.isScreenShareActive) {\n return [];\n }\n // if we have no grid participants we need to cap the max number of overflowGallery participants in the grid\n // we will use the max streams provided to the function to find the max participants that can go in the grid\n // if there are less participants than max streams then we will use all participants including joining in the grid\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */\n return args.gridParticipants.length > 0\n ? args.gridParticipants\n : args.overflowGalleryParticipants.length > args.maxGridParticipants\n ? args.overflowGalleryParticipants.slice(0, args.maxGridParticipants)\n : args.overflowGalleryParticipants.slice(0, args.maxGridParticipants).concat(args.callingParticipants);\n return args.gridParticipants.length > 0\n ? args.gridParticipants\n : args.overflowGalleryParticipants.slice(0, args.maxGridParticipants);\n};\n\nconst getOverflowGalleryRemoteParticipants = (args: {\n isScreenShareActive: boolean;\n gridParticipants: VideoGalleryParticipant[];\n overflowGalleryParticipants: VideoGalleryParticipant[];\n maxGridParticipants: number;\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */ callingParticipants: VideoGalleryParticipant[];\n}): VideoGalleryRemoteParticipant[] => {\n if (args.isScreenShareActive) {\n // If screen sharing is active, assign video and audio participants as overflow gallery participants\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */\n return args.gridParticipants.concat(args.overflowGalleryParticipants.concat(args.callingParticipants));\n return args.gridParticipants.concat(args.overflowGalleryParticipants);\n } else {\n // If screen sharing is not active, then assign all video tiles as grid tiles.\n // If there are no video tiles, then assign audio tiles as grid tiles.\n // if there are more overflow tiles than max streams then find the tiles that don't fit in the grid and put them in overflow\n // overflow should be empty if total participants including calling participants is less than max streams\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */\n return args.gridParticipants.length > 0\n ? args.overflowGalleryParticipants.concat(args.callingParticipants)\n : args.overflowGalleryParticipants.length > args.maxGridParticipants\n ? args.overflowGalleryParticipants.slice(args.maxGridParticipants).concat(args.callingParticipants)\n : [];\n return args.gridParticipants.length > 0\n ? args.overflowGalleryParticipants\n : args.overflowGalleryParticipants.slice(args.maxGridParticipants);\n }\n};\n\nconst putVideoParticipantsFirst = (\n remoteParticipants: VideoGalleryRemoteParticipant[]\n): VideoGalleryRemoteParticipant[] => {\n const videoParticipants: VideoGalleryRemoteParticipant[] = [];\n const audioParticipants: VideoGalleryRemoteParticipant[] = [];\n remoteParticipants.forEach((p) => {\n if (p.videoStream?.isAvailable) {\n videoParticipants.push(p);\n } else {\n audioParticipants.push(p);\n }\n });\n const remoteParticipantSortedByVideo = videoParticipants.concat(audioParticipants);\n return remoteParticipantSortedByVideo;\n};\n\n/**\n * @private\n */\nexport const renderTiles = (\n gridParticipants: VideoGalleryParticipant[],\n onRenderRemoteParticipant: (participant: VideoGalleryRemoteParticipant, isVideoParticipant?: boolean) => JSX.Element,\n maxRemoteVideoStreams: number,\n indexesToRender: number[],\n overflowGalleryParticipants: VideoGalleryParticipant[],\n dominantSpeakers?: string[]\n): { gridTiles: JSX.Element[]; overflowGalleryTiles: JSX.Element[] } => {\n const _dominantSpeakers = dominantSpeakers ?? [];\n let streamsLeftToRender = maxRemoteVideoStreams;\n\n // Render the grid participants\n const participantWithStreamsToRenderInGrid = gridParticipants.filter((p) => p?.videoStream?.isAvailable);\n const dominantSpeakerWithStreamsToRenderInGrid = _dominantSpeakers\n .filter((userId) => participantWithStreamsToRenderInGrid.find((p) => p?.userId === userId))\n .slice(0, streamsLeftToRender);\n streamsLeftToRender = streamsLeftToRender - dominantSpeakerWithStreamsToRenderInGrid.length;\n const gridTiles = gridParticipants.map((p) => {\n return onRenderRemoteParticipant(\n p,\n dominantSpeakerWithStreamsToRenderInGrid.includes(p.userId) ||\n (p.videoStream?.isAvailable && streamsLeftToRender-- > 0)\n );\n });\n\n // Render the overflow participants\n const participantWithStreamsToRenderInOverflow = indexesToRender\n .map((i) => {\n return overflowGalleryParticipants.at(i);\n })\n .filter((p) => p?.videoStream?.isAvailable);\n const dominantSpeakerWithStreamsToRenderInOverflow = _dominantSpeakers\n .filter((userId) => participantWithStreamsToRenderInOverflow.find((p) => p?.userId === userId))\n .slice(0, streamsLeftToRender);\n streamsLeftToRender = streamsLeftToRender - dominantSpeakerWithStreamsToRenderInOverflow.length;\n const overflowGalleryTiles = overflowGalleryParticipants.map((p) => {\n return onRenderRemoteParticipant(\n p,\n dominantSpeakerWithStreamsToRenderInOverflow.includes(p.userId) ||\n (p.videoStream?.isAvailable && streamsLeftToRender-- > 0)\n );\n });\n\n return { gridTiles, overflowGalleryTiles };\n};\n\n/**\n * @private\n */\nexport const getEmojiResource = (reactionName: string, reactionResources: ReactionResources): string | undefined => {\n switch (reactionName) {\n case 'like':\n return reactionResources.likeReaction?.url;\n case 'heart':\n return reactionResources.heartReaction?.url;\n case 'laugh':\n return reactionResources.laughReaction?.url;\n case 'applause':\n return reactionResources.applauseReaction?.url;\n case 'surprised':\n return reactionResources.surprisedReaction?.url;\n }\n return undefined;\n};\n\n/**\n * @private\n */\nexport const getEmojiFrameCount = (reactionName: string, reactionResources: ReactionResources): number => {\n switch (reactionName) {\n case 'like':\n return reactionResources.likeReaction?.frameCount ?? 0;\n case 'heart':\n return reactionResources.heartReaction?.frameCount ?? 0;\n case 'laugh':\n return reactionResources.laughReaction?.frameCount ?? 0;\n case 'applause':\n return reactionResources.applauseReaction?.frameCount ?? 0;\n case 'surprised':\n return reactionResources.surprisedReaction?.frameCount ?? 0;\n default:\n return 0;\n }\n};\n"]}
|
1
|
+
{"version":3,"file":"videoGalleryLayoutUtils.js","sourceRoot":"","sources":["../../../../../../../../react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAC;AAgCpE,MAAM,8CAA8C,GAAG,CAAC,CAAC;AACzD,MAAM,wBAAwB,GAAG,CAAC,CAAC;AACnC;;GAEG;AACH,MAAM,CAAC,MAAM,uCAAuC,GAAG,CAAC,CAAC;AAEzD,MAAM,wBAAwB,GAAG,CAAC,KAAgC,EAA+B,EAAE;IACjG,MAAM,EACJ,kBAAkB,GAAG,EAAE,EACvB,gBAAgB,GAAG,EAAE,EACrB,mBAAmB,GAAG,wBAAwB,EAC9C,kCAAkC,GAAG,8CAA8C,EACnF,MAAM,EACN,wBAAwB,GAAG,EAAE,EAC7B,4BAA4B,GAAG,EAAE,EAClC,GAAG,KAAK,CAAC;IAEV,6CAA6C,CAAC,mDAAmD;IACjG,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,YAAY,IAAI,SAAS,CAAC,CAAC,CAAC;IACtG,6CAA6C,CAAC,mDAAmD;IACjG,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjF,IAAI,qBAAqB,GAAG,kBAAkB,CAAC;IAC/C,6CAA6C,CAAC,mDAAmD;IACjG,qBAAqB,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAEnG,MAAM,yBAAyB,GAAG,yBAAyB,CAAC,qBAAqB,CAAC,CAAC;IACnF,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,CAAC,WAAW,0CAAE,WAAW,CAAA,EAAA,CAAC,CAAC;IACvF,MAAM,mBAAmB,GACvB,MAAM,KAAK,oBAAoB,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,yBAAyB,CAAC;IAElH,IAAI,mBAAmB,GAAG,gCAAgC,CAAC;QACzD,YAAY,EAAE,mBAAmB;QACjC,gBAAgB;QAChB,mBAAmB,EAAE,wBAAwB;QAC7C,mBAAmB,EAAE,mBAAmB;KACzC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAEjC,MAAM,qBAAqB,GACzB,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,CAAC,CAAC;YACvC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,mBAAmB,GAAG,qBAAqB,CAAC;IAC9C,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7E,MAAM,8BAA8B,GAAG,gCAAgC,CAAC;QACtE,YAAY,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxF,gBAAgB,EAAE,gBAAgB;QAClC,mBAAmB,EAAE,4BAA4B;QACjD,mBAAmB,EAAE,kCAAkC;KACxD,CAAC,CAAC;IAEH,IAAI,gBAAgB,GAAG,mBAAmB,CAAC;IAC3C,IAAI,2BAA2B,GAAG,8BAA8B,CAAC;IACjE,6CAA6C,CAAC,mDAAmD;IACjG,IAAI,gBAAgB,CAAC,MAAM,GAAG,mBAAmB,CAAC,MAAM,IAAI,mBAAmB,EAAE,CAAC;QAChF,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,2BAA2B,GAAG,2BAA2B,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,CAAC;AAC3D,CAAC,CAAC;AAMF;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAgC,EAA+B,EAAE;;IACxG,oCAAoC;IACpC,MAAM,oBAAoB,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,iBAAiB,EAAE,EAAE;QACtF,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAAC;QAClD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAA8B,CAAC,CAAC;IAEnC,MAAM,6BAA6B,GAAG,MAAA,KAAK,CAAC,6BAA6B,mCAAI,EAAE,CAAC;IAChF,MAAM,wBAAwB,GAAG,MAAA,KAAK,CAAC,wBAAwB,mCAAI,EAAE,CAAC;IACtE,+FAA+F;IAC/F,6EAA6E;IAC7E,MAAM,2BAA2B,GAAG,IAAI,GAAG,CACzC,6BAA6B,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CACtG,CAAC;IACF,wFAAwF;IACxF,MAAM,mBAAmB,GAAoC,CAAC,GAAG,2BAA2B,CAAC,CAAC,GAAG,CAC/F,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAC/B,CAAC;IAEF,MAAM,uBAAuB,GAAG,MAAM,CAAkC,EAAE,CAAC,CAAC;IAC5E,MAAM,kCAAkC,GAAG,MAAM,CAAkC,EAAE,CAAC,CAAC;IAEvF,MAAM,qBAAqB,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjH,MAAM,yBAAyB,mCAC1B,KAAK;QACR,uGAAuG;QACvG,mBAAmB,EAAE,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,mBAAmB,EAChH,kBAAkB,EAAE,qBAAqB,EACzC,wBAAwB,EAAE,uBAAuB,CAAC,OAAO,EACzD,4BAA4B,EAAE,kCAAkC,CAAC,OAAO,GACzE,CAAC;IAEF,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,yBAAyB,CAAC,CAAC;IAElF,uBAAuB,CAAC,OAAO,GAAG,qBAAqB,CAAC,gBAAgB,CAAC;IACzE,kCAAkC,CAAC,OAAO,GAAG,qBAAqB,CAAC,2BAA2B,CAAC;IAE/F,OAAO,mBAAmB,CAAC,MAAM,GAAG,CAAC;QACnC,CAAC,CAAC;YACE,gBAAgB,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB;YACtE,2BAA2B,EAAE,KAAK,CAAC,mBAAmB;gBACpD,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,qBAAqB,CAAC,2BAA2B,CAAC;gBAC/E,CAAC,CAAC,qBAAqB,CAAC,2BAA2B;SACtD;QACH,CAAC,CAAC,qBAAqB,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAChC,kBAAmD,EAClB,EAAE;IACnC,MAAM,iBAAiB,GAAoC,EAAE,CAAC;IAC9D,MAAM,iBAAiB,GAAoC,EAAE,CAAC;IAC9D,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;;QAC/B,IAAI,MAAA,CAAC,CAAC,WAAW,0CAAE,WAAW,EAAE,CAAC;YAC/B,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,8BAA8B,GAAG,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACnF,OAAO,8BAA8B,CAAC;AACxC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,gBAA2C,EAC3C,yBAAoH,EACpH,qBAA6B,EAC7B,eAAyB,EACzB,2BAAsD,EACtD,gBAA2B,EACwC,EAAE;IACrE,MAAM,iBAAiB,GAAG,gBAAgB,aAAhB,gBAAgB,cAAhB,gBAAgB,GAAI,EAAE,CAAC;IACjD,IAAI,mBAAmB,GAAG,qBAAqB,CAAC;IAEhD,+BAA+B;IAC/B,MAAM,oCAAoC,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,WAAW,0CAAE,WAAW,CAAA,EAAA,CAAC,CAAC;IACzG,MAAM,wCAAwC,GAAG,iBAAiB;SAC/D,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,oCAAoC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,MAAM,MAAK,MAAM,CAAC,CAAC;SAC1F,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IACjC,mBAAmB,GAAG,mBAAmB,GAAG,wCAAwC,CAAC,MAAM,CAAC;IAC5F,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;;QAC3C,OAAO,yBAAyB,CAC9B,CAAC,EACD,wCAAwC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YACzD,CAAC,CAAA,MAAA,CAAC,CAAC,WAAW,0CAAE,WAAW,KAAI,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAC5D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,mCAAmC;IACnC,MAAM,wCAAwC,GAAG,eAAe;SAC7D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,OAAO,2BAA2B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,WAAW,0CAAE,WAAW,CAAA,EAAA,CAAC,CAAC;IAC9C,MAAM,4CAA4C,GAAG,iBAAiB;SACnE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,wCAAwC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,MAAM,MAAK,MAAM,CAAC,CAAC;SAC9F,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IACjC,mBAAmB,GAAG,mBAAmB,GAAG,4CAA4C,CAAC,MAAM,CAAC;IAChG,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;;QACjE,OAAO,yBAAyB,CAC9B,CAAC,EACD,4CAA4C,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7D,CAAC,CAAA,MAAA,CAAC,CAAC,WAAW,0CAAE,WAAW,KAAI,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAC5D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;AAC7C,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,YAAoB,EAAE,iBAAoC,EAAsB,EAAE;;IACjH,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,MAAA,iBAAiB,CAAC,YAAY,0CAAE,GAAG,CAAC;QAC7C,KAAK,OAAO;YACV,OAAO,MAAA,iBAAiB,CAAC,aAAa,0CAAE,GAAG,CAAC;QAC9C,KAAK,OAAO;YACV,OAAO,MAAA,iBAAiB,CAAC,aAAa,0CAAE,GAAG,CAAC;QAC9C,KAAK,UAAU;YACb,OAAO,MAAA,iBAAiB,CAAC,gBAAgB,0CAAE,GAAG,CAAC;QACjD,KAAK,WAAW;YACd,OAAO,MAAA,iBAAiB,CAAC,iBAAiB,0CAAE,GAAG,CAAC;IACpD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,YAAoB,EAAE,iBAAoC,EAAU,EAAE;;IACvG,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,MAAA,MAAA,iBAAiB,CAAC,YAAY,0CAAE,UAAU,mCAAI,CAAC,CAAC;QACzD,KAAK,OAAO;YACV,OAAO,MAAA,MAAA,iBAAiB,CAAC,aAAa,0CAAE,UAAU,mCAAI,CAAC,CAAC;QAC1D,KAAK,OAAO;YACV,OAAO,MAAA,MAAA,iBAAiB,CAAC,aAAa,0CAAE,UAAU,mCAAI,CAAC,CAAC;QAC1D,KAAK,UAAU;YACb,OAAO,MAAA,MAAA,iBAAiB,CAAC,gBAAgB,0CAAE,UAAU,mCAAI,CAAC,CAAC;QAC7D,KAAK,WAAW;YACd,OAAO,MAAA,MAAA,iBAAiB,CAAC,iBAAiB,0CAAE,UAAU,mCAAI,CAAC,CAAC;QAC9D;YACE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { useRef } from 'react';\nimport { smartDominantSpeakerParticipants } from '../../../gallery';\nimport { VideoGalleryParticipant, VideoGalleryRemoteParticipant } from '../../../types';\nimport { ReactionResources } from '../../..';\nimport { VideoGalleryLayout } from '../../VideoGallery';\n\n/**\n * Arguments used to determine a {@link OrganizedParticipantsResult}\n * @private\n */\nexport interface OrganizedParticipantsArgs {\n remoteParticipants: VideoGalleryRemoteParticipant[];\n localParticipant?: VideoGalleryParticipant;\n dominantSpeakers?: string[];\n maxGridParticipants?: number;\n maxOverflowGalleryDominantSpeakers?: number;\n isScreenShareActive?: boolean;\n pinnedParticipantUserIds?: string[];\n layout?: VideoGalleryLayout;\n spotlightedParticipantUserIds?: string[];\n previousGridParticipants?: VideoGalleryRemoteParticipant[];\n previousOverflowParticipants?: VideoGalleryRemoteParticipant[];\n}\n\n/**\n * A result that defines grid participants and overflow gallery participants in the VideoGallery\n * @private\n */\nexport interface OrganizedParticipantsResult {\n gridParticipants: VideoGalleryParticipant[];\n overflowGalleryParticipants: VideoGalleryParticipant[];\n}\n\nconst DEFAULT_MAX_OVERFLOW_GALLERY_DOMINANT_SPEAKERS = 6;\nconst DEFAULT_MAX_VIDEO_SREAMS = 4;\n/**\n * @private\n */\nexport const MAX_GRID_PARTICIPANTS_NOT_LARGE_GALLERY = 9;\n\nconst getOrganizedParticipants = (props: OrganizedParticipantsArgs): OrganizedParticipantsResult => {\n const {\n remoteParticipants = [],\n dominantSpeakers = [],\n maxGridParticipants = DEFAULT_MAX_VIDEO_SREAMS,\n maxOverflowGalleryDominantSpeakers = DEFAULT_MAX_OVERFLOW_GALLERY_DOMINANT_SPEAKERS,\n layout,\n previousGridParticipants = [],\n previousOverflowParticipants = []\n } = props;\n\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */\n const callingParticipants = remoteParticipants.filter((p) => p.state === ('Connecting' || 'Ringing'));\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */\n const callingParticipantsSet = new Set(callingParticipants.map((p) => p.userId));\n\n let connectedParticipants = remoteParticipants;\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */\n connectedParticipants = connectedParticipants.filter((p) => !callingParticipantsSet.has(p.userId));\n\n const remoteParticipantsOrdered = putVideoParticipantsFirst(connectedParticipants);\n const videoParticipants = remoteParticipants.filter((p) => p.videoStream?.isAvailable);\n const participantsForGrid =\n layout === 'floatingLocalVideo' && videoParticipants.length > 0 ? videoParticipants : remoteParticipantsOrdered;\n\n let newGridParticipants = smartDominantSpeakerParticipants({\n participants: participantsForGrid,\n dominantSpeakers,\n currentParticipants: previousGridParticipants,\n maxDominantSpeakers: maxGridParticipants\n }).slice(0, maxGridParticipants);\n\n const dominantSpeakerToGrid =\n layout === 'speaker'\n ? dominantSpeakers && dominantSpeakers[0]\n ? newGridParticipants.filter((p) => p.userId === dominantSpeakers[0])\n : [newGridParticipants[0]]\n : [];\n\n if (dominantSpeakerToGrid[0]) {\n newGridParticipants = dominantSpeakerToGrid;\n }\n\n const gridParticipantSet = new Set(newGridParticipants.map((p) => p.userId));\n\n const newOverflowGalleryParticipants = smartDominantSpeakerParticipants({\n participants: remoteParticipantsOrdered.filter((p) => !gridParticipantSet.has(p.userId)),\n dominantSpeakers: dominantSpeakers,\n currentParticipants: previousOverflowParticipants,\n maxDominantSpeakers: maxOverflowGalleryDominantSpeakers\n });\n\n let gridParticipants = newGridParticipants;\n let overflowGalleryParticipants = newOverflowGalleryParticipants;\n /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */\n if (gridParticipants.length + callingParticipants.length <= maxGridParticipants) {\n gridParticipants = gridParticipants.concat(callingParticipants);\n } else {\n overflowGalleryParticipants = overflowGalleryParticipants.concat(callingParticipants);\n }\n\n return { gridParticipants, overflowGalleryParticipants };\n};\n\ninterface SortedRemoteParticipants {\n [key: string]: VideoGalleryRemoteParticipant;\n}\n\n/**\n * Hook to determine which participants should be in grid and overflow gallery and their order respectively\n * @private\n */\nexport const useOrganizedParticipants = (props: OrganizedParticipantsArgs): OrganizedParticipantsResult => {\n // map remote participants by userId\n const remoteParticipantMap = props.remoteParticipants.reduce((map, remoteParticipant) => {\n map[remoteParticipant.userId] = remoteParticipant;\n return map;\n }, {} as SortedRemoteParticipants);\n\n const spotlightedParticipantUserIds = props.spotlightedParticipantUserIds ?? [];\n const pinnedParticipantUserIds = props.pinnedParticipantUserIds ?? [];\n // declare set of focused participant user ids as spotlighted participants user ids followed by\n // pinned participants user ids which is deduplicated while maintaining order\n const focusedParticipantUserIdSet = new Set(\n spotlightedParticipantUserIds.concat(pinnedParticipantUserIds).filter((p) => remoteParticipantMap[p])\n );\n // get focused participants from map of remote participants in the order of the user ids\n const focusedParticipants: VideoGalleryRemoteParticipant[] = [...focusedParticipantUserIdSet].map(\n (p) => remoteParticipantMap[p]\n );\n\n const currentGridParticipants = useRef<VideoGalleryRemoteParticipant[]>([]);\n const currentOverflowGalleryParticipants = useRef<VideoGalleryRemoteParticipant[]>([]);\n\n const unfocusedParticipants = props.remoteParticipants.filter((p) => !focusedParticipantUserIdSet.has(p.userId));\n\n const organizedParticipantsArgs: OrganizedParticipantsArgs = {\n ...props,\n // if there are focused participants then leave no room in the grid by setting maxGridParticipants to 0\n maxGridParticipants: focusedParticipants.length > 0 || props.isScreenShareActive ? 0 : props.maxGridParticipants,\n remoteParticipants: unfocusedParticipants,\n previousGridParticipants: currentGridParticipants.current,\n previousOverflowParticipants: currentOverflowGalleryParticipants.current\n };\n\n const organizedParticipants = getOrganizedParticipants(organizedParticipantsArgs);\n\n currentGridParticipants.current = organizedParticipants.gridParticipants;\n currentOverflowGalleryParticipants.current = organizedParticipants.overflowGalleryParticipants;\n\n return focusedParticipants.length > 0\n ? {\n gridParticipants: props.isScreenShareActive ? [] : focusedParticipants,\n overflowGalleryParticipants: props.isScreenShareActive\n ? focusedParticipants.concat(organizedParticipants.overflowGalleryParticipants)\n : organizedParticipants.overflowGalleryParticipants\n }\n : organizedParticipants;\n};\n\nconst putVideoParticipantsFirst = (\n remoteParticipants: VideoGalleryRemoteParticipant[]\n): VideoGalleryRemoteParticipant[] => {\n const videoParticipants: VideoGalleryRemoteParticipant[] = [];\n const audioParticipants: VideoGalleryRemoteParticipant[] = [];\n remoteParticipants.forEach((p) => {\n if (p.videoStream?.isAvailable) {\n videoParticipants.push(p);\n } else {\n audioParticipants.push(p);\n }\n });\n const remoteParticipantSortedByVideo = videoParticipants.concat(audioParticipants);\n return remoteParticipantSortedByVideo;\n};\n\n/**\n * @private\n */\nexport const renderTiles = (\n gridParticipants: VideoGalleryParticipant[],\n onRenderRemoteParticipant: (participant: VideoGalleryRemoteParticipant, isVideoParticipant?: boolean) => JSX.Element,\n maxRemoteVideoStreams: number,\n indexesToRender: number[],\n overflowGalleryParticipants: VideoGalleryParticipant[],\n dominantSpeakers?: string[]\n): { gridTiles: JSX.Element[]; overflowGalleryTiles: JSX.Element[] } => {\n const _dominantSpeakers = dominantSpeakers ?? [];\n let streamsLeftToRender = maxRemoteVideoStreams;\n\n // Render the grid participants\n const participantWithStreamsToRenderInGrid = gridParticipants.filter((p) => p?.videoStream?.isAvailable);\n const dominantSpeakerWithStreamsToRenderInGrid = _dominantSpeakers\n .filter((userId) => participantWithStreamsToRenderInGrid.find((p) => p?.userId === userId))\n .slice(0, streamsLeftToRender);\n streamsLeftToRender = streamsLeftToRender - dominantSpeakerWithStreamsToRenderInGrid.length;\n const gridTiles = gridParticipants.map((p) => {\n return onRenderRemoteParticipant(\n p,\n dominantSpeakerWithStreamsToRenderInGrid.includes(p.userId) ||\n (p.videoStream?.isAvailable && streamsLeftToRender-- > 0)\n );\n });\n\n // Render the overflow participants\n const participantWithStreamsToRenderInOverflow = indexesToRender\n .map((i) => {\n return overflowGalleryParticipants.at(i);\n })\n .filter((p) => p?.videoStream?.isAvailable);\n const dominantSpeakerWithStreamsToRenderInOverflow = _dominantSpeakers\n .filter((userId) => participantWithStreamsToRenderInOverflow.find((p) => p?.userId === userId))\n .slice(0, streamsLeftToRender);\n streamsLeftToRender = streamsLeftToRender - dominantSpeakerWithStreamsToRenderInOverflow.length;\n const overflowGalleryTiles = overflowGalleryParticipants.map((p) => {\n return onRenderRemoteParticipant(\n p,\n dominantSpeakerWithStreamsToRenderInOverflow.includes(p.userId) ||\n (p.videoStream?.isAvailable && streamsLeftToRender-- > 0)\n );\n });\n\n return { gridTiles, overflowGalleryTiles };\n};\n\n/**\n * @private\n */\nexport const getEmojiResource = (reactionName: string, reactionResources: ReactionResources): string | undefined => {\n switch (reactionName) {\n case 'like':\n return reactionResources.likeReaction?.url;\n case 'heart':\n return reactionResources.heartReaction?.url;\n case 'laugh':\n return reactionResources.laughReaction?.url;\n case 'applause':\n return reactionResources.applauseReaction?.url;\n case 'surprised':\n return reactionResources.surprisedReaction?.url;\n }\n return undefined;\n};\n\n/**\n * @private\n */\nexport const getEmojiFrameCount = (reactionName: string, reactionResources: ReactionResources): number => {\n switch (reactionName) {\n case 'like':\n return reactionResources.likeReaction?.frameCount ?? 0;\n case 'heart':\n return reactionResources.heartReaction?.frameCount ?? 0;\n case 'laugh':\n return reactionResources.laughReaction?.frameCount ?? 0;\n case 'applause':\n return reactionResources.applauseReaction?.frameCount ?? 0;\n case 'surprised':\n return reactionResources.surprisedReaction?.frameCount ?? 0;\n default:\n return 0;\n }\n};\n"]}
|
@@ -99,14 +99,15 @@
|
|
99
99
|
"cameraMenuTitle": "الكاميرا",
|
100
100
|
"cameraMenuTooltip": "اختيار الكاميرا",
|
101
101
|
"cameraButtonSplitRoleDescription": "زر الانقسام",
|
102
|
-
"onSplitButtonAriaLabel": "
|
103
|
-
"offSplitButtonAriaLabel": "
|
102
|
+
"onSplitButtonAriaLabel": "إيقاف تشغيل الكاميرا",
|
103
|
+
"offSplitButtonAriaLabel": "تشغيل الكاميرا",
|
104
104
|
"cameraActionTurnedOnAnnouncement": "تم تشغيل كاميراتك",
|
105
105
|
"cameraActionTurnedOffAnnouncement": "تم إيقاف تشغيل كاميراتك",
|
106
106
|
"onSplitButtonPrimaryActionCamera": "إيقاف تشغيل الكاميرا",
|
107
107
|
"offSplitButtonPrimaryActionCamera": "تشغيل الكاميرا",
|
108
108
|
"cameraPrimaryActionSplitButtonTitle": "استخدام الكاميرا",
|
109
|
-
"videoEffectsMenuItemTitle": "التأثيرات"
|
109
|
+
"videoEffectsMenuItemTitle": "التأثيرات",
|
110
|
+
"cameraButtonAriaDescription": "خيارات الكاميرا"
|
110
111
|
},
|
111
112
|
"microphoneButton": {
|
112
113
|
"onLabel": "الميكروفون",
|
@@ -119,13 +120,17 @@
|
|
119
120
|
"speakerMenuTitle": "مكبر الصوت",
|
120
121
|
"speakerMenuTooltip": "اختيار مكبر صوت",
|
121
122
|
"microphoneButtonSplitRoleDescription": "زر الانقسام",
|
122
|
-
"onSplitButtonAriaLabel": "كتم
|
123
|
-
"offSplitButtonAriaLabel": "إلغاء كتم
|
123
|
+
"onSplitButtonAriaLabel": "كتم الميكروفون",
|
124
|
+
"offSplitButtonAriaLabel": "إلغاء كتم الميكروفون",
|
124
125
|
"microphoneActionTurnedOnAnnouncement": "تم تشغيل الميكروفون",
|
125
126
|
"microphoneActionTurnedOffAnnouncement": "تم إيقاف الميكروفون",
|
126
|
-
"offSplitButtonMicrophonePrimaryAction": "إلغاء كتم
|
127
|
-
"onSplitButtonMicrophonePrimaryAction": "كتم
|
128
|
-
"microphonePrimaryActionSplitButtonTitle": "استخدام الميكروفون"
|
127
|
+
"offSplitButtonMicrophonePrimaryAction": "إلغاء كتم الميكروفون",
|
128
|
+
"onSplitButtonMicrophonePrimaryAction": "كتم الميكروفون",
|
129
|
+
"microphonePrimaryActionSplitButtonTitle": "استخدام الميكروفون",
|
130
|
+
"microphoneAriaDescription": "خيارات الصوت",
|
131
|
+
"deepNoiseSuppressionTitle": "منع الضوضاء",
|
132
|
+
"deepNoiseSuppressionOnAnnouncement": "تم تشغيل منع الضوضاء العميقة",
|
133
|
+
"deepNoiseSuppressionOffAnnouncement": "تم إيقاف تشغيل منع الضوضاء العميقة"
|
129
134
|
},
|
130
135
|
"devicesButton": {
|
131
136
|
"label": "الأجهزة",
|
@@ -504,7 +509,8 @@
|
|
504
509
|
"stopSpotlightVideoTileMenuLabel": "التوقف عن تسليط الضوء",
|
505
510
|
"stopSpotlightOnSelfVideoTileMenuLabel": "الخروج من وضع تسليط الضوء",
|
506
511
|
"attendeeRole": "الحضور",
|
507
|
-
"muteParticipantMenuItemLabel": "كتم الصوت"
|
512
|
+
"muteParticipantMenuItemLabel": "كتم الصوت",
|
513
|
+
"waitingScreenText": "في انتظار انضمام الآخرين"
|
508
514
|
},
|
509
515
|
"dialpad": {
|
510
516
|
"placeholderText": "أدخل رقم الهاتف",
|
@@ -658,6 +664,7 @@
|
|
658
664
|
"incomingCallNoticicationRejectAriaLabel": "رفض",
|
659
665
|
"incomingCallNotificationAcceptButtonLabel": "قبول",
|
660
666
|
"incomingCallNotificationRejectButtonLabel": "رفض",
|
661
|
-
"incomingCallNotificationAccceptWithVideoButtonLabel": "قبول مع الفيديو"
|
667
|
+
"incomingCallNotificationAccceptWithVideoButtonLabel": "قبول مع الفيديو",
|
668
|
+
"incomingCallNotificationDismissButtonAriaLabel": "تجاهل"
|
662
669
|
}
|
663
670
|
}
|
@@ -99,14 +99,15 @@
|
|
99
99
|
"cameraMenuTitle": "Kamera",
|
100
100
|
"cameraMenuTooltip": "Zvolit kameru",
|
101
101
|
"cameraButtonSplitRoleDescription": "Tlačítko rozdělení",
|
102
|
-
"onSplitButtonAriaLabel": "Vypnout kameru
|
103
|
-
"offSplitButtonAriaLabel": "Zapnout kameru
|
102
|
+
"onSplitButtonAriaLabel": "Vypnout kameru",
|
103
|
+
"offSplitButtonAriaLabel": "Zapnout kameru",
|
104
104
|
"cameraActionTurnedOnAnnouncement": "Vaše kamera je zapnutá",
|
105
105
|
"cameraActionTurnedOffAnnouncement": "Vaše kamera je vypnutá",
|
106
106
|
"onSplitButtonPrimaryActionCamera": "Vypnout kameru",
|
107
107
|
"offSplitButtonPrimaryActionCamera": "Zapnout kameru",
|
108
108
|
"cameraPrimaryActionSplitButtonTitle": "Použít kameru",
|
109
|
-
"videoEffectsMenuItemTitle": "Efekty"
|
109
|
+
"videoEffectsMenuItemTitle": "Efekty",
|
110
|
+
"cameraButtonAriaDescription": "možnosti kamery"
|
110
111
|
},
|
111
112
|
"microphoneButton": {
|
112
113
|
"onLabel": "Mikrofon",
|
@@ -119,13 +120,17 @@
|
|
119
120
|
"speakerMenuTitle": "Reproduktor",
|
120
121
|
"speakerMenuTooltip": "Zvolit reproduktor",
|
121
122
|
"microphoneButtonSplitRoleDescription": "Tlačítko rozdělení",
|
122
|
-
"onSplitButtonAriaLabel": "Ztlumit mikrofon
|
123
|
-
"offSplitButtonAriaLabel": "Zrušit ztlumení mikrofonu
|
123
|
+
"onSplitButtonAriaLabel": "Ztlumit mikrofon",
|
124
|
+
"offSplitButtonAriaLabel": "Zrušit ztlumení mikrofonu",
|
124
125
|
"microphoneActionTurnedOnAnnouncement": "Váš mikrofon je zapnutý",
|
125
126
|
"microphoneActionTurnedOffAnnouncement": "Váš mikrofon je vypnutý",
|
126
127
|
"offSplitButtonMicrophonePrimaryAction": "Zrušit ztlumení mikrofonu",
|
127
128
|
"onSplitButtonMicrophonePrimaryAction": "Ztlumit mikrofon",
|
128
|
-
"microphonePrimaryActionSplitButtonTitle": "Použít mikrofon"
|
129
|
+
"microphonePrimaryActionSplitButtonTitle": "Použít mikrofon",
|
130
|
+
"microphoneAriaDescription": "Možnosti zvuku",
|
131
|
+
"deepNoiseSuppressionTitle": "Potlačení šumu",
|
132
|
+
"deepNoiseSuppressionOnAnnouncement": "Potlačení hlubokého šumu je zapnuté",
|
133
|
+
"deepNoiseSuppressionOffAnnouncement": "Potlačení hlubokého šumu je vypnuté"
|
129
134
|
},
|
130
135
|
"devicesButton": {
|
131
136
|
"label": "Zařízení",
|
@@ -504,7 +509,8 @@
|
|
504
509
|
"stopSpotlightVideoTileMenuLabel": "Zastavit přidávání do hlavního výběru",
|
505
510
|
"stopSpotlightOnSelfVideoTileMenuLabel": "Ukončit hlavní výběr",
|
506
511
|
"attendeeRole": "Účastník",
|
507
|
-
"muteParticipantMenuItemLabel": "Ztlumit"
|
512
|
+
"muteParticipantMenuItemLabel": "Ztlumit",
|
513
|
+
"waitingScreenText": "Čeká se na připojení ostatních"
|
508
514
|
},
|
509
515
|
"dialpad": {
|
510
516
|
"placeholderText": "Zadejte telefonní číslo",
|
@@ -658,6 +664,7 @@
|
|
658
664
|
"incomingCallNoticicationRejectAriaLabel": "Odmítnout",
|
659
665
|
"incomingCallNotificationAcceptButtonLabel": "Přijmout",
|
660
666
|
"incomingCallNotificationRejectButtonLabel": "Odmítnout",
|
661
|
-
"incomingCallNotificationAccceptWithVideoButtonLabel": "Přijmout s videem"
|
667
|
+
"incomingCallNotificationAccceptWithVideoButtonLabel": "Přijmout s videem",
|
668
|
+
"incomingCallNotificationDismissButtonAriaLabel": "Zavřít"
|
662
669
|
}
|
663
670
|
}
|
@@ -99,14 +99,15 @@
|
|
99
99
|
"cameraMenuTitle": "Kamera",
|
100
100
|
"cameraMenuTooltip": "Kamera auswählen",
|
101
101
|
"cameraButtonSplitRoleDescription": "Unterteilte Schaltfläche",
|
102
|
-
"onSplitButtonAriaLabel": "Kamera
|
103
|
-
"offSplitButtonAriaLabel": "Kamera
|
102
|
+
"onSplitButtonAriaLabel": "Kamera ausschalten",
|
103
|
+
"offSplitButtonAriaLabel": "Kamera einschalten",
|
104
104
|
"cameraActionTurnedOnAnnouncement": "Ihre Kamera wurde eingeschaltet.",
|
105
105
|
"cameraActionTurnedOffAnnouncement": "Ihre Kamera wurde ausgeschaltet.",
|
106
106
|
"onSplitButtonPrimaryActionCamera": "Kamera ausschalten",
|
107
107
|
"offSplitButtonPrimaryActionCamera": "Kamera einschalten",
|
108
108
|
"cameraPrimaryActionSplitButtonTitle": "Kamera verwenden",
|
109
|
-
"videoEffectsMenuItemTitle": "Effekte"
|
109
|
+
"videoEffectsMenuItemTitle": "Effekte",
|
110
|
+
"cameraButtonAriaDescription": "Kameraoptionen"
|
110
111
|
},
|
111
112
|
"microphoneButton": {
|
112
113
|
"onLabel": "Mikrofon",
|
@@ -119,13 +120,17 @@
|
|
119
120
|
"speakerMenuTitle": "Lautsprecher",
|
120
121
|
"speakerMenuTooltip": "Lautsprecher auswählen",
|
121
122
|
"microphoneButtonSplitRoleDescription": "Unterteilte Schaltfläche",
|
122
|
-
"onSplitButtonAriaLabel": "Mikrofon
|
123
|
-
"offSplitButtonAriaLabel": "Stummschaltung
|
123
|
+
"onSplitButtonAriaLabel": "Mikrofon stummschalten",
|
124
|
+
"offSplitButtonAriaLabel": "Stummschaltung des Mikrofons aufheben",
|
124
125
|
"microphoneActionTurnedOnAnnouncement": "Ihr Mikrofon wurde eingeschaltet.",
|
125
126
|
"microphoneActionTurnedOffAnnouncement": "Ihr Mikrofon wurde ausgeschaltet.",
|
126
|
-
"offSplitButtonMicrophonePrimaryAction": "
|
127
|
+
"offSplitButtonMicrophonePrimaryAction": "Stummschaltung des Mikrofons aufheben",
|
127
128
|
"onSplitButtonMicrophonePrimaryAction": "Mikrofon stummschalten",
|
128
|
-
"microphonePrimaryActionSplitButtonTitle": "Mikrofon verwenden"
|
129
|
+
"microphonePrimaryActionSplitButtonTitle": "Mikrofon verwenden",
|
130
|
+
"microphoneAriaDescription": "Audiooptionen",
|
131
|
+
"deepNoiseSuppressionTitle": "Rauschunterdrückung",
|
132
|
+
"deepNoiseSuppressionOnAnnouncement": "Die Unterdrückung tiefer Geräusche wurde aktiviert.",
|
133
|
+
"deepNoiseSuppressionOffAnnouncement": "Die Unterdrückung tiefer Geräusche wurde deaktiviert."
|
129
134
|
},
|
130
135
|
"devicesButton": {
|
131
136
|
"label": "Geräte",
|
@@ -504,7 +509,8 @@
|
|
504
509
|
"stopSpotlightVideoTileMenuLabel": "Spotlight beenden",
|
505
510
|
"stopSpotlightOnSelfVideoTileMenuLabel": "Spotlight beenden",
|
506
511
|
"attendeeRole": "Teilnehmer",
|
507
|
-
"muteParticipantMenuItemLabel": "Stummschalten"
|
512
|
+
"muteParticipantMenuItemLabel": "Stummschalten",
|
513
|
+
"waitingScreenText": "Warten auf andere Teilnehmer"
|
508
514
|
},
|
509
515
|
"dialpad": {
|
510
516
|
"placeholderText": "Telefonnummer eingeben",
|
@@ -658,6 +664,7 @@
|
|
658
664
|
"incomingCallNoticicationRejectAriaLabel": "Ablehnen",
|
659
665
|
"incomingCallNotificationAcceptButtonLabel": "Akzeptieren",
|
660
666
|
"incomingCallNotificationRejectButtonLabel": "Ablehnen",
|
661
|
-
"incomingCallNotificationAccceptWithVideoButtonLabel": "Mit Video annehmen"
|
667
|
+
"incomingCallNotificationAccceptWithVideoButtonLabel": "Mit Video annehmen",
|
668
|
+
"incomingCallNotificationDismissButtonAriaLabel": "Verwerfen"
|
662
669
|
}
|
663
670
|
}
|
@@ -99,14 +99,15 @@
|
|
99
99
|
"cameraMenuTitle": "Camera",
|
100
100
|
"cameraMenuTooltip": "Choose camera",
|
101
101
|
"cameraButtonSplitRoleDescription": "Split button",
|
102
|
-
"onSplitButtonAriaLabel": "Turn off camera
|
103
|
-
"offSplitButtonAriaLabel": "Turn on camera
|
102
|
+
"onSplitButtonAriaLabel": "Turn off camera",
|
103
|
+
"offSplitButtonAriaLabel": "Turn on camera",
|
104
104
|
"cameraActionTurnedOnAnnouncement": "Your camera has been turned on",
|
105
105
|
"cameraActionTurnedOffAnnouncement": "Your camera has been turned off",
|
106
106
|
"onSplitButtonPrimaryActionCamera": "Turn off camera",
|
107
107
|
"offSplitButtonPrimaryActionCamera": "Turn on camera",
|
108
108
|
"cameraPrimaryActionSplitButtonTitle": "Use camera",
|
109
|
-
"videoEffectsMenuItemTitle": "Effects"
|
109
|
+
"videoEffectsMenuItemTitle": "Effects",
|
110
|
+
"cameraButtonAriaDescription": "camera options"
|
110
111
|
},
|
111
112
|
"microphoneButton": {
|
112
113
|
"onLabel": "Mic",
|
@@ -119,13 +120,17 @@
|
|
119
120
|
"speakerMenuTitle": "Speaker",
|
120
121
|
"speakerMenuTooltip": "Choose speaker",
|
121
122
|
"microphoneButtonSplitRoleDescription": "Split button",
|
122
|
-
"onSplitButtonAriaLabel": "Mute
|
123
|
-
"offSplitButtonAriaLabel": "Unmute
|
123
|
+
"onSplitButtonAriaLabel": "Mute mic",
|
124
|
+
"offSplitButtonAriaLabel": "Unmute mic",
|
124
125
|
"microphoneActionTurnedOnAnnouncement": "Your microphone has been turned on",
|
125
126
|
"microphoneActionTurnedOffAnnouncement": "Your microphone has been turned off",
|
126
|
-
"offSplitButtonMicrophonePrimaryAction": "Unmute
|
127
|
-
"onSplitButtonMicrophonePrimaryAction": "Mute
|
128
|
-
"microphonePrimaryActionSplitButtonTitle": "Use microphone"
|
127
|
+
"offSplitButtonMicrophonePrimaryAction": "Unmute mic",
|
128
|
+
"onSplitButtonMicrophonePrimaryAction": "Mute mic",
|
129
|
+
"microphonePrimaryActionSplitButtonTitle": "Use microphone",
|
130
|
+
"microphoneAriaDescription": "Audio options",
|
131
|
+
"deepNoiseSuppressionTitle": "Noise suppression",
|
132
|
+
"deepNoiseSuppressionOnAnnouncement": "Deep noise suppression has been turned on",
|
133
|
+
"deepNoiseSuppressionOffAnnouncement": "Deep noise suppression has been turned off"
|
129
134
|
},
|
130
135
|
"devicesButton": {
|
131
136
|
"label": "Devices",
|
@@ -504,7 +509,8 @@
|
|
504
509
|
"stopSpotlightVideoTileMenuLabel": "Stop spotlighting",
|
505
510
|
"stopSpotlightOnSelfVideoTileMenuLabel": "Exit spotlight",
|
506
511
|
"attendeeRole": "Attendee",
|
507
|
-
"muteParticipantMenuItemLabel": "Mute"
|
512
|
+
"muteParticipantMenuItemLabel": "Mute",
|
513
|
+
"waitingScreenText": "Waiting for others to join"
|
508
514
|
},
|
509
515
|
"dialpad": {
|
510
516
|
"placeholderText": "Enter phone number",
|
@@ -658,6 +664,7 @@
|
|
658
664
|
"incomingCallNoticicationRejectAriaLabel": "Reject",
|
659
665
|
"incomingCallNotificationAcceptButtonLabel": "Accept",
|
660
666
|
"incomingCallNotificationRejectButtonLabel": "Decline",
|
661
|
-
"incomingCallNotificationAccceptWithVideoButtonLabel": "Accept with Video"
|
667
|
+
"incomingCallNotificationAccceptWithVideoButtonLabel": "Accept with Video",
|
668
|
+
"incomingCallNotificationDismissButtonAriaLabel": "Dismiss"
|
662
669
|
}
|
663
670
|
}
|
@@ -99,14 +99,15 @@
|
|
99
99
|
"cameraMenuTitle": "Cámara",
|
100
100
|
"cameraMenuTooltip": "Elegir cámara",
|
101
101
|
"cameraButtonSplitRoleDescription": "Botón de expansión",
|
102
|
-
"onSplitButtonAriaLabel": "
|
103
|
-
"offSplitButtonAriaLabel": "Activar la cámara
|
102
|
+
"onSplitButtonAriaLabel": "Desconectar la cámara",
|
103
|
+
"offSplitButtonAriaLabel": "Activar la cámara",
|
104
104
|
"cameraActionTurnedOnAnnouncement": "La cámara se ha activado",
|
105
105
|
"cameraActionTurnedOffAnnouncement": "La cámara se ha desactivado",
|
106
106
|
"onSplitButtonPrimaryActionCamera": "Desconectar la cámara",
|
107
107
|
"offSplitButtonPrimaryActionCamera": "Activar la cámara",
|
108
108
|
"cameraPrimaryActionSplitButtonTitle": "Usar cámara",
|
109
|
-
"videoEffectsMenuItemTitle": "Efectos"
|
109
|
+
"videoEffectsMenuItemTitle": "Efectos",
|
110
|
+
"cameraButtonAriaDescription": "opciones de cámara"
|
110
111
|
},
|
111
112
|
"microphoneButton": {
|
112
113
|
"onLabel": "Micro",
|
@@ -119,13 +120,17 @@
|
|
119
120
|
"speakerMenuTitle": "Altavoz",
|
120
121
|
"speakerMenuTooltip": "Elegir altavoz",
|
121
122
|
"microphoneButtonSplitRoleDescription": "Botón de expansión",
|
122
|
-
"onSplitButtonAriaLabel": "
|
123
|
-
"offSplitButtonAriaLabel": "Reactivar
|
123
|
+
"onSplitButtonAriaLabel": "Desactivar audio del micrófono",
|
124
|
+
"offSplitButtonAriaLabel": "Reactivar audio del micrófono",
|
124
125
|
"microphoneActionTurnedOnAnnouncement": "El micrófono se ha activado",
|
125
126
|
"microphoneActionTurnedOffAnnouncement": "El micrófono se ha desactivado",
|
126
|
-
"offSplitButtonMicrophonePrimaryAction": "Reactivar micrófono",
|
127
|
-
"onSplitButtonMicrophonePrimaryAction": "
|
128
|
-
"microphonePrimaryActionSplitButtonTitle": "Usar micrófono"
|
127
|
+
"offSplitButtonMicrophonePrimaryAction": "Reactivar audio del micrófono",
|
128
|
+
"onSplitButtonMicrophonePrimaryAction": "Desactivar audio del micrófono",
|
129
|
+
"microphonePrimaryActionSplitButtonTitle": "Usar micrófono",
|
130
|
+
"microphoneAriaDescription": "Opciones de audio",
|
131
|
+
"deepNoiseSuppressionTitle": "Supresión de ruido",
|
132
|
+
"deepNoiseSuppressionOnAnnouncement": "Se ha activado la supresión profunda de ruido",
|
133
|
+
"deepNoiseSuppressionOffAnnouncement": "Se ha desactivado la supresión profunda de ruido"
|
129
134
|
},
|
130
135
|
"devicesButton": {
|
131
136
|
"label": "Dispositivos",
|
@@ -504,7 +509,8 @@
|
|
504
509
|
"stopSpotlightVideoTileMenuLabel": "Dejar de poner en primer plano",
|
505
510
|
"stopSpotlightOnSelfVideoTileMenuLabel": "Primer plano",
|
506
511
|
"attendeeRole": "Asistente",
|
507
|
-
"muteParticipantMenuItemLabel": "Silenciar"
|
512
|
+
"muteParticipantMenuItemLabel": "Silenciar",
|
513
|
+
"waitingScreenText": "Esperando a que se unan otros usuarios"
|
508
514
|
},
|
509
515
|
"dialpad": {
|
510
516
|
"placeholderText": "Introduzca el número de teléfono",
|
@@ -658,6 +664,7 @@
|
|
658
664
|
"incomingCallNoticicationRejectAriaLabel": "Rechazar",
|
659
665
|
"incomingCallNotificationAcceptButtonLabel": "Aceptar",
|
660
666
|
"incomingCallNotificationRejectButtonLabel": "Rechazar",
|
661
|
-
"incomingCallNotificationAccceptWithVideoButtonLabel": "Aceptar con vídeo"
|
667
|
+
"incomingCallNotificationAccceptWithVideoButtonLabel": "Aceptar con vídeo",
|
668
|
+
"incomingCallNotificationDismissButtonAriaLabel": "Descartar"
|
662
669
|
}
|
663
670
|
}
|
@@ -99,14 +99,15 @@
|
|
99
99
|
"cameraMenuTitle": "Kamera",
|
100
100
|
"cameraMenuTooltip": "Valitse kamera",
|
101
101
|
"cameraButtonSplitRoleDescription": "Jaettu painike",
|
102
|
-
"onSplitButtonAriaLabel": "
|
103
|
-
"offSplitButtonAriaLabel": "
|
102
|
+
"onSplitButtonAriaLabel": "Poista kamera käytöstä",
|
103
|
+
"offSplitButtonAriaLabel": "Ota kamera käyttöön",
|
104
104
|
"cameraActionTurnedOnAnnouncement": "Kamerasi on otettu käyttöön",
|
105
105
|
"cameraActionTurnedOffAnnouncement": "Kamerasi on poistettu käytöstä",
|
106
106
|
"onSplitButtonPrimaryActionCamera": "Poista kamera käytöstä",
|
107
107
|
"offSplitButtonPrimaryActionCamera": "Käynnistä kamera",
|
108
108
|
"cameraPrimaryActionSplitButtonTitle": "Käytä kameraa",
|
109
|
-
"videoEffectsMenuItemTitle": "Tehosteet"
|
109
|
+
"videoEffectsMenuItemTitle": "Tehosteet",
|
110
|
+
"cameraButtonAriaDescription": "kamera-asetukset"
|
110
111
|
},
|
111
112
|
"microphoneButton": {
|
112
113
|
"onLabel": "Mikrofoni",
|
@@ -119,13 +120,17 @@
|
|
119
120
|
"speakerMenuTitle": "Kaiutin",
|
120
121
|
"speakerMenuTooltip": "Valitse kaiutin",
|
121
122
|
"microphoneButtonSplitRoleDescription": "Jaettu painike",
|
122
|
-
"onSplitButtonAriaLabel": "
|
123
|
-
"offSplitButtonAriaLabel": "
|
123
|
+
"onSplitButtonAriaLabel": "Mykistä mikrofoni",
|
124
|
+
"offSplitButtonAriaLabel": "Poista mikrofonin mykistys",
|
124
125
|
"microphoneActionTurnedOnAnnouncement": "Mikrofonisi on otettu käyttöön",
|
125
126
|
"microphoneActionTurnedOffAnnouncement": "Mikrofonisi on poistettu käytöstä",
|
126
127
|
"offSplitButtonMicrophonePrimaryAction": "Poista mikrofonin mykistys",
|
127
128
|
"onSplitButtonMicrophonePrimaryAction": "Mykistä mikrofoni",
|
128
|
-
"microphonePrimaryActionSplitButtonTitle": "Käytä mikrofonia"
|
129
|
+
"microphonePrimaryActionSplitButtonTitle": "Käytä mikrofonia",
|
130
|
+
"microphoneAriaDescription": "Ääniasetukset",
|
131
|
+
"deepNoiseSuppressionTitle": "Melunvaimennus",
|
132
|
+
"deepNoiseSuppressionOnAnnouncement": "Syvä melunvaimennus on otettu käyttöön",
|
133
|
+
"deepNoiseSuppressionOffAnnouncement": "Syvä melunvaimennus on poistettu käytöstä"
|
129
134
|
},
|
130
135
|
"devicesButton": {
|
131
136
|
"label": "Laitteet",
|
@@ -504,7 +509,8 @@
|
|
504
509
|
"stopSpotlightVideoTileMenuLabel": "Poista valokeilasta",
|
505
510
|
"stopSpotlightOnSelfVideoTileMenuLabel": "Valokeila",
|
506
511
|
"attendeeRole": "Osallistuja",
|
507
|
-
"muteParticipantMenuItemLabel": "Mykistä"
|
512
|
+
"muteParticipantMenuItemLabel": "Mykistä",
|
513
|
+
"waitingScreenText": "Odotetaan että muut liittyvät"
|
508
514
|
},
|
509
515
|
"dialpad": {
|
510
516
|
"placeholderText": "Anna puhelinnumero",
|
@@ -658,6 +664,7 @@
|
|
658
664
|
"incomingCallNoticicationRejectAriaLabel": "Hylkää",
|
659
665
|
"incomingCallNotificationAcceptButtonLabel": "Hyväksy",
|
660
666
|
"incomingCallNotificationRejectButtonLabel": "Hylkää",
|
661
|
-
"incomingCallNotificationAccceptWithVideoButtonLabel": "Vastaa videopuhelulla"
|
667
|
+
"incomingCallNotificationAccceptWithVideoButtonLabel": "Vastaa videopuhelulla",
|
668
|
+
"incomingCallNotificationDismissButtonAriaLabel": "Hylkää"
|
662
669
|
}
|
663
670
|
}
|