agora-appbuilder-core 4.0.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. package/package.json +3 -3
  2. package/template/.bundle/config +2 -0
  3. package/template/Gemfile +4 -0
  4. package/template/Gulpfile.js +29 -29
  5. package/template/_eslintrc.js +3 -3
  6. package/template/_gitignore +12 -11
  7. package/template/_package-lock.json +28491 -23647
  8. package/template/_prettierrc.js +2 -2
  9. package/template/agora-rn-uikit/.eslintrc.js +5 -0
  10. package/template/agora-rn-uikit/package.json +14 -14
  11. package/template/agora-rn-uikit/src/AgoraUIKit.tsx +6 -6
  12. package/template/agora-rn-uikit/src/Contexts/ContentContext.tsx +10 -0
  13. package/template/agora-rn-uikit/src/Contexts/DispatchContext.tsx +22 -0
  14. package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +6 -6
  15. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +79 -38
  16. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +26 -17
  17. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +1 -0
  18. package/template/agora-rn-uikit/src/Controls/Icons.ts +45 -0
  19. package/template/agora-rn-uikit/src/Controls/Local/EndCall.tsx +6 -4
  20. package/template/agora-rn-uikit/src/Controls/Local/FullScreen.tsx +3 -1
  21. package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +5 -2
  22. package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +5 -2
  23. package/template/agora-rn-uikit/src/Controls/Local/Recording.tsx +0 -2
  24. package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +7 -6
  25. package/template/agora-rn-uikit/src/Controls/LocalControls.tsx +5 -5
  26. package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +5 -4
  27. package/template/agora-rn-uikit/src/Controls/Remote/RemoteSwap.tsx +3 -1
  28. package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +5 -4
  29. package/template/agora-rn-uikit/src/Controls/RemoteControls.tsx +2 -2
  30. package/template/agora-rn-uikit/src/Reducer/ActiveSpeaker.ts +30 -0
  31. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +8 -7
  32. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +8 -7
  33. package/template/agora-rn-uikit/src/Reducer/LocalPermissionState.ts +6 -7
  34. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +7 -8
  35. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +9 -9
  36. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +7 -8
  37. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +14 -13
  38. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +6 -7
  39. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +6 -7
  40. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +5 -6
  41. package/template/agora-rn-uikit/src/Reducer/UserPin.ts +20 -3
  42. package/template/agora-rn-uikit/src/Reducer/UserSecondaryPin.ts +23 -0
  43. package/template/agora-rn-uikit/src/Reducer/index.ts +2 -1
  44. package/template/agora-rn-uikit/src/Rtc/Create.tsx +138 -100
  45. package/template/agora-rn-uikit/src/Rtc/Join.tsx +55 -28
  46. package/template/agora-rn-uikit/src/RtcConfigure.tsx +177 -77
  47. package/template/agora-rn-uikit/src/Utils/isBotUser.ts +15 -0
  48. package/template/agora-rn-uikit/src/Utils/quality.tsx +8 -0
  49. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +56 -12
  50. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +47 -17
  51. package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +19 -11
  52. package/template/agora-rn-uikit/src/index.ts +15 -9
  53. package/template/android/app/build.gradle +59 -156
  54. package/template/android/app/src/debug/AndroidManifest.xml +6 -1
  55. package/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.java +7 -4
  56. package/template/android/app/src/main/AndroidManifest.xml +6 -19
  57. package/template/android/app/src/main/assets/fonts/icomoon.ttf +0 -0
  58. package/template/android/app/src/main/java/com/helloworld/MainActivity.java +17 -0
  59. package/template/android/app/src/main/java/com/helloworld/MainApplication.java +22 -36
  60. package/template/android/app/src/main/java/com/helloworld/SSLPinningFactory.java +30 -0
  61. package/template/android/app/src/main/res/values/strings.xml +3 -0
  62. package/template/android/app/src/release/java/com/helloworld/ReactNativeFlipper.java +20 -0
  63. package/template/android/build.gradle +19 -33
  64. package/template/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  65. package/template/android/gradle/wrapper/gradle-wrapper.properties +3 -2
  66. package/template/android/gradle.properties +18 -4
  67. package/template/android/gradlew +165 -104
  68. package/template/android/gradlew.bat +12 -23
  69. package/template/android/settings.gradle +1 -0
  70. package/template/bridge/rtc/webNg/RtcEngine.ts +200 -70
  71. package/template/bridge/rtc/webNg/{SurfaceView.tsx → RtcSurfaceView.tsx} +20 -26
  72. package/template/bridge/rtc/webNg/Types.ts +20 -5
  73. package/template/bridge/rtc/webNg/index.ts +81 -14
  74. package/template/bridge/rtm/web/index.ts +5 -3
  75. package/template/configTransform.js +16 -1
  76. package/template/customization-api/action-library.ts +4 -16
  77. package/template/customization-api/app-state.ts +15 -8
  78. package/template/customization-api/customEvents.ts +7 -2
  79. package/template/customization-api/customize.ts +1 -1
  80. package/template/customization-api/index.ts +4 -0
  81. package/template/customization-api/sub-components.ts +17 -16
  82. package/template/customization-api/temp.ts +52 -0
  83. package/template/customization-api/typeDefinition.ts +34 -46
  84. package/template/customization-api/types.ts +26 -0
  85. package/template/customization-api/utils.ts +4 -0
  86. package/template/customization-implementation/createHook.ts +24 -6
  87. package/template/customization-implementation/index.ts +1 -2
  88. package/template/customization-implementation/useCustomization.tsx +5 -7
  89. package/template/defaultConfig.js +72 -0
  90. package/template/global.d.ts +14 -1
  91. package/template/index.js +1 -4
  92. package/template/index.web.js +0 -5
  93. package/template/index.wsdk.tsx +1 -12
  94. package/template/ios/.xcode.env +11 -0
  95. package/template/ios/HelloWorld/AppDelegate.h +2 -4
  96. package/template/ios/HelloWorld/AppDelegate.mm +64 -0
  97. package/template/ios/HelloWorld/HelloWorldDebug.entitlements +10 -0
  98. package/template/ios/HelloWorld/Info.plist +8 -2
  99. package/template/ios/HelloWorld/main.m +2 -1
  100. package/template/ios/HelloWorld.xcodeproj/project.pbxproj +533 -17
  101. package/template/ios/HelloWorld.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  102. package/template/ios/HelloWorld.xcworkspace/contents.xcworkspacedata +10 -0
  103. package/template/ios/HelloWorld.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  104. package/template/ios/HelloWorldTests/HelloWorldTests.m +14 -13
  105. package/template/ios/HelloWorldTests/Info.plist +2 -2
  106. package/template/ios/Podfile +54 -20
  107. package/template/ios/Podfile.lock +809 -0
  108. package/template/ios/ScreenSharing/Info.plist +15 -0
  109. package/template/ios/ScreenSharing/SampleHandler.h +9 -0
  110. package/template/ios/ScreenSharing/SampleHandler.m +70 -0
  111. package/template/jest.config.js +4 -0
  112. package/template/metro.config.js +7 -32
  113. package/template/package.json +53 -39
  114. package/template/react-native-toast-message/index.d.ts +3 -1
  115. package/template/react-native-toast-message/index.js +1 -0
  116. package/template/react-native-toast-message/src/components/base/index.js +20 -32
  117. package/template/react-native-toast-message/src/components/base/styles.js +18 -21
  118. package/template/react-native-toast-message/src/components/checkbox.js +24 -19
  119. package/template/react-native-toast-message/src/index.js +3 -1
  120. package/template/react-native-toast-message/src/index.sdk.tsx +4 -1
  121. package/template/src/App.tsx +53 -69
  122. package/template/src/AppRoutes.tsx +90 -0
  123. package/template/src/AppWrapper.tsx +42 -25
  124. package/template/src/SDKAppWrapper.tsx +89 -57
  125. package/template/src/app-state/useLocalUserInfo.ts +3 -3
  126. package/template/src/app-state/useNoiseSupression.native.tsx +67 -0
  127. package/template/src/app-state/useNoiseSupression.tsx +107 -0
  128. package/template/src/app-state/useVideoQuality.tsx +39 -0
  129. package/template/src/assets/font-styles.css +175 -3
  130. package/template/src/assets/fonts/icomoon.ttf +0 -0
  131. package/template/src/assets/selection.json +1 -1
  132. package/template/src/atoms/ActionMenu.tsx +50 -11
  133. package/template/src/atoms/Avatar.tsx +51 -0
  134. package/template/src/atoms/Card.tsx +21 -8
  135. package/template/src/atoms/Carousel.native.tsx +105 -0
  136. package/template/src/atoms/Carousel.tsx +103 -0
  137. package/template/src/atoms/Checkbox.tsx +98 -0
  138. package/template/src/atoms/CircularProgress.tsx +0 -1
  139. package/template/src/atoms/ClipboardIconButton.tsx +91 -0
  140. package/template/src/atoms/CustomIcon.tsx +46 -0
  141. package/template/src/atoms/DropDownMulti.tsx +349 -0
  142. package/template/src/atoms/Dropdown.tsx +3 -3
  143. package/template/src/atoms/IconButton.tsx +52 -9
  144. package/template/src/atoms/ImageIcon.tsx +18 -5
  145. package/template/src/atoms/InlineNotification.tsx +81 -0
  146. package/template/src/atoms/InviteInfo.tsx +4 -4
  147. package/template/src/atoms/MeetingLink.tsx +160 -0
  148. package/template/src/atoms/ParticipantsCount.tsx +20 -8
  149. package/template/src/atoms/Popup.tsx +49 -27
  150. package/template/src/atoms/PrimaryButton.tsx +19 -5
  151. package/template/src/atoms/RecordingInfo.tsx +8 -5
  152. package/template/src/atoms/SecondaryButton.tsx +2 -0
  153. package/template/src/atoms/Spacer.tsx +1 -0
  154. package/template/src/atoms/TertiaryButton.tsx +35 -5
  155. package/template/src/atoms/TextInput.tsx +2 -1
  156. package/template/src/atoms/Toolbar.tsx +102 -0
  157. package/template/src/atoms/ToolbarItem.tsx +85 -0
  158. package/template/src/atoms/ToolbarMenu.tsx +40 -0
  159. package/template/src/atoms/ToolbarMenuItem.tsx +104 -0
  160. package/template/src/atoms/ToolbarPreset.tsx +71 -0
  161. package/template/src/atoms/Tooltip.tsx +30 -13
  162. package/template/src/atoms/pagination/Pagination.tsx +127 -0
  163. package/template/src/atoms/pagination/usePagination.tsx +88 -0
  164. package/template/src/auth/AuthProvider.tsx +500 -0
  165. package/template/src/auth/AuthRoute.tsx +94 -0
  166. package/template/src/auth/IDPAuth.electron.tsx +31 -0
  167. package/template/src/auth/IDPAuth.tsx +67 -0
  168. package/template/src/auth/IDPLogoutComponent.tsx +158 -0
  169. package/template/src/auth/UserCancelPopup.tsx +115 -0
  170. package/template/src/auth/config.ts +52 -0
  171. package/template/src/auth/openIDPURL.electron.tsx +39 -0
  172. package/template/src/auth/openIDPURL.native.tsx +51 -0
  173. package/template/src/auth/openIDPURL.tsx +20 -0
  174. package/template/src/auth/useIDPAuth.electron.tsx +65 -0
  175. package/template/src/auth/useIDPAuth.native.tsx +70 -0
  176. package/template/src/auth/useIDPAuth.tsx +63 -0
  177. package/template/src/auth/useTokenAuth.tsx +194 -0
  178. package/template/src/components/Chat.tsx +92 -72
  179. package/template/src/components/ChatContext.ts +2 -0
  180. package/template/src/components/ColorConfigure.tsx +0 -1
  181. package/template/src/components/CommonStyles.ts +9 -2
  182. package/template/src/components/Controls.tsx +914 -182
  183. package/template/src/components/Controls1.native.tsx +9 -5
  184. package/template/src/components/DeviceConfigure.native.tsx +2 -2
  185. package/template/src/components/DeviceConfigure.tsx +400 -149
  186. package/template/src/components/DeviceContext.tsx +2 -0
  187. package/template/src/components/EventsConfigure.tsx +722 -82
  188. package/template/src/components/GraphQLProvider.tsx +82 -39
  189. package/template/src/components/GridVideo.tsx +30 -16
  190. package/template/src/components/HostControlView.tsx +11 -14
  191. package/template/src/components/JoinPhrase.tsx +0 -1
  192. package/template/src/components/Leftbar.tsx +110 -0
  193. package/template/src/components/Navbar.tsx +305 -147
  194. package/template/src/components/NavbarMobile.tsx +119 -0
  195. package/template/src/components/Navigation.native.tsx +1 -15
  196. package/template/src/components/{Settings.native.tsx → Navigation.sdk.tsx} +17 -6
  197. package/template/src/components/NetworkQualityContext.tsx +12 -6
  198. package/template/src/components/ParticipantsView.tsx +63 -56
  199. package/template/src/components/PinnedVideo.tsx +191 -119
  200. package/template/src/components/Precall.native.tsx +177 -72
  201. package/template/src/components/Precall.tsx +247 -78
  202. package/template/src/components/RTMConfigure.tsx +205 -67
  203. package/template/src/components/Rightbar.tsx +112 -0
  204. package/template/src/components/Router.electron.ts +1 -0
  205. package/template/src/components/Router.native.ts +1 -0
  206. package/template/src/components/Router.sdk.ts +1 -0
  207. package/template/src/components/Router.ts +1 -0
  208. package/template/src/components/SdkApiContext.tsx +313 -0
  209. package/template/src/components/SdkMuteToggleListener.tsx +88 -0
  210. package/template/src/components/SessionContext.tsx +0 -1
  211. package/template/src/components/Settings.tsx +33 -4
  212. package/template/src/components/SettingsView.tsx +44 -9
  213. package/template/src/components/Share.tsx +152 -74
  214. package/template/src/components/StorageContext.tsx +23 -6
  215. package/template/src/components/ToastComponent.tsx +10 -1
  216. package/template/src/components/WhiteboardLayout.tsx +291 -0
  217. package/template/src/components/chat-messages/useChatMessages.tsx +454 -239
  218. package/template/src/components/chat-ui/{useChatUIControl.tsx → useChatUIControls.tsx} +29 -29
  219. package/template/src/components/common/Error.tsx +2 -0
  220. package/template/src/components/common/Logo.tsx +2 -2
  221. package/template/src/components/contexts/LiveStreamDataContext.tsx +13 -12
  222. package/template/src/components/contexts/ScreenShareContext.tsx +15 -1
  223. package/template/src/components/contexts/VideoMeetingDataContext.tsx +6 -6
  224. package/template/src/components/contexts/WaitingRoomContext.tsx +50 -0
  225. package/template/src/components/contexts/WhiteboardContext.tsx +54 -54
  226. package/template/src/components/disable-chat/useDisableChat.tsx +32 -0
  227. package/template/src/components/livestream/LiveStreamContext.tsx +314 -220
  228. package/template/src/components/livestream/Types.ts +36 -20
  229. package/template/src/components/livestream/views/LiveStreamAttendeeLandingTile.tsx +295 -0
  230. package/template/src/components/livestream/views/LiveStreamControls.tsx +5 -10
  231. package/template/src/components/meeting-info-invite/MeetingInfo.tsx +82 -0
  232. package/template/src/components/meeting-info-invite/MeetingInfoCardHeader.tsx +86 -0
  233. package/template/src/components/meeting-info-invite/MeetingInfoGridTile.tsx +218 -0
  234. package/template/src/components/meeting-info-invite/MeetingInfoLinks.tsx +122 -0
  235. package/template/src/components/participants/AllAudienceParticipants.tsx +19 -20
  236. package/template/src/components/participants/AllHostParticipants.tsx +20 -19
  237. package/template/src/components/participants/Participant.tsx +45 -16
  238. package/template/src/components/participants/ParticipantSectionTitle.tsx +5 -2
  239. package/template/src/components/participants/ScreenshareParticipants.tsx +17 -19
  240. package/template/src/components/participants/UserActionMenuOptions.tsx +173 -62
  241. package/template/src/components/participants/WaitingRoomParticipants.tsx +74 -0
  242. package/template/src/components/popups/InvitePopup.tsx +110 -45
  243. package/template/src/components/popups/StartScreenSharePopup.native.tsx +182 -0
  244. package/template/src/components/popups/StartScreenSharePopup.tsx +6 -0
  245. package/template/src/components/popups/StopRecordingPopup.tsx +11 -5
  246. package/template/src/components/popups/StopScreenSharePopup.native.tsx +135 -0
  247. package/template/src/components/popups/StopScreenSharePopup.tsx +6 -0
  248. package/template/src/components/popups/WhiteboardClearAllPopup.tsx +123 -0
  249. package/template/src/components/precall/LocalMute.tsx +69 -45
  250. package/template/src/components/precall/PermissionHelper.tsx +56 -28
  251. package/template/src/components/precall/PreCallSettings.tsx +1 -0
  252. package/template/src/components/precall/VideoFallback.tsx +173 -0
  253. package/template/src/components/precall/VideoPreview.native.tsx +19 -53
  254. package/template/src/components/precall/VideoPreview.tsx +29 -164
  255. package/template/src/components/precall/index.tsx +2 -0
  256. package/template/src/components/precall/joinCallBtn.native.tsx +12 -5
  257. package/template/src/components/precall/joinCallBtn.tsx +13 -4
  258. package/template/src/components/precall/joinWaitingRoomBtn.native.tsx +210 -0
  259. package/template/src/components/precall/joinWaitingRoomBtn.tsx +250 -0
  260. package/template/src/components/precall/meetingTitle.tsx +37 -11
  261. package/template/src/components/precall/selectDevice.tsx +5 -5
  262. package/template/src/components/precall/textInput.tsx +17 -19
  263. package/template/src/components/precall/usePreCall.tsx +33 -1
  264. package/template/src/components/recording-bot/RecordingBotRoute.tsx +42 -0
  265. package/template/src/components/recordings/RecordingsDateTable.tsx +62 -0
  266. package/template/src/components/recordings/RecordingsModal.tsx +135 -0
  267. package/template/src/components/recordings/ViewRecordingsModal.tsx +51 -0
  268. package/template/src/components/recordings/recording-table.tsx +154 -0
  269. package/template/src/components/recordings/style.ts +183 -0
  270. package/template/src/components/recordings/utils.ts +80 -0
  271. package/template/src/components/room-info/useRoomInfo.tsx +128 -0
  272. package/template/src/components/{meeting-info/useSetMeetingInfo.tsx → room-info/useSetRoomInfo.tsx} +12 -12
  273. package/template/src/components/useShareLink.tsx +28 -63
  274. package/template/src/components/useUserPreference.tsx +82 -16
  275. package/template/src/components/useVideoCall.tsx +93 -1
  276. package/template/src/components/virtual-background/VBButton.tsx +64 -0
  277. package/template/src/components/virtual-background/VBCard.native.tsx +282 -0
  278. package/template/src/components/virtual-background/VBCard.tsx +272 -0
  279. package/template/src/components/virtual-background/VBPanel.tsx +279 -0
  280. package/template/src/components/virtual-background/VButils.native.ts +37 -0
  281. package/template/src/components/virtual-background/VButils.ts +104 -0
  282. package/template/src/components/virtual-background/VideoPreview.native.tsx +43 -0
  283. package/template/src/components/virtual-background/VideoPreview.tsx +106 -0
  284. package/template/src/components/virtual-background/imagePaths.ts +87 -0
  285. package/template/src/components/virtual-background/images/beachImageBase64.ts +1 -0
  286. package/template/src/components/virtual-background/images/bedroomImageBase64.ts +1 -0
  287. package/template/src/components/virtual-background/images/bookImageBase64.ts +1 -0
  288. package/template/src/components/virtual-background/images/earthImageBase64.ts +1 -0
  289. package/template/src/components/virtual-background/images/index.ts +37 -0
  290. package/template/src/components/virtual-background/images/lampImageBase64.ts +1 -0
  291. package/template/src/components/virtual-background/images/mountainsImageBase64.ts +1 -0
  292. package/template/src/components/virtual-background/images/office1ImageBase64.ts +1 -0
  293. package/template/src/components/virtual-background/images/officeImageBase64.ts +1 -0
  294. package/template/src/components/virtual-background/images/plantsImageBase64.ts +1 -0
  295. package/template/src/components/virtual-background/images/skyImageBase64.ts +1 -0
  296. package/template/src/components/virtual-background/images/wallImageBase64.ts +1 -0
  297. package/template/src/components/virtual-background/useVB.native.tsx +185 -0
  298. package/template/src/components/virtual-background/useVB.tsx +267 -0
  299. package/template/src/components/whiteboard/StrokeWidthTool.tsx +137 -0
  300. package/template/src/components/whiteboard/WhiteboardButton.tsx +93 -0
  301. package/template/src/components/whiteboard/WhiteboardCanvas.tsx +99 -0
  302. package/template/src/components/whiteboard/WhiteboardConfigure.native.tsx +148 -0
  303. package/template/src/components/whiteboard/WhiteboardConfigure.tsx +446 -0
  304. package/template/src/components/whiteboard/WhiteboardCursor.tsx +152 -0
  305. package/template/src/components/whiteboard/WhiteboardToolBox.tsx +1246 -0
  306. package/template/src/components/whiteboard/WhiteboardView.native.tsx +188 -0
  307. package/template/src/components/whiteboard/WhiteboardView.tsx +81 -0
  308. package/template/src/components/whiteboard/WhiteboardWidget.tsx +685 -0
  309. package/template/src/components/whiteboard/WhiteboardWrapper.tsx +38 -0
  310. package/template/src/language/default-labels/commonLabels.ts +51 -14
  311. package/template/src/language/default-labels/createScreenLabels.ts +97 -17
  312. package/template/src/language/default-labels/joinScreenLabels.ts +45 -6
  313. package/template/src/language/default-labels/precallScreenLabels.ts +149 -25
  314. package/template/src/language/default-labels/shareLinkScreenLabels.ts +85 -37
  315. package/template/src/language/default-labels/videoCallScreenLabels.ts +1195 -158
  316. package/template/src/pages/Create.tsx +136 -106
  317. package/template/src/pages/Endcall.tsx +2 -2
  318. package/template/src/pages/Join.tsx +82 -40
  319. package/template/src/pages/Login.tsx +26 -0
  320. package/template/src/pages/VideoCall.tsx +329 -127
  321. package/template/src/pages/video-call/ActionSheet.native.tsx +54 -6
  322. package/template/src/pages/video-call/ActionSheet.tsx +55 -15
  323. package/template/src/pages/video-call/ActionSheetContent.tsx +498 -308
  324. package/template/src/pages/video-call/ActionSheetHandle.tsx +7 -1
  325. package/template/src/pages/video-call/DefaultLayouts.ts +20 -8
  326. package/template/src/pages/video-call/NameWithMicIcon.tsx +41 -64
  327. package/template/src/pages/video-call/PinchableView.tsx +119 -0
  328. package/template/src/pages/video-call/RenderComponent.tsx +14 -30
  329. package/template/src/pages/video-call/SidePanelHeader.tsx +227 -29
  330. package/template/src/pages/video-call/VideoCallMobileView.tsx +231 -89
  331. package/template/src/pages/video-call/VideoCallScreen.native.tsx +3 -2
  332. package/template/src/pages/video-call/VideoCallScreen.tsx +233 -84
  333. package/template/src/pages/video-call/VideoCallScreenWrapper.tsx +41 -0
  334. package/template/src/pages/video-call/VideoComponent.tsx +60 -8
  335. package/template/src/pages/video-call/VideoRenderer.tsx +343 -57
  336. package/template/src/pages/video-call/VisibilitySensor.tsx +104 -0
  337. package/template/src/pages/video-call/ZoomableWrapper.native.tsx +34 -0
  338. package/template/src/pages/video-call/ZoomableWrapper.tsx +5 -0
  339. package/template/src/pages/video-call/index.ts +42 -8
  340. package/template/src/rtm/RTMEngine.ts +17 -4
  341. package/template/src/rtm-events/constants.ts +21 -3
  342. package/template/src/rtm-events-api/Events.ts +7 -4
  343. package/template/src/rtm-events-api/LocalEvents.ts +14 -0
  344. package/template/src/rtm-events-api/types.ts +5 -5
  345. package/template/src/selection.json +1 -0
  346. package/template/src/subComponents/ChatBubble.tsx +87 -67
  347. package/template/src/subComponents/ChatContainer.tsx +70 -49
  348. package/template/src/subComponents/ChatInput.ios.tsx +32 -85
  349. package/template/src/subComponents/ChatInput.tsx +31 -80
  350. package/template/src/subComponents/Checkbox.native.tsx +46 -46
  351. package/template/src/subComponents/Checkbox.tsx +7 -6
  352. package/template/src/subComponents/CopyJoinInfo.tsx +31 -11
  353. package/template/src/subComponents/EndcallPopup.tsx +83 -12
  354. package/template/src/subComponents/FallbackLogo.tsx +2 -2
  355. package/template/src/subComponents/LanguageSelector.tsx +34 -30
  356. package/template/src/subComponents/LayoutIconButton.tsx +34 -17
  357. package/template/src/subComponents/LayoutIconDropdown.tsx +21 -8
  358. package/template/src/subComponents/Loading.tsx +60 -0
  359. package/template/src/subComponents/LocalAudioMute.tsx +87 -34
  360. package/template/src/subComponents/LocalEndCall.tsx +61 -24
  361. package/template/src/subComponents/LocalSwitchCamera.tsx +57 -13
  362. package/template/src/subComponents/LocalVideoMute.tsx +105 -36
  363. package/template/src/subComponents/LogoutButton.tsx +1 -1
  364. package/template/src/subComponents/NetworkQualityPill.tsx +22 -38
  365. package/template/src/subComponents/Recording.tsx +29 -9
  366. package/template/src/subComponents/RemoteAudioMute.tsx +5 -5
  367. package/template/src/subComponents/RemoteMutePopup.tsx +55 -14
  368. package/template/src/subComponents/RemoteVideoMute.tsx +5 -5
  369. package/template/src/subComponents/RemoveMeetingPopup.tsx +19 -6
  370. package/template/src/subComponents/RemoveScreensharePopup.tsx +20 -5
  371. package/template/src/subComponents/ScreenShareNotice.tsx +11 -6
  372. package/template/src/subComponents/SelectDevice.tsx +103 -34
  373. package/template/src/subComponents/SelectDeviceSettings.backup.tsx +9 -6
  374. package/template/src/subComponents/SidePanelButtons.ts +0 -3
  375. package/template/src/subComponents/SidePanelEnum.tsx +2 -0
  376. package/template/src/subComponents/SidePanelHeader.tsx +97 -63
  377. package/template/src/subComponents/ToastConfig.tsx +70 -61
  378. package/template/src/subComponents/caption/Caption.tsx +132 -0
  379. package/template/src/subComponents/caption/CaptionContainer.tsx +302 -0
  380. package/template/src/subComponents/caption/CaptionIcon.tsx +111 -0
  381. package/template/src/subComponents/caption/CaptionText.tsx +182 -0
  382. package/template/src/subComponents/caption/DownloadTranscriptBtn.tsx +65 -0
  383. package/template/src/subComponents/caption/LanguageSelectorPopup.tsx +192 -0
  384. package/template/src/subComponents/caption/Transcript.tsx +452 -0
  385. package/template/src/subComponents/caption/TranscriptIcon.tsx +123 -0
  386. package/template/src/subComponents/caption/TranscriptText.tsx +98 -0
  387. package/template/src/subComponents/caption/index.ts +3 -0
  388. package/template/src/subComponents/caption/proto/ptoto.js +91 -0
  389. package/template/src/subComponents/caption/proto/test.proto +23 -0
  390. package/template/src/subComponents/caption/useCaption.tsx +123 -0
  391. package/template/src/subComponents/caption/useCaptionWidth.ts +27 -0
  392. package/template/src/subComponents/caption/useSTTAPI.tsx +179 -0
  393. package/template/src/subComponents/caption/useStreamMessageUtils.native.ts +211 -0
  394. package/template/src/subComponents/caption/useStreamMessageUtils.ts +235 -0
  395. package/template/src/subComponents/caption/useTranscriptDownload.native.ts +63 -0
  396. package/template/src/subComponents/caption/useTranscriptDownload.ts +52 -0
  397. package/template/src/subComponents/caption/utils.ts +126 -0
  398. package/template/src/subComponents/chat/ChatParticipants.tsx +60 -24
  399. package/template/src/subComponents/livestream/ApprovedLiveStreamControlsView.tsx +2 -2
  400. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +19 -20
  401. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +66 -35
  402. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +3 -2
  403. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +10 -6
  404. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +28 -19
  405. package/template/src/subComponents/recording/useIsRecordingBot.tsx +38 -0
  406. package/template/src/subComponents/recording/useRecording.tsx +251 -138
  407. package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +0 -1
  408. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +39 -15
  409. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +275 -69
  410. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +193 -124
  411. package/template/src/subComponents/screenshare/useScreenshare.tsx +2 -0
  412. package/template/src/subComponents/waiting-rooms/WaitingRoomControls.tsx +85 -0
  413. package/template/src/subComponents/waiting-rooms/useWaitingRoomAPI.ts +75 -0
  414. package/template/src/theme/index.ts +13 -0
  415. package/template/src/utils/SdkEvents.ts +37 -14
  416. package/template/src/utils/SdkMethodEvents.ts +101 -0
  417. package/template/src/utils/axiomLogger.ts +117 -0
  418. package/template/src/utils/book.jpg +0 -0
  419. package/template/src/utils/common.tsx +118 -6
  420. package/template/src/utils/constants.ts +4 -0
  421. package/template/src/utils/getCustomRoute.ts +7 -0
  422. package/template/src/utils/index.tsx +34 -0
  423. package/template/src/utils/useActionSheet.tsx +50 -0
  424. package/template/src/utils/useActiveSpeaker.ts +38 -0
  425. package/template/src/utils/useAppState.ts +17 -0
  426. package/template/src/utils/useAsyncEffect.ts +138 -0
  427. package/template/src/utils/{useCreateMeeting.ts → useCreateRoom.ts} +27 -26
  428. package/template/src/utils/useEndCall.ts +65 -0
  429. package/template/src/utils/useFindActiveSpeaker.native.ts +4 -0
  430. package/template/src/utils/useFindActiveSpeaker.ts +335 -0
  431. package/template/src/utils/useGetMeetingPhrase.ts +10 -10
  432. package/template/src/utils/useIsAudioEnabled.ts +3 -3
  433. package/template/src/utils/useIsLocalUserSpeaking.native.ts +4 -0
  434. package/template/src/utils/useIsLocalUserSpeaking.ts +103 -0
  435. package/template/src/utils/useIsPSTN.ts +3 -3
  436. package/template/src/utils/useIsVideoEnabled.ts +3 -3
  437. package/template/src/utils/useJoinRoom.ts +199 -0
  438. package/template/src/utils/{useIsActiveSpeaker.ts → useLocalAudio.ts} +23 -12
  439. package/template/src/{components/OAuth.tsx → utils/useMenu.tsx} +16 -15
  440. package/template/src/utils/useModal.tsx +8 -0
  441. package/template/src/utils/useMutePSTN.ts +2 -2
  442. package/template/src/utils/useMuteToggleLocal.ts +121 -96
  443. package/template/src/utils/useRemoteEndCall.ts +4 -4
  444. package/template/src/utils/useRemoteEndScreenshare.ts +4 -4
  445. package/template/src/utils/useRemoteMute.ts +7 -7
  446. package/template/src/utils/useRemoteRequest.ts +7 -7
  447. package/template/src/utils/useSearchParams.tsx +18 -0
  448. package/template/src/utils/useString.ts +13 -3
  449. package/template/src/utils/useSwitchCamera.native.tsx +25 -0
  450. package/template/src/{subComponents/screenshare/ScreenshareButton.native.tsx → utils/useSwitchCamera.tsx} +12 -11
  451. package/template/src/utils/useToolbar.tsx +59 -0
  452. package/template/src/wasms/agora-virtual-background.wasm +0 -0
  453. package/template/static.d.ts +42 -0
  454. package/template/tsconfig_rsdk_index.json +3 -3
  455. package/template/tsconfig_wsdk_index.json +1 -1
  456. package/template/web/index.html +20 -0
  457. package/template/webpack.commons.js +21 -10
  458. package/template/webpack.rsdk.config.js +1 -2
  459. package/template/webpack.web.config.js +7 -3
  460. package/template/_buckconfig +0 -6
  461. package/template/_gitattributes +0 -1
  462. package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +0 -10
  463. package/template/agora-rn-uikit/src/Reducer/ActiveSpeakerDetected.ts +0 -11
  464. package/template/android/app/_BUCK +0 -55
  465. package/template/android/app/build_defs.bzl +0 -19
  466. package/template/bridge/rtc/webNg/LocalView.tsx +0 -20
  467. package/template/ios/HelloWorld/AppDelegate.m +0 -74
  468. package/template/src/components/OAuth.electron.tsx +0 -41
  469. package/template/src/components/OAuth.native.tsx +0 -55
  470. package/template/src/components/OAuthConfig.ts +0 -77
  471. package/template/src/components/StoreToken.tsx +0 -39
  472. package/template/src/components/meeting-info/useMeetingInfo.tsx +0 -70
  473. package/template/src/pages/video-call/CustomUserContextHolder.tsx +0 -20
  474. package/template/src/utils/useButtonTemplate.tsx +0 -44
  475. package/template/src/utils/useJoinMeeting.ts +0 -132
@@ -10,19 +10,34 @@
10
10
  *********************************************
11
11
  */
12
12
  import {createHook} from 'customization-implementation';
13
- import React, {useState, useEffect, useRef} from 'react';
14
- import {useRender, useRtc} from 'customization-api';
13
+ import React, {useState, useEffect, useRef, useContext} from 'react';
14
+ import {useContent, useRoomInfo} from 'customization-api';
15
15
  import {SidePanelType} from '../../subComponents/SidePanelEnum';
16
- import {useLocalUid, UidType, RenderInterface} from '../../../agora-rn-uikit';
17
- import events, {EventPersistLevel} from '../../rtm-events-api';
16
+ import {
17
+ useLocalUid,
18
+ UidType,
19
+ ContentInterface,
20
+ DispatchContext,
21
+ } from '../../../agora-rn-uikit';
22
+ import events, {PersistanceLevel} from '../../rtm-events-api';
18
23
  import {EventNames} from '../../rtm-events';
19
- import {useChatUIControl} from '../chat-ui/useChatUIControl';
24
+ import {ChatType, useChatUIControls} from '../chat-ui/useChatUIControls';
20
25
  import {useChatNotification} from '../chat-notification/useChatNotification';
21
26
  import Toast from '../../../react-native-toast-message';
22
27
  import {timeNow} from '../../rtm/utils';
23
28
  import {useSidePanel} from '../../utils/useSidePanel';
24
29
  import getUniqueID from '../../utils/getUniqueID';
25
30
  import {trimText} from '../../utils/common';
31
+ import {useStringRef} from '../../utils/useString';
32
+ import {
33
+ publicChatToastHeading,
34
+ multiplePublicChatToastHeading,
35
+ multiplePrivateChatToastHeading,
36
+ privateChatToastHeading,
37
+ multiplePublicAndPrivateChatToastHeading,
38
+ multiplePublicAndPrivateChatToastSubHeading,
39
+ multiplePublicChatToastSubHeading,
40
+ } from '../../language/default-labels/videoCallScreenLabels';
26
41
 
27
42
  enum ChatMessageActionEnum {
28
43
  Create = 'Create_Chat_Message',
@@ -32,6 +47,7 @@ enum ChatMessageActionEnum {
32
47
 
33
48
  interface ChatMessagesProviderProps {
34
49
  children: React.ReactNode;
50
+ callActive: boolean;
35
51
  }
36
52
  export interface messageInterface {
37
53
  createdTimestamp: number;
@@ -63,50 +79,89 @@ const ChatMessagesContext = React.createContext<ChatMessagesInterface>({
63
79
  });
64
80
 
65
81
  const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
66
- const {dispatch} = useRtc();
67
- const {renderList} = useRender();
68
- const localUid = useLocalUid();
69
- const {setSidePanel} = useSidePanel();
70
- const {
71
- groupActive,
72
- selectedChatUserId,
73
- setGroupActive,
74
- setPrivateActive,
75
- setSelectedChatUserId,
76
- } = useChatUIControl();
82
+ const isToastVisibleRef = useRef(false);
83
+ const previousNotificationRef = useRef([]);
84
+ const timeoutRef = useRef<any>();
85
+ const {callActive} = props;
77
86
  const {
78
- setUnreadGroupMessageCount,
79
- setUnreadIndividualMessageCount,
80
- unreadPrivateMessageCount,
81
- unreadIndividualMessageCount,
82
- setUnreadPrivateMessageCount,
83
- } = useChatNotification();
87
+ data: {isHost},
88
+ } = useRoomInfo();
89
+ const {dispatch} = useContext(DispatchContext);
90
+ const {defaultContent} = useContent();
91
+ const localUid = useLocalUid();
92
+ const {setSidePanel, sidePanel} = useSidePanel();
93
+ const {chatType, setChatType, privateChatUser, setPrivateChatUser} =
94
+ useChatUIControls();
95
+ const {setUnreadGroupMessageCount, setUnreadIndividualMessageCount} =
96
+ useChatNotification();
84
97
  const [messageStore, setMessageStore] = useState<messageStoreInterface[]>([]);
85
98
  const [privateMessageStore, setPrivateMessageStore] = useState<{
86
99
  [key: string]: messageStoreInterface[];
87
100
  }>({});
88
101
 
89
- const renderListRef = useRef({renderList: renderList});
90
- const groupActiveRef = useRef<boolean>();
102
+ const defaultContentRef = useRef({defaultContent: defaultContent});
103
+
104
+ const isHostRef = useRef({isHost: isHost});
105
+ const callActiveRef = useRef({callActive: callActive});
106
+
107
+ const groupActiveRef = useRef<boolean>(false);
91
108
  const individualActiveRef = useRef<string | number>();
92
109
 
93
- //commented for v1 release
94
- //const fromText = useString('messageSenderNotificationLabel');
95
- const fromText = (name: string) => `${name} commented in the public chat`;
96
- const privateMessageLabel = 'You’ve received a private message';
110
+ //public single
111
+ const fromText = useStringRef(publicChatToastHeading);
112
+
113
+ //public multple
114
+ const multiplePublicChatToastHeadingTT = useStringRef(
115
+ multiplePublicChatToastHeading,
116
+ );
117
+ //@ts-ignore
118
+ const multiplePublicChatToastSubHeadingTT = useStringRef<{
119
+ count: number;
120
+ from: string;
121
+ }>(multiplePublicChatToastSubHeading);
122
+
123
+ //private single
124
+ const privateMessageLabel = useStringRef(privateChatToastHeading);
125
+
126
+ //private multiple
127
+ //@ts-ignore
128
+ const multiplePrivateChatToastHeadingTT = useStringRef<{count: number}>(
129
+ multiplePrivateChatToastHeading,
130
+ );
131
+
132
+ //multiple private and public toast
133
+ const multiplePublicAndPrivateChatToastHeadingTT = useStringRef(
134
+ multiplePublicAndPrivateChatToastHeading,
135
+ );
136
+ //@ts-ignore
137
+ const multiplePublicAndPrivateChatToastSubHeadingTT = useStringRef<{
138
+ publicChatCount: number;
139
+ privateChatCount: number;
140
+ from: string;
141
+ }>(multiplePublicAndPrivateChatToastSubHeading);
142
+
143
+ useEffect(() => {
144
+ callActiveRef.current.callActive = callActive;
145
+ }, [callActive]);
146
+ useEffect(() => {
147
+ isHostRef.current.isHost = isHost;
148
+ }, [isHost]);
149
+
97
150
  useEffect(() => {
98
- renderListRef.current.renderList = renderList;
99
- }, [renderList]);
151
+ defaultContentRef.current.defaultContent = defaultContent;
152
+ }, [defaultContent]);
100
153
 
101
154
  useEffect(() => {
102
- groupActiveRef.current = groupActive;
103
- }, [groupActive]);
155
+ groupActiveRef.current =
156
+ chatType === ChatType.Group && sidePanel === SidePanelType.Chat;
157
+ }, [chatType, sidePanel]);
104
158
 
105
159
  useEffect(() => {
106
- individualActiveRef.current = selectedChatUserId;
107
- }, [selectedChatUserId]);
160
+ individualActiveRef.current = privateChatUser;
161
+ }, [privateChatUser]);
108
162
 
109
- const openPrivateChat = (uidAsNumber) => {
163
+ const allEqual = arr => arr.every(val => val === arr[0]);
164
+ const openPrivateChat = uidAsNumber => {
110
165
  //move this logic into ChatContainer
111
166
  // setUnreadPrivateMessageCount(
112
167
  // unreadPrivateMessageCount -
@@ -118,15 +173,15 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
118
173
  // [uidAsNumber]: 0,
119
174
  // };
120
175
  // });
121
- setGroupActive(false);
122
- setSelectedChatUserId(uidAsNumber);
123
- setPrivateActive(true);
176
+
177
+ setPrivateChatUser(uidAsNumber);
178
+ setChatType(ChatType.Private);
124
179
  setSidePanel(SidePanelType.Chat);
125
180
  };
126
181
 
127
182
  const updateRenderListState = (
128
183
  uid: number,
129
- data: Partial<RenderInterface>,
184
+ data: Partial<ContentInterface>,
130
185
  ) => {
131
186
  dispatch({type: 'UpdateRenderList', value: [uid, data]});
132
187
  };
@@ -136,6 +191,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
136
191
  msg: string,
137
192
  uid: string,
138
193
  isPrivateMessage: boolean = false,
194
+ forceStop: boolean = false,
139
195
  ) => {
140
196
  //don't show group message notification if group chat is open
141
197
  if (!isPrivateMessage && groupActiveRef.current) {
@@ -146,197 +202,356 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
146
202
  if (isPrivateMessage && uidAsNumber === individualActiveRef.current) {
147
203
  return;
148
204
  }
149
- Toast.show({
150
- primaryBtn: null,
151
- secondaryBtn: null,
152
- type: 'info',
153
- text1: isPrivateMessage
154
- ? privateMessageLabel
155
- : renderListRef.current.renderList[uidAsNumber]?.name
156
- ? fromText(
157
- trimText(renderListRef.current.renderList[uidAsNumber]?.name),
158
- )
159
- : '',
160
- text2: isPrivateMessage
161
- ? ''
162
- : msg.length > 30
163
- ? msg.slice(0, 30) + '...'
164
- : msg,
165
- visibilityTime: 3000,
166
- onPress: () => {
167
- if (isPrivateMessage) {
168
- openPrivateChat(uidAsNumber);
169
- } else {
170
- //move this logic into ChatContainer
171
- // setUnreadGroupMessageCount(0);
172
- setPrivateActive(false);
173
- setSelectedChatUserId(0);
174
- setGroupActive(true);
175
- setSidePanel(SidePanelType.Chat);
176
- }
177
- },
205
+ if (forceStop) {
206
+ return;
207
+ }
208
+ clearTimeout(timeoutRef.current);
209
+ isToastVisibleRef.current = true;
210
+ timeoutRef.current = setTimeout(() => {
211
+ isToastVisibleRef.current = false;
212
+ previousNotificationRef.current = [];
213
+ }, 3000);
214
+
215
+ previousNotificationRef.current.push({
216
+ isPrivateMessage: isPrivateMessage,
217
+ fromUid: isPrivateMessage ? uidAsNumber : 0,
218
+ from:
219
+ !isPrivateMessage &&
220
+ //@ts-ignore
221
+ defaultContentRef.current.defaultContent[uidAsNumber]?.name
222
+ ? trimText(
223
+ //@ts-ignore
224
+ defaultContentRef.current.defaultContent[uidAsNumber]?.name,
225
+ )
226
+ : '',
178
227
  });
179
- };
180
- events.on(EventNames.PUBLIC_CHAT_MESSAGE, (data) => {
181
- const payload = JSON.parse(data.payload);
182
- const messageAction = payload.action;
183
- const messageData = payload.value;
184
- switch (messageAction) {
185
- case ChatMessageActionEnum.Create:
186
- showMessageNotification(messageData.msg, `${data.sender}`);
187
- addMessageToStore(data.sender, {
188
- msg: messageData.msg,
189
- createdTimestamp: messageData.createdTimestamp,
190
- isDeleted: messageData.isDeleted,
191
- msgId: messageData.msgId,
192
- });
193
- /**
194
- * if chat group window is not active.
195
- * then we will increment the unread count
196
- */
197
- if (!groupActiveRef.current) {
198
- setUnreadGroupMessageCount((prevState) => {
199
- return prevState + 1;
200
- });
201
- }
202
- break;
203
- case ChatMessageActionEnum.Update:
204
- setMessageStore((prevState) => {
205
- const newState = prevState.map((item) => {
206
- if (
207
- item.msgId === messageData.msgId &&
208
- item.uid === data.sender
209
- ) {
210
- return {
211
- ...item,
212
- msg: messageData.msg,
213
- updatedTimestamp: messageData.updatedTimestamp,
214
- };
215
- } else {
216
- return item;
217
- }
218
- });
219
- return newState;
220
- });
221
- break;
222
- case ChatMessageActionEnum.Delete:
223
- setMessageStore((prevState) => {
224
- const newState = prevState.map((item) => {
225
- if (
226
- item.msgId === messageData.msgId &&
227
- item.uid === data.sender
228
- ) {
229
- return {
230
- ...item,
231
- isDeleted: true,
232
- updatedTimestamp: messageData.updatedTimestamp,
233
- };
234
- } else {
235
- return item;
236
- }
237
- });
238
- return newState;
239
- });
240
- break;
241
- default:
242
- break;
228
+
229
+ const privateMessages = previousNotificationRef.current.filter(
230
+ i => i.isPrivateMessage,
231
+ );
232
+ const publicMessages = previousNotificationRef.current.filter(
233
+ i => !i.isPrivateMessage,
234
+ );
235
+
236
+ //if 1 or more public and private messages
237
+ if (publicMessages && publicMessages.length > 1) {
238
+ const fromNamesArray = publicMessages
239
+ .filter(i => i.from !== undefined && i.from !== null && i.from !== '')
240
+ .map(i => i.from);
241
+ //removing the duplicate names
242
+ const fromNamesArrayUnique = [...new Set(fromNamesArray)];
243
+ //public chat with two name will seperated by "and"
244
+ //public chat with two or more name will have "and more" at the end
245
+ const fromNamesArrayUpdated =
246
+ fromNamesArrayUnique.length > 2
247
+ ? fromNamesArrayUnique
248
+ .slice(0, 2)
249
+ .map((i, index) => (index === 0 ? i + ', ' : i))
250
+ .concat(privateMessages?.length ? ', more' : ' and more')
251
+ : fromNamesArrayUnique.length == 2
252
+ ? fromNamesArrayUnique.map((i, index) =>
253
+ index === 0 ? i + ' and ' : i,
254
+ )
255
+ : fromNamesArrayUnique;
256
+ //converting the names array to string
257
+ const fromNames = fromNamesArrayUpdated.join('');
258
+ Toast.show({
259
+ //@ts-ignore
260
+ update: isToastVisibleRef.current ? true : false,
261
+ primaryBtn: null,
262
+ secondaryBtn: null,
263
+ type: 'info',
264
+ leadingIconName: 'chat-nav',
265
+ text1:
266
+ privateMessages && privateMessages.length
267
+ ? multiplePublicAndPrivateChatToastHeadingTT?.current()
268
+ : multiplePublicChatToastHeadingTT?.current(),
269
+ text2:
270
+ privateMessages && privateMessages.length
271
+ ? //@ts-ignore
272
+ multiplePublicAndPrivateChatToastSubHeadingTT?.current({
273
+ publicChatCount: publicMessages.length,
274
+ privateChatCount: privateMessages.length,
275
+ from: fromNames,
276
+ })
277
+ : //@ts-ignore
278
+ multiplePublicChatToastSubHeadingTT?.current({
279
+ count: publicMessages.length,
280
+ from: fromNames,
281
+ }),
282
+ visibilityTime: 3000,
283
+ onPress: () => {
284
+ if (isPrivateMessage) {
285
+ openPrivateChat(uidAsNumber);
286
+ } else {
287
+ //move this logic into ChatContainer
288
+ // setUnreadGroupMessageCount(0);
289
+ setPrivateChatUser(0);
290
+ setChatType(ChatType.Group);
291
+ setSidePanel(SidePanelType.Chat);
292
+ }
293
+ },
294
+ });
243
295
  }
244
- });
245
- events.on(EventNames.PRIVATE_CHAT_MESSAGE, (data) => {
246
- const payload = JSON.parse(data.payload);
247
- const messageAction = payload.action;
248
- const messageData = payload.value;
249
- switch (messageAction) {
250
- case ChatMessageActionEnum.Create:
251
- //To order chat participant based on recent message
252
- try {
253
- updateRenderListState(data.sender, {
254
- lastMessageTimeStamp: new Date().getTime(),
255
- });
256
- } catch (error) {
257
- console.log("ERROR : couldn't update the last message timestamp");
258
- }
259
- showMessageNotification(messageData.msg, `${data.sender}`, true);
260
- addMessageToPrivateStore(
261
- data.sender,
262
- {
296
+ //if one or more private message and no public messages
297
+ else if (privateMessages && privateMessages.length > 1) {
298
+ Toast.show({
299
+ //@ts-ignore
300
+ update: isToastVisibleRef.current ? true : false,
301
+ primaryBtn: null,
302
+ secondaryBtn: null,
303
+ type: 'info',
304
+ leadingIconName: 'chat-nav',
305
+ text1:
306
+ //@ts-ignore
307
+ multiplePrivateChatToastHeadingTT?.current({
308
+ count: privateMessages.length,
309
+ }),
310
+ text2: ``,
311
+ visibilityTime: 3000,
312
+ onPress: () => {
313
+ const openPrivateChatDetails = allEqual(
314
+ privateMessages.map(i => i.fromUid),
315
+ );
316
+ //if all private message comes from the single user then open details private chat
317
+ if (openPrivateChatDetails) {
318
+ openPrivateChat(privateMessages[0].fromUid);
319
+ }
320
+ //if private message comes from different user then open private tab not the private chatting window
321
+ else {
322
+ //open private tab (not the detail of private chat user)
323
+ setPrivateChatUser(0);
324
+ setChatType(ChatType.Group);
325
+ setSidePanel(SidePanelType.Chat);
326
+ }
327
+ },
328
+ });
329
+ }
330
+ //either 1 public or 1 private message
331
+ else {
332
+ Toast.show({
333
+ //@ts-ignore
334
+ update: isToastVisibleRef.current ? true : false,
335
+ primaryBtn: null,
336
+ secondaryBtn: null,
337
+ type: 'info',
338
+ leadingIconName: 'chat-nav',
339
+ text1: isPrivateMessage
340
+ ? privateMessageLabel?.current()
341
+ : //@ts-ignore
342
+ defaultContentRef.current.defaultContent[uidAsNumber]?.name
343
+ ? fromText?.current(
344
+ trimText(
345
+ //@ts-ignore
346
+ defaultContentRef.current.defaultContent[uidAsNumber]?.name,
347
+ ),
348
+ )
349
+ : '',
350
+ text2: isPrivateMessage
351
+ ? ''
352
+ : msg.length > 30
353
+ ? msg.slice(0, 30) + '...'
354
+ : msg,
355
+ visibilityTime: 3000,
356
+ onPress: () => {
357
+ if (isPrivateMessage) {
358
+ openPrivateChat(uidAsNumber);
359
+ } else {
360
+ //move this logic into ChatContainer
361
+ // setUnreadGroupMessageCount(0);
362
+ setPrivateChatUser(0);
363
+ setChatType(ChatType.Group);
364
+ setSidePanel(SidePanelType.Chat);
365
+ }
366
+ },
367
+ });
368
+ }
369
+ };
370
+ const unsubPublicChatMessage = events.on(
371
+ EventNames.PUBLIC_CHAT_MESSAGE,
372
+ data => {
373
+ const forceStop =
374
+ $config.ENABLE_WAITING_ROOM &&
375
+ !isHostRef.current.isHost &&
376
+ !callActiveRef.current.callActive;
377
+ //if call is not active don't store the message in the state
378
+ if (forceStop) {
379
+ return;
380
+ }
381
+ const payload = JSON.parse(data.payload);
382
+ const messageAction = payload.action;
383
+ const messageData = payload.value;
384
+ switch (messageAction) {
385
+ case ChatMessageActionEnum.Create:
386
+ showMessageNotification(
387
+ messageData.msg,
388
+ `${data.sender}`,
389
+ false,
390
+ forceStop,
391
+ );
392
+ addMessageToStore(data.sender, {
263
393
  msg: messageData.msg,
264
394
  createdTimestamp: messageData.createdTimestamp,
265
- msgId: messageData.msgId,
266
395
  isDeleted: messageData.isDeleted,
267
- },
268
- false,
269
- );
270
- /**
271
- * if user's private window is active.
272
- * then we will not increment the unread count
273
- */
274
-
275
- if (!(individualActiveRef.current === data.sender)) {
276
- setUnreadIndividualMessageCount((prevState) => {
277
- const prevCount =
278
- prevState && prevState[data.sender]
279
- ? prevState[data.sender]
280
- : 0;
281
- return {
282
- ...prevState,
283
- [data.sender]: prevCount + 1,
284
- };
396
+ msgId: messageData.msgId,
285
397
  });
286
- }
287
- break;
288
- case ChatMessageActionEnum.Update:
289
- setPrivateMessageStore((prevState) => {
290
- const privateChatOfUid = prevState[data.sender];
291
- const updatedData = privateChatOfUid.map((item) => {
292
- if (
293
- item.msgId === messageData.msgId &&
294
- item.uid === data.sender
295
- ) {
296
- return {
297
- ...item,
298
- msg: messageData.msg,
299
- updatedTimestamp: messageData.updatedTimestamp,
300
- };
301
- } else {
302
- return item;
303
- }
398
+ /**
399
+ * if chat group window is not active.
400
+ * then we will increment the unread count
401
+ */
402
+ if (!groupActiveRef.current) {
403
+ setUnreadGroupMessageCount(prevState => {
404
+ return prevState + 1;
405
+ });
406
+ }
407
+ break;
408
+ case ChatMessageActionEnum.Update:
409
+ setMessageStore(prevState => {
410
+ const newState = prevState.map(item => {
411
+ if (
412
+ item.msgId === messageData.msgId &&
413
+ item.uid === data.sender
414
+ ) {
415
+ return {
416
+ ...item,
417
+ msg: messageData.msg,
418
+ updatedTimestamp: messageData.updatedTimestamp,
419
+ };
420
+ } else {
421
+ return item;
422
+ }
423
+ });
424
+ return newState;
304
425
  });
305
- const newState = {
306
- ...prevState,
307
- [data.sender]: updatedData,
308
- };
309
- return newState;
310
- });
311
- break;
312
- case ChatMessageActionEnum.Delete:
313
- setPrivateMessageStore((prevState) => {
314
- const privateChatOfUid = prevState[data.sender];
315
- const updatedData = privateChatOfUid.map((item) => {
316
- if (
317
- item.msgId === messageData.msgId &&
318
- item.uid === data.sender
319
- ) {
426
+ break;
427
+ case ChatMessageActionEnum.Delete:
428
+ setMessageStore(prevState => {
429
+ const newState = prevState.map(item => {
430
+ if (
431
+ item.msgId === messageData.msgId &&
432
+ item.uid === data.sender
433
+ ) {
434
+ return {
435
+ ...item,
436
+ isDeleted: true,
437
+ updatedTimestamp: messageData.updatedTimestamp,
438
+ };
439
+ } else {
440
+ return item;
441
+ }
442
+ });
443
+ return newState;
444
+ });
445
+ break;
446
+ default:
447
+ break;
448
+ }
449
+ },
450
+ );
451
+
452
+ const unsubPrivateChatMessage = events.on(
453
+ EventNames.PRIVATE_CHAT_MESSAGE,
454
+ data => {
455
+ const payload = JSON.parse(data.payload);
456
+ const messageAction = payload.action;
457
+ const messageData = payload.value;
458
+ switch (messageAction) {
459
+ case ChatMessageActionEnum.Create:
460
+ //To order chat participant based on recent message
461
+ try {
462
+ updateRenderListState(data.sender, {
463
+ lastMessageTimeStamp: new Date().getTime(),
464
+ });
465
+ } catch (error) {
466
+ console.log("ERROR : couldn't update the last message timestamp");
467
+ }
468
+ showMessageNotification(messageData.msg, `${data.sender}`, true);
469
+ addMessageToPrivateStore(
470
+ data.sender,
471
+ {
472
+ msg: messageData.msg,
473
+ createdTimestamp: messageData.createdTimestamp,
474
+ msgId: messageData.msgId,
475
+ isDeleted: messageData.isDeleted,
476
+ },
477
+ false,
478
+ );
479
+ /**
480
+ * if user's private window is active.
481
+ * then we will not increment the unread count
482
+ */
483
+
484
+ if (!(individualActiveRef.current === data.sender)) {
485
+ setUnreadIndividualMessageCount(prevState => {
486
+ const prevCount =
487
+ prevState && prevState[data.sender]
488
+ ? prevState[data.sender]
489
+ : 0;
320
490
  return {
321
- ...item,
322
- isDeleted: true,
323
- updatedTimestamp: messageData.updatedTimestamp,
491
+ ...prevState,
492
+ [data.sender]: prevCount + 1,
324
493
  };
325
- } else {
326
- return item;
327
- }
494
+ });
495
+ }
496
+ break;
497
+ case ChatMessageActionEnum.Update:
498
+ setPrivateMessageStore(prevState => {
499
+ const privateChatOfUid = prevState[data.sender];
500
+ const updatedData = privateChatOfUid.map(item => {
501
+ if (
502
+ item.msgId === messageData.msgId &&
503
+ item.uid === data.sender
504
+ ) {
505
+ return {
506
+ ...item,
507
+ msg: messageData.msg,
508
+ updatedTimestamp: messageData.updatedTimestamp,
509
+ };
510
+ } else {
511
+ return item;
512
+ }
513
+ });
514
+ const newState = {
515
+ ...prevState,
516
+ [data.sender]: updatedData,
517
+ };
518
+ return newState;
328
519
  });
329
- const newState = {
330
- ...prevState,
331
- [data.sender]: updatedData,
332
- };
333
- return newState;
334
- });
335
- break;
336
- default:
337
- break;
338
- }
339
- });
520
+ break;
521
+ case ChatMessageActionEnum.Delete:
522
+ setPrivateMessageStore(prevState => {
523
+ const privateChatOfUid = prevState[data.sender];
524
+ const updatedData = privateChatOfUid.map(item => {
525
+ if (
526
+ item.msgId === messageData.msgId &&
527
+ item.uid === data.sender
528
+ ) {
529
+ return {
530
+ ...item,
531
+ isDeleted: true,
532
+ updatedTimestamp: messageData.updatedTimestamp,
533
+ };
534
+ } else {
535
+ return item;
536
+ }
537
+ });
538
+ const newState = {
539
+ ...prevState,
540
+ [data.sender]: updatedData,
541
+ };
542
+ return newState;
543
+ });
544
+ break;
545
+ default:
546
+ break;
547
+ }
548
+ },
549
+ );
550
+
551
+ return () => {
552
+ unsubPublicChatMessage();
553
+ unsubPrivateChatMessage();
554
+ };
340
555
  }, []);
341
556
 
342
557
  const addMessageToStore = (uid: UidType, body: messageInterface) => {
@@ -359,7 +574,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
359
574
  body: messageInterface,
360
575
  local: boolean,
361
576
  ) => {
362
- setPrivateMessageStore((state) => {
577
+ setPrivateMessageStore(state => {
363
578
  let newState = {...state};
364
579
  newState[uid] !== undefined
365
580
  ? (newState[uid] = [
@@ -403,7 +618,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
403
618
  value: messageData,
404
619
  action: ChatMessageActionEnum.Create,
405
620
  }),
406
- EventPersistLevel.LEVEL1,
621
+ PersistanceLevel.None,
407
622
  toUid,
408
623
  );
409
624
  addMessageToPrivateStore(toUid, messageData, true);
@@ -420,7 +635,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
420
635
  value: messageData,
421
636
  action: ChatMessageActionEnum.Create,
422
637
  }),
423
- EventPersistLevel.LEVEL1,
638
+ PersistanceLevel.None,
424
639
  );
425
640
  addMessageToStore(localUid, messageData);
426
641
  }
@@ -430,7 +645,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
430
645
  if (typeof msg == 'string' && msg.trim() === '') return;
431
646
  if (toUid) {
432
647
  const checkData = privateMessageStore[toUid].filter(
433
- (item) => item.msgId === msgId && item.uid === localUid,
648
+ item => item.msgId === msgId && item.uid === localUid,
434
649
  );
435
650
  if (checkData && checkData.length) {
436
651
  const editMsgData = {msg, updatedTimestamp: timeNow()};
@@ -440,12 +655,12 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
440
655
  value: {msgId, ...editMsgData},
441
656
  action: ChatMessageActionEnum.Update,
442
657
  }),
443
- EventPersistLevel.LEVEL1,
658
+ PersistanceLevel.None,
444
659
  toUid,
445
660
  );
446
- setPrivateMessageStore((prevState) => {
661
+ setPrivateMessageStore(prevState => {
447
662
  const privateChatOfUid = prevState[toUid];
448
- const updatedData = privateChatOfUid.map((item) => {
663
+ const updatedData = privateChatOfUid.map(item => {
449
664
  if (item.msgId === msgId) {
450
665
  return {...item, ...editMsgData};
451
666
  } else {
@@ -461,7 +676,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
461
676
  } else {
462
677
  //check if user has permission to edit
463
678
  const checkData = messageStore.filter(
464
- (item) => item.msgId === msgId && item.uid === localUid,
679
+ item => item.msgId === msgId && item.uid === localUid,
465
680
  );
466
681
  if (checkData && checkData.length) {
467
682
  const editMsgData = {msg, updatedTimestamp: timeNow()};
@@ -471,10 +686,10 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
471
686
  value: {msgId, ...editMsgData},
472
687
  action: ChatMessageActionEnum.Update,
473
688
  }),
474
- EventPersistLevel.LEVEL1,
689
+ PersistanceLevel.None,
475
690
  );
476
- setMessageStore((prevState) => {
477
- const newState = prevState.map((item) => {
691
+ setMessageStore(prevState => {
692
+ const newState = prevState.map(item => {
478
693
  if (item.msgId === msgId) {
479
694
  return {...item, ...editMsgData};
480
695
  } else {
@@ -492,7 +707,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
492
707
  const deleteChatMessage = (msgId: string, toUid?: UidType) => {
493
708
  if (toUid) {
494
709
  const checkData = privateMessageStore[toUid].filter(
495
- (item) => item.msgId === msgId && item.uid === localUid,
710
+ item => item.msgId === msgId && item.uid === localUid,
496
711
  );
497
712
  if (checkData && checkData.length) {
498
713
  const deleteMsgData = {updatedTimestamp: timeNow()};
@@ -502,12 +717,12 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
502
717
  value: {msgId, ...deleteMsgData},
503
718
  action: ChatMessageActionEnum.Delete,
504
719
  }),
505
- EventPersistLevel.LEVEL1,
720
+ PersistanceLevel.None,
506
721
  toUid,
507
722
  );
508
- setPrivateMessageStore((prevState) => {
723
+ setPrivateMessageStore(prevState => {
509
724
  const privateChatOfUid = prevState[toUid];
510
- const updatedData = privateChatOfUid.map((item) => {
725
+ const updatedData = privateChatOfUid.map(item => {
511
726
  if (item.msgId === msgId) {
512
727
  return {...item, isDeleted: true, ...deleteMsgData};
513
728
  } else {
@@ -523,7 +738,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
523
738
  } else {
524
739
  //check if user has permission to delete
525
740
  const checkData = messageStore.filter(
526
- (item) => item.msgId === msgId && item.uid === localUid,
741
+ item => item.msgId === msgId && item.uid === localUid,
527
742
  );
528
743
  if (checkData && checkData.length) {
529
744
  const deleteMsgData = {updatedTimestamp: timeNow()};
@@ -533,10 +748,10 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
533
748
  value: {msgId, ...deleteMsgData},
534
749
  action: ChatMessageActionEnum.Delete,
535
750
  }),
536
- EventPersistLevel.LEVEL1,
751
+ PersistanceLevel.None,
537
752
  );
538
- setMessageStore((prevState) => {
539
- const newState = prevState.map((item) => {
753
+ setMessageStore(prevState => {
754
+ const newState = prevState.map(item => {
540
755
  if (item.msgId === msgId) {
541
756
  return {...item, isDeleted: true, ...deleteMsgData};
542
757
  } else {