@100mslive/roomkit-react 0.1.19-alpha.1 → 0.1.19

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 (45) hide show
  1. package/dist/{HLSView-UBVLOPNY.js → HLSView-4L4OAX2K.js} +2 -2
  2. package/dist/Prebuilt/App.d.ts +1 -0
  3. package/dist/Prebuilt/common/constants.d.ts +1 -1
  4. package/dist/Prebuilt/components/Chat/EmptyChat.d.ts +2 -0
  5. package/dist/Prebuilt/components/Polls/Voting/{Leaderboard.d.ts → LeaderboardSummary.d.ts} +1 -1
  6. package/dist/Prebuilt/components/Polls/Voting/StatisticBox.d.ts +5 -0
  7. package/dist/Prebuilt/components/VirtualBackground/VBCollection.d.ts +3 -4
  8. package/dist/Prebuilt/components/VirtualBackground/VBHandler.d.ts +14 -0
  9. package/dist/Prebuilt/components/VirtualBackground/VBPicker.d.ts +1 -1
  10. package/dist/Prebuilt/components/VirtualBackground/constants.d.ts +0 -2
  11. package/dist/{chunk-VU2CQFCB.js → chunk-NHPPOGUF.js} +1403 -1293
  12. package/dist/chunk-NHPPOGUF.js.map +7 -0
  13. package/dist/index.cjs.js +1749 -1609
  14. package/dist/index.cjs.js.map +4 -4
  15. package/dist/index.js +1 -1
  16. package/dist/meta.cjs.json +236 -94
  17. package/dist/meta.esbuild.json +243 -101
  18. package/package.json +6 -6
  19. package/src/Prebuilt/App.tsx +2 -1
  20. package/src/Prebuilt/AppStateContext.tsx +2 -0
  21. package/src/Prebuilt/common/constants.ts +1 -1
  22. package/src/Prebuilt/components/Chat/Chat.tsx +2 -2
  23. package/src/Prebuilt/components/Chat/ChatActions.tsx +3 -3
  24. package/src/Prebuilt/components/Chat/ChatBody.tsx +28 -46
  25. package/src/Prebuilt/components/Chat/EmptyChat.tsx +51 -0
  26. package/src/Prebuilt/components/Footer/PaginatedParticipants.tsx +1 -1
  27. package/src/Prebuilt/components/Footer/PollsToggle.tsx +7 -1
  28. package/src/Prebuilt/components/Notifications/Notifications.tsx +0 -29
  29. package/src/Prebuilt/components/Polls/Polls.tsx +2 -2
  30. package/src/Prebuilt/components/Polls/Voting/LeaderboardEntry.tsx +2 -2
  31. package/src/Prebuilt/components/Polls/Voting/LeaderboardSummary.tsx +162 -0
  32. package/src/Prebuilt/components/Polls/Voting/PeerParticipationSummary.tsx +2 -9
  33. package/src/Prebuilt/components/Polls/Voting/StatisticBox.tsx +15 -0
  34. package/src/Prebuilt/components/Polls/Voting/Voting.jsx +1 -17
  35. package/src/Prebuilt/components/TileMenu/TileMenuContent.tsx +1 -1
  36. package/src/Prebuilt/components/VirtualBackground/VBCollection.tsx +5 -11
  37. package/src/Prebuilt/components/VirtualBackground/VBHandler.tsx +77 -0
  38. package/src/Prebuilt/components/VirtualBackground/VBPicker.tsx +45 -79
  39. package/src/Prebuilt/components/VirtualBackground/constants.ts +0 -4
  40. package/src/Prebuilt/layouts/SidePane.tsx +6 -1
  41. package/src/Theme/stitches.config.ts +2 -10
  42. package/dist/chunk-VU2CQFCB.js.map +0 -7
  43. package/src/Prebuilt/components/Polls/Voting/Leaderboard.tsx +0 -123
  44. package/src/Prebuilt/components/Polls/Voting/PollResultSummary.jsx +0 -125
  45. /package/dist/{HLSView-UBVLOPNY.js.map → HLSView-4L4OAX2K.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import React, { Fragment } from 'react';
2
2
  import { useMedia } from 'react-use';
3
- import { HMSException } from '@100mslive/hms-video';
4
3
  import {
4
+ HMSException,
5
5
  HMSSimulcastLayerDefinition,
6
6
  HMSTrackID,
7
7
  HMSVideoTrack,
@@ -7,7 +7,6 @@ import { VBOption } from './VBOption';
7
7
  export const VBCollection = ({
8
8
  options,
9
9
  title,
10
- activeBackgroundType = HMSVirtualBackgroundTypes.NONE,
11
10
  activeBackground = '',
12
11
  }: {
13
12
  options: {
@@ -15,11 +14,10 @@ export const VBCollection = ({
15
14
  icon?: React.JSX.Element;
16
15
  onClick?: () => Promise<void>;
17
16
  mediaURL?: string;
18
- type: string;
17
+ value: string | HMSVirtualBackgroundTypes;
19
18
  }[];
20
19
  title: string;
21
- activeBackground: HTMLImageElement | string;
22
- activeBackgroundType: HMSVirtualBackgroundTypes;
20
+ activeBackground: string;
23
21
  }) => {
24
22
  if (options.length === 0) {
25
23
  return null;
@@ -32,14 +30,10 @@ export const VBCollection = ({
32
30
  <Box css={{ py: '$4', display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: '$8' }}>
33
31
  {options.map((option, index) => (
34
32
  <VBOption.Root
35
- testid={option.type === HMSVirtualBackgroundTypes.IMAGE ? `virtual_bg_option-${index}` : option.type}
36
- key={option?.mediaURL || option?.title}
33
+ key={option.value}
34
+ testid={option.value === HMSVirtualBackgroundTypes.IMAGE ? `virtual_bg_option-${index}` : option.value}
37
35
  {...option}
38
- isActive={
39
- ([HMSVirtualBackgroundTypes.NONE, HMSVirtualBackgroundTypes.BLUR].includes(activeBackgroundType) &&
40
- option.type === activeBackgroundType) ||
41
- activeBackground === option?.mediaURL
42
- }
36
+ isActive={activeBackground === option.value}
43
37
  >
44
38
  <VBOption.Icon>{option?.icon}</VBOption.Icon>
45
39
  <VBOption.Title>{option?.title}</VBOption.Title>
@@ -0,0 +1,77 @@
1
+ import { HMSEffectsPlugin, HMSVBPlugin, HMSVirtualBackgroundTypes } from '@100mslive/hms-virtual-background';
2
+
3
+ export class VBPlugin {
4
+ private hmsPlugin?: HMSVBPlugin;
5
+ private effectsPlugin?: HMSEffectsPlugin | undefined;
6
+
7
+ initialisePlugin = (effectsSDKKey?: string) => {
8
+ if (this.getVBObject()) {
9
+ return;
10
+ }
11
+ if (effectsSDKKey) {
12
+ this.effectsPlugin = new HMSEffectsPlugin(effectsSDKKey);
13
+ } else {
14
+ this.hmsPlugin = new HMSVBPlugin(HMSVirtualBackgroundTypes.NONE, HMSVirtualBackgroundTypes.NONE);
15
+ }
16
+ };
17
+
18
+ getBackground = () => {
19
+ if (this.effectsPlugin) {
20
+ return this.effectsPlugin?.getBackground();
21
+ } else {
22
+ // @ts-ignore
23
+ return this.hmsPlugin?.background?.src || this.hmsPlugin?.background;
24
+ }
25
+ };
26
+
27
+ getVBObject = () => {
28
+ return this.effectsPlugin || this.hmsPlugin;
29
+ };
30
+
31
+ getName = () => {
32
+ return this.effectsPlugin ? this.effectsPlugin?.getName() : this.hmsPlugin?.getName();
33
+ };
34
+
35
+ setBlur = async (blurPower: number) => {
36
+ if (this.effectsPlugin) {
37
+ this.effectsPlugin?.setBlur(blurPower);
38
+ } else {
39
+ await this.hmsPlugin?.setBackground(HMSVirtualBackgroundTypes.BLUR, HMSVirtualBackgroundTypes.BLUR);
40
+ }
41
+ };
42
+
43
+ setBackground = async (mediaURL: string) => {
44
+ if (this.effectsPlugin) {
45
+ this.effectsPlugin?.setBackground(mediaURL);
46
+ } else {
47
+ const img = document.createElement('img');
48
+ let retries = 0;
49
+ const MAX_RETRIES = 3;
50
+ img.alt = 'VB';
51
+ img.src = mediaURL;
52
+ try {
53
+ await this.hmsPlugin?.setBackground(img, HMSVirtualBackgroundTypes.IMAGE);
54
+ } catch (e) {
55
+ console.error(e);
56
+ if (retries++ < MAX_RETRIES) {
57
+ await this.hmsPlugin?.setBackground(img, HMSVirtualBackgroundTypes.IMAGE);
58
+ }
59
+ }
60
+ }
61
+ };
62
+
63
+ removeEffects = async () => {
64
+ if (this.effectsPlugin) {
65
+ this.effectsPlugin?.removeEffects();
66
+ } else {
67
+ await this.hmsPlugin?.setBackground(HMSVirtualBackgroundTypes.NONE, HMSVirtualBackgroundTypes.NONE);
68
+ }
69
+ };
70
+
71
+ reset = () => {
72
+ this.effectsPlugin = undefined;
73
+ this.hmsPlugin = undefined;
74
+ };
75
+ }
76
+
77
+ export const VBHandler = new VBPlugin();
@@ -1,13 +1,13 @@
1
- import React, { useEffect, useRef, useState } from 'react';
2
- import { HMSVirtualBackgroundTypes } from '@100mslive/hms-virtual-background';
1
+ import React, { useEffect, useState } from 'react';
2
+ import { selectEffectsKey, selectIsEffectsEnabled, selectLocalPeerRole } from '@100mslive/hms-video-store';
3
+ import { HMSEffectsPlugin, HMSVBPlugin, HMSVirtualBackgroundTypes } from '@100mslive/hms-virtual-background';
3
4
  import { VirtualBackgroundMedia } from '@100mslive/types-prebuilt/elements/virtual_background';
4
5
  import {
5
6
  HMSRoomState,
6
7
  selectIsLargeRoom,
7
8
  selectIsLocalVideoEnabled,
9
+ selectIsLocalVideoPluginPresent,
8
10
  selectLocalPeer,
9
- selectLocalPeerRole,
10
- selectLocalVideoTrackID,
11
11
  selectRoomState,
12
12
  selectVideoTrackByID,
13
13
  useHMSActions,
@@ -17,96 +17,61 @@ import { BlurPersonHighIcon, CloseIcon, CrossCircleIcon } from '@100mslive/react
17
17
  import { Box, Flex, Video } from '../../../index';
18
18
  import { Text } from '../../../Text';
19
19
  import { VBCollection } from './VBCollection';
20
+ import { VBHandler } from './VBHandler';
20
21
  // @ts-ignore
21
22
  import { useSidepaneToggle } from '../AppData/useSidepane';
22
23
  // @ts-ignore
23
24
  import { useUISettings } from '../AppData/useUISettings';
24
- // @ts-ignore
25
25
  import { SIDE_PANE_OPTIONS, UI_SETTINGS } from '../../common/constants';
26
- import { defaultMedia, vbPlugin } from './constants';
26
+ import { defaultMedia } from './constants';
27
27
 
28
28
  const iconDims = { height: '40px', width: '40px' };
29
- const MAX_RETRIES = 2;
30
29
 
31
30
  export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBackgroundMedia[] }) => {
32
31
  const toggleVB = useSidepaneToggle(SIDE_PANE_OPTIONS.VB);
33
32
  const hmsActions = useHMSActions();
34
- const role = useHMSStore(selectLocalPeerRole);
35
- const [isVBSupported, setIsVBSupported] = useState(false);
36
- const localPeerVideoTrackID = useHMSStore(selectLocalVideoTrackID);
37
33
  const localPeer = useHMSStore(selectLocalPeer);
38
- // @ts-ignore
39
- const [background, setBackground] = useState(vbPlugin.background);
40
- // @ts-ignore
41
- const [backgroundType, setBackgroundType] = useState(vbPlugin.backgroundType);
34
+ const role = useHMSStore(selectLocalPeerRole);
42
35
  const isVideoOn = useHMSStore(selectIsLocalVideoEnabled);
43
36
  const mirrorLocalVideo = useUISettings(UI_SETTINGS.mirrorLocalVideo);
44
37
  const trackSelector = selectVideoTrackByID(localPeer?.videoTrack);
45
38
  const track = useHMSStore(trackSelector);
46
39
  const roomState = useHMSStore(selectRoomState);
47
40
  const isLargeRoom = useHMSStore(selectIsLargeRoom);
48
- const addedPluginToVideoTrack = useRef(false);
41
+ const isEffectsEnabled = useHMSStore(selectIsEffectsEnabled);
42
+ const effectsKey = useHMSStore(selectEffectsKey);
43
+ const isPluginAdded = useHMSStore(selectIsLocalVideoPluginPresent(VBHandler?.getName() || ''));
44
+ const [activeBackground, setActiveBackground] = useState<string | HMSVirtualBackgroundTypes>(
45
+ (VBHandler?.getBackground() as string | HMSVirtualBackgroundTypes) || HMSVirtualBackgroundTypes.NONE,
46
+ );
49
47
  const mediaList = backgroundMedia.length
50
- ? backgroundMedia.map((media: VirtualBackgroundMedia) => media?.url)
48
+ ? backgroundMedia.map((media: VirtualBackgroundMedia) => media.url || '')
51
49
  : defaultMedia;
52
50
 
53
51
  const inPreview = roomState === HMSRoomState.Preview;
54
- // Hidden in preview as the effect will be visible in the preview tile. Needed inside the room because the peer might not be on-screen
52
+ // Hidden in preview as the effect will be visible in the preview tile
55
53
  const showVideoTile = isVideoOn && isLargeRoom && !inPreview;
56
54
 
57
- const clearVBState = () => {
58
- setBackground(HMSVirtualBackgroundTypes.NONE);
59
- setBackgroundType(HMSVirtualBackgroundTypes.NONE);
60
- };
61
-
62
55
  useEffect(() => {
63
- if (!localPeerVideoTrackID) {
56
+ if (!track?.id) {
64
57
  return;
65
58
  }
66
-
67
- //check support of plugin
68
- if (vbPlugin) {
69
- const pluginSupport = hmsActions.validateVideoPluginSupport(vbPlugin);
70
- setIsVBSupported(pluginSupport.isSupported);
71
- }
72
- }, [hmsActions, localPeerVideoTrackID]);
73
-
74
- async function disableEffects() {
75
- if (vbPlugin) {
76
- vbPlugin.setBackground(HMSVirtualBackgroundTypes.NONE, HMSVirtualBackgroundTypes.NONE);
77
- clearVBState();
78
- }
79
- }
80
-
81
- async function addPlugin({ mediaURL = '', blurPower = 0 }) {
82
- let retries = 0;
83
- try {
84
- if (mediaURL) {
85
- const img = document.createElement('img');
86
- img.alt = 'VB';
87
- img.src = mediaURL;
88
- try {
89
- await vbPlugin.setBackground(img, HMSVirtualBackgroundTypes.IMAGE);
90
- } catch (e) {
91
- console.error(e);
92
- if (retries++ < MAX_RETRIES) {
93
- await vbPlugin.setBackground(img, HMSVirtualBackgroundTypes.IMAGE);
59
+ if (!isPluginAdded) {
60
+ let vbObject = VBHandler.getVBObject();
61
+ if (!vbObject) {
62
+ VBHandler.initialisePlugin(isEffectsEnabled && effectsKey ? effectsKey : '');
63
+ vbObject = VBHandler.getVBObject();
64
+ if (isEffectsEnabled && effectsKey) {
65
+ hmsActions.addPluginsToVideoStream([vbObject as HMSEffectsPlugin]);
66
+ } else {
67
+ if (!role) {
68
+ return;
94
69
  }
70
+ hmsActions.addPluginToVideoTrack(vbObject as HMSVBPlugin, Math.floor(role.publishParams.video.frameRate / 2));
95
71
  }
96
- } else if (blurPower) {
97
- await vbPlugin.setBackground(HMSVirtualBackgroundTypes.BLUR, HMSVirtualBackgroundTypes.BLUR);
98
- }
99
- setBackground(mediaURL || HMSVirtualBackgroundTypes.BLUR);
100
- setBackgroundType(mediaURL ? HMSVirtualBackgroundTypes.IMAGE : HMSVirtualBackgroundTypes.BLUR);
101
- if (role && !addedPluginToVideoTrack.current) {
102
- await hmsActions.addPluginToVideoTrack(vbPlugin, Math.floor(role.publishParams.video.frameRate / 2));
103
- addedPluginToVideoTrack.current = true;
104
72
  }
105
- } catch (err) {
106
- console.error('Failed to apply VB', err);
107
- disableEffects();
108
73
  }
109
- }
74
+ }, [hmsActions, role, isPluginAdded, isEffectsEnabled, effectsKey, track?.id]);
110
75
 
111
76
  useEffect(() => {
112
77
  if (!isVideoOn) {
@@ -114,10 +79,6 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
114
79
  }
115
80
  }, [isVideoOn, toggleVB]);
116
81
 
117
- if (!isVBSupported) {
118
- return null;
119
- }
120
-
121
82
  return (
122
83
  <Flex css={{ pr: '$6', size: '100%' }} direction="column">
123
84
  <Flex align="center" justify="between" css={{ w: '100%', background: '$surface_dim', pb: '$4' }}>
@@ -140,7 +101,6 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
140
101
  css={{ width: '100%', height: '16rem' }}
141
102
  />
142
103
  ) : null}
143
-
144
104
  <Box
145
105
  css={{
146
106
  mt: '$4',
@@ -156,30 +116,36 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
156
116
  {
157
117
  title: 'No effect',
158
118
  icon: <CrossCircleIcon style={iconDims} />,
159
- type: HMSVirtualBackgroundTypes.NONE,
160
- onClick: async () => await disableEffects(),
119
+ value: HMSVirtualBackgroundTypes.NONE,
120
+ onClick: async () => {
121
+ await VBHandler.removeEffects();
122
+ setActiveBackground(HMSVirtualBackgroundTypes.NONE);
123
+ },
161
124
  },
162
125
  {
163
126
  title: 'Blur',
164
127
  icon: <BlurPersonHighIcon style={iconDims} />,
165
- type: HMSVirtualBackgroundTypes.BLUR,
166
- onClick: async () => await addPlugin({ blurPower: 0.5 }),
128
+ value: HMSVirtualBackgroundTypes.BLUR,
129
+ onClick: async () => {
130
+ await VBHandler?.setBlur(0.5);
131
+ setActiveBackground(HMSVirtualBackgroundTypes.BLUR);
132
+ },
167
133
  },
168
134
  ]}
169
- activeBackgroundType={backgroundType || HMSVirtualBackgroundTypes.NONE}
170
- // @ts-ignore
171
- activeBackground={vbPlugin.background?.src || vbPlugin.background || HMSVirtualBackgroundTypes.NONE}
135
+ activeBackground={activeBackground}
172
136
  />
173
137
 
174
138
  <VBCollection
175
139
  title="Backgrounds"
176
140
  options={mediaList.map(mediaURL => ({
177
- type: HMSVirtualBackgroundTypes.IMAGE,
178
141
  mediaURL,
179
- onClick: async () => await addPlugin({ mediaURL }),
142
+ value: mediaURL,
143
+ onClick: async () => {
144
+ await VBHandler?.setBackground(mediaURL);
145
+ setActiveBackground(mediaURL);
146
+ },
180
147
  }))}
181
- activeBackgroundType={backgroundType || HMSVirtualBackgroundTypes.NONE}
182
- activeBackground={background?.src || background || HMSVirtualBackgroundTypes.NONE}
148
+ activeBackground={activeBackground}
183
149
  />
184
150
  </Box>
185
151
  </Flex>
@@ -1,5 +1,3 @@
1
- import { HMSVBPlugin, HMSVirtualBackgroundTypes } from '@100mslive/hms-virtual-background';
2
-
3
1
  export const defaultMedia = [
4
2
  'https://assets.100ms.live/webapp/vb-mini/vb-1.jpg',
5
3
  'https://assets.100ms.live/webapp/vb-mini/vb-2.jpg',
@@ -14,5 +12,3 @@ export const defaultMedia = [
14
12
  'https://assets.100ms.live/webapp/vb-mini/vb-11.jpg',
15
13
  'https://assets.100ms.live/webapp/vb-mini/vb-12.jpg',
16
14
  ];
17
-
18
- export const vbPlugin = new HMSVBPlugin(HMSVirtualBackgroundTypes.NONE, HMSVirtualBackgroundTypes.NONE);
@@ -32,6 +32,11 @@ const SidePane = ({
32
32
  const trackId = useHMSStore(selectVideoTrackByPeerID(activeScreensharePeerId))?.id;
33
33
  const { elements } = useRoomLayoutConferencingScreen();
34
34
  const { elements: preview_elements } = useRoomLayoutPreviewScreen();
35
+
36
+ const backgroundMedia = preview_elements?.virtual_background?.background_media?.length
37
+ ? preview_elements?.virtual_background?.background_media
38
+ : elements?.virtual_background?.background_media || [];
39
+
35
40
  const resetSidePane = useSidepaneReset();
36
41
  let ViewComponent;
37
42
  if (sidepane === SIDE_PANE_OPTIONS.POLLS) {
@@ -41,7 +46,7 @@ const SidePane = ({
41
46
  ViewComponent = <SidePaneTabs hideControls={hideControls} active={sidepane} />;
42
47
  }
43
48
  if (sidepane === SIDE_PANE_OPTIONS.VB) {
44
- ViewComponent = <VBPicker backgroundMedia={preview_elements?.virtual_background?.background_media || []} />;
49
+ ViewComponent = <VBPicker backgroundMedia={backgroundMedia} />;
45
50
  }
46
51
 
47
52
  useEffect(() => {
@@ -2,6 +2,7 @@ import type * as Stitches from '@stitches/react';
2
2
  import { createStitches } from '@stitches/react';
3
3
  import merge from 'lodash.merge';
4
4
  import { baseConfig, defaultMedia, defaultThemeMap, defaultUtils } from './base.config';
5
+ import { DEFAULT_PORTAL_CONTAINER } from '../Prebuilt/common/constants';
5
6
 
6
7
  const HmsStitches = createStitches({
7
8
  prefix: 'hms-ui',
@@ -28,18 +29,9 @@ export const {
28
29
  } = HmsStitches;
29
30
 
30
31
  export const globalStyles = globalCss({
31
- '*': {
32
+ [`${DEFAULT_PORTAL_CONTAINER} *`]: {
32
33
  fontFamily: '$sans',
33
34
  boxSizing: 'border-box',
34
- borderWidth: 0,
35
- borderStyle: 'solid',
36
- },
37
- body: {
38
- margin: 0,
39
- },
40
- '#root': {
41
- height: '100%',
42
- overscrollBehaviorY: 'none',
43
35
  },
44
36
  '::-webkit-scrollbar-track': {
45
37
  WebkitBoxShadow: 'inset 0 0 6px rgba(0, 0, 0, 0.3)',