agora-appbuilder-core 4.1.9-beta.3 → 4.1.10-beta.1

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 (109) hide show
  1. package/package.json +2 -2
  2. package/template/Gulpfile.js +0 -16
  3. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +1 -3
  4. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +1 -2
  5. package/template/agora-rn-uikit/src/Reducer/index.ts +0 -2
  6. package/template/agora-rn-uikit/src/Rtc/Join.tsx +11 -25
  7. package/template/agora-rn-uikit/src/RtcConfigure.tsx +1 -14
  8. package/template/bridge/rtc/webNg/RtcEngine.ts +2 -2
  9. package/template/bridge/rtm/web/index.ts +30 -0
  10. package/template/customization-api/typeDefinition.ts +1 -0
  11. package/template/defaultConfig.js +3 -2
  12. package/template/global.d.ts +1 -0
  13. package/template/package.json +0 -2
  14. package/template/src/AppRoutes.tsx +3 -3
  15. package/template/src/ai-agent/components/ControlButtons.tsx +1 -1
  16. package/template/src/assets/font-styles.css +36 -0
  17. package/template/src/assets/fonts/icomoon.ttf +0 -0
  18. package/template/src/assets/selection.json +1 -1
  19. package/template/src/atoms/CustomIcon.tsx +8 -0
  20. package/template/src/atoms/Dropdown.tsx +5 -0
  21. package/template/src/atoms/TertiaryButton.tsx +1 -1
  22. package/template/src/atoms/UserAvatar.tsx +1 -1
  23. package/template/src/components/ChatContext.ts +5 -3
  24. package/template/src/components/Controls.tsx +68 -22
  25. package/template/src/components/DeviceConfigure.tsx +1 -1
  26. package/template/src/components/EventsConfigure.tsx +22 -17
  27. package/template/src/components/Navbar.tsx +14 -11
  28. package/template/src/components/RTMConfigure.tsx +31 -1036
  29. package/template/src/components/UserGlobalPreferenceProvider.tsx +227 -0
  30. package/template/src/components/beauty-effect/useBeautyEffects.tsx +50 -13
  31. package/template/src/components/breakout-room/BreakoutRoomPanel.tsx +58 -0
  32. package/template/src/components/breakout-room/context/BreakoutRoomContext.tsx +2508 -0
  33. package/template/src/components/breakout-room/events/BreakoutRoomEventsConfigure.tsx +272 -0
  34. package/template/src/components/breakout-room/events/constants.ts +17 -0
  35. package/template/src/components/breakout-room/hoc/BreakoutRoomNameRenderer.tsx +68 -0
  36. package/template/src/components/breakout-room/hooks/useBreakoutRoomExit.ts +49 -0
  37. package/template/src/components/breakout-room/state/reducer.ts +522 -0
  38. package/template/src/components/breakout-room/state/types.ts +54 -0
  39. package/template/src/components/breakout-room/ui/BreakoutMeetingTitle.tsx +60 -0
  40. package/template/src/components/breakout-room/ui/BreakoutRoomActionMenu.tsx +136 -0
  41. package/template/src/components/breakout-room/ui/BreakoutRoomAnnouncementModal.tsx +135 -0
  42. package/template/src/components/breakout-room/ui/BreakoutRoomGroupSettings.tsx +588 -0
  43. package/template/src/components/breakout-room/ui/BreakoutRoomMainRoomUsers.tsx +142 -0
  44. package/template/src/components/breakout-room/ui/BreakoutRoomMemberActionMenu.tsx +122 -0
  45. package/template/src/components/breakout-room/ui/BreakoutRoomParticipants.tsx +124 -0
  46. package/template/src/components/breakout-room/ui/BreakoutRoomRaiseHand.tsx +65 -0
  47. package/template/src/components/breakout-room/ui/BreakoutRoomRenameModal.tsx +227 -0
  48. package/template/src/components/breakout-room/ui/BreakoutRoomSettings.tsx +140 -0
  49. package/template/src/components/breakout-room/ui/BreakoutRoomTransition.tsx +52 -0
  50. package/template/src/components/breakout-room/ui/BreakoutRoomView.tsx +193 -0
  51. package/template/src/components/breakout-room/ui/ExitBreakoutRoomIconButton.tsx +79 -0
  52. package/template/src/components/breakout-room/ui/ParticipantManualAssignmentModal.tsx +638 -0
  53. package/template/src/components/breakout-room/ui/SelectParticipantAssignmentStrategy.tsx +57 -0
  54. package/template/src/components/chat/chatConfigure.tsx +7 -1
  55. package/template/src/components/chat-messages/useChatMessages.tsx +43 -11
  56. package/template/src/components/common/Dividers.tsx +53 -0
  57. package/template/src/components/controls/toolbar-items/ExitBreakoutRoomToolbarItem.tsx +13 -0
  58. package/template/src/components/controls/useControlPermissionMatrix.tsx +32 -4
  59. package/template/src/components/participants/AllHostParticipants.tsx +10 -2
  60. package/template/src/components/participants/Participant.tsx +7 -1
  61. package/template/src/components/participants/UserActionMenuOptions.tsx +12 -2
  62. package/template/src/components/precall/joinWaitingRoomBtn.native.tsx +12 -8
  63. package/template/src/components/precall/joinWaitingRoomBtn.tsx +14 -10
  64. package/template/src/components/raise-hand/RaiseHandButton.tsx +50 -0
  65. package/template/src/components/raise-hand/RaiseHandProvider.tsx +308 -0
  66. package/template/src/components/raise-hand/index.ts +14 -0
  67. package/template/src/components/recordings/RecordingsDateTable.tsx +3 -2
  68. package/template/src/components/room-info/useCurrentRoomInfo.tsx +42 -0
  69. package/template/src/components/room-info/useSetBreakoutRoomInfo.tsx +64 -0
  70. package/template/src/components/useUserPreference.tsx +39 -12
  71. package/template/src/components/virtual-background/useVB.tsx +18 -0
  72. package/template/src/components/whiteboard/WhiteboardConfigure.tsx +27 -0
  73. package/template/src/language/default-labels/videoCallScreenLabels.ts +7 -0
  74. package/template/src/logger/AppBuilderLogger.tsx +11 -3
  75. package/template/src/pages/VideoCall.tsx +171 -518
  76. package/template/src/pages/video-call/BreakoutVideoCall.tsx +213 -0
  77. package/template/src/pages/video-call/SidePanelHeader.tsx +17 -0
  78. package/template/src/pages/video-call/VideoCallContent.tsx +211 -0
  79. package/template/src/pages/video-call/VideoCallScreen.tsx +18 -0
  80. package/template/src/pages/video-call/VideoCallScreenWrapper.tsx +0 -1
  81. package/template/src/pages/video-call/VideoCallStateWrapper.tsx +495 -0
  82. package/template/src/rtm/RTMConfigureBreakoutRoomProvider.tsx +882 -0
  83. package/template/src/rtm/RTMConfigureMainRoomProvider.tsx +757 -0
  84. package/template/src/rtm/RTMCoreProvider.tsx +419 -0
  85. package/template/src/rtm/RTMEngine.ts +188 -60
  86. package/template/src/rtm/RTMGlobalStateProvider.tsx +706 -0
  87. package/template/src/rtm/RTMStatusBanner.tsx +99 -0
  88. package/template/src/rtm/constants.ts +12 -0
  89. package/template/src/rtm/hooks/useMainRoomUserDisplayName.ts +45 -0
  90. package/template/src/rtm/rtm-presence-utils.ts +344 -0
  91. package/template/src/rtm/utils.ts +68 -1
  92. package/template/src/rtm-events/constants.ts +40 -1
  93. package/template/src/rtm-events-api/Events.ts +62 -19
  94. package/template/src/subComponents/ChatBubble.tsx +3 -3
  95. package/template/src/subComponents/ChatContainer.tsx +19 -9
  96. package/template/src/subComponents/LocalAudioMute.tsx +2 -2
  97. package/template/src/subComponents/LocalVideoMute.tsx +2 -2
  98. package/template/src/subComponents/SidePanelEnum.tsx +1 -0
  99. package/template/src/subComponents/caption/useCaption.tsx +1 -1
  100. package/template/src/subComponents/chat/ChatAnnouncementView.tsx +65 -0
  101. package/template/src/subComponents/chat/ChatSendButton.tsx +1 -0
  102. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +16 -0
  103. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +1 -1
  104. package/template/src/subComponents/waiting-rooms/WaitingRoomControls.tsx +7 -4
  105. package/template/src/utils/useDebouncedCallback.tsx +20 -0
  106. package/template/src/utils/useEndCall.ts +0 -2
  107. package/template/src/utils/useMuteToggleLocal.ts +14 -10
  108. package/template/agora-rn-uikit/src/Reducer/Spotlight.ts +0 -11
  109. package/template/agora-rn-uikit/src/Reducer/UserBanned.ts +0 -11
@@ -0,0 +1,272 @@
1
+ import React, {useEffect, useRef} from 'react';
2
+ import events from '../../../rtm-events-api';
3
+ import {BreakoutRoomEventNames} from './constants';
4
+ import {useBreakoutRoom} from '../context/BreakoutRoomContext';
5
+ import {BreakoutRoomSyncStateEventPayload} from '../state/types';
6
+ import {useLocalUid} from '../../../../agora-rn-uikit';
7
+ import {useRoomInfo} from '../../../components/room-info/useRoomInfo';
8
+ import {logger, LogSource} from '../../../logger/AppBuilderLogger';
9
+
10
+ interface Props {
11
+ children: React.ReactNode;
12
+ }
13
+
14
+ const BreakoutRoomEventsConfigure: React.FC<Props> = ({children}) => {
15
+ const {
16
+ // onMakeMePresenter,
17
+ handleBreakoutRoomSyncState,
18
+ handleHostOperationStart,
19
+ handleHostOperationEnd,
20
+ } = useBreakoutRoom();
21
+ // const {setCustomRTMMainRoomData} = useRTMGlobalState();
22
+ const localUid = useLocalUid();
23
+ const {
24
+ data: {isHost},
25
+ } = useRoomInfo();
26
+ const isHostRef = React.useRef(isHost);
27
+ const localUidRef = React.useRef(localUid);
28
+ // const onMakeMePresenterRef = useRef(onMakeMePresenter);
29
+ const handleBreakoutRoomSyncStateRef = useRef(handleBreakoutRoomSyncState);
30
+ const handleHostOperationStartRef = useRef(handleHostOperationStart);
31
+ const handleHostOperationEndRef = useRef(handleHostOperationEnd);
32
+
33
+ useEffect(() => {
34
+ isHostRef.current = isHost;
35
+ }, [isHost]);
36
+ useEffect(() => {
37
+ localUidRef.current = localUid;
38
+ }, [localUid]);
39
+ // useEffect(() => {
40
+ // onMakeMePresenterRef.current = onMakeMePresenter;
41
+ // }, [onMakeMePresenter]);
42
+ useEffect(() => {
43
+ handleBreakoutRoomSyncStateRef.current = handleBreakoutRoomSyncState;
44
+ }, [handleBreakoutRoomSyncState]);
45
+ useEffect(() => {
46
+ handleHostOperationStartRef.current = handleHostOperationStart;
47
+ }, [handleHostOperationStart]);
48
+ useEffect(() => {
49
+ handleHostOperationEndRef.current = handleHostOperationEnd;
50
+ }, [handleHostOperationEnd]);
51
+
52
+ useEffect(() => {
53
+ // const handleMakePresenterEvent = (evtData: any) => {
54
+ // logger.log(
55
+ // LogSource.Internals,
56
+ // 'BREAKOUT_ROOM',
57
+ // 'BREAKOUT_ROOM_MAKE_PRESENTER event received',
58
+ // evtData,
59
+ // );
60
+ // try {
61
+ // const {payload} = evtData;
62
+ // const data = JSON.parse(payload);
63
+ // console.log('supriya-presenter handleMakePresenterEvent data: ', data);
64
+ // const {uid, action} = data;
65
+
66
+ // // Only process if it's for the local user
67
+ // if (uid === localUidRef.current) {
68
+ // onMakeMePresenterRef.current(action);
69
+ // }
70
+ // } catch (error) {
71
+ // logger.log(
72
+ // LogSource.Internals,
73
+ // 'BREAKOUT_ROOM',
74
+ // 'Error handling make presenter event',
75
+ // error,
76
+ // );
77
+ // }
78
+ // };
79
+
80
+ const handleBreakoutRoomSyncStateEvent = (evtData: any) => {
81
+ console.log('BREAKOUT_ROOM_SYNC_STATE event recevied', evtData);
82
+ const {ts, payload} = evtData;
83
+ const data: BreakoutRoomSyncStateEventPayload = JSON.parse(payload);
84
+ if (data.data.act === 'SYNC_STATE') {
85
+ console.log(
86
+ 'supriya-state-sync ********* BREAKOUT_ROOM_SYNC_STATE event triggered ***************',
87
+ );
88
+ handleBreakoutRoomSyncStateRef.current(data.data, ts);
89
+ }
90
+ };
91
+
92
+ const handleHostOperationStartEvent = (evtData: any) => {
93
+ logger.log(
94
+ LogSource.Internals,
95
+ 'BREAKOUT_ROOM',
96
+ 'BREAKOUT_ROOM_HOST_OPERATION_START event received',
97
+ evtData,
98
+ );
99
+ try {
100
+ const {sender, payload} = evtData;
101
+ // Ignore events from self
102
+ if (sender === `${localUidRef.current}`) {
103
+ return;
104
+ }
105
+ // // Only process if current user is also a host
106
+ // if (!isHostRef.current) {
107
+ // return;
108
+ // }
109
+
110
+ const data = JSON.parse(payload);
111
+ const {operationName, hostUid, hostName} = data;
112
+
113
+ handleHostOperationStartRef.current(operationName, hostUid, hostName);
114
+ } catch (error) {
115
+ logger.log(
116
+ LogSource.Internals,
117
+ 'BREAKOUT_ROOM',
118
+ 'Error handling host operation start event',
119
+ {error: error.message},
120
+ );
121
+ }
122
+ };
123
+
124
+ const handleHostOperationEndEvent = (evtData: any) => {
125
+ logger.log(
126
+ LogSource.Internals,
127
+ 'BREAKOUT_ROOM',
128
+ 'BREAKOUT_ROOM_HOST_OPERATION_END event received',
129
+ evtData,
130
+ );
131
+ try {
132
+ const {sender, payload} = evtData;
133
+ // Ignore events from self
134
+ if (sender === `${localUidRef.current}`) {
135
+ return;
136
+ }
137
+ // // Only process if current user is also a host
138
+ // if (!isHostRef.current) {
139
+ // return;
140
+ // }
141
+
142
+ const data = JSON.parse(payload);
143
+ const {operationName, hostUid, hostName} = data;
144
+
145
+ handleHostOperationEndRef.current(operationName, hostUid, hostName);
146
+ } catch (error) {
147
+ logger.log(
148
+ LogSource.Internals,
149
+ 'BREAKOUT_ROOM',
150
+ 'Error handling host operation end event',
151
+ {error: error.message},
152
+ );
153
+ }
154
+ };
155
+
156
+ // const handlePresenterAttributeEvent = (evtData: any) => {
157
+ // logger.log(
158
+ // LogSource.Internals,
159
+ // 'BREAKOUT_ROOM',
160
+ // 'BREAKOUT_PRESENTER_ATTRIBUTE event received',
161
+ // evtData,
162
+ // );
163
+ // try {
164
+ // const {payload} = evtData;
165
+ // const data = JSON.parse(payload);
166
+ // console.log('supriya-presenter handlePresenterAttributeEvent', data);
167
+
168
+ // const {uid, isPresenter, timestamp} = data;
169
+
170
+ // // If this is the local user's presenter attribute, restore their state
171
+ // // Pass shouldSendEvent: false to avoid sending the event again (infinite loop)
172
+ // if (uid === localUidRef.current && !isHostRef.current) {
173
+ // if (isPresenter) {
174
+ // onMakeMePresenterRef.current('start', false);
175
+ // } else {
176
+ // onMakeMePresenterRef.current('stop', false);
177
+ // }
178
+ // }
179
+
180
+ // // Host updates customRTMMainRoomData with presenter status
181
+ // // This is mainly for syncing state when host rejoins and reads persisted attributes
182
+ // if (isHostRef.current) {
183
+ // if (isPresenter) {
184
+ // setCustomRTMMainRoomData(prev => {
185
+ // const currentPresenters = prev.breakout_room_presenters || [];
186
+ // // Check if already in the list (avoid duplicate from makePresenter)
187
+ // const exists = currentPresenters.find((p: any) => p.uid === uid);
188
+ // if (exists) {
189
+ // return prev;
190
+ // }
191
+ // return {
192
+ // ...prev,
193
+ // breakout_room_presenters: [
194
+ // ...currentPresenters,
195
+ // {uid, timestamp},
196
+ // ],
197
+ // };
198
+ // });
199
+ // } else {
200
+ // // Remove from presenters list
201
+ // setCustomRTMMainRoomData(prev => ({
202
+ // ...prev,
203
+ // breakout_room_presenters: (
204
+ // prev.breakout_room_presenters || []
205
+ // ).filter((p: any) => p.uid !== uid),
206
+ // }));
207
+ // }
208
+ // }
209
+ // } catch (error) {
210
+ // logger.log(
211
+ // LogSource.Internals,
212
+ // 'BREAKOUT_ROOM',
213
+ // 'Error handling presenter attribute event',
214
+ // error,
215
+ // );
216
+ // }
217
+ // };
218
+
219
+ // events.on(
220
+ // BreakoutRoomEventNames.BREAKOUT_ROOM_ANNOUNCEMENT,
221
+ // handleAnnouncementEvent,
222
+ // );
223
+ // events.on(
224
+ // EventNames.BREAKOUT_PRESENTER_ATTRIBUTE,
225
+ // handlePresenterAttributeEvent,
226
+ // );
227
+ // events.on(
228
+ // BreakoutRoomEventNames.BREAKOUT_ROOM_MAKE_PRESENTER,
229
+ // handleMakePresenterEvent,
230
+ // );
231
+ events.on(
232
+ BreakoutRoomEventNames.BREAKOUT_ROOM_SYNC_STATE,
233
+ handleBreakoutRoomSyncStateEvent,
234
+ );
235
+ events.on(
236
+ BreakoutRoomEventNames.BREAKOUT_ROOM_HOST_OPERATION_START,
237
+ handleHostOperationStartEvent,
238
+ );
239
+ events.on(
240
+ BreakoutRoomEventNames.BREAKOUT_ROOM_HOST_OPERATION_END,
241
+ handleHostOperationEndEvent,
242
+ );
243
+
244
+ return () => {
245
+ // events.off(BreakoutRoomEventNames.BREAKOUT_ROOM_ANNOUNCEMENT);
246
+ // events.off(
247
+ // EventNames.BREAKOUT_PRESENTER_ATTRIBUTE,
248
+ // handlePresenterAttributeEvent,
249
+ // );
250
+ // events.off(
251
+ // BreakoutRoomEventNames.BREAKOUT_ROOM_MAKE_PRESENTER,
252
+ // handleMakePresenterEvent,
253
+ // );
254
+ events.off(
255
+ BreakoutRoomEventNames.BREAKOUT_ROOM_SYNC_STATE,
256
+ handleBreakoutRoomSyncStateEvent,
257
+ );
258
+ events.off(
259
+ BreakoutRoomEventNames.BREAKOUT_ROOM_HOST_OPERATION_START,
260
+ handleHostOperationStartEvent,
261
+ );
262
+ events.off(
263
+ BreakoutRoomEventNames.BREAKOUT_ROOM_HOST_OPERATION_END,
264
+ handleHostOperationEndEvent,
265
+ );
266
+ };
267
+ }, []);
268
+
269
+ return <>{children}</>;
270
+ };
271
+
272
+ export default BreakoutRoomEventsConfigure;
@@ -0,0 +1,17 @@
1
+ // 9. BREAKOUT ROOM
2
+ const BREAKOUT_ROOM_JOIN_DETAILS = 'BREAKOUT_ROOM_BREAKOUT_ROOM_JOIN_DETAILS';
3
+ const BREAKOUT_ROOM_SYNC_STATE = 'BREAKOUT_ROOM_BREAKOUT_ROOM_STATE';
4
+ const BREAKOUT_ROOM_ANNOUNCEMENT = 'BREAKOUT_ROOM_ANNOUNCEMENT';
5
+ const BREAKOUT_ROOM_MAKE_PRESENTER = 'BREAKOUT_ROOM_MAKE_PRESENTER';
6
+ const BREAKOUT_ROOM_HOST_OPERATION_START = 'BREAKOUT_ROOM_HOST_OPERATION_START';
7
+ const BREAKOUT_ROOM_HOST_OPERATION_END = 'BREAKOUT_ROOM_HOST_OPERATION_END';
8
+
9
+ const BreakoutRoomEventNames = {
10
+ BREAKOUT_ROOM_JOIN_DETAILS,
11
+ BREAKOUT_ROOM_SYNC_STATE,
12
+ BREAKOUT_ROOM_ANNOUNCEMENT,
13
+ BREAKOUT_ROOM_MAKE_PRESENTER,
14
+ BREAKOUT_ROOM_HOST_OPERATION_START,
15
+ BREAKOUT_ROOM_HOST_OPERATION_END,
16
+ };
17
+ export {BreakoutRoomEventNames};
@@ -0,0 +1,68 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the "Materials") are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.'s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+
13
+ import React, {useMemo} from 'react';
14
+ import {useLocation} from '../../Router';
15
+ import {useBreakoutRoom} from '../context/BreakoutRoomContext';
16
+ import {useLocalUid} from '../../../../agora-rn-uikit';
17
+
18
+ export interface BreakoutRoomInfo {
19
+ isInBreakoutMode: boolean;
20
+ breakoutRoomName: string;
21
+ }
22
+
23
+ interface BreakoutRoomNameRendererProps {
24
+ children: (breakoutRoomInfo: BreakoutRoomInfo) => React.ReactNode;
25
+ }
26
+
27
+ const BreakoutRoomNameRenderer: React.FC<BreakoutRoomNameRendererProps> = ({
28
+ children,
29
+ }) => {
30
+ const location = useLocation();
31
+ const localUid = useLocalUid();
32
+ const {breakoutGroups = [], breakoutRoomVersion} = useBreakoutRoom();
33
+
34
+ const breakoutRoomInfo = useMemo(() => {
35
+ let breakoutRoomName = '';
36
+ let isInBreakoutMode = false;
37
+ let currentRoom = null;
38
+
39
+ try {
40
+ const searchParams = new URLSearchParams(location.search);
41
+ isInBreakoutMode = searchParams.get('breakout') === 'true';
42
+
43
+ if (isInBreakoutMode) {
44
+ currentRoom = breakoutGroups?.find(
45
+ group =>
46
+ group.participants?.hosts?.includes(localUid) ||
47
+ group.participants?.attendees?.includes(localUid),
48
+ );
49
+
50
+ if (currentRoom?.name) {
51
+ breakoutRoomName = currentRoom.name;
52
+ }
53
+ }
54
+ } catch (error) {
55
+ // Safely handle cases where breakout context is not available
56
+ console.log('BreakoutRoomNameRenderer: Breakout context not available');
57
+ }
58
+
59
+ return {
60
+ isInBreakoutMode,
61
+ breakoutRoomName,
62
+ };
63
+ }, [location.search, localUid, breakoutRoomVersion]);
64
+
65
+ return <>{children(breakoutRoomInfo)}</>;
66
+ };
67
+
68
+ export default BreakoutRoomNameRenderer;
@@ -0,0 +1,49 @@
1
+ import {useContext} from 'react';
2
+ import {useHistory, useParams} from '../../../components/Router';
3
+ import {useCaption, useContent, useSTTAPI} from 'customization-api';
4
+
5
+ const useBreakoutRoomExit = (handleLeaveBreakout?: () => void) => {
6
+ const history = useHistory();
7
+ const {phrase} = useParams<{phrase: string}>();
8
+ const {defaultContent} = useContent();
9
+ const {stop: stopSTTAPI} = useSTTAPI();
10
+ const {isSTTActive} = useCaption();
11
+
12
+ return async () => {
13
+ try {
14
+ // stopping STT on call end,if only last user is remaining in call
15
+ const usersInCall = Object.entries(defaultContent).filter(
16
+ item =>
17
+ item[1].type === 'rtc' &&
18
+ item[1].isHost === 'true' &&
19
+ !item[1].offline,
20
+ );
21
+ if (usersInCall.length === 1 && isSTTActive) {
22
+ console.log('Stopping stt api as only one host is in the call');
23
+ stopSTTAPI().catch(error => {
24
+ console.log('Error stopping stt', error);
25
+ });
26
+ }
27
+
28
+ // Trigger exit transition if callback provided
29
+ if (handleLeaveBreakout) {
30
+ console.log('Triggering breakout room exit transition');
31
+ handleLeaveBreakout();
32
+ } else {
33
+ // Fallback: Navigate directly if no transition callback
34
+ history.push(`/${phrase}`);
35
+ }
36
+ } catch (error) {
37
+ // Fallback navigation on error
38
+ if (handleLeaveBreakout) {
39
+ handleLeaveBreakout();
40
+ } else {
41
+ history.push(`/${phrase}`);
42
+ }
43
+
44
+ throw error; // Re-throw so caller can handle
45
+ }
46
+ };
47
+ };
48
+
49
+ export default useBreakoutRoomExit;