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.
- package/package.json +2 -2
- package/template/agora-rn-uikit/src/Utils/isBotUser.ts +1 -1
- package/template/android/app/build.gradle +0 -7
- package/template/bridge/rtc/webNg/RtcEngine.ts +2 -2
- package/template/bridge/rtm/web/Types.ts +0 -183
- package/template/bridge/rtm/web/index.ts +488 -450
- package/template/customization-api/typeDefinition.ts +0 -1
- package/template/defaultConfig.js +3 -4
- package/template/global.d.ts +0 -1
- package/template/ios/Podfile +0 -41
- package/template/package.json +5 -5
- package/template/src/AppRoutes.tsx +3 -3
- package/template/src/ai-agent/components/ControlButtons.tsx +1 -1
- package/template/src/assets/font-styles.css +1 -33
- package/template/src/assets/fonts/icomoon.ttf +0 -0
- package/template/src/assets/selection.json +1 -1
- package/template/src/atoms/ActionMenu.tsx +93 -13
- package/template/src/atoms/CustomIcon.tsx +1 -8
- package/template/src/atoms/DropDownMulti.tsx +80 -29
- package/template/src/atoms/Dropdown.tsx +0 -5
- package/template/src/atoms/Input.tsx +2 -1
- package/template/src/atoms/TertiaryButton.tsx +1 -1
- package/template/src/atoms/UserAvatar.tsx +1 -1
- package/template/src/components/ChatContext.ts +3 -5
- package/template/src/components/Controls.tsx +167 -208
- package/template/src/components/DeviceConfigure.tsx +1 -1
- package/template/src/components/EventsConfigure.tsx +168 -118
- package/template/src/components/Navbar.tsx +11 -14
- package/template/src/components/RTMConfigure.tsx +819 -32
- package/template/src/components/beauty-effect/useBeautyEffects.tsx +13 -50
- package/template/src/components/chat/chatConfigure.tsx +1 -7
- package/template/src/components/chat-messages/useChatMessages.tsx +11 -43
- package/template/src/components/controls/useControlPermissionMatrix.tsx +4 -32
- package/template/src/components/participants/AllHostParticipants.tsx +2 -10
- package/template/src/components/participants/Participant.tsx +1 -7
- package/template/src/components/participants/UserActionMenuOptions.tsx +2 -12
- package/template/src/components/precall/joinCallBtn.native.tsx +7 -2
- package/template/src/components/precall/joinCallBtn.tsx +7 -2
- package/template/src/components/precall/joinWaitingRoomBtn.native.tsx +16 -15
- package/template/src/components/precall/joinWaitingRoomBtn.tsx +31 -17
- package/template/src/components/precall/textInput.tsx +45 -22
- package/template/src/components/precall/usePreCall.tsx +7 -0
- package/template/src/components/recordings/RecordingsDateTable.tsx +2 -3
- package/template/src/components/room-info/useRoomInfo.tsx +5 -0
- package/template/src/components/useUserPreference.tsx +12 -39
- package/template/src/components/virtual-background/useVB.tsx +0 -18
- package/template/src/components/whiteboard/WhiteboardConfigure.tsx +0 -27
- package/template/src/language/default-labels/videoCallScreenLabels.ts +27 -11
- package/template/src/logger/AppBuilderLogger.tsx +3 -11
- package/template/src/pages/VideoCall.tsx +518 -171
- package/template/src/pages/video-call/ActionSheetContent.tsx +77 -77
- package/template/src/pages/video-call/SidePanelHeader.tsx +81 -53
- package/template/src/pages/video-call/VideoCallScreen.tsx +0 -18
- package/template/src/pages/video-call/VideoCallScreenWrapper.tsx +1 -0
- package/template/src/rtm/RTMEngine.ts +37 -262
- package/template/src/rtm/utils.ts +1 -68
- package/template/src/rtm-events/constants.ts +7 -40
- package/template/src/rtm-events-api/Events.ts +39 -158
- package/template/src/subComponents/ChatBubble.tsx +3 -3
- package/template/src/subComponents/ChatContainer.tsx +9 -19
- package/template/src/subComponents/LocalAudioMute.tsx +2 -2
- package/template/src/subComponents/LocalVideoMute.tsx +2 -2
- package/template/src/subComponents/SidePanelEnum.tsx +0 -1
- package/template/src/subComponents/caption/Caption.tsx +48 -7
- package/template/src/subComponents/caption/CaptionContainer.tsx +324 -51
- package/template/src/subComponents/caption/CaptionIcon.tsx +35 -34
- package/template/src/subComponents/caption/CaptionText.tsx +103 -2
- package/template/src/subComponents/caption/LanguageSelectorPopup.tsx +179 -69
- package/template/src/subComponents/caption/Transcript.tsx +46 -11
- package/template/src/subComponents/caption/TranscriptIcon.tsx +27 -35
- package/template/src/subComponents/caption/TranscriptText.tsx +78 -3
- package/template/src/subComponents/caption/proto/ptoto.js +38 -4
- package/template/src/subComponents/caption/proto/test.proto +34 -19
- package/template/src/subComponents/caption/useCaption.tsx +754 -11
- package/template/src/subComponents/caption/useSTTAPI.tsx +118 -205
- package/template/src/subComponents/caption/useStreamMessageUtils.native.ts +152 -33
- package/template/src/subComponents/caption/useStreamMessageUtils.ts +165 -34
- package/template/src/subComponents/caption/utils.ts +171 -3
- package/template/src/subComponents/chat/ChatSendButton.tsx +0 -1
- package/template/src/subComponents/screenshare/ScreenshareButton.tsx +0 -16
- package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +1 -1
- package/template/src/subComponents/waiting-rooms/WaitingRoomControls.tsx +4 -7
- package/template/src/utils/SdkEvents.ts +3 -0
- package/template/src/utils/useEndCall.ts +4 -4
- package/template/src/utils/useMuteToggleLocal.ts +10 -14
- package/template/src/utils/useSpeechToText.ts +31 -20
- package/template/bridge/rtm/web/index-legacy.ts +0 -540
- package/template/src/components/RTMConfigure-legacy.tsx +0 -848
- package/template/src/components/UserGlobalPreferenceProvider.tsx +0 -227
- package/template/src/components/breakout-room/BreakoutRoomPanel.tsx +0 -58
- package/template/src/components/breakout-room/context/BreakoutRoomContext.tsx +0 -2508
- package/template/src/components/breakout-room/events/BreakoutRoomEventsConfigure.tsx +0 -272
- package/template/src/components/breakout-room/events/constants.ts +0 -17
- package/template/src/components/breakout-room/hoc/BreakoutRoomNameRenderer.tsx +0 -68
- package/template/src/components/breakout-room/hooks/useBreakoutRoomExit.ts +0 -49
- package/template/src/components/breakout-room/state/reducer.ts +0 -522
- package/template/src/components/breakout-room/state/types.ts +0 -54
- package/template/src/components/breakout-room/ui/BreakoutMeetingTitle.tsx +0 -60
- package/template/src/components/breakout-room/ui/BreakoutRoomActionMenu.tsx +0 -136
- package/template/src/components/breakout-room/ui/BreakoutRoomAnnouncementModal.tsx +0 -135
- package/template/src/components/breakout-room/ui/BreakoutRoomGroupSettings.tsx +0 -588
- package/template/src/components/breakout-room/ui/BreakoutRoomMainRoomUsers.tsx +0 -142
- package/template/src/components/breakout-room/ui/BreakoutRoomMemberActionMenu.tsx +0 -122
- package/template/src/components/breakout-room/ui/BreakoutRoomParticipants.tsx +0 -124
- package/template/src/components/breakout-room/ui/BreakoutRoomRaiseHand.tsx +0 -65
- package/template/src/components/breakout-room/ui/BreakoutRoomRenameModal.tsx +0 -227
- package/template/src/components/breakout-room/ui/BreakoutRoomSettings.tsx +0 -140
- package/template/src/components/breakout-room/ui/BreakoutRoomTransition.tsx +0 -52
- package/template/src/components/breakout-room/ui/BreakoutRoomView.tsx +0 -193
- package/template/src/components/breakout-room/ui/ExitBreakoutRoomIconButton.tsx +0 -79
- package/template/src/components/breakout-room/ui/ParticipantManualAssignmentModal.tsx +0 -638
- package/template/src/components/breakout-room/ui/SelectParticipantAssignmentStrategy.tsx +0 -57
- package/template/src/components/common/Dividers.tsx +0 -53
- package/template/src/components/controls/toolbar-items/ExitBreakoutRoomToolbarItem.tsx +0 -13
- package/template/src/components/raise-hand/RaiseHandButton.tsx +0 -50
- package/template/src/components/raise-hand/RaiseHandProvider.tsx +0 -308
- package/template/src/components/raise-hand/index.ts +0 -14
- package/template/src/components/room-info/useCurrentRoomInfo.tsx +0 -42
- package/template/src/components/room-info/useSetBreakoutRoomInfo.tsx +0 -64
- package/template/src/pages/video-call/BreakoutVideoCall.tsx +0 -213
- package/template/src/pages/video-call/VideoCallContent.tsx +0 -211
- package/template/src/pages/video-call/VideoCallStateWrapper.tsx +0 -495
- package/template/src/rtm/RTMConfigureBreakoutRoomProvider.tsx +0 -882
- package/template/src/rtm/RTMConfigureMainRoomProvider.tsx +0 -757
- package/template/src/rtm/RTMCoreProvider.tsx +0 -419
- package/template/src/rtm/RTMGlobalStateProvider.tsx +0 -706
- package/template/src/rtm/RTMStatusBanner.tsx +0 -99
- package/template/src/rtm/constants.ts +0 -12
- package/template/src/rtm/hooks/useMainRoomUserDisplayName.ts +0 -45
- package/template/src/rtm/rtm-presence-utils.ts +0 -344
- package/template/src/subComponents/chat/ChatAnnouncementView.tsx +0 -65
- 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;
|