diff --git a/packages/ui-voip/src/context/MediaCallInstanceContext.ts b/packages/ui-voip/src/context/MediaCallInstanceContext.ts index 82fb2b2a61224..25224ff288e1e 100644 --- a/packages/ui-voip/src/context/MediaCallInstanceContext.ts +++ b/packages/ui-voip/src/context/MediaCallInstanceContext.ts @@ -17,7 +17,7 @@ export type MediaCallInstanceContextValue = { audioElement: RefObject | undefined; openRoomId: string | undefined; - currentViews: Set; + currentViews: Array; registerView: RegisterView; unregisterView: UnregisterView; @@ -37,7 +37,7 @@ export const defaultContextValue = { openRoomId: undefined, setOpenRoomId: () => undefined, getAutocompleteOptions: () => Promise.resolve([]), - currentViews: new Set(), + currentViews: [], registerView: () => undefined, unregisterView: () => undefined, openWidget: () => undefined, diff --git a/packages/ui-voip/src/providers/useAvailableViewTracker.ts b/packages/ui-voip/src/providers/useAvailableViewTracker.ts index e68af56343815..62a6849a4b2e2 100644 --- a/packages/ui-voip/src/providers/useAvailableViewTracker.ts +++ b/packages/ui-voip/src/providers/useAvailableViewTracker.ts @@ -1,4 +1,4 @@ -import { useCallback, useRef, useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import type { AvailableViews } from '../context/MediaCallInstanceContext'; @@ -13,35 +13,35 @@ const filter = (view: AvailableViews, _index: number, array: AvailableViews[]) = } }; -const getViewsSetStateAction = - (filteredViews: AvailableViews[]) => - (prev: Set): Set => { - if (filteredViews.length === prev.size && filteredViews.every((view) => prev.has(view))) { - return prev; - } - return new Set(filteredViews); - }; - const useAvailableViewTracker = () => { - const viewsRef = useRef>(new Set()); - const [currentViews, setCurrentViews] = useState>(new Set()); + const [views, setViews] = useState>(new Set()); const registerView = useCallback((view: AvailableViews) => { - if (viewsRef.current.has(view)) return; + setViews((prev) => { + if (prev.has(view)) { + return prev; + } + + prev.add(view); - viewsRef.current.add(view); - const filteredViews = [...viewsRef.current].filter(filter); - setCurrentViews(getViewsSetStateAction(filteredViews)); + return new Set(prev); + }); }, []); const unregisterView = useCallback((view: AvailableViews) => { - if (!viewsRef.current.has(view)) return; + setViews((prev) => { + if (!prev.has(view)) { + return prev; + } - viewsRef.current.delete(view); - const filteredViews = [...viewsRef.current].filter(filter); - setCurrentViews(getViewsSetStateAction(filteredViews)); + prev.delete(view); + + return new Set(prev); + }); }, []); + const currentViews = useMemo(() => [...views].filter(filter), [views]); + return { currentViews, registerView, diff --git a/packages/ui-voip/src/views/MediaCallPopout.tsx b/packages/ui-voip/src/views/MediaCallPopout.tsx index dd3e9a93287c9..ed221ebad7d06 100644 --- a/packages/ui-voip/src/views/MediaCallPopout.tsx +++ b/packages/ui-voip/src/views/MediaCallPopout.tsx @@ -31,7 +31,7 @@ const MediaCallPopout = () => { useEffect(() => { queueMicrotask(() => { - if (currentViews.has('popout') && callId) { + if (currentViews.includes('popout') && callId) { void openPopoutWindow(callId); return; } diff --git a/packages/ui-voip/src/views/MediaCallRoomSection/MediaCallRoomSection.tsx b/packages/ui-voip/src/views/MediaCallRoomSection/MediaCallRoomSection.tsx index 71b04cb5d5e62..cc658f5c01c19 100644 --- a/packages/ui-voip/src/views/MediaCallRoomSection/MediaCallRoomSection.tsx +++ b/packages/ui-voip/src/views/MediaCallRoomSection/MediaCallRoomSection.tsx @@ -58,7 +58,7 @@ const MediaCallRoomSection = ({ showChat, onToggleChat, user, containerHeight }: } = useMediaCallView(); const { currentViews } = useMediaCallInstance(); - const isPopout = currentViews.has('popout'); + const isPopout = currentViews.includes('popout'); const { muted, held, peerInfo, connectionState, startedAt } = sessionState; diff --git a/packages/ui-voip/src/views/MediaCallWidget/MediaCallWidget.tsx b/packages/ui-voip/src/views/MediaCallWidget/MediaCallWidget.tsx index cfe2977807940..e14381a996138 100644 --- a/packages/ui-voip/src/views/MediaCallWidget/MediaCallWidget.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/MediaCallWidget.tsx @@ -13,7 +13,7 @@ const MediaCallWidget = () => { const widgetVisible = targetWidgetVisibility === 'open' || state !== 'none'; - if (hidden || !currentViews.has('widget') || !widgetVisible) { + if (hidden || !currentViews.includes('widget') || !widgetVisible) { return null; } diff --git a/packages/ui-voip/src/views/MediaCallWidget/OngoingCallWithScreen.tsx b/packages/ui-voip/src/views/MediaCallWidget/OngoingCallWithScreen.tsx index de413b08340dc..a19a59a0f1e25 100644 --- a/packages/ui-voip/src/views/MediaCallWidget/OngoingCallWithScreen.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/OngoingCallWithScreen.tsx @@ -38,7 +38,7 @@ const OngoingCall = () => { } = useMediaCallView(); const { muted, held, remoteMuted, remoteHeld, peerInfo, connectionState, startedAt } = sessionState; const { currentViews } = useMediaCallInstance(); - const isPopout = currentViews.has('popout'); + const isPopout = currentViews.includes('popout'); const { localScreen, remoteScreen } = streams;