@100mslive/roomkit-react 0.1.8 → 0.1.9-alpha.0

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 (139) hide show
  1. package/dist/{HLSView-DDGPZHA2.js → HLSView-U53QN3AC.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-PMLQPJB6.js} +3 -5
  25. package/dist/{VirtualBackground-UVZJVOA2.js.map → VirtualBackground-PMLQPJB6.js.map} +1 -1
  26. package/dist/chunk-ANQRGVIX.js +14441 -0
  27. package/dist/chunk-ANQRGVIX.js.map +7 -0
  28. package/dist/{chunk-6SQTFOK6.js → chunk-XQ2NRKIW.js} +66 -3
  29. package/dist/{chunk-6SQTFOK6.js.map → chunk-XQ2NRKIW.js.map} +4 -4
  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-HUMNPIYI.js +0 -70
  125. package/dist/chunk-HUMNPIYI.js.map +0 -7
  126. package/dist/chunk-PRM33R4R.js +0 -7160
  127. package/dist/chunk-PRM33R4R.js.map +0 -7
  128. package/dist/conference-N7S47TDK.js +0 -6602
  129. package/dist/conference-N7S47TDK.js.map +0 -7
  130. package/src/Prebuilt/components/GoLiveButton.jsx +0 -42
  131. package/src/Prebuilt/components/Notifications/HeadlessEndRoomListener.tsx +0 -23
  132. package/src/Prebuilt/components/PrebuiltDialogPortal.tsx +0 -6
  133. package/src/Prebuilt/components/PrebuiltTileElements.tsx +0 -5
  134. package/src/Prebuilt/components/Streaming/HLSStreaming.jsx +0 -220
  135. package/src/Prebuilt/components/Streaming/RTMPStreaming.jsx +0 -334
  136. package/src/Prebuilt/components/Streaming/StreamingLanding.jsx +0 -76
  137. /package/dist/{HLSView-DDGPZHA2.js.map → HLSView-U53QN3AC.js.map} +0 -0
  138. /package/{src/Prebuilt/components/Notifications/index.jsx → dist/Prebuilt/components/Notifications/index.d.ts} +0 -0
  139. /package/src/Prebuilt/components/Notifications/{TrackNotifications.jsx → TrackNotifications.tsx} +0 -0
@@ -1,5 +1,5 @@
1
- import React, { Fragment, useCallback, useRef, useState } from 'react';
2
- import { useMedia } from 'react-use';
1
+ import React, { Fragment, useCallback, useMemo, useState } from 'react';
2
+ import { useMeasure, useMedia } from 'react-use';
3
3
  import {
4
4
  selectAudioTrackByPeerID,
5
5
  selectHasPeerHandRaised,
@@ -22,12 +22,10 @@ import { config as cssConfig } from '../../Theme';
22
22
  import { Video } from '../../Video';
23
23
  import { StyledVideoTile } from '../../VideoTile';
24
24
  import { getVideoTileLabel } from './peerTileUtils';
25
- import { PrebuiltAttributeBox, PrebuiltAudioIndicator } from './PrebuiltTileElements';
26
25
  import { useSetAppDataByKey, useUISettings } from './AppData/useUISettings';
26
+ import { calculateAvatarAndAttribBoxSize } from '../common/utils';
27
27
  import { APP_DATA, SESSION_STORE_KEY, UI_SETTINGS } from '../common/constants';
28
28
 
29
- const iconDims = { height: '1rem', width: '1rem' };
30
-
31
29
  const Tile = ({
32
30
  peerId,
33
31
  trackId,
@@ -74,11 +72,14 @@ const Tile = ({
74
72
  setIsMouseHovered(event.type === 'mouseenter');
75
73
  }, []);
76
74
 
77
- const ref = useRef(null);
78
- const calculatedHeight = ref.current?.clientHeight || '';
79
- const calculatedWidth = ref.current?.clientWidth || '';
75
+ const [ref, { width: calculatedWidth, height: calculatedHeight }] = useMeasure();
76
+
80
77
  const isTileBigEnoughToShowStats = calculatedHeight >= 180 && calculatedWidth >= 180;
81
- const avatarSize = 'medium';
78
+
79
+ const [avatarSize, attribBoxSize] = useMemo(
80
+ () => calculateAvatarAndAttribBoxSize(calculatedWidth, calculatedHeight),
81
+ [calculatedWidth, calculatedHeight],
82
+ );
82
83
 
83
84
  return (
84
85
  <StyledVideoTile.Root
@@ -118,23 +119,27 @@ const Tile = ({
118
119
  bg: 'transparent',
119
120
  }}
120
121
  />
122
+ {calculatedWidth > 0 && calculatedHeight > 0 ? (
123
+ <>
124
+ {isVideoMuted || (!isLocal && isAudioOnly) ? (
125
+ <StyledVideoTile.AvatarContainer>
126
+ <Avatar name={peerName || ''} data-testid="participant_avatar_icon" size={avatarSize} />
127
+ </StyledVideoTile.AvatarContainer>
128
+ ) : null}
121
129
 
122
- {isVideoMuted || (!isLocal && isAudioOnly) ? (
123
- <StyledVideoTile.AvatarContainer>
124
- <Avatar name={peerName || ''} data-testid="participant_avatar_icon" size={avatarSize} />
125
- </StyledVideoTile.AvatarContainer>
126
- ) : null}
127
-
128
- {!hideAudioMuteOnTile ? (
129
- isAudioMuted ? (
130
- <PrebuiltAudioIndicator data-testid="participant_audio_mute_icon">
131
- <MicOffIcon style={iconDims} />
132
- </PrebuiltAudioIndicator>
133
- ) : (
134
- <PrebuiltAudioIndicator>
135
- <AudioLevel trackId={audioTrack?.id} />
136
- </PrebuiltAudioIndicator>
137
- )
130
+ {!hideAudioMuteOnTile ? (
131
+ isAudioMuted ? (
132
+ <StyledVideoTile.AudioIndicator data-testid="participant_audio_mute_icon" size={attribBoxSize}>
133
+ <MicOffIcon />
134
+ </StyledVideoTile.AudioIndicator>
135
+ ) : (
136
+ <StyledVideoTile.AudioIndicator size={attribBoxSize}>
137
+ <AudioLevel trackId={audioTrack?.id} size={attribBoxSize} />
138
+ </StyledVideoTile.AudioIndicator>
139
+ )
140
+ ) : null}
141
+ {!hideMetadataOnTile && <PeerMetadata peerId={peerId} size={attribBoxSize} />}
142
+ </>
138
143
  ) : null}
139
144
  {isMouseHovered || (isDragabble && isMobile) ? (
140
145
  <TileMenu
@@ -145,7 +150,6 @@ const Tile = ({
145
150
  enableSpotlightingPeer={enableSpotlightingPeer}
146
151
  />
147
152
  ) : null}
148
- {!hideMetadataOnTile && <PeerMetadata peerId={peerId} />}
149
153
 
150
154
  <TileConnection
151
155
  hideLabel={hideParticipantNameOnTile}
@@ -162,7 +166,7 @@ const Tile = ({
162
166
  );
163
167
  };
164
168
 
165
- const PeerMetadata = ({ peerId }) => {
169
+ const PeerMetadata = ({ peerId, size }) => {
166
170
  const metaData = useHMSStore(selectPeerMetadata(peerId));
167
171
  const isBRB = metaData?.isBRBOn || false;
168
172
  const isHandRaised = useHMSStore(selectHasPeerHandRaised(peerId));
@@ -170,14 +174,14 @@ const PeerMetadata = ({ peerId }) => {
170
174
  return (
171
175
  <Fragment>
172
176
  {isHandRaised ? (
173
- <PrebuiltAttributeBox data-testid="raiseHand_icon_onTile">
174
- <HandIcon style={iconDims} />
175
- </PrebuiltAttributeBox>
177
+ <StyledVideoTile.AttributeBox size={size} data-testid="raiseHand_icon_onTile">
178
+ <HandIcon width={24} height={24} />
179
+ </StyledVideoTile.AttributeBox>
176
180
  ) : null}
177
181
  {isBRB ? (
178
- <PrebuiltAttributeBox data-testid="brb_icon_onTile">
179
- <BrbTileIcon style={iconDims} />
180
- </PrebuiltAttributeBox>
182
+ <StyledVideoTile.AttributeBox size={size} data-testid="brb_icon_onTile">
183
+ <BrbTileIcon width={22} height={22} />
184
+ </StyledVideoTile.AttributeBox>
181
185
  ) : null}
182
186
  </Fragment>
183
187
  );
@@ -20,12 +20,12 @@ export const useAutoStartStreaming = () => {
20
20
  const showStreamingUI = useShowStreamingUI();
21
21
  const hmsActions = useHMSActions();
22
22
  const isConnected = useHMSStore(selectIsConnectedToRoom);
23
- const { isHLSRunning } = useRecordingStreaming();
23
+ const { isHLSRunning, isRTMPRunning } = useRecordingStreaming();
24
24
  const streamStartedRef = useRef(false);
25
25
 
26
26
  const startHLS = useCallback(async () => {
27
27
  try {
28
- if (isHLSStarted || !showStreamingUI || isHLSRunning) {
28
+ if (isHLSStarted || !showStreamingUI || isHLSRunning || isRTMPRunning) {
29
29
  return;
30
30
  }
31
31
  setHLSStarted(true);
@@ -38,7 +38,7 @@ export const useAutoStartStreaming = () => {
38
38
  streamStartedRef.current = false;
39
39
  setHLSStarted(false);
40
40
  }
41
- }, [hmsActions, isHLSRunning, isHLSStarted, setHLSStarted, showStreamingUI]);
41
+ }, [hmsActions, isHLSRunning, isHLSStarted, setHLSStarted, showStreamingUI, isRTMPRunning]);
42
42
 
43
43
  useEffect(() => {
44
44
  if (!isHLSStarted && !isHLSRunning) {
@@ -1,33 +1,25 @@
1
1
  import { useCallback } from 'react';
2
- import { useNavigate, useParams } from 'react-router-dom';
3
2
  import { useHMSPrebuiltContext } from '../../AppContext';
4
3
  // @ts-ignore: No implicit Any
5
4
  import { PictureInPicture } from '../PIP/PIPManager';
6
5
  // @ts-ignore: No implicit Any
7
6
  import { ToastManager } from '../Toast/ToastManager';
8
- import { useRoomLayoutLeaveScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
9
7
 
10
8
  export const useRedirectToLeave = () => {
11
- const { isLeaveScreenEnabled } = useRoomLayoutLeaveScreen();
12
9
  const { onLeave } = useHMSPrebuiltContext();
13
- const params = useParams();
14
- const navigate = useNavigate();
15
10
 
16
11
  const redirect = useCallback(
17
12
  (timeout = 0) => {
18
- setTimeout(() => {
19
- const prefix = isLeaveScreenEnabled ? '/leave/' : '/';
20
- if (params.role) {
21
- navigate(prefix + params.roomId + '/' + params.role);
22
- } else {
23
- navigate(prefix + params.roomId);
24
- }
25
- PictureInPicture.stop().catch(() => console.error('stopping pip'));
26
- ToastManager.clearAllToast();
27
- onLeave?.();
28
- }, timeout);
13
+ return new Promise<void>(resolve => {
14
+ setTimeout(() => {
15
+ PictureInPicture.stop().catch(() => console.error('stopping pip'));
16
+ ToastManager.clearAllToast();
17
+ onLeave?.();
18
+ resolve();
19
+ }, timeout);
20
+ });
29
21
  },
30
- [isLeaveScreenEnabled, navigate, onLeave, params.role, params.roomId],
22
+ [onLeave],
31
23
  );
32
24
 
33
25
  return { redirectToLeave: redirect };
@@ -1,7 +1,6 @@
1
1
  import React, { useState } from 'react';
2
2
  import { Dialog, Flex } from '../../../';
3
3
  import { DialogInputFile } from '../../primitives/DialogContent';
4
- import { PrebuiltDialogPortal } from '../PrebuiltDialogPortal';
5
4
  import { PDFHeader } from './pdfHeader';
6
5
  import { SubmitPDF } from './submitPdf';
7
6
  import { UploadedFile } from './uploadedFile';
@@ -11,7 +10,7 @@ export function PDFFileOptions({ onOpenChange }) {
11
10
 
12
11
  return !pdfFile ? (
13
12
  <Dialog.Root defaultOpen onOpenChange={onOpenChange}>
14
- <PrebuiltDialogPortal>
13
+ <Dialog.Portal>
15
14
  <Dialog.Overlay />
16
15
  <Dialog.Content
17
16
  css={{
@@ -35,7 +34,7 @@ export function PDFFileOptions({ onOpenChange }) {
35
34
  <SubmitPDF pdfFile={pdfFile} onOpenChange={onOpenChange} />
36
35
  </Flex>
37
36
  </Dialog.Content>
38
- </PrebuiltDialogPortal>
37
+ </Dialog.Portal>
39
38
  </Dialog.Root>
40
39
  ) : (
41
40
  <UploadedFile pdfFile={pdfFile} setPDFFile={setPDFFile} onOpenChange={onOpenChange} />
@@ -31,7 +31,7 @@ export const SubmitPDF = ({ pdfFile, onOpenChange }) => {
31
31
  type="submit"
32
32
  onClick={() => {
33
33
  if (pdfFile) {
34
- setPDFConfig({ state: true, file: pdfFile });
34
+ setPDFConfig(pdfFile);
35
35
  onOpenChange(false);
36
36
  }
37
37
  }}
@@ -2,7 +2,6 @@ import React from 'react';
2
2
  import { TrashIcon } from '@100mslive/react-icons';
3
3
  import { Dialog, Flex, Text } from '../../../';
4
4
  import { DialogRow } from '../../primitives/DialogContent';
5
- import { PrebuiltDialogPortal } from '../PrebuiltDialogPortal';
6
5
  import { PDFHeader } from './pdfHeader';
7
6
  import { PDFInfo } from './pdfInfo';
8
7
  import { SubmitPDF } from './submitPdf';
@@ -11,7 +10,7 @@ export const UploadedFile = ({ pdfFile, setPDFFile, onOpenChange }) => {
11
10
  const [fileName, ext] = pdfFile.name.split('.');
12
11
  return (
13
12
  <Dialog.Root defaultOpen onOpenChange={onOpenChange}>
14
- <PrebuiltDialogPortal>
13
+ <Dialog.Portal>
15
14
  <Dialog.Overlay />
16
15
  <Dialog.Content
17
16
  css={{
@@ -66,7 +65,7 @@ export const UploadedFile = ({ pdfFile, setPDFFile, onOpenChange }) => {
66
65
  <SubmitPDF pdfFile={pdfFile} onOpenChange={onOpenChange} />
67
66
  </Flex>
68
67
  </Dialog.Content>
69
- </PrebuiltDialogPortal>
68
+ </Dialog.Portal>
70
69
  </Dialog.Root>
71
70
  );
72
71
  };
@@ -1,26 +1,21 @@
1
- import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
- import {
3
- selectPeers,
4
- selectPeerScreenSharing,
5
- throwErrorHandler,
6
- useHMSStore,
7
- useScreenShare,
8
- } from '@100mslive/react-sdk';
1
+ import React, { useEffect, useMemo } from 'react';
2
+ import { selectAppData, selectPeers, selectPeerScreenSharing, useEmbedShare, useHMSStore } from '@100mslive/react-sdk';
9
3
  import { SecondaryTiles } from '../components/SecondaryTiles';
4
+ import { ToastManager } from '../components/Toast/ToastManager';
10
5
  import { ProminenceLayout } from '../components/VideoLayouts/ProminenceLayout';
11
6
  import { Box } from '../../Layout';
12
- import { useSetAppDataByKey } from '../components/AppData/useUISettings';
7
+ import { useResetEmbedConfig, useSetAppDataByKey } from '../components/AppData/useUISettings';
13
8
  import { APP_DATA } from '../common/constants';
14
9
 
15
10
  export const EmbedView = () => {
16
11
  return (
17
- <EmbebScreenShareView>
12
+ <EmbedScreenShareView>
18
13
  <EmbedComponent />
19
- </EmbebScreenShareView>
14
+ </EmbedScreenShareView>
20
15
  );
21
16
  };
22
17
 
23
- export const EmbebScreenShareView = ({ children }) => {
18
+ export const EmbedScreenShareView = ({ children }) => {
24
19
  const peers = useHMSStore(selectPeers);
25
20
 
26
21
  const peerPresenting = useHMSStore(selectPeerScreenSharing);
@@ -44,62 +39,54 @@ export const EmbebScreenShareView = ({ children }) => {
44
39
  </ProminenceLayout.Root>
45
40
  );
46
41
  };
47
-
42
+ /**
43
+ * EmbedView is responsible for rendering the iframe and managing the screen sharing functionality.
44
+ */
48
45
  const EmbedComponent = () => {
49
- const { amIScreenSharing, toggleScreenShare } = useScreenShare(throwErrorHandler);
50
- const [embedConfig, setEmbedConfig] = useSetAppDataByKey(APP_DATA.embedConfig);
51
- const [wasScreenShared, setWasScreenShared] = useState(false);
52
- // to handle - https://github.com/facebook/react/issues/24502
53
- const screenShareAttemptInProgress = useRef(false);
54
- const src = embedConfig.url;
55
- const iframeRef = useRef();
56
-
57
- const resetEmbedConfig = useCallback(() => {
58
- if (src) {
59
- setEmbedConfig({ url: '' });
60
- }
61
- }, [src, setEmbedConfig]);
46
+ const embedConfig = useHMSStore(selectAppData(APP_DATA.embedConfig));
47
+ const resetConfig = useResetEmbedConfig();
62
48
 
63
- useEffect(() => {
64
- if (embedConfig.shareScreen && !amIScreenSharing && !wasScreenShared && !screenShareAttemptInProgress.current) {
65
- screenShareAttemptInProgress.current = true;
66
- // start screenshare on load for others in the room to see
67
- toggleScreenShare({
68
- forceCurrentTab: true,
69
- cropElement: iframeRef.current,
70
- })
71
- .then(() => {
72
- setWasScreenShared(true);
73
- })
74
- .catch(resetEmbedConfig)
75
- .finally(() => {
76
- screenShareAttemptInProgress.current = false;
77
- });
78
- }
79
- // eslint-disable-next-line react-hooks/exhaustive-deps
80
- }, []);
49
+ // need to send resetConfig to clear configuration, if stop screenshare occurs.
50
+ const { iframeRef, startEmbedShare, isEmbedShareInProgress } = useEmbedShare(resetConfig);
81
51
 
82
52
  useEffect(() => {
83
- // reset embed when screenshare is closed from anywhere
84
- if (wasScreenShared && !amIScreenSharing) {
85
- resetEmbedConfig();
86
- }
87
- return () => {
88
- // close screenshare when this component is being unmounted
89
- if (wasScreenShared && amIScreenSharing) {
90
- resetEmbedConfig();
91
- toggleScreenShare(); // stop
53
+ (async () => {
54
+ if (embedConfig && !isEmbedShareInProgress) {
55
+ try {
56
+ await startEmbedShare(embedConfig);
57
+ } catch (err) {
58
+ resetConfig();
59
+ ToastManager.addToast({
60
+ title: `Error while sharing embed url ${err.message || ''}`,
61
+ variant: 'error',
62
+ });
63
+ }
92
64
  }
93
- };
94
- }, [wasScreenShared, amIScreenSharing, resetEmbedConfig, toggleScreenShare]);
65
+ })();
66
+ }, [isEmbedShareInProgress, embedConfig, startEmbedShare, resetConfig]);
95
67
 
96
68
  return (
97
- <Box ref={iframeRef} css={{ size: '100%' }}>
69
+ <Box
70
+ css={{
71
+ mx: '$8',
72
+ flex: '3 1 0',
73
+ '@lg': {
74
+ flex: '2 1 0',
75
+ display: 'flex',
76
+ alignItems: 'center',
77
+ },
78
+ }}
79
+ >
98
80
  <iframe
99
- src={src}
100
- title={src}
101
- style={{ width: '100%', height: '100%', border: 0 }}
102
- allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture fullscreen"
81
+ title="Embed View"
82
+ ref={iframeRef}
83
+ style={{
84
+ width: '100%',
85
+ height: '100%',
86
+ border: 0,
87
+ borderRadius: '0.75rem',
88
+ }}
89
+ allow="autoplay; clipboard-write;"
103
90
  referrerPolicy="no-referrer"
104
91
  />
105
92
  </Box>
@@ -1,111 +1,61 @@
1
- import React, { useCallback, useEffect, useRef, useState } from 'react';
2
- import { throwErrorHandler, useScreenShare } from '@100mslive/react-sdk';
1
+ import React, { useEffect } from 'react';
2
+ import { usePDFShare } from '@100mslive/react-sdk';
3
+ import { ToastManager } from '../components/Toast/ToastManager';
3
4
  import { Box } from '../../Layout';
4
- import { ThemeTypes, useTheme } from '../../Theme';
5
- import { EmbebScreenShareView } from './EmbedView';
6
- import { useSetAppDataByKey } from '../components/AppData/useUISettings';
7
- import { APP_DATA, isChrome } from '../common/constants';
5
+ import { EmbedScreenShareView } from './EmbedView';
6
+ import { usePDFConfig, useResetPDFConfig } from '../components/AppData/useUISettings';
8
7
 
8
+ /**
9
+ * PDFView is responsible for rendering the PDF iframe and managing the screen sharing functionality.
10
+ */
9
11
  export const PDFView = () => {
10
- return (
11
- <EmbebScreenShareView>
12
- <PDFEmbedComponent />
13
- </EmbebScreenShareView>
14
- );
15
- };
12
+ const pdfConfig = usePDFConfig();
13
+ const resetConfig = useResetPDFConfig();
16
14
 
17
- export const PDFEmbedComponent = () => {
18
- const ref = useRef();
19
- const themeType = useTheme().themeType;
20
- const [isPDFLoaded, setIsPDFLoaded] = useState(false);
21
- let pdfJSURL = process.env.REACT_APP_PDFJS_IFRAME_URL;
22
- const { amIScreenSharing, toggleScreenShare } = useScreenShare(throwErrorHandler);
23
- const [pdfConfig, setPDFConfig] = useSetAppDataByKey(APP_DATA.pdfConfig);
24
- if (pdfConfig.url && !pdfConfig.file) {
25
- pdfJSURL = pdfJSURL + '?file=' + encodeURIComponent(pdfConfig.url);
26
- }
27
- const [wasScreenShared, setWasScreenShared] = useState(false);
28
- // to handle - https://github.com/facebook/react/issues/24502
29
- const screenShareAttemptInProgress = useRef(false);
30
- const iframeRef = useRef();
15
+ // need to send resetConfig to clear configuration, if stop screenshare occurs.
16
+ const { iframeRef, startPDFShare, isPDFShareInProgress } = usePDFShare(resetConfig);
31
17
 
32
- const resetEmbedConfig = useCallback(() => {
33
- setPDFConfig({ state: false });
34
- }, [setPDFConfig]);
35
- useEffect(() => {
36
- if (isPDFLoaded && ref.current) {
37
- ref.current.contentWindow.postMessage(
38
- {
39
- theme: themeType === ThemeTypes.dark ? 2 : 1,
40
- },
41
- '*',
42
- );
43
- }
44
- }, [isPDFLoaded, themeType]);
45
18
  useEffect(() => {
46
- if (!amIScreenSharing && !wasScreenShared && !screenShareAttemptInProgress.current) {
47
- screenShareAttemptInProgress.current = true;
48
- // start screenshare on load for others in the room to see
49
- toggleScreenShare({
50
- forceCurrentTab: isChrome,
51
- cropElement: iframeRef.current,
52
- preferCurrentTab: isChrome,
53
- })
54
- .then(() => {
55
- setWasScreenShared(true);
56
- })
57
- .catch(resetEmbedConfig)
58
- .finally(() => {
59
- screenShareAttemptInProgress.current = false;
19
+ (async () => {
20
+ try {
21
+ if (!isPDFShareInProgress && pdfConfig) {
22
+ await startPDFShare(pdfConfig);
23
+ }
24
+ } catch (err) {
25
+ resetConfig();
26
+ ToastManager.addToast({
27
+ title: `Error while sharing annotator ${err.message || ''}`,
28
+ variant: 'error',
60
29
  });
61
- }
62
- // eslint-disable-next-line react-hooks/exhaustive-deps
63
- }, []);
64
-
65
- useEffect(() => {
66
- // reset embed when screenshare is closed from anywhere
67
- if (wasScreenShared && !amIScreenSharing) {
68
- resetEmbedConfig();
69
- }
70
- return () => {
71
- // close screenshare when this component is being unmounted
72
- if (wasScreenShared && amIScreenSharing) {
73
- resetEmbedConfig();
74
- toggleScreenShare(); // stop
75
30
  }
76
- };
77
- }, [wasScreenShared, amIScreenSharing, resetEmbedConfig, toggleScreenShare]);
78
-
31
+ })();
32
+ }, [isPDFShareInProgress, pdfConfig, resetConfig, startPDFShare]);
79
33
  return (
80
- <Box ref={iframeRef} css={{ size: '100%' }}>
81
- <iframe
82
- src={pdfJSURL}
83
- title="PDF Annotator"
84
- ref={ref}
85
- style={{
86
- width: '100%',
87
- height: '100%',
88
- border: 0,
89
- borderRadius: '0.75rem',
90
- }}
91
- allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture fullscreen"
92
- referrerPolicy="no-referrer"
93
- onLoad={() => {
94
- if (ref.current && pdfConfig.file) {
95
- // setting theme dark -> 2 and light -> 1
96
- requestAnimationFrame(() => {
97
- ref.current.contentWindow.postMessage(
98
- {
99
- file: pdfConfig.file,
100
- theme: themeType === ThemeTypes.dark ? 2 : 1,
101
- },
102
- '*',
103
- );
104
- setIsPDFLoaded(true);
105
- }, 1000);
106
- }
34
+ <EmbedScreenShareView>
35
+ <Box
36
+ css={{
37
+ mx: '$8',
38
+ flex: '3 1 0',
39
+ '@lg': {
40
+ flex: '2 1 0',
41
+ display: 'flex',
42
+ alignItems: 'center',
43
+ },
107
44
  }}
108
- />
109
- </Box>
45
+ >
46
+ <iframe
47
+ title="Embed View"
48
+ ref={iframeRef}
49
+ style={{
50
+ width: '100%',
51
+ height: '100%',
52
+ border: 0,
53
+ borderRadius: '0.75rem',
54
+ }}
55
+ allow="autoplay; clipboard-write;"
56
+ referrerPolicy="no-referrer"
57
+ />
58
+ </Box>
59
+ </EmbedScreenShareView>
110
60
  );
111
61
  };
@@ -2,15 +2,15 @@ import React from 'react';
2
2
  import { useMedia } from 'react-use';
3
3
  import { ConferencingScreen } from '@100mslive/types-prebuilt';
4
4
  import { selectAppData, selectVideoTrackByPeerID, useHMSStore } from '@100mslive/react-sdk';
5
+ import { Polls } from '../components/Polls/Polls';
5
6
  import { SidePaneTabs } from '../components/SidePaneTabs';
6
- // @ts-ignore: No implicit Any
7
- import { StreamingLanding } from '../components/Streaming/StreamingLanding';
8
7
  import { TileCustomisationProps } from '../components/VideoLayouts/GridLayout';
9
8
  // @ts-ignore: No implicit Any
10
9
  import VideoTile from '../components/VideoTile';
11
10
  import { Box, Flex } from '../../Layout';
12
11
  import { config as cssConfig } from '../../Theme';
13
12
  import { useRoomLayoutConferencingScreen } from '../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
13
+ import { translateAcross } from '../../utils';
14
14
  // @ts-ignore: No implicit Any
15
15
  import { APP_DATA, SIDE_PANE_OPTIONS } from '../common/constants';
16
16
 
@@ -29,10 +29,11 @@ const SidePane = ({
29
29
  const trackId = useHMSStore(selectVideoTrackByPeerID(activeScreensharePeerId))?.id;
30
30
  const { elements } = useRoomLayoutConferencingScreen();
31
31
  let ViewComponent;
32
+ if (sidepane === SIDE_PANE_OPTIONS.POLLS) {
33
+ ViewComponent = <Polls />;
34
+ }
32
35
  if (sidepane === SIDE_PANE_OPTIONS.PARTICIPANTS || sidepane === SIDE_PANE_OPTIONS.CHAT) {
33
36
  ViewComponent = <SidePaneTabs screenType={screenType} hideControls={hideControls} active={sidepane} />;
34
- } else if (sidepane === SIDE_PANE_OPTIONS.STREAMING) {
35
- ViewComponent = <StreamingLanding />;
36
37
  }
37
38
  if (!ViewComponent && !trackId) {
38
39
  return null;
@@ -97,6 +98,9 @@ const SidePane = ({
97
98
  '@md': {
98
99
  p: '$6 $8',
99
100
  pb: mwebStreamingChat ? '$20' : '$12',
101
+ borderTopLeftRadius: sidepane === SIDE_PANE_OPTIONS.POLLS ? '$2' : '0',
102
+ borderTopRightRadius: sidepane === SIDE_PANE_OPTIONS.POLLS ? '$2' : '0',
103
+ animation: `${translateAcross({ yFrom: '100%' })} 150ms cubic-bezier(0.22, 1, 0.36, 1)`,
100
104
  },
101
105
  }}
102
106
  >
@@ -18,7 +18,7 @@ import SidePane from './SidePane';
18
18
  import { WaitingView } from './WaitingView';
19
19
  // import { useWhiteboardMetadata } from '../plugins/whiteboard';
20
20
  import {
21
- usePDFAnnotator,
21
+ usePDFConfig,
22
22
  useUrlToEmbed,
23
23
  useWaitingViewerRole,
24
24
  // @ts-ignore: No implicit Any
@@ -45,7 +45,7 @@ export const VideoStreamingSection = ({
45
45
  const hmsActions = useHMSActions();
46
46
  const waitingViewerRole = useWaitingViewerRole();
47
47
  const urlToIframe = useUrlToEmbed();
48
- const pdfAnnotatorActive = usePDFAnnotator();
48
+ const pdfAnnotatorActive = usePDFConfig();
49
49
 
50
50
  useEffect(() => {
51
51
  if (!isConnected) {
@@ -1,6 +1,5 @@
1
1
  import React, { useRef } from 'react';
2
2
  import { CheckIcon, CloudUploadIcon, CrossIcon } from '@100mslive/react-icons';
3
- import { PrebuiltDialogPortal } from '../components/PrebuiltDialogPortal';
4
3
  import { Button } from '../../Button';
5
4
  import { Checkbox } from '../../Checkbox';
6
5
  import { HorizontalDivider } from '../../Divider';
@@ -15,7 +14,7 @@ import { Text } from '../../Text';
15
14
 
16
15
  export const DialogContent = ({ Icon, title, closeable = true, children, css, iconCSS = {}, ...props }) => {
17
16
  return (
18
- <PrebuiltDialogPortal>
17
+ <Dialog.Portal>
19
18
  <Dialog.Overlay />
20
19
  <Dialog.Content css={{ width: 'min(600px, 100%)', ...css }} {...props}>
21
20
  <Dialog.Title>
@@ -36,7 +35,7 @@ export const DialogContent = ({ Icon, title, closeable = true, children, css, ic
36
35
  <HorizontalDivider css={{ mt: '0.8rem' }} />
37
36
  <Box>{children}</Box>
38
37
  </Dialog.Content>
39
- </PrebuiltDialogPortal>
38
+ </Dialog.Portal>
40
39
  );
41
40
  };
42
41
 
@@ -61,7 +60,7 @@ export const ErrorDialog = ({ open = true, onOpenChange, title, children, ...pro
61
60
 
62
61
  export const RequestDialog = ({ open = true, onOpenChange, title, body, actionText = 'Accept', onAction, Icon }) => (
63
62
  <Dialog.Root open={open} onOpenChange={onOpenChange}>
64
- <PrebuiltDialogPortal>
63
+ <Dialog.Portal>
65
64
  <Dialog.Overlay />
66
65
  <Dialog.Content css={{ width: 'min(400px,80%)', p: '$10' }}>
67
66
  <Dialog.Title css={{ p: 0, display: 'flex', flexDirection: 'row', gap: '$md' }}>
@@ -98,7 +97,7 @@ export const RequestDialog = ({ open = true, onOpenChange, title, body, actionTe
98
97
  </Box>
99
98
  </Flex>
100
99
  </Dialog.Content>
101
- </PrebuiltDialogPortal>
100
+ </Dialog.Portal>
102
101
  </Dialog.Root>
103
102
  );
104
103