@100mslive/roomkit-react 0.1.8 → 0.1.9-alpha.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 (140) hide show
  1. package/dist/{HLSView-DDGPZHA2.js → HLSView-4JC65BAY.js} +3 -3
  2. package/dist/Modal/Dialog.d.ts +402 -1706
  3. package/dist/Prebuilt/App.d.ts +5 -0
  4. package/dist/Prebuilt/AppContext.d.ts +1 -0
  5. package/dist/Prebuilt/AppStateContext.d.ts +16 -0
  6. package/dist/Prebuilt/components/ConferenceScreen.d.ts +2 -0
  7. package/dist/Prebuilt/components/Footer/PollsToggle.d.ts +2 -0
  8. package/dist/Prebuilt/components/LeaveScreen.d.ts +2 -0
  9. package/dist/Prebuilt/components/MwebLandscapePrompt.d.ts +2 -0
  10. package/dist/Prebuilt/components/Notifications/AutoplayBlockedModal.d.ts +2 -0
  11. package/dist/Prebuilt/components/Notifications/HLSFailureModal.d.ts +2 -0
  12. package/dist/Prebuilt/components/Notifications/InitErrorModal.d.ts +2 -0
  13. package/dist/Prebuilt/components/Notifications/Notifications.d.ts +2 -0
  14. package/dist/Prebuilt/components/Notifications/PeerNotifications.d.ts +1 -0
  15. package/dist/Prebuilt/components/Notifications/PermissionErrorModal.d.ts +2 -0
  16. package/dist/Prebuilt/components/Notifications/ReconnectNotifications.d.ts +2 -0
  17. package/dist/Prebuilt/components/Notifications/TrackBulkUnmuteModal.d.ts +2 -0
  18. package/dist/Prebuilt/components/Notifications/TrackNotifications.d.ts +1 -0
  19. package/dist/Prebuilt/components/Notifications/TrackUnmuteModal.d.ts +2 -0
  20. package/dist/Prebuilt/components/Polls/Polls.d.ts +2 -0
  21. package/dist/Prebuilt/components/Preview/PreviewJoin.d.ts +1 -2
  22. package/dist/Prebuilt/components/Preview/PreviewScreen.d.ts +2 -0
  23. package/dist/Prebuilt/components/hooks/useRedirectToLeave.d.ts +1 -1
  24. package/dist/{VirtualBackground-UVZJVOA2.js → VirtualBackground-MIRXD2HZ.js} +3 -5
  25. package/dist/{VirtualBackground-UVZJVOA2.js.map → VirtualBackground-MIRXD2HZ.js.map} +1 -1
  26. package/dist/chunk-322YFA55.js +14441 -0
  27. package/dist/chunk-322YFA55.js.map +7 -0
  28. package/dist/{chunk-6SQTFOK6.js → chunk-6UGU3UJL.js} +66 -3
  29. package/dist/chunk-6UGU3UJL.js.map +7 -0
  30. package/dist/context/DialogContext.d.ts +6 -0
  31. package/dist/hooks/useDialogContainerSelector.d.ts +1 -0
  32. package/dist/index.cjs.js +10944 -9974
  33. package/dist/index.cjs.js.map +4 -4
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.js +6 -2
  36. package/dist/meta.cjs.json +3871 -3188
  37. package/dist/meta.esbuild.json +4303 -3728
  38. package/dist/utils/animations.d.ts +11 -0
  39. package/package.json +6 -7
  40. package/src/Modal/Dialog.tsx +31 -3
  41. package/src/Prebuilt/App.tsx +46 -99
  42. package/src/Prebuilt/AppContext.tsx +4 -0
  43. package/src/Prebuilt/AppStateContext.tsx +71 -0
  44. package/src/Prebuilt/common/constants.js +35 -0
  45. package/src/Prebuilt/common/utils.js +47 -0
  46. package/src/Prebuilt/components/AppData/AppData.jsx +5 -0
  47. package/src/Prebuilt/components/AppData/useSidepane.js +23 -1
  48. package/src/Prebuilt/components/AppData/useUISettings.js +48 -4
  49. package/src/Prebuilt/components/{conference.jsx → ConferenceScreen.tsx} +30 -43
  50. package/src/Prebuilt/components/Footer/Footer.tsx +5 -0
  51. package/src/Prebuilt/components/Footer/PaginatedParticipants.tsx +63 -32
  52. package/src/Prebuilt/components/Footer/ParticipantList.jsx +2 -1
  53. package/src/Prebuilt/components/Footer/PollsToggle.tsx +22 -0
  54. package/src/Prebuilt/components/Footer/RoleAccordion.tsx +2 -2
  55. package/src/Prebuilt/components/Header/StreamActions.tsx +5 -3
  56. package/src/Prebuilt/components/Leave/DesktopLeaveRoom.tsx +4 -5
  57. package/src/Prebuilt/components/Leave/LeaveRoom.tsx +0 -4
  58. package/src/Prebuilt/components/{PostLeave.jsx → LeaveScreen.tsx} +6 -13
  59. package/src/Prebuilt/components/MoreSettings/ChangeNameModal.jsx +2 -3
  60. package/src/Prebuilt/components/MoreSettings/EmbedUrl.jsx +2 -3
  61. package/src/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.tsx +18 -1
  62. package/src/Prebuilt/components/{MwebLandscapePrompt.jsx → MwebLandscapePrompt.tsx} +10 -11
  63. package/src/Prebuilt/components/Notifications/{AutoplayBlockedModal.jsx → AutoplayBlockedModal.tsx} +2 -1
  64. package/src/Prebuilt/components/Notifications/{HLSFailureModal.jsx → HLSFailureModal.tsx} +10 -8
  65. package/src/Prebuilt/components/Notifications/{InitErrorModal.jsx → InitErrorModal.tsx} +5 -2
  66. package/src/Prebuilt/components/Notifications/{Notifications.jsx → Notifications.tsx} +41 -27
  67. package/src/Prebuilt/components/Notifications/{PeerNotifications.jsx → PeerNotifications.tsx} +3 -0
  68. package/src/Prebuilt/components/Notifications/{PermissionErrorModal.jsx → PermissionErrorModal.tsx} +6 -4
  69. package/src/Prebuilt/components/Notifications/{ReconnectNotifications.jsx → ReconnectNotifications.tsx} +11 -6
  70. package/src/Prebuilt/components/Notifications/{TrackBulkUnmuteModal.jsx → TrackBulkUnmuteModal.tsx} +9 -3
  71. package/src/Prebuilt/components/Notifications/{TrackUnmuteModal.jsx → TrackUnmuteModal.tsx} +9 -3
  72. package/src/Prebuilt/components/Notifications/index.tsx +1 -0
  73. package/src/Prebuilt/components/Polls/CreatePollQuiz/PollsQuizMenu.jsx +229 -0
  74. package/src/Prebuilt/components/Polls/CreatePollQuiz/Timer.jsx +71 -0
  75. package/src/Prebuilt/components/Polls/CreateQuestions/CreateQuestions.jsx +132 -0
  76. package/src/Prebuilt/components/Polls/CreateQuestions/DeleteQuestionModal.jsx +66 -0
  77. package/src/Prebuilt/components/Polls/CreateQuestions/QuestionForm.jsx +251 -0
  78. package/src/Prebuilt/components/Polls/CreateQuestions/SavedQuestion.jsx +57 -0
  79. package/src/Prebuilt/components/Polls/Polls.tsx +28 -0
  80. package/src/Prebuilt/components/Polls/Voting/PollResultSummary.jsx +125 -0
  81. package/src/Prebuilt/components/Polls/Voting/QuestionCard.jsx +249 -0
  82. package/src/Prebuilt/components/Polls/Voting/StandardVoting.jsx +40 -0
  83. package/src/Prebuilt/components/Polls/Voting/TimedVoting.jsx +36 -0
  84. package/src/Prebuilt/components/Polls/Voting/Voting.jsx +99 -0
  85. package/src/Prebuilt/components/Polls/common/MultipleChoiceOptions.jsx +101 -0
  86. package/src/Prebuilt/components/Polls/common/OptionInputWithDelete.jsx +25 -0
  87. package/src/Prebuilt/components/Polls/common/SingleChoiceOptions.jsx +125 -0
  88. package/src/Prebuilt/components/Polls/common/StatusIndicator.jsx +47 -0
  89. package/src/Prebuilt/components/Polls/common/VoteCount.jsx +28 -0
  90. package/src/Prebuilt/components/Polls/common/VoteProgress.jsx +17 -0
  91. package/src/Prebuilt/components/Polls/common/VoterList.jsx +22 -0
  92. package/src/Prebuilt/components/Polls/common/Votes.jsx +72 -0
  93. package/src/Prebuilt/components/Preview/PreviewForm.tsx +3 -2
  94. package/src/Prebuilt/components/Preview/PreviewJoin.tsx +32 -27
  95. package/src/Prebuilt/components/Preview/{PreviewContainer.tsx → PreviewScreen.tsx} +2 -19
  96. package/src/Prebuilt/components/RaiseHand.jsx +1 -1
  97. package/src/Prebuilt/components/RoleChangeModal.jsx +2 -3
  98. package/src/Prebuilt/components/RoleChangeRequest/RequestPrompt.tsx +2 -3
  99. package/src/Prebuilt/components/Settings/SettingsModal.jsx +2 -3
  100. package/src/Prebuilt/components/Settings/StartRecording.jsx +15 -4
  101. package/src/Prebuilt/components/SidePaneTabs.tsx +1 -1
  102. package/src/Prebuilt/components/StatsForNerds.jsx +2 -3
  103. package/src/Prebuilt/components/Streaming/Common.jsx +31 -21
  104. package/src/Prebuilt/components/VideoLayouts/ScreenshareLayout.tsx +8 -9
  105. package/src/Prebuilt/components/VideoTile.jsx +37 -33
  106. package/src/Prebuilt/components/hooks/useAutoStartStreaming.tsx +3 -3
  107. package/src/Prebuilt/components/hooks/useRedirectToLeave.tsx +9 -17
  108. package/src/Prebuilt/components/pdfAnnotator/pdfFileOptions.jsx +2 -3
  109. package/src/Prebuilt/components/pdfAnnotator/submitPdf.jsx +1 -1
  110. package/src/Prebuilt/components/pdfAnnotator/uploadedFile.jsx +2 -3
  111. package/src/Prebuilt/layouts/EmbedView.jsx +47 -60
  112. package/src/Prebuilt/layouts/PDFView.jsx +49 -99
  113. package/src/Prebuilt/layouts/SidePane.tsx +8 -4
  114. package/src/Prebuilt/layouts/VideoStreamingSection.tsx +2 -2
  115. package/src/Prebuilt/primitives/DialogContent.jsx +4 -5
  116. package/src/context/DialogContext.tsx +13 -0
  117. package/src/hooks/useDialogContainerSelector.tsx +7 -0
  118. package/src/index.ts +1 -0
  119. package/src/utils/animations.ts +6 -0
  120. package/dist/Prebuilt/components/Notifications/HeadlessEndRoomListener.d.ts +0 -2
  121. package/dist/Prebuilt/components/PrebuiltDialogPortal.d.ts +0 -4
  122. package/dist/Prebuilt/components/PrebuiltTileElements.d.ts +0 -2198
  123. package/dist/Prebuilt/components/Preview/PreviewContainer.d.ts +0 -3
  124. package/dist/chunk-6SQTFOK6.js.map +0 -7
  125. package/dist/chunk-HUMNPIYI.js +0 -70
  126. package/dist/chunk-HUMNPIYI.js.map +0 -7
  127. package/dist/chunk-PRM33R4R.js +0 -7160
  128. package/dist/chunk-PRM33R4R.js.map +0 -7
  129. package/dist/conference-N7S47TDK.js +0 -6602
  130. package/dist/conference-N7S47TDK.js.map +0 -7
  131. package/src/Prebuilt/components/GoLiveButton.jsx +0 -42
  132. package/src/Prebuilt/components/Notifications/HeadlessEndRoomListener.tsx +0 -23
  133. package/src/Prebuilt/components/PrebuiltDialogPortal.tsx +0 -6
  134. package/src/Prebuilt/components/PrebuiltTileElements.tsx +0 -5
  135. package/src/Prebuilt/components/Streaming/HLSStreaming.jsx +0 -220
  136. package/src/Prebuilt/components/Streaming/RTMPStreaming.jsx +0 -334
  137. package/src/Prebuilt/components/Streaming/StreamingLanding.jsx +0 -76
  138. /package/dist/{HLSView-DDGPZHA2.js.map → HLSView-4JC65BAY.js.map} +0 -0
  139. /package/{src/Prebuilt/components/Notifications/index.jsx → dist/Prebuilt/components/Notifications/index.d.ts} +0 -0
  140. /package/src/Prebuilt/components/Notifications/{TrackNotifications.jsx → TrackNotifications.tsx} +0 -0
@@ -6,6 +6,17 @@ export declare const slideUp: (controller: string) => {
6
6
  (): string;
7
7
  name: string;
8
8
  };
9
+ export declare const translateAcross: ({ xFrom, yFrom, zFrom, xTo, yTo, zTo }: {
10
+ xFrom?: string | undefined;
11
+ yFrom?: string | undefined;
12
+ zFrom?: string | undefined;
13
+ xTo?: string | undefined;
14
+ yTo?: string | undefined;
15
+ zTo?: string | undefined;
16
+ }) => {
17
+ (): string;
18
+ name: string;
19
+ };
9
20
  export declare const dialogOpen: {
10
21
  (): string;
11
22
  name: string;
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "prebuilt",
11
11
  "roomkit"
12
12
  ],
13
- "version": "0.1.8",
13
+ "version": "0.1.9-alpha.1",
14
14
  "author": "100ms",
15
15
  "license": "MIT",
16
16
  "files": [
@@ -76,10 +76,10 @@
76
76
  "react": ">=17.0.2 <19.0.0"
77
77
  },
78
78
  "dependencies": {
79
- "@100mslive/hls-player": "0.1.17",
80
- "@100mslive/hms-virtual-background": "1.11.17",
81
- "@100mslive/react-icons": "0.8.17",
82
- "@100mslive/react-sdk": "0.8.17",
79
+ "@100mslive/hls-player": "0.1.18-alpha.1",
80
+ "@100mslive/hms-virtual-background": "1.11.18-alpha.1",
81
+ "@100mslive/react-icons": "0.8.18-alpha.1",
82
+ "@100mslive/react-sdk": "0.8.18-alpha.1",
83
83
  "@100mslive/types-prebuilt": "0.12.0",
84
84
  "@emoji-mart/data": "^1.0.6",
85
85
  "@emoji-mart/react": "^1.0.1",
@@ -106,7 +106,6 @@
106
106
  "qrcode.react": "^3.1.0",
107
107
  "react-draggable": "^4.4.5",
108
108
  "react-intersection-observer": "^9.4.3",
109
- "react-router-dom": "^6.3.0",
110
109
  "react-use": "^17.4.0",
111
110
  "react-virtualized-auto-sizer": "^1.0.7",
112
111
  "react-window": "^1.8.7",
@@ -115,5 +114,5 @@
115
114
  "uuid": "^8.3.2",
116
115
  "worker-timers": "^7.0.40"
117
116
  },
118
- "gitHead": "966ed9ffac3d55586196ad0b738eb1977dfc2ff7"
117
+ "gitHead": "ac35df485fe756c88bd2ebd40e421475ec748bb1"
119
118
  }
@@ -1,5 +1,7 @@
1
+ import React, { ReactNode, useRef } from 'react';
1
2
  import { Root } from '@radix-ui/react-dialog';
2
3
  import { styled } from '@stitches/react';
4
+ import { CSS } from '../Theme';
3
5
  import {
4
6
  DialogClose,
5
7
  DialogDefaultCloseIcon,
@@ -10,17 +12,43 @@ import {
10
12
  StyledDialogPortal,
11
13
  StyledDialogTrigger,
12
14
  } from './DialogContent';
15
+ import { useDialogContainerSelector } from '../hooks/useDialogContainerSelector';
13
16
 
14
17
  const StyledDialog = styled(Root, {});
18
+ const CustomDialogContent = ({ children, props = {}, css = {} }: { children: ReactNode; props?: any; css?: CSS }) => (
19
+ <StyledDialogContent css={{ ...css, position: 'absolute' }} {...props}>
20
+ {children}
21
+ </StyledDialogContent>
22
+ );
23
+ const CustomDialogOverlay = ({ css = {} }: { css?: CSS }) => (
24
+ <StyledDialogOverlay css={{ ...css, position: 'absolute' }} />
25
+ );
26
+ const CustomDialogPortal = ({ children, container }: { children: ReactNode; container?: HTMLElement | null }) => {
27
+ const dialogContainerSelector = useDialogContainerSelector();
28
+ const containerRef = useRef<HTMLElement | null>(null);
29
+
30
+ if (container) {
31
+ containerRef.current = container;
32
+ } else if (dialogContainerSelector && !containerRef.current) {
33
+ containerRef.current = document.querySelector(dialogContainerSelector) as HTMLElement;
34
+ } else if (!containerRef.current) {
35
+ containerRef.current = document.body;
36
+ }
37
+ return (
38
+ <StyledDialogPortal container={containerRef.current}>
39
+ <>{children}</>
40
+ </StyledDialogPortal>
41
+ );
42
+ };
15
43
 
16
44
  export const Dialog = {
17
45
  Root: StyledDialog,
18
46
  Trigger: StyledDialogTrigger,
19
- Overlay: StyledDialogOverlay,
20
- Content: StyledDialogContent,
47
+ Overlay: CustomDialogOverlay,
48
+ Content: CustomDialogContent,
21
49
  Title: DialogTitle,
22
50
  Description: DialogDescription,
23
51
  Close: DialogClose,
24
52
  DefaultClose: DialogDefaultCloseIcon,
25
- Portal: StyledDialogPortal,
53
+ Portal: CustomDialogPortal,
26
54
  };
@@ -1,5 +1,4 @@
1
- import React, { MutableRefObject, ReactElement, Suspense, useEffect, useRef } from 'react';
2
- import { BrowserRouter, MemoryRouter, Navigate, Route, Routes, useParams } from 'react-router-dom';
1
+ import React, { MutableRefObject, useEffect, useRef } from 'react';
3
2
  import { HMSStatsStoreWrapper, HMSStoreWrapper, IHMSNotifications } from '@100mslive/hms-video-store';
4
3
  import { Layout, Logo, Screens, Theme, Typography } from '@100mslive/types-prebuilt';
5
4
  import {
@@ -14,27 +13,25 @@ import {
14
13
  import { AppData } from './components/AppData/AppData';
15
14
  // @ts-ignore: No implicit Any
16
15
  import AuthToken from './components/AuthToken';
16
+ import { ConferenceScreen } from './components/ConferenceScreen';
17
17
  // @ts-ignore: No implicit Any
18
18
  import { ErrorBoundary } from './components/ErrorBoundary';
19
19
  // @ts-ignore: No implicit Any
20
- import FullPageProgress from './components/FullPageProgress';
21
- // @ts-ignore: No implicit Any
22
20
  import { Init } from './components/init/Init';
23
21
  // @ts-ignore: No implicit Any
24
22
  import { KeyboardHandler } from './components/Input/KeyboardInputManager';
25
- // @ts-ignore: No implicit Any
23
+ import { LeaveScreen } from './components/LeaveScreen';
24
+ import { MwebLandscapePrompt } from './components/MwebLandscapePrompt';
26
25
  import { Notifications } from './components/Notifications';
27
- import { HeadlessEndRoomListener } from './components/Notifications/HeadlessEndRoomListener';
28
- // @ts-ignore: No implicit Any
29
- import PostLeave from './components/PostLeave';
30
- // @ts-ignore: No implicit Any
31
- import PreviewContainer from './components/Preview/PreviewContainer';
26
+ import { PreviewScreen } from './components/Preview/PreviewScreen';
32
27
  // @ts-ignore: No implicit Any
33
28
  import { ToastContainer } from './components/Toast/ToastContainer';
34
29
  import { RoomLayoutContext, RoomLayoutProvider, useRoomLayout } from './provider/roomLayoutProvider';
30
+ import { DialogContainerProvider } from '../context/DialogContext';
35
31
  import { Box } from '../Layout';
36
32
  import { globalStyles, HMSThemeProvider } from '../Theme';
37
- import { HMSPrebuiltContext, useHMSPrebuiltContext } from './AppContext';
33
+ import { HMSPrebuiltContext } from './AppContext';
34
+ import { AppStateContext, PrebuiltStates, useAppStateManager } from './AppStateContext';
38
35
  // @ts-ignore: No implicit Any
39
36
  import { FlyingEmoji } from './plugins/FlyingEmoji';
40
37
  // @ts-ignore: No implicit Any
@@ -48,9 +45,8 @@ import {
48
45
  } from './provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
49
46
  // @ts-ignore: No implicit Any
50
47
  import { FeatureFlags } from './services/FeatureFlags';
51
-
52
48
  // @ts-ignore: No implicit Any
53
- const Conference = React.lazy(() => import('./components/conference'));
49
+ import { DEFAULT_PORTAL_CONTAINER } from './common/constants';
54
50
 
55
51
  export type HMSPrebuiltOptions = {
56
52
  userName?: string;
@@ -70,6 +66,11 @@ export type HMSPrebuiltProps = {
70
66
  role?: string;
71
67
  onLeave?: () => void;
72
68
  onJoin?: () => void;
69
+ /**
70
+ * @remarks
71
+ * Specify css selectors for the HTML element to be used as container for dialogs. Affects the positioning and focus of dialogs.
72
+ */
73
+ containerSelector?: string;
73
74
  };
74
75
 
75
76
  export type HMSPrebuiltRefType = {
@@ -86,6 +87,7 @@ export const HMSPrebuilt = React.forwardRef<HMSPrebuiltRefType, HMSPrebuiltProps
86
87
  authToken = '',
87
88
  roomId = '',
88
89
  role = '',
90
+ containerSelector = DEFAULT_PORTAL_CONTAINER,
89
91
  logo,
90
92
  typography,
91
93
  themes,
@@ -174,6 +176,7 @@ export const HMSPrebuilt = React.forwardRef<HMSPrebuiltRefType, HMSPrebuiltProps
174
176
  roomCode,
175
177
  roomId,
176
178
  role,
179
+ containerSelector,
177
180
  onLeave,
178
181
  onJoin,
179
182
  userName,
@@ -221,17 +224,23 @@ export const HMSPrebuilt = React.forwardRef<HMSPrebuiltRefType, HMSPrebuiltProps
221
224
  >
222
225
  <AppData appDetails={metadata} tokenEndpoint={tokenByRoomIdRoleEndpoint} />
223
226
  <Init />
224
- <Box
225
- id="prebuilt-container"
226
- css={{
227
- bg: '$background_dim',
228
- size: '100%',
229
- lineHeight: '1.5',
230
- '-webkit-text-size-adjust': '100%',
231
- }}
232
- >
233
- <AppRoutes authTokenByRoomCodeEndpoint={tokenByRoomCodeEndpoint} defaultAuthToken={authToken} />
234
- </Box>
227
+ <DialogContainerProvider dialogContainerSelector={containerSelector}>
228
+ <Box
229
+ id={DEFAULT_PORTAL_CONTAINER.slice(1)} //Skips the #
230
+ css={{
231
+ bg: '$background_dim',
232
+ size: '100%',
233
+ lineHeight: '1.5',
234
+ '-webkit-text-size-adjust': '100%',
235
+ position: 'relative',
236
+ }}
237
+ >
238
+ <AppRoutes
239
+ authTokenByRoomCodeEndpoint={tokenByRoomCodeEndpoint}
240
+ defaultAuthToken={authToken}
241
+ />
242
+ </Box>
243
+ </DialogContainerProvider>
235
244
  </HMSThemeProvider>
236
245
  );
237
246
  }}
@@ -246,66 +255,17 @@ export const HMSPrebuilt = React.forwardRef<HMSPrebuiltRefType, HMSPrebuiltProps
246
255
 
247
256
  HMSPrebuilt.displayName = 'HMSPrebuilt';
248
257
 
249
- const Redirector = ({ showPreview }: { showPreview: boolean }) => {
250
- const { roomId, role } = useParams();
251
- return <Navigate to={`/${showPreview ? 'preview' : 'meeting'}/${roomId}/${role || ''}`} />;
252
- };
253
-
254
- const RouteList = () => {
258
+ const AppStates = ({ activeState }: { activeState: PrebuiltStates }) => {
255
259
  const { isPreviewScreenEnabled } = useRoomLayoutPreviewScreen();
256
260
  const { isLeaveScreenEnabled } = useRoomLayoutLeaveScreen();
257
261
  useAutoStartStreaming();
258
- return (
259
- <Routes>
260
- {isPreviewScreenEnabled ? (
261
- <Route path="preview">
262
- <Route
263
- path=":roomId/:role"
264
- element={
265
- <Suspense fallback={<FullPageProgress text="Loading preview..." />}>
266
- <PreviewContainer />
267
- </Suspense>
268
- }
269
- />
270
- <Route
271
- path=":roomId"
272
- element={
273
- <Suspense fallback={<FullPageProgress text="Loading preview..." />}>
274
- <PreviewContainer />
275
- </Suspense>
276
- }
277
- />
278
- </Route>
279
- ) : null}
280
- <Route path="meeting">
281
- <Route
282
- path=":roomId/:role"
283
- element={
284
- <Suspense fallback={<FullPageProgress text="Joining..." />}>
285
- <Conference />
286
- </Suspense>
287
- }
288
- />
289
- <Route
290
- path=":roomId"
291
- element={
292
- <Suspense fallback={<FullPageProgress text="Joining..." />}>
293
- <Conference />
294
- </Suspense>
295
- }
296
- />
297
- </Route>
298
- {isLeaveScreenEnabled ? (
299
- <Route path="leave">
300
- <Route path=":roomId/:role" element={<PostLeave />} />
301
- <Route path=":roomId" element={<PostLeave />} />
302
- </Route>
303
- ) : null}
304
262
 
305
- <Route path="/:roomId/:role" element={<Redirector showPreview={isPreviewScreenEnabled} />} />
306
- <Route path="/:roomId/" element={<Redirector showPreview={isPreviewScreenEnabled} />} />
307
- </Routes>
308
- );
263
+ if (activeState === PrebuiltStates.PREVIEW && isPreviewScreenEnabled) {
264
+ return <PreviewScreen />;
265
+ } else if (activeState === PrebuiltStates.LEAVE && isLeaveScreenEnabled) {
266
+ return <LeaveScreen />;
267
+ }
268
+ return <ConferenceScreen />;
309
269
  };
310
270
 
311
271
  const BackSwipe = () => {
@@ -325,17 +285,6 @@ const BackSwipe = () => {
325
285
  return null;
326
286
  };
327
287
 
328
- const Router = ({ children }: { children: ReactElement }) => {
329
- const { roomId, role, roomCode } = useHMSPrebuiltContext();
330
- return [roomId, role, roomCode].every(value => !value) ? (
331
- <BrowserRouter>{children}</BrowserRouter>
332
- ) : (
333
- <MemoryRouter initialEntries={[`/${roomCode ? roomCode : `${roomId}/${role || ''}`}`]} initialIndex={0}>
334
- {children}
335
- </MemoryRouter>
336
- );
337
- };
338
-
339
288
  function AppRoutes({
340
289
  authTokenByRoomCodeEndpoint,
341
290
  defaultAuthToken,
@@ -345,23 +294,21 @@ function AppRoutes({
345
294
  }) {
346
295
  const roomLayout = useRoomLayout();
347
296
  const isNotificationsDisabled = useIsNotificationDisabled();
297
+ const { activeState, rejoin } = useAppStateManager();
298
+
348
299
  return (
349
- <Router>
300
+ <AppStateContext.Provider value={{ rejoin }}>
350
301
  <>
351
302
  <ToastContainer />
352
303
  <Notifications />
304
+ <MwebLandscapePrompt />
353
305
  <BackSwipe />
354
306
  {!isNotificationsDisabled && <FlyingEmoji />}
355
307
  <RemoteStopScreenshare />
356
- <HeadlessEndRoomListener />
357
308
  <KeyboardHandler />
358
309
  <AuthToken authTokenByRoomCodeEndpoint={authTokenByRoomCodeEndpoint} defaultAuthToken={defaultAuthToken} />
359
- {roomLayout && (
360
- <Routes>
361
- <Route path="/*" element={<RouteList />} />
362
- </Routes>
363
- )}
310
+ {roomLayout && activeState && <AppStates activeState={activeState} />}
364
311
  </>
365
- </Router>
312
+ </AppStateContext.Provider>
366
313
  );
367
314
  }
@@ -1,4 +1,6 @@
1
1
  import React, { useContext } from 'react';
2
+ // @ts-ignore
3
+ import { DEFAULT_PORTAL_CONTAINER } from './common/constants';
2
4
 
3
5
  type HMSPrebuiltContextType = {
4
6
  roomCode: string;
@@ -6,6 +8,7 @@ type HMSPrebuiltContextType = {
6
8
  role?: string;
7
9
  userName?: string;
8
10
  userId?: string;
11
+ containerSelector: string;
9
12
  endpoints?: Record<string, string>;
10
13
  onLeave?: () => void;
11
14
  onJoin?: () => void;
@@ -15,6 +18,7 @@ export const HMSPrebuiltContext = React.createContext<HMSPrebuiltContextType>({
15
18
  roomCode: '',
16
19
  userName: '',
17
20
  userId: '',
21
+ containerSelector: DEFAULT_PORTAL_CONTAINER,
18
22
  endpoints: {},
19
23
  onLeave: undefined,
20
24
  onJoin: undefined,
@@ -0,0 +1,71 @@
1
+ import React, { useContext, useEffect } from 'react';
2
+ import { usePreviousDistinct } from 'react-use';
3
+ import { HMSRoomState, selectRoomState, useHMSStore } from '@100mslive/react-sdk';
4
+ import { useRoomLayout } from './provider/roomLayoutProvider';
5
+ import { useRedirectToLeave } from './components/hooks/useRedirectToLeave';
6
+ import {
7
+ useRoomLayoutLeaveScreen,
8
+ useRoomLayoutPreviewScreen,
9
+ } from './provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
10
+
11
+ export enum PrebuiltStates {
12
+ MEETING = 'meeting',
13
+ PREVIEW = 'preview',
14
+ LEAVE = 'leave',
15
+ }
16
+
17
+ type AppStateContextType = {
18
+ rejoin: () => void;
19
+ };
20
+
21
+ export const AppStateContext = React.createContext<AppStateContextType>({
22
+ rejoin: () => {
23
+ console.log('Rejoin');
24
+ },
25
+ });
26
+
27
+ AppStateContext.displayName = 'AppStateContext';
28
+
29
+ export const useHMSAppStateContext = () => {
30
+ const context = useContext(AppStateContext);
31
+ if (!context) {
32
+ throw Error('Make sure AppStateContext.Provider is present at the top level of your application');
33
+ }
34
+ return context;
35
+ };
36
+
37
+ export const useAppStateManager = () => {
38
+ const roomLayout = useRoomLayout();
39
+ const [activeState, setActiveState] = React.useState<PrebuiltStates | undefined>();
40
+ const roomState = useHMSStore(selectRoomState);
41
+ const prevRoomState = usePreviousDistinct(roomState);
42
+ const { isLeaveScreenEnabled } = useRoomLayoutLeaveScreen();
43
+ const { isPreviewScreenEnabled } = useRoomLayoutPreviewScreen();
44
+ const { redirectToLeave } = useRedirectToLeave();
45
+
46
+ const rejoin = () => {
47
+ setActiveState(isPreviewScreenEnabled ? PrebuiltStates.PREVIEW : PrebuiltStates.MEETING);
48
+ };
49
+
50
+ useEffect(() => {
51
+ if (!roomLayout) {
52
+ return;
53
+ }
54
+ if (roomState === HMSRoomState.Connected) {
55
+ setActiveState(PrebuiltStates.MEETING);
56
+ } else if (
57
+ prevRoomState &&
58
+ [HMSRoomState.Reconnecting, HMSRoomState.Connected].includes(prevRoomState) &&
59
+ [HMSRoomState.Disconnecting, HMSRoomState.Disconnected].includes(roomState)
60
+ ) {
61
+ redirectToLeave().then(() => {
62
+ const goTo = isPreviewScreenEnabled ? PrebuiltStates.PREVIEW : PrebuiltStates.MEETING;
63
+ setActiveState(isLeaveScreenEnabled ? PrebuiltStates.LEAVE : goTo);
64
+ });
65
+ } else if (!prevRoomState && roomState === HMSRoomState.Disconnected) {
66
+ setActiveState(isPreviewScreenEnabled ? PrebuiltStates.PREVIEW : PrebuiltStates.MEETING);
67
+ }
68
+ }, [roomLayout, roomState, isLeaveScreenEnabled, isPreviewScreenEnabled, prevRoomState, redirectToLeave]);
69
+
70
+ return { activeState, rejoin };
71
+ };
@@ -45,6 +45,7 @@ export const APP_DATA = {
45
45
  minimiseInset: 'minimiseInset',
46
46
  activeScreensharePeerId: 'activeScreensharePeerId',
47
47
  disableNotifications: 'disableNotifications',
48
+ pollState: 'pollState',
48
49
  };
49
50
  export const UI_SETTINGS = {
50
51
  isAudioOnly: 'isAudioOnly',
@@ -59,6 +60,19 @@ export const SIDE_PANE_OPTIONS = {
59
60
  PARTICIPANTS: 'Participants',
60
61
  CHAT: 'Chat',
61
62
  STREAMING: 'STREAMING',
63
+ POLLS: 'POLLS',
64
+ };
65
+
66
+ export const POLL_STATE = {
67
+ pollInView: 'pollInView',
68
+ view: 'view',
69
+ };
70
+
71
+ export const POLL_VIEWS = {
72
+ CREATE_POLL_QUIZ: 'CREATE_POLL_QUIZ',
73
+ CREATE_QUESTIONS: 'CREATE_QUESTIONS',
74
+ VOTE: 'VOTE',
75
+ RESULTS: 'RESULTS',
62
76
  };
63
77
 
64
78
  export const SUBSCRIBED_NOTIFICATIONS = {
@@ -93,4 +107,25 @@ export const SESSION_STORE_KEY = {
93
107
  SPOTLIGHT: 'spotlight',
94
108
  };
95
109
 
110
+ export const INTERACTION_TYPE = {
111
+ POLL: 'Poll',
112
+ QUIZ: 'Quiz',
113
+ };
114
+
115
+ export const QUESTION_TYPE_TITLE = {
116
+ 'single-choice': 'Single Choice',
117
+ 'multiple-choice': 'Multiple Choice',
118
+ // "short-answer": "Short Answer",
119
+ // "long-answer": "Long Answer",
120
+ };
121
+
122
+ export const QUESTION_TYPE = {
123
+ SINGLE_CHOICE: 'single-choice',
124
+ MULTIPLE_CHOICE: 'multiple-choice',
125
+ // SHORT_ANSWER: "short-answer",
126
+ // LONG_ANSWER: "long-answer",
127
+ };
128
+
96
129
  export const ROLE_CHANGE_DECLINED = 'role_change_declined';
130
+
131
+ export const DEFAULT_PORTAL_CONTAINER = '#prebuilt-container';
@@ -1,3 +1,5 @@
1
+ import { QUESTION_TYPE } from './constants';
2
+
1
3
  // eslint-disable-next-line complexity
2
4
  export function shadeColor(color, percent) {
3
5
  let R = parseInt(color.substring(1, 3), 16);
@@ -88,3 +90,48 @@ export const formatTime = timeInSeconds => {
88
90
  const hour = hours !== 0 ? `${hours < 10 ? '0' : ''}${hours}:` : '';
89
91
  return `${hour}${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
90
92
  };
93
+
94
+ const compareArrays = (a, b) => {
95
+ if (a.length !== b.length) return false;
96
+ else {
97
+ // Comparing each element of your array
98
+ for (var i = 0; i < a.length; i++) {
99
+ if (a[i] !== b[i]) {
100
+ return false;
101
+ }
102
+ }
103
+ return true;
104
+ }
105
+ };
106
+
107
+ export const checkCorrectAnswer = (answer, localPeerResponse, type) => {
108
+ if (type === QUESTION_TYPE.SINGLE_CHOICE) {
109
+ return answer?.option === localPeerResponse?.option;
110
+ } else if (type === QUESTION_TYPE.MULTIPLE_CHOICE) {
111
+ return answer?.options && localPeerResponse?.options && compareArrays(answer?.options, localPeerResponse?.options);
112
+ }
113
+ };
114
+
115
+ export const isValidTextInput = (text, minLength = 1, maxLength = 100) => {
116
+ return text && text.length >= minLength && text.length <= maxLength;
117
+ };
118
+
119
+ export const calculateAvatarAndAttribBoxSize = (calculatedWidth, calculatedHeight) => {
120
+ if (!calculatedWidth || !calculatedHeight) {
121
+ return [undefined, undefined];
122
+ }
123
+
124
+ let avatarSize = 'large';
125
+ if (calculatedWidth <= 150 || calculatedHeight <= 150) {
126
+ avatarSize = 'small';
127
+ } else if (calculatedWidth <= 300 || calculatedHeight <= 300) {
128
+ avatarSize = 'medium';
129
+ }
130
+
131
+ let attribBoxSize = 'medium';
132
+ if (calculatedWidth <= 180 || calculatedHeight <= 180) {
133
+ attribBoxSize = 'small';
134
+ }
135
+
136
+ return [avatarSize, attribBoxSize];
137
+ };
@@ -21,6 +21,7 @@ import {
21
21
  APP_DATA,
22
22
  CHAT_SELECTOR,
23
23
  DEFAULT_WAITING_VIEWER_ROLE,
24
+ POLL_STATE,
24
25
  SIDE_PANE_OPTIONS,
25
26
  UI_MODE_GRID,
26
27
  UI_SETTINGS,
@@ -66,6 +67,10 @@ const initialAppData = {
66
67
  [APP_DATA.minimiseInset]: false,
67
68
  [APP_DATA.activeScreensharePeerId]: '',
68
69
  [APP_DATA.disableNotifications]: false,
70
+ [APP_DATA.pollState]: {
71
+ [POLL_STATE.pollInView]: '',
72
+ [POLL_STATE.view]: '',
73
+ },
69
74
  };
70
75
 
71
76
  export const AppData = React.memo(({ appDetails, tokenEndpoint }) => {
@@ -1,6 +1,7 @@
1
1
  import { useCallback } from 'react';
2
2
  import { selectAppData, useHMSActions, useHMSStore, useHMSVanillaStore } from '@100mslive/react-sdk';
3
- import { APP_DATA } from '../../common/constants';
3
+ import { usePollViewState } from './useUISettings';
4
+ import { APP_DATA, POLL_STATE, POLL_VIEWS, SIDE_PANE_OPTIONS } from '../../common/constants';
4
5
 
5
6
  /**
6
7
  * Gives a boolean value if the sidepaneType matches current sidepane value in store
@@ -37,6 +38,26 @@ export const useSidepaneToggle = sidepaneType => {
37
38
  return toggleSidepane;
38
39
  };
39
40
 
41
+ export const usePollViewToggle = () => {
42
+ const { view, setPollState } = usePollViewState();
43
+ const isOpen = useSidepaneState() === SIDE_PANE_OPTIONS.POLLS;
44
+ const toggleSidepane = useSidepaneToggle(SIDE_PANE_OPTIONS.POLLS);
45
+
46
+ const togglePollView = useCallback(
47
+ id => {
48
+ id = typeof id === 'string' ? id : undefined;
49
+ setPollState({
50
+ [POLL_STATE.pollInView]: id,
51
+ [POLL_STATE.view]: id ? POLL_VIEWS.VOTE : isOpen && view ? null : POLL_VIEWS.CREATE_POLL_QUIZ,
52
+ });
53
+ toggleSidepane();
54
+ },
55
+ [view, setPollState, isOpen, toggleSidepane],
56
+ );
57
+
58
+ return togglePollView;
59
+ };
60
+
40
61
  /**
41
62
  * reset's the sidepane value
42
63
  */
@@ -44,6 +65,7 @@ export const useSidepaneReset = () => {
44
65
  const hmsActions = useHMSActions();
45
66
  const resetSidepane = useCallback(() => {
46
67
  hmsActions.setAppData(APP_DATA.sidePane, '');
68
+ hmsActions.setAppData(APP_DATA.pollInView, '');
47
69
  }, [hmsActions]);
48
70
  return resetSidepane;
49
71
  };