agora-appbuilder-core 4.1.10-beta.1 → 4.1.11

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 (132) hide show
  1. package/package.json +2 -2
  2. package/template/agora-rn-uikit/src/Utils/isBotUser.ts +1 -1
  3. package/template/android/app/build.gradle +0 -7
  4. package/template/bridge/rtc/webNg/RtcEngine.ts +2 -2
  5. package/template/bridge/rtm/web/Types.ts +0 -183
  6. package/template/bridge/rtm/web/index.ts +488 -450
  7. package/template/customization-api/typeDefinition.ts +0 -1
  8. package/template/defaultConfig.js +3 -4
  9. package/template/global.d.ts +0 -1
  10. package/template/ios/Podfile +0 -41
  11. package/template/package.json +5 -5
  12. package/template/src/AppRoutes.tsx +3 -3
  13. package/template/src/ai-agent/components/ControlButtons.tsx +1 -1
  14. package/template/src/assets/font-styles.css +1 -33
  15. package/template/src/assets/fonts/icomoon.ttf +0 -0
  16. package/template/src/assets/selection.json +1 -1
  17. package/template/src/atoms/ActionMenu.tsx +93 -13
  18. package/template/src/atoms/CustomIcon.tsx +1 -8
  19. package/template/src/atoms/DropDownMulti.tsx +80 -29
  20. package/template/src/atoms/Dropdown.tsx +0 -5
  21. package/template/src/atoms/Input.tsx +2 -1
  22. package/template/src/atoms/TertiaryButton.tsx +1 -1
  23. package/template/src/atoms/UserAvatar.tsx +1 -1
  24. package/template/src/components/ChatContext.ts +3 -5
  25. package/template/src/components/Controls.tsx +167 -208
  26. package/template/src/components/DeviceConfigure.tsx +1 -1
  27. package/template/src/components/EventsConfigure.tsx +168 -118
  28. package/template/src/components/Navbar.tsx +11 -14
  29. package/template/src/components/RTMConfigure.tsx +819 -32
  30. package/template/src/components/beauty-effect/useBeautyEffects.tsx +13 -50
  31. package/template/src/components/chat/chatConfigure.tsx +1 -7
  32. package/template/src/components/chat-messages/useChatMessages.tsx +11 -43
  33. package/template/src/components/controls/useControlPermissionMatrix.tsx +4 -32
  34. package/template/src/components/participants/AllHostParticipants.tsx +2 -10
  35. package/template/src/components/participants/Participant.tsx +1 -7
  36. package/template/src/components/participants/UserActionMenuOptions.tsx +2 -12
  37. package/template/src/components/precall/joinCallBtn.native.tsx +7 -2
  38. package/template/src/components/precall/joinCallBtn.tsx +7 -2
  39. package/template/src/components/precall/joinWaitingRoomBtn.native.tsx +16 -15
  40. package/template/src/components/precall/joinWaitingRoomBtn.tsx +31 -17
  41. package/template/src/components/precall/textInput.tsx +45 -22
  42. package/template/src/components/precall/usePreCall.tsx +7 -0
  43. package/template/src/components/recordings/RecordingsDateTable.tsx +2 -3
  44. package/template/src/components/room-info/useRoomInfo.tsx +5 -0
  45. package/template/src/components/useUserPreference.tsx +12 -39
  46. package/template/src/components/virtual-background/useVB.tsx +0 -18
  47. package/template/src/components/whiteboard/WhiteboardConfigure.tsx +0 -27
  48. package/template/src/language/default-labels/videoCallScreenLabels.ts +27 -11
  49. package/template/src/logger/AppBuilderLogger.tsx +3 -11
  50. package/template/src/pages/VideoCall.tsx +518 -171
  51. package/template/src/pages/video-call/ActionSheetContent.tsx +77 -77
  52. package/template/src/pages/video-call/SidePanelHeader.tsx +81 -53
  53. package/template/src/pages/video-call/VideoCallScreen.tsx +0 -18
  54. package/template/src/pages/video-call/VideoCallScreenWrapper.tsx +1 -0
  55. package/template/src/rtm/RTMEngine.ts +37 -262
  56. package/template/src/rtm/utils.ts +1 -68
  57. package/template/src/rtm-events/constants.ts +7 -40
  58. package/template/src/rtm-events-api/Events.ts +39 -158
  59. package/template/src/subComponents/ChatBubble.tsx +3 -3
  60. package/template/src/subComponents/ChatContainer.tsx +9 -19
  61. package/template/src/subComponents/LocalAudioMute.tsx +2 -2
  62. package/template/src/subComponents/LocalVideoMute.tsx +2 -2
  63. package/template/src/subComponents/SidePanelEnum.tsx +0 -1
  64. package/template/src/subComponents/caption/Caption.tsx +48 -7
  65. package/template/src/subComponents/caption/CaptionContainer.tsx +324 -51
  66. package/template/src/subComponents/caption/CaptionIcon.tsx +35 -34
  67. package/template/src/subComponents/caption/CaptionText.tsx +103 -2
  68. package/template/src/subComponents/caption/LanguageSelectorPopup.tsx +179 -69
  69. package/template/src/subComponents/caption/Transcript.tsx +46 -11
  70. package/template/src/subComponents/caption/TranscriptIcon.tsx +27 -35
  71. package/template/src/subComponents/caption/TranscriptText.tsx +78 -3
  72. package/template/src/subComponents/caption/proto/ptoto.js +38 -4
  73. package/template/src/subComponents/caption/proto/test.proto +34 -19
  74. package/template/src/subComponents/caption/useCaption.tsx +754 -11
  75. package/template/src/subComponents/caption/useSTTAPI.tsx +118 -205
  76. package/template/src/subComponents/caption/useStreamMessageUtils.native.ts +152 -33
  77. package/template/src/subComponents/caption/useStreamMessageUtils.ts +165 -34
  78. package/template/src/subComponents/caption/utils.ts +171 -3
  79. package/template/src/subComponents/chat/ChatSendButton.tsx +0 -1
  80. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +0 -16
  81. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +1 -1
  82. package/template/src/subComponents/waiting-rooms/WaitingRoomControls.tsx +4 -7
  83. package/template/src/utils/SdkEvents.ts +3 -0
  84. package/template/src/utils/useEndCall.ts +4 -4
  85. package/template/src/utils/useMuteToggleLocal.ts +10 -14
  86. package/template/src/utils/useSpeechToText.ts +31 -20
  87. package/template/bridge/rtm/web/index-legacy.ts +0 -540
  88. package/template/src/components/RTMConfigure-legacy.tsx +0 -848
  89. package/template/src/components/UserGlobalPreferenceProvider.tsx +0 -227
  90. package/template/src/components/breakout-room/BreakoutRoomPanel.tsx +0 -58
  91. package/template/src/components/breakout-room/context/BreakoutRoomContext.tsx +0 -2508
  92. package/template/src/components/breakout-room/events/BreakoutRoomEventsConfigure.tsx +0 -272
  93. package/template/src/components/breakout-room/events/constants.ts +0 -17
  94. package/template/src/components/breakout-room/hoc/BreakoutRoomNameRenderer.tsx +0 -68
  95. package/template/src/components/breakout-room/hooks/useBreakoutRoomExit.ts +0 -49
  96. package/template/src/components/breakout-room/state/reducer.ts +0 -522
  97. package/template/src/components/breakout-room/state/types.ts +0 -54
  98. package/template/src/components/breakout-room/ui/BreakoutMeetingTitle.tsx +0 -60
  99. package/template/src/components/breakout-room/ui/BreakoutRoomActionMenu.tsx +0 -136
  100. package/template/src/components/breakout-room/ui/BreakoutRoomAnnouncementModal.tsx +0 -135
  101. package/template/src/components/breakout-room/ui/BreakoutRoomGroupSettings.tsx +0 -588
  102. package/template/src/components/breakout-room/ui/BreakoutRoomMainRoomUsers.tsx +0 -142
  103. package/template/src/components/breakout-room/ui/BreakoutRoomMemberActionMenu.tsx +0 -122
  104. package/template/src/components/breakout-room/ui/BreakoutRoomParticipants.tsx +0 -124
  105. package/template/src/components/breakout-room/ui/BreakoutRoomRaiseHand.tsx +0 -65
  106. package/template/src/components/breakout-room/ui/BreakoutRoomRenameModal.tsx +0 -227
  107. package/template/src/components/breakout-room/ui/BreakoutRoomSettings.tsx +0 -140
  108. package/template/src/components/breakout-room/ui/BreakoutRoomTransition.tsx +0 -52
  109. package/template/src/components/breakout-room/ui/BreakoutRoomView.tsx +0 -193
  110. package/template/src/components/breakout-room/ui/ExitBreakoutRoomIconButton.tsx +0 -79
  111. package/template/src/components/breakout-room/ui/ParticipantManualAssignmentModal.tsx +0 -638
  112. package/template/src/components/breakout-room/ui/SelectParticipantAssignmentStrategy.tsx +0 -57
  113. package/template/src/components/common/Dividers.tsx +0 -53
  114. package/template/src/components/controls/toolbar-items/ExitBreakoutRoomToolbarItem.tsx +0 -13
  115. package/template/src/components/raise-hand/RaiseHandButton.tsx +0 -50
  116. package/template/src/components/raise-hand/RaiseHandProvider.tsx +0 -308
  117. package/template/src/components/raise-hand/index.ts +0 -14
  118. package/template/src/components/room-info/useCurrentRoomInfo.tsx +0 -42
  119. package/template/src/components/room-info/useSetBreakoutRoomInfo.tsx +0 -64
  120. package/template/src/pages/video-call/BreakoutVideoCall.tsx +0 -213
  121. package/template/src/pages/video-call/VideoCallContent.tsx +0 -211
  122. package/template/src/pages/video-call/VideoCallStateWrapper.tsx +0 -495
  123. package/template/src/rtm/RTMConfigureBreakoutRoomProvider.tsx +0 -882
  124. package/template/src/rtm/RTMConfigureMainRoomProvider.tsx +0 -757
  125. package/template/src/rtm/RTMCoreProvider.tsx +0 -419
  126. package/template/src/rtm/RTMGlobalStateProvider.tsx +0 -706
  127. package/template/src/rtm/RTMStatusBanner.tsx +0 -99
  128. package/template/src/rtm/constants.ts +0 -12
  129. package/template/src/rtm/hooks/useMainRoomUserDisplayName.ts +0 -45
  130. package/template/src/rtm/rtm-presence-utils.ts +0 -344
  131. package/template/src/subComponents/chat/ChatAnnouncementView.tsx +0 -65
  132. package/template/src/utils/useDebouncedCallback.tsx +0 -20
@@ -1,213 +0,0 @@
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
- import React, {useState, useEffect} from 'react';
13
- import {
14
- RtcConfigure,
15
- PropsProvider,
16
- ChannelProfileType,
17
- LocalUserContext,
18
- RtcPropsInterface,
19
- } from '../../../agora-rn-uikit';
20
- import RtmConfigure from '../../components/RTMConfigure';
21
- import RTMConfigureBreakoutRoomProvider from '../../rtm/RTMConfigureBreakoutRoomProvider';
22
- import DeviceConfigure from '../../components/DeviceConfigure';
23
- import {isMobileUA} from '../../utils/common';
24
- import {LiveStreamContextProvider} from '../../components/livestream';
25
- import ScreenshareConfigure from '../../subComponents/screenshare/ScreenshareConfigure';
26
- import {LayoutProvider} from '../../utils/useLayout';
27
- import {RecordingProvider} from '../../subComponents/recording/useRecording';
28
- import {SidePanelProvider} from '../../utils/useSidePanel';
29
- import {NetworkQualityProvider} from '../../components/NetworkQualityContext';
30
- import {ChatNotificationProvider} from '../../components/chat-notification/useChatNotification';
31
- import {ChatUIControlsProvider} from '../../components/chat-ui/useChatUIControls';
32
- import {ScreenShareProvider} from '../../components/contexts/ScreenShareContext';
33
- import {LiveStreamDataProvider} from '../../components/contexts/LiveStreamDataContext';
34
- import {VideoMeetingDataProvider} from '../../components/contexts/VideoMeetingDataContext';
35
- import {UserPreferenceProvider} from '../../components/useUserPreference';
36
- import EventsConfigure from '../../components/EventsConfigure';
37
- import PermissionHelper from '../../components/precall/PermissionHelper';
38
- import {FocusProvider} from '../../utils/useFocus';
39
- import {VideoCallProvider} from '../../components/useVideoCall';
40
- import {CaptionProvider} from '../../subComponents/caption/useCaption';
41
- import SdkMuteToggleListener from '../../components/SdkMuteToggleListener';
42
- import {NoiseSupressionProvider} from '../../app-state/useNoiseSupression';
43
- import {VideoQualityContextProvider} from '../../app-state/useVideoQuality';
44
- import {VBProvider} from '../../components/virtual-background/useVB';
45
- import {DisableChatProvider} from '../../components/disable-chat/useDisableChat';
46
- import {WaitingRoomProvider} from '../../components/contexts/WaitingRoomContext';
47
- import {ChatMessagesProvider} from '../../components/chat-messages/useChatMessages';
48
- import VideoCallScreenWrapper from './../video-call/VideoCallScreenWrapper';
49
- import {BeautyEffectProvider} from '../../components/beauty-effect/useBeautyEffects';
50
- import {UserActionMenuProvider} from '../../components/useUserActionMenu';
51
- import {RaiseHandProvider} from '../../components/raise-hand';
52
- import {BreakoutRoomProvider} from '../../components/breakout-room/context/BreakoutRoomContext';
53
- import {useSetBreakoutRoomInfo} from '../../components/room-info/useSetBreakoutRoomInfo';
54
- import {VideoCallContentProps} from './VideoCallContent';
55
- import BreakoutRoomEventsConfigure from '../../components/breakout-room/events/BreakoutRoomEventsConfigure';
56
- import {RTM_ROOMS} from '../../rtm/constants';
57
- import {BreakoutChannelJoinEventPayload} from '../../components/breakout-room/state/types';
58
-
59
- interface BreakoutVideoCallProps extends VideoCallContentProps {
60
- rtcProps: RtcPropsInterface;
61
- breakoutJoinChannelDetails: BreakoutChannelJoinEventPayload['data']['data'];
62
- onLeave: () => void;
63
- }
64
-
65
- const BreakoutVideoCall: React.FC<BreakoutVideoCallProps> = ({
66
- rtcProps,
67
- breakoutJoinChannelDetails,
68
- onLeave,
69
- callActive,
70
- callbacks,
71
- styleProps,
72
- }) => {
73
- const {setBreakoutRoomChannelInfo} = useSetBreakoutRoomInfo();
74
- const [isRecordingActive, setRecordingActive] = useState(false);
75
- const [sttAutoStarted, setSttAutoStarted] = useState(false);
76
- const [recordingAutoStarted, setRecordingAutoStarted] = useState(false);
77
- const [breakoutRoomRTCProps, setBreakoutRoomRtcProps] = useState({
78
- ...rtcProps,
79
- channel: breakoutJoinChannelDetails.channel_name,
80
- uid: breakoutJoinChannelDetails.mainUser.uid as number,
81
- token: breakoutJoinChannelDetails.mainUser.rtc,
82
- rtm: breakoutJoinChannelDetails.mainUser.rtm,
83
- screenShareUid: breakoutJoinChannelDetails?.screenShare.uid as number,
84
- screenShareToken: breakoutJoinChannelDetails?.screenShare.rtc,
85
- });
86
-
87
- // Set breakout room data when component mounts
88
- useEffect(() => {
89
- setBreakoutRoomChannelInfo({
90
- isBreakoutMode: true,
91
- ...breakoutJoinChannelDetails,
92
- });
93
- }, [breakoutJoinChannelDetails]);
94
-
95
- return (
96
- <PropsProvider
97
- value={{
98
- rtcProps: {
99
- ...breakoutRoomRTCProps,
100
- callActive,
101
- },
102
- callbacks,
103
- styleProps,
104
- mode: $config.EVENT_MODE
105
- ? ChannelProfileType.ChannelProfileLiveBroadcasting
106
- : ChannelProfileType.ChannelProfileCommunication,
107
- }}>
108
- <RtcConfigure>
109
- <DeviceConfigure>
110
- <NoiseSupressionProvider callActive={callActive}>
111
- <VideoQualityContextProvider>
112
- <ChatUIControlsProvider>
113
- <ChatNotificationProvider>
114
- <LayoutProvider>
115
- <FocusProvider>
116
- <SidePanelProvider>
117
- <ChatMessagesProvider callActive={callActive}>
118
- <ScreenShareProvider>
119
- <RTMConfigureBreakoutRoomProvider
120
- callActive={callActive}
121
- currentChannel={breakoutRoomRTCProps.channel}>
122
- <RtmConfigure room={RTM_ROOMS.BREAKOUT}>
123
- <UserPreferenceProvider callActive={callActive}>
124
- <CaptionProvider>
125
- <WaitingRoomProvider>
126
- <EventsConfigure
127
- setSttAutoStarted={setSttAutoStarted}
128
- sttAutoStarted={sttAutoStarted}
129
- callActive={callActive}>
130
- <ScreenshareConfigure
131
- isRecordingActive={isRecordingActive}>
132
- <LiveStreamContextProvider
133
- value={{
134
- setRtcProps:
135
- setBreakoutRoomRtcProps,
136
- rtcProps: breakoutRoomRTCProps,
137
- callActive,
138
- }}>
139
- <LiveStreamDataProvider>
140
- <LocalUserContext
141
- localUid={
142
- breakoutRoomRTCProps?.uid
143
- }>
144
- <RecordingProvider
145
- value={{
146
- setRecordingActive,
147
- isRecordingActive,
148
- callActive,
149
- recordingAutoStarted,
150
- setRecordingAutoStarted,
151
- }}>
152
- <NetworkQualityProvider>
153
- {!isMobileUA() && (
154
- <PermissionHelper />
155
- )}
156
- <UserActionMenuProvider>
157
- <VBProvider>
158
- <BeautyEffectProvider>
159
- <SdkMuteToggleListener>
160
- <VideoMeetingDataProvider>
161
- <VideoCallProvider>
162
- <DisableChatProvider>
163
- <RaiseHandProvider>
164
- <BreakoutRoomProvider
165
- mainChannel={
166
- rtcProps.channel
167
- }
168
- handleLeaveBreakout={
169
- onLeave
170
- }>
171
- <BreakoutRoomEventsConfigure
172
- mainChannelName={
173
- rtcProps.channel
174
- }>
175
- <VideoCallScreenWrapper />
176
- </BreakoutRoomEventsConfigure>
177
- </BreakoutRoomProvider>
178
- </RaiseHandProvider>
179
- </DisableChatProvider>
180
- </VideoCallProvider>
181
- </VideoMeetingDataProvider>
182
- </SdkMuteToggleListener>
183
- </BeautyEffectProvider>
184
- </VBProvider>
185
- </UserActionMenuProvider>
186
- </NetworkQualityProvider>
187
- </RecordingProvider>
188
- </LocalUserContext>
189
- </LiveStreamDataProvider>
190
- </LiveStreamContextProvider>
191
- </ScreenshareConfigure>
192
- </EventsConfigure>
193
- </WaitingRoomProvider>
194
- </CaptionProvider>
195
- </UserPreferenceProvider>
196
- </RtmConfigure>
197
- </RTMConfigureBreakoutRoomProvider>
198
- </ScreenShareProvider>
199
- </ChatMessagesProvider>
200
- </SidePanelProvider>
201
- </FocusProvider>
202
- </LayoutProvider>
203
- </ChatNotificationProvider>
204
- </ChatUIControlsProvider>
205
- </VideoQualityContextProvider>
206
- </NoiseSupressionProvider>
207
- </DeviceConfigure>
208
- </RtcConfigure>
209
- </PropsProvider>
210
- );
211
- };
212
-
213
- export default BreakoutVideoCall;
@@ -1,211 +0,0 @@
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, {useState, useEffect, useRef, useCallback} from 'react';
14
- import {useParams, useLocation, useHistory} from '../../components/Router';
15
- import events from '../../rtm-events-api';
16
- import {BreakoutChannelJoinEventPayload} from '../../components/breakout-room/state/types';
17
- import {CallbacksInterface, RtcPropsInterface} from '../../../agora-rn-uikit';
18
- import VideoCall from '../VideoCall';
19
- import BreakoutVideoCall from './BreakoutVideoCall';
20
- import {BreakoutRoomEventNames} from '../../components/breakout-room/events/constants';
21
- import BreakoutRoomTransition from '../../components/breakout-room/ui/BreakoutRoomTransition';
22
- import Toast from '../../../react-native-toast-message';
23
- import {useMainRoomUserDisplayName} from '../../rtm/hooks/useMainRoomUserDisplayName';
24
- import {
25
- useSetBreakoutRoomInfo,
26
- BreakoutRoomInfoProvider,
27
- } from '../../components/room-info/useSetBreakoutRoomInfo';
28
-
29
- export interface VideoCallContentProps {
30
- callActive: boolean;
31
- setCallActive: React.Dispatch<React.SetStateAction<boolean>>;
32
- rtcProps: RtcPropsInterface;
33
- setRtcProps: React.Dispatch<React.SetStateAction<Partial<RtcPropsInterface>>>;
34
- callbacks: CallbacksInterface;
35
- styleProps: any;
36
- }
37
-
38
- const VideoCallContent: React.FC<VideoCallContentProps> = props => {
39
- const {phrase} = useParams<{phrase: string}>();
40
- const location = useLocation();
41
- const history = useHistory();
42
-
43
- // Room Info:
44
- const {setBreakoutRoomChannelInfo, clearBreakoutRoomChannelInfo} =
45
- useSetBreakoutRoomInfo();
46
-
47
- // Parse URL to determine current mode
48
- const searchParams = new URLSearchParams(location.search);
49
- const isBreakoutMode = searchParams.get('breakout') === 'true';
50
-
51
- const breakoutTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
52
-
53
- const mainRoomLocalUid = props.rtcProps.uid;
54
- const getDisplayName = useMainRoomUserDisplayName();
55
-
56
- // Breakout channel details (populated by RTM events)
57
- const [breakoutJoinChannelDetails, setBreakoutJoinChannelDetails] = useState<
58
- BreakoutChannelJoinEventPayload['data']['data'] | null
59
- >(null);
60
-
61
- // Track transition direction for better UX
62
- const [transitionDirection, setTransitionDirection] = useState<
63
- 'enter' | 'exit'
64
- >('exit');
65
-
66
- // Listen for breakout room join events
67
- useEffect(() => {
68
- const handleBreakoutJoin = (evtData: any) => {
69
- try {
70
- // Clear any existing timeout
71
- if (breakoutTimeoutRef.current) {
72
- clearTimeout(breakoutTimeoutRef.current);
73
- }
74
- // Process the event payload
75
- const {payload} = evtData;
76
- const data: BreakoutChannelJoinEventPayload = JSON.parse(payload);
77
- console.log('Breakout room join event received', data);
78
- if (data?.data?.act === 'CHAN_JOIN') {
79
- const {channel_name, mainUser, screenShare, chat, room_name} =
80
- data.data.data;
81
-
82
- // Set transition flag - component will unmount/remount when entering breakout
83
- sessionStorage.setItem('breakout_room_transition', 'true');
84
- console.log('Set breakout transition flag for channel join');
85
-
86
- // Set breakout state active
87
- history.push(`/${phrase}?breakout=true`);
88
- setBreakoutJoinChannelDetails(null);
89
- setTransitionDirection('enter'); // Set direction for entering
90
- // Add state after a delay to show transitioning screen
91
- breakoutTimeoutRef.current = setTimeout(() => {
92
- setBreakoutJoinChannelDetails(prev => ({
93
- ...prev,
94
- ...data.data.data,
95
- }));
96
- breakoutTimeoutRef.current = null;
97
- }, 800);
98
- let joinMessage = '';
99
- const sourceUid = data?.data?.srcuid;
100
- const senderName = getDisplayName(sourceUid);
101
- if (sourceUid === mainRoomLocalUid) {
102
- joinMessage = `You have joined room "${room_name}".`;
103
- } else {
104
- joinMessage = `Host: ${senderName} has moved you to room "${room_name}".`;
105
- }
106
- setTimeout(() => {
107
- Toast.show({
108
- leadingIconName: 'open-room',
109
- type: 'success',
110
- text1: joinMessage,
111
- visibilityTime: 3000,
112
- });
113
- }, 500);
114
- }
115
- } catch (error) {
116
- console.error('Failed to process breakout join event');
117
- }
118
- };
119
-
120
- // Register breakout join event listener
121
- events.on(
122
- BreakoutRoomEventNames.BREAKOUT_ROOM_JOIN_DETAILS,
123
- handleBreakoutJoin,
124
- );
125
-
126
- return () => {
127
- // Cleanup event listener
128
- events.off(
129
- BreakoutRoomEventNames.BREAKOUT_ROOM_JOIN_DETAILS,
130
- handleBreakoutJoin,
131
- );
132
- };
133
- }, [
134
- phrase,
135
- getDisplayName,
136
- mainRoomLocalUid,
137
- setBreakoutRoomChannelInfo,
138
- history,
139
- ]);
140
-
141
- // Cleanup on unmount
142
- useEffect(() => {
143
- return () => {
144
- if (breakoutTimeoutRef.current) {
145
- clearTimeout(breakoutTimeoutRef.current);
146
- }
147
- };
148
- }, []);
149
-
150
- // Handle leaving breakout room
151
- const handleLeaveBreakout = useCallback(() => {
152
- console.log('Leaving breakout room, returning to main room');
153
-
154
- // Clear breakout room info to return to main room
155
- clearBreakoutRoomChannelInfo();
156
-
157
- // Set direction for exiting
158
- setTransitionDirection('exit');
159
- // Clear breakout channel details to show transition
160
- setBreakoutJoinChannelDetails(null);
161
- // Navigate back to main room after a delay
162
- setTimeout(() => {
163
- history.push(`/${phrase}`);
164
- }, 800);
165
- }, [history, phrase, clearBreakoutRoomChannelInfo]);
166
-
167
- // Route protection: Prevent direct navigation to breakout route
168
- useEffect(() => {
169
- if (isBreakoutMode && !breakoutJoinChannelDetails) {
170
- // If user navigated to breakout route without valid channel details,
171
- // redirect to main room after a short delay to prevent infinite loops
172
- const redirectTimer = setTimeout(() => {
173
- console.log('Invalid breakout route access, redirecting to main room');
174
- history.replace(`/${phrase}`); // Use replace to prevent back navigation
175
- }, 2000); // Give 2s for legitimate transitions
176
-
177
- return () => clearTimeout(redirectTimer);
178
- }
179
- }, [isBreakoutMode, breakoutJoinChannelDetails, history, phrase]);
180
-
181
- // Conditional rendering based on URL params
182
- return (
183
- <>
184
- {isBreakoutMode ? (
185
- breakoutJoinChannelDetails?.channel_name ? (
186
- // Breakout Room Mode - Fresh component instance
187
- <BreakoutRoomInfoProvider>
188
- <BreakoutVideoCall
189
- key={`breakout-${breakoutJoinChannelDetails.channel_name}`}
190
- breakoutJoinChannelDetails={breakoutJoinChannelDetails}
191
- onLeave={handleLeaveBreakout}
192
- {...props}
193
- />
194
- </BreakoutRoomInfoProvider>
195
- ) : (
196
- <BreakoutRoomTransition
197
- direction={transitionDirection}
198
- onTimeout={() => {
199
- setBreakoutJoinChannelDetails(null);
200
- }}
201
- />
202
- )
203
- ) : (
204
- // Main Room Mode - Fresh component instance
205
- <VideoCall key={`main-${phrase}`} {...props} />
206
- )}
207
- </>
208
- );
209
- };
210
-
211
- export default VideoCallContent;