@100mslive/roomkit-react 0.2.7-alpha.0 → 0.2.7-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 (51) hide show
  1. package/README.md +30 -33
  2. package/dist/{HLSView-E65JZSU4.js → HLSView-4B5MUDFR.js} +2 -2
  3. package/dist/Prebuilt/common/constants.d.ts +4 -8
  4. package/dist/Prebuilt/components/AudioVideoToggle.d.ts +9 -0
  5. package/dist/Prebuilt/components/IconButtonWithOptions/IconButtonWithOptions.d.ts +11 -0
  6. package/dist/Prebuilt/components/Polls/common/utils.d.ts +1 -1
  7. package/dist/Prebuilt/components/hooks/useAudioOutputTest.d.ts +8 -0
  8. package/dist/Prebuilt/provider/roomLayoutProvider/hooks/useRoomLayoutScreen.d.ts +0 -5
  9. package/dist/{chunk-DWLYDCFC.js → chunk-KST24BRA.js} +5297 -5064
  10. package/dist/chunk-KST24BRA.js.map +7 -0
  11. package/dist/index.cjs.js +6302 -6130
  12. package/dist/index.cjs.js.map +4 -4
  13. package/dist/index.js +1 -1
  14. package/dist/meta.cjs.json +745 -1109
  15. package/dist/meta.esbuild.json +761 -1125
  16. package/package.json +8 -7
  17. package/src/Prebuilt/App.tsx +0 -2
  18. package/src/Prebuilt/common/constants.ts +7 -10
  19. package/src/Prebuilt/components/AppData/AppData.tsx +0 -1
  20. package/src/Prebuilt/components/AppData/useUISettings.js +1 -1
  21. package/src/Prebuilt/components/AudioVideoToggle.tsx +308 -0
  22. package/src/Prebuilt/components/Footer/RoleOptions.tsx +1 -0
  23. package/src/Prebuilt/components/Header/Header.tsx +0 -2
  24. package/src/Prebuilt/components/IconButtonWithOptions/IconButtonWithOptions.tsx +159 -0
  25. package/src/Prebuilt/components/Leave/DesktopLeaveRoom.tsx +0 -2
  26. package/src/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.tsx +2 -18
  27. package/src/Prebuilt/components/Notifications/HandRaisedNotifications.tsx +13 -2
  28. package/src/Prebuilt/components/Notifications/Notifications.tsx +1 -18
  29. package/src/Prebuilt/components/Polls/common/utils.ts +9 -15
  30. package/src/Prebuilt/components/Settings/DeviceSettings.jsx +10 -17
  31. package/src/Prebuilt/components/hooks/useAudioOutputTest.tsx +20 -0
  32. package/src/Prebuilt/layouts/SidePane.tsx +0 -4
  33. package/src/Prebuilt/provider/roomLayoutProvider/hooks/useRoomLayoutScreen.ts +0 -40
  34. package/dist/Prebuilt/components/AppData/useSheet.d.ts +0 -4
  35. package/dist/Prebuilt/components/Header/RoomDetailsHeader.d.ts +0 -2
  36. package/dist/Prebuilt/components/RoomDetails/Duration.d.ts +0 -4
  37. package/dist/Prebuilt/components/RoomDetails/RoomDetailsPane.d.ts +0 -2
  38. package/dist/Prebuilt/components/RoomDetails/RoomDetailsRow.d.ts +0 -4
  39. package/dist/Prebuilt/components/RoomDetails/RoomDetailsSheet.d.ts +0 -2
  40. package/dist/Prebuilt/layouts/Sheet.d.ts +0 -2
  41. package/dist/chunk-DWLYDCFC.js.map +0 -7
  42. package/src/Prebuilt/components/AppData/useSheet.ts +0 -33
  43. package/src/Prebuilt/components/AudioVideoToggle.jsx +0 -171
  44. package/src/Prebuilt/components/Header/RoomDetailsHeader.tsx +0 -51
  45. package/src/Prebuilt/components/IconButtonWithOptions/IconButtonWithOptions.jsx +0 -121
  46. package/src/Prebuilt/components/RoomDetails/Duration.tsx +0 -26
  47. package/src/Prebuilt/components/RoomDetails/RoomDetailsPane.tsx +0 -36
  48. package/src/Prebuilt/components/RoomDetails/RoomDetailsRow.tsx +0 -23
  49. package/src/Prebuilt/components/RoomDetails/RoomDetailsSheet.tsx +0 -45
  50. package/src/Prebuilt/layouts/Sheet.tsx +0 -14
  51. /package/dist/{HLSView-E65JZSU4.js.map → HLSView-4B5MUDFR.js.map} +0 -0
@@ -11,25 +11,36 @@ import {
11
11
  // @ts-ignore: No implicit Any
12
12
  import { ToastBatcher } from '../Toast/ToastBatcher';
13
13
  import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
14
+ // @ts-ignore: No implicit Any
15
+ import { useSubscribedNotifications } from '../AppData/useUISettings';
14
16
 
15
17
  export const HandRaisedNotifications = () => {
16
18
  const notification = useHMSNotifications(HMSNotificationTypes.HAND_RAISE_CHANGED);
17
19
  const roomState = useHMSStore(selectRoomState);
18
20
  const vanillaStore = useHMSVanillaStore();
19
21
  const { on_stage_exp } = useRoomLayoutConferencingScreen().elements || {};
22
+ const subscribedNotifications = useSubscribedNotifications();
20
23
 
21
24
  useEffect(() => {
22
25
  if (!notification?.data) {
23
26
  return;
24
27
  }
25
- if (roomState !== HMSRoomState.Connected || notification.data.isLocal || !on_stage_exp) {
28
+
29
+ // Don't show toast message in case of local peer.
30
+ if (
31
+ roomState !== HMSRoomState.Connected ||
32
+ notification.data.isLocal ||
33
+ !on_stage_exp ||
34
+ !subscribedNotifications.METADATA_UPDATED
35
+ ) {
26
36
  return;
27
37
  }
28
38
  const hasPeerHandRaised = vanillaStore.getState(selectHasPeerHandRaised(notification.data.id));
29
39
  if (hasPeerHandRaised) {
30
40
  ToastBatcher.showToast({ notification, type: 'RAISE_HAND' });
41
+ console.debug('Metadata updated', notification.data);
31
42
  }
32
- }, [notification, on_stage_exp, roomState, vanillaStore]);
43
+ }, [notification, on_stage_exp, roomState, subscribedNotifications.METADATA_UPDATED, vanillaStore]);
33
44
 
34
45
  return null;
35
46
  };
@@ -16,8 +16,6 @@ import { GroupIcon } from '@100mslive/react-icons';
16
16
  import { Box, Button } from '../../..';
17
17
  import { useUpdateRoomLayout } from '../../provider/roomLayoutProvider';
18
18
  // @ts-ignore: No implicit Any
19
- import { ToastBatcher } from '../Toast/ToastBatcher';
20
- // @ts-ignore: No implicit Any
21
19
  import { ToastManager } from '../Toast/ToastManager';
22
20
  import { AutoplayBlockedModal } from './AutoplayBlockedModal';
23
21
  import { ChatNotifications } from './ChatNotifications';
@@ -34,8 +32,6 @@ import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvid
34
32
  import { usePollViewToggle } from '../AppData/useSidepane';
35
33
  // @ts-ignore: No implicit Any
36
34
  import { useIsNotificationDisabled, useSubscribedNotifications } from '../AppData/useUISettings';
37
- // @ts-ignore: No implicit Any
38
- import { getMetadata } from '../../common/utils';
39
35
  import { ROLE_CHANGE_DECLINED } from '../../common/constants';
40
36
 
41
37
  const pollToastKey: Record<string, string> = {};
@@ -43,7 +39,7 @@ const pollToastKey: Record<string, string> = {};
43
39
  export function Notifications() {
44
40
  const localPeerID = useHMSStore(selectLocalPeerID);
45
41
  const notification = useHMSNotifications();
46
- const subscribedNotifications = useSubscribedNotifications() || {};
42
+ const subscribedNotifications = useSubscribedNotifications();
47
43
  const roomState = useHMSStore(selectRoomState);
48
44
  const updateRoomLayoutForRole = useUpdateRoomLayout();
49
45
  const isNotificationDisabled = useIsNotificationDisabled();
@@ -65,19 +61,6 @@ export function Notifications() {
65
61
  return;
66
62
  }
67
63
  switch (notification.type) {
68
- case HMSNotificationTypes.METADATA_UPDATED:
69
- if (roomState !== HMSRoomState.Connected) {
70
- return;
71
- }
72
- // Don't show toast message when metadata is updated and raiseHand is false.
73
- // Don't show toast message in case of local peer.
74
- const metadata = getMetadata(notification.data?.metadata);
75
- if (!metadata?.isHandRaised || notification.data.isLocal) return;
76
-
77
- console.debug('Metadata updated', notification.data);
78
- if (!subscribedNotifications.METADATA_UPDATED) return;
79
- ToastBatcher.showToast({ notification, type: 'RAISE_HAND' });
80
- break;
81
64
  case HMSNotificationTypes.NAME_UPDATED:
82
65
  console.log(notification.data.id + ' changed their name to ' + notification.data.name);
83
66
  break;
@@ -1,22 +1,16 @@
1
- export const getFormattedTime = (milliseconds: number | undefined, precise = true) => {
1
+ export const getFormattedTime = (milliseconds: number | undefined) => {
2
2
  if (!milliseconds) return '-';
3
3
 
4
4
  const totalSeconds = milliseconds / 1000;
5
- const hours = Math.floor(totalSeconds / 3600);
6
- const minutes = Math.floor((totalSeconds % 3600) / 60);
7
- const seconds = precise ? totalSeconds % 60 : Math.floor(totalSeconds % 60);
5
+ const minutes = Math.floor(totalSeconds / 60);
6
+ const seconds = totalSeconds % 60;
8
7
 
9
- let formattedTime = '';
10
- if (hours) {
11
- formattedTime += `${hours}h `;
8
+ let formattedSeconds = '';
9
+ if (Number.isInteger(seconds) || minutes) {
10
+ formattedSeconds = seconds.toFixed(0);
11
+ } else {
12
+ formattedSeconds = seconds.toFixed(1);
12
13
  }
13
- if (minutes || hours) {
14
- formattedTime += `${minutes}m `;
15
- }
16
- if (!precise && (hours || minutes)) {
17
- return formattedTime;
18
- }
19
- formattedTime += `${seconds}s`;
20
14
 
21
- return formattedTime;
15
+ return `${minutes ? `${minutes}m ` : ''}${formattedSeconds}s`;
22
16
  };
@@ -14,9 +14,10 @@ import { Box, Button, Dropdown, Flex, StyledVideoTile, Text, Video } from '../..
14
14
  import { config as cssConfig } from '../../../Theme';
15
15
  import { DialogDropdownTrigger } from '../../primitives/DropdownTrigger';
16
16
  import { useUISettings } from '../AppData/useUISettings';
17
+ import { useAudioOutputTest } from '../hooks/useAudioOutputTest';
17
18
  import { useDropdownSelection } from '../hooks/useDropdownSelection';
18
19
  import { settingOverflow } from './common';
19
- import { UI_SETTINGS } from '../../common/constants';
20
+ import { TEST_AUDIO_URL, UI_SETTINGS } from '../../common/constants';
20
21
 
21
22
  /**
22
23
  * wrap the button on click of whom settings should open, this component will take care of the rest,
@@ -182,22 +183,8 @@ const DeviceSelector = ({ title, devices, selection, onChange, icon, children =
182
183
  );
183
184
  };
184
185
 
185
- const TEST_AUDIO_URL = 'https://100ms.live/test-audio.wav';
186
-
187
186
  const TestAudio = ({ id }) => {
188
- const audioRef = useRef(null);
189
- const [playing, setPlaying] = useState(false);
190
- useEffect(() => {
191
- if (audioRef.current && id) {
192
- try {
193
- if (typeof audioRef.current.setSinkId !== 'undefined') {
194
- audioRef.current.setSinkId(id);
195
- }
196
- } catch (error) {
197
- console.log(error);
198
- }
199
- }
200
- }, [id]);
187
+ const { playing, setPlaying, audioRef } = useAudioOutputTest({ deviceId: id });
201
188
  return (
202
189
  <>
203
190
  <Button
@@ -218,7 +205,13 @@ const TestAudio = ({ id }) => {
218
205
  &nbsp; speaker
219
206
  </Text>
220
207
  </Button>
221
- <audio ref={audioRef} src={TEST_AUDIO_URL} onEnded={() => setPlaying(false)} onPlay={() => setPlaying(true)} />
208
+ <audio
209
+ ref={audioRef}
210
+ src={TEST_AUDIO_URL}
211
+ onEnded={() => setPlaying(false)}
212
+ onPlay={() => setPlaying(true)}
213
+ css={{ display: 'none' }}
214
+ />
222
215
  </>
223
216
  );
224
217
  };
@@ -0,0 +1,20 @@
1
+ import { useEffect, useRef, useState } from 'react';
2
+
3
+ export const useAudioOutputTest = ({ deviceId }: { deviceId: string }) => {
4
+ const audioRef = useRef<HTMLAudioElement | null>(null);
5
+ const [playing, setPlaying] = useState(false);
6
+ useEffect(() => {
7
+ if (audioRef.current && deviceId) {
8
+ try {
9
+ // @ts-ignore
10
+ if (typeof audioRef.current.setSinkId !== 'undefined') {
11
+ // @ts-ignore
12
+ audioRef.current.setSinkId(deviceId);
13
+ }
14
+ } catch (error) {
15
+ console.log(error);
16
+ }
17
+ }
18
+ }, [deviceId]);
19
+ return { playing, setPlaying, audioRef };
20
+ };
@@ -2,7 +2,6 @@ import React, { useEffect } from 'react';
2
2
  import { useMedia } from 'react-use';
3
3
  import { selectAppData, selectVideoTrackByPeerID, useHMSStore } from '@100mslive/react-sdk';
4
4
  import { Polls } from '../components/Polls/Polls';
5
- import { RoomDetailsPane } from '../components/RoomDetails/RoomDetailsPane';
6
5
  import { LayoutMode } from '../components/Settings/LayoutSettings';
7
6
  import { SidePaneTabs } from '../components/SidePaneTabs';
8
7
  import { TileCustomisationProps } from '../components/VideoLayouts/GridLayout';
@@ -53,9 +52,6 @@ const SidePane = ({
53
52
  if (sidepane === SIDE_PANE_OPTIONS.VB) {
54
53
  ViewComponent = <VBPicker backgroundMedia={backgroundMedia} />;
55
54
  }
56
- if (sidepane === SIDE_PANE_OPTIONS.ROOM_DETAILS) {
57
- ViewComponent = <RoomDetailsPane />;
58
- }
59
55
 
60
56
  useEffect(() => {
61
57
  return () => {
@@ -1,4 +1,3 @@
1
- import { useMemo } from 'react';
2
1
  import {
3
2
  ConferencingScreen,
4
3
  DefaultConferencingScreen_Elements,
@@ -8,16 +7,7 @@ import {
8
7
  PreviewScreen,
9
8
  Screens,
10
9
  } from '@100mslive/types-prebuilt';
11
- import {
12
- selectHLSState,
13
- selectPeerCount,
14
- selectRoomStartTime,
15
- useHMSStore,
16
- useRecordingStreaming,
17
- } from '@100mslive/react-sdk';
18
10
  import { useRoomLayout } from '..';
19
- // @ts-ignore
20
- import { getFormattedCount } from '../../../common/utils';
21
11
 
22
12
  export type useRoomLayoutScreenProps = {
23
13
  screen: keyof Screens;
@@ -79,33 +69,3 @@ export function useRoomLayoutLeaveScreen() {
79
69
  isLeaveScreenEnabled,
80
70
  };
81
71
  }
82
-
83
- export function useRoomLayoutHeader() {
84
- const { elements } = useRoomLayoutConferencingScreen();
85
- // return elements.header;
86
- const { isRecordingOn } = useRecordingStreaming();
87
- const peerCount = useHMSStore(selectPeerCount);
88
- const sessionStartedAt = useHMSStore(selectRoomStartTime);
89
- const hlsState = useHMSStore(selectHLSState);
90
-
91
- // People watching, start timestamp, recording status
92
- const details = useMemo(() => {
93
- const details = [];
94
- if (hlsState?.variants[0]?.['startedAt']) {
95
- details.push(`${getFormattedCount(peerCount)} watching`);
96
- details.push(hlsState.variants[0]['startedAt']);
97
- } else if (sessionStartedAt) {
98
- details.push(sessionStartedAt);
99
- }
100
- if (isRecordingOn) {
101
- details.push('Recording');
102
- }
103
- return details;
104
- }, [hlsState?.variants, isRecordingOn, peerCount, sessionStartedAt]);
105
-
106
- return {
107
- title: elements.header?.title || '',
108
- description: elements.header?.description || '',
109
- details,
110
- };
111
- }
@@ -1,4 +0,0 @@
1
- export declare const useIsSheetTypeOpen: (sheetType: string) => boolean;
2
- export declare const useSheetState: () => any;
3
- export declare const useSheetToggle: (sheetType: string) => () => void;
4
- export declare const useSheetReset: () => () => void;
@@ -1,2 +0,0 @@
1
- import React from 'react';
2
- export declare const RoomDetailsHeader: () => React.JSX.Element | null;
@@ -1,4 +0,0 @@
1
- import React from 'react';
2
- export declare const Duration: ({ timestamp }: {
3
- timestamp: Date;
4
- }) => React.JSX.Element;
@@ -1,2 +0,0 @@
1
- import React from 'react';
2
- export declare const RoomDetailsPane: () => React.JSX.Element;
@@ -1,4 +0,0 @@
1
- import React from 'react';
2
- export declare const RoomDetailsRow: ({ details }: {
3
- details: (string | Date)[];
4
- }) => React.JSX.Element;
@@ -1,2 +0,0 @@
1
- import React from 'react';
2
- export declare const RoomDetailsSheet: () => React.JSX.Element;
@@ -1,2 +0,0 @@
1
- import React from 'react';
2
- export declare const Sheet: () => React.JSX.Element;