diff --git a/package.json b/package.json index fa8439f53..b4814dbab 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,12 @@ "src" ], "dependencies": { - "@100mslive/hls-player": "0.1.3", - "@100mslive/hms-noise-suppression": "0.9.3", - "@100mslive/hms-virtual-background": "1.11.3", - "@100mslive/react-icons": "0.8.3", - "@100mslive/react-sdk": "0.8.3", - "@100mslive/react-ui": "0.8.3", + "@100mslive/hls-player": "0.1.5", + "@100mslive/hms-noise-suppression": "0.9.5", + "@100mslive/hms-virtual-background": "1.11.5", + "@100mslive/react-icons": "0.8.5", + "@100mslive/react-sdk": "0.8.5", + "@100mslive/react-ui": "0.8.5", "@emoji-mart/data": "^1.0.6", "@emoji-mart/react": "^1.0.1", "@tldraw/tldraw": "^1.18.4", diff --git a/src/common/PeersSorter.js b/src/common/PeersSorter.js new file mode 100644 index 000000000..855277c9f --- /dev/null +++ b/src/common/PeersSorter.js @@ -0,0 +1,97 @@ +import { selectDominantSpeaker } from "@100mslive/hms-video-store"; + +class PeersSorter { + listeners = new Set(); + storeUnsubscribe; + + constructor(store) { + this.store = store; + this.peers = new Map(); + this.lruPeers = new Set(); + this.speaker = undefined; + } + + setPeersAndTilesPerPage = ({ peers, tilesPerPage }) => { + this.tilesPerPage = tilesPerPage; + const peerIds = new Set(peers.map(peer => peer.id)); + // remove existing peers which are no longer provided + this.peers.forEach((_, key) => { + if (!peerIds.has(key)) { + this.peers.delete(key); + } + }); + this.lruPeers = new Set( + [...this.lruPeers].filter(peerId => peerIds.has(peerId)) + ); + peers.forEach(peer => { + this.peers.set(peer.id, peer); + if (this.lruPeers.size < tilesPerPage) { + this.lruPeers.add(peer.id); + } + }); + if (!this.storeUnsubscribe) { + this.storeUnsubscribe = this.store.subscribe( + this.onDominantSpeakerChange, + selectDominantSpeaker + ); + } + this.moveSpeakerToFront(this.speaker); + }; + + onUpdate = cb => { + this.listeners.add(cb); + }; + + stop = () => { + this.updateListeners(); + this.listeners.clear(); + this.storeUnsubscribe?.(); + }; + + moveSpeakerToFront = speaker => { + if (!speaker) { + this.updateListeners(); + return; + } + if ( + this.lruPeers.has(speaker.id) && + this.lruPeers.size <= this.tilesPerPage + ) { + this.updateListeners(); + return; + } + // delete to insert at beginning + this.lruPeers.delete(speaker.id); + let lruPeerArray = Array.from(this.lruPeers); + while (lruPeerArray.length >= this.tilesPerPage) { + lruPeerArray.pop(); + } + this.lruPeers = new Set([speaker.id, ...lruPeerArray]); + this.updateListeners(); + }; + + onDominantSpeakerChange = speaker => { + if (speaker && speaker.id !== this?.speaker?.id) { + this.speaker = speaker; + this.moveSpeakerToFront(speaker); + } + }; + + updateListeners = () => { + const orderedPeers = []; + this.lruPeers.forEach(key => { + const peer = this.peers.get(key); + if (peer) { + orderedPeers.push(peer); + } + }); + this.peers.forEach(peer => { + if (!this.lruPeers.has(peer.id) && peer) { + orderedPeers.push(peer); + } + }); + this.listeners.forEach(listener => listener?.(orderedPeers)); + }; +} + +export default PeersSorter; diff --git a/src/common/constants.js b/src/common/constants.js index e1eff3a69..cca633e54 100644 --- a/src/common/constants.js +++ b/src/common/constants.js @@ -142,6 +142,7 @@ export const UI_SETTINGS = { showStatsOnTiles: "showStatsOnTiles", enableAmbientMusic: "enableAmbientMusic", mirrorLocalVideo: "mirrorLocalVideo", + activeSpeakerSorting: "activeSpeakerSorting", hideLocalVideo: "hideLocalVideo", }; diff --git a/src/common/useSortedPeers.js b/src/common/useSortedPeers.js new file mode 100644 index 000000000..adb248bf7 --- /dev/null +++ b/src/common/useSortedPeers.js @@ -0,0 +1,28 @@ +import { useEffect, useRef, useState } from "react"; +import { useHMSVanillaStore } from "@100mslive/react-sdk"; +import PeersSorter from "./PeersSorter"; +import { useActiveSpeakerSorting } from "../components/AppData/useUISettings"; + +function useSortedPeers({ peers, maxTileCount = 9 }) { + const [sortedPeers, setSortedPeers] = useState([]); + const store = useHMSVanillaStore(); + const activeSpeakerSorting = useActiveSpeakerSorting(); + const peerSortedRef = useRef(new PeersSorter(store)); + peerSortedRef.current.onUpdate(setSortedPeers); + + useEffect(() => { + const peersSorter = peerSortedRef.current; + if (peers?.length > 0 && maxTileCount && activeSpeakerSorting) { + peersSorter.setPeersAndTilesPerPage({ + peers, + tilesPerPage: maxTileCount, + }); + } else if (!activeSpeakerSorting) { + peersSorter.stop(); + } + }, [maxTileCount, peers, activeSpeakerSorting]); + + return activeSpeakerSorting ? sortedPeers : peers; +} + +export default useSortedPeers; diff --git a/src/components/AppData/AppData.jsx b/src/components/AppData/AppData.jsx index 627db49f0..250958c11 100644 --- a/src/components/AppData/AppData.jsx +++ b/src/components/AppData/AppData.jsx @@ -56,6 +56,7 @@ const initialAppData = { [UI_SETTINGS.enableAmbientMusic]: false, [UI_SETTINGS.uiViewMode]: UI_MODE_GRID, [UI_SETTINGS.mirrorLocalVideo]: true, + [UI_SETTINGS.activeSpeakerSorting]: process.env.REACT_APP_ENV === "qa", [UI_SETTINGS.hideLocalVideo]: false, }, [APP_DATA.subscribedNotifications]: { diff --git a/src/components/AppData/useUISettings.js b/src/components/AppData/useUISettings.js index 173244255..98363fb13 100644 --- a/src/components/AppData/useUISettings.js +++ b/src/components/AppData/useUISettings.js @@ -58,6 +58,11 @@ export const useIsHeadless = () => { return isHeadless; }; +export const useActiveSpeakerSorting = () => { + const activeSpeakerSorting = useUISettings(UI_SETTINGS.activeSpeakerSorting); + return activeSpeakerSorting; +}; + export const useHLSViewerRole = () => { return useHMSStore(selectAppData(APP_DATA.hlsViewerRole)); }; diff --git a/src/components/Chat/ChatBody.jsx b/src/components/Chat/ChatBody.jsx index 6d180a722..4f2ef8b2b 100644 --- a/src/components/Chat/ChatBody.jsx +++ b/src/components/Chat/ChatBody.jsx @@ -223,6 +223,7 @@ const ChatMessage = React.memo( r: messageType ? "$1" : undefined, px: messageType ? "$4" : "$2", py: messageType ? "$4" : 0, + userSelect: "none", }} key={message.time} data-testid="chat_msg" @@ -274,7 +275,9 @@ const ChatMessage = React.memo( mt: "$2", wordBreak: "break-word", whiteSpace: "pre-wrap", + userSelect: "all", }} + onClick={e => e.stopPropagation()} > diff --git a/src/components/Notifications/ReconnectNotifications.jsx b/src/components/Notifications/ReconnectNotifications.jsx index 311e0639c..1eabab275 100644 --- a/src/components/Notifications/ReconnectNotifications.jsx +++ b/src/components/Notifications/ReconnectNotifications.jsx @@ -1,9 +1,10 @@ -import { useEffect } from "react"; +import { useEffect, useState } from "react"; import { logMessage } from "zipyai"; import { HMSNotificationTypes, useHMSNotifications, } from "@100mslive/react-sdk"; +import { Dialog, Flex, Loading, Text } from "@100mslive/react-ui"; import { ToastConfig } from "../Toast/ToastConfig"; import { ToastManager } from "../Toast/ToastManager"; @@ -12,8 +13,11 @@ const notificationTypes = [ HMSNotificationTypes.RECONNECTING, ]; let notificationId = null; + +const isQA = process.env.REACT_APP_ENV === "qa"; export const ReconnectNotifications = () => { const notification = useHMSNotifications(notificationTypes); + const [open, setOpen] = useState(false); useEffect(() => { if (notification?.type === HMSNotificationTypes.RECONNECTED) { logMessage("Reconnected"); @@ -21,13 +25,47 @@ export const ReconnectNotifications = () => { notificationId, ToastConfig.RECONNECTED.single() ); + setOpen(false); } else if (notification?.type === HMSNotificationTypes.RECONNECTING) { logMessage("Reconnecting"); - notificationId = ToastManager.replaceToast( - notificationId, - ToastConfig.RECONNECTING.single(notification.data.message) - ); + if (isQA) { + ToastManager.removeToast(notificationId); + setOpen(true); + } else { + notificationId = ToastManager.replaceToast( + notificationId, + ToastConfig.RECONNECTING.single(notification.data.message) + ); + } } }, [notification]); - return null; + if (!open || !isQA) return null; + return ( + + + + + +
+ +
+ + You lost your network connection. Trying to reconnect. + +
+
+
+
+ ); }; diff --git a/src/components/Settings/LayoutSettings.jsx b/src/components/Settings/LayoutSettings.jsx index 8e8ad9809..12d7f9613 100644 --- a/src/components/Settings/LayoutSettings.jsx +++ b/src/components/Settings/LayoutSettings.jsx @@ -20,7 +20,14 @@ export const LayoutSettings = () => { const isLocalVideoEnabled = useHMSStore(selectIsLocalVideoEnabled); const isLocalScreenShared = useHMSStore(selectIsLocalScreenShared); const [ - { isAudioOnly, uiViewMode, maxTileCount, mirrorLocalVideo, hideLocalVideo }, + { + isAudioOnly, + uiViewMode, + maxTileCount, + mirrorLocalVideo, + activeSpeakerSorting, + hideLocalVideo, + }, setUISettings, ] = useSetUiSettings(); const toggleIsAudioOnly = useCallback( @@ -49,6 +56,16 @@ export const LayoutSettings = () => { id="activeSpeakerMode" label="Active Speaker Mode" /> + { + setUISettings({ + [UI_SETTINGS.activeSpeakerSorting]: value, + }); + }} + /> { value => `${value.rtmpURL}/${value.streamKey}` ) : []; - hmsActions.startRTMPOrRecording({ + await hmsActions.startRTMPOrRecording({ rtmpURLs: urls, meetingURL: recordingUrl, resolution: getResolution(resolution), diff --git a/src/components/VideoList.jsx b/src/components/VideoList.jsx index 8c437b2d1..ba42b61d7 100644 --- a/src/components/VideoList.jsx +++ b/src/components/VideoList.jsx @@ -1,13 +1,14 @@ -import React, { useEffect, useState } from "react"; +import React, { Fragment, useEffect, useState } from "react"; import { selectLocalPeerID, useHMSStore, useVideoList, } from "@100mslive/react-sdk"; -import { getLeft, StyledVideoList, useTheme } from "@100mslive/react-ui"; +import { StyledVideoList, useTheme } from "@100mslive/react-ui"; import { Pagination } from "./Pagination"; import ScreenshareTile from "./ScreenshareTile"; import VideoTile from "./VideoTile"; +import useSortedPeers from "../common/useSortedPeers"; import { useAppConfig } from "./AppData/useAppConfig"; import { useIsHeadless, useUISettings } from "./AppData/useUISettings"; import { UI_SETTINGS } from "../common/constants"; @@ -24,11 +25,12 @@ const List = ({ const isHeadless = useIsHeadless(); const hideLocalVideo = useUISettings(UI_SETTINGS.hideLocalVideo); const localPeerId = useHMSStore(selectLocalPeerID); - if (hideLocalVideo && peers.length > 1) { - peers = filterPeerId(peers, localPeerId); + let sortedPeers = useSortedPeers({ peers, maxTileCount }); + if (hideLocalVideo && sortedPeers.length > 1) { + sortedPeers = filterPeerId(sortedPeers, localPeerId); } const { ref, pagesWithTiles } = useVideoList({ - peers, + peers: sortedPeers, maxTileCount, maxColCount, maxRowCount, @@ -45,40 +47,30 @@ const List = ({ }, [pagesWithTiles.length, page]); return ( - + {pagesWithTiles && pagesWithTiles.length > 0 - ? pagesWithTiles.map((tiles, pageNo) => ( - - {tiles.map(tile => { - if (tile.width === 0 || tile.height === 0) { - return null; - } - return tile.track?.source === "screen" ? ( + ? pagesWithTiles[page]?.map(tile => { + return ( + + {tile.track?.source === "screen" ? ( ) : ( - ); - })} - - )) + )} + + ); + }) : null} {!isHeadless && pagesWithTiles.length > 1 ? ( diff --git a/src/components/VideoTile.jsx b/src/components/VideoTile.jsx index 65b3068cb..f53387ce8 100644 --- a/src/components/VideoTile.jsx +++ b/src/components/VideoTile.jsx @@ -33,7 +33,6 @@ const Tile = ({ trackId, width, height, - visible = true, objectFit = "cover", rootCSS = {}, containerCSS = {}, @@ -87,7 +86,6 @@ const Tile = ({ tileOffset: headlessConfig?.tileOffset, hideAudioLevel: headlessConfig?.hideAudioLevel, }), - visibility: visible ? "visible" : "hidden", ...rootCSS, }} data-testid={`participant_tile_${peerName}`} diff --git a/src/components/gridView.jsx b/src/components/gridView.jsx index de26ff118..9f660483b 100644 --- a/src/components/gridView.jsx +++ b/src/components/gridView.jsx @@ -22,6 +22,7 @@ const webinarInfoLink = webinarProps?.LINK_HREF || "https://100ms.live/"; export const GridCenterView = ({ peers, maxTileCount }) => { const mediaQueryLg = cssConfig.media.md; const limitMaxTiles = useMedia(mediaQueryLg); + const headlessConfig = useAppConfig("headlessConfig"); const isHeadless = useIsHeadless(); return ( diff --git a/src/layouts/ActiveSpeakerView.jsx b/src/layouts/ActiveSpeakerView.jsx index d83f0e01f..5a7035456 100755 --- a/src/layouts/ActiveSpeakerView.jsx +++ b/src/layouts/ActiveSpeakerView.jsx @@ -4,8 +4,9 @@ import { selectPeers, useHMSStore, } from "@100mslive/react-sdk"; -import { Flex } from "@100mslive/react-ui"; -import { GridCenterView, GridSidePaneView } from "../components/gridView"; +import { Box, Flex } from "@100mslive/react-ui"; +import { GridSidePaneView } from "../components/gridView"; +import VideoTile from "../components/VideoTile"; const ActiveSpeakerView = () => { const dominantSpeaker = useHMSStore(selectDominantSpeaker); @@ -27,11 +28,9 @@ const ActiveSpeakerView = () => { return ( - + + + {showSidePane && ( peer.id !== activeSpeaker.id)} diff --git a/src/plugins/transcription/Transcriber.js b/src/plugins/transcription/Transcriber.js index 4f8a27cc4..7c4c17906 100644 --- a/src/plugins/transcription/Transcriber.js +++ b/src/plugins/transcription/Transcriber.js @@ -5,11 +5,11 @@ import { } from "@100mslive/react-sdk"; export class Transcriber { - constructor( + constructor({ hmsStore, setTranscriptAndSpeakingPeer, - setIsTranscriptionEnabled - ) { + setIsTranscriptionEnabled, + }) { this.hmsStore = hmsStore; this.enabled = false; this.audioSocket = null; // this is the socket that will be used to send audio to the STT server diff --git a/src/plugins/transcription/TranscriptionButton.jsx b/src/plugins/transcription/TranscriptionButton.jsx index 09deca81b..759b00374 100644 --- a/src/plugins/transcription/TranscriptionButton.jsx +++ b/src/plugins/transcription/TranscriptionButton.jsx @@ -34,27 +34,31 @@ export function TranscriptionButton() { useEffect(() => { if (!transcriber.current) { - transcriber.current = new Transcriber( - rawStore, - async (transcript, peerName) => { + // create transcriber with the current room state for transcription + transcriber.current = new Transcriber({ + hmsStore: rawStore, + setTranscriptAndSpeakingPeer: async (transcript, peerName) => { + const transcriptionCurrentEnabledState = !!rawStore.getState( + selectSessionStore(SESSION_STORE_KEY.TRANSCRIPTION_STATE) + )?.enabled; await hmsActions.sessionStore.set( SESSION_STORE_KEY.TRANSCRIPTION_STATE, { - enabled: true, + enabled: transcriptionCurrentEnabledState, transcript, speakingPeer: peerName, } ); }, - async isEnabled => { + setIsTranscriptionEnabled: async newEnabledState => { await hmsActions.sessionStore.set( SESSION_STORE_KEY.TRANSCRIPTION_STATE, { - enabled: isEnabled, + enabled: newEnabledState, } ); - } - ); + }, + }); } return () => { if (transcriber.current) { diff --git a/src/plugins/whiteboard/Whiteboard.css b/src/plugins/whiteboard/Whiteboard.css index cf0c07705..2486cbe0b 100644 --- a/src/plugins/whiteboard/Whiteboard.css +++ b/src/plugins/whiteboard/Whiteboard.css @@ -6,3 +6,7 @@ .c-bUEyht-jvfJsl-side-right > button:nth-child(2) { display: none; } + +#TD-PrimaryTools-Image { + display: none; +} diff --git a/src/services/FeatureFlags.jsx b/src/services/FeatureFlags.jsx index dd4531785..f45be0431 100644 --- a/src/services/FeatureFlags.jsx +++ b/src/services/FeatureFlags.jsx @@ -1,4 +1,5 @@ import { useEffect } from "react"; +import { selectRoomID, useHMSStore } from "@100mslive/react-sdk"; export class FeatureFlags { static enableTranscription = @@ -12,7 +13,7 @@ export class FeatureFlags { static enableBeamSpeakersLogging = process.env.REACT_APP_ENABLE_BEAM_SPEAKERS_LOGGING === "true"; - static init() { + static init(roomId) { if (!window.HMS) { window.HMS = {}; } @@ -21,6 +22,9 @@ export class FeatureFlags { // ask permissions in preview even if role doesn't have it window.HMS.ALWAYS_REQUEST_PERMISSIONS = false; window.HMS.SHOW_NS = process.env.REACT_APP_ENV !== "prod"; + + this.enableTranscription = + process.env.REACT_APP_TRANSCRIPTION_ROOM_ID === roomId; } static showNS() { @@ -37,8 +41,11 @@ export class FeatureFlags { } export function FeatureFlagsInit() { + const roomId = useHMSStore(selectRoomID); useEffect(() => { - FeatureFlags.init(); - }, []); + if (roomId) { + FeatureFlags.init(roomId); + } + }, [roomId]); return null; } diff --git a/yarn.lock b/yarn.lock index 4074fe30f..cb6cd24a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,40 +2,40 @@ # yarn lockfile v1 -"@100mslive/hls-player@0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@100mslive/hls-player/-/hls-player-0.1.3.tgz#475698af494c6e254b668890651ccbbd6c2e63fd" - integrity sha512-ar7GT6Jy8mDPsrRx2ryuVXIk4im0mTqwP/60YlQ1ioXq/dK3PGuVevgR+VMOxLD1410m1sLuSbSAYJAyGzT2vw== +"@100mslive/hls-player@0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@100mslive/hls-player/-/hls-player-0.1.5.tgz#d395dbfba3888d64d283e1b2a6f8b78226cf3f57" + integrity sha512-GpOAhVhCKzoxkA7sOQ8GWt9G70gQtkQZjQ/SNnMU5qDZJgZRGG+eHx90rXsw9TfB7kPeeDFCfsA4/YOlYxgBEw== dependencies: - "@100mslive/hls-stats" "0.2.3" + "@100mslive/hls-stats" "0.2.5" eventemitter2 "^6.4.7" hls.js "^1.3.0" -"@100mslive/hls-stats@0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@100mslive/hls-stats/-/hls-stats-0.2.3.tgz#4dbd3296e81ca9199d1b27cdb62f76efb0a2ef88" - integrity sha512-7LVwhQBQQy9FDTHKJICrCfOcpF8P2hqIYveVH7Dil33nGOpIZzJ3FCjIuCS6rni/dCBZfwxhoCWGRhhgL1XNHg== +"@100mslive/hls-stats@0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@100mslive/hls-stats/-/hls-stats-0.2.5.tgz#58d403ac7747759da57a6c4acb928f0f72fc9348" + integrity sha512-IMvIMZs5APNJJnweAC2j5yCT1vq8g7bYp6NaKQJfiXovUxfzjsFBYnO1PBU27yZZMzuyk9wDKaY+HsoDKGvgEw== -"@100mslive/hms-noise-suppression@0.9.3": - version "0.9.3" - resolved "https://registry.yarnpkg.com/@100mslive/hms-noise-suppression/-/hms-noise-suppression-0.9.3.tgz#8b23fe0dddbe5a40ab16b3a143ae1989fba585f9" - integrity sha512-jZ55QfZld5fuNTd7RszCHZ0uSQ/OPTw6sOCeVtQBgzsgmcex18HHSVXEIMvwGnHtnjJKYgxbtIvP2ELDaNmYig== +"@100mslive/hms-noise-suppression@0.9.5": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@100mslive/hms-noise-suppression/-/hms-noise-suppression-0.9.5.tgz#e9e427a93aa8ba019dd3edc1eac4a751d321e8c3" + integrity sha512-d0cTYfXliG2XMNIkr5cP43YXbq0wi3I4MwICyoi0JjyyvVdeKdiSmr3iGtxu5wiaEGW0QYhetcyAzLuxTOu9Ag== -"@100mslive/hms-video-store@0.10.3": - version "0.10.3" - resolved "https://registry.yarnpkg.com/@100mslive/hms-video-store/-/hms-video-store-0.10.3.tgz#88a6be019cab4ac1af3af324a7760d33cd5922a7" - integrity sha512-b//IzVx0+F1ONSrkPtlEfR4JhjMdkV3Dh5/+R4vymsKju2preGBZKp0owbcdJ1fhz4SSkiN1a3bdfnW0s+IYwg== +"@100mslive/hms-video-store@0.10.5": + version "0.10.5" + resolved "https://registry.yarnpkg.com/@100mslive/hms-video-store/-/hms-video-store-0.10.5.tgz#c780327ab3f5e7727d3fa92d906c49e424c1d08e" + integrity sha512-4wHv2f6mi511ILV0yC0JKkz/H41i5/1jKN63q/s2CfMBYj8xYsaQLhPfCsiSti8zwZWDbd5Qh3S3Y4JvPxAYxg== dependencies: - "@100mslive/hms-video" "0.9.3" + "@100mslive/hms-video" "0.9.5" eventemitter2 "^6.4.7" immer "^9.0.6" reselect "4.0.0" zustand "3.5.7" -"@100mslive/hms-video@0.9.3": - version "0.9.3" - resolved "https://registry.yarnpkg.com/@100mslive/hms-video/-/hms-video-0.9.3.tgz#6be80df95e76f36cfc89bc38895a4cb7cb6ce01c" - integrity sha512-olp9SHEw3qY3Ugjo9BnfHsIyo4zeJbrI+OkoRtODPRTNO60+Vy/vPhlKBldlzIG5F+5GUlFXbNUAifZRZ43I+Q== +"@100mslive/hms-video@0.9.5": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@100mslive/hms-video/-/hms-video-0.9.5.tgz#0f37f0a7415b56b77cff3bc5c1a36796c7cb88b5" + integrity sha512-/Df4x0eFYxW7yelTmqyQpbgTfl1rs3v6af3cmQhNbbj8xT7DshOmZCVjpQqlMbn5jpj8Iv8WVzvgbt/q6TWnEg== dependencies: eventemitter2 "^6.4.7" sdp-transform "^2.14.1" @@ -43,10 +43,10 @@ uuid "^8.3.2" webrtc-adapter "^8.0.0" -"@100mslive/hms-virtual-background@1.11.3": - version "1.11.3" - resolved "https://registry.yarnpkg.com/@100mslive/hms-virtual-background/-/hms-virtual-background-1.11.3.tgz#7b469490e3c719815b731b9349c05f3a092c1f4d" - integrity sha512-zrKCLqv1spUIZ2WYBGhFrBU3WJgw3IIoNki+jnP1b3mxQzj0vYin4OPJTutimWcMoyx7gFvQQYdF4XPY2qcjug== +"@100mslive/hms-virtual-background@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@100mslive/hms-virtual-background/-/hms-virtual-background-1.11.5.tgz#6539a735a68003249f8ba9c56a4e860940b5644b" + integrity sha512-NU9U2cuW1suitFSI7Q5nAlFv+FyiK3AA0ALmL2ynXRmuNds+F5Xo5IBmlS3AXWLcCl1Py04Qm3qJfcIywwKZJQ== dependencies: "@mediapipe/selfie_segmentation" "^0.1.1632777926" "@tensorflow-models/body-segmentation" "^1.0.1" @@ -58,27 +58,27 @@ gifuct-js "^2.1.2" wasm-check "^2.0.2" -"@100mslive/react-icons@0.8.3": - version "0.8.3" - resolved "https://registry.yarnpkg.com/@100mslive/react-icons/-/react-icons-0.8.3.tgz#07e91764b9e08db20a59ee0d00cc2b393928747f" - integrity sha512-B4gr3TQXfS4zlFOU6NYtFpHfd1VBgMj459PY57gVKkJ2JZRKFB1bZ3dh5AHcac7lL0j+GDgpoqVXS+qMD3jFrw== +"@100mslive/react-icons@0.8.5": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@100mslive/react-icons/-/react-icons-0.8.5.tgz#f478c0d81134df31f38b7780d421521f2bba261e" + integrity sha512-ZTJ34omKEKmHRkyWageCCXLIGMkCGs1ooVeYFTNytgjynZvEH6PzoGfZ+BtJVXlTfQGQfQYlZa9oFu7cb/DOYA== -"@100mslive/react-sdk@0.8.3": - version "0.8.3" - resolved "https://registry.yarnpkg.com/@100mslive/react-sdk/-/react-sdk-0.8.3.tgz#2e1d626e8c43a8ee4566b670bbd2a83ab4880128" - integrity sha512-epShtReOZiOppk+g2L8+eQRtnXZ9kW7ms8n9ewEONFtH/deeRZr7XUI9Vnaj65szKK4J+Xf6A7iiigEoNaU/FA== +"@100mslive/react-sdk@0.8.5": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@100mslive/react-sdk/-/react-sdk-0.8.5.tgz#1c57477b8f158b11921ebd3cc3d9ca7ecab5dfd1" + integrity sha512-5loN523Lq8C+bkNIgiMgYLcbGkST7x9aRdrOAo8kt21BFeOEh4oUBuOKpjxkqenOKOx+u+SSy68gQ+PjC0z47Q== dependencies: - "@100mslive/hms-video-store" "0.10.3" + "@100mslive/hms-video-store" "0.10.5" react-resize-detector "^7.0.0" zustand "^3.6.2" -"@100mslive/react-ui@0.8.3": - version "0.8.3" - resolved "https://registry.yarnpkg.com/@100mslive/react-ui/-/react-ui-0.8.3.tgz#26c9b84187064244a397d90ce7e4394fb08e6b1b" - integrity sha512-muNnNsDjQMU+xMYH2Z3wo7Hb6kghyGZ+XEy912pj40eoVmvqHvRiNLX+KoL/ohK4WCnBT9/AjHpYgscgx9lPKw== +"@100mslive/react-ui@0.8.5": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@100mslive/react-ui/-/react-ui-0.8.5.tgz#53a83ea7e508192acebc7ec263265b86e6b919f1" + integrity sha512-5y+tFysiHUR5mTKL65SCACwL3oYvCbi823Tnxtdu5vUhjGtJxgyUfwDDiKn21sVpI2k6YQWFKT7Bx++RLIZwGw== dependencies: - "@100mslive/react-icons" "0.8.3" - "@100mslive/react-sdk" "0.8.3" + "@100mslive/react-icons" "0.8.5" + "@100mslive/react-sdk" "0.8.5" "@radix-ui/react-accordion" "1.0.0" "@radix-ui/react-checkbox" "1.0.0" "@radix-ui/react-collapsible" "^1.0.1"