agora-appbuilder-core 2.2.0 → 2.3.0-beta.10
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/Readme.md +7 -1
- package/package.json +4 -3
- package/template/Gulpfile.js +389 -82
- package/template/_gitignore +4 -1
- package/template/_package-lock.json +32214 -3080
- package/template/agora-rn-uikit/src/AgoraUIKit.tsx +23 -20
- package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +13 -8
- package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +25 -9
- package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +10 -0
- package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +11 -5
- package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +6 -2
- package/template/agora-rn-uikit/src/Controls/ImageIcon.tsx +1 -1
- package/template/agora-rn-uikit/src/Controls/Local/EndCall.tsx +6 -2
- package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +2 -2
- package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +2 -2
- package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +6 -2
- package/template/agora-rn-uikit/src/Controls/LocalControls.tsx +11 -6
- package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +10 -6
- package/template/agora-rn-uikit/src/Controls/Remote/RemoteSwap.tsx +7 -6
- package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +6 -5
- package/template/agora-rn-uikit/src/Controls/RemoteControls.tsx +3 -3
- package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +16 -13
- package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +16 -13
- package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +13 -13
- package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +16 -13
- package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +28 -31
- package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +48 -35
- package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +11 -13
- package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +11 -13
- package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +18 -15
- package/template/agora-rn-uikit/src/Rtc/Create.tsx +22 -3
- package/template/agora-rn-uikit/src/Rtc/Join.tsx +19 -3
- package/template/agora-rn-uikit/src/RtcConfigure.tsx +161 -44
- package/template/agora-rn-uikit/src/Utils/useLocalUid.ts +8 -0
- package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +8 -6
- package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +8 -6
- package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +18 -9
- package/template/agora-rn-uikit/src/index.ts +12 -12
- package/template/babel.config.js +17 -1
- package/template/bridge/rtc/webNg/RtcEngine.ts +34 -28
- package/template/bridge/rtc/webNg/SurfaceView.tsx +3 -2
- package/template/bridge/rtc/webNg/Types.ts +14 -0
- package/template/bridge/rtc/webNg/index.ts +5 -2
- package/template/bridge/rtm/web/index.ts +13 -7
- package/template/electron-builder.js +3 -2
- package/template/esbuild.rsdk.go +240 -0
- package/template/{src/subComponents/LayoutEnum.tsx → esbuildConfigTransform.js} +1 -5
- package/template/fpe-api/components.ts +43 -0
- package/template/fpe-api/context.ts +45 -0
- package/template/fpe-api/fpeEvents.ts +9 -0
- package/template/fpe-api/index.ts +21 -0
- package/template/fpe-api/install.ts +138 -0
- package/template/fpe-api/typeDefinition.ts +144 -0
- package/template/fpe-api/useFpe.tsx +35 -0
- package/template/fpe-api/utils.ts +61 -0
- package/template/fpe-implementation/createHook.ts +33 -0
- package/template/fpe-implementation/dummyFpe.ts +17 -0
- package/template/fpe-implementation/index.ts +1 -0
- package/template/fpe-todo.txt +14 -0
- package/template/fpe.config.js +29 -0
- package/template/global.d.ts +4 -0
- package/template/index.rsdk.tsx +27 -0
- package/template/index.wsdk.tsx +27 -0
- package/template/package.json +30 -13
- package/template/react-native-toast-message/src/index.js +9 -10
- package/template/react-native-toast-message/src/index.wsdk.js +419 -0
- package/template/src/App.tsx +97 -65
- package/template/src/AppWrapper.tsx +79 -0
- package/template/src/SDKAppWrapper.tsx +67 -0
- package/template/src/atoms/PrimaryButton.tsx +14 -8
- package/template/src/atoms/TextInput.tsx +13 -5
- package/template/src/components/Chat.tsx +178 -137
- package/template/src/components/ChatContext.ts +18 -22
- package/template/src/components/ColorConfigure.tsx +2 -2
- package/template/src/components/Controls.native.tsx +72 -62
- package/template/src/components/Controls.tsx +90 -69
- package/template/src/components/DeviceConfigure.tsx +1 -1
- package/template/src/components/DeviceContext.tsx +14 -7
- package/template/src/components/GraphQLProvider.tsx +9 -2
- package/template/src/components/GridVideo.tsx +20 -159
- package/template/src/components/HostControlView.tsx +54 -15
- package/template/src/components/Navbar.tsx +408 -157
- package/template/src/components/NetworkQualityContext.tsx +29 -22
- package/template/src/components/ParticipantsView.tsx +91 -115
- package/template/src/components/PinnedVideo.tsx +41 -188
- package/template/src/components/Precall.native.tsx +131 -97
- package/template/src/components/Precall.tsx +193 -158
- package/template/src/components/RTMConfigure.tsx +309 -415
- package/template/src/components/Router.sdk.ts +20 -0
- package/template/src/components/SessionContext.tsx +6 -3
- package/template/src/components/Settings.native.tsx +3 -0
- package/template/src/components/Settings.tsx +65 -31
- package/template/src/components/SettingsView.tsx +14 -8
- package/template/src/components/Share.tsx +188 -220
- package/template/src/components/StorageContext.tsx +5 -5
- package/template/src/components/StoreToken.tsx +5 -1
- package/template/src/components/chat-messages/useChatMessages.tsx +208 -0
- package/template/src/components/chat-notification/useChatNotification.tsx +78 -0
- package/template/src/components/chat-ui/useChatUIControl.tsx +66 -0
- package/template/src/components/common/Error.tsx +54 -0
- package/template/src/components/common/Logo.tsx +35 -0
- package/template/src/components/common/index.tsx +8 -0
- package/template/src/components/contexts/LiveStreamDataContext.tsx +79 -0
- package/template/src/components/contexts/ScreenShareContext.tsx +47 -0
- package/template/src/components/contexts/WhiteboardContext.tsx +59 -0
- package/template/src/components/dimension/DimensionContext.ts +27 -0
- package/template/src/components/dimension/DimensionProvider.tsx +34 -0
- package/template/src/components/livestream/LiveStreamContext.tsx +297 -273
- package/template/src/components/livestream/Types.ts +26 -7
- package/template/src/components/livestream/index.ts +13 -2
- package/template/src/components/livestream/views/LiveStreamControls.tsx +5 -1
- package/template/src/components/meeting-info/useMeetingInfo.tsx +63 -0
- package/template/src/components/meeting-info/useSetMeetingInfo.tsx +38 -0
- package/template/src/components/participants/AllAudienceParticipants.tsx +26 -21
- package/template/src/components/participants/AllHostParticipants.tsx +41 -53
- package/template/src/components/participants/MeParticipant.tsx +9 -10
- package/template/src/components/participants/ParticipantName.tsx +2 -1
- package/template/src/components/participants/RemoteParticipants.tsx +3 -3
- package/template/src/components/precall/LocalMute.native.tsx +91 -0
- package/template/src/components/precall/LocalMute.tsx +90 -0
- package/template/src/components/precall/VideoPreview.native.tsx +35 -0
- package/template/src/components/precall/VideoPreview.tsx +33 -0
- package/template/src/components/precall/index.tsx +28 -0
- package/template/src/components/precall/joinCallBtn.native.tsx +69 -0
- package/template/src/components/precall/joinCallBtn.tsx +91 -0
- package/template/src/components/precall/meetingTitle.tsx +26 -0
- package/template/src/components/precall/selectDevice.tsx +46 -0
- package/template/src/components/precall/textInput.tsx +43 -0
- package/template/src/components/precall/usePreCall.tsx +41 -0
- package/template/src/components/styles.ts +20 -3
- package/template/src/components/useShareLink.tsx +237 -0
- package/template/src/components/useUserPreference.tsx +125 -0
- package/template/src/components/useWakeLock.tsx +3 -3
- package/template/src/custom-events/CustomEvents.ts +238 -0
- package/template/src/custom-events/index.tsx +4 -0
- package/template/src/custom-events/types.ts +51 -0
- package/template/src/language/default-labels/commonLabels.ts +21 -0
- package/template/src/language/default-labels/createScreenLabels.ts +22 -0
- package/template/src/language/default-labels/index.ts +38 -0
- package/template/src/language/default-labels/joinScreenLabels.ts +13 -0
- package/template/src/language/default-labels/precallScreenLabels.ts +33 -0
- package/template/src/language/default-labels/shareLinkScreenLabels.ts +44 -0
- package/template/src/language/default-labels/videoCallScreenLabels.ts +191 -0
- package/template/src/language/i18nTypes.ts +10 -0
- package/template/src/language/index.ts +18 -0
- package/template/src/language/useLanguage.tsx +92 -0
- package/template/src/pages/Authenticate.tsx +21 -15
- package/template/src/pages/Create.tsx +180 -159
- package/template/src/pages/Join.tsx +47 -32
- package/template/src/pages/VideoCall.tsx +138 -407
- package/template/src/pages/create/useCreate.tsx +37 -0
- package/template/src/pages/video-call/CustomLayout.ts +17 -0
- package/template/src/pages/video-call/CustomUserContextHolder.tsx +20 -0
- package/template/src/pages/video-call/DefaultLayouts.ts +65 -0
- package/template/src/pages/video-call/NameWithMicStatus.tsx +62 -0
- package/template/src/pages/video-call/RenderComponent.tsx +52 -0
- package/template/src/pages/video-call/VideoCallScreen.tsx +191 -0
- package/template/src/pages/video-call/VideoComponent.tsx +34 -0
- package/template/src/pages/video-call/VideoRenderer.tsx +86 -0
- package/template/src/pages/video-call/index.ts +20 -0
- package/template/src/rtm/RTMEngine.ts +58 -0
- package/template/src/rtm/utils.ts +44 -0
- package/template/src/rtm-events/EventUtils.ts +267 -0
- package/template/src/rtm-events/EventsQueue.ts +38 -0
- package/template/src/rtm-events/constants.ts +42 -0
- package/template/src/rtm-events/index.tsx +8 -0
- package/template/src/rtm-events/types.ts +7 -0
- package/template/src/subComponents/ChatBubble.tsx +21 -12
- package/template/src/subComponents/ChatContainer.tsx +79 -30
- package/template/src/subComponents/ChatInput.tsx +146 -70
- package/template/src/subComponents/CopyJoinInfo.tsx +52 -67
- package/template/src/subComponents/Error.tsx +35 -24
- package/template/src/subComponents/LanguageSelector.tsx +85 -0
- package/template/src/subComponents/LayoutIconDropdown.native.tsx +163 -0
- package/template/src/subComponents/LayoutIconDropdown.tsx +198 -0
- package/template/src/subComponents/LocalAudioMute.tsx +52 -30
- package/template/src/subComponents/LocalEndCall.tsx +52 -0
- package/template/src/subComponents/LocalSwitchCamera.tsx +61 -0
- package/template/src/subComponents/LocalVideoMute.tsx +48 -30
- package/template/src/subComponents/LogoutButton.tsx +20 -5
- package/template/src/subComponents/NetworkQualityPill.tsx +43 -13
- package/template/src/subComponents/OpenInNativeButton.tsx +3 -2
- package/template/src/subComponents/Recording.tsx +46 -138
- package/template/src/subComponents/RemoteAudioMute.tsx +30 -34
- package/template/src/subComponents/RemoteEndCall.tsx +18 -7
- package/template/src/subComponents/RemoteVideoMute.tsx +17 -9
- package/template/src/subComponents/ScreenShareNotice.tsx +40 -40
- package/template/src/subComponents/SelectDevice.tsx +88 -45
- package/template/src/subComponents/SelectOAuth.tsx +30 -6
- package/template/src/subComponents/SidePanelButtons.ts +39 -0
- package/template/src/subComponents/TextWithTooltip.native.tsx +2 -1
- package/template/src/subComponents/TextWithTooltip.tsx +15 -20
- package/template/src/subComponents/chat/ChatParticipants.tsx +31 -32
- package/template/src/subComponents/livestream/ApprovedLiveStreamControlsView.tsx +7 -3
- package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +32 -18
- package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +22 -8
- package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +12 -7
- package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -27
- package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +23 -26
- package/template/src/subComponents/livestream/index.ts +10 -2
- package/template/src/subComponents/recording/useRecording.tsx +209 -0
- package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +64 -0
- package/template/src/subComponents/screenshare/ScreenshareButton.native.tsx +18 -0
- package/template/src/subComponents/screenshare/ScreenshareButton.tsx +61 -31
- package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +57 -52
- package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +104 -144
- package/template/src/subComponents/screenshare/useScreenshare.tsx +29 -0
- package/template/src/subComponents/toastConfig.tsx +25 -20
- package/template/src/utils/IsAttendeeUser.ts +34 -0
- package/template/src/utils/SdkEvents.ts +68 -0
- package/template/src/utils/common.tsx +40 -0
- package/template/src/utils/eventEmitter.ts +29 -0
- package/template/src/utils/getMeetingInvite.ts +53 -0
- package/template/src/utils/index.tsx +11 -2
- package/template/src/utils/isAudioEnabled.ts +29 -0
- package/template/src/utils/isHostUser.ts +33 -0
- package/template/src/utils/isMobileOrTablet.native.ts +5 -0
- package/template/src/utils/{mobileWebTest.tsx → isMobileOrTablet.ts} +5 -2
- package/template/src/utils/isPSTNUser.ts +30 -0
- package/template/src/utils/isSDK.sdk.ts +5 -0
- package/template/src/utils/isSDK.ts +5 -0
- package/template/src/utils/isScreenShareUser.ts +31 -0
- package/template/src/utils/isVideoEnabled.ts +29 -0
- package/template/src/utils/useButtonTemplate.tsx +43 -0
- package/template/src/utils/useCreateMeeting.ts +74 -0
- package/template/src/utils/useGetLiveStreamingRequests.ts +24 -0
- package/template/src/utils/useGetMeetingPhrase.ts +68 -0
- package/template/src/utils/useGetName.ts +19 -0
- package/template/src/{subComponents/screenshare/ScreenshareContext.tsx → utils/useGroupMessages.ts} +10 -7
- package/template/src/utils/useJoinMeeting.ts +128 -0
- package/template/src/utils/useLayout.tsx +40 -0
- package/template/src/utils/useLiveStreamingUids.ts +26 -0
- package/template/src/utils/useLocalShareScreenUid.ts +19 -0
- package/template/src/utils/useMutePSTN.ts +43 -0
- package/template/src/utils/useMuteToggleLocal.ts +109 -0
- package/template/src/utils/useNavParams.ts +6 -0
- package/template/src/utils/useNavigateTo.ts +8 -0
- package/template/src/utils/usePrivateMessages.ts +33 -0
- package/template/src/utils/useRemoteEndCall.ts +27 -0
- package/template/src/utils/useRemoteMute.ts +64 -0
- package/template/src/utils/useSendControlMessage.ts +51 -0
- package/template/src/utils/useSendMessage.ts +40 -0
- package/template/src/utils/useSetName.ts +18 -0
- package/template/src/utils/useSetUnreadMessageCount.ts +43 -0
- package/template/src/utils/useSidePanel.tsx +41 -0
- package/template/src/utils/useString.ts +61 -0
- package/template/src/utils/useUnreadMessageCount.ts +50 -0
- package/template/src/utils/useUserList.ts +26 -0
- package/template/tsconfig.json +4 -4
- package/template/tsconfig_fpeApi.json +103 -0
- package/template/tsconfig_rsdk_index.json +105 -0
- package/template/tsconfig_wsdk_index.json +104 -0
- package/template/webpack.commons.js +40 -16
- package/template/webpack.main.config.js +2 -1
- package/template/webpack.renderer.config.js +1 -1
- package/template/webpack.rsdk.config.js +33 -0
- package/template/webpack.ts.config.js +89 -0
- package/template/webpack.web.config.js +8 -1
- package/template/webpack.wsdk.config.js +34 -0
- package/template/agora-rn-uikit/.git/HEAD +0 -1
- package/template/agora-rn-uikit/.git/config +0 -16
- package/template/agora-rn-uikit/.git/description +0 -1
- package/template/agora-rn-uikit/.git/hooks/applypatch-msg.sample +0 -15
- package/template/agora-rn-uikit/.git/hooks/commit-msg.sample +0 -24
- package/template/agora-rn-uikit/.git/hooks/fsmonitor-watchman.sample +0 -173
- package/template/agora-rn-uikit/.git/hooks/post-update.sample +0 -8
- package/template/agora-rn-uikit/.git/hooks/pre-applypatch.sample +0 -14
- package/template/agora-rn-uikit/.git/hooks/pre-commit.sample +0 -49
- package/template/agora-rn-uikit/.git/hooks/pre-merge-commit.sample +0 -13
- package/template/agora-rn-uikit/.git/hooks/pre-push.sample +0 -53
- package/template/agora-rn-uikit/.git/hooks/pre-rebase.sample +0 -169
- package/template/agora-rn-uikit/.git/hooks/pre-receive.sample +0 -24
- package/template/agora-rn-uikit/.git/hooks/prepare-commit-msg.sample +0 -42
- package/template/agora-rn-uikit/.git/hooks/push-to-checkout.sample +0 -78
- package/template/agora-rn-uikit/.git/hooks/update.sample +0 -128
- package/template/agora-rn-uikit/.git/index +0 -0
- package/template/agora-rn-uikit/.git/info/exclude +0 -6
- package/template/agora-rn-uikit/.git/logs/HEAD +0 -2
- package/template/agora-rn-uikit/.git/logs/refs/heads/ab-dev-auto +0 -1
- package/template/agora-rn-uikit/.git/logs/refs/heads/master +0 -1
- package/template/agora-rn-uikit/.git/logs/refs/remotes/origin/HEAD +0 -1
- package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.idx +0 -0
- package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.pack +0 -0
- package/template/agora-rn-uikit/.git/packed-refs +0 -24
- package/template/agora-rn-uikit/.git/refs/heads/ab-dev-auto +0 -1
- package/template/agora-rn-uikit/.git/refs/heads/master +0 -1
- package/template/agora-rn-uikit/.git/refs/remotes/origin/HEAD +0 -1
- package/template/agora-rn-uikit/.gitignore +0 -63
- package/template/agora-rn-uikit/package-lock.json +0 -7612
- package/template/agora-rn-uikit/src/Contexts/MaxUidContext.tsx +0 -7
- package/template/agora-rn-uikit/src/Contexts/MinUidContext.tsx +0 -8
- package/template/package-lock.json +0 -22923
- package/template/react-native-toast-message/.gitignore +0 -5
- package/template/react-native-toast-message/.npmignore +0 -5
- package/template/react-native-toast-message/package-lock.json +0 -10553
- package/template/src/.DS_Store +0 -0
- package/template/src/components/participants/context/ParticipantContext.tsx +0 -97
- package/template/src/subComponents/.DS_Store +0 -0
- package/template/src/subComponents/ScreenshareButton.tsx +0 -257
- package/template/src/subComponents/SwitchCamera.tsx +0 -35
- package/template/src/utils/hasBrandLogo.tsx +0 -3
- package/template/src/utils/mobileWebTest.native.tsx +0 -5
- package/template/src/utils/shouldAuthenticate.tsx +0 -7
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/*
|
|
2
|
+
********************************************
|
|
3
|
+
Copyright © 2022 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 {EventSourceEnum} from '../custom-events/types';
|
|
13
|
+
type TListener = <T>(t: T) => void;
|
|
14
|
+
type TListenerMetaData = {once: boolean; listener: TListener};
|
|
15
|
+
type TEventList = Map<string, TListenerMetaData[]>;
|
|
16
|
+
type TEvents = Record<EventSourceEnum, TEventList> | Record<string, never>;
|
|
17
|
+
|
|
18
|
+
const EventUtils = (function () {
|
|
19
|
+
'use strict';
|
|
20
|
+
|
|
21
|
+
let _events: TEvents = {};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Checks if the callback passed is valid listener or not
|
|
25
|
+
* @return {Boolean} true if callback passed is a function
|
|
26
|
+
* @api private
|
|
27
|
+
* @example : () => {} (or) {once: false, listener: () => {}}
|
|
28
|
+
*/
|
|
29
|
+
const _isValidListener = function (
|
|
30
|
+
listener: TListener | TListenerMetaData,
|
|
31
|
+
): boolean {
|
|
32
|
+
if (typeof listener === 'function') {
|
|
33
|
+
return true;
|
|
34
|
+
} else if (listener && typeof listener === 'object') {
|
|
35
|
+
// If listener is passed with additional meta data (addOnceListener API below), it will be of type object
|
|
36
|
+
return _isValidListener(listener.listener);
|
|
37
|
+
} else {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Returns the listener array for the specified event.
|
|
44
|
+
* Will initialise the event object and listener arrays if required.
|
|
45
|
+
* Each property in the object response is an array of listener functions.
|
|
46
|
+
*
|
|
47
|
+
* @param {String} evt Name of the event to return the listeners from.
|
|
48
|
+
* @param {String} source Name of the bucket to search events from
|
|
49
|
+
* @return {Function[]} All listener functions for the event with meta data.
|
|
50
|
+
* @api private
|
|
51
|
+
* @example : [] (or) [{once: false, listener: f}, {once: false, listener: f}...so on and so forth]
|
|
52
|
+
*/
|
|
53
|
+
const _getListeners = function (
|
|
54
|
+
evt: string,
|
|
55
|
+
source: EventSourceEnum,
|
|
56
|
+
): TListenerMetaData[] | [] {
|
|
57
|
+
let response: TListenerMetaData[] | [];
|
|
58
|
+
if (_events.hasOwnProperty(source)) {
|
|
59
|
+
if (_events[source].get(evt)) {
|
|
60
|
+
response = _events[source].get(evt);
|
|
61
|
+
} else {
|
|
62
|
+
_events[source].set(evt, []);
|
|
63
|
+
response = _events[source].get(evt);
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
_events[source] = new Map();
|
|
67
|
+
_events[source].set(evt, []);
|
|
68
|
+
response = _events[source].get(evt);
|
|
69
|
+
}
|
|
70
|
+
return response;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Fetches the requested listeners via getListeners but will always return the results inside an object.
|
|
75
|
+
* This is mainly for internal use but others may find it useful.
|
|
76
|
+
*
|
|
77
|
+
* @param {String} evt Name of the event to return the listeners from.
|
|
78
|
+
* @param {EventSourceEnum} source Name of the bucket to search events from
|
|
79
|
+
* @return {Object} All listener functions for an event in an object.
|
|
80
|
+
* @api private
|
|
81
|
+
* @example : {evt-name: [{once: false, listener: f}, {once: false, listener: f}...so on and so forth]
|
|
82
|
+
*/
|
|
83
|
+
const _getListenersAsObject = function (
|
|
84
|
+
evt: string,
|
|
85
|
+
source: EventSourceEnum,
|
|
86
|
+
): object {
|
|
87
|
+
const listeners = _getListeners(evt, source);
|
|
88
|
+
let response: any;
|
|
89
|
+
|
|
90
|
+
if (listeners instanceof Array) {
|
|
91
|
+
response = {};
|
|
92
|
+
response[evt] = listeners;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return response || listeners;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Finds the index of the listener for the event in its storage array.
|
|
100
|
+
*
|
|
101
|
+
* @param {Function[]} listeners Array of listeners to search through.
|
|
102
|
+
* @param {Function} listener Method to look for.
|
|
103
|
+
* @return {Number} Index of the specified listener, -1 if not found
|
|
104
|
+
* @api private
|
|
105
|
+
*/
|
|
106
|
+
const _indexOfListener = function (listeners: any, listener: any): number {
|
|
107
|
+
var i = listeners.length;
|
|
108
|
+
while (i--) {
|
|
109
|
+
if (listeners[i].listener.toString() === listener.toString()) {
|
|
110
|
+
return i;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return -1;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
getEvents(source: EventSourceEnum): TEvents | {} {
|
|
118
|
+
return _events[source] || (_events[source] = new Map());
|
|
119
|
+
},
|
|
120
|
+
/**
|
|
121
|
+
* Adds a listener function to the specified event.
|
|
122
|
+
* The listener will not be added if it is a duplicate.
|
|
123
|
+
*
|
|
124
|
+
* @param {String} evt Name of the event to attach the listener to.
|
|
125
|
+
* @param {Function} listener Method to be called when the event is emitted.
|
|
126
|
+
* @param {EventSourceEnum} source Name of the bucket to search events from
|
|
127
|
+
* @return {Object} Current instance of EventUtils
|
|
128
|
+
*/
|
|
129
|
+
addListener(evt: string, listener: any, source: EventSourceEnum): object {
|
|
130
|
+
if (!_isValidListener(listener)) {
|
|
131
|
+
throw new Error('Listener must be a function');
|
|
132
|
+
}
|
|
133
|
+
const listeners = _getListenersAsObject(evt, source);
|
|
134
|
+
const listenerIsWrapped = typeof listener === 'object';
|
|
135
|
+
|
|
136
|
+
for (let key in listeners) {
|
|
137
|
+
if (
|
|
138
|
+
listeners.hasOwnProperty(key) &&
|
|
139
|
+
_indexOfListener(listeners[key], listener) === -1
|
|
140
|
+
) {
|
|
141
|
+
listeners[key].push(
|
|
142
|
+
listenerIsWrapped
|
|
143
|
+
? listener
|
|
144
|
+
: {
|
|
145
|
+
listener: listener,
|
|
146
|
+
once: false,
|
|
147
|
+
},
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return this;
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Removes a listener function from the specified event.
|
|
156
|
+
*
|
|
157
|
+
* @param {String} evt Name of the event to remove the listener from.
|
|
158
|
+
* @param {Function} listenerToRemove Method to remove from the event.
|
|
159
|
+
* @param {EventSourceEnum} source Name of the bucket to search events from
|
|
160
|
+
* @return {Object} Current instance of EventUtils for chaining.
|
|
161
|
+
*/
|
|
162
|
+
removeListener(
|
|
163
|
+
evt: string,
|
|
164
|
+
listenerToRemove: TListener,
|
|
165
|
+
source: EventSourceEnum,
|
|
166
|
+
): Object {
|
|
167
|
+
let listeners = _getListenersAsObject(evt, source);
|
|
168
|
+
for (let key in listeners) {
|
|
169
|
+
if (listeners.hasOwnProperty(key)) {
|
|
170
|
+
let index = _indexOfListener(listeners[key], listenerToRemove);
|
|
171
|
+
if (index !== -1) {
|
|
172
|
+
listeners[key].splice(index, 1);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return this;
|
|
177
|
+
},
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Removes all listeners from a specified event.
|
|
181
|
+
* If you do not specify an event then all listeners will be removed.
|
|
182
|
+
* That means every event will be emptied.
|
|
183
|
+
*
|
|
184
|
+
* @param {String} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed.
|
|
185
|
+
* @param {EventSourceEnum} source Name of the bucket to search events from
|
|
186
|
+
* @return {Object} Current instance of EventUtils
|
|
187
|
+
*/
|
|
188
|
+
removeAllListeners(evt: string, source: EventSourceEnum): object {
|
|
189
|
+
let type = typeof evt;
|
|
190
|
+
let events = this.getEvents(source);
|
|
191
|
+
if (type === 'string') {
|
|
192
|
+
if (events.has(evt)) {
|
|
193
|
+
events.delete(evt);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return this;
|
|
197
|
+
},
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Removes all events and resets the state.
|
|
201
|
+
* That means every event will be emptied.
|
|
202
|
+
*
|
|
203
|
+
* @param {source} source source Name of the bucket to search events from
|
|
204
|
+
* @return {Object} Current instance of EventUtils
|
|
205
|
+
*/
|
|
206
|
+
removeAll(source: EventSourceEnum): object {
|
|
207
|
+
_events[source] = new Map();
|
|
208
|
+
return this;
|
|
209
|
+
},
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Emits an event of your choice.
|
|
213
|
+
* When emitted, every listener attached to that event will be executed.
|
|
214
|
+
* If you pass the optional argument array then those arguments will be passed to every listener upon execution.
|
|
215
|
+
* Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately.
|
|
216
|
+
* So they will not arrive within the array on the other side, they will be separate.
|
|
217
|
+
*
|
|
218
|
+
* @param {String} evt Name of the event to emit and execute listeners for.
|
|
219
|
+
* @param {Array} [args] Optional array of arguments to be passed to each listener.
|
|
220
|
+
* @return {Object} Current instance of EventUtils
|
|
221
|
+
*/
|
|
222
|
+
emitEvent(evt: string, args: any): object {
|
|
223
|
+
let listenersMap = _getListenersAsObject(
|
|
224
|
+
evt,
|
|
225
|
+
args.payload.source || EventSourceEnum.core,
|
|
226
|
+
);
|
|
227
|
+
let listeners: TListenerMetaData[];
|
|
228
|
+
let listener: TListenerMetaData;
|
|
229
|
+
for (let key in listenersMap) {
|
|
230
|
+
if (listenersMap.hasOwnProperty(key)) {
|
|
231
|
+
listeners = listenersMap[key].slice(0);
|
|
232
|
+
for (let i = 0; i < listeners.length; i++) {
|
|
233
|
+
// If the listener returns true then it shall be removed from the event
|
|
234
|
+
// The function is executed either with a basic call or an apply if there is an args array
|
|
235
|
+
listener = listeners[i];
|
|
236
|
+
|
|
237
|
+
if (listener.once === true) {
|
|
238
|
+
this.removeListener(evt, args.payload.source, listener.listener);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const newargs = [].slice.call(arguments, 1);
|
|
242
|
+
listener.listener.apply(this, newargs || []);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return this;
|
|
247
|
+
},
|
|
248
|
+
// 1. To add multiple listeners
|
|
249
|
+
// addListeners(evt: string, listeners: any) {
|
|
250
|
+
// if (Array.isArray(listeners)) {
|
|
251
|
+
// let i = listeners.length;
|
|
252
|
+
// while (i--) {
|
|
253
|
+
// this.addListener.call(this, evt, listeners[i]);
|
|
254
|
+
// }
|
|
255
|
+
// }
|
|
256
|
+
// },
|
|
257
|
+
// 2. To add only once listener
|
|
258
|
+
// addOnceListener(evt: string, listener: TListener) {
|
|
259
|
+
// return this.addListener(evt, {
|
|
260
|
+
// listener: listener,
|
|
261
|
+
// once: true,
|
|
262
|
+
// });
|
|
263
|
+
// },
|
|
264
|
+
};
|
|
265
|
+
})();
|
|
266
|
+
|
|
267
|
+
export default EventUtils;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/*
|
|
2
|
+
********************************************
|
|
3
|
+
Copyright © 2022 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
|
+
interface IQueueEvent {
|
|
14
|
+
data: any;
|
|
15
|
+
uid: number | string;
|
|
16
|
+
ts: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const EventsQueue = (function () {
|
|
20
|
+
'use strict';
|
|
21
|
+
|
|
22
|
+
let _eventsQueue: any = [];
|
|
23
|
+
|
|
24
|
+
return {
|
|
25
|
+
enqueue(q: IQueueEvent) {
|
|
26
|
+
_eventsQueue.push(q);
|
|
27
|
+
},
|
|
28
|
+
dequeue() {
|
|
29
|
+
if (_eventsQueue.length == 0) return;
|
|
30
|
+
_eventsQueue.shift();
|
|
31
|
+
},
|
|
32
|
+
printQueue() {
|
|
33
|
+
return _eventsQueue;
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
|
|
38
|
+
export default EventsQueue;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** ***** EVENTS ACTIONS BEGINS***** */
|
|
2
|
+
// 1. RECORDING
|
|
3
|
+
const RECORDING_STARTED = 'RECORDING_STARTED';
|
|
4
|
+
const RECORDING_STOPPED = 'RECORDING_STOPPED';
|
|
5
|
+
// 2. SCREENSHARE
|
|
6
|
+
const SCREENSHARE_STARTED = 'SCREENSHARE_STARTED';
|
|
7
|
+
const SCREENSHARE_STOPPED = 'SCREENSHARE_STOPPED';
|
|
8
|
+
|
|
9
|
+
const EventActions = {
|
|
10
|
+
RECORDING_STARTED,
|
|
11
|
+
RECORDING_STOPPED,
|
|
12
|
+
SCREENSHARE_STARTED,
|
|
13
|
+
SCREENSHARE_STOPPED,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/** ***** EVENTS ACTIONS ENDS ***** */
|
|
17
|
+
|
|
18
|
+
/** ***** EVENT NAMES BEGINS ***** */
|
|
19
|
+
// 1. RECORDING
|
|
20
|
+
const RECORDING_ATTRIBUTE = 'recording';
|
|
21
|
+
// 2. SCREENSHARE
|
|
22
|
+
const SCREENSHARE_ATTRIBUTE = 'screenshare';
|
|
23
|
+
// 2. LIVE STREAMING
|
|
24
|
+
const RAISED_ATTRIBUTE = 'raised';
|
|
25
|
+
const ROLE_ATTRIBUTE = 'role';
|
|
26
|
+
// 3. CHAT MESSAGES
|
|
27
|
+
const PUBLIC_CHAT_MESSAGE = 'PUBLIC_CHAT_MESSAGE';
|
|
28
|
+
const PRIVATE_CHAT_MESSAGE = 'PRIVATE_CHAT_MESSAGE';
|
|
29
|
+
// 4. NAME ATTRIBUTE
|
|
30
|
+
const NAME_ATTRIBUTE = 'name';
|
|
31
|
+
const EventNames = {
|
|
32
|
+
RECORDING_ATTRIBUTE,
|
|
33
|
+
RAISED_ATTRIBUTE,
|
|
34
|
+
ROLE_ATTRIBUTE,
|
|
35
|
+
PUBLIC_CHAT_MESSAGE,
|
|
36
|
+
PRIVATE_CHAT_MESSAGE,
|
|
37
|
+
SCREENSHARE_ATTRIBUTE,
|
|
38
|
+
NAME_ATTRIBUTE,
|
|
39
|
+
};
|
|
40
|
+
/** ***** EVENT NAMES ENDS ***** */
|
|
41
|
+
|
|
42
|
+
export {EventActions, EventNames};
|
|
@@ -10,31 +10,40 @@
|
|
|
10
10
|
*********************************************
|
|
11
11
|
*/
|
|
12
12
|
import React, {useContext} from 'react';
|
|
13
|
-
import {View, Text, StyleSheet, Linking
|
|
13
|
+
import {View, Text, StyleSheet, Linking} from 'react-native';
|
|
14
14
|
import Hyperlink from 'react-native-hyperlink';
|
|
15
|
-
import
|
|
15
|
+
import {useString} from '../utils/useString';
|
|
16
|
+
import {ChatBubbleProps} from '../components/ChatContext';
|
|
16
17
|
import ColorContext from '../components/ColorContext';
|
|
18
|
+
import {isWeb} from '../utils/common';
|
|
19
|
+
import useUserList from '../utils/useUserList';
|
|
17
20
|
|
|
18
|
-
const ChatBubble = (props:
|
|
19
|
-
const {
|
|
21
|
+
const ChatBubble = (props: ChatBubbleProps) => {
|
|
22
|
+
const {renderList} = useUserList();
|
|
20
23
|
const {primaryColor} = useContext(ColorContext);
|
|
21
|
-
let {isLocal,
|
|
24
|
+
let {isLocal, message, timestamp, uid} = props;
|
|
22
25
|
let time =
|
|
23
|
-
new Date(parseInt(
|
|
26
|
+
new Date(parseInt(timestamp)).getHours() +
|
|
24
27
|
':' +
|
|
25
|
-
new Date(parseInt(
|
|
28
|
+
new Date(parseInt(timestamp)).getMinutes();
|
|
26
29
|
const handleUrl = (url: string) => {
|
|
27
|
-
if (
|
|
30
|
+
if (isWeb) {
|
|
28
31
|
window.open(url, '_blank');
|
|
29
32
|
} else {
|
|
30
33
|
Linking.openURL(url);
|
|
31
34
|
}
|
|
32
35
|
};
|
|
33
|
-
|
|
36
|
+
//commented for v1 release
|
|
37
|
+
//const remoteUserDefaultLabel = useString('remoteUserDefaultLabel')();
|
|
38
|
+
const remoteUserDefaultLabel = 'User';
|
|
39
|
+
return props?.render ? (
|
|
40
|
+
props.render(isLocal, message, timestamp, uid)
|
|
41
|
+
) : (
|
|
34
42
|
<View>
|
|
35
43
|
<View style={isLocal ? style.chatSenderViewLocal : style.chatSenderView}>
|
|
36
44
|
<Text style={isLocal ? style.timestampTextLocal : style.timestampText}>
|
|
37
|
-
{
|
|
45
|
+
{renderList[uid] ? renderList[uid].name : remoteUserDefaultLabel} |{' '}
|
|
46
|
+
{time + ' '}
|
|
38
47
|
</Text>
|
|
39
48
|
</View>
|
|
40
49
|
<View
|
|
@@ -54,7 +63,7 @@ const ChatBubble = (props: channelMessage) => {
|
|
|
54
63
|
<Text
|
|
55
64
|
style={isLocal ? style.whiteText : style.blackText}
|
|
56
65
|
selectable={true}>
|
|
57
|
-
{
|
|
66
|
+
{message}
|
|
58
67
|
</Text>
|
|
59
68
|
</Hyperlink>
|
|
60
69
|
</View>
|
|
@@ -86,7 +95,7 @@ const style = StyleSheet.create({
|
|
|
86
95
|
fontWeight: '500',
|
|
87
96
|
fontSize: 12,
|
|
88
97
|
flex: 1,
|
|
89
|
-
|
|
98
|
+
textAlign: 'left',
|
|
90
99
|
},
|
|
91
100
|
timestampTextLocal: {
|
|
92
101
|
color: $config.PRIMARY_FONT_COLOR + '60',
|
|
@@ -9,21 +9,29 @@
|
|
|
9
9
|
information visit https://appbuilder.agora.io.
|
|
10
10
|
*********************************************
|
|
11
11
|
*/
|
|
12
|
-
import React, {
|
|
12
|
+
import React, {useRef} from 'react';
|
|
13
13
|
import {
|
|
14
14
|
View,
|
|
15
15
|
ScrollView,
|
|
16
16
|
StyleSheet,
|
|
17
|
-
TouchableOpacity,
|
|
18
17
|
Platform,
|
|
19
18
|
Text,
|
|
20
19
|
useWindowDimensions,
|
|
20
|
+
TouchableOpacity,
|
|
21
21
|
} from 'react-native';
|
|
22
22
|
import {RFValue} from 'react-native-responsive-fontsize';
|
|
23
23
|
import ChatBubble from './ChatBubble';
|
|
24
|
-
import
|
|
24
|
+
import {ChatBubbleProps} from '../components/ChatContext';
|
|
25
|
+
import {useLocalUid} from '../../agora-rn-uikit';
|
|
25
26
|
import {ImageIcon} from '../../agora-rn-uikit';
|
|
26
27
|
import TextWithTooltip from './TextWithTooltip';
|
|
28
|
+
import {useFpe} from 'fpe-api';
|
|
29
|
+
import {isValidReactComponent, isWeb} from '../utils/common';
|
|
30
|
+
import {useString} from '../utils/useString';
|
|
31
|
+
import {useChatUIControl} from '../components/chat-ui/useChatUIControl';
|
|
32
|
+
import useUserList from '../utils/useUserList';
|
|
33
|
+
import useGroupMessages from '../utils/useGroupMessages';
|
|
34
|
+
import usePrivateMessages from '../utils/usePrivateMessages';
|
|
27
35
|
|
|
28
36
|
/**
|
|
29
37
|
* Chat container is the component which renders all the chat messages
|
|
@@ -31,14 +39,53 @@ import TextWithTooltip from './TextWithTooltip';
|
|
|
31
39
|
* and maps it to a ChatBubble
|
|
32
40
|
*/
|
|
33
41
|
const ChatContainer = (props: any) => {
|
|
34
|
-
const {
|
|
42
|
+
const {renderList} = useUserList();
|
|
43
|
+
const messageStore = useGroupMessages();
|
|
44
|
+
const getPrivateMessage = usePrivateMessages();
|
|
45
|
+
const privateMessageStore = getPrivateMessage();
|
|
35
46
|
const {height, width} = useWindowDimensions();
|
|
36
|
-
const {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
47
|
+
const {selectPrivate} = props;
|
|
48
|
+
const {
|
|
49
|
+
privateActive,
|
|
50
|
+
selectedChatUserId: selectedUserID,
|
|
51
|
+
setPrivateActive,
|
|
52
|
+
} = useChatUIControl();
|
|
53
|
+
const localUid = useLocalUid();
|
|
54
|
+
//commented for v1 release
|
|
55
|
+
//const remoteUserDefaultLabel = useString('remoteUserDefaultLabel')();
|
|
56
|
+
const remoteUserDefaultLabel = 'User';
|
|
40
57
|
const scrollViewRef = useRef<ScrollView>(null);
|
|
41
58
|
|
|
59
|
+
const {ChatBubbleComponent} = useFpe((data) => {
|
|
60
|
+
let components: {
|
|
61
|
+
ChatBubbleComponent: React.ComponentType<ChatBubbleProps>;
|
|
62
|
+
} = {
|
|
63
|
+
ChatBubbleComponent: ChatBubble,
|
|
64
|
+
};
|
|
65
|
+
if (
|
|
66
|
+
data?.components?.videoCall &&
|
|
67
|
+
typeof data?.components?.videoCall === 'object'
|
|
68
|
+
) {
|
|
69
|
+
//commented for v1 release
|
|
70
|
+
if (
|
|
71
|
+
data?.components?.videoCall?.chat &&
|
|
72
|
+
typeof data?.components?.videoCall?.chat === 'object'
|
|
73
|
+
) {
|
|
74
|
+
if (
|
|
75
|
+
data?.components?.videoCall?.chat?.chatBubble &&
|
|
76
|
+
typeof data?.components?.videoCall?.chat?.chatBubble !== 'object' &&
|
|
77
|
+
isValidReactComponent(data?.components?.videoCall?.chat?.chatBubble)
|
|
78
|
+
) {
|
|
79
|
+
components.ChatBubbleComponent =
|
|
80
|
+
data?.components?.videoCall?.chat?.chatBubble;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return components;
|
|
85
|
+
});
|
|
86
|
+
//commented for v1 release
|
|
87
|
+
//const userOfflineLabel = useString('userOfflineLabel')();
|
|
88
|
+
const userOfflineLabel = 'User is offline';
|
|
42
89
|
return (
|
|
43
90
|
<View style={style.containerView}>
|
|
44
91
|
{privateActive && (
|
|
@@ -57,7 +104,11 @@ const ChatContainer = (props: any) => {
|
|
|
57
104
|
fontSize: RFValue(16, height > width ? height : width),
|
|
58
105
|
},
|
|
59
106
|
]}
|
|
60
|
-
value={
|
|
107
|
+
value={
|
|
108
|
+
renderList[selectedUserID]
|
|
109
|
+
? renderList[selectedUserID]?.name + ' '
|
|
110
|
+
: remoteUserDefaultLabel + ' '
|
|
111
|
+
}
|
|
61
112
|
/>
|
|
62
113
|
</View>
|
|
63
114
|
</TouchableOpacity>
|
|
@@ -68,35 +119,33 @@ const ChatContainer = (props: any) => {
|
|
|
68
119
|
scrollViewRef.current?.scrollToEnd({animated: true});
|
|
69
120
|
}}>
|
|
70
121
|
{!privateActive ? (
|
|
71
|
-
messageStore.map((message: any) =>
|
|
72
|
-
|
|
73
|
-
<
|
|
122
|
+
messageStore.map((message: any) => (
|
|
123
|
+
<>
|
|
124
|
+
<ChatBubbleComponent
|
|
74
125
|
isLocal={localUid === message.uid}
|
|
75
|
-
|
|
76
|
-
|
|
126
|
+
message={message.msg}
|
|
127
|
+
timestamp={message.ts}
|
|
77
128
|
uid={message.uid}
|
|
78
129
|
key={message.ts}
|
|
79
130
|
/>
|
|
80
|
-
|
|
81
|
-
|
|
131
|
+
</>
|
|
132
|
+
))
|
|
82
133
|
) : privateMessageStore[selectedUserID] ? (
|
|
83
|
-
privateMessageStore[selectedUserID].map((message: any) =>
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
);
|
|
93
|
-
})
|
|
134
|
+
privateMessageStore[selectedUserID].map((message: any) => (
|
|
135
|
+
<ChatBubbleComponent
|
|
136
|
+
isLocal={localUid === message.uid}
|
|
137
|
+
message={message.msg}
|
|
138
|
+
timestamp={message.ts}
|
|
139
|
+
uid={message.uid}
|
|
140
|
+
key={message.ts}
|
|
141
|
+
/>
|
|
142
|
+
))
|
|
94
143
|
) : (
|
|
95
144
|
<></>
|
|
96
145
|
)}
|
|
97
|
-
{
|
|
146
|
+
{renderList[selectedUserID]?.offline && (
|
|
98
147
|
<View style={style.infoTextView}>
|
|
99
|
-
<Text style={style.infoText}>
|
|
148
|
+
<Text style={style.infoText}>{userOfflineLabel}</Text>
|
|
100
149
|
</View>
|
|
101
150
|
)}
|
|
102
151
|
</ScrollView>
|
|
@@ -126,7 +175,7 @@ const style = StyleSheet.create({
|
|
|
126
175
|
alignSelf: 'flex-end',
|
|
127
176
|
},
|
|
128
177
|
name: {
|
|
129
|
-
fontWeight:
|
|
178
|
+
fontWeight: isWeb ? '500' : '700',
|
|
130
179
|
color: $config.PRIMARY_FONT_COLOR,
|
|
131
180
|
textAlign: 'left',
|
|
132
181
|
marginRight: 10,
|