@100mslive/roomkit-react 0.1.6-alpha.0 → 0.1.6-alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. package/dist/{HLSView-PY2FKWX3.js → HLSView-HNVYG5VE.js} +208 -118
  2. package/dist/HLSView-HNVYG5VE.js.map +7 -0
  3. package/dist/Prebuilt/AppContext.d.ts +1 -1
  4. package/dist/Prebuilt/components/Chat/ChatFooter.d.ts +7 -0
  5. package/dist/Prebuilt/components/Connection/ConnectionIndicator.d.ts +6 -0
  6. package/dist/Prebuilt/components/Connection/TileConnection.d.ts +10 -0
  7. package/dist/Prebuilt/components/Footer/ChatToggle.d.ts +4 -0
  8. package/dist/Prebuilt/components/Footer/RoleAccordion.d.ts +14 -0
  9. package/dist/Prebuilt/components/Footer/RoleOptions.d.ts +6 -0
  10. package/dist/Prebuilt/components/Header/StreamActions.d.ts +11 -0
  11. package/dist/Prebuilt/components/Leave/DesktopLeaveRoom.d.ts +4 -3
  12. package/dist/Prebuilt/components/Leave/EndSessionContent.d.ts +4 -3
  13. package/dist/Prebuilt/components/Leave/LeaveCard.d.ts +1 -2
  14. package/dist/Prebuilt/components/Leave/LeaveSessionContent.d.ts +3 -1
  15. package/dist/Prebuilt/components/Leave/MwebLeaveRoom.d.ts +4 -3
  16. package/dist/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.d.ts +6 -0
  17. package/dist/Prebuilt/components/Preview/PreviewContainer.d.ts +3 -0
  18. package/dist/Prebuilt/components/Preview/PreviewJoin.d.ts +16 -0
  19. package/dist/Prebuilt/components/RoleChangeRequestModal.d.ts +2 -0
  20. package/dist/Prebuilt/components/SecondaryTiles.d.ts +1 -1
  21. package/dist/Prebuilt/components/VideoLayouts/EqualProminence.d.ts +1 -1
  22. package/dist/Prebuilt/components/VideoLayouts/Grid.d.ts +1 -0
  23. package/dist/Prebuilt/components/VideoLayouts/GridLayout.d.ts +5 -3
  24. package/dist/Prebuilt/components/VideoLayouts/ProminenceLayout.d.ts +6 -3
  25. package/dist/Prebuilt/components/VideoLayouts/RoleProminence.d.ts +1 -1
  26. package/dist/Prebuilt/components/VideoLayouts/ScreenshareLayout.d.ts +1 -1
  27. package/dist/Prebuilt/components/VideoLayouts/interface.d.ts +1 -0
  28. package/dist/Prebuilt/components/hooks/useAutoStartStreaming.d.ts +1 -0
  29. package/dist/Prebuilt/components/hooks/useRedirectToLeave.d.ts +3 -0
  30. package/dist/Prebuilt/components/hooks/useTileLayout.d.ts +2 -1
  31. package/dist/Prebuilt/components/hooks/useVideoTileLayout.d.ts +2 -0
  32. package/dist/Prebuilt/layouts/SidePane.d.ts +4 -1
  33. package/dist/Prebuilt/layouts/VideoStreamingSection.d.ts +2 -1
  34. package/dist/{VirtualBackground-AYDHYLIZ.js → VirtualBackground-UM2FOUHQ.js} +3 -3
  35. package/dist/{chunk-E2M2ZSOL.js → chunk-364HP22I.js} +2 -2
  36. package/dist/{chunk-RXTHJUMZ.js → chunk-LYSAET4G.js} +946 -390
  37. package/dist/chunk-LYSAET4G.js.map +7 -0
  38. package/dist/{chunk-GQD2AGWW.js → chunk-POE7H4IE.js} +12 -2
  39. package/dist/{chunk-GQD2AGWW.js.map → chunk-POE7H4IE.js.map} +2 -2
  40. package/dist/{conference-V2XZGTKU.js → conference-UWLJHMB2.js} +1116 -1316
  41. package/dist/conference-UWLJHMB2.js.map +7 -0
  42. package/dist/index.cjs.js +6080 -5631
  43. package/dist/index.cjs.js.map +4 -4
  44. package/dist/index.js +2 -2
  45. package/dist/meta.cjs.json +741 -493
  46. package/dist/meta.esbuild.json +782 -529
  47. package/package.json +8 -7
  48. package/src/Prebuilt/App.tsx +10 -21
  49. package/src/Prebuilt/AppContext.tsx +1 -1
  50. package/src/Prebuilt/IconButton.jsx +10 -0
  51. package/src/Prebuilt/common/PeersSorter.ts +1 -1
  52. package/src/Prebuilt/common/constants.js +1 -2
  53. package/src/Prebuilt/common/utils.js +1 -1
  54. package/src/Prebuilt/components/AppData/AppData.jsx +8 -2
  55. package/src/Prebuilt/components/AppData/useUISettings.js +6 -6
  56. package/src/Prebuilt/components/AudioVideoToggle.jsx +8 -6
  57. package/src/Prebuilt/components/Chat/Chat.jsx +23 -6
  58. package/src/Prebuilt/components/Chat/ChatBody.jsx +20 -21
  59. package/src/Prebuilt/components/Chat/{ChatFooter.jsx → ChatFooter.tsx} +38 -13
  60. package/src/Prebuilt/components/Chat/ChatParticipantHeader.jsx +38 -27
  61. package/src/Prebuilt/components/Chat/useEmojiPickerStyles.js +5 -4
  62. package/src/Prebuilt/components/Connection/{ConnectionIndicator.jsx → ConnectionIndicator.tsx} +12 -4
  63. package/src/Prebuilt/components/Connection/{TileConnection.jsx → TileConnection.tsx} +20 -6
  64. package/src/Prebuilt/components/EmojiReaction.jsx +2 -6
  65. package/src/Prebuilt/components/Footer/{ChatToggle.jsx → ChatToggle.tsx} +13 -3
  66. package/src/Prebuilt/components/Footer/Footer.tsx +15 -6
  67. package/src/Prebuilt/components/Footer/ParticipantList.jsx +15 -47
  68. package/src/Prebuilt/components/Footer/{RoleAccordion.jsx → RoleAccordion.tsx} +33 -17
  69. package/src/Prebuilt/components/Footer/RoleOptions.tsx +155 -0
  70. package/src/Prebuilt/components/FullPageProgress.jsx +3 -3
  71. package/src/Prebuilt/components/HMSVideo/Controls.jsx +1 -0
  72. package/src/Prebuilt/components/HMSVideo/HLSQualitySelector.jsx +39 -17
  73. package/src/Prebuilt/components/HMSVideo/HMSVideo.jsx +2 -2
  74. package/src/Prebuilt/components/HMSVideo/VideoProgress.jsx +5 -6
  75. package/src/Prebuilt/components/HMSVideo/VolumeControl.jsx +1 -1
  76. package/src/Prebuilt/components/Header/{StreamActions.jsx → StreamActions.tsx} +23 -9
  77. package/src/Prebuilt/components/Header/common.jsx +5 -2
  78. package/src/Prebuilt/components/IconButtonWithOptions/IconButtonWithOptions.jsx +6 -1
  79. package/src/Prebuilt/components/InsetTile.tsx +14 -8
  80. package/src/Prebuilt/components/Leave/DesktopLeaveRoom.tsx +21 -11
  81. package/src/Prebuilt/components/Leave/EndSessionContent.tsx +2 -5
  82. package/src/Prebuilt/components/Leave/LeaveCard.tsx +1 -3
  83. package/src/Prebuilt/components/Leave/LeaveRoom.tsx +28 -25
  84. package/src/Prebuilt/components/Leave/LeaveSessionContent.tsx +8 -2
  85. package/src/Prebuilt/components/Leave/MwebLeaveRoom.tsx +8 -8
  86. package/src/Prebuilt/components/MoreSettings/ChangeNameContent.jsx +4 -0
  87. package/src/Prebuilt/components/MoreSettings/MoreSettings.tsx +1 -1
  88. package/src/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.tsx +9 -23
  89. package/src/Prebuilt/components/MoreSettings/SplitComponents/{MwebOptions.jsx → MwebOptions.tsx} +88 -27
  90. package/src/Prebuilt/components/Notifications/Notifications.jsx +30 -21
  91. package/src/Prebuilt/components/Notifications/ReconnectNotifications.jsx +5 -11
  92. package/src/Prebuilt/components/Pagination.tsx +14 -12
  93. package/src/Prebuilt/components/Preview/{PreviewContainer.jsx → PreviewContainer.tsx} +11 -2
  94. package/src/Prebuilt/components/Preview/PreviewForm.tsx +6 -8
  95. package/src/Prebuilt/components/Preview/{PreviewJoin.jsx → PreviewJoin.tsx} +43 -19
  96. package/src/Prebuilt/components/{RoleChangeRequestModal.jsx → RoleChangeRequestModal.tsx} +32 -15
  97. package/src/Prebuilt/components/ScreenshareTile.jsx +6 -7
  98. package/src/Prebuilt/components/SecondaryTiles.tsx +12 -10
  99. package/src/Prebuilt/components/TileMenu/TileMenu.jsx +1 -1
  100. package/src/Prebuilt/components/TileMenu/TileMenuContent.jsx +14 -10
  101. package/src/Prebuilt/components/Toast/ToastConfig.jsx +5 -4
  102. package/src/Prebuilt/components/VideoLayouts/EqualProminence.tsx +13 -10
  103. package/src/Prebuilt/components/VideoLayouts/Grid.tsx +36 -34
  104. package/src/Prebuilt/components/VideoLayouts/GridLayout.tsx +33 -15
  105. package/src/Prebuilt/components/VideoLayouts/ProminenceLayout.tsx +45 -31
  106. package/src/Prebuilt/components/VideoLayouts/RoleProminence.tsx +12 -9
  107. package/src/Prebuilt/components/VideoLayouts/ScreenshareLayout.tsx +25 -9
  108. package/src/Prebuilt/components/VideoLayouts/interface.ts +1 -0
  109. package/src/Prebuilt/components/VideoTile.jsx +45 -53
  110. package/src/Prebuilt/components/conference.jsx +71 -74
  111. package/src/Prebuilt/components/hooks/useAutoStartStreaming.tsx +57 -0
  112. package/src/Prebuilt/components/hooks/useMetadata.jsx +12 -3
  113. package/src/Prebuilt/components/hooks/useRedirectToLeave.tsx +34 -0
  114. package/src/Prebuilt/components/hooks/useRoleProminencePeers.tsx +1 -1
  115. package/src/Prebuilt/components/hooks/useTileLayout.tsx +24 -18
  116. package/src/Prebuilt/components/hooks/useVideoTileLayout.ts +4 -0
  117. package/src/Prebuilt/layouts/EmbedView.jsx +1 -11
  118. package/src/Prebuilt/layouts/HLSView.jsx +152 -82
  119. package/src/Prebuilt/layouts/SidePane.tsx +15 -3
  120. package/src/Prebuilt/layouts/VideoStreamingSection.tsx +11 -47
  121. package/src/Prebuilt/plugins/FlyingEmoji.jsx +14 -2
  122. package/src/Prebuilt/services/FeatureFlags.jsx +0 -1
  123. package/src/VideoTile/StyledVideoTile.tsx +1 -0
  124. package/dist/HLSView-PY2FKWX3.js.map +0 -7
  125. package/dist/chunk-RXTHJUMZ.js.map +0 -7
  126. package/dist/conference-V2XZGTKU.js.map +0 -7
  127. package/src/Prebuilt/components/AudioLevel/BeamSpeakerLabelsLogging.jsx +0 -16
  128. package/src/Prebuilt/components/VideoList.jsx +0 -73
  129. /package/dist/{VirtualBackground-AYDHYLIZ.js.map → VirtualBackground-UM2FOUHQ.js.map} +0 -0
  130. /package/dist/{chunk-E2M2ZSOL.js.map → chunk-364HP22I.js.map} +0 -0
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "prebuilt",
11
11
  "roomkit"
12
12
  ],
13
- "version": "0.1.6-alpha.0",
13
+ "version": "0.1.6-alpha.1",
14
14
  "author": "100ms",
15
15
  "license": "MIT",
16
16
  "files": [
@@ -62,6 +62,7 @@
62
62
  "@types/lodash.merge": "^4.6.6",
63
63
  "@types/mdx": "2.0.2",
64
64
  "@types/react": "^18.1.0",
65
+ "@types/react-window": "^1.8.5",
65
66
  "babel-loader": "^8.2.5",
66
67
  "babel-plugin-react-require": "3.1.3",
67
68
  "react": "^18.1.0",
@@ -75,11 +76,11 @@
75
76
  "react": ">=17.0.2 <19.0.0"
76
77
  },
77
78
  "dependencies": {
78
- "@100mslive/hls-player": "0.1.15-alpha.0",
79
- "@100mslive/hms-virtual-background": "1.11.15-alpha.0",
80
- "@100mslive/react-icons": "0.8.15-alpha.0",
81
- "@100mslive/react-sdk": "0.8.15-alpha.0",
82
- "@100mslive/types-prebuilt": "0.11.0",
79
+ "@100mslive/hls-player": "0.1.15-alpha.1",
80
+ "@100mslive/hms-virtual-background": "1.11.15-alpha.1",
81
+ "@100mslive/react-icons": "0.8.15-alpha.1",
82
+ "@100mslive/react-sdk": "0.8.15-alpha.1",
83
+ "@100mslive/types-prebuilt": "0.12.0",
83
84
  "@emoji-mart/data": "^1.0.6",
84
85
  "@emoji-mart/react": "^1.0.1",
85
86
  "@radix-ui/react-accordion": "1.0.0",
@@ -114,5 +115,5 @@
114
115
  "uuid": "^8.3.2",
115
116
  "worker-timers": "^7.0.40"
116
117
  },
117
- "gitHead": "447c3c90520aec5943d996050e263de842a61be2"
118
+ "gitHead": "d3f042d48bb30f16c6c63f2a75c406611c0f2831"
118
119
  }
@@ -13,8 +13,6 @@ import {
13
13
  // @ts-ignore: No implicit Any
14
14
  import { AppData } from './components/AppData/AppData';
15
15
  // @ts-ignore: No implicit Any
16
- import { BeamSpeakerLabelsLogging } from './components/AudioLevel/BeamSpeakerLabelsLogging';
17
- // @ts-ignore: No implicit Any
18
16
  import AuthToken from './components/AuthToken';
19
17
  // @ts-ignore: No implicit Any
20
18
  import { ErrorBoundary } from './components/ErrorBoundary';
@@ -40,6 +38,9 @@ import { HMSPrebuiltContext, useHMSPrebuiltContext } from './AppContext';
40
38
  import { FlyingEmoji } from './plugins/FlyingEmoji';
41
39
  // @ts-ignore: No implicit Any
42
40
  import { RemoteStopScreenshare } from './plugins/RemoteStopScreenshare';
41
+ // @ts-ignore: No implicit Any
42
+ import { useIsNotificationDisabled } from './components/AppData/useUISettings';
43
+ import { useAutoStartStreaming } from './components/hooks/useAutoStartStreaming';
43
44
  import {
44
45
  useRoomLayoutLeaveScreen,
45
46
  useRoomLayoutPreviewScreen,
@@ -76,16 +77,6 @@ export type HMSPrebuiltRefType = {
76
77
  hmsNotifications: IHMSNotifications;
77
78
  };
78
79
 
79
- // TODO: remove now that there are options to change to portrait
80
- const getAspectRatio = ({ width, height }: { width: number; height: number }) => {
81
- const host = process.env.REACT_APP_HOST_NAME || '';
82
- const portraitDomains = (process.env.REACT_APP_PORTRAIT_MODE_DOMAINS || '').split(',');
83
- if (portraitDomains.includes(host) && width > height) {
84
- return { width: height, height: width };
85
- }
86
- return { width, height };
87
- };
88
-
89
80
  export const HMSPrebuilt = React.forwardRef<HMSPrebuiltRefType, HMSPrebuiltProps>(
90
81
  (
91
82
  {
@@ -102,9 +93,7 @@ export const HMSPrebuilt = React.forwardRef<HMSPrebuiltRefType, HMSPrebuiltProps
102
93
  },
103
94
  ref,
104
95
  ) => {
105
- const aspectRatio = '1-1';
106
96
  const metadata = '';
107
- const { 0: width, 1: height } = aspectRatio.split('-').map(el => parseInt(el));
108
97
  const reactiveStore = useRef<HMSPrebuiltRefType>();
109
98
 
110
99
  const [hydrated, setHydrated] = React.useState(false);
@@ -217,7 +206,6 @@ export const HMSPrebuilt = React.forwardRef<HMSPrebuiltRefType, HMSPrebuiltProps
217
206
  // no updates to the themes are fired if the name is same.
218
207
  // TODO: cache the theme and do deep check to trigger name change in the theme
219
208
  themeType={`${theme.name}-${Date.now()}`}
220
- aspectRatio={getAspectRatio({ width, height })}
221
209
  theme={{
222
210
  //@ts-ignore: Prebuilt theme to match stiches theme
223
211
  colors: theme.palette,
@@ -261,6 +249,7 @@ const Redirector = ({ showPreview }: { showPreview: boolean }) => {
261
249
  const RouteList = () => {
262
250
  const { isPreviewScreenEnabled } = useRoomLayoutPreviewScreen();
263
251
  const { isLeaveScreenEnabled } = useRoomLayoutLeaveScreen();
252
+ useAutoStartStreaming();
264
253
  return (
265
254
  <Routes>
266
255
  {isPreviewScreenEnabled ? (
@@ -268,7 +257,7 @@ const RouteList = () => {
268
257
  <Route
269
258
  path=":roomId/:role"
270
259
  element={
271
- <Suspense fallback={<FullPageProgress loadingText="Loading preview..." />}>
260
+ <Suspense fallback={<FullPageProgress text="Loading preview..." />}>
272
261
  <PreviewContainer />
273
262
  </Suspense>
274
263
  }
@@ -276,7 +265,7 @@ const RouteList = () => {
276
265
  <Route
277
266
  path=":roomId"
278
267
  element={
279
- <Suspense fallback={<FullPageProgress loadingText="Loading preview..." />}>
268
+ <Suspense fallback={<FullPageProgress text="Loading preview..." />}>
280
269
  <PreviewContainer />
281
270
  </Suspense>
282
271
  }
@@ -287,7 +276,7 @@ const RouteList = () => {
287
276
  <Route
288
277
  path=":roomId/:role"
289
278
  element={
290
- <Suspense fallback={<FullPageProgress loadingText="Joining..." />}>
279
+ <Suspense fallback={<FullPageProgress text="Joining..." />}>
291
280
  <Conference />
292
281
  </Suspense>
293
282
  }
@@ -295,7 +284,7 @@ const RouteList = () => {
295
284
  <Route
296
285
  path=":roomId"
297
286
  element={
298
- <Suspense fallback={<FullPageProgress loadingText="Joining..." />}>
287
+ <Suspense fallback={<FullPageProgress text="Joining..." />}>
299
288
  <Conference />
300
289
  </Suspense>
301
290
  }
@@ -350,16 +339,16 @@ function AppRoutes({
350
339
  defaultAuthToken?: string;
351
340
  }) {
352
341
  const roomLayout = useRoomLayout();
342
+ const isNotificationsDisabled = useIsNotificationDisabled();
353
343
  return (
354
344
  <Router>
355
345
  <>
356
346
  <ToastContainer />
357
347
  <Notifications />
358
348
  <BackSwipe />
359
- <FlyingEmoji />
349
+ {!isNotificationsDisabled && <FlyingEmoji />}
360
350
  <RemoteStopScreenshare />
361
351
  <KeyboardHandler />
362
- <BeamSpeakerLabelsLogging />
363
352
  <AuthToken authTokenByRoomCodeEndpoint={authTokenByRoomCodeEndpoint} defaultAuthToken={defaultAuthToken} />
364
353
  {roomLayout && (
365
354
  <Routes>
@@ -6,7 +6,7 @@ type HMSPrebuiltContextType = {
6
6
  role?: string;
7
7
  userName?: string;
8
8
  userId?: string;
9
- endpoints?: object;
9
+ endpoints?: Record<string, string>;
10
10
  onLeave?: () => void;
11
11
  };
12
12
 
@@ -9,11 +9,21 @@ const IconButton = styled(BaseIconButton, {
9
9
  r: '$1',
10
10
  variants: {
11
11
  active: {
12
+ true: {
13
+ color: '$on_surface_high',
14
+ backgroundColor: '$transparent',
15
+ },
12
16
  false: {
13
17
  border: '1px solid transparent',
14
18
  color: '$on_primary_high',
15
19
  },
16
20
  },
21
+ disabled: {
22
+ true: {
23
+ backgroundColor: '$surface_brighter',
24
+ color: '$on_surface_low',
25
+ },
26
+ },
17
27
  },
18
28
  });
19
29
 
@@ -60,7 +60,7 @@ class PeersSorter {
60
60
  // delete to insert at beginning
61
61
  this.lruPeers.delete(speaker.id);
62
62
  const lruPeerArray = Array.from(this.lruPeers);
63
- while (lruPeerArray.length >= this.tilesPerPage) {
63
+ while (lruPeerArray.length >= this.tilesPerPage && lruPeerArray.length) {
64
64
  lruPeerArray.pop();
65
65
  }
66
66
  this.lruPeers = new Set([speaker.id, ...lruPeerArray]);
@@ -29,7 +29,6 @@ export const APP_DATA = {
29
29
  appConfig: 'appConfig',
30
30
  sidePane: 'sidePane',
31
31
  hlsStats: 'hlsStats',
32
- hlsViewerRole: 'hlsViewerRole',
33
32
  waitingViewerRole: 'waitingViewerRole',
34
33
  subscribedNotifications: 'subscribedNotifications',
35
34
  logo: 'logo',
@@ -45,10 +44,10 @@ export const APP_DATA = {
45
44
  pdfConfig: 'pdfConfig',
46
45
  minimiseInset: 'minimiseInset',
47
46
  activeScreensharePeerId: 'activeScreensharePeerId',
47
+ disableNotificiations: 'disableNotificiations',
48
48
  };
49
49
  export const UI_SETTINGS = {
50
50
  isAudioOnly: 'isAudioOnly',
51
- isHeadless: 'isHeadless',
52
51
  maxTileCount: 'maxTileCount',
53
52
  uiViewMode: 'uiViewMode',
54
53
  showStatsOnTiles: 'showStatsOnTiles',
@@ -40,7 +40,7 @@ export const arrayIntersection = (a, b) => {
40
40
 
41
41
  export const getMetadata = metadataString => {
42
42
  try {
43
- return metadataString === '' ? {} : JSON.parse(metadataString);
43
+ return !metadataString ? {} : JSON.parse(metadataString);
44
44
  } catch (error) {
45
45
  return {};
46
46
  }
@@ -2,6 +2,7 @@ import React, { useEffect } from 'react';
2
2
  import {
3
3
  HMSRoomState,
4
4
  selectAvailableRoleNames,
5
+ selectFullAppData,
5
6
  selectHLSState,
6
7
  selectIsConnectedToRoom,
7
8
  selectLocalPeerRoleName,
@@ -36,7 +37,6 @@ export const getAppDetails = appDetails => {
36
37
  const initialAppData = {
37
38
  [APP_DATA.uiSettings]: {
38
39
  [UI_SETTINGS.isAudioOnly]: false,
39
- [UI_SETTINGS.isHeadless]: false,
40
40
  [UI_SETTINGS.maxTileCount]: 9,
41
41
  [UI_SETTINGS.showStatsOnTiles]: false,
42
42
  [UI_SETTINGS.enableAmbientMusic]: false,
@@ -65,6 +65,7 @@ const initialAppData = {
65
65
  [APP_DATA.authToken]: '',
66
66
  [APP_DATA.minimiseInset]: false,
67
67
  [APP_DATA.activeScreensharePeerId]: '',
68
+ [APP_DATA.disableNotificiations]: false,
68
69
  };
69
70
 
70
71
  export const AppData = React.memo(({ appDetails, tokenEndpoint }) => {
@@ -76,6 +77,7 @@ export const AppData = React.memo(({ appDetails, tokenEndpoint }) => {
76
77
  const roleNames = useHMSStore(selectAvailableRoleNames);
77
78
  const rolesMap = useHMSStore(selectRolesMap);
78
79
  const localPeerRole = useHMSStore(selectLocalPeerRoleName);
80
+ const appData = useHMSStore(selectFullAppData);
79
81
 
80
82
  useEffect(() => {
81
83
  if (!isConnected && sidePane && sidePane !== SIDE_PANE_OPTIONS.PARTICIPANTS) {
@@ -84,12 +86,16 @@ export const AppData = React.memo(({ appDetails, tokenEndpoint }) => {
84
86
  }, [isConnected, sidePane, resetSidePane]);
85
87
 
86
88
  useEffect(() => {
87
- hmsActions.initAppData(initialAppData);
89
+ hmsActions.initAppData({
90
+ ...initialAppData,
91
+ ...appData,
92
+ });
88
93
  hmsActions.setFrameworkInfo({
89
94
  type: 'react-web',
90
95
  isPrebuilt: true,
91
96
  version: React.version,
92
97
  });
98
+ // eslint-disable-next-line react-hooks/exhaustive-deps
93
99
  }, [hmsActions]);
94
100
 
95
101
  useEffect(() => {
@@ -11,7 +11,7 @@ import {
11
11
  useHMSVanillaStore,
12
12
  } from '@100mslive/react-sdk';
13
13
  import { UserPreferencesKeys, useUserPreferences } from '../hooks/useUserPreferences';
14
- import { APP_DATA, SESSION_STORE_KEY, UI_SETTINGS } from '../../common/constants';
14
+ import { APP_DATA, SESSION_STORE_KEY } from '../../common/constants';
15
15
 
16
16
  /**
17
17
  * fields saved related to UI settings in store's app data can be
@@ -46,11 +46,6 @@ export const useSetUiSettings = uiSettingKey => {
46
46
  return [value, setValue];
47
47
  };
48
48
 
49
- export const useIsHeadless = () => {
50
- const isHeadless = useUISettings(UI_SETTINGS.isHeadless);
51
- return isHeadless;
52
- };
53
-
54
49
  export const useWaitingViewerRole = () => {
55
50
  return useHMSStore(selectAppData(APP_DATA.waitingViewerRole));
56
51
  };
@@ -90,6 +85,11 @@ export const useSubscribedNotifications = notificationKey => {
90
85
  return notificationPreference;
91
86
  };
92
87
 
88
+ export const useIsNotificationDisabled = () => {
89
+ const notificationPreference = useHMSStore(selectAppDataByPath(APP_DATA.disableNotificiations));
90
+ return notificationPreference;
91
+ };
92
+
93
93
  export const useSetSubscribedNotifications = notificationKey => {
94
94
  const value = useSubscribedNotifications(notificationKey);
95
95
  const setValue = useSetAppData({
@@ -67,16 +67,17 @@ export const AudioVideoToggle = ({ hideOptions = false }) => {
67
67
  const videoTrackId = useHMSStore(selectLocalVideoTrackID);
68
68
  const localVideoTrack = useHMSStore(selectVideoTrackByID(videoTrackId));
69
69
  const roomState = useHMSStore(selectRoomState);
70
- const isAudioPermitted = toggleAudio && audioInput?.length > 0;
71
- const isVideoPermitted = toggleVideo && videoInput?.length > 0;
70
+ const hasAudioDevices = audioInput?.length > 0;
71
+ const hasVideoDevices = videoInput?.length > 0;
72
72
 
73
73
  return (
74
74
  <Fragment>
75
75
  {toggleAudio ? (
76
- hideOptions ? (
76
+ hideOptions || !hasAudioDevices ? (
77
77
  <Tooltip title={`Turn ${isLocalAudioEnabled ? 'off' : 'on'} audio (${isMacOS ? '⌘' : 'ctrl'} + d)`}>
78
78
  <IconButton
79
79
  active={isLocalAudioEnabled}
80
+ disabled={!toggleAudio}
80
81
  onClick={toggleAudio}
81
82
  key="toggleAudio"
82
83
  data-testid="audio_btn"
@@ -92,7 +93,7 @@ export const AudioVideoToggle = ({ hideOptions = false }) => {
92
93
  ) : (
93
94
  <IconButtonWithOptions
94
95
  options={formattedAudioInputList}
95
- disabled={!isAudioPermitted}
96
+ disabled={!toggleAudio}
96
97
  onDisabledClick={toggleAudio}
97
98
  tooltipMessage={`Turn ${isLocalAudioEnabled ? 'off' : 'on'} audio (${isMacOS ? '⌘' : 'ctrl'} + d)`}
98
99
  icon={
@@ -110,11 +111,12 @@ export const AudioVideoToggle = ({ hideOptions = false }) => {
110
111
  ) : null}
111
112
 
112
113
  {toggleVideo ? (
113
- hideOptions ? (
114
+ hideOptions || !hasVideoDevices ? (
114
115
  <Tooltip title={`Turn ${isLocalVideoEnabled ? 'off' : 'on'} video (${isMacOS ? '⌘' : 'ctrl'} + e)`}>
115
116
  <IconButton
116
117
  key="toggleVideo"
117
118
  active={isLocalVideoEnabled}
119
+ disabled={!toggleVideo}
118
120
  onClick={toggleVideo}
119
121
  data-testid="video_btn"
120
122
  className="__cancel-drag-event"
@@ -128,7 +130,7 @@ export const AudioVideoToggle = ({ hideOptions = false }) => {
128
130
  </Tooltip>
129
131
  ) : (
130
132
  <IconButtonWithOptions
131
- disabled={!isVideoPermitted}
133
+ disabled={!toggleVideo}
132
134
  onDisabledClick={toggleVideo}
133
135
  options={formattedVideoInputList}
134
136
  tooltipMessage={`Turn ${isLocalVideoEnabled ? 'off' : 'on'} video (${isMacOS ? '⌘' : 'ctrl'} + e)`}
@@ -18,6 +18,7 @@ import { config as cssConfig } from '../../../Theme';
18
18
  import { AnnotisedMessage, ChatBody } from './ChatBody';
19
19
  import { ChatFooter } from './ChatFooter';
20
20
  import { ChatParticipantHeader } from './ChatParticipantHeader';
21
+ import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
21
22
  import { useSetSubscribedChatSelector } from '../AppData/useUISettings';
22
23
  import { useSetPinnedMessage } from '../hooks/useSetPinnedMessage';
23
24
  import { useUnreadCount } from './useUnreadCount';
@@ -66,7 +67,7 @@ const PinnedMessage = ({ clearPinnedMessage }) => {
66
67
  ) : null;
67
68
  };
68
69
 
69
- export const Chat = ({ screenType }) => {
70
+ export const Chat = ({ screenType, hideControls = false }) => {
70
71
  const notification = useHMSNotifications(HMSNotificationTypes.PEER_LEFT);
71
72
  const [peerSelector, setPeerSelector] = useSetSubscribedChatSelector(CHAT_SELECTOR.PEER_ID);
72
73
  const [roleSelector, setRoleSelector] = useSetSubscribedChatSelector(CHAT_SELECTOR.ROLE);
@@ -80,6 +81,7 @@ export const Chat = ({ screenType }) => {
80
81
  const listRef = useRef(null);
81
82
  const hmsActions = useHMSActions();
82
83
  const { setPinnedMessage } = useSetPinnedMessage();
84
+
83
85
  useEffect(() => {
84
86
  if (notification && notification.data && peerSelector === notification.data.id) {
85
87
  setPeerSelector('');
@@ -92,8 +94,15 @@ export const Chat = ({ screenType }) => {
92
94
  }, [notification, peerSelector, setPeerSelector]);
93
95
 
94
96
  const storeMessageSelector = selectHMSMessagesCount;
97
+ const { elements } = useRoomLayoutConferencingScreen();
95
98
  const isMobile = useMedia(cssConfig.media.md);
96
99
 
100
+ let isScrolledToBottom = false;
101
+ if (listRef.current) {
102
+ const currentRef = listRef.current._outerRef;
103
+ isScrolledToBottom = currentRef.scrollHeight - currentRef.clientHeight - currentRef.scrollTop < 10;
104
+ }
105
+
97
106
  const messagesCount = useHMSStore(storeMessageSelector) || 0;
98
107
  const scrollToBottom = useCallback(
99
108
  (unreadCount = 0) => {
@@ -109,13 +118,21 @@ export const Chat = ({ screenType }) => {
109
118
  );
110
119
 
111
120
  return (
112
- <Flex direction="column" css={{ size: '100%', gap: '$4' }}>
113
- {!isMobile ? (
121
+ <Flex
122
+ direction="column"
123
+ css={{
124
+ size: '100%',
125
+ gap: '$4',
126
+ marginTop: hideControls && elements?.chat?.is_overlay ? '$17' : '0',
127
+ transition: 'margin 0.3s ease-in-out',
128
+ }}
129
+ >
130
+ {isMobile && elements?.chat?.is_overlay ? null : (
114
131
  <>
115
132
  <ChatParticipantHeader selectorOpen={isSelectorOpen} onToggle={() => setSelectorOpen(value => !value)} />
116
- <PinnedMessage clearPinnedMessage={setPinnedMessage} />
133
+ {elements?.chat?.allow_pinning_messages ? <PinnedMessage clearPinnedMessage={setPinnedMessage} /> : null}
117
134
  </>
118
- ) : null}
135
+ )}
119
136
 
120
137
  <ChatBody
121
138
  role={chatOptions.role}
@@ -140,7 +157,7 @@ export const Chat = ({ screenType }) => {
140
157
  }}
141
158
  peerId={chatOptions.peerId}
142
159
  >
143
- {!isSelectorOpen && (
160
+ {!isSelectorOpen && !isScrolledToBottom && (
144
161
  <NewMessageIndicator role={chatOptions.role} peerId={chatOptions.peerId} scrollToBottom={scrollToBottom} />
145
162
  )}
146
163
  </ChatFooter>
@@ -14,7 +14,7 @@ import {
14
14
  useHMSActions,
15
15
  useHMSStore,
16
16
  } from '@100mslive/react-sdk';
17
- import { CopyIcon, PinIcon, VerticalMenuIcon } from '@100mslive/react-icons';
17
+ import { PinIcon, VerticalMenuIcon } from '@100mslive/react-icons';
18
18
  import { Dropdown } from '../../../Dropdown';
19
19
  import { IconButton } from '../../../IconButton';
20
20
  import { Box, Flex } from '../../../Layout';
@@ -22,7 +22,7 @@ import { Text } from '../../../Text';
22
22
  import { config as cssConfig, styled } from '../../../Theme';
23
23
  import { Tooltip } from '../../../Tooltip';
24
24
  import emptyChat from '../../images/empty-chat.svg';
25
- import { ToastManager } from '../Toast/ToastManager';
25
+ import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
26
26
  import { useSetPinnedMessage } from '../hooks/useSetPinnedMessage';
27
27
 
28
28
  const formatTime = date => {
@@ -126,10 +126,9 @@ const getMessageType = ({ roles, receiver }) => {
126
126
  }
127
127
  return receiver ? 'private' : '';
128
128
  };
129
- const ChatActions = ({ onPin, showPinAction, messageContent }) => {
129
+ const ChatActions = ({ onPin, showPinAction }) => {
130
130
  const [open, setOpen] = useState(false);
131
- const isMobile = useMedia(cssConfig.media.md);
132
- if (!isMobile && !showPinAction) {
131
+ if (!showPinAction) {
133
132
  return null;
134
133
  }
135
134
 
@@ -154,8 +153,7 @@ const ChatActions = ({ onPin, showPinAction, messageContent }) => {
154
153
  Pin Message
155
154
  </Text>
156
155
  </Dropdown.Item>
157
- {isMobile && showPinAction ? <Dropdown.ItemSeparator css={{ my: 0 }} /> : null}
158
- {isMobile ? (
156
+ {/* {isMobile ? (
159
157
  <Dropdown.Item
160
158
  data-testid="copy_message_btn"
161
159
  onClick={() => {
@@ -177,7 +175,7 @@ const ChatActions = ({ onPin, showPinAction, messageContent }) => {
177
175
  Copy Message
178
176
  </Text>
179
177
  </Dropdown.Item>
180
- ) : null}
178
+ ) : null} */}
181
179
  </Dropdown.Content>
182
180
  </Dropdown.Portal>
183
181
  </Dropdown.Root>
@@ -203,7 +201,8 @@ const ChatMessage = React.memo(({ index, style = {}, message, setRowHeight, onPi
203
201
  }
204
202
  }, [index, setRowHeight]);
205
203
  const isMobile = useMedia(cssConfig.media.md);
206
-
204
+ const { elements } = useRoomLayoutConferencingScreen();
205
+ const isOverlay = elements?.chat?.is_overlay && isMobile;
207
206
  const hmsActions = useHMSActions();
208
207
  const localPeerId = useHMSStore(selectLocalPeerID);
209
208
  const permissions = useHMSStore(selectPermissions);
@@ -212,7 +211,7 @@ const ChatMessage = React.memo(({ index, style = {}, message, setRowHeight, onPi
212
211
  receiver: message.recipientPeer,
213
212
  });
214
213
  // show pin action only if peer has remove others permission and the message is of broadcast type
215
- const showPinAction = permissions.removeOthers && !messageType;
214
+ const showPinAction = permissions.removeOthers && !messageType && elements?.chat?.allow_pinning_messages;
216
215
 
217
216
  useEffect(() => {
218
217
  if (message.id && !message.read && inView) {
@@ -233,7 +232,7 @@ const ChatMessage = React.memo(({ index, style = {}, message, setRowHeight, onPi
233
232
  css={{
234
233
  flexWrap: 'wrap',
235
234
  // Theme independent color, token should not be used for transparent chat
236
- bg: messageType ? (isMobile ? 'rgba(0, 0, 0, 0.64)' : '$surface_default') : undefined,
235
+ bg: messageType ? (isOverlay ? 'rgba(0, 0, 0, 0.64)' : '$surface_default') : undefined,
237
236
  r: messageType ? '$1' : undefined,
238
237
  px: messageType ? '$4' : '$2',
239
238
  py: messageType ? '$4' : 0,
@@ -244,7 +243,7 @@ const ChatMessage = React.memo(({ index, style = {}, message, setRowHeight, onPi
244
243
  >
245
244
  <Text
246
245
  css={{
247
- color: '$on_surface_high',
246
+ color: isOverlay ? '#FFF' : '$on_surface_high',
248
247
  fontWeight: '$semiBold',
249
248
  display: 'inline-flex',
250
249
  alignItems: 'center',
@@ -255,23 +254,23 @@ const ChatMessage = React.memo(({ index, style = {}, message, setRowHeight, onPi
255
254
  >
256
255
  <Flex align="baseline">
257
256
  {message.senderName === 'You' || !message.senderName ? (
258
- <SenderName as="span" variant="sm">
257
+ <SenderName as="span" variant="sm" css={{ color: isOverlay ? '#FFF' : '$on_surface_high' }}>
259
258
  {message.senderName || 'Anonymous'}
260
259
  </SenderName>
261
260
  ) : (
262
261
  <Tooltip title={message.senderName} side="top" align="start">
263
- <SenderName as="span" variant="sm">
262
+ <SenderName as="span" variant="sm" css={{ color: isOverlay ? '#FFF' : '$on_surface_high' }}>
264
263
  {message.senderName}
265
264
  </SenderName>
266
265
  </Tooltip>
267
266
  )}
268
- {!isMobile ? (
267
+ {!isOverlay ? (
269
268
  <Text
270
269
  as="span"
271
270
  variant="xs"
272
271
  css={{
273
272
  ml: '$4',
274
- color: '$on_primary_medium',
273
+ color: '$on_surface_medium',
275
274
  flexShrink: 0,
276
275
  }}
277
276
  >
@@ -284,18 +283,17 @@ const ChatMessage = React.memo(({ index, style = {}, message, setRowHeight, onPi
284
283
  receiver={message.recipientPeer}
285
284
  roles={message.recipientRoles}
286
285
  />
287
- {!isMobile ? (
288
- <ChatActions onPin={onPin} showPinAction={showPinAction} messageContent={message.message} />
289
- ) : null}
286
+ {!isOverlay ? <ChatActions onPin={onPin} showPinAction={showPinAction} /> : null}
290
287
  </Text>
291
288
  <Text
292
- variant="body2"
289
+ variant="sm"
293
290
  css={{
294
291
  w: '100%',
295
292
  mt: '$2',
296
293
  wordBreak: 'break-word',
297
294
  whiteSpace: 'pre-wrap',
298
295
  userSelect: 'all',
296
+ color: isOverlay ? '#FFF' : '$on_surface_high',
299
297
  }}
300
298
  onClick={e => e.stopPropagation()}
301
299
  >
@@ -395,8 +393,9 @@ export const ChatBody = React.forwardRef(({ role, peerId, scrollToBottom }, list
395
393
  let messages = useHMSStore(storeMessageSelector);
396
394
  messages = useMemo(() => messages?.filter(message => message.type === 'chat') || [], [messages]);
397
395
  const isMobile = useMedia(cssConfig.media.md);
396
+ const { elements } = useRoomLayoutConferencingScreen();
398
397
 
399
- if (messages.length === 0 && !isMobile) {
398
+ if (messages.length === 0 && !(isMobile && elements?.chat?.is_overlay)) {
400
399
  return (
401
400
  <Flex
402
401
  css={{