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
@@ -1,36 +1,21 @@
1
- import React, {
2
- createContext,
3
- useContext,
4
- useEffect,
5
- useRef,
6
- useState,
7
- } from 'react';
8
- import {useParams} from '../../components/Router';
9
- import ChatContext from '../../components/ChatContext';
1
+ import React, {useContext, useEffect, useRef, useState} from 'react';
2
+ import {RtcContext, PropsContext, UidType} from '../../../agora-rn-uikit';
3
+ import {ScreenshareContext} from './useScreenshare';
10
4
  import {
11
- RtcContext,
12
- PropsContext,
13
- MinUidContext,
14
- MaxUidContext,
15
- } from '../../../agora-rn-uikit/src';
16
- import Layout from '../LayoutEnum';
17
- import {gql, useMutation} from '@apollo/client';
18
- import ScreenshareContext from './ScreenshareContext';
5
+ useChangeDefaultLayout,
6
+ useSetPinnedLayout,
7
+ } from '../../pages/video-call/DefaultLayouts';
8
+ import {useRecording} from '../recording/useRecording';
9
+ import {useScreenContext} from '../../components/contexts/ScreenShareContext';
10
+ import useUserList from '../../utils/useUserList';
11
+ import CustomEvents, {EventLevel} from '../../custom-events';
12
+ import {EventNames} from '../../rtm-events';
13
+ import {IAgoraRTC} from 'agora-rtc-sdk-ng';
14
+ import useRecordingLayoutQuery from '../recording/useRecordingLayoutQuery';
15
+ import {useString} from '../../utils/useString';
19
16
 
20
- const SET_PRESENTER = gql`
21
- mutation setPresenter($uid: Int!, $passphrase: String!) {
22
- setPresenter(uid: $uid, passphrase: $passphrase)
23
- }
24
- `;
25
-
26
- const SET_NORMAL = gql`
27
- mutation setNormal($passphrase: String!) {
28
- setNormal(passphrase: $passphrase)
29
- }
30
- `;
31
-
32
- function usePrevious(value: any) {
33
- const ref = useRef();
17
+ function usePrevious<T = any>(value: any) {
18
+ const ref = useRef<T>();
34
19
  useEffect(() => {
35
20
  ref.current = value;
36
21
  });
@@ -39,159 +24,134 @@ function usePrevious(value: any) {
39
24
 
40
25
  export const ScreenshareContextConsumer = ScreenshareContext.Consumer;
41
26
 
42
- export const ScreenshareConfigure = (props: any) => {
43
- const {userList} = useContext(ChatContext);
44
- const [screenshareActive, setScreenshareActive] = useState(false);
27
+ export const ScreenshareConfigure = (props: {children: React.ReactNode}) => {
28
+ const [isScreenshareActive, setScreenshareActive] = useState(false);
45
29
  const rtc = useContext(RtcContext);
46
30
  const {dispatch} = rtc;
47
- const max = useContext(MaxUidContext);
48
- const min = useContext(MinUidContext);
49
- const users = [...max, ...min];
50
- const prevUsers = usePrevious({users});
51
- const {phrase} = useParams<any>();
52
- const {setLayout, recordingActive} = props;
31
+ const {renderList, renderPosition} = useUserList();
32
+ const {isRecordingActive} = useRecording();
33
+ const {executeNormalQuery, executePresenterQuery} = useRecordingLayoutQuery();
34
+ const {setScreenShareData, screenShareData} = useScreenContext();
35
+ // commented for v1 release
36
+ // const getScreenShareName = useString('screenshareUserName');
37
+ // const userText = useString('remoteUserDefaultLabel')();
38
+ const getScreenShareName = (name: string) => `${name}'s screenshare`;
39
+ const userText = 'User';
40
+ const setPinnedLayout = useSetPinnedLayout();
41
+ const changeLayout = useChangeDefaultLayout();
42
+
53
43
  const {channel, appId, screenShareUid, screenShareToken, encryption} =
54
44
  useContext(PropsContext).rtcProps;
55
45
 
56
- const [setPresenterQuery] = useMutation(SET_PRESENTER);
57
- const [setNormalQuery] = useMutation(SET_NORMAL);
46
+ const renderListRef = useRef({renderList: renderList});
47
+
48
+ useEffect(() => {
49
+ renderListRef.current.renderList = renderList;
50
+ }, [renderList]);
51
+
52
+ const triggerChangeLayout = (pinned: boolean, screenShareUid?: UidType) => {
53
+ //screenshare is started set the layout to Pinned View
54
+ if (pinned && screenShareUid) {
55
+ dispatch({
56
+ type: 'SwapVideo',
57
+ value: [screenShareUid],
58
+ });
59
+ setPinnedLayout();
60
+ } else {
61
+ //screenshare is stopped set the layout Grid View
62
+ changeLayout();
63
+ }
64
+ };
65
+
66
+ useEffect(() => {
67
+ CustomEvents.on(EventNames.SCREENSHARE_ATTRIBUTE, (data) => {
68
+ const screenUidOfUser =
69
+ renderListRef.current.renderList[data.sender].screenUid;
70
+ setScreenShareData((prevState) => {
71
+ return {
72
+ ...prevState,
73
+ [screenUidOfUser]: {
74
+ name: renderListRef.current.renderList[screenUidOfUser]?.name,
75
+ isActive: data.payload.value === 'true' ? true : false,
76
+ },
77
+ };
78
+ });
79
+ //if remote user started/stopped the screenshare then change the layout to pinned/grid
80
+ data.payload.value === 'true'
81
+ ? triggerChangeLayout(true, screenUidOfUser)
82
+ : triggerChangeLayout(false);
83
+ });
84
+ }, []);
58
85
 
59
86
  useEffect(() => {
87
+ // @ts-ignore
60
88
  rtc.RtcEngine.addListener('ScreenshareStopped', () => {
61
89
  setScreenshareActive(false);
62
90
  console.log('STOPPED SHARING');
63
- setLayout((l: Layout) =>
64
- l === Layout.Pinned ? Layout.Grid : Layout.Pinned,
65
- );
66
- setNormalQuery({variables: {passphrase: phrase}})
67
- .then((res) => {
68
- console.log(res.data);
69
- if (res.data.stopRecordingSession === 'success') {
70
- }
71
- })
72
- .catch((err) => {
73
- console.log(err);
74
- });
91
+ executeNormalQuery();
92
+ CustomEvents.send(EventNames.SCREENSHARE_ATTRIBUTE, {
93
+ value: `${false}`,
94
+ level: EventLevel.LEVEL2,
95
+ });
96
+ //if local user stopped the screenshare then change layout to grid
97
+ triggerChangeLayout(false);
75
98
  });
76
99
  }, []);
77
100
 
78
- useEffect(() => {
79
- if (prevUsers !== undefined) {
80
- let joinedUser = users.filter((person) =>
81
- prevUsers?.users.every((person2) => !(person2.uid === person.uid)),
82
- );
83
- let leftUser = prevUsers?.users.filter((person) =>
84
- users.every((person2) => !(person2.uid === person.uid)),
85
- );
86
-
87
- if (joinedUser.length === 1) {
88
- const newUserUid = joinedUser[0].uid;
89
- // identify remote user screen type, if screen share, swap to PIN
90
- if (userList[newUserUid] && userList[newUserUid].type === 1) {
91
- dispatch({
92
- type: 'SwapVideo',
93
- value: [joinedUser[0]],
94
- });
95
- setLayout(Layout.Pinned);
96
- } else if (newUserUid === 1) {
97
- // identify local user screen type
98
- if (newUserUid !== users[0].uid) {
99
- // if not already maximized
100
- dispatch({
101
- type: 'SwapVideo',
102
- value: [joinedUser[0]],
103
- });
104
- }
105
- setLayout(Layout.Pinned);
106
- }
107
- }
108
-
109
- if (leftUser.length === 1) {
110
- const leftUserUid = leftUser[0].uid;
111
- if (userList[leftUserUid] && userList[leftUserUid].type === 1) {
112
- setLayout((l: Layout) =>
113
- l === Layout.Pinned ? Layout.Grid : Layout.Pinned,
114
- );
115
- }
116
- }
117
- }
118
- }, [users, userList]);
119
-
120
101
  const executeRecordingQuery = (isScreenActive: boolean) => {
121
102
  if (!isScreenActive) {
122
103
  // If screen share is not going on, start the screen share by executing the graphql query
123
- setPresenterQuery({
124
- variables: {
125
- uid: screenShareUid,
126
- passphrase: phrase,
127
- },
128
- })
129
- .then((res) => {
130
- if (res.data.setPresenter === 'success') {
131
- }
132
- })
133
- .catch((err) => {
134
- console.log(err);
135
- });
104
+ executePresenterQuery();
136
105
  } else {
137
106
  // If recording is already going on, stop the recording by executing the graphql query.
138
- setNormalQuery({variables: {passphrase: phrase}})
139
- .then((res) => {
140
- console.log(res.data);
141
- if (res.data.stopRecordingSession === 'success') {
142
- }
143
- })
144
- .catch((err) => {
145
- console.log(err);
146
- });
107
+ executeNormalQuery();
147
108
  }
148
109
  };
149
110
 
150
111
  const stopUserScreenShare = () => {
151
- if (screenshareActive) {
152
- startUserScreenshare();
153
- }
112
+ if (!isScreenshareActive) return;
113
+ userScreenshare(false);
114
+ };
115
+ const startUserScreenshare = () => {
116
+ if (isScreenshareActive) return;
117
+ userScreenshare(true);
154
118
  };
155
119
 
156
- const startUserScreenshare = async () => {
157
- const isScreenActive = screenshareActive;
158
- if (recordingActive) {
159
- executeRecordingQuery(isScreenActive);
120
+ const userScreenshare = async (isActive: boolean) => {
121
+ if (isRecordingActive) {
122
+ executeRecordingQuery(isActive);
160
123
  }
124
+ console.log('supriya screenshare query executed');
161
125
  try {
126
+ // @ts-ignore
162
127
  await rtc.RtcEngine.startScreenshare(
163
128
  screenShareToken,
164
129
  channel,
165
130
  null,
166
131
  screenShareUid,
167
132
  appId,
168
- rtc.RtcEngine,
169
- encryption,
133
+ rtc.RtcEngine as unknown as IAgoraRTC,
134
+ encryption as unknown as any,
170
135
  );
171
- !isScreenActive && setScreenshareActive(true);
172
- } catch (e) {
173
- console.error("can't start the screen share", e);
174
- setNormalQuery({variables: {passphrase: phrase}})
175
- .then((res) => {
176
- console.log(res.data);
177
- if (res.data.stopRecordingSession === 'success') {
178
- // Once the backend sucessfuly stops recording,
179
- // send a control message to everbody in the channel indicating that cloud recording is now inactive.
180
- // sendControlMessage(controlMessageEnum.cloudRecordingUnactive);
181
- // set the local recording state to false to update the UI
182
- // setScreenshareActive(false);
183
- }
184
- })
185
- .catch((err) => {
186
- console.log(err);
136
+ isActive && setScreenshareActive(true);
137
+ if (isActive) {
138
+ CustomEvents.send(EventNames.SCREENSHARE_ATTRIBUTE, {
139
+ value: `${true}`,
140
+ level: EventLevel.LEVEL2,
187
141
  });
142
+ //if local user started the screenshare then change layout to pinned
143
+ triggerChangeLayout(true, screenShareUid);
144
+ }
145
+ } catch (e) {
146
+ console.error("supriya an't start the screen share", e);
147
+ executeNormalQuery();
188
148
  }
189
149
  };
190
150
 
191
151
  return (
192
152
  <ScreenshareContext.Provider
193
153
  value={{
194
- screenshareActive,
154
+ isScreenshareActive,
195
155
  startUserScreenshare,
196
156
  stopUserScreenShare,
197
157
  }}>
@@ -0,0 +1,29 @@
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
+ import {createHook} from 'fpe-implementation';
14
+
15
+ export interface ScreenshareContextInterface {
16
+ isScreenshareActive: boolean;
17
+ startUserScreenshare: () => void;
18
+ stopUserScreenShare: () => void;
19
+ }
20
+
21
+ export const ScreenshareContext = createContext<ScreenshareContextInterface>({
22
+ isScreenshareActive: false,
23
+ startUserScreenshare: () => {},
24
+ stopUserScreenShare: () => {},
25
+ });
26
+
27
+ const useScreenshare = createHook(ScreenshareContext);
28
+
29
+ export {useScreenshare};
@@ -9,32 +9,37 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
+ // @ts-nocheck
12
13
  import React from 'react';
13
14
  import {Platform} from 'react-native';
14
- import Toast, { BaseToast } from '../../react-native-toast-message';
15
- import mobileAndTabletCheck from '../utils/mobileWebTest';
15
+ import Toast, {BaseToast} from '../../react-native-toast-message';
16
+ import isMobileOrTablet from '../utils/isMobileOrTablet';
16
17
 
17
18
  const toastConfig = {
18
- /*
19
+ /*
19
20
  overwrite 'success' type,
20
21
  modifying the existing `BaseToast` component
21
22
  */
22
- success: ({ text1, text2, props, ...rest }) => (
23
- <BaseToast
24
- {...rest}
25
- //BaseToast is modified to have zIndex: 100
26
- style={{ borderLeftColor: $config.PRIMARY_COLOR, backgroundColor: $config.SECONDARY_FONT_COLOR, width: !mobileAndTabletCheck() ? '40%' : '95%'}}
27
- contentContainerStyle={{ paddingHorizontal: 15, overflow: 'hidden'}}
28
- text1Style={{
29
- fontSize: 15,
30
- fontWeight: '400',
31
- color: $config.PRIMARY_FONT_COLOR
32
- }}
33
- text1={text1}
34
- text2={text2}
35
- // text2={props.uuid}
36
- />
37
- ),
23
+ success: ({text1, text2, props, ...rest}) => (
24
+ <BaseToast
25
+ {...rest}
26
+ //BaseToast is modified to have zIndex: 100
27
+ style={{
28
+ borderLeftColor: $config.PRIMARY_COLOR,
29
+ backgroundColor: $config.SECONDARY_FONT_COLOR,
30
+ width: !isMobileOrTablet() ? '40%' : '95%',
31
+ }}
32
+ contentContainerStyle={{paddingHorizontal: 15, overflow: 'hidden'}}
33
+ text1Style={{
34
+ fontSize: 15,
35
+ fontWeight: '400',
36
+ color: $config.PRIMARY_FONT_COLOR,
37
+ }}
38
+ text1={text1}
39
+ text2={text2}
40
+ // text2={props.uuid}
41
+ />
42
+ ),
38
43
  };
39
44
 
40
- export default toastConfig;
45
+ export default toastConfig;
@@ -0,0 +1,34 @@
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 {useMeetingInfo} from '../components/meeting-info/useMeetingInfo';
13
+ import {useLiveStreamDataContext} from '../components/contexts/LiveStreamDataContext';
14
+ import {UidType} from '../../agora-rn-uikit';
15
+
16
+ function useIsAttendee() {
17
+ if ($config.EVENT_MODE) {
18
+ const {audienceUids} = useLiveStreamDataContext();
19
+ const isAttendee = (uid: UidType) => {
20
+ return audienceUids.filter((audienceUid) => audienceUid === uid).length
21
+ ? true
22
+ : false;
23
+ };
24
+ return isAttendee;
25
+ } else {
26
+ const {isHost} = useMeetingInfo();
27
+ const isAttendee = (uid: UidType) => {
28
+ return !isHost ? true : false;
29
+ };
30
+ return isAttendee;
31
+ }
32
+ }
33
+
34
+ export default useIsAttendee;
@@ -0,0 +1,68 @@
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
+ * @format
14
+ */
15
+ type callBackType = (...args: any[]) => void;
16
+ import {userEventsMapInterface} from '../SDKAppWrapper';
17
+
18
+ interface eventsMapInterface extends userEventsMapInterface {
19
+ addFpe: callBackType;
20
+ joinMeetingWithPhrase: (phrase: string) => void;
21
+ }
22
+ interface SDKEventsInterface {
23
+ eventsMap: eventsMapInterface;
24
+ eventSubs: {[key in keyof eventsMapInterface]: any};
25
+ emit: (eventName: keyof eventsMapInterface, ...args: any) => void;
26
+ on: (eventName: keyof eventsMapInterface, cb: callBackType) => void;
27
+ off: (eventName: keyof eventsMapInterface) => void;
28
+ }
29
+
30
+ const SDKEvents: SDKEventsInterface = {
31
+ eventsMap: {
32
+ addFpe: () => {},
33
+ joinMeetingWithPhrase: (p) => {},
34
+ leave: () => {},
35
+ create: () => {},
36
+ preJoin: () => {},
37
+ join: () => {},
38
+ },
39
+ eventSubs: {
40
+ addFpe: null,
41
+ joinMeetingWithPhrase: null,
42
+ leave: null,
43
+ create: null,
44
+ preJoin: null,
45
+ join: null,
46
+ },
47
+ on: function (eventName, cb) {
48
+ console.log(
49
+ 'DEBUG(aditya)-SDKEvents: event registered:',
50
+ eventName,
51
+ );
52
+ this.eventsMap[eventName] = cb;
53
+ if (this.eventSubs[eventName]) {
54
+ cb(...this.eventSubs[eventName]);
55
+ }
56
+ },
57
+ emit: function (eventName, ...args) {
58
+ console.log('DEBUG(aditya)-SDKEvents: emit called:', eventName, ...args);
59
+ this.eventsMap[eventName](...args);
60
+ this.eventSubs[eventName] = args;
61
+ },
62
+ off: function (eventName) {
63
+ console.log('DEBUG(aditya)-SDKEvents: event deregistered:', eventName);
64
+ this.eventSubs[eventName] = null;
65
+ },
66
+ };
67
+
68
+ export default SDKEvents;
@@ -0,0 +1,40 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import React from 'react';
13
+ import {Platform} from 'react-native';
14
+ import * as ReactIs from 'react-is';
15
+
16
+ const isValidReactComponent = <T,>(Component?: React.ComponentType<T>) =>
17
+ Component && ReactIs.isValidElementType(Component) ? true : false;
18
+
19
+ const hasBrandLogo: boolean = !!$config.LOGO;
20
+
21
+ const shouldAuthenticate: boolean =
22
+ $config.ENABLE_APPLE_OAUTH ||
23
+ $config.ENABLE_GOOGLE_OAUTH ||
24
+ $config.ENABLE_MICROSOFT_OAUTH ||
25
+ $config.ENABLE_SLACK_OAUTH;
26
+
27
+ const isWeb = Platform.OS === 'web';
28
+ const isAndroid = Platform.OS === 'android';
29
+ const isIOS = Platform.OS === 'ios';
30
+ const isArray = (data: any[]) =>
31
+ data && Array.isArray(data) && data.length ? true : false ? true : false;
32
+ export {
33
+ hasBrandLogo,
34
+ shouldAuthenticate,
35
+ isWeb,
36
+ isIOS,
37
+ isAndroid,
38
+ isArray,
39
+ isValidReactComponent,
40
+ };
@@ -0,0 +1,29 @@
1
+ function EventEmitter(this: any) {
2
+ // key: eventName,
3
+ // value: An array of callback functions with the same eventName
4
+ this.events = new Map();
5
+
6
+ return {
7
+ on: (eventName: string, callback: Function) => {
8
+ if (this.events.has(eventName)) {
9
+ throw new Error(`Event with ${eventName} is already registered`);
10
+ }
11
+ //if eventName does not exist, add
12
+ console.log('on', eventName, callback);
13
+ this.events.set(eventName, callback);
14
+ },
15
+ emit: (eventName: string, args: any) => {
16
+ console.log('emit', args, eventName);
17
+
18
+ if (this.events.has(eventName)) {
19
+ //if eventName exists, call the callback in events accordingly
20
+ const registeredCallback = this.events.get(eventName);
21
+ // handle for this context
22
+ registeredCallback(args);
23
+ }
24
+ },
25
+ };
26
+ }
27
+
28
+ const SDKEvents = new (EventEmitter as any)();
29
+ export {SDKEvents};
@@ -0,0 +1,53 @@
1
+ const GetMeetingInviteURL = (
2
+ baseUrl: string,
3
+ isHost: boolean,
4
+ meetingPassphrase: {
5
+ host?: string;
6
+ attendee?: string;
7
+ },
8
+ isSeparateHostLink: boolean,
9
+ ) => {
10
+ if (isHost) {
11
+ if (isSeparateHostLink) {
12
+ return {
13
+ host: `${baseUrl}/${meetingPassphrase.host}`,
14
+ attendee: `${baseUrl}/${meetingPassphrase.attendee}`,
15
+ };
16
+ } else {
17
+ return {
18
+ host: `${baseUrl}/${meetingPassphrase.host}`,
19
+ };
20
+ }
21
+ } else {
22
+ return {
23
+ attendee: `${baseUrl}/${meetingPassphrase.attendee}`,
24
+ };
25
+ }
26
+ };
27
+ const GetMeetingInviteID = (
28
+ isHost: boolean,
29
+ meetingPassphrase: {
30
+ host?: string;
31
+ attendee?: string;
32
+ },
33
+ isSeparateHostLink: boolean,
34
+ ) => {
35
+ if (isHost) {
36
+ if (isSeparateHostLink) {
37
+ return {
38
+ host: `${meetingPassphrase.host}`,
39
+ attendee: `${meetingPassphrase.attendee}`,
40
+ };
41
+ } else {
42
+ return {
43
+ host: `${meetingPassphrase.host}`,
44
+ };
45
+ }
46
+ } else {
47
+ return {
48
+ attendee: `${meetingPassphrase.attendee}`,
49
+ };
50
+ }
51
+ };
52
+
53
+ export {GetMeetingInviteURL, GetMeetingInviteID};
@@ -23,11 +23,11 @@ export function numFormatter(num: number) {
23
23
  }
24
24
  const value = Math.abs(num);
25
25
  const sign = Math.sign(num);
26
- let newValue = value;
26
+ let newValue: string | number = value;
27
27
  if (value >= 1000) {
28
28
  var suffixes = ['', 'k', 'm', 'b', 't', 't+'];
29
29
  var suffixNum = Math.floor(('' + value).length / 3);
30
- var shortValue = '';
30
+ var shortValue;
31
31
  for (var precision = 2; precision >= 1; precision--) {
32
32
  shortValue = parseFloat(
33
33
  (suffixNum != 0
@@ -46,3 +46,12 @@ export function numFormatter(num: number) {
46
46
  newValue = sign === -1 ? `-${newValue}` : `${newValue}`;
47
47
  return newValue;
48
48
  }
49
+
50
+ export function isEmptyObject(obj: object) {
51
+ if (obj == null) return true;
52
+ if (typeof obj !== 'object') return true;
53
+ for (const key in obj) {
54
+ return false;
55
+ }
56
+ return true;
57
+ }
@@ -0,0 +1,29 @@
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 {UidType} from '../../agora-rn-uikit';
13
+ import {ToggleState} from '../../agora-rn-uikit/src/Contexts/PropsContext';
14
+ import useUserList from './useUserList';
15
+
16
+ function useIsAudioEnabled() {
17
+ const {renderList} = useUserList();
18
+ /**
19
+ *
20
+ * @param uid UidType
21
+ * @returns boolean
22
+ */
23
+ const audioEnabled = (uid: UidType): boolean =>
24
+ renderList[uid]?.audio === ToggleState.enabled;
25
+
26
+ return audioEnabled;
27
+ }
28
+
29
+ export default useIsAudioEnabled;