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.
Files changed (303) hide show
  1. package/Readme.md +7 -1
  2. package/package.json +4 -3
  3. package/template/Gulpfile.js +389 -82
  4. package/template/_gitignore +4 -1
  5. package/template/_package-lock.json +32214 -3080
  6. package/template/agora-rn-uikit/src/AgoraUIKit.tsx +23 -20
  7. package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +13 -8
  8. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +25 -9
  9. package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +10 -0
  10. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +11 -5
  11. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +6 -2
  12. package/template/agora-rn-uikit/src/Controls/ImageIcon.tsx +1 -1
  13. package/template/agora-rn-uikit/src/Controls/Local/EndCall.tsx +6 -2
  14. package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +2 -2
  15. package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +2 -2
  16. package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +6 -2
  17. package/template/agora-rn-uikit/src/Controls/LocalControls.tsx +11 -6
  18. package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +10 -6
  19. package/template/agora-rn-uikit/src/Controls/Remote/RemoteSwap.tsx +7 -6
  20. package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +6 -5
  21. package/template/agora-rn-uikit/src/Controls/RemoteControls.tsx +3 -3
  22. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +16 -13
  23. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +16 -13
  24. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +13 -13
  25. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +16 -13
  26. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +28 -31
  27. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +48 -35
  28. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +11 -13
  29. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +11 -13
  30. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +18 -15
  31. package/template/agora-rn-uikit/src/Rtc/Create.tsx +22 -3
  32. package/template/agora-rn-uikit/src/Rtc/Join.tsx +19 -3
  33. package/template/agora-rn-uikit/src/RtcConfigure.tsx +161 -44
  34. package/template/agora-rn-uikit/src/Utils/useLocalUid.ts +8 -0
  35. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +8 -6
  36. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +8 -6
  37. package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +18 -9
  38. package/template/agora-rn-uikit/src/index.ts +12 -12
  39. package/template/babel.config.js +17 -1
  40. package/template/bridge/rtc/webNg/RtcEngine.ts +34 -28
  41. package/template/bridge/rtc/webNg/SurfaceView.tsx +3 -2
  42. package/template/bridge/rtc/webNg/Types.ts +14 -0
  43. package/template/bridge/rtc/webNg/index.ts +5 -2
  44. package/template/bridge/rtm/web/index.ts +13 -7
  45. package/template/electron-builder.js +3 -2
  46. package/template/esbuild.rsdk.go +240 -0
  47. package/template/{src/subComponents/LayoutEnum.tsx → esbuildConfigTransform.js} +1 -5
  48. package/template/fpe-api/components.ts +43 -0
  49. package/template/fpe-api/context.ts +45 -0
  50. package/template/fpe-api/fpeEvents.ts +9 -0
  51. package/template/fpe-api/index.ts +21 -0
  52. package/template/fpe-api/install.ts +138 -0
  53. package/template/fpe-api/typeDefinition.ts +144 -0
  54. package/template/fpe-api/useFpe.tsx +35 -0
  55. package/template/fpe-api/utils.ts +61 -0
  56. package/template/fpe-implementation/createHook.ts +33 -0
  57. package/template/fpe-implementation/dummyFpe.ts +17 -0
  58. package/template/fpe-implementation/index.ts +1 -0
  59. package/template/fpe-todo.txt +14 -0
  60. package/template/fpe.config.js +29 -0
  61. package/template/global.d.ts +4 -0
  62. package/template/index.rsdk.tsx +27 -0
  63. package/template/index.wsdk.tsx +27 -0
  64. package/template/package.json +30 -13
  65. package/template/react-native-toast-message/src/index.js +9 -10
  66. package/template/react-native-toast-message/src/index.wsdk.js +419 -0
  67. package/template/src/App.tsx +97 -65
  68. package/template/src/AppWrapper.tsx +79 -0
  69. package/template/src/SDKAppWrapper.tsx +67 -0
  70. package/template/src/atoms/PrimaryButton.tsx +14 -8
  71. package/template/src/atoms/TextInput.tsx +13 -5
  72. package/template/src/components/Chat.tsx +178 -137
  73. package/template/src/components/ChatContext.ts +18 -22
  74. package/template/src/components/ColorConfigure.tsx +2 -2
  75. package/template/src/components/Controls.native.tsx +72 -62
  76. package/template/src/components/Controls.tsx +90 -69
  77. package/template/src/components/DeviceConfigure.tsx +1 -1
  78. package/template/src/components/DeviceContext.tsx +14 -7
  79. package/template/src/components/GraphQLProvider.tsx +9 -2
  80. package/template/src/components/GridVideo.tsx +20 -159
  81. package/template/src/components/HostControlView.tsx +54 -15
  82. package/template/src/components/Navbar.tsx +408 -157
  83. package/template/src/components/NetworkQualityContext.tsx +29 -22
  84. package/template/src/components/ParticipantsView.tsx +91 -115
  85. package/template/src/components/PinnedVideo.tsx +41 -188
  86. package/template/src/components/Precall.native.tsx +131 -97
  87. package/template/src/components/Precall.tsx +193 -158
  88. package/template/src/components/RTMConfigure.tsx +309 -415
  89. package/template/src/components/Router.sdk.ts +20 -0
  90. package/template/src/components/SessionContext.tsx +6 -3
  91. package/template/src/components/Settings.native.tsx +3 -0
  92. package/template/src/components/Settings.tsx +65 -31
  93. package/template/src/components/SettingsView.tsx +14 -8
  94. package/template/src/components/Share.tsx +188 -220
  95. package/template/src/components/StorageContext.tsx +5 -5
  96. package/template/src/components/StoreToken.tsx +5 -1
  97. package/template/src/components/chat-messages/useChatMessages.tsx +208 -0
  98. package/template/src/components/chat-notification/useChatNotification.tsx +78 -0
  99. package/template/src/components/chat-ui/useChatUIControl.tsx +66 -0
  100. package/template/src/components/common/Error.tsx +54 -0
  101. package/template/src/components/common/Logo.tsx +35 -0
  102. package/template/src/components/common/index.tsx +8 -0
  103. package/template/src/components/contexts/LiveStreamDataContext.tsx +79 -0
  104. package/template/src/components/contexts/ScreenShareContext.tsx +47 -0
  105. package/template/src/components/contexts/WhiteboardContext.tsx +59 -0
  106. package/template/src/components/dimension/DimensionContext.ts +27 -0
  107. package/template/src/components/dimension/DimensionProvider.tsx +34 -0
  108. package/template/src/components/livestream/LiveStreamContext.tsx +297 -273
  109. package/template/src/components/livestream/Types.ts +26 -7
  110. package/template/src/components/livestream/index.ts +13 -2
  111. package/template/src/components/livestream/views/LiveStreamControls.tsx +5 -1
  112. package/template/src/components/meeting-info/useMeetingInfo.tsx +63 -0
  113. package/template/src/components/meeting-info/useSetMeetingInfo.tsx +38 -0
  114. package/template/src/components/participants/AllAudienceParticipants.tsx +26 -21
  115. package/template/src/components/participants/AllHostParticipants.tsx +41 -53
  116. package/template/src/components/participants/MeParticipant.tsx +9 -10
  117. package/template/src/components/participants/ParticipantName.tsx +2 -1
  118. package/template/src/components/participants/RemoteParticipants.tsx +3 -3
  119. package/template/src/components/precall/LocalMute.native.tsx +91 -0
  120. package/template/src/components/precall/LocalMute.tsx +90 -0
  121. package/template/src/components/precall/VideoPreview.native.tsx +35 -0
  122. package/template/src/components/precall/VideoPreview.tsx +33 -0
  123. package/template/src/components/precall/index.tsx +28 -0
  124. package/template/src/components/precall/joinCallBtn.native.tsx +69 -0
  125. package/template/src/components/precall/joinCallBtn.tsx +91 -0
  126. package/template/src/components/precall/meetingTitle.tsx +26 -0
  127. package/template/src/components/precall/selectDevice.tsx +46 -0
  128. package/template/src/components/precall/textInput.tsx +43 -0
  129. package/template/src/components/precall/usePreCall.tsx +41 -0
  130. package/template/src/components/styles.ts +20 -3
  131. package/template/src/components/useShareLink.tsx +237 -0
  132. package/template/src/components/useUserPreference.tsx +125 -0
  133. package/template/src/components/useWakeLock.tsx +3 -3
  134. package/template/src/custom-events/CustomEvents.ts +238 -0
  135. package/template/src/custom-events/index.tsx +4 -0
  136. package/template/src/custom-events/types.ts +51 -0
  137. package/template/src/language/default-labels/commonLabels.ts +21 -0
  138. package/template/src/language/default-labels/createScreenLabels.ts +22 -0
  139. package/template/src/language/default-labels/index.ts +38 -0
  140. package/template/src/language/default-labels/joinScreenLabels.ts +13 -0
  141. package/template/src/language/default-labels/precallScreenLabels.ts +33 -0
  142. package/template/src/language/default-labels/shareLinkScreenLabels.ts +44 -0
  143. package/template/src/language/default-labels/videoCallScreenLabels.ts +191 -0
  144. package/template/src/language/i18nTypes.ts +10 -0
  145. package/template/src/language/index.ts +18 -0
  146. package/template/src/language/useLanguage.tsx +92 -0
  147. package/template/src/pages/Authenticate.tsx +21 -15
  148. package/template/src/pages/Create.tsx +180 -159
  149. package/template/src/pages/Join.tsx +47 -32
  150. package/template/src/pages/VideoCall.tsx +138 -407
  151. package/template/src/pages/create/useCreate.tsx +37 -0
  152. package/template/src/pages/video-call/CustomLayout.ts +17 -0
  153. package/template/src/pages/video-call/CustomUserContextHolder.tsx +20 -0
  154. package/template/src/pages/video-call/DefaultLayouts.ts +65 -0
  155. package/template/src/pages/video-call/NameWithMicStatus.tsx +62 -0
  156. package/template/src/pages/video-call/RenderComponent.tsx +52 -0
  157. package/template/src/pages/video-call/VideoCallScreen.tsx +191 -0
  158. package/template/src/pages/video-call/VideoComponent.tsx +34 -0
  159. package/template/src/pages/video-call/VideoRenderer.tsx +86 -0
  160. package/template/src/pages/video-call/index.ts +20 -0
  161. package/template/src/rtm/RTMEngine.ts +58 -0
  162. package/template/src/rtm/utils.ts +44 -0
  163. package/template/src/rtm-events/EventUtils.ts +267 -0
  164. package/template/src/rtm-events/EventsQueue.ts +38 -0
  165. package/template/src/rtm-events/constants.ts +42 -0
  166. package/template/src/rtm-events/index.tsx +8 -0
  167. package/template/src/rtm-events/types.ts +7 -0
  168. package/template/src/subComponents/ChatBubble.tsx +21 -12
  169. package/template/src/subComponents/ChatContainer.tsx +79 -30
  170. package/template/src/subComponents/ChatInput.tsx +146 -70
  171. package/template/src/subComponents/CopyJoinInfo.tsx +52 -67
  172. package/template/src/subComponents/Error.tsx +35 -24
  173. package/template/src/subComponents/LanguageSelector.tsx +85 -0
  174. package/template/src/subComponents/LayoutIconDropdown.native.tsx +163 -0
  175. package/template/src/subComponents/LayoutIconDropdown.tsx +198 -0
  176. package/template/src/subComponents/LocalAudioMute.tsx +52 -30
  177. package/template/src/subComponents/LocalEndCall.tsx +52 -0
  178. package/template/src/subComponents/LocalSwitchCamera.tsx +61 -0
  179. package/template/src/subComponents/LocalVideoMute.tsx +48 -30
  180. package/template/src/subComponents/LogoutButton.tsx +20 -5
  181. package/template/src/subComponents/NetworkQualityPill.tsx +43 -13
  182. package/template/src/subComponents/OpenInNativeButton.tsx +3 -2
  183. package/template/src/subComponents/Recording.tsx +46 -138
  184. package/template/src/subComponents/RemoteAudioMute.tsx +30 -34
  185. package/template/src/subComponents/RemoteEndCall.tsx +18 -7
  186. package/template/src/subComponents/RemoteVideoMute.tsx +17 -9
  187. package/template/src/subComponents/ScreenShareNotice.tsx +40 -40
  188. package/template/src/subComponents/SelectDevice.tsx +88 -45
  189. package/template/src/subComponents/SelectOAuth.tsx +30 -6
  190. package/template/src/subComponents/SidePanelButtons.ts +39 -0
  191. package/template/src/subComponents/TextWithTooltip.native.tsx +2 -1
  192. package/template/src/subComponents/TextWithTooltip.tsx +15 -20
  193. package/template/src/subComponents/chat/ChatParticipants.tsx +31 -32
  194. package/template/src/subComponents/livestream/ApprovedLiveStreamControlsView.tsx +7 -3
  195. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +32 -18
  196. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +22 -8
  197. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +12 -7
  198. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -27
  199. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +23 -26
  200. package/template/src/subComponents/livestream/index.ts +10 -2
  201. package/template/src/subComponents/recording/useRecording.tsx +209 -0
  202. package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +64 -0
  203. package/template/src/subComponents/screenshare/ScreenshareButton.native.tsx +18 -0
  204. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +61 -31
  205. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +57 -52
  206. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +104 -144
  207. package/template/src/subComponents/screenshare/useScreenshare.tsx +29 -0
  208. package/template/src/subComponents/toastConfig.tsx +25 -20
  209. package/template/src/utils/IsAttendeeUser.ts +34 -0
  210. package/template/src/utils/SdkEvents.ts +68 -0
  211. package/template/src/utils/common.tsx +40 -0
  212. package/template/src/utils/eventEmitter.ts +29 -0
  213. package/template/src/utils/getMeetingInvite.ts +53 -0
  214. package/template/src/utils/index.tsx +11 -2
  215. package/template/src/utils/isAudioEnabled.ts +29 -0
  216. package/template/src/utils/isHostUser.ts +33 -0
  217. package/template/src/utils/isMobileOrTablet.native.ts +5 -0
  218. package/template/src/utils/{mobileWebTest.tsx → isMobileOrTablet.ts} +5 -2
  219. package/template/src/utils/isPSTNUser.ts +30 -0
  220. package/template/src/utils/isSDK.sdk.ts +5 -0
  221. package/template/src/utils/isSDK.ts +5 -0
  222. package/template/src/utils/isScreenShareUser.ts +31 -0
  223. package/template/src/utils/isVideoEnabled.ts +29 -0
  224. package/template/src/utils/useButtonTemplate.tsx +43 -0
  225. package/template/src/utils/useCreateMeeting.ts +74 -0
  226. package/template/src/utils/useGetLiveStreamingRequests.ts +24 -0
  227. package/template/src/utils/useGetMeetingPhrase.ts +68 -0
  228. package/template/src/utils/useGetName.ts +19 -0
  229. package/template/src/{subComponents/screenshare/ScreenshareContext.tsx → utils/useGroupMessages.ts} +10 -7
  230. package/template/src/utils/useJoinMeeting.ts +128 -0
  231. package/template/src/utils/useLayout.tsx +40 -0
  232. package/template/src/utils/useLiveStreamingUids.ts +26 -0
  233. package/template/src/utils/useLocalShareScreenUid.ts +19 -0
  234. package/template/src/utils/useMutePSTN.ts +43 -0
  235. package/template/src/utils/useMuteToggleLocal.ts +109 -0
  236. package/template/src/utils/useNavParams.ts +6 -0
  237. package/template/src/utils/useNavigateTo.ts +8 -0
  238. package/template/src/utils/usePrivateMessages.ts +33 -0
  239. package/template/src/utils/useRemoteEndCall.ts +27 -0
  240. package/template/src/utils/useRemoteMute.ts +64 -0
  241. package/template/src/utils/useSendControlMessage.ts +51 -0
  242. package/template/src/utils/useSendMessage.ts +40 -0
  243. package/template/src/utils/useSetName.ts +18 -0
  244. package/template/src/utils/useSetUnreadMessageCount.ts +43 -0
  245. package/template/src/utils/useSidePanel.tsx +41 -0
  246. package/template/src/utils/useString.ts +61 -0
  247. package/template/src/utils/useUnreadMessageCount.ts +50 -0
  248. package/template/src/utils/useUserList.ts +26 -0
  249. package/template/tsconfig.json +4 -4
  250. package/template/tsconfig_fpeApi.json +103 -0
  251. package/template/tsconfig_rsdk_index.json +105 -0
  252. package/template/tsconfig_wsdk_index.json +104 -0
  253. package/template/webpack.commons.js +40 -16
  254. package/template/webpack.main.config.js +2 -1
  255. package/template/webpack.renderer.config.js +1 -1
  256. package/template/webpack.rsdk.config.js +33 -0
  257. package/template/webpack.ts.config.js +89 -0
  258. package/template/webpack.web.config.js +8 -1
  259. package/template/webpack.wsdk.config.js +34 -0
  260. package/template/agora-rn-uikit/.git/HEAD +0 -1
  261. package/template/agora-rn-uikit/.git/config +0 -16
  262. package/template/agora-rn-uikit/.git/description +0 -1
  263. package/template/agora-rn-uikit/.git/hooks/applypatch-msg.sample +0 -15
  264. package/template/agora-rn-uikit/.git/hooks/commit-msg.sample +0 -24
  265. package/template/agora-rn-uikit/.git/hooks/fsmonitor-watchman.sample +0 -173
  266. package/template/agora-rn-uikit/.git/hooks/post-update.sample +0 -8
  267. package/template/agora-rn-uikit/.git/hooks/pre-applypatch.sample +0 -14
  268. package/template/agora-rn-uikit/.git/hooks/pre-commit.sample +0 -49
  269. package/template/agora-rn-uikit/.git/hooks/pre-merge-commit.sample +0 -13
  270. package/template/agora-rn-uikit/.git/hooks/pre-push.sample +0 -53
  271. package/template/agora-rn-uikit/.git/hooks/pre-rebase.sample +0 -169
  272. package/template/agora-rn-uikit/.git/hooks/pre-receive.sample +0 -24
  273. package/template/agora-rn-uikit/.git/hooks/prepare-commit-msg.sample +0 -42
  274. package/template/agora-rn-uikit/.git/hooks/push-to-checkout.sample +0 -78
  275. package/template/agora-rn-uikit/.git/hooks/update.sample +0 -128
  276. package/template/agora-rn-uikit/.git/index +0 -0
  277. package/template/agora-rn-uikit/.git/info/exclude +0 -6
  278. package/template/agora-rn-uikit/.git/logs/HEAD +0 -2
  279. package/template/agora-rn-uikit/.git/logs/refs/heads/ab-dev-auto +0 -1
  280. package/template/agora-rn-uikit/.git/logs/refs/heads/master +0 -1
  281. package/template/agora-rn-uikit/.git/logs/refs/remotes/origin/HEAD +0 -1
  282. package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.idx +0 -0
  283. package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.pack +0 -0
  284. package/template/agora-rn-uikit/.git/packed-refs +0 -24
  285. package/template/agora-rn-uikit/.git/refs/heads/ab-dev-auto +0 -1
  286. package/template/agora-rn-uikit/.git/refs/heads/master +0 -1
  287. package/template/agora-rn-uikit/.git/refs/remotes/origin/HEAD +0 -1
  288. package/template/agora-rn-uikit/.gitignore +0 -63
  289. package/template/agora-rn-uikit/package-lock.json +0 -7612
  290. package/template/agora-rn-uikit/src/Contexts/MaxUidContext.tsx +0 -7
  291. package/template/agora-rn-uikit/src/Contexts/MinUidContext.tsx +0 -8
  292. package/template/package-lock.json +0 -22923
  293. package/template/react-native-toast-message/.gitignore +0 -5
  294. package/template/react-native-toast-message/.npmignore +0 -5
  295. package/template/react-native-toast-message/package-lock.json +0 -10553
  296. package/template/src/.DS_Store +0 -0
  297. package/template/src/components/participants/context/ParticipantContext.tsx +0 -97
  298. package/template/src/subComponents/.DS_Store +0 -0
  299. package/template/src/subComponents/ScreenshareButton.tsx +0 -257
  300. package/template/src/subComponents/SwitchCamera.tsx +0 -35
  301. package/template/src/utils/hasBrandLogo.tsx +0 -3
  302. package/template/src/utils/mobileWebTest.native.tsx +0 -5
  303. package/template/src/utils/shouldAuthenticate.tsx +0 -7
@@ -0,0 +1,208 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {createHook} from 'fpe-implementation';
13
+ import React, {useState, useEffect, useRef} from 'react';
14
+ import {useRenderContext} from 'fpe-api';
15
+ import {SidePanelType} from '../../subComponents/SidePanelEnum';
16
+ import {useLocalUid, UidType} from '../../../agora-rn-uikit';
17
+ import CustomEvents from '../../custom-events';
18
+ import {EventNames} from '../../rtm-events';
19
+ import {useChatUIControl} from '../chat-ui/useChatUIControl';
20
+ import {useChatNotification} from '../chat-notification/useChatNotification';
21
+ import Toast from '../../../react-native-toast-message';
22
+ import {timeNow} from '../../rtm/utils';
23
+ import {useSidePanel} from '../../utils/useSidePanel';
24
+
25
+ interface ChatMessagesProviderProps {
26
+ children: React.ReactNode;
27
+ }
28
+ interface messageInterface {
29
+ ts: number;
30
+ msg: string;
31
+ }
32
+ interface messageStoreInterface extends messageInterface {
33
+ uid: UidType;
34
+ }
35
+
36
+ interface ChatMessagesInterface {
37
+ messageStore: messageStoreInterface | any;
38
+ privateMessageStore: any;
39
+ sendChatMessage: (msg: string, toUid?: UidType) => void;
40
+ }
41
+
42
+ const ChatMessagesContext = React.createContext<ChatMessagesInterface>({
43
+ messageStore: [],
44
+ privateMessageStore: {},
45
+ sendChatMessage: () => {},
46
+ });
47
+
48
+ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
49
+ const {renderList} = useRenderContext();
50
+ const localUid = useLocalUid();
51
+ const {setSidePanel} = useSidePanel();
52
+ const {groupActive, selectedChatUserId, setGroupActive} = useChatUIControl();
53
+ const {setUnreadGroupMessageCount, setUnreadIndividualMessageCount} =
54
+ useChatNotification();
55
+ const [messageStore, setMessageStore] = useState<messageStoreInterface[]>([]);
56
+ const [privateMessageStore, setPrivateMessageStore] = useState({});
57
+
58
+ const renderListRef = useRef({renderList: renderList});
59
+ const groupActiveRef = useRef<boolean>();
60
+ const individualActiveRef = useRef<string | number>();
61
+
62
+ //commented for v1 release
63
+ //const fromText = useString('messageSenderNotificationLabel');
64
+ const fromText = (name: string) => `From : ${name}`;
65
+ useEffect(() => {
66
+ renderListRef.current.renderList = renderList;
67
+ }, [renderList]);
68
+
69
+ useEffect(() => {
70
+ groupActiveRef.current = groupActive;
71
+ }, [groupActive]);
72
+
73
+ useEffect(() => {
74
+ individualActiveRef.current = selectedChatUserId;
75
+ }, [selectedChatUserId]);
76
+
77
+ React.useEffect(() => {
78
+ const showMessageNotification = (msg: string, uid: string) => {
79
+ Toast.show({
80
+ type: 'success',
81
+ text1: msg.length > 30 ? msg.slice(0, 30) + '...' : msg,
82
+ text2: renderListRef.current.renderList[parseInt(uid)]?.name
83
+ ? fromText(renderListRef.current.renderList[parseInt(uid)]?.name)
84
+ : '',
85
+ visibilityTime: 1000,
86
+ onPress: () => {
87
+ setSidePanel(SidePanelType.Chat);
88
+ setUnreadGroupMessageCount(0);
89
+ setGroupActive(true);
90
+ },
91
+ });
92
+ };
93
+ CustomEvents.on(EventNames.PUBLIC_CHAT_MESSAGE, (data) => {
94
+ showMessageNotification(data.payload.value, data.sender);
95
+ addMessageToStore(parseInt(data.sender), {
96
+ msg: data.payload.value,
97
+ ts: data.ts,
98
+ });
99
+ /**
100
+ * if chat group window is not active.
101
+ * then we will increment the unread count
102
+ */
103
+ if (!groupActiveRef.current) {
104
+ setUnreadGroupMessageCount((prevState) => {
105
+ return prevState + 1;
106
+ });
107
+ }
108
+ });
109
+ CustomEvents.on(EventNames.PRIVATE_CHAT_MESSAGE, (data) => {
110
+ showMessageNotification(data.payload.value, data.sender);
111
+ addMessageToPrivateStore(
112
+ parseInt(data.sender),
113
+ {
114
+ msg: data.payload.value,
115
+ ts: data.ts,
116
+ },
117
+ false,
118
+ );
119
+ /**
120
+ * if user's private window is active.
121
+ * then we will not increment the unread count
122
+ */
123
+
124
+ if (!(individualActiveRef.current === parseInt(data.sender))) {
125
+ setUnreadIndividualMessageCount((prevState) => {
126
+ const prevCount =
127
+ prevState && prevState[parseInt(data.sender)]
128
+ ? prevState[parseInt(data.sender)]
129
+ : 0;
130
+ return {
131
+ ...prevState,
132
+ [parseInt(data.sender)]: prevCount + 1,
133
+ };
134
+ });
135
+ }
136
+ });
137
+ }, []);
138
+
139
+ const addMessageToStore = (uid: UidType, body: messageInterface) => {
140
+ setMessageStore((m: messageStoreInterface[]) => {
141
+ return [...m, {ts: body.ts, uid, msg: body.msg}];
142
+ });
143
+ };
144
+
145
+ const addMessageToPrivateStore = (
146
+ uid: UidType,
147
+ body: messageInterface,
148
+ local: boolean,
149
+ ) => {
150
+ setPrivateMessageStore((state: any) => {
151
+ let newState = {...state};
152
+ newState[uid] !== undefined
153
+ ? (newState[uid] = [
154
+ ...newState[uid],
155
+ {ts: body.ts, uid: local ? localUid : uid, msg: body.msg},
156
+ ])
157
+ : (newState = {
158
+ ...newState,
159
+ [uid]: [{ts: body.ts, uid: local ? localUid : uid, msg: body.msg}],
160
+ });
161
+ return {...newState};
162
+ });
163
+ };
164
+
165
+ const sendChatMessage = (msg: string, toUid?: UidType) => {
166
+ if (typeof msg == 'string' && msg.trim() === '') return;
167
+ if (toUid) {
168
+ CustomEvents.send(
169
+ EventNames.PRIVATE_CHAT_MESSAGE,
170
+ {
171
+ value: msg,
172
+ },
173
+ toUid,
174
+ );
175
+ addMessageToPrivateStore(
176
+ toUid,
177
+ {
178
+ msg: msg,
179
+ ts: timeNow(),
180
+ },
181
+ true,
182
+ );
183
+ } else {
184
+ CustomEvents.send(EventNames.PUBLIC_CHAT_MESSAGE, {
185
+ value: msg,
186
+ });
187
+ addMessageToStore(localUid, {
188
+ msg: msg,
189
+ ts: timeNow(),
190
+ });
191
+ }
192
+ };
193
+
194
+ return (
195
+ <ChatMessagesContext.Provider
196
+ value={{
197
+ messageStore,
198
+ privateMessageStore,
199
+ sendChatMessage,
200
+ }}>
201
+ {props.children}
202
+ </ChatMessagesContext.Provider>
203
+ );
204
+ };
205
+
206
+ const useChatMessages = createHook(ChatMessagesContext);
207
+
208
+ export {ChatMessagesProvider, useChatMessages};
@@ -0,0 +1,78 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {createHook} from 'fpe-implementation';
13
+ import React, {SetStateAction, useState, useEffect} from 'react';
14
+
15
+ interface individualUnreadMessageCount {
16
+ [key: number]: number;
17
+ }
18
+
19
+ export interface ChatNotificationInterface {
20
+ totalUnreadCount: number;
21
+ unreadGroupMessageCount: number;
22
+ setUnreadGroupMessageCount: React.Dispatch<SetStateAction<number>>;
23
+ unreadPrivateMessageCount: number;
24
+ setUnreadPrivateMessageCount: React.Dispatch<SetStateAction<number>>;
25
+ unreadIndividualMessageCount: individualUnreadMessageCount;
26
+ setUnreadIndividualMessageCount: React.Dispatch<
27
+ SetStateAction<individualUnreadMessageCount>
28
+ >;
29
+ }
30
+
31
+ const ChatNotificationContext = React.createContext<ChatNotificationInterface>({
32
+ totalUnreadCount: 0,
33
+ unreadGroupMessageCount: 0,
34
+ unreadPrivateMessageCount: 0,
35
+ unreadIndividualMessageCount: {},
36
+ setUnreadGroupMessageCount: () => {},
37
+ setUnreadIndividualMessageCount: () => {},
38
+ setUnreadPrivateMessageCount: () => {},
39
+ });
40
+
41
+ interface ChatNotificationProviderProps {
42
+ children: React.ReactNode;
43
+ }
44
+
45
+ const ChatNotificationProvider = (props: ChatNotificationProviderProps) => {
46
+ const [unreadGroupMessageCount, setUnreadGroupMessageCount] = useState(0);
47
+ const [unreadPrivateMessageCount, setUnreadPrivateMessageCount] = useState(0);
48
+ const [unreadIndividualMessageCount, setUnreadIndividualMessageCount] =
49
+ useState<individualUnreadMessageCount>({});
50
+
51
+ useEffect(() => {
52
+ let privateUnreadCount = 0;
53
+ for (const key in unreadIndividualMessageCount) {
54
+ privateUnreadCount =
55
+ privateUnreadCount + unreadIndividualMessageCount[key];
56
+ }
57
+ setUnreadPrivateMessageCount(privateUnreadCount);
58
+ }, [unreadIndividualMessageCount]);
59
+
60
+ return (
61
+ <ChatNotificationContext.Provider
62
+ value={{
63
+ totalUnreadCount: unreadGroupMessageCount + unreadPrivateMessageCount,
64
+ unreadGroupMessageCount,
65
+ setUnreadGroupMessageCount,
66
+ unreadPrivateMessageCount,
67
+ setUnreadPrivateMessageCount,
68
+ unreadIndividualMessageCount,
69
+ setUnreadIndividualMessageCount,
70
+ }}>
71
+ {props.children}
72
+ </ChatNotificationContext.Provider>
73
+ );
74
+ };
75
+
76
+ const useChatNotification = createHook(ChatNotificationContext);
77
+
78
+ export {ChatNotificationProvider, useChatNotification};
@@ -0,0 +1,66 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {createHook} from 'fpe-implementation';
13
+ import React, {SetStateAction, useState} from 'react';
14
+ import {UidType} from '../../../agora-rn-uikit';
15
+
16
+ export interface ChatUIControlInterface {
17
+ groupActive: boolean;
18
+ privateActive: boolean;
19
+ selectedChatUserId: UidType;
20
+ setGroupActive: React.Dispatch<SetStateAction<boolean>>;
21
+ setPrivateActive: React.Dispatch<SetStateAction<boolean>>;
22
+ setSelectedChatUserId: React.Dispatch<SetStateAction<UidType>>;
23
+ message: string;
24
+ setMessage: React.Dispatch<SetStateAction<string>>;
25
+ }
26
+
27
+ const ChatUIControlContext = React.createContext<ChatUIControlInterface>({
28
+ groupActive: false,
29
+ privateActive: false,
30
+ selectedChatUserId: 0,
31
+ message: '',
32
+ setGroupActive: () => {},
33
+ setPrivateActive: () => {},
34
+ setSelectedChatUserId: () => {},
35
+ setMessage: () => {},
36
+ });
37
+
38
+ interface ChatUIControlProviderProps {
39
+ children: React.ReactNode;
40
+ }
41
+
42
+ const ChatUIControlProvider = (props: ChatUIControlProviderProps) => {
43
+ const [groupActive, setGroupActive] = useState(false);
44
+ const [privateActive, setPrivateActive] = useState(false);
45
+ const [selectedChatUserId, setSelectedChatUserId] = useState<UidType>(0);
46
+ const [message, setMessage] = useState('');
47
+ return (
48
+ <ChatUIControlContext.Provider
49
+ value={{
50
+ groupActive,
51
+ privateActive,
52
+ selectedChatUserId,
53
+ setGroupActive,
54
+ setPrivateActive,
55
+ setSelectedChatUserId,
56
+ message,
57
+ setMessage,
58
+ }}>
59
+ {props.children}
60
+ </ChatUIControlContext.Provider>
61
+ );
62
+ };
63
+
64
+ const useChatUIControl = createHook(ChatUIControlContext);
65
+
66
+ export {ChatUIControlProvider, useChatUIControl};
@@ -0,0 +1,54 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+
13
+ import React, {useContext, useState} from 'react';
14
+ import Error from '../../subComponents/Error';
15
+ type ErrorType = {
16
+ name: string;
17
+ message: string;
18
+ };
19
+ type ErrorContextType = {
20
+ error: ErrorType | undefined;
21
+ setGlobalErrorMessage: (error: any) => void;
22
+ resetError: () => void;
23
+ };
24
+ const ErrorContext = React.createContext<ErrorContextType>({
25
+ error: {name: '', message: ''},
26
+ setGlobalErrorMessage: () => {},
27
+ resetError: () => {},
28
+ });
29
+
30
+ const ErrorProvider = (props: {children: React.ReactNode}) => {
31
+ const [error, setError] = useState<ErrorType>();
32
+ const setGlobalErrorMessage = (error: ErrorType) => {
33
+ setError(error);
34
+ };
35
+ const resetError = () => {
36
+ setError(undefined);
37
+ };
38
+ return (
39
+ <ErrorContext.Provider value={{error, setGlobalErrorMessage, resetError}}>
40
+ {props.children}
41
+ </ErrorContext.Provider>
42
+ );
43
+ };
44
+
45
+ const CommonError: React.FC = () => {
46
+ const {error} = useContext(ErrorContext);
47
+ return error && (error.name || error.message) ? (
48
+ <Error error={error} showBack={true} />
49
+ ) : (
50
+ <></>
51
+ );
52
+ };
53
+ export {ErrorContext, ErrorProvider};
54
+ export default CommonError;
@@ -0,0 +1,35 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+
13
+ import React from 'react';
14
+ import {View, StyleSheet} from 'react-native';
15
+ import Logo from '../../subComponents/Logo';
16
+ import {hasBrandLogo} from '../../utils/common';
17
+
18
+ const CommonLogo: React.FC = () => {
19
+ return (
20
+ <View style={style.nav}>
21
+ {hasBrandLogo && <Logo />}
22
+ {/* <OpenInNativeButton /> */}
23
+ </View>
24
+ );
25
+ };
26
+ export default CommonLogo;
27
+ const style = StyleSheet.create({
28
+ nav: {
29
+ flex: 1,
30
+ width: '100%',
31
+ flexDirection: 'row',
32
+ alignItems: 'center',
33
+ justifyContent: 'center',
34
+ },
35
+ });
@@ -0,0 +1,8 @@
1
+ import Logo from './Logo'
2
+ import Error,{ErrorProvider,ErrorContext} from './Error'
3
+ export{
4
+ Logo,
5
+ ErrorContext,
6
+ ErrorProvider,
7
+ Error
8
+ }
@@ -0,0 +1,79 @@
1
+ import {UidType} from '../../../agora-rn-uikit';
2
+ import React, {createContext, useState, useContext} from 'react';
3
+ import {createHook} from 'fpe-implementation';
4
+ import LiveStreamContext, {
5
+ raiseHandListInterface,
6
+ } from '../../components/livestream';
7
+ import {ClientRole, useLocalUid} from '../../../agora-rn-uikit';
8
+ import {filterObject} from '../../utils';
9
+ import useUserList from '../../utils/useUserList';
10
+
11
+ export interface LiveStreamDataObjectInterface {
12
+ [key: number]: {
13
+ role: number;
14
+ raised: boolean;
15
+ ts: number;
16
+ };
17
+ }
18
+ export interface LiveStreamDataContextInterface {
19
+ hostUids: UidType[];
20
+ audienceUids: UidType[];
21
+ liveStreamData: raiseHandListInterface;
22
+ }
23
+ const LiveStreamDataContext = createContext<LiveStreamDataContextInterface>({
24
+ hostUids: [],
25
+ audienceUids: [],
26
+ liveStreamData: {},
27
+ });
28
+
29
+ interface ScreenShareProviderProps {
30
+ children: React.ReactNode;
31
+ }
32
+ const LiveStreamDataProvider = (props: ScreenShareProviderProps) => {
33
+ const {renderList} = useUserList();
34
+ const {raiseHandList} = useContext(LiveStreamContext);
35
+ const [hostUids, setHostUids] = useState<UidType[]>([]);
36
+ const [audienceUids, setAudienceUids] = useState<UidType[]>([]);
37
+
38
+ React.useEffect(() => {
39
+ if (Object.keys(renderList).length !== 0) {
40
+ const hostList = filterObject(
41
+ renderList,
42
+ ([k, v]) =>
43
+ (v?.type === 'rtc' ||
44
+ v?.type === 'live' ||
45
+ (v?.type === 'screenshare' && v?.video == 1)) &&
46
+ (raiseHandList[k]
47
+ ? raiseHandList[k]?.role == ClientRole.Broadcaster
48
+ : true) &&
49
+ !v?.offline,
50
+ );
51
+ const audienceList = filterObject(
52
+ renderList,
53
+ ([k, v]) =>
54
+ (v?.type === 'rtc' || v?.type === 'live') &&
55
+ raiseHandList[k]?.role == ClientRole.Audience &&
56
+ !v.offline,
57
+ );
58
+ const hUids = Object.keys(hostList).map((uid) => parseInt(uid));
59
+ const aUids = Object.keys(audienceList).map((uid) => parseInt(uid));
60
+
61
+ setHostUids(hUids);
62
+ setAudienceUids(aUids);
63
+ }
64
+ }, [renderList, raiseHandList]);
65
+
66
+ return (
67
+ <LiveStreamDataContext.Provider
68
+ value={{
69
+ liveStreamData: raiseHandList,
70
+ hostUids,
71
+ audienceUids,
72
+ }}>
73
+ {props.children}
74
+ </LiveStreamDataContext.Provider>
75
+ );
76
+ };
77
+ const useLiveStreamDataContext = createHook(LiveStreamDataContext);
78
+
79
+ export {useLiveStreamDataContext, LiveStreamDataProvider};
@@ -0,0 +1,47 @@
1
+ import {UidType, PropsContext} from '../../../agora-rn-uikit';
2
+ import React, {
3
+ createContext,
4
+ Dispatch,
5
+ SetStateAction,
6
+ useContext,
7
+ useState,
8
+ } from 'react';
9
+ import {createHook} from 'fpe-implementation';
10
+
11
+ export interface ScreenShareObjectInterface {
12
+ [key: string | number]: {
13
+ name: string;
14
+ isActive: boolean;
15
+ };
16
+ }
17
+ export interface ScreenShareContextInterface {
18
+ screenShareData: ScreenShareObjectInterface;
19
+ setScreenShareData: Dispatch<SetStateAction<ScreenShareObjectInterface>>;
20
+ }
21
+ const ScreenShareContext = createContext<ScreenShareContextInterface>({
22
+ screenShareData: {},
23
+ setScreenShareData: () => {},
24
+ });
25
+
26
+ interface ScreenShareProviderProps {
27
+ children: React.ReactNode;
28
+ }
29
+ const ScreenShareProvider = (props: ScreenShareProviderProps) => {
30
+ const {rtcProps} = useContext(PropsContext);
31
+ const [screenShareData, setScreenShareData] =
32
+ useState<ScreenShareObjectInterface>({
33
+ [rtcProps?.screenShareUid]: {
34
+ name: '',
35
+ isActive: false,
36
+ },
37
+ });
38
+
39
+ return (
40
+ <ScreenShareContext.Provider value={{screenShareData, setScreenShareData}}>
41
+ {props.children}
42
+ </ScreenShareContext.Provider>
43
+ );
44
+ };
45
+ const useScreenContext = createHook(ScreenShareContext);
46
+
47
+ export {useScreenContext, ScreenShareProvider};
@@ -0,0 +1,59 @@
1
+ import {UidType} from '../../../agora-rn-uikit';
2
+ import React, {
3
+ createContext,
4
+ Dispatch,
5
+ SetStateAction,
6
+ useEffect,
7
+ useState,
8
+ } from 'react';
9
+ import {createHook} from 'fpe-implementation';
10
+ import {filterObject} from '../../utils/index';
11
+ import {useRtcContext} from 'fpe-api';
12
+
13
+ export interface WhiteboardObjectInterface {
14
+ [key: number]: {
15
+ active: boolean;
16
+ parentId: UidType;
17
+ type: 'whiteboard';
18
+ };
19
+ }
20
+ export interface WhiteboardContextInterface {
21
+ whiteboardData: WhiteboardObjectInterface;
22
+ setWhiteboardData: Dispatch<SetStateAction<WhiteboardObjectInterface>>;
23
+ }
24
+ const WhiteboardContext = createContext<WhiteboardContextInterface>({
25
+ whiteboardData: {},
26
+ setWhiteboardData: () => {},
27
+ });
28
+
29
+ interface WhiteboardProviderProps {
30
+ children: React.ReactNode;
31
+ }
32
+ const WhiteboardProvider = (props: WhiteboardProviderProps) => {
33
+ const [whiteboardData, setWhiteboardData] =
34
+ useState<WhiteboardObjectInterface>({});
35
+ const {dispatch} = useRtcContext();
36
+
37
+ useEffect(() => {
38
+ const activeData = filterObject(
39
+ whiteboardData,
40
+ ([k, v]) => v.active === true,
41
+ );
42
+ Object.keys(activeData).map((uid) => {
43
+ const uidAsNumber = parseInt(uid);
44
+ dispatch({
45
+ type: 'AddCustomContent',
46
+ value: [uidAsNumber, activeData[uidAsNumber]],
47
+ });
48
+ });
49
+ }, [whiteboardData]);
50
+
51
+ return (
52
+ <WhiteboardContext.Provider value={{whiteboardData, setWhiteboardData}}>
53
+ {props.children}
54
+ </WhiteboardContext.Provider>
55
+ );
56
+ };
57
+ const useScreenContext = createHook(WhiteboardContext);
58
+
59
+ export {useScreenContext, WhiteboardProvider};
@@ -0,0 +1,27 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {createContext} from 'react';
13
+
14
+ interface DimensionContextInterface {
15
+ getDimensionData: (
16
+ width?: number,
17
+ height?: number,
18
+ ) => {dim: [number, number, boolean]; isDesktop: boolean};
19
+ }
20
+
21
+ const DimensionContext = createContext<DimensionContextInterface>({
22
+ getDimensionData: () => {
23
+ return {dim: [0, 0, false], isDesktop: false};
24
+ },
25
+ });
26
+
27
+ export default DimensionContext;