@stream-io/video-react-sdk 1.27.1 → 1.27.2
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.
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../src/core/components/Audio/Audio.tsx","../../src/core/components/Audio/ParticipantsAudio.tsx","../../src/core/components/ParticipantView/ParticipantViewContext.tsx","../../src/hooks/useFloatingUIPreset.ts","../../src/hooks/usePersistedDevicePreferences.ts","../../src/hooks/useScrollPosition.ts","../../src/hooks/useRequestPermission.ts","../../src/hooks/useDeviceList.tsx","../../src/components/Menu/MenuToggle.tsx","../../src/components/Menu/GenericMenu.tsx","../../src/components/Icon/Icon.tsx","../../src/core/hooks/usePictureInPictureState.ts","../../src/core/components/ParticipantView/ParticipantActionsContextMenu.tsx","../../src/utilities/isComponentType.ts","../../src/utilities/chunk.ts","../../src/utilities/applyElementToRef.ts","../../src/core/components/Video/BaseVideo.tsx","../../src/core/components/Video/BaseVideoPlaceholder.tsx","../../src/core/components/Video/DefaultVideoPlaceholder.tsx","../../src/core/components/Video/DefaultPictureInPicturePlaceholder.tsx","../../src/core/components/Video/Video.tsx","../../src/core/hooks/useTrackElementVisibility.ts","../../src/components/Avatar/Avatar.tsx","../../src/components/BackgroundFilters/BackgroundFilters.tsx","../../src/components/Button/IconButton.tsx","../../src/components/Button/CompositeButton.tsx","../../src/components/Button/TextButton.tsx","../../src/components/CallControls/AcceptCallButton.tsx","../../src/components/Notification/Notification.tsx","../../src/components/Notification/PermissionNotification.tsx","../../src/components/Notification/SpeakingWhileMutedNotification.tsx","../../src/components/Notification/RecordingInProgressNotification.tsx","../../src/components/LoadingIndicator/LoadingIndicator.tsx","../../src/components/Tooltip/Tooltip.tsx","../../src/components/Tooltip/hooks/useEnterLeaveHandlers.ts","../../src/components/Tooltip/WithTooltip.tsx","../../src/components/CallControls/RecordCallButton.tsx","../../src/components/Reaction/Reaction.tsx","../../src/components/CallControls/ReactionsButton.tsx","../../src/utilities/callControlHandler.ts","../../src/components/CallControls/ScreenShareButton.tsx","../../src/components/DeviceSettings/AudioVolumeIndicator.tsx","../../src/components/DropdownSelect/DropdownSelect.tsx","../../src/components/DeviceSettings/DeviceSelector.tsx","../../src/components/DeviceSettings/SpeakerTest.tsx","../../src/components/DeviceSettings/DeviceSelectorAudio.tsx","../../src/components/DeviceSettings/DeviceSelectorVideo.tsx","../../src/components/DeviceSettings/DeviceSettings.tsx","../../src/components/CallControls/ToggleAudioButton.tsx","../../src/components/CallControls/ToggleVideoButton.tsx","../../src/components/CallControls/CancelCallButton.tsx","../../src/components/CallControls/CallControls.tsx","../../src/components/CallStats/CallStats.tsx","../../src/components/CallControls/CallStatsButton.tsx","../../src/components/CallControls/ToggleAudioOutputButton.tsx","../../src/components/CallParticipantsList/BlockedUserListing.tsx","../../src/components/CallParticipantsList/CallParticipantListHeader.tsx","../../src/components/CallParticipantsList/CallParticipantListingItem.tsx","../../src/components/CallParticipantsList/CallParticipantListing.tsx","../../src/components/CallParticipantsList/EmptyParticipantSearchList.tsx","../../src/components/Search/SearchInput.tsx","../../src/components/Search/SearchResults.tsx","../../src/components/Search/hooks/useSearch.ts","../../src/components/CallParticipantsList/CallParticipantsList.tsx","../../src/components/CallPreview/CallPreview.tsx","../../src/components/CallRecordingList/CallRecordingListHeader.tsx","../../src/components/CallRecordingList/CallRecordingListItem.tsx","../../src/components/CallRecordingList/EmptyCallRecordingListing.tsx","../../src/components/CallRecordingList/LoadingCallRecordingListing.tsx","../../src/components/CallRecordingList/CallRecordingList.tsx","../../src/components/NoiseCancellation/NoiseCancellationProvider.tsx","../../src/components/RingingCall/RingingCallControls.tsx","../../src/components/RingingCall/RingingCall.tsx","../../src/components/Permissions/PermissionRequests.tsx","../../src/components/StreamTheme/StreamTheme.tsx","../../src/components/VideoPreview/VideoPreview.tsx","../../src/core/components/ParticipantView/DefaultParticipantViewUI.tsx","../../src/core/components/ParticipantView/ParticipantView.tsx","../../src/core/components/StreamCall/StreamCall.tsx","../../src/translations/index.ts","../../src/core/components/StreamVideo/StreamVideo.tsx","../../src/utilities/filter.ts","../../src/core/components/CallLayout/hooks.ts","../../src/core/components/CallLayout/LivestreamLayout.tsx","../../src/core/components/CallLayout/PaginatedGridLayout.tsx","../../src/core/hooks/useCalculateHardLimit.ts","../../src/core/components/CallLayout/SpeakerLayout.tsx","../../src/core/components/CallLayout/PipLayout.tsx","../../src/wrappers/LivestreamPlayer/LivestreamPlayer.tsx","../../index.ts"],"sourcesContent":["import { ComponentPropsWithoutRef, useEffect, useState } from 'react';\nimport {\n AudioTrackType,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type AudioProps = ComponentPropsWithoutRef<'audio'> & {\n /**\n * The participant whose audio stream we want to play.\n */\n participant: StreamVideoParticipant;\n\n /**\n * The type of audio stream to play for the given participant.\n * The default value is `audioTrack`.\n */\n trackType?: AudioTrackType;\n};\n\nexport const Audio = ({\n participant,\n trackType = 'audioTrack',\n ...rest\n}: AudioProps) => {\n const call = useCall();\n const [audioElement, setAudioElement] = useState<HTMLAudioElement | null>(\n null,\n );\n const { userId, sessionId } = participant;\n\n useEffect(() => {\n if (!call || !audioElement) return;\n const cleanup = call.bindAudioElement(audioElement, sessionId, trackType);\n return () => {\n cleanup?.();\n };\n }, [call, sessionId, audioElement, trackType]);\n\n return (\n <audio\n autoPlay\n {...rest}\n ref={setAudioElement}\n data-user-id={userId}\n data-session-id={sessionId}\n data-track-type={trackType}\n />\n );\n};\n\nAudio.displayName = 'Audio';\n","import { ComponentProps, Fragment } from 'react';\nimport {\n hasAudio,\n hasScreenShareAudio,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport { Audio } from './Audio';\n\nexport type ParticipantsAudioProps = {\n /**\n * The participants to play audio for.\n */\n participants: StreamVideoParticipant[];\n\n /**\n * Props to pass to the underlying `Audio` components.\n */\n audioProps?: ComponentProps<typeof Audio>;\n};\n\nexport const ParticipantsAudio = (props: ParticipantsAudioProps) => {\n const { participants, audioProps } = props;\n return (\n <>\n {participants.map((participant) => {\n if (participant.isLocalParticipant) return null;\n const { audioStream, screenShareAudioStream, sessionId } = participant;\n\n const hasAudioTrack = hasAudio(participant);\n const audioTrackElement = hasAudioTrack && audioStream && (\n <Audio\n {...audioProps}\n trackType=\"audioTrack\"\n participant={participant}\n />\n );\n\n const hasScreenShareAudioTrack = hasScreenShareAudio(participant);\n const screenShareAudioTrackElement = hasScreenShareAudioTrack &&\n screenShareAudioStream && (\n <Audio\n {...audioProps}\n trackType=\"screenShareAudioTrack\"\n participant={participant}\n />\n );\n\n return (\n <Fragment key={sessionId}>\n {audioTrackElement}\n {screenShareAudioTrackElement}\n </Fragment>\n );\n })}\n </>\n );\n};\n\nParticipantsAudio.displayName = 'ParticipantsAudio';\n","import { createContext, useContext } from 'react';\nimport { ParticipantViewProps } from './ParticipantView';\n\nexport type ParticipantViewContextValue = Required<\n Pick<ParticipantViewProps, 'participant' | 'trackType'>\n> & {\n participantViewElement?: HTMLDivElement | null;\n videoElement?: HTMLVideoElement | null;\n videoPlaceholderElement?: HTMLDivElement | null;\n};\n\nexport const ParticipantViewContext = createContext<\n ParticipantViewContextValue | undefined\n>(undefined);\n\nexport const useParticipantViewContext = () =>\n useContext(ParticipantViewContext) as ParticipantViewContextValue;\n","import { useEffect } from 'react';\nimport type { UseFloatingOptions } from '@floating-ui/react';\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n size,\n useFloating,\n} from '@floating-ui/react';\n\nexport const useFloatingUIPreset = ({\n middleware = [],\n placement,\n strategy,\n offset: offsetInPx = 10,\n}: Pick<UseFloatingOptions, 'placement' | 'strategy' | 'middleware'> & {\n offset?: number;\n}) => {\n const {\n refs,\n x,\n y,\n update,\n elements: { domReference, floating },\n context,\n } = useFloating({\n placement,\n strategy,\n middleware: [\n offset(offsetInPx),\n shift(),\n flip(),\n size({\n padding: 10,\n apply: ({ availableHeight, elements }) => {\n Object.assign(elements.floating.style, {\n maxHeight: `${availableHeight}px`,\n });\n },\n }),\n ...middleware,\n ],\n });\n\n // handle window resizing\n useEffect(() => {\n if (!domReference || !floating) return;\n\n const cleanup = autoUpdate(domReference, floating, update);\n\n return () => cleanup();\n }, [domReference, floating, update]);\n\n return { refs, x, y, domReference, floating, strategy, context };\n};\n","import { useEffect, useState } from 'react';\nimport { CallingState, InputDeviceStatus } from '@stream-io/video-client';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport type LocalDevicePreference = {\n selectedDeviceId: string;\n selectedDeviceLabel: string;\n muted?: boolean;\n};\n\nexport type LocalDevicePreferences = {\n // Array is preference history with latest preferences first.\n // Single preference still acceptable for backwards compatibility.\n [type in DeviceKey]?: LocalDevicePreference | LocalDevicePreference[];\n};\n\ntype DeviceKey = 'microphone' | 'camera' | 'speaker';\n\ntype DeviceState<K extends DeviceKey> = {\n [ManagerKey in K]: DeviceManagerLike;\n} & {\n isMute?: boolean;\n devices: MediaDeviceInfo[];\n selectedDevice: string | undefined;\n};\n\ninterface DeviceManagerLike {\n state: { selectedDevice: string | undefined; status?: InputDeviceStatus };\n select: (deviceId: string) => Promise<void> | void;\n enable?: () => Promise<void>;\n disable?: () => Promise<void>;\n}\n\nconst defaultDevice = 'default';\n\n/**\n * This hook will apply and persist the device preferences from local storage.\n *\n * @param key the key to use for local storage.\n */\nexport const usePersistedDevicePreferences = (\n key: string = '@stream-io/device-preferences',\n): void => {\n const {\n useCallSettings,\n useCallCallingState,\n useMicrophoneState,\n useCameraState,\n useSpeakerState,\n } = useCallStateHooks();\n const settings = useCallSettings();\n const callingState = useCallCallingState();\n\n const microphoneState: DeviceState<'microphone'> = useMicrophoneState();\n const cameraState: DeviceState<'camera'> = useCameraState();\n const speakerState: DeviceState<'speaker'> = useSpeakerState();\n\n const [applyingState, setApplyingState] = useState<\n 'idle' | 'applying' | 'applied'\n >('idle');\n\n // when the camera is disabled on call type level, we should discard\n // any stored camera preferences.\n const cameraDevices = settings?.video?.enabled ? cameraState.devices : false;\n useEffect(\n function apply() {\n if (\n callingState === CallingState.LEFT ||\n microphoneState.devices.length === 0 ||\n (Array.isArray(cameraDevices) && cameraDevices.length === 0) ||\n speakerState.devices.length === 0 ||\n !settings ||\n applyingState !== 'idle'\n ) {\n return;\n }\n\n setApplyingState('applying');\n\n (async () => {\n const { audio, video } = settings;\n for (const [deviceKey, state, defaultMuted, enabledInCallType] of [\n ['microphone', microphoneState, !audio.mic_default_on, true],\n ['camera', cameraState, !video.camera_default_on, video.enabled],\n ['speaker', speakerState, false, true],\n ] as const) {\n const preferences = parseLocalDevicePreferences(key);\n const preference = preferences[deviceKey];\n const manager = (\n state as DeviceState<'camera' | 'microphone' | 'speaker'>\n )[deviceKey];\n\n const applyPromise = preference\n ? applyLocalDevicePreference(\n manager,\n [preference].flat(),\n deviceKey === 'camera' ? cameraDevices || [] : state.devices,\n enabledInCallType,\n )\n : applyMutedState(manager, defaultMuted, enabledInCallType);\n\n await applyPromise.catch((err) => {\n console.warn(\n `Failed to apply ${deviceKey} device preferences`,\n err,\n );\n });\n }\n })().finally(() =>\n setApplyingState((state) => (state === 'applying' ? 'applied' : state)),\n );\n },\n [\n applyingState,\n callingState,\n cameraState,\n cameraDevices,\n key,\n microphoneState,\n microphoneState.devices,\n settings,\n speakerState,\n speakerState.devices,\n ],\n );\n\n useEffect(\n function persist() {\n if (callingState === CallingState.LEFT || applyingState !== 'applied') {\n return;\n }\n\n for (const [deviceKey, devices, selectedDevice, isMute] of [\n [\n 'camera',\n cameraDevices || [],\n cameraState.selectedDevice,\n cameraState.isMute,\n ],\n [\n 'microphone',\n microphoneState.devices,\n microphoneState.selectedDevice,\n microphoneState.isMute,\n ],\n [\n 'speaker',\n speakerState.devices,\n speakerState.selectedDevice,\n speakerState.isMute,\n ],\n ] as const) {\n try {\n patchLocalDevicePreference(key, deviceKey, {\n devices,\n selectedDevice,\n isMute,\n });\n } catch (err) {\n console.warn(`Failed to save ${deviceKey} device preferences`, err);\n }\n }\n },\n [\n applyingState,\n callingState,\n cameraDevices,\n cameraState.isMute,\n cameraState.selectedDevice,\n key,\n microphoneState.devices,\n microphoneState.isMute,\n microphoneState.selectedDevice,\n speakerState.devices,\n speakerState.isMute,\n speakerState.selectedDevice,\n ],\n );\n};\n\n// const usePersistedDevicePreference = <K extends DeviceKey>(\n// key: string,\n// deviceKey: K,\n// state: DeviceState<K>,\n// defaultMuted?: boolean,\n// ): void => {\n// const { useCallCallingState } = useCallStateHooks();\n// const callingState = useCallCallingState();\n// const [applyingState, setApplyingState] = useState<\n// 'idle' | 'applying' | 'applied'\n// >('idle');\n// const manager = state[deviceKey];\n\n// useEffect(\n// function apply() {\n// if (\n// callingState === CallingState.LEFT ||\n// !state.devices?.length ||\n// typeof defaultMuted !== 'boolean' ||\n// applyingState !== 'idle'\n// ) {\n// return;\n// }\n\n// const preferences = parseLocalDevicePreferences(key);\n// const preference = preferences[deviceKey];\n\n// setApplyingState('applying');\n\n// if (!manager.state.selectedDevice) {\n// const applyPromise = preference\n// ? applyLocalDevicePreference(\n// manager,\n// [preference].flat(),\n// state.devices,\n// )\n// : applyMutedState(manager, defaultMuted);\n\n// applyPromise\n// .catch((err) => {\n// console.warn(\n// `Failed to apply ${deviceKey} device preferences`,\n// err,\n// );\n// })\n// .finally(() => setApplyingState('applied'));\n// } else {\n// setApplyingState('applied');\n// }\n// },\n// [\n// applyingState,\n// callingState,\n// defaultMuted,\n// deviceKey,\n// key,\n// manager,\n// state.devices,\n// ],\n// );\n\n// useEffect(\n// function persist() {\n// if (\n// callingState === CallingState.LEFT ||\n// !state.devices?.length ||\n// applyingState !== 'applied'\n// ) {\n// return;\n// }\n\n// try {\n// patchLocalDevicePreference(key, deviceKey, {\n// devices: state.devices,\n// selectedDevice: state.selectedDevice,\n// isMute: state.isMute,\n// });\n// } catch (err) {\n// console.warn(`Failed to save ${deviceKey} device preferences`, err);\n// }\n// },\n// [\n// applyingState,\n// callingState,\n// deviceKey,\n// key,\n// state.devices,\n// state.isMute,\n// state.selectedDevice,\n// ],\n// );\n// };\n\nconst parseLocalDevicePreferences = (key: string): LocalDevicePreferences => {\n const preferencesStr = window.localStorage.getItem(key);\n let preferences: LocalDevicePreferences = {};\n\n if (preferencesStr) {\n try {\n preferences = JSON.parse(preferencesStr);\n\n if (Object.hasOwn(preferences, 'mic')) {\n // for backwards compatibility\n preferences.microphone = (\n preferences as { mic: LocalDevicePreference }\n ).mic;\n }\n } catch {\n /* assume preferences are empty */\n }\n }\n\n return preferences;\n};\n\nconst patchLocalDevicePreference = (\n key: string,\n deviceKey: DeviceKey,\n state: Pick<DeviceState<never>, 'devices' | 'selectedDevice' | 'isMute'>,\n): void => {\n const preferences = parseLocalDevicePreferences(key);\n const nextPreference = getSelectedDevicePreference(\n state.devices,\n state.selectedDevice,\n );\n const preferenceHistory = [preferences[deviceKey] ?? []]\n .flat()\n .filter(\n (p) =>\n p.selectedDeviceId !== nextPreference.selectedDeviceId &&\n (p.selectedDeviceLabel === '' ||\n p.selectedDeviceLabel !== nextPreference.selectedDeviceLabel),\n );\n\n window.localStorage.setItem(\n key,\n JSON.stringify({\n ...preferences,\n mic: undefined, // for backwards compatibility\n [deviceKey]: [\n {\n ...nextPreference,\n muted: state.isMute,\n } satisfies LocalDevicePreference,\n ...preferenceHistory,\n ].slice(0, 3),\n }),\n );\n};\n\nconst applyLocalDevicePreference = async (\n manager: DeviceManagerLike,\n preference: LocalDevicePreference[],\n devices: MediaDeviceInfo[],\n enabledInCallType: boolean,\n): Promise<void> => {\n let muted: boolean | undefined;\n\n for (const p of preference) {\n muted ??= p.muted;\n\n if (p.selectedDeviceId === defaultDevice) {\n break;\n }\n\n const device =\n devices.find((d) => d.deviceId === p.selectedDeviceId) ??\n devices.find((d) => d.label === p.selectedDeviceLabel);\n\n if (device) {\n if (!manager.state.selectedDevice) {\n await manager.select(device.deviceId);\n }\n\n muted = p.muted;\n break;\n }\n }\n\n if (typeof muted === 'boolean') {\n await applyMutedState(manager, muted, enabledInCallType);\n }\n};\n\nconst applyMutedState = async (\n manager: DeviceManagerLike,\n muted: boolean,\n enabledInCallType: boolean,\n) => {\n if (enabledInCallType && !manager.state.status) {\n await manager[muted ? 'disable' : 'enable']?.();\n }\n};\n\nconst getSelectedDevicePreference = (\n devices: MediaDeviceInfo[],\n selectedDevice: string | undefined,\n): Pick<LocalDevicePreference, 'selectedDeviceId' | 'selectedDeviceLabel'> => ({\n selectedDeviceId: selectedDevice || defaultDevice,\n selectedDeviceLabel:\n devices?.find((d) => d.deviceId === selectedDevice)?.label ?? '',\n});\n","import { useEffect, useState } from 'react';\n\nconst SCROLL_THRESHOLD = 10;\n\n/**\n * Hook which observes element's scroll position and returns text value based on the\n * position of the scrollbar (`top`, `bottom`, `between` and `null` if no scrollbar is available)\n */\nexport const useVerticalScrollPosition = (\n scrollElement: HTMLElement | null,\n threshold: number = SCROLL_THRESHOLD,\n) => {\n const [scrollPosition, setScrollPosition] = useState<\n 'top' | 'bottom' | 'between' | null\n >(null);\n\n useEffect(() => {\n if (!scrollElement) return;\n\n const scrollHandler = () => {\n const element = scrollElement;\n\n const hasVerticalScrollbar = element.scrollHeight > element.clientHeight;\n\n if (!hasVerticalScrollbar) return setScrollPosition(null);\n\n const isAtTheTop = element.scrollTop <= threshold;\n if (isAtTheTop) return setScrollPosition('top');\n\n const isAtTheBottom =\n Math.abs(\n element.scrollHeight - element.scrollTop - element.clientHeight,\n ) <= threshold;\n\n if (isAtTheBottom) return setScrollPosition('bottom');\n\n setScrollPosition('between');\n };\n\n const resizeObserver = new ResizeObserver(scrollHandler);\n resizeObserver.observe(scrollElement);\n\n scrollElement.addEventListener('scroll', scrollHandler);\n return () => {\n scrollElement.removeEventListener('scroll', scrollHandler);\n resizeObserver.disconnect();\n };\n }, [scrollElement, threshold]);\n\n return scrollPosition;\n};\n\nexport const useHorizontalScrollPosition = (\n scrollElement: HTMLElement | null,\n threshold: number = SCROLL_THRESHOLD,\n) => {\n const [scrollPosition, setScrollPosition] = useState<\n 'start' | 'end' | 'between' | null\n >(null);\n\n useEffect(() => {\n if (!scrollElement) return;\n\n const scrollHandler = () => {\n const element = scrollElement;\n\n const hasHorizontalScrollbar = element.scrollWidth > element.clientWidth;\n\n if (!hasHorizontalScrollbar) return setScrollPosition(null);\n\n const isAtTheStart = element.scrollLeft <= threshold;\n if (isAtTheStart) return setScrollPosition('start');\n\n const isAtTheEnd =\n Math.abs(\n element.scrollWidth - element.scrollLeft - element.clientWidth,\n ) <= threshold;\n\n if (isAtTheEnd) return setScrollPosition('end');\n\n setScrollPosition('between');\n };\n\n const resizeObserver = new ResizeObserver(scrollHandler);\n resizeObserver.observe(scrollElement);\n\n scrollElement.addEventListener('scroll', scrollHandler);\n return () => {\n scrollElement.removeEventListener('scroll', scrollHandler);\n resizeObserver.disconnect();\n };\n }, [scrollElement, threshold]);\n\n return scrollPosition;\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport { OwnCapability } from '@stream-io/video-client';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport const useRequestPermission = (permission: OwnCapability) => {\n const call = useCall();\n const { useHasPermissions } = useCallStateHooks();\n const hasPermission = useHasPermissions(permission);\n const [isAwaitingPermission, setIsAwaitingPermission] = useState(false); // TODO: load with possibly pending state\n\n useEffect(() => {\n const reset = () => setIsAwaitingPermission(false);\n\n if (hasPermission) reset();\n }, [hasPermission]);\n\n const requestPermission = useCallback(async () => {\n if (hasPermission) return true;\n\n const canRequestPermission =\n !!call?.permissionsContext.canRequest(permission);\n if (isAwaitingPermission || !canRequestPermission) return false;\n\n setIsAwaitingPermission(true);\n\n try {\n await call?.requestPermissions({\n permissions: [permission],\n });\n } catch (error) {\n setIsAwaitingPermission(false);\n throw new Error(`requestPermission failed: ${error}`);\n }\n\n return false;\n }, [call, hasPermission, isAwaitingPermission, permission]);\n\n return {\n requestPermission,\n hasPermission,\n canRequestPermission: !!call?.permissionsContext.canRequest(permission),\n isAwaitingPermission,\n };\n};\n","import { useI18n } from '@stream-io/video-react-bindings';\nimport { useMemo } from 'react';\n\nexport interface DeviceListItem {\n deviceId: string;\n label: string;\n isSelected: boolean;\n}\n\n/**\n * Utility hook that helps render a list of devices or implement a device selector.\n * Compared to someting like `useCameraState().devices`, it has some handy features:\n * 1. Adds the \"Default\" device to the list if applicable (either the user did not\n * select a device, or a previously selected device is no longer available).\n * 2. Maps the device list to a format more suitable for rendering.\n */\nexport function useDeviceList(\n devices: MediaDeviceInfo[],\n selectedDeviceId: string | undefined,\n): {\n deviceList: DeviceListItem[];\n selectedDeviceInfo: DeviceListItem;\n selectedIndex: number;\n} {\n const { t } = useI18n();\n\n return useMemo(() => {\n let selectedDeviceInfo: DeviceListItem | null = null;\n let selectedIndex: number | null = null;\n\n const deviceList: DeviceListItem[] = devices.map((d, i) => {\n const isSelected = d.deviceId === selectedDeviceId;\n const device = { deviceId: d.deviceId, label: d.label, isSelected };\n\n if (isSelected) {\n selectedDeviceInfo = device;\n selectedIndex = i;\n }\n\n return device;\n });\n\n if (selectedDeviceInfo === null || selectedIndex === null) {\n const defaultDevice = {\n deviceId: 'default',\n label: t('Default'),\n isSelected: true,\n };\n\n selectedDeviceInfo = defaultDevice;\n selectedIndex = 0;\n deviceList.unshift(defaultDevice);\n }\n\n return { deviceList, selectedDeviceInfo, selectedIndex };\n }, [devices, selectedDeviceId, t]);\n}\n","import {\n ComponentType,\n createContext,\n PropsWithChildren,\n RefAttributes,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n FloatingOverlay,\n FloatingPortal,\n Placement,\n Strategy,\n UseFloatingReturn,\n} from '@floating-ui/react';\n\nimport { useFloatingUIPreset } from '../../hooks';\n\nexport type ToggleMenuButtonProps<E extends HTMLElement = HTMLButtonElement> = {\n menuShown: boolean;\n} & RefAttributes<E>;\n\nexport enum MenuVisualType {\n PORTAL = 'portal',\n MENU = 'menu',\n}\n\nexport type MenuToggleProps<E extends HTMLElement> = PropsWithChildren<{\n ToggleButton: ComponentType<ToggleMenuButtonProps<E>>;\n placement?: Placement;\n strategy?: Strategy;\n offset?: number;\n visualType?: MenuVisualType;\n onToggle?: (menuShown: boolean) => void;\n}>;\n\nexport type MenuContextValue = {\n close?: () => void;\n};\n\n/**\n * Used to provide utility APIs to the components rendered inside the portal.\n */\nconst MenuContext = createContext<MenuContextValue>({});\n\n/**\n * Access to the closes MenuContext.\n */\nexport const useMenuContext = (): MenuContextValue => {\n return useContext(MenuContext);\n};\n\nconst MenuPortal = ({\n children,\n refs,\n}: PropsWithChildren<{\n refs: UseFloatingReturn['refs'];\n}>) => {\n const portalId = useMemo(\n () => `str-video-portal-${Math.random().toString(36).substring(2, 9)}`,\n [],\n );\n\n return (\n <>\n <div id={portalId} className=\"str-video__portal\" />\n <FloatingOverlay>\n <FloatingPortal id={portalId}>\n <div className=\"str-video__portal-content\" ref={refs.setFloating}>\n {children}\n </div>\n </FloatingPortal>\n </FloatingOverlay>\n </>\n );\n};\n\nexport const MenuToggle = <E extends HTMLElement>({\n ToggleButton,\n placement = 'top-start',\n strategy = 'absolute',\n offset,\n visualType = MenuVisualType.MENU,\n children,\n onToggle,\n}: MenuToggleProps<E>) => {\n const [menuShown, setMenuShown] = useState(false);\n const toggleHandler = useRef(onToggle);\n toggleHandler.current = onToggle;\n\n const { floating, domReference, refs, x, y } = useFloatingUIPreset({\n placement,\n strategy,\n offset,\n });\n\n useEffect(() => {\n const parentDocument = domReference?.ownerDocument;\n\n const handleClick = (event: MouseEvent) => {\n if (!floating && domReference?.contains(event.target as Node)) {\n setMenuShown(true);\n toggleHandler.current?.(true);\n } else if (floating && !floating?.contains(event.target as Node)) {\n setMenuShown(false);\n toggleHandler.current?.(false);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key && // key can be undefined in some browsers\n event.key.toLowerCase() === 'escape' &&\n !event.altKey &&\n !event.ctrlKey\n ) {\n setMenuShown(false);\n toggleHandler.current?.(false);\n }\n };\n parentDocument?.addEventListener('click', handleClick, { capture: true });\n parentDocument?.addEventListener('keydown', handleKeyDown);\n return () => {\n parentDocument?.removeEventListener('click', handleClick, {\n capture: true,\n });\n parentDocument?.removeEventListener('keydown', handleKeyDown);\n };\n }, [floating, domReference]);\n\n return (\n <>\n {menuShown && (\n <MenuContext.Provider value={{ close: () => setMenuShown(false) }}>\n {visualType === MenuVisualType.PORTAL ? (\n <MenuPortal refs={refs} children={children} />\n ) : visualType === MenuVisualType.MENU ? (\n <div\n className=\"str-video__menu-container\"\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n role=\"menu\"\n children={children}\n />\n ) : null}\n </MenuContext.Provider>\n )}\n <ToggleButton menuShown={menuShown} ref={refs.setReference} />\n </>\n );\n};\n","import { ComponentProps, MouseEvent, PropsWithChildren, useRef } from 'react';\n\nexport const GenericMenu = ({\n children,\n onItemClick,\n}: PropsWithChildren<{\n onItemClick?: (e: MouseEvent) => void;\n}>) => {\n const ref = useRef<HTMLUListElement>(null);\n return (\n <ul\n className=\"str-video__generic-menu\"\n ref={ref}\n onClick={(e) => {\n if (\n onItemClick &&\n e.target !== ref.current &&\n ref.current?.contains(e.target as Node)\n ) {\n onItemClick(e);\n }\n }}\n >\n {children}\n </ul>\n );\n};\n\nexport const GenericMenuButtonItem = ({\n children,\n ...rest\n}: Omit<ComponentProps<'button'>, 'ref'>) => {\n return (\n <li className=\"str-video__generic-menu--item\">\n <button {...rest}>{children}</button>\n </li>\n );\n};\n","import clsx from 'clsx';\n\nexport type IconProps = {\n icon: string;\n className?: string;\n};\n\nexport const Icon = ({ className, icon }: IconProps) => (\n <span\n className={clsx(\n 'str-video__icon',\n icon && `str-video__icon--${icon}`,\n className,\n )}\n />\n);\n","import { useEffect, useState } from 'react';\n\nexport function usePictureInPictureState(videoElement?: HTMLVideoElement) {\n const [isPiP, setIsPiP] = useState(\n document.pictureInPictureElement === videoElement,\n );\n\n if (!videoElement && isPiP) setIsPiP(false);\n\n useEffect(() => {\n if (!videoElement) return;\n\n const handlePiP = () => {\n setIsPiP(document.pictureInPictureElement === videoElement);\n };\n\n videoElement.addEventListener('enterpictureinpicture', handlePiP);\n videoElement.addEventListener('leavepictureinpicture', handlePiP);\n\n return () => {\n videoElement.removeEventListener('enterpictureinpicture', handlePiP);\n videoElement.removeEventListener('leavepictureinpicture', handlePiP);\n };\n }, [videoElement]);\n\n return isPiP;\n}\n","import { useEffect, useState } from 'react';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\nimport {\n hasAudio,\n hasScreenShare,\n hasScreenShareAudio,\n hasVideo,\n OwnCapability,\n} from '@stream-io/video-client';\nimport { useParticipantViewContext } from './ParticipantViewContext';\nimport {\n GenericMenu,\n GenericMenuButtonItem,\n useMenuContext,\n} from '../../../components/Menu';\nimport { Icon } from '../../../components/Icon';\nimport { usePictureInPictureState } from '../../hooks/usePictureInPictureState';\n\nexport const ParticipantActionsContextMenu = () => {\n const { participant, participantViewElement, videoElement } =\n useParticipantViewContext();\n const [fullscreenModeOn, setFullscreenModeOn] = useState(\n !!document.fullscreenElement,\n );\n const call = useCall();\n const isPiP = usePictureInPictureState(videoElement ?? undefined);\n const { t } = useI18n();\n\n const { pin, sessionId, userId } = participant;\n\n const hasAudioTrack = hasAudio(participant);\n const hasVideoTrack = hasVideo(participant);\n const hasScreenShareTrack = hasScreenShare(participant);\n const hasScreenShareAudioTrack = hasScreenShareAudio(participant);\n\n const blockUser = () => call?.blockUser(userId);\n const kickUser = () => call?.kickUser({ user_id: userId });\n const muteAudio = () => call?.muteUser(userId, 'audio');\n const muteVideo = () => call?.muteUser(userId, 'video');\n const muteScreenShare = () => call?.muteUser(userId, 'screenshare');\n const muteScreenShareAudio = () =>\n call?.muteUser(userId, 'screenshare_audio');\n\n const grantPermission = (permission: string) => () => {\n call?.updateUserPermissions({\n user_id: userId,\n grant_permissions: [permission],\n });\n };\n\n const revokePermission = (permission: string) => () => {\n call?.updateUserPermissions({\n user_id: userId,\n revoke_permissions: [permission],\n });\n };\n\n const toggleParticipantPin = () => {\n if (pin) {\n call?.unpin(sessionId);\n } else {\n call?.pin(sessionId);\n }\n };\n\n const pinForEveryone = () => {\n call\n ?.pinForEveryone({ user_id: userId, session_id: sessionId })\n .catch((err) => {\n console.error(`Failed to pin participant ${userId}`, err);\n });\n };\n\n const unpinForEveryone = () => {\n call\n ?.unpinForEveryone({ user_id: userId, session_id: sessionId })\n .catch((err) => {\n console.error(`Failed to unpin participant ${userId}`, err);\n });\n };\n\n const toggleFullscreenMode = () => {\n if (!fullscreenModeOn) {\n return participantViewElement?.requestFullscreen().catch(console.error);\n }\n return document.exitFullscreen().catch(console.error);\n };\n\n useEffect(() => {\n // handles the case when fullscreen mode is toggled externally,\n // e.g., by pressing ESC key or some other keyboard shortcut\n const handleFullscreenChange = () => {\n setFullscreenModeOn(!!document.fullscreenElement);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n\n const togglePictureInPicture = () => {\n if (videoElement && !isPiP) {\n return videoElement\n .requestPictureInPicture()\n .catch(console.error) as Promise<void>;\n }\n\n return document.exitPictureInPicture().catch(console.error);\n };\n\n const { close } = useMenuContext() || {};\n return (\n <GenericMenu onItemClick={close}>\n <GenericMenuButtonItem\n onClick={toggleParticipantPin}\n disabled={pin && !pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {pin ? t('Unpin') : t('Pin')}\n </GenericMenuButtonItem>\n <Restricted requiredGrants={[OwnCapability.PIN_FOR_EVERYONE]}>\n <GenericMenuButtonItem\n onClick={pinForEveryone}\n disabled={pin && !pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {t('Pin for everyone')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={unpinForEveryone}\n disabled={!pin || pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {t('Unpin for everyone')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.BLOCK_USERS]}>\n <GenericMenuButtonItem onClick={blockUser}>\n <Icon icon=\"not-allowed\" />\n {t('Block')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.KICK_USER]}>\n <GenericMenuButtonItem onClick={kickUser}>\n <Icon icon=\"kick-user\" />\n {t('Kick')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.MUTE_USERS]}>\n {hasVideoTrack && (\n <GenericMenuButtonItem onClick={muteVideo}>\n <Icon icon=\"camera-off-outline\" />\n {t('Turn off video')}\n </GenericMenuButtonItem>\n )}\n {hasScreenShareTrack && (\n <GenericMenuButtonItem onClick={muteScreenShare}>\n <Icon icon=\"screen-share-off\" />\n {t('Turn off screen share')}\n </GenericMenuButtonItem>\n )}\n {hasAudioTrack && (\n <GenericMenuButtonItem onClick={muteAudio}>\n <Icon icon=\"no-audio\" />\n {t('Mute audio')}\n </GenericMenuButtonItem>\n )}\n {hasScreenShareAudioTrack && (\n <GenericMenuButtonItem onClick={muteScreenShareAudio}>\n <Icon icon=\"no-audio\" />\n {t('Mute screen share audio')}\n </GenericMenuButtonItem>\n )}\n </Restricted>\n {participantViewElement &&\n typeof participantViewElement.requestFullscreen !== 'undefined' && (\n <GenericMenuButtonItem onClick={toggleFullscreenMode}>\n {t('{{ direction }} fullscreen', {\n direction: fullscreenModeOn ? t('Leave') : t('Enter'),\n })}\n </GenericMenuButtonItem>\n )}\n {videoElement && document.pictureInPictureEnabled && (\n <GenericMenuButtonItem onClick={togglePictureInPicture}>\n {t('{{ direction }} picture-in-picture', {\n direction: isPiP ? t('Leave') : t('Enter'),\n })}\n </GenericMenuButtonItem>\n )}\n <Restricted requiredGrants={[OwnCapability.UPDATE_CALL_PERMISSIONS]}>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SEND_AUDIO)}\n >\n {t('Allow audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SEND_VIDEO)}\n >\n {t('Allow video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SCREENSHARE)}\n >\n {t('Allow screen sharing')}\n </GenericMenuButtonItem>\n\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SEND_AUDIO)}\n >\n {t('Disable audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SEND_VIDEO)}\n >\n {t('Disable video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SCREENSHARE)}\n >\n {t('Disable screen sharing')}\n </GenericMenuButtonItem>\n </Restricted>\n </GenericMenu>\n );\n};\n","import { ComponentType, isValidElement, ReactElement } from 'react';\n\nexport const isComponentType = <T extends {}>(\n elementOrComponent?: ComponentType<T> | ReactElement | null,\n): elementOrComponent is ComponentType<T> => {\n return elementOrComponent === null\n ? false\n : !isValidElement(elementOrComponent);\n};\n","export const chunk = <T extends unknown[]>(array: T, size: number) => {\n const chunkCount = Math.ceil(array.length / size);\n\n return Array.from(\n { length: chunkCount },\n (_, index) => array.slice(size * index, size * index + size) as T,\n );\n};\n","import type { ForwardedRef } from 'react';\n\nexport const applyElementToRef = <T extends HTMLElement | null>(\n ref: ForwardedRef<T>,\n element: T,\n) => {\n if (!ref) return;\n\n if (typeof ref === 'function') return ref(element);\n\n ref.current = element;\n};\n","import { ComponentPropsWithRef, forwardRef, useEffect, useState } from 'react';\nimport { Browsers } from '@stream-io/video-client';\n\nimport { applyElementToRef } from '../../../utilities';\n\nexport type BaseVideoProps = ComponentPropsWithRef<'video'> & {\n stream?: MediaStream;\n};\n\n/**\n * @description Extends video element with `stream` property\n * (`srcObject`) to reactively handle stream changes\n */\nexport const BaseVideo = forwardRef<HTMLVideoElement, BaseVideoProps>(\n function BaseVideo({ stream, ...rest }, ref) {\n const [videoElement, setVideoElement] = useState<HTMLVideoElement | null>(\n null,\n );\n\n useEffect(() => {\n if (!videoElement || !stream) return;\n if (stream === videoElement.srcObject) return;\n\n videoElement.srcObject = stream;\n if (Browsers.isSafari() || Browsers.isFirefox()) {\n // Firefox and Safari have some timing issue\n setTimeout(() => {\n videoElement.srcObject = stream;\n videoElement.play().catch((e) => {\n console.error(`Failed to play stream`, e);\n });\n }, 0);\n }\n\n return () => {\n videoElement.pause();\n videoElement.srcObject = null;\n };\n }, [stream, videoElement]);\n\n return (\n <video\n autoPlay\n playsInline\n {...rest}\n ref={(element) => {\n applyElementToRef(ref, element);\n setVideoElement(element);\n }}\n />\n );\n },\n);\n","import { ComponentProps, RefAttributes, forwardRef, useState } from 'react';\nimport type { StreamVideoParticipant } from '@stream-io/video-client';\n\nexport type BaseVideoPlaceholderProps = {\n participant: StreamVideoParticipant;\n} & RefAttributes<HTMLDivElement> &\n ComponentProps<'div'>;\n\nexport const BaseVideoPlaceholder = forwardRef<\n HTMLDivElement,\n BaseVideoPlaceholderProps\n>(function DefaultVideoPlaceholder({ participant, style, children }, ref) {\n const [error, setError] = useState(false);\n const name = participant.name || participant.userId;\n return (\n <div className=\"str-video__video-placeholder\" style={style} ref={ref}>\n {(!participant.image || error) &&\n (name ? (\n <InitialsFallback name={name} />\n ) : (\n <div className=\"str-video__video-placeholder__no-video-label\">\n {children}\n </div>\n ))}\n {participant.image && !error && (\n <img\n onError={() => setError(true)}\n alt={name}\n className=\"str-video__video-placeholder__avatar\"\n src={participant.image}\n />\n )}\n </div>\n );\n});\n\nconst InitialsFallback = (props: { name: string }) => {\n const { name } = props;\n const initials = name\n .split(' ')\n .slice(0, 2)\n .map((n) => n[0])\n .join('');\n return (\n <div className=\"str-video__video-placeholder__initials-fallback\">\n {initials}\n </div>\n );\n};\n","import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport {\n BaseVideoPlaceholder,\n type BaseVideoPlaceholderProps,\n} from './BaseVideoPlaceholder';\n\nexport type VideoPlaceholderProps = BaseVideoPlaceholderProps;\n\nexport const DefaultVideoPlaceholder = forwardRef<\n HTMLDivElement,\n VideoPlaceholderProps\n>(function DefaultVideoPlaceholder(props, ref) {\n const { t } = useI18n();\n return (\n <BaseVideoPlaceholder ref={ref} {...props}>\n {t('Video is disabled')}\n </BaseVideoPlaceholder>\n );\n});\n","import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport {\n BaseVideoPlaceholder,\n type BaseVideoPlaceholderProps,\n} from './BaseVideoPlaceholder';\n\nexport type PictureInPicturePlaceholderProps = BaseVideoPlaceholderProps;\n\nexport const DefaultPictureInPicturePlaceholder = forwardRef<\n HTMLDivElement,\n PictureInPicturePlaceholderProps\n>(function DefaultPictureInPicturePlaceholder(props, ref) {\n const { t } = useI18n();\n return (\n <BaseVideoPlaceholder ref={ref} {...props}>\n {t('Video is playing in a popup')}\n </BaseVideoPlaceholder>\n );\n});\n","import {\n ComponentPropsWithoutRef,\n ComponentType,\n useEffect,\n useLayoutEffect,\n useState,\n} from 'react';\nimport {\n hasPausedTrack,\n hasScreenShare,\n hasVideo,\n StreamVideoParticipant,\n VideoTrackType,\n VisibilityState,\n} from '@stream-io/video-client';\nimport clsx from 'clsx';\nimport {\n DefaultVideoPlaceholder,\n VideoPlaceholderProps,\n} from './DefaultVideoPlaceholder';\nimport { useCall } from '@stream-io/video-react-bindings';\nimport { usePictureInPictureState } from '../../hooks/usePictureInPictureState';\nimport {\n DefaultPictureInPicturePlaceholder,\n PictureInPicturePlaceholderProps,\n} from './DefaultPictureInPicturePlaceholder';\n\nexport type VideoProps = ComponentPropsWithoutRef<'video'> & {\n /**\n * Pass false to disable rendering video and render fallback\n * even if the participant has published video.\n * @default true\n */\n enabled?: boolean;\n /**\n * Forces the video to be mirrored or unmirrored. By default, video track\n * from the local participant is mirrored, and all other videos are not mirrored.\n */\n mirror?: boolean;\n /**\n * The track type to display.\n */\n trackType: VideoTrackType | 'none';\n /**\n * The participant represented by this video element.\n */\n participant: StreamVideoParticipant;\n /**\n * Override the default UI that's visible when a participant turned off their video.\n * Set it to `null` if you wish to disable the video placeholder.\n *\n * @default DefaultVideoPlaceholder\n */\n VideoPlaceholder?: ComponentType<VideoPlaceholderProps> | null;\n /**\n * Override the default UI that's dispayed in place of the video when it's playing\n * in picture-in-picture. Set it to `null` if you wish to display the browser's default\n * placeholder.\n *\n * @default DefaultPictureInPicturePlaceholder\n */\n PictureInPicturePlaceholder?: ComponentType<PictureInPicturePlaceholderProps> | null;\n /**\n /**\n * An object with setRef functions\n * meant for exposing some of the internal elements of this component.\n */\n refs?: {\n /**\n * The video element that's used to play the video stream.\n * @param element the video element.\n */\n setVideoElement?: (element: HTMLVideoElement | null) => void;\n /**\n * The video placeholder element that's used when the video stream is not playing.\n * @param element the video placeholder element.\n */\n setVideoPlaceholderElement?: (element: HTMLDivElement | null) => void;\n setPictureInPicturePlaceholderElement?: (\n element: HTMLDivElement | null,\n ) => void;\n };\n};\n\nexport const Video = ({\n enabled = true,\n mirror,\n trackType,\n participant,\n className,\n VideoPlaceholder = DefaultVideoPlaceholder,\n PictureInPicturePlaceholder = DefaultPictureInPicturePlaceholder,\n refs,\n ...rest\n}: VideoProps) => {\n const {\n sessionId,\n videoStream,\n screenShareStream,\n viewportVisibilityState,\n isLocalParticipant,\n userId,\n } = participant;\n\n const call = useCall();\n const [videoElement, setVideoElement] = useState<HTMLVideoElement | null>(\n null,\n );\n // start with true, will flip once the video starts playing\n const [isVideoPaused, setIsVideoPaused] = useState(true);\n const [isWideMode, setIsWideMode] = useState(true);\n const isPiP = usePictureInPictureState(videoElement ?? undefined);\n\n const stream =\n trackType === 'videoTrack'\n ? videoStream\n : trackType === 'screenShareTrack'\n ? screenShareStream\n : undefined;\n\n useLayoutEffect(() => {\n if (!call || !videoElement || trackType === 'none') return;\n\n const cleanup = call.bindVideoElement(videoElement, sessionId, trackType);\n\n return () => {\n cleanup?.();\n };\n }, [call, trackType, sessionId, videoElement]);\n\n useEffect(() => {\n if (!stream || !videoElement) return;\n\n const [track] = stream.getVideoTracks();\n if (!track) return;\n\n const handlePlayPause = () => {\n setIsVideoPaused(videoElement.paused);\n\n const { width = 0, height = 0 } = track.getSettings();\n setIsWideMode(width >= height);\n };\n\n // playback may have started before we had a chance to\n // attach the 'play/pause' event listener, so we set the state\n // here to make sure it's in sync\n setIsVideoPaused(videoElement.paused);\n\n videoElement.addEventListener('play', handlePlayPause);\n videoElement.addEventListener('pause', handlePlayPause);\n track.addEventListener('unmute', handlePlayPause);\n return () => {\n videoElement.removeEventListener('play', handlePlayPause);\n videoElement.removeEventListener('pause', handlePlayPause);\n track.removeEventListener('unmute', handlePlayPause);\n\n // reset the 'pause' state once we unmount the video element\n setIsVideoPaused(true);\n };\n }, [stream, videoElement]);\n\n if (!call) return null;\n\n const isPublishingTrack =\n trackType === 'videoTrack'\n ? hasVideo(participant)\n : trackType === 'screenShareTrack'\n ? hasScreenShare(participant)\n : false;\n\n const isInvisible =\n trackType === 'none' ||\n viewportVisibilityState?.[trackType] === VisibilityState.INVISIBLE;\n\n const hasNoVideoOrInvisible =\n !enabled ||\n !isPublishingTrack ||\n isInvisible ||\n hasPausedTrack(participant, trackType);\n const mirrorVideo =\n mirror === undefined\n ? isLocalParticipant && trackType === 'videoTrack'\n : mirror;\n const isScreenShareTrack = trackType === 'screenShareTrack';\n return (\n <>\n {!hasNoVideoOrInvisible && (\n <video\n {...rest}\n className={clsx('str-video__video', className, {\n 'str-video__video--not-playing': isVideoPaused,\n 'str-video__video--tall': !isWideMode,\n 'str-video__video--mirror': mirrorVideo,\n 'str-video__video--screen-share': isScreenShareTrack,\n })}\n data-user-id={userId}\n data-session-id={sessionId}\n ref={(element) => {\n setVideoElement(element);\n refs?.setVideoElement?.(element);\n }}\n />\n )}\n {isPiP && PictureInPicturePlaceholder && (\n <PictureInPicturePlaceholder\n style={{ position: 'absolute' }}\n participant={participant}\n />\n )}\n {/* TODO: add condition to \"hold\" the placeholder until track unmutes as well */}\n {(hasNoVideoOrInvisible || isVideoPaused) && VideoPlaceholder && (\n <VideoPlaceholder\n style={{ position: 'absolute' }}\n participant={participant}\n ref={refs?.setVideoPlaceholderElement}\n />\n )}\n </>\n );\n};\n\nVideo.displayName = 'Video';\n","import { useEffect } from 'react';\nimport { DynascaleManager, VideoTrackType } from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport const useTrackElementVisibility = <T extends HTMLElement>({\n trackedElement,\n dynascaleManager: propsDynascaleManager,\n sessionId,\n trackType,\n}: {\n trackedElement: T | null;\n sessionId: string;\n dynascaleManager?: DynascaleManager;\n trackType: VideoTrackType | 'none';\n}) => {\n const call = useCall();\n const manager = propsDynascaleManager ?? call?.dynascaleManager;\n useEffect(() => {\n if (!trackedElement || !manager || !call || trackType === 'none') return;\n const unobserve = manager.trackElementVisibility(\n trackedElement,\n sessionId,\n trackType,\n );\n return () => {\n unobserve();\n };\n }, [trackedElement, manager, call, sessionId, trackType]);\n};\n","import { ComponentProps, CSSProperties, useState } from 'react';\nimport clsx from 'clsx';\n\nexport type AvatarData = {\n imageSrc?: string;\n name?: string;\n style?: CSSProperties & Record<string, string | number>;\n};\n\nexport type AvatarProps = AvatarData & ComponentProps<'img'>;\n\nexport const Avatar = ({\n imageSrc,\n name,\n style,\n className,\n ...rest\n}: AvatarProps) => {\n const [error, setError] = useState(false);\n\n return (\n <>\n {(!imageSrc || error) && name && (\n <AvatarFallback className={className} style={style} names={[name]} />\n )}\n {imageSrc && !error && (\n <img\n onError={() => setError(true)}\n alt=\"avatar\"\n className={clsx('str-video__avatar', className)}\n src={imageSrc}\n style={style}\n {...rest}\n />\n )}\n </>\n );\n};\n\ntype AvatarFallbackProps = {\n names: string[];\n className?: string;\n style?: CSSProperties & Record<string, string | number>;\n};\nexport const AvatarFallback = ({\n className,\n names,\n style,\n}: AvatarFallbackProps) => {\n return (\n <div\n className={clsx('str-video__avatar--initials-fallback', className)}\n style={style}\n >\n <div>\n {names[0][0]}\n {names[1]?.[0]}\n </div>\n </div>\n );\n};\n","import {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { flushSync } from 'react-dom';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { Call, disposeOfMediaStream } from '@stream-io/video-client';\nimport {\n BackgroundBlurLevel,\n BackgroundFilter,\n createRenderer,\n isPlatformSupported,\n isMediaPipePlatformSupported,\n loadTFLite,\n loadMediaPipe,\n PlatformSupportFlags,\n VirtualBackground,\n Renderer,\n TFLite,\n PerformanceStats,\n} from '@stream-io/video-filters-web';\nimport clsx from 'clsx';\n\n/**\n * Constants for FPS warning calculation.\n * Smooths out quick spikes using an EMA, ignores brief outliers,\n * and uses two thresholds to avoid flickering near the limit.\n */\nconst ALPHA = 0.2;\nconst FPS_WARNING_THRESHOLD_LOWER = 23;\nconst FPS_WARNING_THRESHOLD_UPPER = 25;\nconst DEFAULT_FPS = 30;\nconst DEVIATION_LIMIT = 0.5;\nconst OUTLIER_PERSISTENCE = 5;\n\n/**\n * Configuration for performance metric thresholds.\n */\nexport type BackgroundFiltersPerformanceThresholds = {\n /**\n * The lower FPS threshold for triggering a performance warning.\n * When the EMA FPS falls below this value, a warning is shown.\n * @default 23\n */\n fpsWarningThresholdLower?: number;\n\n /**\n * The upper FPS threshold for clearing a performance warning.\n * When the EMA FPS rises above this value, the warning is cleared.\n * @default 25\n */\n fpsWarningThresholdUpper?: number;\n\n /**\n * The default FPS value used as the initial value for the EMA (Exponential Moving Average)\n * calculation and when stats are unavailable or when resetting the filter.\n * @default 30\n */\n defaultFps?: number;\n};\n\n/**\n * Represents the available background filter processing engines.\n */\nenum FilterEngine {\n TF,\n MEDIA_PIPE,\n NONE,\n}\n\n/**\n * Represents the possible reasons for background filter performance degradation.\n */\nexport enum PerformanceDegradationReason {\n FRAME_DROP = 'frame-drop',\n CPU_THROTTLING = 'cpu-throttling',\n}\n\nexport type BackgroundFiltersProps = PlatformSupportFlags & {\n /**\n * A list of URLs to use as background images.\n */\n backgroundImages?: string[];\n\n /**\n * The background filter to apply to the video (by default).\n * @default undefined no filter applied\n */\n backgroundFilter?: BackgroundFilter;\n\n /**\n * The URL of the image to use as the background (by default).\n */\n backgroundImage?: string;\n\n /**\n * The level of blur to apply to the background (by default).\n * @default 'high'.\n */\n backgroundBlurLevel?: BackgroundBlurLevel;\n\n /**\n * The base path for the TensorFlow Lite files.\n * @default 'https://unpkg.com/@stream-io/video-filters-web/mediapipe'.\n */\n basePath?: string;\n\n /**\n * The path to the TensorFlow Lite WebAssembly file.\n *\n * Override this prop to use a custom path to the TensorFlow Lite WebAssembly file\n * (e.g., if you choose to host it yourself).\n */\n tfFilePath?: string;\n\n /**\n * The path to the MediaPipe model file.\n * Override this prop to use a custom path to the MediaPipe model file\n * (e.g., if you choose to host it yourself).\n */\n modelFilePath?: string;\n\n /**\n * When true, the filter uses the legacy TensorFlow-based segmentation model.\n * When false, it uses the default MediaPipe Tasks Vision model.\n *\n * Only enable this if you need to mimic the behavior of older SDK versions.\n */\n useLegacyFilter?: boolean;\n\n /**\n * When a started filter encounters an error, this callback will be executed.\n * The default behavior (not overridable) is unregistering a failed filter.\n * Use this callback to display UI error message, disable the corresponding stream,\n * or to try registering the filter again.\n */\n onError?: (error: any) => void;\n\n /**\n * Configuration for performance metric thresholds.\n * Use this to customize when performance warnings are triggered.\n */\n performanceThresholds?: BackgroundFiltersPerformanceThresholds;\n};\n\n/**\n * Performance degradation information for background filters.\n *\n * Performance is calculated using an Exponential Moving Average (EMA) of FPS values\n * to smooth out quick spikes and provide stable performance warnings.\n */\nexport type BackgroundFiltersPerformance = {\n /**\n * Whether performance is currently degraded.\n */\n degraded: boolean;\n /**\n * Reasons for performance degradation.\n */\n reason?: Array<PerformanceDegradationReason>;\n};\n\nexport type BackgroundFiltersAPI = {\n /**\n * Whether the current platform supports the background filters.\n */\n isSupported: boolean;\n\n /**\n * Indicates whether the background filters engine is loaded and ready.\n */\n isReady: boolean;\n\n /**\n * Performance information for background filters.\n */\n performance: BackgroundFiltersPerformance;\n\n /**\n * Disables all background filters applied to the video.\n */\n disableBackgroundFilter: () => void;\n\n /**\n * Applies a background blur filter to the video.\n *\n * @param blurLevel the level of blur to apply to the background.\n */\n applyBackgroundBlurFilter: (blurLevel: BackgroundBlurLevel) => void;\n\n /**\n * Applies a background image filter to the video.\n *\n * @param imageUrl the URL of the image to use as the background.\n */\n applyBackgroundImageFilter: (imageUrl: string) => void;\n};\n\n/**\n * The context value for the background filters context.\n */\nexport type BackgroundFiltersContextValue = BackgroundFiltersProps &\n BackgroundFiltersAPI;\n\n/**\n * The context for the background filters.\n */\nconst BackgroundFiltersContext = createContext<\n BackgroundFiltersContextValue | undefined\n>(undefined);\n\n/**\n * A hook to access the background filters context API.\n */\nexport const useBackgroundFilters = () => {\n const context = useContext(BackgroundFiltersContext);\n if (!context) {\n throw new Error(\n 'useBackgroundFilters must be used within a BackgroundFiltersProvider',\n );\n }\n return context;\n};\n\n/**\n * Determines which filter engine is available.\n * MEDIA_PIPE is the default unless legacy filters are requested or MediaPipe is unsupported.\n *\n * Returns NONE if neither is supported.\n */\nconst determineEngine = async (\n useLegacyFilter: boolean | undefined,\n forceSafariSupport: boolean | undefined,\n forceMobileSupport: boolean | undefined,\n): Promise<FilterEngine> => {\n const isTfPlatformSupported = await isPlatformSupported({\n forceSafariSupport,\n forceMobileSupport,\n });\n\n if (useLegacyFilter) {\n return isTfPlatformSupported ? FilterEngine.TF : FilterEngine.NONE;\n }\n\n const isMediaPipeSupported = await isMediaPipePlatformSupported({\n forceSafariSupport,\n forceMobileSupport,\n });\n\n return isMediaPipeSupported ? FilterEngine.MEDIA_PIPE : FilterEngine.NONE;\n};\n\n/**\n * A provider component that enables the use of background filters in your app.\n *\n * Please make sure you have the `@stream-io/video-filters-web` package installed\n * in your project before using this component.\n */\nexport const BackgroundFiltersProvider = (\n props: PropsWithChildren<BackgroundFiltersProps>,\n) => {\n const {\n children,\n backgroundImages = [],\n backgroundFilter: bgFilterFromProps = undefined,\n backgroundImage: bgImageFromProps = undefined,\n backgroundBlurLevel: bgBlurLevelFromProps = undefined,\n tfFilePath,\n modelFilePath,\n useLegacyFilter,\n basePath,\n onError,\n performanceThresholds,\n forceSafariSupport,\n forceMobileSupport,\n } = props;\n\n const call = useCall();\n const { useCallStatsReport } = useCallStateHooks();\n const callStatsReport = useCallStatsReport();\n\n const [backgroundFilter, setBackgroundFilter] = useState(bgFilterFromProps);\n const [backgroundImage, setBackgroundImage] = useState(bgImageFromProps);\n const [backgroundBlurLevel, setBackgroundBlurLevel] =\n useState(bgBlurLevelFromProps);\n\n const [showLowFpsWarning, setShowLowFpsWarning] = useState<boolean>(false);\n\n const fpsWarningThresholdLower =\n performanceThresholds?.fpsWarningThresholdLower ??\n FPS_WARNING_THRESHOLD_LOWER;\n const fpsWarningThresholdUpper =\n performanceThresholds?.fpsWarningThresholdUpper ??\n FPS_WARNING_THRESHOLD_UPPER;\n const defaultFps = performanceThresholds?.defaultFps ?? DEFAULT_FPS;\n\n const emaRef = useRef<number>(defaultFps);\n const outlierStreakRef = useRef<number>(0);\n\n const handleStats = useCallback(\n (stats: PerformanceStats) => {\n const fps = stats?.fps;\n if (fps === undefined || fps === null) {\n emaRef.current = defaultFps;\n outlierStreakRef.current = 0;\n setShowLowFpsWarning(false);\n return;\n }\n\n const prevEma = emaRef.current;\n const deviation = Math.abs(fps - prevEma) / prevEma;\n\n const isOutlier = fps < prevEma && deviation > DEVIATION_LIMIT;\n outlierStreakRef.current = isOutlier ? outlierStreakRef.current + 1 : 0;\n if (isOutlier && outlierStreakRef.current < OUTLIER_PERSISTENCE) return;\n\n emaRef.current = ALPHA * fps + (1 - ALPHA) * prevEma;\n\n setShowLowFpsWarning((prev) => {\n if (prev && emaRef.current > fpsWarningThresholdUpper) return false;\n if (!prev && emaRef.current < fpsWarningThresholdLower) return true;\n\n return prev;\n });\n },\n [fpsWarningThresholdLower, fpsWarningThresholdUpper, defaultFps],\n );\n\n const performance: BackgroundFiltersPerformance = useMemo(() => {\n if (!backgroundFilter) {\n return { degraded: false };\n }\n\n const reasons: Array<PerformanceDegradationReason> = [];\n\n if (showLowFpsWarning) {\n reasons.push(PerformanceDegradationReason.FRAME_DROP);\n }\n\n const qualityLimitationReasons =\n callStatsReport?.publisherStats?.qualityLimitationReasons;\n\n if (\n showLowFpsWarning &&\n qualityLimitationReasons &&\n qualityLimitationReasons?.includes('cpu')\n ) {\n reasons.push(PerformanceDegradationReason.CPU_THROTTLING);\n }\n\n return {\n degraded: reasons.length > 0,\n reason: reasons.length > 0 ? reasons : undefined,\n };\n }, [\n showLowFpsWarning,\n callStatsReport?.publisherStats?.qualityLimitationReasons,\n backgroundFilter,\n ]);\n\n const prevDegradedRef = useRef<boolean | undefined>(undefined);\n useEffect(() => {\n const currentDegraded = performance.degraded;\n const prevDegraded = prevDegradedRef.current;\n\n if (\n !!backgroundFilter &&\n prevDegraded !== undefined &&\n prevDegraded !== currentDegraded\n ) {\n call?.tracer.trace('backgroundFilters.performance', {\n degraded: currentDegraded,\n reason: performance?.reason,\n fps: emaRef.current,\n });\n }\n prevDegradedRef.current = currentDegraded;\n }, [\n performanceThresholds,\n performance.degraded,\n performance.reason,\n backgroundFilter,\n call?.tracer,\n ]);\n\n const applyBackgroundImageFilter = useCallback((imageUrl: string) => {\n setBackgroundFilter('image');\n setBackgroundImage(imageUrl);\n }, []);\n\n const applyBackgroundBlurFilter = useCallback(\n (blurLevel: BackgroundBlurLevel = 'high') => {\n setBackgroundFilter('blur');\n setBackgroundBlurLevel(blurLevel);\n },\n [],\n );\n\n const disableBackgroundFilter = useCallback(() => {\n setBackgroundFilter(undefined);\n setBackgroundImage(undefined);\n setBackgroundBlurLevel(undefined);\n\n emaRef.current = defaultFps;\n outlierStreakRef.current = 0;\n setShowLowFpsWarning(false);\n }, [defaultFps]);\n\n const [engine, setEngine] = useState<FilterEngine>(FilterEngine.NONE);\n const [isSupported, setIsSupported] = useState(false);\n useEffect(() => {\n determineEngine(\n useLegacyFilter,\n forceSafariSupport,\n forceMobileSupport,\n ).then((determinedEngine) => {\n setEngine(determinedEngine);\n setIsSupported(determinedEngine !== FilterEngine.NONE);\n });\n }, [forceMobileSupport, forceSafariSupport, useLegacyFilter]);\n\n const [tfLite, setTfLite] = useState<TFLite>();\n useEffect(() => {\n if (engine !== FilterEngine.TF) return;\n\n loadTFLite({ basePath, modelFilePath, tfFilePath })\n .then(setTfLite)\n .catch((err) => console.error('Failed to load TFLite', err));\n }, [basePath, engine, modelFilePath, tfFilePath]);\n\n const [mediaPipe, setMediaPipe] = useState<ArrayBuffer>();\n useEffect(() => {\n if (engine !== FilterEngine.MEDIA_PIPE) return;\n\n loadMediaPipe({\n basePath: basePath,\n modelPath: modelFilePath,\n })\n .then(setMediaPipe)\n .catch((err) => console.error('Failed to preload MediaPipe', err));\n }, [engine, modelFilePath, basePath]);\n\n const handleError = useCallback(\n (error: any) => {\n console.warn(\n '[filters] Filter encountered an error and will be disabled',\n );\n disableBackgroundFilter();\n onError?.(error);\n },\n [disableBackgroundFilter, onError],\n );\n\n const isReady = useLegacyFilter ? !!tfLite : !!mediaPipe;\n return (\n <BackgroundFiltersContext.Provider\n value={{\n isSupported,\n performance,\n isReady,\n backgroundImage,\n backgroundBlurLevel,\n backgroundFilter,\n disableBackgroundFilter,\n applyBackgroundBlurFilter,\n applyBackgroundImageFilter,\n backgroundImages,\n tfFilePath,\n modelFilePath,\n basePath,\n onError: handleError,\n }}\n >\n {children}\n {isReady && (\n <BackgroundFilters\n tfLite={tfLite}\n engine={engine}\n onStats={handleStats}\n />\n )}\n </BackgroundFiltersContext.Provider>\n );\n};\n\nconst BackgroundFilters = (props: {\n tfLite?: TFLite;\n engine: FilterEngine;\n onStats: (stats: PerformanceStats) => void;\n}) => {\n const call = useCall();\n const { children, start } = useRenderer(props.tfLite, call, props.engine);\n const { onError, backgroundFilter } = useBackgroundFilters();\n const handleErrorRef = useRef<((error: any) => void) | undefined>(undefined);\n handleErrorRef.current = onError;\n\n const handleStatsRef = useRef<\n ((stats: PerformanceStats) => void) | undefined\n >(undefined);\n handleStatsRef.current = props.onStats;\n\n useEffect(() => {\n if (!call || !backgroundFilter) return;\n\n const { unregister } = call.camera.registerFilter((ms) => {\n return start(\n ms,\n (error) => handleErrorRef.current?.(error),\n (stats: PerformanceStats) => handleStatsRef.current?.(stats),\n );\n });\n return () => {\n unregister().catch((err) => console.warn(`Can't unregister filter`, err));\n };\n }, [call, start, backgroundFilter]);\n\n return children;\n};\n\nconst useRenderer = (\n tfLite: TFLite | undefined,\n call: Call | undefined,\n engine: FilterEngine,\n) => {\n const {\n backgroundFilter,\n backgroundBlurLevel,\n backgroundImage,\n modelFilePath,\n basePath,\n } = useBackgroundFilters();\n\n const videoRef = useRef<HTMLVideoElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const bgImageRef = useRef<HTMLImageElement>(null);\n const [videoSize, setVideoSize] = useState<{ width: number; height: number }>(\n {\n width: 1920,\n height: 1080,\n },\n );\n\n const start = useCallback(\n (\n ms: MediaStream,\n onError?: (error: any) => void,\n onStats?: (stats: PerformanceStats) => void,\n ) => {\n let outputStream: MediaStream | undefined;\n let processor: VirtualBackground | undefined;\n let renderer: Renderer | undefined;\n\n const output = new Promise<MediaStream>((resolve, reject) => {\n if (!backgroundFilter) {\n reject(new Error('No filter specified'));\n return;\n }\n\n const videoEl = videoRef.current;\n const canvasEl = canvasRef.current;\n const bgImageEl = bgImageRef.current;\n\n const [track] = ms.getVideoTracks();\n\n if (!track) {\n reject(new Error('No video tracks in input media stream'));\n return;\n }\n\n if (engine === FilterEngine.MEDIA_PIPE) {\n call?.tracer.trace('backgroundFilters.enable', {\n backgroundFilter,\n backgroundBlurLevel,\n backgroundImage,\n engine,\n });\n\n if (!videoEl) {\n reject(new Error('Renderer started before elements are ready'));\n return;\n }\n\n const trackSettings = track.getSettings();\n flushSync(() =>\n setVideoSize({\n width: trackSettings.width ?? 0,\n height: trackSettings.height ?? 0,\n }),\n );\n\n processor = new VirtualBackground(\n track,\n {\n basePath: basePath,\n modelPath: modelFilePath,\n backgroundBlurLevel,\n backgroundImage,\n backgroundFilter,\n },\n { onError, onStats },\n );\n processor\n .start()\n .then((processedTrack) => {\n outputStream = new MediaStream([processedTrack]);\n resolve(outputStream);\n })\n .catch((error) => {\n reject(error);\n });\n\n return;\n }\n\n if (engine === FilterEngine.TF) {\n if (!videoEl || !canvasEl || (backgroundImage && !bgImageEl)) {\n reject(new Error('Renderer started before elements are ready'));\n return;\n }\n\n videoEl.srcObject = ms;\n videoEl.play().then(\n () => {\n const trackSettings = track.getSettings();\n flushSync(() =>\n setVideoSize({\n width: trackSettings.width ?? 0,\n height: trackSettings.height ?? 0,\n }),\n );\n call?.tracer.trace('backgroundFilters.enable', {\n backgroundFilter,\n backgroundBlurLevel,\n backgroundImage,\n engine,\n });\n\n if (!tfLite) {\n reject(new Error('TensorFlow Lite not loaded'));\n return;\n }\n\n renderer = createRenderer(\n tfLite,\n videoEl,\n canvasEl,\n {\n backgroundFilter,\n backgroundBlurLevel,\n backgroundImage: bgImageEl ?? undefined,\n },\n onError,\n );\n outputStream = canvasEl.captureStream();\n\n resolve(outputStream);\n },\n () => {\n reject(new Error('Could not play the source video stream'));\n },\n );\n return;\n }\n\n reject(new Error('No supported engine available'));\n });\n\n return {\n output,\n stop: () => {\n call?.tracer.trace('backgroundFilters.disable', null);\n processor?.stop();\n renderer?.dispose();\n if (videoRef.current) videoRef.current.srcObject = null;\n if (outputStream) disposeOfMediaStream(outputStream);\n },\n };\n },\n [\n backgroundBlurLevel,\n backgroundFilter,\n backgroundImage,\n call?.tracer,\n tfLite,\n engine,\n modelFilePath,\n basePath,\n ],\n );\n\n const children = (\n <div className=\"str-video__background-filters\">\n <video\n className={clsx(\n 'str-video__background-filters__video',\n videoSize.height > videoSize.width &&\n 'str-video__background-filters__video--tall',\n )}\n ref={videoRef}\n playsInline\n muted\n controls={false}\n {...videoSize}\n />\n {backgroundImage && (\n <img\n className=\"str-video__background-filters__background-image\"\n alt=\"Background\"\n ref={bgImageRef}\n crossOrigin=\"anonymous\"\n src={backgroundImage}\n {...videoSize}\n />\n )}\n <canvas\n className=\"str-video__background-filters__target-canvas\"\n {...videoSize}\n ref={canvasRef}\n />\n </div>\n );\n\n return { start, children };\n};\n","import { ComponentProps, ForwardedRef, forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport { Icon, IconProps } from '../Icon';\n\nexport type ButtonWithIconProps = {\n enabled?: boolean;\n variant?: string;\n} & ComponentProps<'button'> &\n IconProps;\n\nexport const IconButton = forwardRef(function IconButton(\n props: ButtonWithIconProps,\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n const { icon, enabled, variant, onClick, className, ...rest } = props;\n return (\n <button\n className={clsx('str-video__call-controls__button', className, {\n [`str-video__call-controls__button--variant-${variant}`]: variant,\n 'str-video__call-controls__button--enabled': enabled,\n })}\n onClick={(e) => {\n e.preventDefault();\n onClick?.(e);\n }}\n ref={ref}\n {...rest}\n >\n <Icon icon={icon} />\n </button>\n );\n});\n","import clsx from 'clsx';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport {\n ComponentProps,\n ComponentType,\n forwardRef,\n PropsWithChildren,\n ReactElement,\n} from 'react';\nimport { Placement } from '@floating-ui/react';\n\nimport { IconButton } from './IconButton';\nimport { isComponentType } from '../../utilities';\n\nexport type IconButtonWithMenuProps<E extends HTMLElement = HTMLButtonElement> =\n PropsWithChildren<{\n active?: boolean;\n Menu?: ComponentType | ReactElement | null;\n caption?: string;\n className?: string;\n menuPlacement?: Placement;\n menuOffset?: number;\n ToggleMenuButton?: ComponentType<ToggleMenuButtonProps<E>>;\n variant?: 'primary' | 'secondary';\n onMenuToggle?: (menuShown: boolean) => void;\n }> &\n ComponentProps<'button'>;\n\nexport const CompositeButton = forwardRef<\n HTMLDivElement,\n IconButtonWithMenuProps\n>(function CompositeButton(\n {\n disabled,\n caption,\n children,\n className,\n active,\n Menu,\n menuPlacement,\n menuOffset,\n title,\n ToggleMenuButton = DefaultToggleMenuButton,\n variant,\n onClick,\n onMenuToggle,\n ...restButtonProps\n },\n ref,\n) {\n return (\n <div\n className={clsx('str-video__composite-button', className, {\n 'str-video__composite-button--caption': caption,\n 'str-video__composite-button--menu': Menu,\n })}\n title={title}\n ref={ref}\n >\n <div\n className={clsx('str-video__composite-button__button-group', {\n 'str-video__composite-button__button-group--active': active,\n 'str-video__composite-button__button-group--active-primary':\n active && variant === 'primary',\n 'str-video__composite-button__button-group--active-secondary':\n active && variant === 'secondary',\n 'str-video__composite-button__button-group--disabled': disabled,\n })}\n >\n <button\n type=\"button\"\n className=\"str-video__composite-button__button\"\n onClick={(e) => {\n e.preventDefault();\n onClick?.(e);\n }}\n disabled={disabled}\n {...restButtonProps}\n >\n {children}\n </button>\n {Menu && (\n <MenuToggle\n offset={menuOffset}\n placement={menuPlacement}\n ToggleButton={ToggleMenuButton}\n onToggle={onMenuToggle}\n >\n {isComponentType(Menu) ? <Menu /> : Menu}\n </MenuToggle>\n )}\n </div>\n {caption && (\n <div className=\"str-video__composite-button__caption\">{caption}</div>\n )}\n </div>\n );\n});\n\nconst DefaultToggleMenuButton = forwardRef<\n HTMLButtonElement,\n ToggleMenuButtonProps\n>(function DefaultToggleMenuButton({ menuShown }, ref) {\n return (\n <IconButton\n className={clsx('str-video__menu-toggle-button', {\n 'str-video__menu-toggle-button--active': menuShown,\n })}\n icon={menuShown ? 'caret-down' : 'caret-up'}\n ref={ref}\n />\n );\n});\n","import { ComponentProps } from 'react';\n\nexport const TextButton = ({\n children,\n ...rest\n}: Omit<ComponentProps<'button'>, 'ref' | 'className'>) => {\n return (\n <button {...rest} className=\"str-video__text-button\">\n {children}\n </button>\n );\n};\n","import { MouseEventHandler, useCallback } from 'react';\nimport { IconButton } from '../Button';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type AcceptCallButtonProps = {\n disabled?: boolean;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onAccept?: () => void;\n};\n\nexport const AcceptCallButton = ({\n disabled,\n onAccept,\n onClick,\n}: AcceptCallButtonProps) => {\n const call = useCall();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n await call.join();\n onAccept?.();\n }\n },\n [onClick, onAccept, call],\n );\n return (\n <IconButton\n disabled={disabled}\n icon=\"call-accept\"\n variant=\"success\"\n data-testid=\"accept-call-button\"\n onClick={handleClick}\n />\n );\n};\n","import { PropsWithChildren, ReactNode, useEffect } from 'react';\nimport clsx from 'clsx';\nimport { Placement } from '@floating-ui/react';\nimport { useFloatingUIPreset } from '../../hooks';\n\nexport type NotificationProps = {\n message?: ReactNode;\n isVisible?: boolean;\n visibilityTimeout?: number;\n resetIsVisible?: () => void;\n placement?: Placement;\n className?: string;\n iconClassName?: string | null;\n close?: () => void;\n};\n\nexport const Notification = (props: PropsWithChildren<NotificationProps>) => {\n const {\n isVisible,\n message,\n children,\n visibilityTimeout,\n resetIsVisible,\n placement = 'top',\n className,\n iconClassName = 'str-video__notification__icon',\n close,\n } = props;\n\n const { refs, x, y, strategy } = useFloatingUIPreset({\n placement,\n strategy: 'absolute',\n });\n\n useEffect(() => {\n if (!isVisible || !visibilityTimeout || !resetIsVisible) return;\n\n const timeout = setTimeout(() => {\n resetIsVisible();\n }, visibilityTimeout);\n\n return () => clearTimeout(timeout);\n }, [isVisible, resetIsVisible, visibilityTimeout]);\n\n return (\n <div ref={refs.setReference}>\n {isVisible && (\n <div\n className={clsx('str-video__notification', className)}\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n >\n {iconClassName && <i className={iconClassName} />}\n <span className=\"str-video__notification__message\">{message}</span>\n {close ? (\n <i\n className=\"str-video__icon str-video__icon--close str-video__notification__close\"\n onClick={close}\n />\n ) : null}\n </div>\n )}\n {children}\n </div>\n );\n};\n","import { Notification } from './Notification';\nimport { OwnCapability } from '@stream-io/video-client';\nimport {\n PropsWithChildren,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport type PermissionNotificationProps = PropsWithChildren<{\n /**\n * Set this to true if there is ongoing request for the permission.\n */\n isAwaitingApproval: boolean;\n\n /**\n * The message to display in the notification once\n * the requested permission is granted.\n */\n messageApproved: string;\n\n /**\n * The message to display in the notification once a permission\n * is revoked.\n */\n messageRevoked: string;\n\n /**\n * The message to display in the notification while\n * the requested permission is awaiting approval.\n */\n messageAwaitingApproval: string;\n\n /**\n * The permission to check for.\n */\n permission: OwnCapability;\n\n /**\n * The time in milliseconds to display the notification.\n * Defaults to 3500ms.\n */\n visibilityTimeout?: number;\n}>;\n\nexport const PermissionNotification = (props: PermissionNotificationProps) => {\n const {\n permission,\n isAwaitingApproval,\n messageApproved,\n messageAwaitingApproval,\n messageRevoked,\n visibilityTimeout = 3500,\n children,\n } = props;\n const { useHasPermissions } = useCallStateHooks();\n const hasPermission = useHasPermissions(permission);\n const prevHasPermission = useRef(hasPermission);\n const [showNotification, setShowNotification] = useState<\n 'granted' | 'revoked'\n >();\n useEffect(() => {\n if (prevHasPermission.current === hasPermission) return;\n\n if (hasPermission) {\n setShowNotification('granted');\n prevHasPermission.current = true;\n } else {\n setShowNotification('revoked');\n prevHasPermission.current = false;\n }\n }, [hasPermission]);\n\n const resetIsVisible = useCallback(() => setShowNotification(undefined), []);\n if (isAwaitingApproval) {\n return (\n <Notification\n isVisible={isAwaitingApproval && !hasPermission}\n message={messageAwaitingApproval}\n >\n {children}\n </Notification>\n );\n }\n\n return (\n <Notification\n isVisible={!!showNotification}\n visibilityTimeout={visibilityTimeout}\n resetIsVisible={resetIsVisible}\n message={\n showNotification === 'granted' ? messageApproved : messageRevoked\n }\n >\n {children}\n </Notification>\n );\n};\n","import { PropsWithChildren } from 'react';\nimport { Placement } from '@floating-ui/react';\n\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { Notification } from './Notification';\n\nexport type SpeakingWhileMutedNotificationProps = {\n /**\n * Text message displayed by the notification.\n */\n text?: string;\n placement?: Placement;\n};\n\nexport const SpeakingWhileMutedNotification = ({\n children,\n text,\n placement,\n}: PropsWithChildren<SpeakingWhileMutedNotificationProps>) => {\n const { useMicrophoneState } = useCallStateHooks();\n const { isSpeakingWhileMuted } = useMicrophoneState();\n const { t } = useI18n();\n\n const message = text ?? t('You are muted. Unmute to speak.');\n return (\n <Notification\n message={message}\n isVisible={isSpeakingWhileMuted}\n placement={placement || 'top-start'}\n >\n {children}\n </Notification>\n );\n};\n","import { PropsWithChildren, useEffect, useState } from 'react';\nimport {\n useI18n,\n useToggleCallRecording,\n} from '@stream-io/video-react-bindings';\nimport { Notification } from './Notification';\n\nexport type RecordingInProgressNotificationProps = {\n text?: string;\n};\n\nexport const RecordingInProgressNotification = ({\n children,\n text,\n}: PropsWithChildren<RecordingInProgressNotificationProps>) => {\n const { t } = useI18n();\n const { isCallRecordingInProgress } = useToggleCallRecording();\n\n const [isVisible, setVisible] = useState(false);\n\n const message = text ?? t('Recording in progress...');\n\n useEffect(() => {\n if (isCallRecordingInProgress) {\n setVisible(true);\n } else {\n setVisible(false);\n }\n }, [isCallRecordingInProgress]);\n\n return (\n <Notification\n message={message}\n iconClassName=\"str-video__icon str-video__icon--recording-on\"\n isVisible={isVisible}\n placement=\"top-start\"\n close={() => setVisible(false)}\n >\n {children}\n </Notification>\n );\n};\n","import clsx from 'clsx';\n\nexport type LoadingIndicatorProps = {\n className?: string;\n /** String will be injected into class and later used to apply as a CSS mask-image to an element as data URL */\n type?: string;\n /** Text to be displayed under the loading indicator icon */\n text?: string;\n /** Tooltip to be displayed on hover */\n tooltip?: string;\n};\n\nexport const LoadingIndicator = ({\n className,\n type = 'spinner',\n text,\n tooltip,\n}: LoadingIndicatorProps) => {\n return (\n <div\n className={clsx('str-video__loading-indicator', className)}\n title={tooltip}\n >\n <div className={clsx('str-video__loading-indicator__icon', type)}></div>\n {text && <p className=\"str-video__loading-indicator-text\">{text}</p>}\n </div>\n );\n};\n","import { PropsWithChildren, useEffect, useRef } from 'react';\nimport clsx from 'clsx';\nimport { useFloatingUIPreset } from '../../hooks';\nimport { FloatingArrow, Placement, arrow } from '@floating-ui/react';\n\nexport type TooltipProps<T extends HTMLElement> = PropsWithChildren<{\n /** Reference element to which the tooltip should attach to */\n referenceElement: T | null;\n /** Additional class applied to the tooltip root element */\n tooltipClassName?: string;\n /** Popper's modifier (offset) property - [xAxis offset, yAxis offset], default [0, 10] */\n offset?: [number, number];\n /** Popper's placement property defining default position of the tooltip, default 'top' */\n tooltipPlacement?: Placement;\n /** Tells component whether to render its contents */\n visible?: boolean;\n}>;\n\nexport const Tooltip = <T extends HTMLElement>({\n children,\n referenceElement,\n tooltipClassName,\n tooltipPlacement = 'top',\n visible = false,\n}: TooltipProps<T>) => {\n const arrowRef = useRef<SVGSVGElement>(null);\n const { refs, x, y, strategy, context } = useFloatingUIPreset({\n placement: tooltipPlacement,\n strategy: 'absolute',\n middleware: [arrow({ element: arrowRef })],\n });\n\n useEffect(() => {\n refs.setReference(referenceElement);\n }, [referenceElement, refs]);\n\n if (!visible) return null;\n\n return (\n <div\n className={clsx('str-video__tooltip', tooltipClassName)}\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n }}\n >\n <FloatingArrow\n ref={arrowRef}\n context={context}\n fill=\"var(--str-video__tooltip--background-color)\"\n />\n {children}\n </div>\n );\n};\n","import { MouseEventHandler, useCallback, useState } from 'react';\n\nexport const useEnterLeaveHandlers = <T extends HTMLElement>({\n onMouseEnter,\n onMouseLeave,\n}: Partial<\n Record<'onMouseEnter' | 'onMouseLeave', MouseEventHandler<T>>\n> = {}) => {\n const [tooltipVisible, setTooltipVisible] = useState(false);\n\n const handleMouseEnter: MouseEventHandler<T> = useCallback(\n (e) => {\n setTooltipVisible(true);\n onMouseEnter?.(e);\n },\n [onMouseEnter],\n );\n\n const handleMouseLeave: MouseEventHandler<T> = useCallback(\n (e) => {\n setTooltipVisible(false);\n onMouseLeave?.(e);\n },\n [onMouseLeave],\n );\n\n return { handleMouseEnter, handleMouseLeave, tooltipVisible };\n};\n","import { ComponentProps, useState } from 'react';\nimport { Tooltip, TooltipProps } from './Tooltip';\nimport { useEnterLeaveHandlers } from './hooks';\n\ntype WithPopupProps = ComponentProps<'div'> &\n Omit<TooltipProps<HTMLDivElement>, 'referenceElement' | 'children'> & {\n tooltipDisabled?: boolean;\n };\n\n// todo: duplicate of CallParticipantList.tsx#MediaIndicator - refactor to a single component\nexport const WithTooltip = ({\n title,\n tooltipClassName,\n tooltipPlacement,\n tooltipDisabled,\n ...props\n}: WithPopupProps) => {\n const { handleMouseEnter, handleMouseLeave, tooltipVisible } =\n useEnterLeaveHandlers<HTMLDivElement>();\n const [tooltipAnchor, setTooltipAnchor] = useState<HTMLDivElement | null>(\n null,\n );\n const tooltipActuallyVisible =\n !tooltipDisabled && Boolean(title) && tooltipVisible;\n\n return (\n <>\n <Tooltip\n referenceElement={tooltipAnchor}\n visible={tooltipActuallyVisible}\n tooltipClassName={tooltipClassName}\n tooltipPlacement={tooltipPlacement}\n >\n {title || ''}\n </Tooltip>\n <div\n ref={setTooltipAnchor}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n />\n </>\n );\n};\n","import { forwardRef } from 'react';\n\nimport { OwnCapability } from '@stream-io/video-client';\nimport {\n Restricted,\n useI18n,\n useToggleCallRecording,\n} from '@stream-io/video-react-bindings';\nimport { CompositeButton } from '../Button/';\nimport { Icon } from '../Icon';\nimport {\n MenuToggle,\n MenuVisualType,\n ToggleMenuButtonProps,\n useMenuContext,\n} from '../Menu';\nimport { LoadingIndicator } from '../LoadingIndicator';\nimport { WithTooltip } from '../Tooltip';\n\nexport type RecordCallButtonProps = {\n caption?: string;\n};\n\nconst RecordEndConfirmation = () => {\n const { t } = useI18n();\n const { toggleCallRecording, isAwaitingResponse } = useToggleCallRecording();\n\n const { close } = useMenuContext();\n\n return (\n <div className=\"str-video__end-recording__confirmation\">\n <div className=\"str-video__end-recording__header\">\n <Icon icon=\"recording-on\" />\n <h2 className=\"str-video__end-recording__heading\">\n {t('End recording')}\n </h2>\n </div>\n <p className=\"str-video__end-recording__description\">\n {t('Are you sure you want end the recording?')}\n </p>\n <div className=\"str-video__end-recording__actions\">\n <CompositeButton variant=\"secondary\" onClick={close}>\n {t('Cancel')}\n </CompositeButton>\n <CompositeButton variant=\"primary\" onClick={toggleCallRecording}>\n {isAwaitingResponse ? <LoadingIndicator /> : t('End recording')}\n </CompositeButton>\n </div>\n </div>\n );\n};\n\nconst ToggleEndRecordingMenuButton = forwardRef<\n HTMLDivElement,\n ToggleMenuButtonProps\n>(function ToggleEndRecordingMenuButton(props, ref) {\n return (\n <CompositeButton\n ref={ref}\n active={true}\n variant=\"secondary\"\n data-testid=\"recording-stop-button\"\n >\n <Icon icon=\"recording-off\" />\n </CompositeButton>\n );\n});\n\nexport const RecordCallConfirmationButton = ({\n caption,\n}: {\n caption?: string;\n}) => {\n const { t } = useI18n();\n const { toggleCallRecording, isAwaitingResponse, isCallRecordingInProgress } =\n useToggleCallRecording();\n\n if (isCallRecordingInProgress) {\n return (\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <MenuToggle\n ToggleButton={ToggleEndRecordingMenuButton}\n visualType={MenuVisualType.PORTAL}\n >\n <RecordEndConfirmation />\n </MenuToggle>\n </Restricted>\n );\n }\n\n const title = isAwaitingResponse\n ? t('Waiting for recording to start...')\n : (caption ?? t('Record call'));\n\n return (\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <WithTooltip title={title}>\n <CompositeButton\n active={isCallRecordingInProgress}\n caption={caption}\n variant=\"secondary\"\n data-testid=\"recording-start-button\"\n onClick={isAwaitingResponse ? undefined : toggleCallRecording}\n >\n {isAwaitingResponse ? (\n <LoadingIndicator />\n ) : (\n <Icon icon=\"recording-off\" />\n )}\n </CompositeButton>\n </WithTooltip>\n </Restricted>\n );\n};\n\nexport const RecordCallButton = ({ caption }: RecordCallButtonProps) => {\n const { t } = useI18n();\n const { toggleCallRecording, isAwaitingResponse, isCallRecordingInProgress } =\n useToggleCallRecording();\n\n let title = caption ?? t('Record call');\n\n if (isAwaitingResponse) {\n title = isCallRecordingInProgress\n ? t('Waiting for recording to stop...')\n : t('Waiting for recording to start...');\n }\n\n return (\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <CompositeButton\n active={isCallRecordingInProgress}\n caption={caption}\n variant=\"secondary\"\n data-testid={\n isCallRecordingInProgress\n ? 'recording-stop-button'\n : 'recording-start-button'\n }\n title={title}\n onClick={isAwaitingResponse ? undefined : toggleCallRecording}\n >\n {isAwaitingResponse ? (\n <LoadingIndicator />\n ) : (\n <Icon\n icon={isCallRecordingInProgress ? 'recording-on' : 'recording-off'}\n />\n )}\n </CompositeButton>\n </Restricted>\n );\n};\n","import { useEffect } from 'react';\nimport { StreamVideoParticipant } from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type ReactionProps = {\n participant: StreamVideoParticipant;\n hideAfterTimeoutInMs?: number;\n emojiReactionMap?: Record<string, string>;\n};\n\nexport const defaultEmojiReactionMap: Record<string, string> = {\n ':like:': '👍',\n ':raise-hand:': '✋',\n ':fireworks:': '🎉',\n ':dislike:': '👎',\n ':heart:': '❤️',\n ':smile:': '😀',\n};\n\nexport const Reaction = ({\n participant: { reaction, sessionId },\n hideAfterTimeoutInMs = 5500,\n emojiReactionMap = defaultEmojiReactionMap,\n}: ReactionProps) => {\n const call = useCall();\n\n useEffect(() => {\n if (!call || !reaction) return;\n\n const timeoutId = setTimeout(() => {\n call.resetReaction(sessionId);\n }, hideAfterTimeoutInMs);\n\n return () => {\n clearTimeout(timeoutId);\n };\n }, [call, hideAfterTimeoutInMs, reaction, sessionId]);\n\n if (!reaction) return null;\n\n const { emoji_code: emojiCode } = reaction;\n\n return (\n <div className=\"str-video__reaction\">\n <span className=\"str-video__reaction__emoji\">\n {emojiCode && emojiReactionMap[emojiCode]}\n </span>\n </div>\n );\n};\n","import { forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport { OwnCapability, StreamReaction } from '@stream-io/video-client';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\n\nimport {\n MenuToggle,\n MenuVisualType,\n ToggleMenuButtonProps,\n useMenuContext,\n} from '../Menu';\nimport { CompositeButton } from '../Button';\nimport { defaultEmojiReactionMap } from '../Reaction';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\n\nexport const defaultReactions: StreamReaction[] = [\n {\n type: 'reaction',\n emoji_code: ':like:',\n },\n {\n // TODO OL: use `prompt` type?\n type: 'raised-hand',\n emoji_code: ':raise-hand:',\n },\n {\n type: 'reaction',\n emoji_code: ':fireworks:',\n },\n {\n type: 'reaction',\n emoji_code: ':dislike:',\n },\n {\n type: 'reaction',\n emoji_code: ':heart:',\n },\n {\n type: 'reaction',\n emoji_code: ':smile:',\n },\n];\n\nexport interface ReactionsButtonProps {\n reactions?: StreamReaction[];\n}\n\nexport const ReactionsButton = ({\n reactions = defaultReactions,\n}: ReactionsButtonProps) => {\n return (\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <MenuToggle\n placement=\"top\"\n ToggleButton={ToggleReactionsMenuButton}\n visualType={MenuVisualType.MENU}\n >\n <DefaultReactionsMenu reactions={reactions} />\n </MenuToggle>\n </Restricted>\n );\n};\n\nconst ToggleReactionsMenuButton = forwardRef<\n HTMLDivElement,\n ToggleMenuButtonProps\n>(function ToggleReactionsMenuButton({ menuShown }, ref) {\n const { t } = useI18n();\n return (\n <WithTooltip title={t('Reactions')} tooltipDisabled={menuShown}>\n <CompositeButton ref={ref} active={menuShown} variant=\"primary\">\n <Icon icon=\"reactions\" />\n </CompositeButton>\n </WithTooltip>\n );\n});\n\nexport interface DefaultReactionsMenuProps {\n reactions: StreamReaction[];\n layout?: 'horizontal' | 'vertical';\n}\n\nexport const DefaultReactionsMenu = ({\n reactions,\n layout = 'horizontal',\n}: DefaultReactionsMenuProps) => {\n const call = useCall();\n const { close } = useMenuContext();\n return (\n <div\n className={clsx('str-video__reactions-menu', {\n 'str-video__reactions-menu--horizontal': layout === 'horizontal',\n 'str-video__reactions-menu--vertical': layout === 'vertical',\n })}\n >\n {reactions.map((reaction) => (\n <button\n key={reaction.emoji_code}\n type=\"button\"\n className=\"str-video__reactions-menu__button\"\n onClick={() => {\n call?.sendReaction(reaction);\n close?.();\n }}\n >\n {reaction.emoji_code && defaultEmojiReactionMap[reaction.emoji_code]}\n </button>\n ))}\n </div>\n );\n};\n","export type PropsWithErrorHandler<T = unknown> = T & {\n /**\n * Will be called if the call control action failed with an error (e.g. user didn't grant a\n * browser permission to enable a media device). If no callback is provided, just logs the error.\n * @param error Exception which caused call control action to fail\n */\n onError?: (error: unknown) => void;\n};\n\n/**\n * Wraps an event handler, silencing and logging exceptions (excluding the NotAllowedError\n * DOMException, which is a normal situation handled by the SDK)\n *\n * @param props component props, including the onError callback\n * @param handler event handler to wrap\n */\nexport const createCallControlHandler = (\n props: PropsWithErrorHandler,\n handler: () => Promise<void>,\n): (() => Promise<void>) => {\n return async () => {\n try {\n await handler();\n } catch (error) {\n if (props.onError) {\n props.onError(error);\n return;\n }\n\n if (!isNotAllowedError(error)) {\n console.error('Call control handler failed', error);\n }\n }\n };\n};\n\nfunction isNotAllowedError(error: unknown): error is DOMException {\n return error instanceof DOMException && error.name === 'NotAllowedError';\n}\n","import { OwnCapability } from '@stream-io/video-client';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n UseInputMediaDeviceOptions,\n} from '@stream-io/video-react-bindings';\nimport { CompositeButton } from '../Button/';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\nimport {\n PropsWithErrorHandler,\n createCallControlHandler,\n} from '../../utilities/callControlHandler';\n\nexport type ScreenShareButtonProps = PropsWithErrorHandler<\n {\n caption?: string;\n } & UseInputMediaDeviceOptions\n>;\n\nexport const ScreenShareButton = (props: ScreenShareButtonProps) => {\n const { t } = useI18n();\n const { caption, optimisticUpdates } = props;\n\n const { useHasOngoingScreenShare, useScreenShareState, useCallSettings } =\n useCallStateHooks();\n const isSomeoneScreenSharing = useHasOngoingScreenShare();\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(OwnCapability.SCREENSHARE);\n\n const callSettings = useCallSettings();\n const isScreenSharingAllowed = callSettings?.screensharing.enabled;\n\n const { screenShare, optionsAwareIsMute, isTogglePending } =\n useScreenShareState({\n optimisticUpdates,\n });\n const amIScreenSharing = !optionsAwareIsMute;\n const disableScreenShareButton =\n (!amIScreenSharing &&\n (isSomeoneScreenSharing || isScreenSharingAllowed === false)) ||\n (!optimisticUpdates && isTogglePending);\n const handleClick = createCallControlHandler(props, async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await screenShare.toggle();\n }\n });\n\n return (\n <Restricted requiredGrants={[OwnCapability.SCREENSHARE]}>\n <PermissionNotification\n permission={OwnCapability.SCREENSHARE}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now share your screen.')}\n messageAwaitingApproval={t('Awaiting for an approval to share screen.')}\n messageRevoked={t('You can no longer share your screen.')}\n >\n <WithTooltip title={caption ?? t('Share screen')}>\n <CompositeButton\n active={isSomeoneScreenSharing || amIScreenSharing}\n caption={caption}\n variant=\"primary\"\n data-testid={\n isSomeoneScreenSharing\n ? 'screen-share-stop-button'\n : 'screen-share-start-button'\n }\n disabled={disableScreenShareButton}\n onClick={handleClick}\n >\n <Icon\n icon={\n isSomeoneScreenSharing ? 'screen-share-on' : 'screen-share-off'\n }\n />\n </CompositeButton>\n </WithTooltip>\n </PermissionNotification>\n </Restricted>\n );\n};\n","import { useEffect, useState } from 'react';\nimport { createSoundDetector } from '@stream-io/video-client';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { Icon } from '../Icon';\n\nexport const AudioVolumeIndicator = () => {\n const { useMicrophoneState } = useCallStateHooks();\n const { isEnabled, mediaStream } = useMicrophoneState();\n const [audioLevel, setAudioLevel] = useState(0);\n\n useEffect(() => {\n if (!isEnabled || !mediaStream) return;\n const disposeSoundDetector = createSoundDetector(\n mediaStream,\n ({ audioLevel: al }) => setAudioLevel(al),\n { detectionFrequencyInMs: 80, destroyStreamOnStop: false },\n );\n return () => {\n disposeSoundDetector().catch(console.error);\n };\n }, [isEnabled, mediaStream]);\n\n return (\n <div className=\"str-video__audio-volume-indicator\">\n <Icon icon={isEnabled ? 'mic' : 'mic-off'} />\n <div className=\"str-video__audio-volume-indicator__bar\">\n <div\n className=\"str-video__audio-volume-indicator__bar-value\"\n style={{ transform: `scaleX(${audioLevel / 100})` }}\n />\n </div>\n </div>\n );\n};\n","import {\n createContext,\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport clsx from 'clsx';\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n useClick,\n useDismiss,\n useFloating,\n useInteractions,\n useListItem,\n useListNavigation,\n useRole,\n useTypeahead,\n} from '@floating-ui/react';\n\nimport { Icon } from '../Icon';\n\ninterface SelectContextValue {\n activeIndex: number | null;\n selectedIndex: number | null;\n getItemProps: ReturnType<typeof useInteractions>['getItemProps'];\n handleSelect: (index: number | null) => void;\n}\n\nconst SelectContext = createContext<SelectContextValue>(\n {} as SelectContextValue,\n);\n\nconst Select = (props: {\n children: ReactNode;\n icon?: string;\n defaultSelectedLabel: string;\n defaultSelectedIndex: number;\n handleSelect: (index: number) => void;\n}) => {\n const {\n children,\n icon,\n defaultSelectedLabel,\n defaultSelectedIndex,\n handleSelect: handleSelectProp,\n } = props;\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [selectedIndex, setSelectedIndex] = useState<number | null>(\n defaultSelectedIndex,\n );\n const [selectedLabel, setSelectedLabel] = useState<string | null>(\n defaultSelectedLabel,\n );\n\n const { refs, context } = useFloating({\n placement: 'bottom-start',\n open: isOpen,\n onOpenChange: setIsOpen,\n whileElementsMounted: autoUpdate,\n middleware: [flip()],\n });\n\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n const labelsRef = useRef<Array<string | null>>([]);\n\n const handleSelect = useCallback(\n (index: number | null) => {\n setSelectedIndex(index);\n handleSelectProp(index || 0);\n setIsOpen(false);\n if (index !== null) {\n setSelectedLabel(labelsRef.current[index]);\n }\n },\n [handleSelectProp],\n );\n\n const handleTypeaheadMatch = (index: number | null) => {\n if (isOpen) {\n setActiveIndex(index);\n } else {\n handleSelect(index);\n }\n };\n\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n selectedIndex,\n onNavigate: setActiveIndex,\n });\n const typeahead = useTypeahead(context, {\n listRef: labelsRef,\n activeIndex,\n selectedIndex,\n onMatch: handleTypeaheadMatch,\n });\n const click = useClick(context);\n const dismiss = useDismiss(context);\n const role = useRole(context, { role: 'listbox' });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [listNav, typeahead, click, dismiss, role],\n );\n\n const selectContext = useMemo(\n () => ({\n activeIndex,\n selectedIndex,\n getItemProps,\n handleSelect,\n }),\n [activeIndex, selectedIndex, getItemProps, handleSelect],\n );\n\n return (\n <div className=\"str-video__dropdown\">\n <div\n className=\"str-video__dropdown-selected\"\n ref={refs.setReference}\n tabIndex={0}\n {...getReferenceProps()}\n >\n <label className=\"str-video__dropdown-selected__label\">\n {icon && (\n <Icon className=\"str-video__dropdown-selected__icon\" icon={icon} />\n )}\n {selectedLabel}\n </label>\n <Icon\n className=\"str-video__dropdown-selected__chevron\"\n icon={isOpen ? 'chevron-up' : 'chevron-down'}\n />\n </div>\n <SelectContext.Provider value={selectContext}>\n {isOpen && (\n <FloatingFocusManager context={context} modal={false}>\n <div\n className=\"str-video__dropdown-list\"\n ref={refs.setFloating}\n {...getFloatingProps()}\n >\n <FloatingList elementsRef={elementsRef} labelsRef={labelsRef}>\n {children}\n </FloatingList>\n </div>\n </FloatingFocusManager>\n )}\n </SelectContext.Provider>\n </div>\n );\n};\n\nexport type DropDownSelectOptionProps = {\n label: string;\n selected?: boolean;\n icon?: string;\n};\n\nexport const DropDownSelectOption = (props: DropDownSelectOptionProps) => {\n const { selected, label, icon } = props;\n const { getItemProps, handleSelect } = useContext(SelectContext);\n const { ref, index } = useListItem();\n return (\n <div\n className={clsx('str-video__dropdown-option', {\n 'str-video__dropdown-option--selected': selected,\n })}\n ref={ref}\n {...getItemProps({\n onClick: () => handleSelect(index),\n })}\n >\n {icon && <Icon className=\"str-video__dropdown-icon\" icon={icon} />}\n <span className=\"str-video__dropdown-label\">{label}</span>\n </div>\n );\n};\n\nexport const DropDownSelect = (props: {\n icon?: string;\n defaultSelectedLabel: string;\n defaultSelectedIndex: number;\n handleSelect: (index: number) => void;\n children:\n | ReactElement<DropDownSelectOptionProps>\n | ReactElement<DropDownSelectOptionProps>[];\n}) => {\n const {\n children,\n icon,\n handleSelect,\n defaultSelectedLabel,\n defaultSelectedIndex,\n } = props;\n return (\n <Select\n icon={icon}\n handleSelect={handleSelect}\n defaultSelectedIndex={defaultSelectedIndex}\n defaultSelectedLabel={defaultSelectedLabel}\n >\n {children}\n </Select>\n );\n};\n","import clsx from 'clsx';\nimport { ChangeEventHandler, PropsWithChildren, useCallback } from 'react';\n\nimport { useDeviceList } from '../../hooks';\nimport { DropDownSelect, DropDownSelectOption } from '../DropdownSelect';\nimport { useMenuContext } from '../Menu';\n\ntype DeviceSelectorOptionProps = {\n id: string;\n label: string;\n name?: string;\n selected?: boolean;\n value: string;\n disabled?: boolean;\n defaultChecked?: boolean;\n onChange?: ChangeEventHandler<HTMLInputElement>;\n};\n\nconst DeviceSelectorOption = ({\n disabled,\n id,\n label,\n onChange,\n name,\n selected,\n defaultChecked,\n value,\n}: DeviceSelectorOptionProps) => {\n return (\n <label\n className={clsx('str-video__device-settings__option', {\n 'str-video__device-settings__option--selected': selected,\n 'str-video__device-settings__option--disabled': disabled,\n })}\n htmlFor={id}\n >\n <input\n type=\"radio\"\n name={name}\n onChange={onChange}\n value={value}\n id={id}\n checked={selected}\n defaultChecked={defaultChecked}\n disabled={disabled}\n />\n {label}\n </label>\n );\n};\n\nexport type DeviceSelectorType = 'audioinput' | 'audiooutput' | 'videoinput';\n\nconst DeviceSelectorList = (\n props: PropsWithChildren<{\n devices: MediaDeviceInfo[];\n type: DeviceSelectorType;\n selectedDeviceId?: string;\n title?: string;\n onChange?: (deviceId: string) => void;\n }>,\n) => {\n const {\n devices = [],\n selectedDeviceId,\n title,\n type,\n onChange,\n children,\n } = props;\n const { close } = useMenuContext();\n const { deviceList } = useDeviceList(devices, selectedDeviceId);\n\n return (\n <div className=\"str-video__device-settings__device-kind\">\n {title && (\n <div className=\"str-video__device-settings__device-selector-title\">\n {title}\n </div>\n )}\n {deviceList.map((device) => {\n return (\n <DeviceSelectorOption\n id={`${type}--${device.deviceId}`}\n value={device.deviceId}\n label={device.label}\n key={device.deviceId}\n onChange={(e) => {\n const deviceId = e.target.value;\n if (deviceId !== 'default') {\n onChange?.(deviceId);\n }\n close?.();\n }}\n name={type}\n selected={device.isSelected}\n />\n );\n })}\n {children}\n </div>\n );\n};\n\nconst DeviceSelectorDropdown = (props: {\n devices: MediaDeviceInfo[];\n selectedDeviceId?: string;\n title?: string;\n onChange?: (deviceId: string) => void;\n icon: string;\n}) => {\n const { devices = [], selectedDeviceId, title, onChange, icon } = props;\n const { deviceList, selectedDeviceInfo, selectedIndex } = useDeviceList(\n devices,\n selectedDeviceId,\n );\n\n const handleSelect = useCallback(\n (index: number) => {\n const deviceId = deviceList[index].deviceId;\n if (deviceId !== 'default') {\n onChange?.(deviceId);\n }\n },\n [deviceList, onChange],\n );\n\n return (\n <div className=\"str-video__device-settings__device-kind\">\n <div className=\"str-video__device-settings__device-selector-title\">\n {title}\n </div>\n <DropDownSelect\n icon={icon}\n defaultSelectedIndex={selectedIndex}\n defaultSelectedLabel={selectedDeviceInfo.label}\n handleSelect={handleSelect}\n >\n {deviceList.map((device) => (\n <DropDownSelectOption\n key={device.deviceId}\n icon={icon}\n label={device.label}\n selected={device.isSelected}\n />\n ))}\n </DropDownSelect>\n </div>\n );\n};\n\nexport const DeviceSelector = (\n props: PropsWithChildren<{\n devices: MediaDeviceInfo[];\n icon: string;\n type: DeviceSelectorType;\n selectedDeviceId?: string;\n title?: string;\n onChange?: (deviceId: string) => void;\n visualType?: 'list' | 'dropdown';\n }>,\n) => {\n const { visualType = 'list', icon, ...rest } = props;\n\n if (visualType === 'list') {\n return <DeviceSelectorList {...rest} />;\n }\n return <DeviceSelectorDropdown {...rest} icon={icon} />;\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { CompositeButton } from '../Button';\nimport { Icon } from '../Icon';\n\n/**\n * SpeakerTest component that plays a test audio through the selected speaker.\n * This allows users to verify their audio output device is working correctly.\n */\nexport const SpeakerTest = (props: { audioUrl?: string }) => {\n const { useSpeakerState } = useCallStateHooks();\n const { selectedDevice } = useSpeakerState();\n const audioElementRef = useRef<HTMLAudioElement | null>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const { t } = useI18n();\n\n const {\n audioUrl = `https://unpkg.com/${process.env.PKG_NAME}@${process.env.PKG_VERSION}/assets/piano.mp3`,\n } = props;\n\n // Update audio output device when selection changes\n useEffect(() => {\n const audio = audioElementRef.current;\n if (!audio || !selectedDevice) return;\n\n // Set the sinkId to route audio to the selected speaker\n if ('setSinkId' in audio) {\n audio.setSinkId(selectedDevice).catch((err) => {\n console.error('Failed to set audio output device:', err);\n });\n }\n }, [selectedDevice]);\n\n const handleStartTest = useCallback(async () => {\n const audio = audioElementRef.current;\n if (!audio) return;\n\n audio.src = audioUrl;\n\n try {\n if (isPlaying) {\n audio.pause();\n audio.currentTime = 0;\n setIsPlaying(false);\n } else {\n await audio.play();\n setIsPlaying(true);\n }\n } catch (err) {\n console.error('Failed to play test audio:', err);\n setIsPlaying(false);\n }\n }, [isPlaying, audioUrl]);\n\n const handleAudioEnded = useCallback(() => setIsPlaying(false), []);\n return (\n <div className=\"str-video__speaker-test\">\n <audio\n ref={audioElementRef}\n onEnded={handleAudioEnded}\n onPause={handleAudioEnded}\n />\n <CompositeButton\n className=\"str-video__speaker-test__button\"\n onClick={handleStartTest}\n type=\"button\"\n >\n <div className=\"str-video__speaker-test__button-content\">\n <Icon icon=\"speaker\" />\n {isPlaying ? t('Stop test') : t('Test speaker')}\n </div>\n </CompositeButton>\n </div>\n );\n};\n","import { useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { DeviceSelector } from './DeviceSelector';\nimport { AudioVolumeIndicator } from './AudioVolumeIndicator';\nimport { SpeakerTest } from './SpeakerTest';\n\nexport type DeviceSelectorAudioInputProps = {\n title?: string;\n visualType?: 'list' | 'dropdown';\n volumeIndicatorVisible?: boolean;\n};\n\nexport const DeviceSelectorAudioInput = ({\n title,\n visualType,\n volumeIndicatorVisible = true,\n}: DeviceSelectorAudioInputProps) => {\n const { useMicrophoneState } = useCallStateHooks();\n const { microphone, selectedDevice, devices } = useMicrophoneState();\n\n return (\n <DeviceSelector\n devices={devices || []}\n selectedDeviceId={selectedDevice}\n type=\"audioinput\"\n onChange={async (deviceId) => {\n await microphone.select(deviceId);\n }}\n title={title}\n visualType={visualType}\n icon=\"mic\"\n >\n {volumeIndicatorVisible && (\n <>\n <hr className=\"str-video__device-settings__separator\" />\n <AudioVolumeIndicator />\n </>\n )}\n </DeviceSelector>\n );\n};\n\nexport type DeviceSelectorAudioOutputProps = {\n title?: string;\n visualType?: 'list' | 'dropdown';\n speakerTestVisible?: boolean;\n speakerTestAudioUrl?: string;\n};\n\nexport const DeviceSelectorAudioOutput = ({\n title,\n visualType,\n speakerTestVisible = true,\n speakerTestAudioUrl,\n}: DeviceSelectorAudioOutputProps) => {\n const { useSpeakerState } = useCallStateHooks();\n const { speaker, selectedDevice, devices, isDeviceSelectionSupported } =\n useSpeakerState();\n\n if (!isDeviceSelectionSupported) return null;\n\n return (\n <DeviceSelector\n devices={devices}\n type=\"audiooutput\"\n selectedDeviceId={selectedDevice}\n onChange={(deviceId) => {\n speaker.select(deviceId);\n }}\n title={title}\n visualType={visualType}\n icon=\"speaker\"\n >\n {speakerTestVisible && (\n <>\n <hr className=\"str-video__device-settings__separator\" />\n <SpeakerTest audioUrl={speakerTestAudioUrl} />\n </>\n )}\n </DeviceSelector>\n );\n};\n","import { DeviceSelector } from './DeviceSelector';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport type DeviceSelectorVideoProps = {\n title?: string;\n visualType?: 'list' | 'dropdown';\n};\n\nexport const DeviceSelectorVideo = ({\n title,\n visualType,\n}: DeviceSelectorVideoProps) => {\n const { useCameraState } = useCallStateHooks();\n const { camera, devices, selectedDevice } = useCameraState();\n\n return (\n <DeviceSelector\n devices={devices || []}\n type=\"videoinput\"\n selectedDeviceId={selectedDevice}\n onChange={async (deviceId) => {\n await camera.select(deviceId);\n }}\n title={title}\n visualType={visualType}\n icon=\"camera\"\n />\n );\n};\n","import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\nimport { MenuToggle, MenuVisualType, ToggleMenuButtonProps } from '../Menu';\nimport {\n DeviceSelectorAudioInput,\n DeviceSelectorAudioOutput,\n} from './DeviceSelectorAudio';\nimport { DeviceSelectorVideo } from './DeviceSelectorVideo';\nimport { IconButton } from '../Button';\n\nexport type DeviceSettingsProps = {\n visualType?: MenuVisualType;\n};\n\nexport const DeviceSettings = ({\n visualType = MenuVisualType.MENU,\n}: DeviceSettingsProps) => {\n return (\n <MenuToggle\n placement=\"bottom-end\"\n ToggleButton={ToggleDeviceSettingsMenuButton}\n visualType={visualType}\n >\n <Menu />\n </MenuToggle>\n );\n};\n\nconst Menu = () => {\n const { t } = useI18n();\n return (\n <div className=\"str-video__device-settings\">\n <DeviceSelectorVideo title={t('Select a Camera')} />\n <DeviceSelectorAudioInput title={t('Select a Mic')} />\n <DeviceSelectorAudioOutput title={t('Select Speakers')} />\n </div>\n );\n};\n\nconst ToggleDeviceSettingsMenuButton = forwardRef<\n HTMLButtonElement,\n ToggleMenuButtonProps\n>(function ToggleDeviceSettingsMenuButton({ menuShown }, ref) {\n const { t } = useI18n();\n return (\n <IconButton\n className={clsx('str-video__device-settings__button', {\n 'str-video__device-settings__button--active': menuShown,\n })}\n title={t('Toggle device menu')}\n icon=\"device-settings\"\n ref={ref}\n />\n );\n});\n","import { OwnCapability } from '@stream-io/video-client';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n type UseInputMediaDeviceOptions,\n} from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\nimport { CompositeButton, IconButtonWithMenuProps } from '../Button';\nimport { DeviceSelectorAudioInput } from '../DeviceSettings';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\nimport { useState } from 'react';\nimport {\n createCallControlHandler,\n PropsWithErrorHandler,\n} from '../../utilities/callControlHandler';\n\nexport type ToggleAudioPreviewButtonProps = PropsWithErrorHandler<\n Pick<\n IconButtonWithMenuProps,\n 'caption' | 'Menu' | 'menuPlacement' | 'onMenuToggle'\n > &\n UseInputMediaDeviceOptions\n>;\n\nexport const ToggleAudioPreviewButton = (\n props: ToggleAudioPreviewButtonProps,\n) => {\n const {\n caption,\n Menu = DeviceSelectorAudioInput,\n menuPlacement = 'top',\n onMenuToggle,\n optimisticUpdates,\n ...restCompositeButtonProps\n } = props;\n const { t } = useI18n();\n const { useMicrophoneState } = useCallStateHooks();\n const {\n microphone,\n hasBrowserPermission,\n isPromptingPermission,\n optionsAwareIsMute,\n isTogglePending,\n } = useMicrophoneState({ optimisticUpdates });\n const [tooltipDisabled, setTooltipDisabled] = useState(false);\n const handleClick = createCallControlHandler(props, () =>\n microphone.toggle(),\n );\n\n return (\n <WithTooltip\n title={\n !hasBrowserPermission\n ? t('Check your browser audio permissions')\n : (caption ?? t('Mic'))\n }\n tooltipDisabled={tooltipDisabled}\n >\n <CompositeButton\n active={optionsAwareIsMute}\n caption={caption}\n className={clsx(\n !hasBrowserPermission && 'str-video__device-unavailable',\n )}\n variant=\"secondary\"\n disabled={\n !hasBrowserPermission || (!optimisticUpdates && isTogglePending)\n }\n data-testid={\n optionsAwareIsMute\n ? 'preview-audio-unmute-button'\n : 'preview-audio-mute-button'\n }\n onClick={handleClick}\n Menu={Menu}\n menuPlacement={menuPlacement}\n {...restCompositeButtonProps}\n onMenuToggle={(shown) => {\n setTooltipDisabled(shown);\n onMenuToggle?.(shown);\n }}\n >\n <Icon icon={!optionsAwareIsMute ? 'mic' : 'mic-off'} />\n {!hasBrowserPermission && (\n <span\n className=\"str-video__no-media-permission\"\n title={t('Check your browser audio permissions')}\n children=\"!\"\n />\n )}\n {isPromptingPermission && (\n <span\n className=\"str-video__pending-permission\"\n title={t('Waiting for permission')}\n children=\"?\"\n />\n )}\n </CompositeButton>\n </WithTooltip>\n );\n};\n\nexport type ToggleAudioPublishingButtonProps = PropsWithErrorHandler<\n Pick<\n IconButtonWithMenuProps,\n 'caption' | 'Menu' | 'menuPlacement' | 'onMenuToggle'\n > &\n UseInputMediaDeviceOptions\n>;\n\nexport const ToggleAudioPublishingButton = (\n props: ToggleAudioPublishingButtonProps,\n) => {\n const { t } = useI18n();\n const {\n caption,\n Menu = <DeviceSelectorAudioInput visualType=\"list\" />,\n menuPlacement = 'top',\n onMenuToggle,\n optimisticUpdates,\n ...restCompositeButtonProps\n } = props;\n\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(OwnCapability.SEND_AUDIO);\n\n const { useMicrophoneState } = useCallStateHooks();\n const {\n microphone,\n hasBrowserPermission,\n isPromptingPermission,\n isTogglePending,\n optionsAwareIsMute,\n } = useMicrophoneState({ optimisticUpdates });\n\n const [tooltipDisabled, setTooltipDisabled] = useState(false);\n const handleClick = createCallControlHandler(props, async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await microphone.toggle();\n }\n });\n\n return (\n <Restricted requiredGrants={[OwnCapability.SEND_AUDIO]}>\n <PermissionNotification\n permission={OwnCapability.SEND_AUDIO}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now speak.')}\n messageAwaitingApproval={t('Awaiting for an approval to speak.')}\n messageRevoked={t('You can no longer speak.')}\n >\n <WithTooltip\n title={\n !hasPermission\n ? t('You have no permission to share your audio')\n : !hasBrowserPermission\n ? t('Check your browser mic permissions')\n : (caption ?? t('Mic'))\n }\n tooltipDisabled={tooltipDisabled}\n >\n <CompositeButton\n active={optionsAwareIsMute}\n caption={caption}\n variant=\"secondary\"\n disabled={\n !hasBrowserPermission ||\n !hasPermission ||\n // disable button while the toggle action is pending when not using optimistic updates\n (!optimisticUpdates && isTogglePending)\n }\n data-testid={\n optionsAwareIsMute ? 'audio-unmute-button' : 'audio-mute-button'\n }\n onClick={handleClick}\n Menu={Menu}\n menuPlacement={menuPlacement}\n menuOffset={16}\n {...restCompositeButtonProps}\n onMenuToggle={(shown) => {\n setTooltipDisabled(shown);\n onMenuToggle?.(shown);\n }}\n >\n <Icon icon={optionsAwareIsMute ? 'mic-off' : 'mic'} />\n {(!hasBrowserPermission || !hasPermission) && (\n <span className=\"str-video__no-media-permission\">!</span>\n )}\n {isPromptingPermission && (\n <span\n className=\"str-video__pending-permission\"\n title={t('Waiting for permission')}\n >\n ?\n </span>\n )}\n </CompositeButton>\n </WithTooltip>\n </PermissionNotification>\n </Restricted>\n );\n};\n","import {\n Restricted,\n useCallStateHooks,\n useI18n,\n UseInputMediaDeviceOptions,\n} from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\nimport { OwnCapability } from '@stream-io/video-client';\nimport { CompositeButton, IconButtonWithMenuProps } from '../Button/';\nimport { DeviceSelectorVideo } from '../DeviceSettings';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\nimport { useState } from 'react';\nimport {\n createCallControlHandler,\n PropsWithErrorHandler,\n} from '../../utilities/callControlHandler';\n\nexport type ToggleVideoPreviewButtonProps = PropsWithErrorHandler<\n Pick<\n IconButtonWithMenuProps,\n 'caption' | 'Menu' | 'menuPlacement' | 'onMenuToggle'\n > &\n UseInputMediaDeviceOptions\n>;\n\nexport const ToggleVideoPreviewButton = (\n props: ToggleVideoPreviewButtonProps,\n) => {\n const {\n caption,\n Menu = DeviceSelectorVideo,\n menuPlacement = 'top',\n onMenuToggle,\n optimisticUpdates,\n ...restCompositeButtonProps\n } = props;\n const { t } = useI18n();\n const { useCameraState } = useCallStateHooks();\n const {\n camera,\n hasBrowserPermission,\n isPromptingPermission,\n isTogglePending,\n optionsAwareIsMute,\n } = useCameraState({ optimisticUpdates });\n const [tooltipDisabled, setTooltipDisabled] = useState(false);\n const handleClick = createCallControlHandler(props, () => camera.toggle());\n\n return (\n <WithTooltip\n title={\n !hasBrowserPermission\n ? t('Check your browser video permissions')\n : (caption ?? t('Video'))\n }\n tooltipDisabled={tooltipDisabled}\n >\n <CompositeButton\n active={optionsAwareIsMute}\n caption={caption}\n className={clsx(\n !hasBrowserPermission && 'str-video__device-unavailable',\n )}\n variant=\"secondary\"\n data-testid={\n optionsAwareIsMute\n ? 'preview-video-unmute-button'\n : 'preview-video-mute-button'\n }\n onClick={handleClick}\n disabled={\n !hasBrowserPermission || (!optimisticUpdates && isTogglePending)\n }\n Menu={Menu}\n menuPlacement={menuPlacement}\n {...restCompositeButtonProps}\n onMenuToggle={(shown) => {\n setTooltipDisabled(shown);\n onMenuToggle?.(shown);\n }}\n >\n <Icon icon={!optionsAwareIsMute ? 'camera' : 'camera-off'} />\n {!hasBrowserPermission && (\n <span\n className=\"str-video__no-media-permission\"\n title={t('Check your browser video permissions')}\n children=\"!\"\n />\n )}\n {isPromptingPermission && (\n <span\n className=\"str-video__pending-permission\"\n title={t('Waiting for permission')}\n children=\"?\"\n />\n )}\n </CompositeButton>\n </WithTooltip>\n );\n};\n\ntype ToggleVideoPublishingButtonProps = PropsWithErrorHandler<\n Pick<\n IconButtonWithMenuProps,\n 'caption' | 'Menu' | 'menuPlacement' | 'onMenuToggle'\n > &\n UseInputMediaDeviceOptions\n>;\n\nexport const ToggleVideoPublishingButton = (\n props: ToggleVideoPublishingButtonProps,\n) => {\n const { t } = useI18n();\n const {\n caption,\n Menu = <DeviceSelectorVideo visualType=\"list\" />,\n menuPlacement = 'top',\n onMenuToggle,\n optimisticUpdates,\n ...restCompositeButtonProps\n } = props;\n\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(OwnCapability.SEND_VIDEO);\n\n const { useCameraState, useCallSettings } = useCallStateHooks();\n const {\n camera,\n optionsAwareIsMute,\n hasBrowserPermission,\n isPromptingPermission,\n isTogglePending,\n } = useCameraState({ optimisticUpdates });\n const callSettings = useCallSettings();\n const isPublishingVideoAllowed = callSettings?.video.enabled;\n const [tooltipDisabled, setTooltipDisabled] = useState(false);\n const handleClick = createCallControlHandler(props, async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await camera.toggle();\n }\n });\n\n return (\n <Restricted requiredGrants={[OwnCapability.SEND_VIDEO]}>\n <PermissionNotification\n permission={OwnCapability.SEND_VIDEO}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now share your video.')}\n messageAwaitingApproval={t(\n 'Awaiting for an approval to share your video.',\n )}\n messageRevoked={t('You can no longer share your video.')}\n >\n <WithTooltip\n title={\n !hasPermission\n ? t('You have no permission to share your video')\n : !hasBrowserPermission\n ? t('Check your browser video permissions')\n : !isPublishingVideoAllowed\n ? t('Video publishing is disabled by the system')\n : caption || t('Video')\n }\n tooltipDisabled={tooltipDisabled}\n >\n <CompositeButton\n active={optionsAwareIsMute}\n caption={caption}\n variant=\"secondary\"\n disabled={\n !hasBrowserPermission ||\n !hasPermission ||\n !isPublishingVideoAllowed ||\n (!optimisticUpdates && isTogglePending)\n }\n data-testid={\n optionsAwareIsMute ? 'video-unmute-button' : 'video-mute-button'\n }\n onClick={handleClick}\n Menu={Menu}\n menuPlacement={menuPlacement}\n menuOffset={16}\n {...restCompositeButtonProps}\n onMenuToggle={(shown) => {\n setTooltipDisabled(shown);\n onMenuToggle?.(shown);\n }}\n >\n <Icon icon={optionsAwareIsMute ? 'camera-off' : 'camera'} />\n {(!hasBrowserPermission ||\n !hasPermission ||\n !isPublishingVideoAllowed) && (\n <span className=\"str-video__no-media-permission\">!</span>\n )}\n {isPromptingPermission && (\n <span\n className=\"str-video__pending-permission\"\n title={t('Waiting for permission')}\n >\n ?\n </span>\n )}\n </CompositeButton>\n </WithTooltip>\n </PermissionNotification>\n </Restricted>\n );\n};\n","import { forwardRef, MouseEventHandler, useCallback } from 'react';\nimport { OwnCapability } from '@stream-io/video-client';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\n\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\n\nimport { IconButton } from '../Button';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\n\nconst EndCallMenu = (props: {\n onLeave: MouseEventHandler<HTMLButtonElement>;\n onEnd: MouseEventHandler<HTMLButtonElement>;\n}) => {\n const { onLeave, onEnd } = props;\n const { t } = useI18n();\n return (\n <div className=\"str-video__end-call__confirmation\">\n <button\n className=\"str-video__button str-video__end-call__leave\"\n type=\"button\"\n data-testid=\"leave-call-button\"\n onClick={onLeave}\n >\n <Icon\n className=\"str-video__button__icon str-video__end-call__leave-icon\"\n icon=\"logout\"\n />\n {t('Leave call')}\n </button>\n <Restricted requiredGrants={[OwnCapability.END_CALL]}>\n <button\n className=\"str-video__button str-video__end-call__end\"\n type=\"button\"\n data-testid=\"end-call-for-all-button\"\n onClick={onEnd}\n >\n <Icon\n className=\"str-video__button__icon str-video__end-call__end-icon\"\n icon=\"call-end\"\n />\n {t('End call for all')}\n </button>\n </Restricted>\n </div>\n );\n};\n\nconst CancelCallToggleMenuButton = forwardRef<\n HTMLButtonElement,\n ToggleMenuButtonProps\n>(function CancelCallToggleMenuButton({ menuShown }, ref) {\n const { t } = useI18n();\n return (\n <WithTooltip title={t('Leave call')} tooltipDisabled={menuShown}>\n <IconButton\n icon={menuShown ? 'close' : 'call-end'}\n variant={menuShown ? 'active' : 'danger'}\n data-testid=\"leave-call-button\"\n ref={ref}\n />\n </WithTooltip>\n );\n});\n\nexport type CancelCallButtonProps = {\n disabled?: boolean;\n caption?: string;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onLeave?: () => void;\n};\n\nexport const CancelCallConfirmButton = ({\n onClick,\n onLeave,\n}: CancelCallButtonProps) => {\n const call = useCall();\n\n const handleLeave: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n await call.leave();\n onLeave?.();\n }\n },\n [onClick, onLeave, call],\n );\n\n const handleEndCall: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n await call.endCall();\n onLeave?.();\n }\n },\n [onClick, onLeave, call],\n );\n\n return (\n <MenuToggle placement=\"top-start\" ToggleButton={CancelCallToggleMenuButton}>\n <EndCallMenu onEnd={handleEndCall} onLeave={handleLeave} />\n </MenuToggle>\n );\n};\n\nexport const CancelCallButton = ({\n disabled,\n caption,\n onClick,\n onLeave,\n}: CancelCallButtonProps) => {\n const call = useCall();\n const { t } = useI18n();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n await call.leave();\n onLeave?.();\n }\n },\n [onClick, onLeave, call],\n );\n return (\n <IconButton\n disabled={disabled}\n icon=\"call-end\"\n variant=\"danger\"\n title={caption ?? t('Leave call')}\n data-testid=\"cancel-call-button\"\n onClick={handleClick}\n />\n );\n};\n","import { OwnCapability } from '@stream-io/video-client';\nimport { Restricted } from '@stream-io/video-react-bindings';\nimport { SpeakingWhileMutedNotification } from '../Notification';\nimport { RecordCallButton } from './RecordCallButton';\nimport { ReactionsButton } from './ReactionsButton';\nimport { ScreenShareButton } from './ScreenShareButton';\nimport { ToggleAudioPublishingButton } from './ToggleAudioButton';\nimport { ToggleVideoPublishingButton } from './ToggleVideoButton';\nimport { CancelCallButton } from './CancelCallButton';\n\nexport type CallControlsProps = {\n onLeave?: () => void;\n};\n\nexport const CallControls = ({ onLeave }: CallControlsProps) => (\n <div className=\"str-video__call-controls\">\n <Restricted requiredGrants={[OwnCapability.SEND_AUDIO]}>\n <SpeakingWhileMutedNotification>\n <ToggleAudioPublishingButton />\n </SpeakingWhileMutedNotification>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.SEND_VIDEO]}>\n <ToggleVideoPublishingButton />\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <ReactionsButton />\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.SCREENSHARE]}>\n <ScreenShareButton />\n </Restricted>\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <RecordCallButton />\n </Restricted>\n <CancelCallButton onLeave={onLeave} />\n </div>\n);\n","import { lazy, ReactNode, Suspense, useEffect, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport {\n AggregatedStatsReport,\n CallStatsReport,\n SfuModels,\n} from '@stream-io/video-client';\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { useFloating, useHover, useInteractions } from '@floating-ui/react';\nimport { Icon } from '../Icon';\n\nconst CallStatsLatencyChart = lazy(() => import('./CallStatsLatencyChart'));\n\nenum Status {\n GOOD = 'Good',\n OK = 'Ok',\n BAD = 'Bad',\n}\n\nexport type CallStatsProps = {\n latencyLowBound?: number;\n latencyHighBound?: number;\n showCodecInfo?: boolean;\n LatencyChartSuspenseFallback?: ReactNode;\n};\n\nexport const CallStats = (props: CallStatsProps) => {\n const {\n latencyLowBound = 75,\n latencyHighBound = 400,\n showCodecInfo = false,\n LatencyChartSuspenseFallback = null,\n } = props;\n const [latencyBuffer, setLatencyBuffer] = useState<\n Array<{ x: number; y: number }>\n >(() => {\n const now = Date.now();\n return Array.from({ length: 20 }, (_, i) => ({ x: now + i, y: 0 }));\n });\n\n const { t } = useI18n();\n const [publishBitrate, setPublishBitrate] = useState('-');\n const [subscribeBitrate, setSubscribeBitrate] = useState('-');\n const previousStats = useRef<CallStatsReport>(undefined);\n const { useCallStatsReport } = useCallStateHooks();\n const callStatsReport = useCallStatsReport();\n\n useEffect(() => {\n if (!callStatsReport) return;\n if (!previousStats.current) {\n previousStats.current = callStatsReport;\n return;\n }\n const previousCallStatsReport = previousStats.current;\n setPublishBitrate(() => {\n return calculatePublishBitrate(previousCallStatsReport, callStatsReport);\n });\n setSubscribeBitrate(() => {\n return calculateSubscribeBitrate(\n previousCallStatsReport,\n callStatsReport,\n );\n });\n\n setLatencyBuffer((latencyBuf) => {\n const newLatencyBuffer = latencyBuf.slice(-19);\n newLatencyBuffer.push({\n x: callStatsReport.timestamp,\n y: callStatsReport.publisherStats.averageRoundTripTimeInMs,\n });\n return newLatencyBuffer;\n });\n\n previousStats.current = callStatsReport;\n }, [callStatsReport]);\n\n const latencyComparison = {\n lowBound: latencyLowBound,\n highBound: latencyHighBound,\n value: callStatsReport?.publisherStats.averageRoundTripTimeInMs || 0,\n };\n\n return (\n <div className=\"str-video__call-stats\">\n {callStatsReport && (\n <>\n <div className=\"str-video__call-stats__header\">\n <h3 className=\"str-video__call-stats__heading\">\n <Icon\n className=\"str-video__call-stats__icon\"\n icon=\"call-latency\"\n />\n {t('Call Latency')}\n </h3>\n <p className=\"str-video__call-stats__description\">\n {t(\n 'Very high latency values may reduce call quality, cause lag, and make the call less enjoyable.',\n )}\n </p>\n </div>\n\n <div className=\"str-video__call-stats__latencychart\">\n <Suspense fallback={LatencyChartSuspenseFallback}>\n <CallStatsLatencyChart values={latencyBuffer} />\n </Suspense>\n </div>\n\n <div className=\"str-video__call-stats__header\">\n <h3 className=\"str-video__call-stats__heading\">\n <Icon\n className=\"str-video__call-stats__icon\"\n icon=\"network-quality\"\n />\n {t('Call performance')}\n </h3>\n <p className=\"str-video__call-stats__description\">\n {t('Review the key data points below to assess call performance')}\n </p>\n </div>\n\n <div className=\"str-video__call-stats__card-container\">\n <StatCard label={t('Region')} value={callStatsReport.datacenter} />\n <StatCard\n label={t('Latency')}\n value={`${callStatsReport.publisherStats.averageRoundTripTimeInMs} ms.`}\n comparison={latencyComparison}\n />\n <StatCard\n label={t('Receive jitter')}\n value={`${callStatsReport.subscriberStats.averageJitterInMs} ms.`}\n comparison={{\n ...latencyComparison,\n value: callStatsReport.subscriberStats.averageJitterInMs,\n }}\n />\n <StatCard\n label={t('Publish jitter')}\n value={`${callStatsReport.publisherStats.averageJitterInMs} ms.`}\n comparison={{\n ...latencyComparison,\n value: callStatsReport.publisherStats.averageJitterInMs,\n }}\n />\n <StatCard\n label={`${t('Publish resolution')}${showCodecInfo ? formatCodec(callStatsReport) : ''}`}\n value={toFrameSize(callStatsReport.publisherStats)}\n />\n <StatCard\n label={t('Publish quality drop reason')}\n value={callStatsReport.publisherStats.qualityLimitationReasons}\n />\n <StatCard\n label={t('Receiving resolution')}\n value={toFrameSize(callStatsReport.subscriberStats)}\n />\n <StatCard\n label={t('Receive quality drop reason')}\n value={callStatsReport.subscriberStats.qualityLimitationReasons}\n />\n <StatCard label={t('Publish bitrate')} value={publishBitrate} />\n <StatCard label={t('Receiving bitrate')} value={subscribeBitrate} />\n </div>\n </>\n )}\n </div>\n );\n};\n\nconst StatCardExplanation = (props: { description: string }) => {\n const { description } = props;\n const [isOpen, setIsOpen] = useState(false);\n\n const { refs, floatingStyles, context } = useFloating({\n open: isOpen,\n onOpenChange: setIsOpen,\n });\n\n const hover = useHover(context);\n\n const { getReferenceProps, getFloatingProps } = useInteractions([hover]);\n\n return (\n <>\n <div\n className=\"str-video__call-explanation\"\n ref={refs.setReference}\n {...getReferenceProps()}\n >\n <Icon className=\"str-video__call-explanation__icon\" icon=\"info\" />\n </div>\n {isOpen && (\n <div\n className=\"str-video__call-explanation__description\"\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n >\n {description}\n </div>\n )}\n </>\n );\n};\n\nconst StatsTag = (props: { children: ReactNode; status: Status }) => {\n const { children, status } = props;\n return (\n <div\n className={clsx('str-video__call-stats__tag', {\n 'str-video__call-stats__tag--good': status === Status.GOOD,\n 'str-video__call-stats__tag--ok': status === Status.OK,\n 'str-video__call-stats__tag--bad': status === Status.BAD,\n })}\n >\n <div className=\"str-video__call-stats__tag__text\">{children}</div>\n </div>\n );\n};\n\nexport const StatCard = (props: {\n label: string;\n value: string | ReactNode;\n description?: string;\n comparison?: { value: number; highBound: number; lowBound: number };\n}) => {\n const { label, value, description, comparison } = props;\n\n const { t } = useI18n();\n const status = comparison ? toStatus(comparison) : undefined;\n\n return (\n <div className=\"str-video__call-stats__card\">\n <div className=\"str-video__call-stats__card-content\">\n <div className=\"str-video__call-stats__card-label\">\n {label}\n {description && <StatCardExplanation description={description} />}\n </div>\n <div className=\"str-video__call-stats__card-value\">{value}</div>\n </div>\n {status && <StatsTag status={status}>{t(status)}</StatsTag>}\n </div>\n );\n};\n\nconst toStatus = (config: {\n value: number;\n lowBound: number;\n highBound: number;\n}): Status => {\n const { value, lowBound, highBound } = config;\n if (value <= lowBound) return Status.GOOD;\n if (value >= lowBound && value <= highBound) return Status.OK;\n if (value >= highBound) return Status.BAD;\n return Status.GOOD;\n};\n\nconst toFrameSize = (stats: AggregatedStatsReport) => {\n const {\n highestFrameWidth: w,\n highestFrameHeight: h,\n highestFramesPerSecond: fps,\n } = stats;\n let size = `-`;\n if (w && h) {\n size = `${w}x${h}`;\n if (fps) {\n size += `@${fps}fps.`;\n }\n }\n return size;\n};\n\nconst formatCodec = (callStatsReport: CallStatsReport): string => {\n const { codecPerTrackType } = callStatsReport.publisherStats;\n if (!codecPerTrackType || !codecPerTrackType[SfuModels.TrackType.VIDEO]) {\n return '';\n }\n const [, name] = codecPerTrackType[SfuModels.TrackType.VIDEO].split('/');\n return name ? ` (${name})` : '';\n};\n\nconst calculatePublishBitrate = (\n previousCallStatsReport: CallStatsReport,\n callStatsReport: CallStatsReport,\n) => {\n const {\n publisherStats: {\n totalBytesSent: previousTotalBytesSent,\n timestamp: previousTimestamp,\n },\n } = previousCallStatsReport;\n\n const {\n publisherStats: { totalBytesSent, timestamp },\n } = callStatsReport;\n\n const bytesSent = totalBytesSent - previousTotalBytesSent;\n const timeElapsed = timestamp - previousTimestamp;\n return `${((bytesSent * 8) / timeElapsed).toFixed(2)} kbps`;\n};\n\nconst calculateSubscribeBitrate = (\n previousCallStatsReport: CallStatsReport,\n callStatsReport: CallStatsReport,\n) => {\n const {\n subscriberStats: {\n totalBytesReceived: previousTotalBytesReceived,\n timestamp: previousTimestamp,\n },\n } = previousCallStatsReport;\n\n const {\n subscriberStats: { totalBytesReceived, timestamp },\n } = callStatsReport;\n\n const bytesReceived = totalBytesReceived - previousTotalBytesReceived;\n const timeElapsed = timestamp - previousTimestamp;\n return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;\n};\n","import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\n\nimport { CallStats } from '../CallStats';\nimport { CompositeButton } from '../Button/';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport { Icon } from '../Icon';\n\nexport type CallStatsButtonProps = {\n caption?: string;\n};\n\nexport const CallStatsButton = () => (\n <MenuToggle placement=\"top-end\" ToggleButton={ToggleMenuButton}>\n <CallStats />\n </MenuToggle>\n);\n\nconst ToggleMenuButton = forwardRef<\n HTMLDivElement,\n ToggleMenuButtonProps<HTMLDivElement> & CallStatsButtonProps\n>(function ToggleMenuButton(props, ref) {\n const { t } = useI18n();\n const { caption, menuShown } = props;\n\n return (\n <CompositeButton\n ref={ref}\n active={menuShown}\n caption={caption}\n title={caption || t('Statistics')}\n data-testid=\"stats-button\"\n >\n <Icon icon=\"stats\" />\n </CompositeButton>\n );\n});\n","import { CompositeButton, IconButtonWithMenuProps } from '../Button';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport { Icon } from '../Icon';\nimport { DeviceSelectorAudioOutput } from '../DeviceSettings';\nimport { WithTooltip } from '../Tooltip';\nimport { useState } from 'react';\n\nexport type ToggleAudioOutputButtonProps = Pick<\n IconButtonWithMenuProps,\n 'caption' | 'Menu' | 'menuPlacement' | 'onMenuToggle'\n>;\n\nexport const ToggleAudioOutputButton = (\n props: ToggleAudioOutputButtonProps,\n) => {\n const { t } = useI18n();\n const {\n caption,\n Menu = DeviceSelectorAudioOutput,\n menuPlacement = 'top',\n onMenuToggle,\n } = props;\n const [tooltipDisabled, setTooltipDisabled] = useState(false);\n\n return (\n <WithTooltip\n title={caption || t('Speakers')}\n tooltipDisabled={tooltipDisabled}\n >\n <CompositeButton\n Menu={Menu}\n menuPlacement={menuPlacement}\n caption={caption}\n data-testid=\"audio-output-button\"\n onMenuToggle={(shown) => {\n setTooltipDisabled(shown);\n onMenuToggle?.(shown);\n }}\n >\n <Icon icon=\"speaker\" />\n </CompositeButton>\n </WithTooltip>\n );\n};\n","import { Restricted, useCall } from '@stream-io/video-react-bindings';\nimport { OwnCapability } from '@stream-io/video-client';\n\nimport { TextButton } from '../Button';\n\nexport const BlockedUserListing = ({ data }: { data: string[] }) => {\n if (!data.length) return null;\n\n return (\n <>\n <div className=\"str-video__participant-listing\">\n {data.map((userId) => (\n <BlockedUserListingItem key={userId} userId={userId} />\n ))}\n </div>\n </>\n );\n};\n\nconst BlockedUserListingItem = ({ userId }: { userId: string }) => {\n const call = useCall();\n\n const unblockUserClickHandler = () => {\n if (userId) call?.unblockUser(userId);\n };\n\n return (\n <div className=\"str-video__participant-listing-item\">\n <div className=\"str-video__participant-listing-item__display-name\">\n {userId}\n </div>\n <Restricted requiredGrants={[OwnCapability.BLOCK_USERS]}>\n <TextButton onClick={unblockUserClickHandler}>Unblock</TextButton>\n </Restricted>\n </div>\n );\n};\n","import { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\n\nimport { IconButton } from '../Button';\n\nexport type CallParticipantListHeaderProps = {\n /**\n * Click event listener function to be invoked to dismiss / hide the CallParticipantsList from the UI.\n */\n onClose: () => void;\n};\n\nexport const CallParticipantListHeader = ({\n onClose,\n}: CallParticipantListHeaderProps) => {\n const { useParticipants, useAnonymousParticipantCount } = useCallStateHooks();\n const participants = useParticipants();\n const anonymousParticipantCount = useAnonymousParticipantCount();\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__participant-list-header\">\n <div className=\"str-video__participant-list-header__title\">\n {t('Participants')}{' '}\n <span className=\"str-video__participant-list-header__title-count\">\n [{participants.length}]\n </span>\n {anonymousParticipantCount > 0 && (\n <span className=\"str-video__participant-list-header__title-anonymous\">\n {t('Anonymous', { count: anonymousParticipantCount })}\n </span>\n )}\n </div>\n <IconButton\n onClick={onClose}\n className=\"str-video__participant-list-header__close-button\"\n icon=\"close\"\n />\n </div>\n );\n};\n","import clsx from 'clsx';\nimport { ComponentProps, ComponentType, forwardRef } from 'react';\nimport { useConnectedUser, useI18n } from '@stream-io/video-react-bindings';\nimport {\n hasAudio,\n hasVideo,\n isPinned,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport { IconButton } from '../Button';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport { WithTooltip } from '../Tooltip';\nimport { Avatar } from '../Avatar';\nimport { ParticipantActionsContextMenu } from '../../core/components/ParticipantView/ParticipantActionsContextMenu';\nimport { ParticipantViewContext } from '../../core/components/ParticipantView/ParticipantViewContext';\n\ntype CallParticipantListingItemProps = {\n /** Participant object be rendered */\n participant: StreamVideoParticipant;\n /** Custom component used to display participant's name */\n DisplayName?: ComponentType<{ participant: StreamVideoParticipant }>;\n};\nexport const CallParticipantListingItem = ({\n participant,\n DisplayName = DefaultDisplayName,\n}: CallParticipantListingItemProps) => {\n const isAudioOn = hasAudio(participant);\n const isVideoOn = hasVideo(participant);\n const isPinnedOn = isPinned(participant);\n\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__participant-listing-item\">\n <Avatar name={participant.name} imageSrc={participant.image} />\n <DisplayName participant={participant} />\n <div className=\"str-video__participant-listing-item__media-indicator-group\">\n <MediaIndicator\n title={isAudioOn ? t('Microphone on') : t('Microphone off')}\n className={clsx(\n 'str-video__participant-listing-item__icon',\n `str-video__participant-listing-item__icon-${\n isAudioOn ? 'mic' : 'mic-off'\n }`,\n )}\n />\n <MediaIndicator\n title={isVideoOn ? t('Camera on') : t('Camera off')}\n className={clsx(\n 'str-video__participant-listing-item__icon',\n `str-video__participant-listing-item__icon-${\n isVideoOn ? 'camera' : 'camera-off'\n }`,\n )}\n />\n {isPinnedOn && (\n <MediaIndicator\n title={t('Pinned')}\n className={clsx(\n 'str-video__participant-listing-item__icon',\n 'str-video__participant-listing-item__icon-pinned',\n )}\n />\n )}\n\n <MenuToggle placement=\"bottom-end\" ToggleButton={ToggleButton}>\n <ParticipantViewContext.Provider\n value={{ participant, trackType: 'none' }}\n >\n <ParticipantActionsContextMenu />\n </ParticipantViewContext.Provider>\n </MenuToggle>\n </div>\n </div>\n );\n};\n\nconst MediaIndicator = (props: ComponentProps<'div'>) => (\n <WithTooltip {...props} />\n);\n\ntype DisplayNameProps = {\n /** Participant object that provides the data from which display name can be generated */\n participant: StreamVideoParticipant;\n};\n\nconst DefaultDisplayName = ({ participant }: DisplayNameProps) => {\n const connectedUser = useConnectedUser();\n const { t } = useI18n();\n\n const meFlag = participant.userId === connectedUser?.id ? t('Me') : '';\n const nameOrId = participant.name || participant.userId || t('Unknown');\n let displayName;\n if (!participant.name) {\n displayName = meFlag || nameOrId || t('Unknown');\n } else if (meFlag) {\n displayName = `${nameOrId} (${meFlag})`;\n } else {\n displayName = nameOrId;\n }\n\n return (\n <WithTooltip\n className=\"str-video__participant-listing-item__display-name\"\n title={displayName}\n >\n {displayName}\n </WithTooltip>\n );\n};\n\nconst ToggleButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n function ToggleButton(props, ref) {\n return <IconButton enabled={props.menuShown} icon=\"ellipsis\" ref={ref} />;\n },\n);\n","import { ComponentType } from 'react';\nimport { StreamVideoParticipant } from '@stream-io/video-client';\nimport { CallParticipantListingItem } from './CallParticipantListingItem';\n\nexport type CallParticipantListingProps = {\n /** Array of participant objects to be rendered */\n data: StreamVideoParticipant[];\n Header?: ComponentType;\n};\n\nexport const CallParticipantListing = ({\n data,\n}: CallParticipantListingProps) => (\n <div className=\"str-video__participant-listing\">\n {data.map((participant) => (\n <CallParticipantListingItem\n key={participant.sessionId}\n participant={participant}\n />\n ))}\n </div>\n);\n","import { useI18n } from '@stream-io/video-react-bindings';\n\nexport const EmptyParticipantSearchList = () => {\n const { t } = useI18n();\n return (\n <div className=\"str-video__participant-list--empty\">\n {t('No participants found')}\n </div>\n );\n};\n","import { ComponentProps, useEffect, useState } from 'react';\nimport clsx from 'clsx';\n\ntype SearchInputProps = ComponentProps<'input'> & {\n /**\n * Resets the search to its initial state.\n * The function is called when Esc key or inputs clear button are pressed\n */\n exitSearch: () => void;\n /**\n * Flag to signal, whether search input elements should be rendered as active\n */\n isActive: boolean;\n};\nexport const SearchInput = ({\n exitSearch,\n isActive,\n ...rest\n}: SearchInputProps) => {\n const [inputElement, setInputElement] = useState<HTMLInputElement | null>(\n null,\n );\n useEffect(() => {\n if (!inputElement) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() === 'escape') exitSearch();\n };\n\n inputElement.addEventListener('keydown', handleKeyDown);\n\n return () => {\n inputElement.removeEventListener('keydown', handleKeyDown);\n };\n }, [exitSearch, inputElement]);\n\n return (\n <div\n className={clsx('str-video__search-input__container', {\n 'str-video__search-input__container--active': isActive,\n })}\n >\n <input placeholder=\"Search\" {...rest} ref={setInputElement} />\n {isActive ? (\n <button\n className=\"str-video__search-input__clear-btn\"\n onClick={exitSearch}\n >\n <span className=\"str-video__search-input__icon--active\" />\n </button>\n ) : (\n <span className=\"str-video__search-input__icon\" />\n )}\n </div>\n );\n};\n","import { ComponentType } from 'react';\nimport { LoadingIndicator as DefaultLoadingIndicator } from '../LoadingIndicator';\nimport { SearchController } from './hooks';\n\nexport type SearchResultListProps<T> = {\n data: T[];\n};\n\nexport type SearchResultsProps<T> = Pick<\n SearchController<T>,\n 'searchResults' | 'searchQueryInProgress'\n> & {\n /** Component to be displayed, when empty array of search results is provided */\n EmptySearchResultComponent: ComponentType;\n /** Component will be used to render non-empty array of search results */\n SearchResultList: ComponentType<SearchResultListProps<T>>;\n /** Component to be displayed while the search query request is in progress */\n LoadingIndicator?: ComponentType;\n};\n\nexport function SearchResults<T>({\n EmptySearchResultComponent,\n LoadingIndicator = DefaultLoadingIndicator,\n searchQueryInProgress,\n searchResults,\n SearchResultList,\n}: SearchResultsProps<T>) {\n if (searchQueryInProgress) {\n return (\n <div className=\"str-video__search-results--loading\">\n <LoadingIndicator />\n </div>\n );\n }\n if (!searchResults.length) {\n return <EmptySearchResultComponent />;\n }\n\n return <SearchResultList data={searchResults} />;\n}\n","import { useEffect, useRef, useState } from 'react';\n\nexport type SearchController<T> = {\n /** Flag signals that the search request is flight await the response */\n searchQueryInProgress: boolean;\n /** Array of items returned by the search query */\n searchResults: T[];\n};\n\nexport type UseSearchParams<T> = {\n /** Search function performing the search request */\n searchFn: (searchQuery: string) => Promise<T[]>;\n /** Debounce interval applied to the search function */\n debounceInterval?: number;\n /** Search query string */\n searchQuery?: string;\n};\n\nexport const useSearch = <T>({\n debounceInterval = 200,\n searchFn,\n searchQuery = '',\n}: UseSearchParams<T>): SearchController<T> => {\n const [searchResults, setSearchResults] = useState<T[]>([]);\n const [searchQueryInProgress, setSearchQueryInProgress] = useState(false);\n\n const searchFnRef = useRef(searchFn);\n searchFnRef.current = searchFn;\n\n useEffect(() => {\n if (!searchQuery.length) {\n setSearchQueryInProgress(false);\n setSearchResults([]);\n return;\n }\n\n setSearchQueryInProgress(true);\n\n const timeout = setTimeout(async () => {\n try {\n const results = await searchFnRef.current(searchQuery);\n setSearchResults(results);\n } catch (error) {\n console.error(error);\n } finally {\n setSearchQueryInProgress(false);\n }\n }, debounceInterval);\n\n return () => {\n clearTimeout(timeout);\n };\n }, [debounceInterval, searchQuery]);\n\n return {\n searchQueryInProgress,\n searchResults,\n };\n};\n","import {\n Dispatch,\n forwardRef,\n SetStateAction,\n useCallback,\n useState,\n} from 'react';\nimport {\n Restricted,\n useCall,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport {\n name,\n OwnCapability,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\n\nimport { BlockedUserListing } from './BlockedUserListing';\nimport { IconButton, TextButton } from '../Button';\nimport { CallParticipantListHeader } from './CallParticipantListHeader';\nimport { CallParticipantListing } from './CallParticipantListing';\nimport { EmptyParticipantSearchList } from './EmptyParticipantSearchList';\nimport { LoadingIndicator } from '../LoadingIndicator';\nimport { SearchInput, SearchResults } from '../Search';\nimport { useSearch, UseSearchParams } from '../Search/hooks';\nimport {\n GenericMenu,\n GenericMenuButtonItem,\n MenuToggle,\n ToggleMenuButtonProps,\n} from '../Menu';\n\ntype CallParticipantListProps = {\n /** Click event listener function to be invoked in order to dismiss/hide the CallParticipantsList from the UI */\n onClose: () => void;\n /** Custom function to override the searching logic of active participants */\n activeUsersSearchFn?: UseSearchParams<StreamVideoParticipant>['searchFn'];\n /** Custom function to override the searching logic of blocked users */\n blockedUsersSearchFn?: UseSearchParams<string>['searchFn'];\n /** Interval in ms, during which the participant search calls will be debounced. The default value is 200ms. */\n debounceSearchInterval?: number;\n};\n\nconst UserListTypes = {\n active: 'Active users',\n blocked: 'Blocked users',\n} as const;\n\nexport const CallParticipantsList = ({\n onClose,\n activeUsersSearchFn,\n blockedUsersSearchFn,\n debounceSearchInterval,\n}: CallParticipantListProps) => {\n const [searchQuery, setSearchQuery] = useState('');\n const [userListType, setUserListType] =\n useState<keyof typeof UserListTypes>('active');\n\n const exitSearch = useCallback(() => setSearchQuery(''), []);\n\n return (\n <div className=\"str-video__participant-list\">\n <CallParticipantListHeader onClose={onClose} />\n <SearchInput\n value={searchQuery}\n onChange={({ currentTarget }) => setSearchQuery(currentTarget.value)}\n exitSearch={exitSearch}\n isActive={!!searchQuery}\n />\n <CallParticipantListContentHeader\n userListType={userListType}\n setUserListType={setUserListType}\n />\n <div className=\"str-video__participant-list__content\">\n {userListType === 'active' && (\n <ActiveUsersSearchResults\n searchQuery={searchQuery}\n activeUsersSearchFn={activeUsersSearchFn}\n debounceSearchInterval={debounceSearchInterval}\n />\n )}\n {userListType === 'blocked' && (\n <BlockedUsersSearchResults\n searchQuery={searchQuery}\n blockedUsersSearchFn={blockedUsersSearchFn}\n debounceSearchInterval={debounceSearchInterval}\n />\n )}\n </div>\n </div>\n );\n};\n\nconst CallParticipantListContentHeader = ({\n userListType,\n setUserListType,\n}: {\n userListType: keyof typeof UserListTypes;\n setUserListType: Dispatch<SetStateAction<keyof typeof UserListTypes>>;\n}) => {\n const call = useCall();\n const { t } = useI18n();\n\n const muteAll = useCallback(() => {\n call?.muteAllUsers('audio');\n }, [call]);\n\n return (\n <div className=\"str-video__participant-list__content-header\">\n <div className=\"str-video__participant-list__content-header-title\">\n {userListType === 'active' && (\n <Restricted\n requiredGrants={[OwnCapability.MUTE_USERS]}\n hasPermissionsOnly\n >\n <TextButton onClick={muteAll}>{t('Mute all')}</TextButton>\n </Restricted>\n )}\n </div>\n <MenuToggle placement=\"bottom-end\" ToggleButton={ToggleButton}>\n <GenericMenu>\n {(\n Object.keys(UserListTypes) as Array<keyof typeof UserListTypes>\n ).map((lt) => (\n <GenericMenuButtonItem\n key={lt}\n aria-selected={lt === userListType}\n onClick={() => setUserListType(lt)}\n >\n {UserListTypes[lt]}\n </GenericMenuButtonItem>\n ))}\n </GenericMenu>\n </MenuToggle>\n </div>\n );\n};\n\nconst ActiveUsersSearchResults = ({\n searchQuery,\n activeUsersSearchFn: activeUsersSearchFnFromProps,\n debounceSearchInterval,\n}: Pick<\n CallParticipantListProps,\n 'activeUsersSearchFn' | 'debounceSearchInterval'\n> & { searchQuery: string }) => {\n const { useParticipants } = useCallStateHooks();\n const participants = useParticipants({ sortBy: name });\n\n const activeUsersSearchFn = useCallback(\n async (queryString: string) => {\n const queryRegExp = new RegExp(queryString, 'i');\n return participants.filter((p) => p.name.match(queryRegExp));\n },\n [participants],\n );\n\n const { searchQueryInProgress, searchResults } = useSearch({\n searchFn: activeUsersSearchFnFromProps ?? activeUsersSearchFn,\n debounceInterval: debounceSearchInterval,\n searchQuery,\n });\n\n return (\n <SearchResults<StreamVideoParticipant>\n EmptySearchResultComponent={EmptyParticipantSearchList}\n LoadingIndicator={LoadingIndicator}\n searchQueryInProgress={searchQueryInProgress}\n searchResults={searchQuery ? searchResults : participants}\n SearchResultList={CallParticipantListing}\n />\n );\n};\n\nconst BlockedUsersSearchResults = ({\n blockedUsersSearchFn: blockedUsersSearchFnFromProps,\n debounceSearchInterval,\n searchQuery,\n}: Pick<\n CallParticipantListProps,\n 'blockedUsersSearchFn' | 'debounceSearchInterval'\n> & { searchQuery: string }) => {\n const { useCallBlockedUserIds } = useCallStateHooks();\n const blockedUsers = useCallBlockedUserIds();\n\n const blockedUsersSearchFn = useCallback(\n async (queryString: string) => {\n const queryRegExp = new RegExp(queryString, 'i');\n return blockedUsers.filter((userId) => userId.match(queryRegExp));\n },\n [blockedUsers],\n );\n\n const { searchQueryInProgress, searchResults } = useSearch({\n searchFn: blockedUsersSearchFnFromProps ?? blockedUsersSearchFn,\n debounceInterval: debounceSearchInterval,\n searchQuery,\n });\n\n return (\n <SearchResults<string>\n EmptySearchResultComponent={EmptyParticipantSearchList}\n LoadingIndicator={LoadingIndicator}\n searchQueryInProgress={searchQueryInProgress}\n searchResults={searchQuery ? searchResults : blockedUsers}\n SearchResultList={BlockedUserListing}\n />\n );\n};\n\nconst ToggleButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n function ToggleButton(props, ref) {\n return <IconButton enabled={props.menuShown} icon=\"filter\" ref={ref} />;\n },\n);\n","import clsx from 'clsx';\nimport { CSSProperties, useEffect, useState } from 'react';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport type CallPreviewProps = {\n /**\n * Additional CSS class name to apply to the CallPreview element.\n */\n className?: string;\n\n /**\n * Additional CSS properties to apply to the CallPreview element.\n */\n style?: CSSProperties;\n};\n\nexport const CallPreview = (props: CallPreviewProps) => {\n const { className, style } = props;\n const call = useCall();\n const { useCallThumbnail } = useCallStateHooks();\n const thumbnail = useCallThumbnail();\n\n const [imageRef, setImageRef] = useState<HTMLImageElement | null>(null);\n useEffect(() => {\n if (!imageRef || !call) return;\n const cleanup = call.bindCallThumbnailElement(imageRef);\n return () => cleanup();\n }, [imageRef, call]);\n\n if (!thumbnail) return null;\n\n return (\n <img\n className={clsx('str-video__call-preview', className)}\n style={style}\n alt=\"Call Preview Thumbnail\"\n ref={setImageRef}\n />\n );\n};\n","import { CallRecording } from '@stream-io/video-client';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport { IconButton } from '../Button';\n\nexport type CallRecordingListHeaderProps = {\n /** Array of CallRecording objects */\n callRecordings: CallRecording[];\n /** Callback to be invoked when the refresh button is clicked */\n onRefresh?: () => void;\n};\n\nexport const CallRecordingListHeader = ({\n callRecordings,\n onRefresh,\n}: CallRecordingListHeaderProps) => {\n const { t } = useI18n();\n return (\n <div className=\"str-video__call-recording-list__header\">\n <div className=\"str-video__call-recording-list__title\">\n <span>{t('Call Recordings')}</span>\n {callRecordings.length ? <span>({callRecordings.length})</span> : null}\n </div>\n {onRefresh && (\n <IconButton icon=\"refresh\" title={t('Refresh')} onClick={onRefresh} />\n )}\n </div>\n );\n};\n","import clsx from 'clsx';\nimport { CallRecording } from '@stream-io/video-client';\nimport { Icon } from '../Icon';\n\nexport type CallRecordingListItemProps = {\n /** CallRecording object to represent */\n recording: CallRecording;\n};\n\nconst dateFormat = (date: string) => {\n const format = new Date(date);\n return format.toTimeString().split(' ')[0];\n};\nexport const CallRecordingListItem = ({\n recording,\n}: CallRecordingListItemProps) => {\n return (\n <li className=\"str-video__call-recording-list__item\">\n <div className=\"str-video__call-recording-list__table-cell str-video__call-recording-list__filename\">\n {recording.filename}\n </div>\n <div className=\"str-video__call-recording-list__table-cell str-video__call-recording-list__time\">\n {dateFormat(recording.start_time)}\n </div>\n <div className=\"str-video__call-recording-list__table-cell str-video__call-recording-list__time\">\n {dateFormat(recording.end_time)}\n </div>\n <div className=\"str-video__call-recording-list__table-cell str-video__call-recording-list__download\">\n <a\n className={clsx(\n 'str-video__call-recording-list-item__action-button',\n 'str-video__call-recording-list-item__action-button--download',\n )}\n role=\"button\"\n href={recording.url}\n download={recording.filename}\n title=\"Download the recording\"\n >\n <Icon icon=\"download\" />\n </a>\n </div>\n </li>\n );\n};\n","export const EmptyCallRecordingListing = () => {\n return (\n <div className=\"str-video__call-recording-list__listing str-video__call-recording-list__listing--empty\">\n <div className=\"str-video__call-recording-list__listing--icon-empty\" />\n <p className=\"str-video__call-recording-list__listing--text-empty\">\n {/* todo: introduce i18n to enable text customization */}\n No recordings available\n </p>\n </div>\n );\n};\n","import { CallRecording } from '@stream-io/video-client';\nimport { CallRecordingListItem } from './CallRecordingListItem';\nimport { LoadingIndicator } from '../LoadingIndicator';\n\nexport type LoadingCallRecordingListProps = {\n /** Array of CallRecording objects */\n callRecordings: CallRecording[];\n};\n\nexport const LoadingCallRecordingListing = ({\n callRecordings,\n}: LoadingCallRecordingListProps) => {\n return (\n <>\n {callRecordings.map((recording) => (\n <CallRecordingListItem recording={recording} key={recording.filename} />\n ))}\n <LoadingIndicator text=\"Recording getting ready\" />\n </>\n );\n};\n","import { ComponentType } from 'react';\nimport { CallRecording } from '@stream-io/video-client';\n\nimport {\n CallRecordingListHeader as DefaultCallRecordingListHeader,\n CallRecordingListHeaderProps,\n} from './CallRecordingListHeader';\nimport {\n CallRecordingListItem as DefaultCallRecordingListItem,\n CallRecordingListItemProps,\n} from './CallRecordingListItem';\nimport { EmptyCallRecordingListing as DefaultEmptyCallRecordingList } from './EmptyCallRecordingListing';\nimport {\n LoadingCallRecordingListing as DefaultLoadingCallRecordingList,\n LoadingCallRecordingListProps,\n} from './LoadingCallRecordingListing';\n\nexport type CallRecordingListProps = {\n /** Array of CallRecording objects to be displayed */\n callRecordings: CallRecording[];\n /** Custom component to replace the default header implementation */\n CallRecordingListHeader?: ComponentType<CallRecordingListHeaderProps>;\n /** Custom component to replace the default list item implementation */\n CallRecordingListItem?: ComponentType<CallRecordingListItemProps>;\n /** Custom component to replace the default empty list component implementation */\n EmptyCallRecordingList?: ComponentType;\n /** Signals that a request for new list of CallRecording object has been initiated */\n loading?: boolean;\n /** Custom component to be rendered when loading is true */\n LoadingCallRecordingList?: ComponentType<LoadingCallRecordingListProps>;\n /** Callback to be invoked when the refresh button is clicked */\n onRefresh?: () => void;\n};\n\nexport const CallRecordingList = ({\n callRecordings,\n CallRecordingListHeader = DefaultCallRecordingListHeader,\n CallRecordingListItem = DefaultCallRecordingListItem,\n EmptyCallRecordingList = DefaultEmptyCallRecordingList,\n loading,\n LoadingCallRecordingList = DefaultLoadingCallRecordingList,\n onRefresh,\n}: CallRecordingListProps) => {\n return (\n <div className=\"str-video__call-recording-list\">\n <CallRecordingListHeader\n callRecordings={callRecordings}\n onRefresh={onRefresh}\n />\n <div className=\"str-video__call-recording-list__listing\">\n {loading ? (\n <LoadingCallRecordingList callRecordings={callRecordings} />\n ) : callRecordings.length ? (\n <>\n <ul className=\"str-video__call-recording-list__list\">\n <li className=\"str-video__call-recording-list__item\">\n <div className=\"str-video__call-recording-list__filename\">\n Name\n </div>\n <div className=\"str-video__call-recording-list__time\">\n Start time\n </div>\n <div className=\"str-video__call-recording-list__time\">\n End time\n </div>\n <div className=\"str-video__call-recording-list__download\"></div>\n </li>\n </ul>\n <ul className=\"str-video__call-recording-list__list\">\n {callRecordings.map((recording) => (\n <CallRecordingListItem\n recording={recording}\n key={recording.filename}\n />\n ))}\n </ul>\n </>\n ) : (\n <EmptyCallRecordingList />\n )}\n </div>\n </div>\n );\n};\n","import {\n createContext,\n PropsWithChildren,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n NoiseCancellationSettingsModeEnum,\n OwnCapability,\n} from '@stream-io/video-client';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\nimport type { INoiseCancellation } from '@stream-io/audio-filters-web';\n\nexport type NoiseCancellationProviderProps = {\n /**\n * The noise cancellation instance to use.\n */\n noiseCancellation: INoiseCancellation;\n};\n\n/**\n * The Noise Cancellation API.\n */\nexport type NoiseCancellationAPI = {\n /**\n * A boolean providing information whether Noise Cancelling functionalities\n * are supported on this platform and for the current user.\n */\n isSupported: boolean | undefined;\n /**\n * Provides information whether Noise Cancellation is active or not.\n */\n isEnabled: boolean;\n /**\n * Allows you to temporarily enable or disable the Noise Cancellation filters.\n *\n * @param enabled a boolean or a setter.\n */\n setEnabled: (enabled: boolean | ((value: boolean) => boolean)) => void;\n\n /**\n * Sets the noise suppression level (0-100).\n *\n * @param level 0 for no suppression, 100 for maximum suppression.\n */\n setSuppressionLevel: (level: number) => void;\n};\n\nconst NoiseCancellationContext = createContext<NoiseCancellationAPI | null>(\n null,\n);\n\n/**\n * Exposes the NoiseCancellation API.\n * Throws an error if used outside <NoiseCancellationProvider />.\n */\nexport const useNoiseCancellation = (): NoiseCancellationAPI => {\n const context = useContext(NoiseCancellationContext);\n if (!context) {\n throw new Error(\n 'useNoiseCancellation must be used within a NoiseCancellationProvider',\n );\n }\n return context;\n};\n\nexport const NoiseCancellationProvider = (\n props: PropsWithChildren<NoiseCancellationProviderProps>,\n) => {\n const { children, noiseCancellation } = props;\n const call = useCall();\n const { useCallSettings, useHasPermissions } = useCallStateHooks();\n const settings = useCallSettings();\n const noiseCancellationAllowed = !!(\n settings &&\n settings.audio.noise_cancellation &&\n settings.audio.noise_cancellation.mode !==\n NoiseCancellationSettingsModeEnum.DISABLED\n );\n\n const hasCapability = useHasPermissions(\n OwnCapability.ENABLE_NOISE_CANCELLATION,\n );\n const [isSupportedByBrowser, setIsSupportedByBrowser] = useState<boolean>();\n useEffect(() => {\n const result = noiseCancellation.isSupported();\n if (typeof result === 'boolean') {\n setIsSupportedByBrowser(result);\n } else {\n result\n .then((s) => setIsSupportedByBrowser(s))\n .catch((err) =>\n console.error(\n `Can't determine if noise cancellation is supported`,\n err,\n ),\n );\n }\n }, [noiseCancellation]);\n\n const isSupported =\n isSupportedByBrowser && hasCapability && noiseCancellationAllowed;\n\n const [isEnabled, setIsEnabled] = useState(false);\n const deinit = useRef<Promise<void>>(undefined);\n useEffect(() => {\n if (!call || !isSupported) return;\n noiseCancellation.isEnabled().then((e) => setIsEnabled(e));\n const unsubscribe = noiseCancellation.on('change', (v) => setIsEnabled(v));\n const init = (deinit.current || Promise.resolve())\n .then(() => noiseCancellation.init({ tracer: call.tracer }))\n .then(() => call.microphone.enableNoiseCancellation(noiseCancellation))\n .catch((e) => console.error(`Can't initialize noise cancellation`, e));\n\n return () => {\n deinit.current = init\n .then(() => call.microphone.disableNoiseCancellation())\n .then(() => noiseCancellation.dispose())\n .then(() => unsubscribe());\n };\n }, [call, isSupported, noiseCancellation]);\n\n const contextValue = useMemo<NoiseCancellationAPI>(\n () => ({\n isSupported,\n isEnabled,\n setSuppressionLevel: (level) => {\n if (!noiseCancellation) return;\n noiseCancellation.setSuppressionLevel(level);\n },\n setEnabled: (enabledOrSetter) => {\n if (!noiseCancellation) return;\n const enable =\n typeof enabledOrSetter === 'function'\n ? enabledOrSetter(isEnabled)\n : enabledOrSetter;\n if (enable) {\n noiseCancellation.enable();\n } else {\n noiseCancellation.disable();\n }\n },\n }),\n [isEnabled, isSupported, noiseCancellation],\n );\n return (\n <NoiseCancellationContext.Provider value={contextValue}>\n {children}\n </NoiseCancellationContext.Provider>\n );\n};\n","import { CallingState } from '@stream-io/video-client';\nimport { AcceptCallButton, CancelCallButton } from '../CallControls';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport const RingingCallControls = () => {\n const call = useCall();\n const { useCallCallingState } = useCallStateHooks();\n const callCallingState = useCallCallingState();\n\n if (!call) return null;\n\n const buttonsDisabled = callCallingState !== CallingState.RINGING;\n return (\n <div className=\"str-video__pending-call-controls\">\n {call.isCreatedByMe ? (\n <CancelCallButton disabled={buttonsDisabled} />\n ) : (\n <>\n <AcceptCallButton disabled={buttonsDisabled} />\n <CancelCallButton\n onClick={() => {\n const reason = call.isCreatedByMe ? 'cancel' : 'decline';\n call.leave({ reject: true, reason });\n }}\n disabled={buttonsDisabled}\n />\n </>\n )}\n </div>\n );\n};\n","import { CallingState, UserResponse } from '@stream-io/video-client';\nimport {\n useCall,\n useCallStateHooks,\n useConnectedUser,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport { Avatar } from '../Avatar';\nimport { RingingCallControls } from './RingingCallControls';\n\nconst CALLING_STATE_TO_LABEL: Record<CallingState, string> = {\n [CallingState.JOINING]: 'Joining',\n [CallingState.RINGING]: 'Ringing',\n [CallingState.MIGRATING]: 'Migrating',\n [CallingState.RECONNECTING]: 'Re-connecting',\n [CallingState.RECONNECTING_FAILED]: 'Failed',\n [CallingState.OFFLINE]: 'No internet connection',\n [CallingState.IDLE]: '',\n [CallingState.UNKNOWN]: '',\n [CallingState.JOINED]: 'Joined',\n [CallingState.LEFT]: 'Left call',\n};\n\nexport type RingingCallProps = {\n /**\n * Whether to include the current user in the list of members to show.\n * @default false.\n */\n includeSelf?: boolean;\n\n /**\n * The maximum number of members to show.\n * @default 3.\n */\n totalMembersToShow?: number;\n};\n\nexport const RingingCall = (props: RingingCallProps) => {\n const { includeSelf = false, totalMembersToShow = 3 } = props;\n const call = useCall();\n const { t } = useI18n();\n const { useCallCallingState, useCallMembers } = useCallStateHooks();\n const callingState = useCallCallingState();\n const members = useCallMembers();\n const connectedUser = useConnectedUser();\n\n if (!call) return null;\n\n // take the first N members to show their avatars\n const membersToShow: UserResponse[] = (members || [])\n .slice(0, totalMembersToShow)\n .map(({ user }) => user)\n .filter((user) => user.id !== connectedUser?.id || includeSelf);\n if (\n includeSelf &&\n !membersToShow.find((user) => user.id === connectedUser?.id)\n ) {\n // if the current user is not in the initial batch of members,\n // replace the first item in membersToShow array with the current user\n const self = members.find(({ user }) => user.id === connectedUser?.id);\n if (self) {\n membersToShow.splice(0, 1, self.user);\n }\n }\n\n const callingStateLabel = CALLING_STATE_TO_LABEL[callingState];\n\n return (\n <div className=\"str-video__call-panel str-video__call-panel--ringing\">\n <div className=\"str-video__call-panel__members-list\">\n {membersToShow.map((user) => (\n <div key={user.id} className=\"str-video__call-panel__member-box\">\n <Avatar name={user.name} imageSrc={user.image} />\n {user.name && (\n <div className=\"str-video__member_details\">\n <span className=\"str-video__member_name\">{user.name}</span>\n </div>\n )}\n </div>\n ))}\n </div>\n\n {callingStateLabel && (\n <div className=\"str-video__call-panel__calling-state-label\">\n {t(callingStateLabel)}\n </div>\n )}\n\n {[CallingState.RINGING, CallingState.JOINING].includes(callingState) && (\n <RingingCallControls />\n )}\n </div>\n );\n};\n","import {\n ButtonHTMLAttributes,\n ComponentProps,\n forwardRef,\n Fragment,\n PropsWithChildren,\n useEffect,\n useState,\n} from 'react';\nimport {\n OwnCapability,\n PermissionRequestEvent,\n UserResponse,\n} from '@stream-io/video-client';\nimport {\n TranslatorFunction,\n useCall,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\n\nimport { useFloatingUIPreset } from '../../hooks';\n\nconst byNameOrId = (a: UserResponse, b: UserResponse) => {\n if (a.name && b.name && a.name < b.name) return -1;\n if (a.name && b.name && a.name > b.name) return 1;\n if (a.id < b.id) return -1;\n if (a.id > b.id) return 1;\n return 0;\n};\n\ntype HandleUpdatePermission = (\n request: PermissionRequestEvent,\n type: 'grant' | 'revoke' | 'dismiss',\n) => () => Promise<void>;\n\nexport const PermissionRequests = () => {\n const call = useCall();\n const { useLocalParticipant, useHasPermissions } = useCallStateHooks();\n const localParticipant = useLocalParticipant();\n const [expanded, setExpanded] = useState(false);\n const [permissionRequests, setPermissionRequests] = useState<\n PermissionRequestEvent[]\n >([]);\n const canUpdateCallPermissions = useHasPermissions(\n OwnCapability.UPDATE_CALL_PERMISSIONS,\n );\n\n const localUserId = localParticipant?.userId;\n useEffect(() => {\n if (!call || !canUpdateCallPermissions) return;\n return call.on('call.permission_request', (event) => {\n if (event.user.id !== localUserId) {\n setPermissionRequests((requests) =>\n [...requests, event].sort((a, b) => byNameOrId(a.user, b.user)),\n );\n }\n });\n }, [call, canUpdateCallPermissions, localUserId]);\n\n const handleUpdatePermission: HandleUpdatePermission = (request, type) => {\n return async () => {\n const { user, permissions } = request;\n switch (type) {\n case 'grant':\n await call?.grantPermissions(user.id, permissions);\n break;\n case 'revoke':\n await call?.revokePermissions(user.id, permissions);\n break;\n default:\n break;\n }\n setPermissionRequests((requests) =>\n requests.filter((r) => r !== request),\n );\n };\n };\n\n const { refs, x, y, strategy } = useFloatingUIPreset({\n placement: 'bottom',\n strategy: 'absolute',\n });\n\n // don't render anything if there are no permission requests\n if (permissionRequests.length === 0) return null;\n\n return (\n <div className=\"str-video__permission-requests\" ref={refs.setReference}>\n <div className=\"str-video__permission-requests__notification\">\n <span className=\"str-video__permission-requests__notification__message\">\n {permissionRequests.length} pending permission requests\n </span>\n <Button\n type=\"button\"\n onClick={() => {\n setExpanded((e) => !e);\n }}\n >\n {expanded ? 'Hide requests' : 'Show requests'}\n </Button>\n </div>\n {expanded && (\n <PermissionRequestList\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n permissionRequests={permissionRequests}\n handleUpdatePermission={handleUpdatePermission}\n />\n )}\n </div>\n );\n};\n\nexport type PermissionRequestListProps = ComponentProps<'div'> & {\n permissionRequests: PermissionRequestEvent[];\n handleUpdatePermission: HandleUpdatePermission;\n};\n\nexport const PermissionRequestList = forwardRef<\n HTMLDivElement,\n PermissionRequestListProps\n>(function PermissionRequestList(props, ref) {\n const { permissionRequests, handleUpdatePermission, ...rest } = props;\n\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__permission-requests-list\" ref={ref} {...rest}>\n {permissionRequests.map((request, reqIndex) => {\n const { user, permissions } = request;\n return (\n <Fragment key={`${user.id}/${reqIndex}`}>\n {permissions.map((permission) => (\n <div className=\"str-video__permission-request\" key={permission}>\n <div className=\"str-video__permission-request__message\">\n {messageForPermission(user.name || user.id, permission, t)}\n </div>\n <Button\n className=\"str-video__permission-request__button--allow\"\n type=\"button\"\n onClick={handleUpdatePermission(request, 'grant')}\n >\n {t('Allow')}\n </Button>\n <Button\n className=\"str-video__permission-request__button--reject\"\n type=\"button\"\n onClick={handleUpdatePermission(request, 'revoke')}\n >\n {t('Revoke')}\n </Button>\n <Button\n className=\"str-video__permission-request__button--reject\"\n type=\"button\"\n onClick={handleUpdatePermission(request, 'dismiss')}\n >\n {t('Dismiss')}\n </Button>\n </div>\n ))}\n </Fragment>\n );\n })}\n </div>\n );\n});\n\nconst Button = (\n props: PropsWithChildren<ButtonHTMLAttributes<HTMLButtonElement>>,\n) => {\n const { className, ...rest } = props;\n return (\n <button\n className={clsx('str-video__permission-request__button', className)}\n {...rest}\n />\n );\n};\n\nconst messageForPermission = (\n userName: string,\n permission: string,\n t: TranslatorFunction,\n) => {\n switch (permission) {\n case OwnCapability.SEND_AUDIO:\n return t('{{ userName }} is requesting to speak', { userName });\n case OwnCapability.SEND_VIDEO:\n return t('{{ userName }} is requesting to share their camera', {\n userName,\n });\n case OwnCapability.SCREENSHARE:\n return t('{{ userName }} is requesting to present their screen', {\n userName,\n });\n default:\n return t('{{ userName }} is requesting permission: {{ permission }}', {\n userName,\n permission,\n });\n }\n};\n","import { ElementType, HTMLProps, PropsWithChildren } from 'react';\nimport clsx from 'clsx';\n\nexport type StreamThemeProps = HTMLProps<HTMLElement> & {\n as?: ElementType;\n};\n\nexport const StreamTheme = ({\n as: Component = 'div',\n className,\n children,\n ...props\n}: PropsWithChildren<StreamThemeProps>) => {\n return (\n <Component {...props} className={clsx('str-video', className)}>\n {children}\n </Component>\n );\n};\n","import { ComponentType } from 'react';\nimport clsx from 'clsx';\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { BaseVideo } from '../../core/components/Video';\nimport { LoadingIndicator } from '../LoadingIndicator';\n\nconst DefaultDisabledVideoPreview = () => {\n const { t } = useI18n();\n return (\n <div className=\"str_video__video-preview__disabled-video-preview\">\n {t('Video is disabled')}\n </div>\n );\n};\n\nconst DefaultNoCameraPreview = () => {\n const { t } = useI18n();\n return (\n <div className=\"str_video__video-preview__no-camera-preview\">\n {t('No camera found')}\n </div>\n );\n};\n\nexport type VideoPreviewProps = {\n /**\n * Additional CSS class name to apply to the root element.\n */\n className?: string;\n /**\n * Enforces mirroring of the video on the X axis. Defaults to true.\n */\n mirror?: boolean;\n /**\n * Component rendered when user turns off the video.\n */\n DisabledVideoPreview?: ComponentType;\n /**\n * Component rendered when no camera devices are available.\n */\n NoCameraPreview?: ComponentType;\n /**\n * Component rendered above the BaseVideo until the video is ready (meaning until the play event is emitted).\n */\n StartingCameraPreview?: ComponentType;\n};\n\nexport const VideoPreview = ({\n className,\n mirror = true,\n DisabledVideoPreview = DefaultDisabledVideoPreview,\n NoCameraPreview = DefaultNoCameraPreview,\n StartingCameraPreview = LoadingIndicator,\n}: VideoPreviewProps) => {\n const { useCameraState } = useCallStateHooks();\n const { devices, status, isMute, mediaStream } = useCameraState();\n\n let contents;\n if (isMute && devices?.length === 0) {\n contents = <NoCameraPreview />;\n } else if (status === 'enabled') {\n const loading = !mediaStream;\n contents = (\n <>\n {mediaStream && (\n <BaseVideo\n stream={mediaStream}\n className={clsx('str-video__video-preview', {\n 'str-video__video-preview--mirror': mirror,\n 'str-video__video-preview--loading': loading,\n })}\n />\n )}\n {loading && <StartingCameraPreview />}\n </>\n );\n } else {\n contents = <DisabledVideoPreview />;\n }\n\n return (\n <div className={clsx('str-video__video-preview-container', className)}>\n {contents}\n </div>\n );\n};\n","import { ComponentType, forwardRef } from 'react';\nimport { Placement } from '@floating-ui/react';\nimport {\n hasAudio,\n hasPausedTrack,\n hasScreenShare,\n hasVideo,\n SfuModels,\n} from '@stream-io/video-client';\nimport { useCall, useI18n } from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\n\nimport {\n Icon,\n IconButton,\n MenuToggle,\n Notification,\n ToggleMenuButtonProps,\n} from '../../../components';\nimport { ParticipantActionsContextMenu as DefaultParticipantActionsContextMenu } from './ParticipantActionsContextMenu';\nimport { Reaction } from '../../../components/Reaction';\nimport { useParticipantViewContext } from './ParticipantViewContext';\n\nexport type DefaultParticipantViewUIProps = {\n /**\n * Turns on/off the status indicator icons (mute, connection quality, etc...).\n */\n indicatorsVisible?: boolean;\n /**\n * Placement of the context menu component when opened\n */\n menuPlacement?: Placement;\n /**\n * Option to show/hide menu button component\n */\n showMenuButton?: boolean;\n /**\n * Custom component to render the context menu\n */\n ParticipantActionsContextMenu?: ComponentType;\n};\n\nconst ToggleButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n function ToggleButton(props, ref) {\n return <IconButton enabled={props.menuShown} icon=\"ellipsis\" ref={ref} />;\n },\n);\n\nexport const DefaultScreenShareOverlay = () => {\n const call = useCall();\n const { t } = useI18n();\n\n const stopScreenShare = () => {\n call?.screenShare.disable().catch((err) => {\n console.error('Failed to stop screen sharing:', err);\n });\n };\n\n return (\n <div className=\"str-video__screen-share-overlay\">\n <Icon icon=\"screen-share-off\" />\n <span className=\"str-video__screen-share-overlay__title\">\n {t('You are presenting your screen')}\n </span>\n <button\n onClick={stopScreenShare}\n type=\"button\"\n className=\"str-video__screen-share-overlay__button\"\n >\n <Icon icon=\"close\" /> {t('Stop Screen Sharing')}\n </button>\n </div>\n );\n};\n\nexport const DefaultParticipantViewUI = ({\n indicatorsVisible = true,\n menuPlacement = 'bottom-start',\n showMenuButton = true,\n ParticipantActionsContextMenu = DefaultParticipantActionsContextMenu,\n}: DefaultParticipantViewUIProps) => {\n const { participant, trackType } = useParticipantViewContext();\n const isScreenSharing = hasScreenShare(participant);\n\n if (\n participant.isLocalParticipant &&\n isScreenSharing &&\n trackType === 'screenShareTrack'\n ) {\n return (\n <>\n <DefaultScreenShareOverlay />\n <ParticipantDetails indicatorsVisible={indicatorsVisible} />\n </>\n );\n }\n\n return (\n <>\n {showMenuButton && (\n <MenuToggle\n strategy=\"fixed\"\n placement={menuPlacement}\n ToggleButton={ToggleButton}\n >\n <ParticipantActionsContextMenu />\n </MenuToggle>\n )}\n <Reaction participant={participant} />\n <ParticipantDetails indicatorsVisible={indicatorsVisible} />\n </>\n );\n};\n\nexport const ParticipantDetails = ({\n indicatorsVisible = true,\n}: Pick<DefaultParticipantViewUIProps, 'indicatorsVisible'>) => {\n const { participant, trackType } = useParticipantViewContext();\n const {\n isLocalParticipant,\n connectionQuality,\n pin,\n sessionId,\n name,\n userId,\n } = participant;\n const call = useCall();\n\n const { t } = useI18n();\n const connectionQualityAsString =\n !!connectionQuality &&\n SfuModels.ConnectionQuality[connectionQuality].toLowerCase();\n\n const hasAudioTrack = hasAudio(participant);\n const hasVideoTrack = hasVideo(participant);\n const canUnpin = !!pin && pin.isLocalPin;\n const isTrackPaused =\n trackType !== 'none' ? hasPausedTrack(participant, trackType) : false;\n\n return (\n <>\n <div className=\"str-video__participant-details\">\n <span className=\"str-video__participant-details__name\">\n {name || userId}\n\n {indicatorsVisible && !hasAudioTrack && (\n <span className=\"str-video__participant-details__name--audio-muted\" />\n )}\n {indicatorsVisible && !hasVideoTrack && (\n <span className=\"str-video__participant-details__name--video-muted\" />\n )}\n {indicatorsVisible && isTrackPaused && (\n <span\n title={t('Video paused due to insufficient bandwidth')}\n className=\"str-video__participant-details__name--track-paused\"\n />\n )}\n {indicatorsVisible && canUnpin && (\n // TODO: remove this monstrosity once we have a proper design\n <span\n title={t('Unpin')}\n onClick={() => call?.unpin(sessionId)}\n className=\"str-video__participant-details__name--pinned\"\n />\n )}\n {indicatorsVisible && <SpeechIndicator />}\n </span>\n </div>\n {indicatorsVisible && (\n <Notification\n isVisible={\n isLocalParticipant &&\n connectionQuality === SfuModels.ConnectionQuality.POOR\n }\n message={t('Poor connection quality')}\n >\n {connectionQualityAsString && (\n <span\n className={clsx(\n 'str-video__participant-details__connection-quality',\n `str-video__participant-details__connection-quality--${connectionQualityAsString}`,\n )}\n title={connectionQualityAsString}\n />\n )}\n </Notification>\n )}\n </>\n );\n};\n\nexport const SpeechIndicator = () => {\n const { participant } = useParticipantViewContext();\n const { isSpeaking, isDominantSpeaker } = participant;\n return (\n <span\n className={clsx(\n 'str-video__speech-indicator',\n isSpeaking && 'str-video__speech-indicator--speaking',\n isDominantSpeaker && 'str-video__speech-indicator--dominant',\n )}\n >\n <span className=\"str-video__speech-indicator__bar\" />\n <span className=\"str-video__speech-indicator__bar\" />\n <span className=\"str-video__speech-indicator__bar\" />\n </span>\n );\n};\n","import {\n ComponentType,\n forwardRef,\n ReactElement,\n useMemo,\n useState,\n} from 'react';\nimport clsx from 'clsx';\nimport {\n hasAudio,\n hasScreenShareAudio,\n hasVideo,\n StreamVideoParticipant,\n VideoTrackType,\n} from '@stream-io/video-client';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\n\nimport { Audio } from '../Audio';\nimport { Video, VideoProps } from '../Video';\nimport { useTrackElementVisibility } from '../../hooks';\nimport { DefaultParticipantViewUI } from './DefaultParticipantViewUI';\nimport { applyElementToRef, isComponentType } from '../../../utilities';\nimport { ParticipantViewContext } from './ParticipantViewContext';\n\nexport type ParticipantViewProps = {\n /**\n * The participant whose video/audio stream we want to play.\n */\n participant: StreamVideoParticipant;\n\n /**\n * Override the default UI for rendering participant information/actions.\n * pass `null` if you wish to not render anything\n * @default DefaultParticipantViewUI\n */\n ParticipantViewUI?: ComponentType | ReactElement | null;\n\n /**\n * The kind of video stream to play for the given participant.\n * The default value is `videoTrack`.\n * You can use `none` if you're building an audio-only call.\n */\n trackType?: VideoTrackType | 'none';\n\n /**\n * Forces participant's video to be mirrored or unmirrored. By default, video track\n * from the local participant is mirrored, and all other videos are not mirrored.\n */\n mirror?: boolean;\n\n /**\n * This prop is only useful for advanced use-cases (for example, building your own layout).\n * When set to `true` it will mute the give participant's audio stream on the client side.\n * The local participant is always muted.\n */\n muteAudio?: boolean;\n\n /**\n * An object with set functions meant for exposing the video\n * and video placeholder elements to the integrators.\n * It's useful when you want to attach custom event handlers to these elements.\n * - `refs.setVideoElement`\n * - `refs.setVideoPlaceholderElement`\n */\n refs?: VideoProps['refs'];\n\n /**\n * Custom class applied to the root DOM element.\n */\n className?: string;\n} & Pick<VideoProps, 'VideoPlaceholder' | 'PictureInPicturePlaceholder'>;\n\nexport const ParticipantView = forwardRef<HTMLDivElement, ParticipantViewProps>(\n function ParticipantView(\n {\n participant,\n trackType = 'videoTrack',\n mirror,\n muteAudio,\n refs: { setVideoElement, setVideoPlaceholderElement } = {},\n className,\n VideoPlaceholder,\n PictureInPicturePlaceholder,\n ParticipantViewUI = DefaultParticipantViewUI as ComponentType,\n },\n ref,\n ) {\n const { isLocalParticipant, isSpeaking, isDominantSpeaker, sessionId } =\n participant;\n\n const hasAudioTrack = hasAudio(participant);\n const hasVideoTrack = hasVideo(participant);\n const hasScreenShareAudioTrack = hasScreenShareAudio(participant);\n\n const [trackedElement, setTrackedElement] = useState<HTMLDivElement | null>(\n null,\n );\n\n const [contextVideoElement, setContextVideoElement] =\n useState<HTMLVideoElement | null>(null);\n\n const [contextVideoPlaceholderElement, setContextVideoPlaceholderElement] =\n useState<HTMLDivElement | null>(null);\n\n // TODO: allow to pass custom ViewportTracker instance from props\n useTrackElementVisibility({\n sessionId,\n trackedElement,\n trackType,\n });\n\n const { useIncomingVideoSettings } = useCallStateHooks();\n const { isParticipantVideoEnabled } = useIncomingVideoSettings();\n\n const participantViewContextValue = useMemo(\n () => ({\n participant,\n participantViewElement: trackedElement,\n videoElement: contextVideoElement,\n videoPlaceholderElement: contextVideoPlaceholderElement,\n trackType,\n }),\n [\n contextVideoElement,\n contextVideoPlaceholderElement,\n participant,\n trackedElement,\n trackType,\n ],\n );\n\n const videoRefs: VideoProps['refs'] = useMemo(\n () => ({\n setVideoElement: (element) => {\n setVideoElement?.(element);\n setContextVideoElement(element);\n },\n setVideoPlaceholderElement: (element) => {\n setVideoPlaceholderElement?.(element);\n setContextVideoPlaceholderElement(element);\n },\n }),\n [setVideoElement, setVideoPlaceholderElement],\n );\n\n return (\n <div\n data-testid=\"participant-view\"\n ref={(element) => {\n applyElementToRef(ref, element);\n setTrackedElement(element);\n }}\n className={clsx(\n 'str-video__participant-view',\n isDominantSpeaker && 'str-video__participant-view--dominant-speaker',\n isSpeaking && 'str-video__participant-view--speaking',\n !hasVideoTrack && 'str-video__participant-view--no-video',\n !hasAudioTrack && 'str-video__participant-view--no-audio',\n className,\n )}\n >\n <ParticipantViewContext.Provider value={participantViewContextValue}>\n {/* mute the local participant, as we don't want to hear ourselves */}\n {!isLocalParticipant && !muteAudio && (\n <>\n {hasAudioTrack && (\n <Audio participant={participant} trackType=\"audioTrack\" />\n )}\n {hasScreenShareAudioTrack && (\n <Audio\n participant={participant}\n trackType=\"screenShareAudioTrack\"\n />\n )}\n </>\n )}\n <Video\n VideoPlaceholder={VideoPlaceholder}\n PictureInPicturePlaceholder={PictureInPicturePlaceholder}\n participant={participant}\n trackType={trackType}\n refs={videoRefs}\n enabled={\n isLocalParticipant ||\n trackType !== 'videoTrack' ||\n isParticipantVideoEnabled(participant.sessionId)\n }\n mirror={mirror}\n autoPlay\n />\n {isComponentType(ParticipantViewUI) ? (\n <ParticipantViewUI />\n ) : (\n ParticipantViewUI\n )}\n </ParticipantViewContext.Provider>\n </div>\n );\n },\n);\n\nParticipantView.displayName = 'ParticipantView';\n","import { ComponentType, PropsWithChildren } from 'react';\nimport {\n StreamCallProvider,\n StreamCallProviderProps,\n} from '@stream-io/video-react-bindings';\n\n// re-exporting the StreamCallProvider as StreamCall\nexport const StreamCall: ComponentType<\n PropsWithChildren<StreamCallProviderProps>\n> = StreamCallProvider;\n\nStreamCall.displayName = 'StreamCall';\n","import en from './en.json';\n\nexport const translations = { en };\n","import {\n StreamVideoProps,\n StreamVideoProvider,\n} from '@stream-io/video-react-bindings';\nimport { PropsWithChildren } from 'react';\nimport { translations } from '../../../translations';\n\nexport const StreamVideo = (props: PropsWithChildren<StreamVideoProps>) => {\n return (\n <StreamVideoProvider translationsOverrides={translations} {...props} />\n );\n};\n\nStreamVideo.displayName = 'StreamVideo';\n","export type Filter<T> =\n | { $and: Array<Filter<T>> }\n | { $or: Array<Filter<T>> }\n | { $not: Filter<T> }\n | Conditions<T>;\n\ntype Conditions<T> = {\n [K in keyof T]?: T[K] extends Array<infer E>\n ? ArrayOperator<E>\n : ScalarOperator<T[K]>;\n};\n\nexport type ScalarOperator<T> =\n | EqOperator<T>\n | NeqOperator<T>\n | InOperator<T>\n | GtOperator<T>\n | GteOperator<T>\n | LtOperator<T>\n | LteOperator<T>\n | T;\n\nexport type ArrayOperator<T> = ContainsOperator<T>;\n\nexport type AutocompleteOperator<T> = { $autocomplete: T };\nexport type EqOperator<T> = { $eq: T };\nexport type GtOperator<T> = { $gt: T };\nexport type GteOperator<T> = { $gte: T };\nexport type LtOperator<T> = { $lt: T };\nexport type LteOperator<T> = { $lte: T };\nexport type NeqOperator<T> = { $neq: T };\nexport type InOperator<T> = { $in: Array<T> };\nexport type ContainsOperator<T> = { $contains: T };\n\nexport function applyFilter<T>(obj: T, filter: Filter<T>): boolean {\n if ('$and' in filter) {\n return filter.$and.every((f) => applyFilter(obj, f));\n }\n\n if ('$or' in filter) {\n return filter.$or.some((f) => applyFilter(obj, f));\n }\n\n if ('$not' in filter) {\n return !applyFilter(obj, filter.$not);\n }\n\n return checkConditions(obj, filter);\n}\n\ntype DateString = string;\nconst isDateString = (value: unknown): value is DateString =>\n typeof value === 'string' &&\n /^((?:(\\d{4}-\\d{2}-\\d{2})T(\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?))(Z|[+-]\\d{2}:\\d{2})?)$/.test(\n value,\n );\n\nfunction checkConditions<T>(obj: T, conditions: Conditions<T>): boolean {\n let match = true;\n\n for (const key of Object.keys(conditions) as Array<keyof T>) {\n const operator = conditions[key];\n const maybeOperator = operator && typeof operator === 'object';\n let value: T[keyof T] | number = obj[key];\n\n if (value instanceof Date) {\n value = value.getTime();\n } else if (isDateString(value)) {\n value = new Date(value).getTime();\n }\n\n if (maybeOperator && '$eq' in operator) {\n const eqOperator = operator as EqOperator<typeof value>;\n const eqOperatorValue = isDateString(eqOperator.$eq)\n ? new Date(eqOperator.$eq).getTime()\n : eqOperator.$eq;\n match &&= eqOperatorValue === value;\n } else if (maybeOperator && '$neq' in operator) {\n const neqOperator = operator as NeqOperator<typeof value>;\n match &&= neqOperator.$neq !== value;\n } else if (maybeOperator && '$in' in operator) {\n const inOperator = operator as InOperator<typeof value>;\n match &&= inOperator.$in.includes(value);\n } else if (maybeOperator && '$contains' in operator) {\n if (Array.isArray(value)) {\n const containsOperator = operator as ContainsOperator<\n (typeof value)[number]\n >;\n match &&= value.includes(containsOperator.$contains);\n } else {\n match = false;\n }\n } else if (maybeOperator && '$gt' in operator) {\n const gtOperator = operator as GtOperator<typeof value>;\n const gtOperatorValue = isDateString(gtOperator.$gt)\n ? new Date(gtOperator.$gt).getTime()\n : gtOperator.$gt;\n match &&= value > gtOperatorValue;\n } else if (maybeOperator && '$gte' in operator) {\n const gteOperator = operator as GteOperator<typeof value>;\n const gteOperatorValue = isDateString(gteOperator.$gte)\n ? new Date(gteOperator.$gte).getTime()\n : gteOperator.$gte;\n match &&= value >= gteOperatorValue;\n } else if (maybeOperator && '$lt' in operator) {\n const ltOperator = operator as LtOperator<typeof value>;\n const ltOperatorValue = isDateString(ltOperator.$lt)\n ? new Date(ltOperator.$lt).getTime()\n : ltOperator.$lt;\n match &&= value < ltOperatorValue;\n } else if (maybeOperator && '$lte' in operator) {\n const lteOperator = operator as LteOperator<typeof value>;\n const lteOperatorValue = isDateString(lteOperator.$lte)\n ? new Date(lteOperator.$lte).getTime()\n : lteOperator.$lte;\n match &&= value <= lteOperatorValue;\n // } else if (maybeOperator && '$autocomplete' in operator) {\n // TODO: regexp solution maybe?\n // match &&= false;\n } else {\n const eqValue = operator as typeof value;\n match &&= eqValue === value;\n }\n\n if (!match) {\n return false;\n }\n }\n\n return true;\n}\n","import { useEffect, useMemo } from 'react';\nimport {\n Call,\n CallTypes,\n combineComparators,\n Comparator,\n defaultSortPreset,\n hasAudio,\n hasScreenShare,\n hasVideo,\n isPinned,\n paginatedLayoutSortPreset,\n screenSharing,\n speakerLayoutSortPreset,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { applyFilter, Filter } from '../../../utilities/filter';\n\nexport type FilterableParticipant = Pick<\n StreamVideoParticipant,\n 'userId' | 'isSpeaking' | 'isDominantSpeaker' | 'name' | 'roles'\n> & {\n isPinned: boolean;\n hasVideo: boolean;\n hasAudio: boolean;\n hasScreenShare: boolean;\n};\n\nexport type ParticipantFilter = Filter<FilterableParticipant>;\nexport type ParticipantPredicate = (\n participant: StreamVideoParticipant,\n) => boolean;\n\nexport const useFilteredParticipants = ({\n excludeLocalParticipant = false,\n filterParticipants,\n}: {\n excludeLocalParticipant?: boolean;\n filterParticipants?: ParticipantFilter | ParticipantPredicate;\n}) => {\n const { useParticipants, useRemoteParticipants } = useCallStateHooks();\n const allParticipants = useParticipants();\n const remoteParticipants = useRemoteParticipants();\n return useMemo(() => {\n const unfilteredParticipants = excludeLocalParticipant\n ? remoteParticipants\n : allParticipants;\n\n return filterParticipants\n ? applyParticipantsFilter(unfilteredParticipants, filterParticipants)\n : unfilteredParticipants;\n }, [\n allParticipants,\n remoteParticipants,\n excludeLocalParticipant,\n filterParticipants,\n ]);\n};\n\nexport const applyParticipantsFilter = (\n participants: StreamVideoParticipant[],\n filter: ParticipantPredicate | ParticipantFilter,\n) => {\n const filterCallback =\n typeof filter === 'function'\n ? filter\n : (participant: StreamVideoParticipant) =>\n applyFilter(\n {\n userId: participant.userId,\n isSpeaking: participant.isSpeaking,\n isDominantSpeaker: participant.isDominantSpeaker,\n name: participant.name,\n roles: participant.roles,\n isPinned: isPinned(participant),\n hasVideo: hasVideo(participant),\n hasAudio: hasAudio(participant),\n hasScreenShare: hasScreenShare(participant),\n },\n filter,\n );\n\n return participants.filter(filterCallback);\n};\n\nexport const usePaginatedLayoutSortPreset = (call: Call | undefined) => {\n useEffect(() => {\n if (!call) return;\n call.setSortParticipantsBy(paginatedLayoutSortPreset);\n return () => {\n resetSortPreset(call);\n };\n }, [call]);\n};\n\nexport const useSpeakerLayoutSortPreset = (\n call: Call | undefined,\n isOneOnOneCall: boolean,\n) => {\n useEffect(() => {\n if (!call) return;\n // always show the remote participant in the spotlight\n if (isOneOnOneCall) {\n call.setSortParticipantsBy(combineComparators(screenSharing, loggedIn));\n } else {\n call.setSortParticipantsBy(speakerLayoutSortPreset);\n }\n return () => {\n resetSortPreset(call);\n };\n }, [call, isOneOnOneCall]);\n};\n\nexport const useRawRemoteParticipants = () => {\n const { useRawParticipants } = useCallStateHooks();\n const rawParticipants = useRawParticipants();\n return useMemo(\n () => rawParticipants.filter((p) => !p.isLocalParticipant),\n [rawParticipants],\n );\n};\n\nconst resetSortPreset = (call: Call) => {\n // reset the sorting to the default for the call type\n const callConfig = CallTypes.get(call.type);\n call.setSortParticipantsBy(\n callConfig.options.sortParticipantsBy || defaultSortPreset,\n );\n};\n\nconst loggedIn: Comparator<StreamVideoParticipant> = (a, b) => {\n if (a.isLocalParticipant) return 1;\n if (b.isLocalParticipant) return -1;\n return 0;\n};\n","import clsx from 'clsx';\nimport {\n ComponentType,\n ReactElement,\n useCallback,\n useEffect,\n useState,\n} from 'react';\nimport {\n useCall,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport { hasScreenShare } from '@stream-io/video-client';\nimport { ParticipantView, useParticipantViewContext } from '../ParticipantView';\nimport { ParticipantsAudio } from '../Audio';\nimport {\n usePaginatedLayoutSortPreset,\n useRawRemoteParticipants,\n} from './hooks';\n\n/**\n * The props for the {@link LivestreamLayout} component.\n */\nexport type LivestreamLayoutProps = {\n /**\n * Whether the livestream is muted. Defaults to `false`.\n */\n muted?: boolean;\n\n /**\n * Whether to show the participant count. Defaults to `true`.\n */\n showParticipantCount?: boolean;\n\n /**\n * Whether to enable fullscreen mode. Defaults to `true`.\n */\n enableFullScreen?: boolean;\n\n /**\n * Whether to show the duration of the call. Defaults to `true`.\n */\n showDuration?: boolean;\n\n /**\n * Whether to show the live badge. Defaults to `true`.\n */\n showLiveBadge?: boolean;\n\n /**\n * Whether to show the speaker name. Defaults to `false`.\n */\n showSpeakerName?: boolean;\n\n /**\n * When set to `false` disables mirroring of the local participant's video.\n * @default true\n */\n mirrorLocalParticipantVideo?: boolean;\n\n /**\n * The props to pass to the floating participant element.\n */\n floatingParticipantProps?: LivestreamLayoutProps & {\n /**\n * The position of the floating participant element. Defaults to `top-right`.\n */\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n };\n\n /**\n * Override the default participant view overlay UI.\n */\n ParticipantViewUI?: ComponentType | ReactElement | null;\n};\n\nexport const LivestreamLayout = (props: LivestreamLayoutProps) => {\n const { useParticipants, useHasOngoingScreenShare } = useCallStateHooks();\n const call = useCall();\n const participants = useParticipants();\n const [currentSpeaker] = participants;\n const remoteParticipants = useRawRemoteParticipants();\n const hasOngoingScreenShare = useHasOngoingScreenShare();\n const presenter = hasOngoingScreenShare\n ? participants.find(hasScreenShare)\n : undefined;\n\n usePaginatedLayoutSortPreset(call);\n\n const { floatingParticipantProps, muted, ParticipantViewUI } = props;\n const overlay = ParticipantViewUI ?? (\n <ParticipantOverlay\n showParticipantCount={props.showParticipantCount}\n showDuration={props.showDuration}\n showLiveBadge={props.showLiveBadge}\n showSpeakerName={props.showSpeakerName}\n enableFullScreen={props.enableFullScreen}\n />\n );\n\n const floatingParticipantOverlay =\n hasOngoingScreenShare &&\n (ParticipantViewUI ?? (\n <ParticipantOverlay\n // these elements aren't needed for the video feed\n showParticipantCount={\n floatingParticipantProps?.showParticipantCount ?? false\n }\n showDuration={floatingParticipantProps?.showDuration ?? false}\n showLiveBadge={floatingParticipantProps?.showLiveBadge ?? false}\n showSpeakerName={floatingParticipantProps?.showSpeakerName ?? true}\n enableFullScreen={floatingParticipantProps?.enableFullScreen ?? true}\n />\n ));\n\n return (\n <div className=\"str-video__livestream-layout__wrapper\">\n {!muted && <ParticipantsAudio participants={remoteParticipants} />}\n {hasOngoingScreenShare && presenter && (\n <ParticipantView\n className=\"str-video__livestream-layout__screen-share\"\n participant={presenter}\n ParticipantViewUI={overlay}\n trackType=\"screenShareTrack\"\n muteAudio // audio is rendered by ParticipantsAudio\n />\n )}\n {currentSpeaker && (\n <ParticipantView\n className={clsx(\n hasOngoingScreenShare &&\n clsx(\n 'str-video__livestream-layout__floating-participant',\n `str-video__livestream-layout__floating-participant--${\n floatingParticipantProps?.position ?? 'top-right'\n }`,\n ),\n )}\n participant={currentSpeaker}\n ParticipantViewUI={floatingParticipantOverlay || overlay}\n mirror={\n props.mirrorLocalParticipantVideo !== false ? undefined : false\n }\n muteAudio // audio is rendered by ParticipantsAudio\n />\n )}\n </div>\n );\n};\n\nLivestreamLayout.displayName = 'LivestreamLayout';\n\n/**\n * The props for the {@link LivestreamLayout} component.\n */\nexport type BackstageLayoutProps = {\n /**\n * Whether to show the counter for participants that joined before\n * the livestream went live. Defaults to `true`.\n */\n showEarlyParticipantCount?: boolean;\n};\n\nexport const BackstageLayout = (props: BackstageLayoutProps) => {\n const { showEarlyParticipantCount = true } = props;\n const { useParticipantCount, useCallStartsAt } = useCallStateHooks();\n const participantCount = useParticipantCount();\n const startsAt = useCallStartsAt();\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__livestream-layout__wrapper\">\n <div className=\"str-video__livestream-layout__backstage\">\n {startsAt && (\n <span className=\"str-video__livestream-layout__starts-at\">\n {startsAt.getTime() < Date.now()\n ? t('Livestream starts soon')\n : t('Livestream starts at {{ startsAt }}', { startsAt })}\n </span>\n )}\n {showEarlyParticipantCount && (\n <span className=\"str-video__livestream-layout__early-viewers-count\">\n {t('{{ count }} participants joined early', {\n count: participantCount,\n })}\n </span>\n )}\n </div>\n </div>\n );\n};\n\nBackstageLayout.displayName = 'BackstageLayout';\n\nconst ParticipantOverlay = (props: {\n enableFullScreen?: boolean;\n showParticipantCount?: boolean;\n showDuration?: boolean;\n showLiveBadge?: boolean;\n showSpeakerName?: boolean;\n}) => {\n const {\n enableFullScreen = true,\n showParticipantCount = true,\n showDuration = true,\n showLiveBadge = true,\n showSpeakerName = false,\n } = props;\n const overlayBarVisible =\n enableFullScreen ||\n showParticipantCount ||\n showDuration ||\n showLiveBadge ||\n showSpeakerName;\n const { participant } = useParticipantViewContext();\n const { useParticipantCount } = useCallStateHooks();\n const participantCount = useParticipantCount();\n const duration = useUpdateCallDuration();\n const toggleFullScreen = useToggleFullScreen();\n const { t } = useI18n();\n return (\n <div className=\"str-video__livestream-layout__overlay\">\n {overlayBarVisible && (\n <div className=\"str-video__livestream-layout__overlay__bar\">\n {showLiveBadge && (\n <span className=\"str-video__livestream-layout__live-badge\">\n {t('Live')}\n </span>\n )}\n {showParticipantCount && (\n <span className=\"str-video__livestream-layout__viewers-count\">\n {participantCount}\n </span>\n )}\n {showSpeakerName && (\n <span\n className=\"str-video__livestream-layout__speaker-name\"\n title={participant.name || participant.userId || ''}\n >\n {participant.name || participant.userId || ''}\n </span>\n )}\n {showDuration && (\n <span className=\"str-video__livestream-layout__duration\">\n {formatDuration(duration)}\n </span>\n )}\n {enableFullScreen && (\n <span\n className=\"str-video__livestream-layout__go-fullscreen\"\n onClick={toggleFullScreen}\n />\n )}\n </div>\n )}\n </div>\n );\n};\n\nconst useUpdateCallDuration = () => {\n const { useIsCallLive, useCallSession } = useCallStateHooks();\n const isCallLive = useIsCallLive();\n const session = useCallSession();\n const [duration, setDuration] = useState(() => {\n if (!session || !session.live_started_at) return 0;\n const liveStartTime = new Date(session.live_started_at);\n const now = new Date();\n return Math.floor((now.getTime() - liveStartTime.getTime()) / 1000);\n });\n\n useEffect(() => {\n if (!isCallLive) return;\n const interval = setInterval(() => {\n setDuration((d) => d + 1);\n }, 1000);\n return () => {\n clearInterval(interval);\n };\n }, [isCallLive]);\n\n return duration;\n};\n\nconst useToggleFullScreen = () => {\n const { participantViewElement } = useParticipantViewContext();\n const [isFullscreen, setIsFullscreen] = useState(\n !!document.fullscreenElement,\n );\n useEffect(() => {\n const handler = () => setIsFullscreen(!!document.fullscreenElement);\n document.addEventListener('fullscreenchange', handler);\n return () => {\n document.removeEventListener('fullscreenchange', handler);\n };\n }, []);\n return useCallback(() => {\n if (isFullscreen) {\n document.exitFullscreen().catch((err) => {\n console.error('Failed to exit fullscreen', err);\n });\n } else {\n participantViewElement?.requestFullscreen().catch((err) => {\n console.error('Failed to enter fullscreen', err);\n });\n }\n }, [isFullscreen, participantViewElement]);\n};\n\nconst formatDuration = (durationInMs: number) => {\n const days = Math.floor(durationInMs / 86400);\n const hours = Math.floor(durationInMs / 3600);\n const minutes = Math.floor((durationInMs % 3600) / 60);\n const seconds = durationInMs % 60;\n\n return `${days ? days + ' ' : ''}${hours ? hours + ':' : ''}${\n minutes < 10 ? '0' : ''\n }${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;\n};\n","import { useEffect, useMemo, useState } from 'react';\nimport { useCall } from '@stream-io/video-react-bindings';\nimport { StreamVideoParticipant } from '@stream-io/video-client';\nimport clsx from 'clsx';\n\nimport {\n DefaultParticipantViewUI,\n ParticipantView,\n ParticipantViewProps,\n} from '../ParticipantView';\nimport { ParticipantsAudio } from '../Audio';\nimport { IconButton } from '../../../components';\nimport { chunk } from '../../../utilities';\nimport {\n ParticipantFilter,\n ParticipantPredicate,\n useFilteredParticipants,\n usePaginatedLayoutSortPreset,\n useRawRemoteParticipants,\n} from './hooks';\n\nconst GROUP_SIZE = 16;\n\ntype PaginatedGridLayoutGroupProps = {\n /**\n * The group of participants to render.\n */\n group: Array<StreamVideoParticipant>;\n} & Pick<\n ParticipantViewProps,\n 'VideoPlaceholder' | 'PictureInPicturePlaceholder' | 'mirror'\n> &\n Required<Pick<ParticipantViewProps, 'ParticipantViewUI'>>;\n\nconst PaginatedGridLayoutGroup = ({\n group,\n mirror,\n VideoPlaceholder,\n PictureInPicturePlaceholder,\n ParticipantViewUI,\n}: PaginatedGridLayoutGroupProps) => {\n return (\n <div\n className={clsx('str-video__paginated-grid-layout__group', {\n 'str-video__paginated-grid-layout--one': group.length === 1,\n 'str-video__paginated-grid-layout--two-four':\n group.length >= 2 && group.length <= 4,\n 'str-video__paginated-grid-layout--five-nine':\n group.length >= 5 && group.length <= 9,\n })}\n >\n {group.map((participant) => (\n <ParticipantView\n key={participant.sessionId}\n participant={participant}\n muteAudio\n mirror={mirror}\n VideoPlaceholder={VideoPlaceholder}\n PictureInPicturePlaceholder={PictureInPicturePlaceholder}\n ParticipantViewUI={ParticipantViewUI}\n />\n ))}\n </div>\n );\n};\n\nexport type PaginatedGridLayoutProps = {\n /**\n * The number of participants to display per page.\n */\n groupSize?: number;\n\n /**\n * Whether to exclude the local participant from the grid.\n * @default false\n */\n excludeLocalParticipant?: boolean;\n\n /**\n * Predicate to filter call participants or a filter object.\n * @example\n * // With a predicate:\n * <PaginatedGridLayout\n * filterParticipants={p => p.roles.includes('student')}\n * />\n * @example\n * // With a filter object:\n * <PaginatedGridLayout\n * filterParticipants={{\n * $or: [\n * { roles: { $contains: 'student' } },\n * { isPinned: true },\n * ],\n * }}\n * />\n */\n filterParticipants?: ParticipantPredicate | ParticipantFilter;\n\n /**\n * When set to `false` disables mirroring of the local partipant's video.\n * @default true\n */\n mirrorLocalParticipantVideo?: boolean;\n\n /**\n * Turns on/off the pagination arrows.\n * @default true\n */\n pageArrowsVisible?: boolean;\n\n /**\n * Whether the layout is muted. Defaults to `false`.\n */\n muted?: boolean;\n} & Pick<\n ParticipantViewProps,\n 'ParticipantViewUI' | 'VideoPlaceholder' | 'PictureInPicturePlaceholder'\n>;\n\nexport const PaginatedGridLayout = (props: PaginatedGridLayoutProps) => {\n const {\n groupSize = (props.groupSize || 0) > 0\n ? props.groupSize || GROUP_SIZE\n : GROUP_SIZE,\n excludeLocalParticipant = false,\n filterParticipants,\n mirrorLocalParticipantVideo = true,\n pageArrowsVisible = true,\n VideoPlaceholder,\n ParticipantViewUI = DefaultParticipantViewUI,\n PictureInPicturePlaceholder,\n muted,\n } = props;\n const [page, setPage] = useState(0);\n const [\n paginatedGridLayoutWrapperElement,\n setPaginatedGridLayoutWrapperElement,\n ] = useState<HTMLDivElement | null>(null);\n\n const call = useCall();\n const remoteParticipants = useRawRemoteParticipants();\n const participants = useFilteredParticipants({\n excludeLocalParticipant,\n filterParticipants,\n });\n\n usePaginatedLayoutSortPreset(call);\n\n useEffect(() => {\n if (!paginatedGridLayoutWrapperElement || !call) return;\n\n const cleanup = call.setViewport(paginatedGridLayoutWrapperElement);\n\n return () => cleanup();\n }, [paginatedGridLayoutWrapperElement, call]);\n\n // only used to render video elements\n const participantGroups = useMemo(\n () => chunk(participants, groupSize),\n [participants, groupSize],\n );\n\n const pageCount = participantGroups.length;\n\n // update page when page count is reduced and selected page no longer exists\n useEffect(() => {\n if (page > pageCount - 1) {\n setPage(Math.max(0, pageCount - 1));\n }\n }, [page, pageCount]);\n\n const selectedGroup = participantGroups[page];\n const mirror = mirrorLocalParticipantVideo ? undefined : false;\n\n if (!call) return null;\n\n return (\n <div\n className=\"str-video__paginated-grid-layout__wrapper\"\n ref={setPaginatedGridLayoutWrapperElement}\n >\n {!muted && <ParticipantsAudio participants={remoteParticipants} />}\n <div className=\"str-video__paginated-grid-layout\">\n {pageArrowsVisible && pageCount > 1 && (\n <IconButton\n icon=\"caret-left\"\n disabled={page === 0}\n onClick={() =>\n setPage((currentPage) => Math.max(0, currentPage - 1))\n }\n />\n )}\n {selectedGroup && (\n <PaginatedGridLayoutGroup\n group={selectedGroup}\n mirror={mirror}\n VideoPlaceholder={VideoPlaceholder}\n ParticipantViewUI={ParticipantViewUI}\n PictureInPicturePlaceholder={PictureInPicturePlaceholder}\n />\n )}\n {pageArrowsVisible && pageCount > 1 && (\n <IconButton\n disabled={page === pageCount - 1}\n icon=\"caret-right\"\n onClick={() =>\n setPage((currentPage) => Math.min(pageCount - 1, currentPage + 1))\n }\n />\n )}\n </div>\n </div>\n );\n};\n\nPaginatedGridLayout.displayName = 'PaginatedGridLayout';\n","import { useEffect, useState } from 'react';\n\nexport const useCalculateHardLimit = (\n /**\n * Element that stretches to 100% of the whole layout component\n */\n wrapperElement: HTMLDivElement | null,\n /**\n * Element that directly hosts individual `ParticipantView` (or wrapper) elements\n */\n hostElement: HTMLDivElement | null,\n limit?: 'dynamic' | number,\n) => {\n const [calculatedLimit, setCalculatedLimit] = useState<{\n vertical: number | null;\n horizontal: number | null;\n }>({\n vertical: typeof limit === 'number' ? limit : null,\n horizontal: typeof limit === 'number' ? limit : null,\n });\n\n useEffect(() => {\n if (\n !hostElement ||\n !wrapperElement ||\n typeof limit === 'number' ||\n typeof limit === 'undefined'\n )\n return;\n\n let childWidth: number | null = null;\n let childHeight: number | null = null;\n\n const resizeObserver = new ResizeObserver((entries, observer) => {\n // this part should ideally run as little times as possible\n // get child measurements and disconnect\n // does not consider dynamically sized children\n // this hook is for SpeakerLayout use only, where children in the bar are fixed size\n if (entries.length > 1) {\n const child = hostElement.firstChild as HTMLElement | null;\n\n if (child) {\n childHeight = child.clientHeight;\n childWidth = child.clientWidth;\n observer.unobserve(hostElement);\n }\n }\n\n // keep the state at { vertical: 1, horizontal: 1 }\n // until we get the proper child measurements\n if (childHeight === null || childWidth === null) return;\n\n const vertical = Math.floor(wrapperElement.clientHeight / childHeight);\n const horizontal = Math.floor(wrapperElement.clientWidth / childWidth);\n\n setCalculatedLimit((pv) => {\n if (pv.vertical !== vertical || pv.horizontal !== horizontal)\n return { vertical, horizontal };\n return pv;\n });\n });\n\n resizeObserver.observe(wrapperElement);\n resizeObserver.observe(hostElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [hostElement, limit, wrapperElement]);\n\n return calculatedLimit;\n};\n","import { useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport { hasScreenShare } from '@stream-io/video-client';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nimport {\n DefaultParticipantViewUI,\n ParticipantView,\n ParticipantViewProps,\n} from '../ParticipantView';\nimport { IconButton } from '../../../components';\nimport {\n useHorizontalScrollPosition,\n useVerticalScrollPosition,\n} from '../../../hooks';\nimport {\n ParticipantFilter,\n ParticipantPredicate,\n useFilteredParticipants,\n useRawRemoteParticipants,\n useSpeakerLayoutSortPreset,\n} from './hooks';\nimport { useCalculateHardLimit } from '../../hooks/useCalculateHardLimit';\nimport { ParticipantsAudio } from '../Audio';\n\nexport type SpeakerLayoutProps = {\n /**\n * The UI to be used for the participant in the spotlight.\n */\n ParticipantViewUISpotlight?: ParticipantViewProps['ParticipantViewUI'];\n\n /**\n * The UI to be used for the participants in the participants bar.\n */\n ParticipantViewUIBar?: ParticipantViewProps['ParticipantViewUI'];\n\n /**\n * The position of the participants who are not in focus.\n * Providing `null` will hide the bar.\n */\n participantsBarPosition?: 'top' | 'bottom' | 'left' | 'right' | null;\n\n /**\n * Hard limits the number of the participants rendered in the participants bar.\n * Providing string `dynamic` will calculate hard limit based on screen width/height.\n */\n participantsBarLimit?: 'dynamic' | number;\n\n /**\n * When set to `true` will exclude the local participant from layout.\n * @default false\n */\n excludeLocalParticipant?: boolean;\n\n /**\n * Predicate to filter call participants or a filter object.\n * @example\n * // With a predicate:\n * <SpeakerLayout\n * filterParticipants={p => p.roles.includes('student')}\n * />\n * @example\n * // With a filter object:\n * <SpeakerLayout\n * filterParticipants={{\n * $or: [\n * { roles: { $contains: 'student' } },\n * { isPinned: true },\n * ],\n * }}\n * />\n */\n filterParticipants?: ParticipantPredicate | ParticipantFilter;\n\n /**\n * When set to `false` disables mirroring of the local participant's video.\n * @default true\n */\n mirrorLocalParticipantVideo?: boolean;\n\n /**\n * Turns on/off the pagination arrows.\n * @default true\n */\n pageArrowsVisible?: boolean;\n\n /**\n * Whether the layout is muted. Defaults to `false`.\n */\n muted?: boolean;\n} & Pick<\n ParticipantViewProps,\n 'VideoPlaceholder' | 'PictureInPicturePlaceholder'\n>;\n\nconst DefaultParticipantViewUIBar = () => (\n <DefaultParticipantViewUI menuPlacement=\"top-end\" />\n);\n\nexport const SpeakerLayout = ({\n ParticipantViewUIBar = DefaultParticipantViewUIBar,\n ParticipantViewUISpotlight = DefaultParticipantViewUI,\n VideoPlaceholder,\n PictureInPicturePlaceholder,\n participantsBarPosition = 'bottom',\n participantsBarLimit,\n mirrorLocalParticipantVideo = true,\n excludeLocalParticipant = false,\n filterParticipants,\n pageArrowsVisible = true,\n muted,\n}: SpeakerLayoutProps) => {\n const call = useCall();\n const { useParticipants } = useCallStateHooks();\n const allParticipants = useParticipants();\n const remoteParticipants = useRawRemoteParticipants();\n const [participantInSpotlight, ...otherParticipants] =\n useFilteredParticipants({ excludeLocalParticipant, filterParticipants });\n const [participantsBarWrapperElement, setParticipantsBarWrapperElement] =\n useState<HTMLDivElement | null>(null);\n const [participantsBarElement, setParticipantsBarElement] =\n useState<HTMLDivElement | null>(null);\n const [buttonsWrapperElement, setButtonsWrapperElement] =\n useState<HTMLDivElement | null>(null);\n\n const isSpeakerScreenSharing =\n participantInSpotlight && hasScreenShare(participantInSpotlight);\n const hardLimit = useCalculateHardLimit(\n buttonsWrapperElement,\n participantsBarElement,\n participantsBarLimit,\n );\n\n const isVertical =\n participantsBarPosition === 'left' || participantsBarPosition === 'right';\n const isHorizontal =\n participantsBarPosition === 'top' || participantsBarPosition === 'bottom';\n\n useEffect(() => {\n if (!participantsBarWrapperElement || !call) return;\n\n const cleanup = call.setViewport(participantsBarWrapperElement);\n\n return () => cleanup();\n }, [participantsBarWrapperElement, call]);\n\n const isOneOnOneCall = allParticipants.length === 2;\n useSpeakerLayoutSortPreset(call, isOneOnOneCall);\n\n let participantsWithAppliedLimit = otherParticipants;\n\n const hardLimitToApply = isVertical\n ? hardLimit.vertical\n : hardLimit.horizontal;\n\n if (\n typeof participantsBarLimit !== 'undefined' &&\n hardLimitToApply !== null\n ) {\n participantsWithAppliedLimit = otherParticipants.slice(\n 0,\n // subtract 1 if speaker is sharing screen as\n // that one is rendered independently from otherParticipants array\n hardLimitToApply - (isSpeakerScreenSharing ? 1 : 0),\n );\n }\n\n const mirror = mirrorLocalParticipantVideo ? undefined : false;\n\n if (!call) return null;\n\n const renderParticipantsBar =\n participantsBarPosition &&\n (participantsWithAppliedLimit.length > 0 || isSpeakerScreenSharing);\n return (\n <div className=\"str-video__speaker-layout__wrapper\">\n {!muted && <ParticipantsAudio participants={remoteParticipants} />}\n <div\n className={clsx(\n 'str-video__speaker-layout',\n participantsBarPosition &&\n `str-video__speaker-layout--variant-${participantsBarPosition}`,\n )}\n >\n <div className=\"str-video__speaker-layout__spotlight\">\n {participantInSpotlight && (\n <ParticipantView\n participant={participantInSpotlight}\n muteAudio={true}\n mirror={mirror}\n trackType={\n isSpeakerScreenSharing ? 'screenShareTrack' : 'videoTrack'\n }\n ParticipantViewUI={ParticipantViewUISpotlight}\n VideoPlaceholder={VideoPlaceholder}\n PictureInPicturePlaceholder={PictureInPicturePlaceholder}\n />\n )}\n </div>\n {renderParticipantsBar && (\n <div\n ref={setButtonsWrapperElement}\n className=\"str-video__speaker-layout__participants-bar-buttons-wrapper\"\n >\n <div\n className=\"str-video__speaker-layout__participants-bar-wrapper\"\n ref={setParticipantsBarWrapperElement}\n >\n <div\n ref={setParticipantsBarElement}\n className=\"str-video__speaker-layout__participants-bar\"\n >\n {isSpeakerScreenSharing && (\n <div\n className=\"str-video__speaker-layout__participant-tile\"\n key={participantInSpotlight.sessionId}\n >\n <ParticipantView\n participant={participantInSpotlight}\n ParticipantViewUI={ParticipantViewUIBar}\n VideoPlaceholder={VideoPlaceholder}\n PictureInPicturePlaceholder={PictureInPicturePlaceholder}\n mirror={mirror}\n muteAudio={true}\n />\n </div>\n )}\n {participantsWithAppliedLimit.map((participant) => (\n <div\n className=\"str-video__speaker-layout__participant-tile\"\n key={participant.sessionId}\n >\n <ParticipantView\n participant={participant}\n ParticipantViewUI={ParticipantViewUIBar}\n VideoPlaceholder={VideoPlaceholder}\n PictureInPicturePlaceholder={PictureInPicturePlaceholder}\n mirror={mirror}\n muteAudio={true}\n />\n </div>\n ))}\n </div>\n </div>\n {pageArrowsVisible && isVertical && (\n <VerticalScrollButtons\n scrollWrapper={participantsBarWrapperElement}\n />\n )}\n {pageArrowsVisible && isHorizontal && (\n <HorizontalScrollButtons\n scrollWrapper={participantsBarWrapperElement}\n />\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nSpeakerLayout.displayName = 'SpeakerLayout';\n\ntype ScrollButtonsProps<T extends HTMLElement> = {\n scrollWrapper: T | null;\n};\n\nconst HorizontalScrollButtons = <T extends HTMLElement>({\n scrollWrapper,\n}: ScrollButtonsProps<T>) => {\n const scrollPosition = useHorizontalScrollPosition(scrollWrapper);\n\n const scrollStartClickHandler = () => {\n scrollWrapper?.scrollBy({ left: -150, behavior: 'smooth' });\n };\n\n const scrollEndClickHandler = () => {\n scrollWrapper?.scrollBy({ left: 150, behavior: 'smooth' });\n };\n return (\n <>\n {scrollPosition && scrollPosition !== 'start' && (\n <IconButton\n onClick={scrollStartClickHandler}\n icon=\"caret-left\"\n className=\"str-video__speaker-layout__participants-bar--button-left\"\n />\n )}\n {scrollPosition && scrollPosition !== 'end' && (\n <IconButton\n onClick={scrollEndClickHandler}\n icon=\"caret-right\"\n className=\"str-video__speaker-layout__participants-bar--button-right\"\n />\n )}\n </>\n );\n};\n\nconst VerticalScrollButtons = <T extends HTMLElement>({\n scrollWrapper,\n}: ScrollButtonsProps<T>) => {\n const scrollPosition = useVerticalScrollPosition(scrollWrapper);\n\n const scrollTopClickHandler = () => {\n scrollWrapper?.scrollBy({ top: -150, behavior: 'smooth' });\n };\n\n const scrollBottomClickHandler = () => {\n scrollWrapper?.scrollBy({ top: 150, behavior: 'smooth' });\n };\n return (\n <>\n {scrollPosition && scrollPosition !== 'top' && (\n <IconButton\n onClick={scrollTopClickHandler}\n icon=\"caret-up\"\n className=\"str-video__speaker-layout__participants-bar--button-top\"\n />\n )}\n {scrollPosition && scrollPosition !== 'bottom' && (\n <IconButton\n onClick={scrollBottomClickHandler}\n icon=\"caret-down\"\n className=\"str-video__speaker-layout__participants-bar--button-bottom\"\n />\n )}\n </>\n );\n};\n","import { useCall, useI18n } from '@stream-io/video-react-bindings';\nimport { useEffect, useState } from 'react';\n\nimport { hasScreenShare } from '@stream-io/video-client';\nimport { Icon } from '../../../components';\nimport { ParticipantsAudio } from '../Audio';\nimport {\n DefaultParticipantViewUI,\n ParticipantView,\n ParticipantViewProps,\n} from '../ParticipantView';\nimport {\n ParticipantFilter,\n ParticipantPredicate,\n useFilteredParticipants,\n usePaginatedLayoutSortPreset,\n useRawRemoteParticipants,\n} from './hooks';\n\nexport type PipLayoutProps = {\n /**\n * Whether to exclude the local participant from the grid.\n * @default false\n */\n excludeLocalParticipant?: boolean;\n\n /**\n * Predicate to filter call participants or a filter object.\n * @example\n * // With a predicate:\n * <PipLayout\n * filterParticipants={p => p.roles.includes('student')}\n * />\n * @example\n * // With a filter object:\n * <PipLayout\n * filterParticipants={{\n * $or: [\n * { roles: { $contains: 'student' } },\n * { isPinned: true },\n * ],\n * }}\n * />\n */\n filterParticipants?: ParticipantPredicate | ParticipantFilter;\n\n /**\n * When set to `false` disables mirroring of the local partipant's video.\n * @default true\n */\n mirrorLocalParticipantVideo?: boolean;\n} & Pick<ParticipantViewProps, 'ParticipantViewUI' | 'VideoPlaceholder'>;\n\nconst Pip = (props: PipLayoutProps) => {\n const { t } = useI18n();\n const {\n excludeLocalParticipant = false,\n filterParticipants,\n mirrorLocalParticipantVideo = true,\n VideoPlaceholder,\n ParticipantViewUI = DefaultParticipantViewUI,\n } = props;\n const [layoutWrapperElement, setLayoutWrapperElement] =\n useState<HTMLDivElement | null>(null);\n\n const call = useCall();\n const participants = useFilteredParticipants({\n excludeLocalParticipant,\n filterParticipants,\n });\n const screenSharingParticipant = participants.find((p) => hasScreenShare(p));\n\n usePaginatedLayoutSortPreset(call);\n\n useEffect(() => {\n if (!layoutWrapperElement || !call) return;\n return call.setViewport(layoutWrapperElement);\n }, [layoutWrapperElement, call]);\n\n const mirror = mirrorLocalParticipantVideo ? undefined : false;\n\n if (!call) return null;\n\n return (\n <div className=\"str-video__pip-layout\" ref={setLayoutWrapperElement}>\n {screenSharingParticipant &&\n (screenSharingParticipant.isLocalParticipant ? (\n <div className=\"str-video__pip-screen-share-local\">\n <Icon icon=\"screen-share-off\" />\n <span className=\"str-video__pip-screen-share-local__title\">\n {t('You are presenting your screen')}\n </span>\n </div>\n ) : (\n <ParticipantView\n participant={screenSharingParticipant}\n trackType=\"screenShareTrack\"\n muteAudio\n mirror={false}\n VideoPlaceholder={VideoPlaceholder}\n ParticipantViewUI={ParticipantViewUI}\n />\n ))}\n {participants.map((participant) => (\n <ParticipantView\n key={participant.sessionId}\n participant={participant}\n muteAudio\n mirror={mirror}\n VideoPlaceholder={VideoPlaceholder}\n ParticipantViewUI={ParticipantViewUI}\n />\n ))}\n </div>\n );\n};\n\nPip.displayName = 'PipLayout.Pip';\n\nconst Host = () => {\n const remoteParticipants = useRawRemoteParticipants();\n return <ParticipantsAudio participants={remoteParticipants} />;\n};\n\nHost.displayName = 'PipLayout.Host';\n\nexport const PipLayout = { Pip, Host };\n","import { PropsWithChildren, useEffect, useState } from 'react';\nimport { Call, CallingState } from '@stream-io/video-client';\nimport {\n useCall,\n useCallStateHooks,\n useEffectEvent,\n useStreamVideoClient,\n} from '@stream-io/video-react-bindings';\nimport {\n BackstageLayout,\n BackstageLayoutProps,\n LivestreamLayout,\n LivestreamLayoutProps,\n StreamCall,\n} from '../../core';\n\nexport type LivestreamPlayerProps = {\n /**\n * The call type. Usually `livestream`.\n */\n callType: string;\n /**\n * The call ID.\n */\n callId: string;\n /**\n * Determines when the viewer joins the call.\n *\n * `\"asap\"` behavior means joining the call as soon as it is possible\n * (either the `join_ahead_time_seconds` setting allows it, or the user\n * has the capability to join backstage).\n *\n * `\"live\"` behavior means joining the call when it goes live.\n *\n * @default \"asap\"\n */\n joinBehavior?: 'asap' | 'live';\n /**\n * The props for the {@link LivestreamLayout} component.\n */\n layoutProps?: LivestreamLayoutProps;\n /**\n * The props for the {@link BackstageLayout} component.\n */\n backstageProps?: BackstageLayoutProps;\n /**\n * Callback to handle errors while fetching or joining livestream.\n */\n onError?: (error: any) => void;\n};\n\nexport const LivestreamPlayer = (\n props: PropsWithChildren<LivestreamPlayerProps>,\n) => {\n const { callType, callId, children, ...restProps } = props;\n const client = useStreamVideoClient();\n const [call, setCall] = useState<Call>();\n const onError = useEffectEvent(props.onError ?? (() => {}));\n\n useEffect(() => {\n if (!client) return;\n const myCall = client.call(callType, callId);\n setCall(myCall);\n myCall.get().catch((e) => {\n console.error('Failed to fetch call', e);\n onError(e);\n });\n return () => {\n myCall.leave().catch((e) => {\n console.error('Failed to leave call', e);\n });\n setCall(undefined);\n };\n }, [callId, callType, client]);\n\n if (!call) {\n return null;\n }\n\n return (\n <StreamCall call={call}>\n <LivestreamCall {...restProps} />\n {children}\n </StreamCall>\n );\n};\n\nconst LivestreamCall = (props: {\n joinBehavior?: 'asap' | 'live';\n layoutProps?: LivestreamLayoutProps;\n backstageProps?: BackstageLayoutProps;\n onError?: (error: any) => void;\n}) => {\n const call = useLivestreamCall(props);\n const { useIsCallLive } = useCallStateHooks();\n const isLive = useIsCallLive();\n\n if (!call) return null;\n\n if (isLive) {\n return <LivestreamLayout {...props.layoutProps} />;\n }\n\n return <BackstageLayout {...props.backstageProps} />;\n};\n\nconst useLivestreamCall = (props: {\n joinBehavior?: 'asap' | 'live';\n onError?: (error: any) => void;\n}) => {\n const call = useCall();\n const { useIsCallLive, useOwnCapabilities } = useCallStateHooks();\n const canJoinLive = useIsCallLive();\n const canJoinEarly = useCanJoinEarly();\n const canJoinBackstage =\n useOwnCapabilities()?.includes('join-backstage') ?? false;\n const canJoinAsap = canJoinLive || canJoinEarly || canJoinBackstage;\n const joinBehavior = props.joinBehavior ?? 'asap';\n const canJoin =\n (joinBehavior === 'asap' && canJoinAsap) ||\n (joinBehavior === 'live' && canJoinLive);\n const onError = useEffectEvent(props.onError ?? (() => {}));\n\n useEffect(() => {\n if (call && call.state.callingState === CallingState.IDLE && canJoin) {\n call.join().catch((e) => {\n console.error('Failed to join call', e);\n onError(e);\n });\n }\n }, [call, canJoin]);\n\n return call;\n};\n\nconst useCanJoinEarly = () => {\n const { useCallStartsAt, useCallSettings } = useCallStateHooks();\n const startsAt = useCallStartsAt();\n const settings = useCallSettings();\n const joinAheadTimeSeconds = settings?.backstage.join_ahead_time_seconds;\n const [canJoinEarly, setCanJoinEarly] = useState(() =>\n checkCanJoinEarly(startsAt, joinAheadTimeSeconds),\n );\n\n useEffect(() => {\n if (!canJoinEarly) {\n const handle = setInterval(() => {\n setCanJoinEarly(checkCanJoinEarly(startsAt, joinAheadTimeSeconds));\n }, 1000);\n\n return () => clearInterval(handle);\n }\n }, [canJoinEarly, startsAt, joinAheadTimeSeconds]);\n\n return canJoinEarly;\n};\n\nconst checkCanJoinEarly = (\n startsAt: Date | undefined,\n joinAheadTimeSeconds: number | undefined,\n) => {\n if (!startsAt) {\n return false;\n }\n\n return Date.now() >= +startsAt - (joinAheadTimeSeconds ?? 0) * 1000;\n};\n","import { setSdkInfo, SfuModels } from '@stream-io/video-client';\n\nexport * from '@stream-io/video-client';\nexport * from '@stream-io/video-react-bindings';\n\nexport * from './src/core';\n\nexport * from './src/components';\nexport * from './src/wrappers';\nexport * from './src/translations';\nexport {\n useHorizontalScrollPosition,\n useVerticalScrollPosition,\n useRequestPermission,\n usePersistedDevicePreferences,\n useDeviceList,\n} from './src/hooks';\nexport { applyFilter, type Filter } from './src/utilities/filter';\n\nconst [major, minor, patch] = (\n process.env.PKG_VERSION || '0.0.0-development'\n).split('.');\n\nsetSdkInfo({\n type: SfuModels.SdkType.REACT,\n major,\n minor,\n patch,\n});\n"],"names":["useCall","useState","useEffect","_jsx","hasAudio","hasScreenShareAudio","_jsxs","Fragment","createContext","useContext","useFloating","offset","shift","flip","size","autoUpdate","useCallStateHooks","CallingState","useCallback","useI18n","useMemo","MenuVisualType","_Fragment","FloatingOverlay","FloatingPortal","useRef","hasVideo","hasScreenShare","Restricted","OwnCapability","isValidElement","forwardRef","Browsers","Video","useLayoutEffect","VisibilityState","hasPausedTrack","PerformanceDegradationReason","isPlatformSupported","isMediaPipePlatformSupported","loadTFLite","loadMediaPipe","flushSync","VirtualBackground","createRenderer","disposeOfMediaStream","useToggleCallRecording","arrow","FloatingArrow","createSoundDetector","useListNavigation","useTypeahead","useClick","useDismiss","useRole","useInteractions","FloatingFocusManager","FloatingList","useListItem","lazy","Suspense","useHover","SfuModels","isPinned","ToggleButton","useConnectedUser","LoadingIndicator","DefaultLoadingIndicator","name","CallRecordingListHeader","DefaultCallRecordingListHeader","CallRecordingListItem","DefaultCallRecordingListItem","DefaultEmptyCallRecordingList","DefaultLoadingCallRecordingList","NoiseCancellationSettingsModeEnum","ParticipantActionsContextMenu","DefaultParticipantActionsContextMenu","StreamCallProvider","StreamVideoProvider","paginatedLayoutSortPreset","combineComparators","screenSharing","speakerLayoutSortPreset","CallTypes","defaultSortPreset","useStreamVideoClient","useEffectEvent","setSdkInfo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../src/core/components/Audio/Audio.tsx","../../src/core/components/Audio/ParticipantsAudio.tsx","../../src/core/components/ParticipantView/ParticipantViewContext.tsx","../../src/hooks/useFloatingUIPreset.ts","../../src/hooks/usePersistedDevicePreferences.ts","../../src/hooks/useScrollPosition.ts","../../src/hooks/useRequestPermission.ts","../../src/hooks/useDeviceList.tsx","../../src/components/Menu/MenuToggle.tsx","../../src/components/Menu/GenericMenu.tsx","../../src/components/Icon/Icon.tsx","../../src/core/hooks/usePictureInPictureState.ts","../../src/core/components/ParticipantView/ParticipantActionsContextMenu.tsx","../../src/utilities/isComponentType.ts","../../src/utilities/chunk.ts","../../src/utilities/applyElementToRef.ts","../../src/core/components/Video/BaseVideo.tsx","../../src/core/components/Video/BaseVideoPlaceholder.tsx","../../src/core/components/Video/DefaultVideoPlaceholder.tsx","../../src/core/components/Video/DefaultPictureInPicturePlaceholder.tsx","../../src/core/components/Video/Video.tsx","../../src/core/hooks/useTrackElementVisibility.ts","../../src/components/Avatar/Avatar.tsx","../../src/components/BackgroundFilters/BackgroundFilters.tsx","../../src/components/Button/IconButton.tsx","../../src/components/Button/CompositeButton.tsx","../../src/components/Button/TextButton.tsx","../../src/components/CallControls/AcceptCallButton.tsx","../../src/components/Notification/Notification.tsx","../../src/components/Notification/PermissionNotification.tsx","../../src/components/Notification/SpeakingWhileMutedNotification.tsx","../../src/components/Notification/RecordingInProgressNotification.tsx","../../src/components/LoadingIndicator/LoadingIndicator.tsx","../../src/components/Tooltip/Tooltip.tsx","../../src/components/Tooltip/hooks/useEnterLeaveHandlers.ts","../../src/components/Tooltip/WithTooltip.tsx","../../src/components/CallControls/RecordCallButton.tsx","../../src/components/Reaction/Reaction.tsx","../../src/components/CallControls/ReactionsButton.tsx","../../src/utilities/callControlHandler.ts","../../src/components/CallControls/ScreenShareButton.tsx","../../src/components/DeviceSettings/AudioVolumeIndicator.tsx","../../src/components/DropdownSelect/DropdownSelect.tsx","../../src/components/DeviceSettings/DeviceSelector.tsx","../../src/components/DeviceSettings/SpeakerTest.tsx","../../src/components/DeviceSettings/DeviceSelectorAudio.tsx","../../src/components/DeviceSettings/DeviceSelectorVideo.tsx","../../src/components/DeviceSettings/DeviceSettings.tsx","../../src/components/CallControls/ToggleAudioButton.tsx","../../src/components/CallControls/ToggleVideoButton.tsx","../../src/components/CallControls/CancelCallButton.tsx","../../src/components/CallControls/CallControls.tsx","../../src/components/CallStats/CallStats.tsx","../../src/components/CallControls/CallStatsButton.tsx","../../src/components/CallControls/ToggleAudioOutputButton.tsx","../../src/components/CallParticipantsList/BlockedUserListing.tsx","../../src/components/CallParticipantsList/CallParticipantListHeader.tsx","../../src/components/CallParticipantsList/CallParticipantListingItem.tsx","../../src/components/CallParticipantsList/CallParticipantListing.tsx","../../src/components/CallParticipantsList/EmptyParticipantSearchList.tsx","../../src/components/Search/SearchInput.tsx","../../src/components/Search/SearchResults.tsx","../../src/components/Search/hooks/useSearch.ts","../../src/components/CallParticipantsList/CallParticipantsList.tsx","../../src/components/CallPreview/CallPreview.tsx","../../src/components/CallRecordingList/CallRecordingListHeader.tsx","../../src/components/CallRecordingList/CallRecordingListItem.tsx","../../src/components/CallRecordingList/EmptyCallRecordingListing.tsx","../../src/components/CallRecordingList/LoadingCallRecordingListing.tsx","../../src/components/CallRecordingList/CallRecordingList.tsx","../../src/components/NoiseCancellation/NoiseCancellationProvider.tsx","../../src/components/RingingCall/RingingCallControls.tsx","../../src/components/RingingCall/RingingCall.tsx","../../src/components/Permissions/PermissionRequests.tsx","../../src/components/StreamTheme/StreamTheme.tsx","../../src/components/VideoPreview/VideoPreview.tsx","../../src/core/components/ParticipantView/DefaultParticipantViewUI.tsx","../../src/core/components/ParticipantView/ParticipantView.tsx","../../src/core/components/StreamCall/StreamCall.tsx","../../src/translations/index.ts","../../src/core/components/StreamVideo/StreamVideo.tsx","../../src/utilities/filter.ts","../../src/core/components/CallLayout/hooks.ts","../../src/core/components/CallLayout/LivestreamLayout.tsx","../../src/core/components/CallLayout/PaginatedGridLayout.tsx","../../src/core/hooks/useCalculateHardLimit.ts","../../src/core/components/CallLayout/SpeakerLayout.tsx","../../src/core/components/CallLayout/PipLayout.tsx","../../src/wrappers/LivestreamPlayer/LivestreamPlayer.tsx","../../index.ts"],"sourcesContent":["import { ComponentPropsWithoutRef, useEffect, useState } from 'react';\nimport {\n AudioTrackType,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type AudioProps = ComponentPropsWithoutRef<'audio'> & {\n /**\n * The participant whose audio stream we want to play.\n */\n participant: StreamVideoParticipant;\n\n /**\n * The type of audio stream to play for the given participant.\n * The default value is `audioTrack`.\n */\n trackType?: AudioTrackType;\n};\n\nexport const Audio = ({\n participant,\n trackType = 'audioTrack',\n ...rest\n}: AudioProps) => {\n const call = useCall();\n const [audioElement, setAudioElement] = useState<HTMLAudioElement | null>(\n null,\n );\n const { userId, sessionId } = participant;\n\n useEffect(() => {\n if (!call || !audioElement) return;\n const cleanup = call.bindAudioElement(audioElement, sessionId, trackType);\n return () => {\n cleanup?.();\n };\n }, [call, sessionId, audioElement, trackType]);\n\n return (\n <audio\n autoPlay\n {...rest}\n ref={setAudioElement}\n data-user-id={userId}\n data-session-id={sessionId}\n data-track-type={trackType}\n />\n );\n};\n\nAudio.displayName = 'Audio';\n","import { ComponentProps, Fragment } from 'react';\nimport {\n hasAudio,\n hasScreenShareAudio,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport { Audio } from './Audio';\n\nexport type ParticipantsAudioProps = {\n /**\n * The participants to play audio for.\n */\n participants: StreamVideoParticipant[];\n\n /**\n * Props to pass to the underlying `Audio` components.\n */\n audioProps?: ComponentProps<typeof Audio>;\n};\n\nexport const ParticipantsAudio = (props: ParticipantsAudioProps) => {\n const { participants, audioProps } = props;\n return (\n <>\n {participants.map((participant) => {\n if (participant.isLocalParticipant) return null;\n const { audioStream, screenShareAudioStream, sessionId } = participant;\n\n const hasAudioTrack = hasAudio(participant);\n const audioTrackElement = hasAudioTrack && audioStream && (\n <Audio\n {...audioProps}\n trackType=\"audioTrack\"\n participant={participant}\n />\n );\n\n const hasScreenShareAudioTrack = hasScreenShareAudio(participant);\n const screenShareAudioTrackElement = hasScreenShareAudioTrack &&\n screenShareAudioStream && (\n <Audio\n {...audioProps}\n trackType=\"screenShareAudioTrack\"\n participant={participant}\n />\n );\n\n return (\n <Fragment key={sessionId}>\n {audioTrackElement}\n {screenShareAudioTrackElement}\n </Fragment>\n );\n })}\n </>\n );\n};\n\nParticipantsAudio.displayName = 'ParticipantsAudio';\n","import { createContext, useContext } from 'react';\nimport { ParticipantViewProps } from './ParticipantView';\n\nexport type ParticipantViewContextValue = Required<\n Pick<ParticipantViewProps, 'participant' | 'trackType'>\n> & {\n participantViewElement?: HTMLDivElement | null;\n videoElement?: HTMLVideoElement | null;\n videoPlaceholderElement?: HTMLDivElement | null;\n};\n\nexport const ParticipantViewContext = createContext<\n ParticipantViewContextValue | undefined\n>(undefined);\n\nexport const useParticipantViewContext = () =>\n useContext(ParticipantViewContext) as ParticipantViewContextValue;\n","import { useEffect } from 'react';\nimport type { UseFloatingOptions } from '@floating-ui/react';\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n size,\n useFloating,\n} from '@floating-ui/react';\n\nexport const useFloatingUIPreset = ({\n middleware = [],\n placement,\n strategy,\n offset: offsetInPx = 10,\n}: Pick<UseFloatingOptions, 'placement' | 'strategy' | 'middleware'> & {\n offset?: number;\n}) => {\n const {\n refs,\n x,\n y,\n update,\n elements: { domReference, floating },\n context,\n } = useFloating({\n placement,\n strategy,\n middleware: [\n offset(offsetInPx),\n shift(),\n flip(),\n size({\n padding: 10,\n apply: ({ availableHeight, elements }) => {\n Object.assign(elements.floating.style, {\n maxHeight: `${availableHeight}px`,\n });\n },\n }),\n ...middleware,\n ],\n });\n\n // handle window resizing\n useEffect(() => {\n if (!domReference || !floating) return;\n\n const cleanup = autoUpdate(domReference, floating, update);\n\n return () => cleanup();\n }, [domReference, floating, update]);\n\n return { refs, x, y, domReference, floating, strategy, context };\n};\n","import { useEffect, useState } from 'react';\nimport { CallingState, InputDeviceStatus } from '@stream-io/video-client';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport type LocalDevicePreference = {\n selectedDeviceId: string;\n selectedDeviceLabel: string;\n muted?: boolean;\n};\n\nexport type LocalDevicePreferences = {\n // Array is preference history with latest preferences first.\n // Single preference still acceptable for backwards compatibility.\n [type in DeviceKey]?: LocalDevicePreference | LocalDevicePreference[];\n};\n\ntype DeviceKey = 'microphone' | 'camera' | 'speaker';\n\ntype DeviceState<K extends DeviceKey> = {\n [ManagerKey in K]: DeviceManagerLike;\n} & {\n isMute?: boolean;\n devices: MediaDeviceInfo[];\n selectedDevice: string | undefined;\n};\n\ninterface DeviceManagerLike {\n state: { selectedDevice: string | undefined; status?: InputDeviceStatus };\n select: (deviceId: string) => Promise<void> | void;\n enable?: () => Promise<void>;\n disable?: () => Promise<void>;\n}\n\nconst defaultDevice = 'default';\n\n/**\n * This hook will apply and persist the device preferences from local storage.\n *\n * @param key the key to use for local storage.\n */\nexport const usePersistedDevicePreferences = (\n key: string = '@stream-io/device-preferences',\n): void => {\n const {\n useCallSettings,\n useCallCallingState,\n useMicrophoneState,\n useCameraState,\n useSpeakerState,\n } = useCallStateHooks();\n const settings = useCallSettings();\n const callingState = useCallCallingState();\n\n const microphoneState: DeviceState<'microphone'> = useMicrophoneState();\n const cameraState: DeviceState<'camera'> = useCameraState();\n const speakerState: DeviceState<'speaker'> = useSpeakerState();\n\n const [applyingState, setApplyingState] = useState<\n 'idle' | 'applying' | 'applied'\n >('idle');\n\n // when the camera is disabled on call type level, we should discard\n // any stored camera preferences.\n const cameraDevices = settings?.video?.enabled ? cameraState.devices : false;\n useEffect(\n function apply() {\n if (\n callingState === CallingState.LEFT ||\n microphoneState.devices.length === 0 ||\n (Array.isArray(cameraDevices) && cameraDevices.length === 0) ||\n speakerState.devices.length === 0 ||\n !settings ||\n applyingState !== 'idle'\n ) {\n return;\n }\n\n setApplyingState('applying');\n\n (async () => {\n const { audio, video } = settings;\n for (const [deviceKey, state, defaultMuted, enabledInCallType] of [\n ['microphone', microphoneState, !audio.mic_default_on, true],\n ['camera', cameraState, !video.camera_default_on, video.enabled],\n ['speaker', speakerState, false, true],\n ] as const) {\n const preferences = parseLocalDevicePreferences(key);\n const preference = preferences[deviceKey];\n const manager = (\n state as DeviceState<'camera' | 'microphone' | 'speaker'>\n )[deviceKey];\n\n const applyPromise = preference\n ? applyLocalDevicePreference(\n manager,\n [preference].flat(),\n deviceKey === 'camera' ? cameraDevices || [] : state.devices,\n enabledInCallType,\n )\n : applyMutedState(manager, defaultMuted, enabledInCallType);\n\n await applyPromise.catch((err) => {\n console.warn(\n `Failed to apply ${deviceKey} device preferences`,\n err,\n );\n });\n }\n })().finally(() =>\n setApplyingState((state) => (state === 'applying' ? 'applied' : state)),\n );\n },\n [\n applyingState,\n callingState,\n cameraState,\n cameraDevices,\n key,\n microphoneState,\n microphoneState.devices,\n settings,\n speakerState,\n speakerState.devices,\n ],\n );\n\n useEffect(\n function persist() {\n if (callingState === CallingState.LEFT || applyingState !== 'applied') {\n return;\n }\n\n for (const [deviceKey, devices, selectedDevice, isMute] of [\n [\n 'camera',\n cameraDevices || [],\n cameraState.selectedDevice,\n cameraState.isMute,\n ],\n [\n 'microphone',\n microphoneState.devices,\n microphoneState.selectedDevice,\n microphoneState.isMute,\n ],\n [\n 'speaker',\n speakerState.devices,\n speakerState.selectedDevice,\n speakerState.isMute,\n ],\n ] as const) {\n try {\n patchLocalDevicePreference(key, deviceKey, {\n devices,\n selectedDevice,\n isMute,\n });\n } catch (err) {\n console.warn(`Failed to save ${deviceKey} device preferences`, err);\n }\n }\n },\n [\n applyingState,\n callingState,\n cameraDevices,\n cameraState.isMute,\n cameraState.selectedDevice,\n key,\n microphoneState.devices,\n microphoneState.isMute,\n microphoneState.selectedDevice,\n speakerState.devices,\n speakerState.isMute,\n speakerState.selectedDevice,\n ],\n );\n};\n\n// const usePersistedDevicePreference = <K extends DeviceKey>(\n// key: string,\n// deviceKey: K,\n// state: DeviceState<K>,\n// defaultMuted?: boolean,\n// ): void => {\n// const { useCallCallingState } = useCallStateHooks();\n// const callingState = useCallCallingState();\n// const [applyingState, setApplyingState] = useState<\n// 'idle' | 'applying' | 'applied'\n// >('idle');\n// const manager = state[deviceKey];\n\n// useEffect(\n// function apply() {\n// if (\n// callingState === CallingState.LEFT ||\n// !state.devices?.length ||\n// typeof defaultMuted !== 'boolean' ||\n// applyingState !== 'idle'\n// ) {\n// return;\n// }\n\n// const preferences = parseLocalDevicePreferences(key);\n// const preference = preferences[deviceKey];\n\n// setApplyingState('applying');\n\n// if (!manager.state.selectedDevice) {\n// const applyPromise = preference\n// ? applyLocalDevicePreference(\n// manager,\n// [preference].flat(),\n// state.devices,\n// )\n// : applyMutedState(manager, defaultMuted);\n\n// applyPromise\n// .catch((err) => {\n// console.warn(\n// `Failed to apply ${deviceKey} device preferences`,\n// err,\n// );\n// })\n// .finally(() => setApplyingState('applied'));\n// } else {\n// setApplyingState('applied');\n// }\n// },\n// [\n// applyingState,\n// callingState,\n// defaultMuted,\n// deviceKey,\n// key,\n// manager,\n// state.devices,\n// ],\n// );\n\n// useEffect(\n// function persist() {\n// if (\n// callingState === CallingState.LEFT ||\n// !state.devices?.length ||\n// applyingState !== 'applied'\n// ) {\n// return;\n// }\n\n// try {\n// patchLocalDevicePreference(key, deviceKey, {\n// devices: state.devices,\n// selectedDevice: state.selectedDevice,\n// isMute: state.isMute,\n// });\n// } catch (err) {\n// console.warn(`Failed to save ${deviceKey} device preferences`, err);\n// }\n// },\n// [\n// applyingState,\n// callingState,\n// deviceKey,\n// key,\n// state.devices,\n// state.isMute,\n// state.selectedDevice,\n// ],\n// );\n// };\n\nconst parseLocalDevicePreferences = (key: string): LocalDevicePreferences => {\n const preferencesStr = window.localStorage.getItem(key);\n let preferences: LocalDevicePreferences = {};\n\n if (preferencesStr) {\n try {\n preferences = JSON.parse(preferencesStr);\n\n if (Object.hasOwn(preferences, 'mic')) {\n // for backwards compatibility\n preferences.microphone = (\n preferences as { mic: LocalDevicePreference }\n ).mic;\n }\n } catch {\n /* assume preferences are empty */\n }\n }\n\n return preferences;\n};\n\nconst patchLocalDevicePreference = (\n key: string,\n deviceKey: DeviceKey,\n state: Pick<DeviceState<never>, 'devices' | 'selectedDevice' | 'isMute'>,\n): void => {\n const preferences = parseLocalDevicePreferences(key);\n const nextPreference = getSelectedDevicePreference(\n state.devices,\n state.selectedDevice,\n );\n const preferenceHistory = [preferences[deviceKey] ?? []]\n .flat()\n .filter(\n (p) =>\n p.selectedDeviceId !== nextPreference.selectedDeviceId &&\n (p.selectedDeviceLabel === '' ||\n p.selectedDeviceLabel !== nextPreference.selectedDeviceLabel),\n );\n\n window.localStorage.setItem(\n key,\n JSON.stringify({\n ...preferences,\n mic: undefined, // for backwards compatibility\n [deviceKey]: [\n {\n ...nextPreference,\n muted: state.isMute,\n } satisfies LocalDevicePreference,\n ...preferenceHistory,\n ].slice(0, 3),\n }),\n );\n};\n\nconst applyLocalDevicePreference = async (\n manager: DeviceManagerLike,\n preference: LocalDevicePreference[],\n devices: MediaDeviceInfo[],\n enabledInCallType: boolean,\n): Promise<void> => {\n let muted: boolean | undefined;\n\n for (const p of preference) {\n muted ??= p.muted;\n\n if (p.selectedDeviceId === defaultDevice) {\n break;\n }\n\n const device =\n devices.find((d) => d.deviceId === p.selectedDeviceId) ??\n devices.find((d) => d.label === p.selectedDeviceLabel);\n\n if (device) {\n if (!manager.state.selectedDevice) {\n await manager.select(device.deviceId);\n }\n\n muted = p.muted;\n break;\n }\n }\n\n if (typeof muted === 'boolean') {\n await applyMutedState(manager, muted, enabledInCallType);\n }\n};\n\nconst applyMutedState = async (\n manager: DeviceManagerLike,\n muted: boolean,\n enabledInCallType: boolean,\n) => {\n if (enabledInCallType && !manager.state.status) {\n await manager[muted ? 'disable' : 'enable']?.();\n }\n};\n\nconst getSelectedDevicePreference = (\n devices: MediaDeviceInfo[],\n selectedDevice: string | undefined,\n): Pick<LocalDevicePreference, 'selectedDeviceId' | 'selectedDeviceLabel'> => ({\n selectedDeviceId: selectedDevice || defaultDevice,\n selectedDeviceLabel:\n devices?.find((d) => d.deviceId === selectedDevice)?.label ?? '',\n});\n","import { useEffect, useState } from 'react';\n\nconst SCROLL_THRESHOLD = 10;\n\n/**\n * Hook which observes element's scroll position and returns text value based on the\n * position of the scrollbar (`top`, `bottom`, `between` and `null` if no scrollbar is available)\n */\nexport const useVerticalScrollPosition = (\n scrollElement: HTMLElement | null,\n threshold: number = SCROLL_THRESHOLD,\n) => {\n const [scrollPosition, setScrollPosition] = useState<\n 'top' | 'bottom' | 'between' | null\n >(null);\n\n useEffect(() => {\n if (!scrollElement) return;\n\n const scrollHandler = () => {\n const element = scrollElement;\n\n const hasVerticalScrollbar = element.scrollHeight > element.clientHeight;\n\n if (!hasVerticalScrollbar) return setScrollPosition(null);\n\n const isAtTheTop = element.scrollTop <= threshold;\n if (isAtTheTop) return setScrollPosition('top');\n\n const isAtTheBottom =\n Math.abs(\n element.scrollHeight - element.scrollTop - element.clientHeight,\n ) <= threshold;\n\n if (isAtTheBottom) return setScrollPosition('bottom');\n\n setScrollPosition('between');\n };\n\n const resizeObserver = new ResizeObserver(scrollHandler);\n resizeObserver.observe(scrollElement);\n\n scrollElement.addEventListener('scroll', scrollHandler);\n return () => {\n scrollElement.removeEventListener('scroll', scrollHandler);\n resizeObserver.disconnect();\n };\n }, [scrollElement, threshold]);\n\n return scrollPosition;\n};\n\nexport const useHorizontalScrollPosition = (\n scrollElement: HTMLElement | null,\n threshold: number = SCROLL_THRESHOLD,\n) => {\n const [scrollPosition, setScrollPosition] = useState<\n 'start' | 'end' | 'between' | null\n >(null);\n\n useEffect(() => {\n if (!scrollElement) return;\n\n const scrollHandler = () => {\n const element = scrollElement;\n\n const hasHorizontalScrollbar = element.scrollWidth > element.clientWidth;\n\n if (!hasHorizontalScrollbar) return setScrollPosition(null);\n\n const isAtTheStart = element.scrollLeft <= threshold;\n if (isAtTheStart) return setScrollPosition('start');\n\n const isAtTheEnd =\n Math.abs(\n element.scrollWidth - element.scrollLeft - element.clientWidth,\n ) <= threshold;\n\n if (isAtTheEnd) return setScrollPosition('end');\n\n setScrollPosition('between');\n };\n\n const resizeObserver = new ResizeObserver(scrollHandler);\n resizeObserver.observe(scrollElement);\n\n scrollElement.addEventListener('scroll', scrollHandler);\n return () => {\n scrollElement.removeEventListener('scroll', scrollHandler);\n resizeObserver.disconnect();\n };\n }, [scrollElement, threshold]);\n\n return scrollPosition;\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport { OwnCapability } from '@stream-io/video-client';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport const useRequestPermission = (permission: OwnCapability) => {\n const call = useCall();\n const { useHasPermissions } = useCallStateHooks();\n const hasPermission = useHasPermissions(permission);\n const [isAwaitingPermission, setIsAwaitingPermission] = useState(false); // TODO: load with possibly pending state\n\n useEffect(() => {\n const reset = () => setIsAwaitingPermission(false);\n\n if (hasPermission) reset();\n }, [hasPermission]);\n\n const requestPermission = useCallback(async () => {\n if (hasPermission) return true;\n\n const canRequestPermission =\n !!call?.permissionsContext.canRequest(permission);\n if (isAwaitingPermission || !canRequestPermission) return false;\n\n setIsAwaitingPermission(true);\n\n try {\n await call?.requestPermissions({\n permissions: [permission],\n });\n } catch (error) {\n setIsAwaitingPermission(false);\n throw new Error(`requestPermission failed: ${error}`);\n }\n\n return false;\n }, [call, hasPermission, isAwaitingPermission, permission]);\n\n return {\n requestPermission,\n hasPermission,\n canRequestPermission: !!call?.permissionsContext.canRequest(permission),\n isAwaitingPermission,\n };\n};\n","import { useI18n } from '@stream-io/video-react-bindings';\nimport { useMemo } from 'react';\n\nexport interface DeviceListItem {\n deviceId: string;\n label: string;\n isSelected: boolean;\n}\n\n/**\n * Utility hook that helps render a list of devices or implement a device selector.\n * Compared to someting like `useCameraState().devices`, it has some handy features:\n * 1. Adds the \"Default\" device to the list if applicable (either the user did not\n * select a device, or a previously selected device is no longer available).\n * 2. Maps the device list to a format more suitable for rendering.\n */\nexport function useDeviceList(\n devices: MediaDeviceInfo[],\n selectedDeviceId: string | undefined,\n): {\n deviceList: DeviceListItem[];\n selectedDeviceInfo: DeviceListItem;\n selectedIndex: number;\n} {\n const { t } = useI18n();\n\n return useMemo(() => {\n let selectedDeviceInfo: DeviceListItem | null = null;\n let selectedIndex: number | null = null;\n\n const deviceList: DeviceListItem[] = devices.map((d, i) => {\n const isSelected = d.deviceId === selectedDeviceId;\n const device = { deviceId: d.deviceId, label: d.label, isSelected };\n\n if (isSelected) {\n selectedDeviceInfo = device;\n selectedIndex = i;\n }\n\n return device;\n });\n\n if (selectedDeviceInfo === null || selectedIndex === null) {\n const defaultDevice = {\n deviceId: 'default',\n label: t('Default'),\n isSelected: true,\n };\n\n selectedDeviceInfo = defaultDevice;\n selectedIndex = 0;\n deviceList.unshift(defaultDevice);\n }\n\n return { deviceList, selectedDeviceInfo, selectedIndex };\n }, [devices, selectedDeviceId, t]);\n}\n","import {\n ComponentType,\n createContext,\n PropsWithChildren,\n RefAttributes,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n FloatingOverlay,\n FloatingPortal,\n Placement,\n Strategy,\n UseFloatingReturn,\n} from '@floating-ui/react';\n\nimport { useFloatingUIPreset } from '../../hooks';\n\nexport type ToggleMenuButtonProps<E extends HTMLElement = HTMLButtonElement> = {\n menuShown: boolean;\n} & RefAttributes<E>;\n\nexport enum MenuVisualType {\n PORTAL = 'portal',\n MENU = 'menu',\n}\n\nexport type MenuToggleProps<E extends HTMLElement> = PropsWithChildren<{\n ToggleButton: ComponentType<ToggleMenuButtonProps<E>>;\n placement?: Placement;\n strategy?: Strategy;\n offset?: number;\n visualType?: MenuVisualType;\n onToggle?: (menuShown: boolean) => void;\n}>;\n\nexport type MenuContextValue = {\n close?: () => void;\n};\n\n/**\n * Used to provide utility APIs to the components rendered inside the portal.\n */\nconst MenuContext = createContext<MenuContextValue>({});\n\n/**\n * Access to the closes MenuContext.\n */\nexport const useMenuContext = (): MenuContextValue => {\n return useContext(MenuContext);\n};\n\nconst MenuPortal = ({\n children,\n refs,\n}: PropsWithChildren<{\n refs: UseFloatingReturn['refs'];\n}>) => {\n const portalId = useMemo(\n () => `str-video-portal-${Math.random().toString(36).substring(2, 9)}`,\n [],\n );\n\n return (\n <>\n <div id={portalId} className=\"str-video__portal\" />\n <FloatingOverlay>\n <FloatingPortal id={portalId}>\n <div className=\"str-video__portal-content\" ref={refs.setFloating}>\n {children}\n </div>\n </FloatingPortal>\n </FloatingOverlay>\n </>\n );\n};\n\nexport const MenuToggle = <E extends HTMLElement>({\n ToggleButton,\n placement = 'top-start',\n strategy = 'absolute',\n offset,\n visualType = MenuVisualType.MENU,\n children,\n onToggle,\n}: MenuToggleProps<E>) => {\n const [menuShown, setMenuShown] = useState(false);\n const toggleHandler = useRef(onToggle);\n toggleHandler.current = onToggle;\n\n const { floating, domReference, refs, x, y } = useFloatingUIPreset({\n placement,\n strategy,\n offset,\n });\n\n useEffect(() => {\n const parentDocument = domReference?.ownerDocument;\n\n const handleClick = (event: MouseEvent) => {\n if (!floating && domReference?.contains(event.target as Node)) {\n setMenuShown(true);\n toggleHandler.current?.(true);\n } else if (floating && !floating?.contains(event.target as Node)) {\n setMenuShown(false);\n toggleHandler.current?.(false);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key && // key can be undefined in some browsers\n event.key.toLowerCase() === 'escape' &&\n !event.altKey &&\n !event.ctrlKey\n ) {\n setMenuShown(false);\n toggleHandler.current?.(false);\n }\n };\n parentDocument?.addEventListener('click', handleClick, { capture: true });\n parentDocument?.addEventListener('keydown', handleKeyDown);\n return () => {\n parentDocument?.removeEventListener('click', handleClick, {\n capture: true,\n });\n parentDocument?.removeEventListener('keydown', handleKeyDown);\n };\n }, [floating, domReference]);\n\n return (\n <>\n {menuShown && (\n <MenuContext.Provider value={{ close: () => setMenuShown(false) }}>\n {visualType === MenuVisualType.PORTAL ? (\n <MenuPortal refs={refs} children={children} />\n ) : visualType === MenuVisualType.MENU ? (\n <div\n className=\"str-video__menu-container\"\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n role=\"menu\"\n children={children}\n />\n ) : null}\n </MenuContext.Provider>\n )}\n <ToggleButton menuShown={menuShown} ref={refs.setReference} />\n </>\n );\n};\n","import { ComponentProps, MouseEvent, PropsWithChildren, useRef } from 'react';\n\nexport const GenericMenu = ({\n children,\n onItemClick,\n}: PropsWithChildren<{\n onItemClick?: (e: MouseEvent) => void;\n}>) => {\n const ref = useRef<HTMLUListElement>(null);\n return (\n <ul\n className=\"str-video__generic-menu\"\n ref={ref}\n onClick={(e) => {\n if (\n onItemClick &&\n e.target !== ref.current &&\n ref.current?.contains(e.target as Node)\n ) {\n onItemClick(e);\n }\n }}\n >\n {children}\n </ul>\n );\n};\n\nexport const GenericMenuButtonItem = ({\n children,\n ...rest\n}: Omit<ComponentProps<'button'>, 'ref'>) => {\n return (\n <li className=\"str-video__generic-menu--item\">\n <button {...rest}>{children}</button>\n </li>\n );\n};\n","import clsx from 'clsx';\n\nexport type IconProps = {\n icon: string;\n className?: string;\n};\n\nexport const Icon = ({ className, icon }: IconProps) => (\n <span\n className={clsx(\n 'str-video__icon',\n icon && `str-video__icon--${icon}`,\n className,\n )}\n />\n);\n","import { useEffect, useState } from 'react';\n\nexport function usePictureInPictureState(videoElement?: HTMLVideoElement) {\n const [isPiP, setIsPiP] = useState(\n document.pictureInPictureElement === videoElement,\n );\n\n if (!videoElement && isPiP) setIsPiP(false);\n\n useEffect(() => {\n if (!videoElement) return;\n\n const handlePiP = () => {\n setIsPiP(document.pictureInPictureElement === videoElement);\n };\n\n videoElement.addEventListener('enterpictureinpicture', handlePiP);\n videoElement.addEventListener('leavepictureinpicture', handlePiP);\n\n return () => {\n videoElement.removeEventListener('enterpictureinpicture', handlePiP);\n videoElement.removeEventListener('leavepictureinpicture', handlePiP);\n };\n }, [videoElement]);\n\n return isPiP;\n}\n","import { useEffect, useState } from 'react';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\nimport {\n hasAudio,\n hasScreenShare,\n hasScreenShareAudio,\n hasVideo,\n OwnCapability,\n} from '@stream-io/video-client';\nimport { useParticipantViewContext } from './ParticipantViewContext';\nimport {\n GenericMenu,\n GenericMenuButtonItem,\n useMenuContext,\n} from '../../../components/Menu';\nimport { Icon } from '../../../components/Icon';\nimport { usePictureInPictureState } from '../../hooks/usePictureInPictureState';\n\nexport const ParticipantActionsContextMenu = () => {\n const { participant, participantViewElement, videoElement } =\n useParticipantViewContext();\n const [fullscreenModeOn, setFullscreenModeOn] = useState(\n !!document.fullscreenElement,\n );\n const call = useCall();\n const isPiP = usePictureInPictureState(videoElement ?? undefined);\n const { t } = useI18n();\n\n const { pin, sessionId, userId } = participant;\n\n const hasAudioTrack = hasAudio(participant);\n const hasVideoTrack = hasVideo(participant);\n const hasScreenShareTrack = hasScreenShare(participant);\n const hasScreenShareAudioTrack = hasScreenShareAudio(participant);\n\n const blockUser = () => call?.blockUser(userId);\n const kickUser = () => call?.kickUser({ user_id: userId });\n const muteAudio = () => call?.muteUser(userId, 'audio');\n const muteVideo = () => call?.muteUser(userId, 'video');\n const muteScreenShare = () => call?.muteUser(userId, 'screenshare');\n const muteScreenShareAudio = () =>\n call?.muteUser(userId, 'screenshare_audio');\n\n const grantPermission = (permission: string) => () => {\n call?.updateUserPermissions({\n user_id: userId,\n grant_permissions: [permission],\n });\n };\n\n const revokePermission = (permission: string) => () => {\n call?.updateUserPermissions({\n user_id: userId,\n revoke_permissions: [permission],\n });\n };\n\n const toggleParticipantPin = () => {\n if (pin) {\n call?.unpin(sessionId);\n } else {\n call?.pin(sessionId);\n }\n };\n\n const pinForEveryone = () => {\n call\n ?.pinForEveryone({ user_id: userId, session_id: sessionId })\n .catch((err) => {\n console.error(`Failed to pin participant ${userId}`, err);\n });\n };\n\n const unpinForEveryone = () => {\n call\n ?.unpinForEveryone({ user_id: userId, session_id: sessionId })\n .catch((err) => {\n console.error(`Failed to unpin participant ${userId}`, err);\n });\n };\n\n const toggleFullscreenMode = () => {\n if (!fullscreenModeOn) {\n return participantViewElement?.requestFullscreen().catch(console.error);\n }\n return document.exitFullscreen().catch(console.error);\n };\n\n useEffect(() => {\n // handles the case when fullscreen mode is toggled externally,\n // e.g., by pressing ESC key or some other keyboard shortcut\n const handleFullscreenChange = () => {\n setFullscreenModeOn(!!document.fullscreenElement);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n\n const togglePictureInPicture = () => {\n if (videoElement && !isPiP) {\n return videoElement\n .requestPictureInPicture()\n .catch(console.error) as Promise<void>;\n }\n\n return document.exitPictureInPicture().catch(console.error);\n };\n\n const { close } = useMenuContext() || {};\n return (\n <GenericMenu onItemClick={close}>\n <GenericMenuButtonItem\n onClick={toggleParticipantPin}\n disabled={pin && !pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {pin ? t('Unpin') : t('Pin')}\n </GenericMenuButtonItem>\n <Restricted requiredGrants={[OwnCapability.PIN_FOR_EVERYONE]}>\n <GenericMenuButtonItem\n onClick={pinForEveryone}\n disabled={pin && !pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {t('Pin for everyone')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={unpinForEveryone}\n disabled={!pin || pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {t('Unpin for everyone')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.BLOCK_USERS]}>\n <GenericMenuButtonItem onClick={blockUser}>\n <Icon icon=\"not-allowed\" />\n {t('Block')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.KICK_USER]}>\n <GenericMenuButtonItem onClick={kickUser}>\n <Icon icon=\"kick-user\" />\n {t('Kick')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.MUTE_USERS]}>\n {hasVideoTrack && (\n <GenericMenuButtonItem onClick={muteVideo}>\n <Icon icon=\"camera-off-outline\" />\n {t('Turn off video')}\n </GenericMenuButtonItem>\n )}\n {hasScreenShareTrack && (\n <GenericMenuButtonItem onClick={muteScreenShare}>\n <Icon icon=\"screen-share-off\" />\n {t('Turn off screen share')}\n </GenericMenuButtonItem>\n )}\n {hasAudioTrack && (\n <GenericMenuButtonItem onClick={muteAudio}>\n <Icon icon=\"no-audio\" />\n {t('Mute audio')}\n </GenericMenuButtonItem>\n )}\n {hasScreenShareAudioTrack && (\n <GenericMenuButtonItem onClick={muteScreenShareAudio}>\n <Icon icon=\"no-audio\" />\n {t('Mute screen share audio')}\n </GenericMenuButtonItem>\n )}\n </Restricted>\n {participantViewElement &&\n typeof participantViewElement.requestFullscreen !== 'undefined' && (\n <GenericMenuButtonItem onClick={toggleFullscreenMode}>\n {t('{{ direction }} fullscreen', {\n direction: fullscreenModeOn ? t('Leave') : t('Enter'),\n })}\n </GenericMenuButtonItem>\n )}\n {videoElement && document.pictureInPictureEnabled && (\n <GenericMenuButtonItem onClick={togglePictureInPicture}>\n {t('{{ direction }} picture-in-picture', {\n direction: isPiP ? t('Leave') : t('Enter'),\n })}\n </GenericMenuButtonItem>\n )}\n <Restricted requiredGrants={[OwnCapability.UPDATE_CALL_PERMISSIONS]}>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SEND_AUDIO)}\n >\n {t('Allow audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SEND_VIDEO)}\n >\n {t('Allow video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SCREENSHARE)}\n >\n {t('Allow screen sharing')}\n </GenericMenuButtonItem>\n\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SEND_AUDIO)}\n >\n {t('Disable audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SEND_VIDEO)}\n >\n {t('Disable video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SCREENSHARE)}\n >\n {t('Disable screen sharing')}\n </GenericMenuButtonItem>\n </Restricted>\n </GenericMenu>\n );\n};\n","import { ComponentType, isValidElement, ReactElement } from 'react';\n\nexport const isComponentType = <T extends {}>(\n elementOrComponent?: ComponentType<T> | ReactElement | null,\n): elementOrComponent is ComponentType<T> => {\n return elementOrComponent === null\n ? false\n : !isValidElement(elementOrComponent);\n};\n","export const chunk = <T extends unknown[]>(array: T, size: number) => {\n const chunkCount = Math.ceil(array.length / size);\n\n return Array.from(\n { length: chunkCount },\n (_, index) => array.slice(size * index, size * index + size) as T,\n );\n};\n","import type { ForwardedRef } from 'react';\n\nexport const applyElementToRef = <T extends HTMLElement | null>(\n ref: ForwardedRef<T>,\n element: T,\n) => {\n if (!ref) return;\n\n if (typeof ref === 'function') return ref(element);\n\n ref.current = element;\n};\n","import { ComponentPropsWithRef, forwardRef, useEffect, useState } from 'react';\nimport { Browsers } from '@stream-io/video-client';\n\nimport { applyElementToRef } from '../../../utilities';\n\nexport type BaseVideoProps = ComponentPropsWithRef<'video'> & {\n stream?: MediaStream;\n};\n\n/**\n * @description Extends video element with `stream` property\n * (`srcObject`) to reactively handle stream changes\n */\nexport const BaseVideo = forwardRef<HTMLVideoElement, BaseVideoProps>(\n function BaseVideo({ stream, ...rest }, ref) {\n const [videoElement, setVideoElement] = useState<HTMLVideoElement | null>(\n null,\n );\n\n useEffect(() => {\n if (!videoElement || !stream) return;\n if (stream === videoElement.srcObject) return;\n\n videoElement.srcObject = stream;\n if (Browsers.isSafari() || Browsers.isFirefox()) {\n // Firefox and Safari have some timing issue\n setTimeout(() => {\n videoElement.srcObject = stream;\n videoElement.play().catch((e) => {\n console.error(`Failed to play stream`, e);\n });\n }, 0);\n }\n\n return () => {\n videoElement.pause();\n videoElement.srcObject = null;\n };\n }, [stream, videoElement]);\n\n return (\n <video\n autoPlay\n playsInline\n {...rest}\n ref={(element) => {\n applyElementToRef(ref, element);\n setVideoElement(element);\n }}\n />\n );\n },\n);\n","import { ComponentProps, RefAttributes, forwardRef, useState } from 'react';\nimport type { StreamVideoParticipant } from '@stream-io/video-client';\n\nexport type BaseVideoPlaceholderProps = {\n participant: StreamVideoParticipant;\n} & RefAttributes<HTMLDivElement> &\n ComponentProps<'div'>;\n\nexport const BaseVideoPlaceholder = forwardRef<\n HTMLDivElement,\n BaseVideoPlaceholderProps\n>(function DefaultVideoPlaceholder({ participant, style, children }, ref) {\n const [error, setError] = useState(false);\n const name = participant.name || participant.userId;\n return (\n <div className=\"str-video__video-placeholder\" style={style} ref={ref}>\n {(!participant.image || error) &&\n (name ? (\n <InitialsFallback name={name} />\n ) : (\n <div className=\"str-video__video-placeholder__no-video-label\">\n {children}\n </div>\n ))}\n {participant.image && !error && (\n <img\n onError={() => setError(true)}\n alt={name}\n className=\"str-video__video-placeholder__avatar\"\n src={participant.image}\n />\n )}\n </div>\n );\n});\n\nconst InitialsFallback = (props: { name: string }) => {\n const { name } = props;\n const initials = name\n .split(' ')\n .slice(0, 2)\n .map((n) => n[0])\n .join('');\n return (\n <div className=\"str-video__video-placeholder__initials-fallback\">\n {initials}\n </div>\n );\n};\n","import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport {\n BaseVideoPlaceholder,\n type BaseVideoPlaceholderProps,\n} from './BaseVideoPlaceholder';\n\nexport type VideoPlaceholderProps = BaseVideoPlaceholderProps;\n\nexport const DefaultVideoPlaceholder = forwardRef<\n HTMLDivElement,\n VideoPlaceholderProps\n>(function DefaultVideoPlaceholder(props, ref) {\n const { t } = useI18n();\n return (\n <BaseVideoPlaceholder ref={ref} {...props}>\n {t('Video is disabled')}\n </BaseVideoPlaceholder>\n );\n});\n","import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport {\n BaseVideoPlaceholder,\n type BaseVideoPlaceholderProps,\n} from './BaseVideoPlaceholder';\n\nexport type PictureInPicturePlaceholderProps = BaseVideoPlaceholderProps;\n\nexport const DefaultPictureInPicturePlaceholder = forwardRef<\n HTMLDivElement,\n PictureInPicturePlaceholderProps\n>(function DefaultPictureInPicturePlaceholder(props, ref) {\n const { t } = useI18n();\n return (\n <BaseVideoPlaceholder ref={ref} {...props}>\n {t('Video is playing in a popup')}\n </BaseVideoPlaceholder>\n );\n});\n","import {\n ComponentPropsWithoutRef,\n ComponentType,\n useEffect,\n useLayoutEffect,\n useState,\n} from 'react';\nimport {\n hasPausedTrack,\n hasScreenShare,\n hasVideo,\n StreamVideoParticipant,\n VideoTrackType,\n VisibilityState,\n} from '@stream-io/video-client';\nimport clsx from 'clsx';\nimport {\n DefaultVideoPlaceholder,\n VideoPlaceholderProps,\n} from './DefaultVideoPlaceholder';\nimport { useCall } from '@stream-io/video-react-bindings';\nimport { usePictureInPictureState } from '../../hooks/usePictureInPictureState';\nimport {\n DefaultPictureInPicturePlaceholder,\n PictureInPicturePlaceholderProps,\n} from './DefaultPictureInPicturePlaceholder';\n\nexport type VideoProps = ComponentPropsWithoutRef<'video'> & {\n /**\n * Pass false to disable rendering video and render fallback\n * even if the participant has published video.\n * @default true\n */\n enabled?: boolean;\n /**\n * Forces the video to be mirrored or unmirrored. By default, video track\n * from the local participant is mirrored, and all other videos are not mirrored.\n */\n mirror?: boolean;\n /**\n * The track type to display.\n */\n trackType: VideoTrackType | 'none';\n /**\n * The participant represented by this video element.\n */\n participant: StreamVideoParticipant;\n /**\n * Override the default UI that's visible when a participant turned off their video.\n * Set it to `null` if you wish to disable the video placeholder.\n *\n * @default DefaultVideoPlaceholder\n */\n VideoPlaceholder?: ComponentType<VideoPlaceholderProps> | null;\n /**\n * Override the default UI that's dispayed in place of the video when it's playing\n * in picture-in-picture. Set it to `null` if you wish to display the browser's default\n * placeholder.\n *\n * @default DefaultPictureInPicturePlaceholder\n */\n PictureInPicturePlaceholder?: ComponentType<PictureInPicturePlaceholderProps> | null;\n /**\n /**\n * An object with setRef functions\n * meant for exposing some of the internal elements of this component.\n */\n refs?: {\n /**\n * The video element that's used to play the video stream.\n * @param element the video element.\n */\n setVideoElement?: (element: HTMLVideoElement | null) => void;\n /**\n * The video placeholder element that's used when the video stream is not playing.\n * @param element the video placeholder element.\n */\n setVideoPlaceholderElement?: (element: HTMLDivElement | null) => void;\n setPictureInPicturePlaceholderElement?: (\n element: HTMLDivElement | null,\n ) => void;\n };\n};\n\nexport const Video = ({\n enabled = true,\n mirror,\n trackType,\n participant,\n className,\n VideoPlaceholder = DefaultVideoPlaceholder,\n PictureInPicturePlaceholder = DefaultPictureInPicturePlaceholder,\n refs,\n ...rest\n}: VideoProps) => {\n const {\n sessionId,\n videoStream,\n screenShareStream,\n viewportVisibilityState,\n isLocalParticipant,\n userId,\n } = participant;\n\n const call = useCall();\n const [videoElement, setVideoElement] = useState<HTMLVideoElement | null>(\n null,\n );\n // start with true, will flip once the video starts playing\n const [isVideoPaused, setIsVideoPaused] = useState(true);\n const [isWideMode, setIsWideMode] = useState(true);\n const isPiP = usePictureInPictureState(videoElement ?? undefined);\n\n const stream =\n trackType === 'videoTrack'\n ? videoStream\n : trackType === 'screenShareTrack'\n ? screenShareStream\n : undefined;\n\n useLayoutEffect(() => {\n if (!call || !videoElement || trackType === 'none') return;\n\n const cleanup = call.bindVideoElement(videoElement, sessionId, trackType);\n\n return () => {\n cleanup?.();\n };\n }, [call, trackType, sessionId, videoElement]);\n\n useEffect(() => {\n if (!stream || !videoElement) return;\n\n const [track] = stream.getVideoTracks();\n if (!track) return;\n\n const handlePlayPause = () => {\n setIsVideoPaused(videoElement.paused);\n\n const { width = 0, height = 0 } = track.getSettings();\n setIsWideMode(width >= height);\n };\n\n // playback may have started before we had a chance to\n // attach the 'play/pause' event listener, so we set the state\n // here to make sure it's in sync\n setIsVideoPaused(videoElement.paused);\n\n videoElement.addEventListener('play', handlePlayPause);\n videoElement.addEventListener('pause', handlePlayPause);\n track.addEventListener('unmute', handlePlayPause);\n return () => {\n videoElement.removeEventListener('play', handlePlayPause);\n videoElement.removeEventListener('pause', handlePlayPause);\n track.removeEventListener('unmute', handlePlayPause);\n\n // reset the 'pause' state once we unmount the video element\n setIsVideoPaused(true);\n };\n }, [stream, videoElement]);\n\n if (!call) return null;\n\n const isPublishingTrack =\n trackType === 'videoTrack'\n ? hasVideo(participant)\n : trackType === 'screenShareTrack'\n ? hasScreenShare(participant)\n : false;\n\n const isInvisible =\n trackType === 'none' ||\n viewportVisibilityState?.[trackType] === VisibilityState.INVISIBLE;\n\n const hasNoVideoOrInvisible =\n !enabled ||\n !isPublishingTrack ||\n isInvisible ||\n hasPausedTrack(participant, trackType);\n const mirrorVideo =\n mirror === undefined\n ? isLocalParticipant && trackType === 'videoTrack'\n : mirror;\n const isScreenShareTrack = trackType === 'screenShareTrack';\n return (\n <>\n {!hasNoVideoOrInvisible && (\n <video\n {...rest}\n className={clsx('str-video__video', className, {\n 'str-video__video--not-playing': isVideoPaused,\n 'str-video__video--tall': !isWideMode,\n 'str-video__video--mirror': mirrorVideo,\n 'str-video__video--screen-share': isScreenShareTrack,\n })}\n data-user-id={userId}\n data-session-id={sessionId}\n ref={(element) => {\n setVideoElement(element);\n refs?.setVideoElement?.(element);\n }}\n />\n )}\n {isPiP && PictureInPicturePlaceholder && (\n <PictureInPicturePlaceholder\n style={{ position: 'absolute' }}\n participant={participant}\n />\n )}\n {/* TODO: add condition to \"hold\" the placeholder until track unmutes as well */}\n {(hasNoVideoOrInvisible || isVideoPaused) && VideoPlaceholder && (\n <VideoPlaceholder\n style={{ position: 'absolute' }}\n participant={participant}\n ref={refs?.setVideoPlaceholderElement}\n />\n )}\n </>\n );\n};\n\nVideo.displayName = 'Video';\n","import { useEffect } from 'react';\nimport { DynascaleManager, VideoTrackType } from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport const useTrackElementVisibility = <T extends HTMLElement>({\n trackedElement,\n dynascaleManager: propsDynascaleManager,\n sessionId,\n trackType,\n}: {\n trackedElement: T | null;\n sessionId: string;\n dynascaleManager?: DynascaleManager;\n trackType: VideoTrackType | 'none';\n}) => {\n const call = useCall();\n const manager = propsDynascaleManager ?? call?.dynascaleManager;\n useEffect(() => {\n if (!trackedElement || !manager || !call || trackType === 'none') return;\n const unobserve = manager.trackElementVisibility(\n trackedElement,\n sessionId,\n trackType,\n );\n return () => {\n unobserve();\n };\n }, [trackedElement, manager, call, sessionId, trackType]);\n};\n","import { ComponentProps, CSSProperties, useState } from 'react';\nimport clsx from 'clsx';\n\nexport type AvatarData = {\n imageSrc?: string;\n name?: string;\n style?: CSSProperties & Record<string, string | number>;\n};\n\nexport type AvatarProps = AvatarData & ComponentProps<'img'>;\n\nexport const Avatar = ({\n imageSrc,\n name,\n style,\n className,\n ...rest\n}: AvatarProps) => {\n const [error, setError] = useState(false);\n\n return (\n <>\n {(!imageSrc || error) && name && (\n <AvatarFallback className={className} style={style} names={[name]} />\n )}\n {imageSrc && !error && (\n <img\n onError={() => setError(true)}\n alt=\"avatar\"\n className={clsx('str-video__avatar', className)}\n src={imageSrc}\n style={style}\n {...rest}\n />\n )}\n </>\n );\n};\n\ntype AvatarFallbackProps = {\n names: string[];\n className?: string;\n style?: CSSProperties & Record<string, string | number>;\n};\nexport const AvatarFallback = ({\n className,\n names,\n style,\n}: AvatarFallbackProps) => {\n return (\n <div\n className={clsx('str-video__avatar--initials-fallback', className)}\n style={style}\n >\n <div>\n {names[0][0]}\n {names[1]?.[0]}\n </div>\n </div>\n );\n};\n","import {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { flushSync } from 'react-dom';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { Call, disposeOfMediaStream } from '@stream-io/video-client';\nimport {\n BackgroundBlurLevel,\n BackgroundFilter,\n createRenderer,\n isPlatformSupported,\n isMediaPipePlatformSupported,\n loadTFLite,\n loadMediaPipe,\n PlatformSupportFlags,\n VirtualBackground,\n Renderer,\n TFLite,\n PerformanceStats,\n} from '@stream-io/video-filters-web';\nimport clsx from 'clsx';\n\n/**\n * Constants for FPS warning calculation.\n * Smooths out quick spikes using an EMA, ignores brief outliers,\n * and uses two thresholds to avoid flickering near the limit.\n */\nconst ALPHA = 0.2;\nconst FPS_WARNING_THRESHOLD_LOWER = 23;\nconst FPS_WARNING_THRESHOLD_UPPER = 25;\nconst DEFAULT_FPS = 30;\nconst DEVIATION_LIMIT = 0.5;\nconst OUTLIER_PERSISTENCE = 5;\n\n/**\n * Configuration for performance metric thresholds.\n */\nexport type BackgroundFiltersPerformanceThresholds = {\n /**\n * The lower FPS threshold for triggering a performance warning.\n * When the EMA FPS falls below this value, a warning is shown.\n * @default 23\n */\n fpsWarningThresholdLower?: number;\n\n /**\n * The upper FPS threshold for clearing a performance warning.\n * When the EMA FPS rises above this value, the warning is cleared.\n * @default 25\n */\n fpsWarningThresholdUpper?: number;\n\n /**\n * The default FPS value used as the initial value for the EMA (Exponential Moving Average)\n * calculation and when stats are unavailable or when resetting the filter.\n * @default 30\n */\n defaultFps?: number;\n};\n\n/**\n * Represents the available background filter processing engines.\n */\nenum FilterEngine {\n TF,\n MEDIA_PIPE,\n NONE,\n}\n\n/**\n * Represents the possible reasons for background filter performance degradation.\n */\nexport enum PerformanceDegradationReason {\n FRAME_DROP = 'frame-drop',\n CPU_THROTTLING = 'cpu-throttling',\n}\n\nexport type BackgroundFiltersProps = PlatformSupportFlags & {\n /**\n * A list of URLs to use as background images.\n */\n backgroundImages?: string[];\n\n /**\n * The background filter to apply to the video (by default).\n * @default undefined no filter applied\n */\n backgroundFilter?: BackgroundFilter;\n\n /**\n * The URL of the image to use as the background (by default).\n */\n backgroundImage?: string;\n\n /**\n * The level of blur to apply to the background (by default).\n * @default 'high'.\n */\n backgroundBlurLevel?: BackgroundBlurLevel;\n\n /**\n * The base path for the TensorFlow Lite files.\n * @default 'https://unpkg.com/@stream-io/video-filters-web/mediapipe'.\n */\n basePath?: string;\n\n /**\n * The path to the TensorFlow Lite WebAssembly file.\n *\n * Override this prop to use a custom path to the TensorFlow Lite WebAssembly file\n * (e.g., if you choose to host it yourself).\n */\n tfFilePath?: string;\n\n /**\n * The path to the MediaPipe model file.\n * Override this prop to use a custom path to the MediaPipe model file\n * (e.g., if you choose to host it yourself).\n */\n modelFilePath?: string;\n\n /**\n * When true, the filter uses the legacy TensorFlow-based segmentation model.\n * When false, it uses the default MediaPipe Tasks Vision model.\n *\n * Only enable this if you need to mimic the behavior of older SDK versions.\n */\n useLegacyFilter?: boolean;\n\n /**\n * When a started filter encounters an error, this callback will be executed.\n * The default behavior (not overridable) is unregistering a failed filter.\n * Use this callback to display UI error message, disable the corresponding stream,\n * or to try registering the filter again.\n */\n onError?: (error: any) => void;\n\n /**\n * Configuration for performance metric thresholds.\n * Use this to customize when performance warnings are triggered.\n */\n performanceThresholds?: BackgroundFiltersPerformanceThresholds;\n};\n\n/**\n * Performance degradation information for background filters.\n *\n * Performance is calculated using an Exponential Moving Average (EMA) of FPS values\n * to smooth out quick spikes and provide stable performance warnings.\n */\nexport type BackgroundFiltersPerformance = {\n /**\n * Whether performance is currently degraded.\n */\n degraded: boolean;\n /**\n * Reasons for performance degradation.\n */\n reason?: Array<PerformanceDegradationReason>;\n};\n\nexport type BackgroundFiltersAPI = {\n /**\n * Whether the current platform supports the background filters.\n */\n isSupported: boolean;\n\n /**\n * Indicates whether the background filters engine is loaded and ready.\n */\n isReady: boolean;\n\n /**\n * Performance information for background filters.\n */\n performance: BackgroundFiltersPerformance;\n\n /**\n * Disables all background filters applied to the video.\n */\n disableBackgroundFilter: () => void;\n\n /**\n * Applies a background blur filter to the video.\n *\n * @param blurLevel the level of blur to apply to the background.\n */\n applyBackgroundBlurFilter: (blurLevel: BackgroundBlurLevel) => void;\n\n /**\n * Applies a background image filter to the video.\n *\n * @param imageUrl the URL of the image to use as the background.\n */\n applyBackgroundImageFilter: (imageUrl: string) => void;\n};\n\n/**\n * The context value for the background filters context.\n */\nexport type BackgroundFiltersContextValue = BackgroundFiltersProps &\n BackgroundFiltersAPI;\n\n/**\n * The context for the background filters.\n */\nconst BackgroundFiltersContext = createContext<\n BackgroundFiltersContextValue | undefined\n>(undefined);\n\n/**\n * A hook to access the background filters context API.\n */\nexport const useBackgroundFilters = () => {\n const context = useContext(BackgroundFiltersContext);\n if (!context) {\n throw new Error(\n 'useBackgroundFilters must be used within a BackgroundFiltersProvider',\n );\n }\n return context;\n};\n\n/**\n * Determines which filter engine is available.\n * MEDIA_PIPE is the default unless legacy filters are requested or MediaPipe is unsupported.\n *\n * Returns NONE if neither is supported.\n */\nconst determineEngine = async (\n useLegacyFilter: boolean | undefined,\n forceSafariSupport: boolean | undefined,\n forceMobileSupport: boolean | undefined,\n): Promise<FilterEngine> => {\n const isTfPlatformSupported = await isPlatformSupported({\n forceSafariSupport,\n forceMobileSupport,\n });\n\n if (useLegacyFilter) {\n return isTfPlatformSupported ? FilterEngine.TF : FilterEngine.NONE;\n }\n\n const isMediaPipeSupported = await isMediaPipePlatformSupported({\n forceSafariSupport,\n forceMobileSupport,\n });\n\n return isMediaPipeSupported ? FilterEngine.MEDIA_PIPE : FilterEngine.NONE;\n};\n\n/**\n * A provider component that enables the use of background filters in your app.\n *\n * Please make sure you have the `@stream-io/video-filters-web` package installed\n * in your project before using this component.\n */\nexport const BackgroundFiltersProvider = (\n props: PropsWithChildren<BackgroundFiltersProps>,\n) => {\n const {\n children,\n backgroundImages = [],\n backgroundFilter: bgFilterFromProps = undefined,\n backgroundImage: bgImageFromProps = undefined,\n backgroundBlurLevel: bgBlurLevelFromProps = undefined,\n tfFilePath,\n modelFilePath,\n useLegacyFilter,\n basePath,\n onError,\n performanceThresholds,\n forceSafariSupport,\n forceMobileSupport,\n } = props;\n\n const call = useCall();\n const { useCallStatsReport } = useCallStateHooks();\n const callStatsReport = useCallStatsReport();\n\n const [backgroundFilter, setBackgroundFilter] = useState(bgFilterFromProps);\n const [backgroundImage, setBackgroundImage] = useState(bgImageFromProps);\n const [backgroundBlurLevel, setBackgroundBlurLevel] =\n useState(bgBlurLevelFromProps);\n\n const [showLowFpsWarning, setShowLowFpsWarning] = useState<boolean>(false);\n\n const fpsWarningThresholdLower =\n performanceThresholds?.fpsWarningThresholdLower ??\n FPS_WARNING_THRESHOLD_LOWER;\n const fpsWarningThresholdUpper =\n performanceThresholds?.fpsWarningThresholdUpper ??\n FPS_WARNING_THRESHOLD_UPPER;\n const defaultFps = performanceThresholds?.defaultFps ?? DEFAULT_FPS;\n\n const emaRef = useRef<number>(defaultFps);\n const outlierStreakRef = useRef<number>(0);\n\n const handleStats = useCallback(\n (stats: PerformanceStats) => {\n const fps = stats?.fps;\n if (fps === undefined || fps === null) {\n emaRef.current = defaultFps;\n outlierStreakRef.current = 0;\n setShowLowFpsWarning(false);\n return;\n }\n\n const prevEma = emaRef.current;\n const deviation = Math.abs(fps - prevEma) / prevEma;\n\n const isOutlier = fps < prevEma && deviation > DEVIATION_LIMIT;\n outlierStreakRef.current = isOutlier ? outlierStreakRef.current + 1 : 0;\n if (isOutlier && outlierStreakRef.current < OUTLIER_PERSISTENCE) return;\n\n emaRef.current = ALPHA * fps + (1 - ALPHA) * prevEma;\n\n setShowLowFpsWarning((prev) => {\n if (prev && emaRef.current > fpsWarningThresholdUpper) return false;\n if (!prev && emaRef.current < fpsWarningThresholdLower) return true;\n\n return prev;\n });\n },\n [fpsWarningThresholdLower, fpsWarningThresholdUpper, defaultFps],\n );\n\n const performance: BackgroundFiltersPerformance = useMemo(() => {\n if (!backgroundFilter) {\n return { degraded: false };\n }\n\n const reasons: Array<PerformanceDegradationReason> = [];\n\n if (showLowFpsWarning) {\n reasons.push(PerformanceDegradationReason.FRAME_DROP);\n }\n\n const qualityLimitationReasons =\n callStatsReport?.publisherStats?.qualityLimitationReasons;\n\n if (\n showLowFpsWarning &&\n qualityLimitationReasons &&\n qualityLimitationReasons?.includes('cpu')\n ) {\n reasons.push(PerformanceDegradationReason.CPU_THROTTLING);\n }\n\n return {\n degraded: reasons.length > 0,\n reason: reasons.length > 0 ? reasons : undefined,\n };\n }, [\n showLowFpsWarning,\n callStatsReport?.publisherStats?.qualityLimitationReasons,\n backgroundFilter,\n ]);\n\n const prevDegradedRef = useRef<boolean | undefined>(undefined);\n useEffect(() => {\n const currentDegraded = performance.degraded;\n const prevDegraded = prevDegradedRef.current;\n\n if (\n !!backgroundFilter &&\n prevDegraded !== undefined &&\n prevDegraded !== currentDegraded\n ) {\n call?.tracer.trace('backgroundFilters.performance', {\n degraded: currentDegraded,\n reason: performance?.reason,\n fps: emaRef.current,\n });\n }\n prevDegradedRef.current = currentDegraded;\n }, [\n performanceThresholds,\n performance.degraded,\n performance.reason,\n backgroundFilter,\n call?.tracer,\n ]);\n\n const applyBackgroundImageFilter = useCallback((imageUrl: string) => {\n setBackgroundFilter('image');\n setBackgroundImage(imageUrl);\n }, []);\n\n const applyBackgroundBlurFilter = useCallback(\n (blurLevel: BackgroundBlurLevel = 'high') => {\n setBackgroundFilter('blur');\n setBackgroundBlurLevel(blurLevel);\n },\n [],\n );\n\n const disableBackgroundFilter = useCallback(() => {\n setBackgroundFilter(undefined);\n setBackgroundImage(undefined);\n setBackgroundBlurLevel(undefined);\n\n emaRef.current = defaultFps;\n outlierStreakRef.current = 0;\n setShowLowFpsWarning(false);\n }, [defaultFps]);\n\n const [engine, setEngine] = useState<FilterEngine>(FilterEngine.NONE);\n const [isSupported, setIsSupported] = useState(false);\n useEffect(() => {\n determineEngine(\n useLegacyFilter,\n forceSafariSupport,\n forceMobileSupport,\n ).then((determinedEngine) => {\n setEngine(determinedEngine);\n setIsSupported(determinedEngine !== FilterEngine.NONE);\n });\n }, [forceMobileSupport, forceSafariSupport, useLegacyFilter]);\n\n const [tfLite, setTfLite] = useState<TFLite>();\n useEffect(() => {\n if (engine !== FilterEngine.TF) return;\n\n loadTFLite({ basePath, modelFilePath, tfFilePath })\n .then(setTfLite)\n .catch((err) => console.error('Failed to load TFLite', err));\n }, [basePath, engine, modelFilePath, tfFilePath]);\n\n const [mediaPipe, setMediaPipe] = useState<ArrayBuffer>();\n useEffect(() => {\n if (engine !== FilterEngine.MEDIA_PIPE) return;\n\n loadMediaPipe({\n basePath: basePath,\n modelPath: modelFilePath,\n })\n .then(setMediaPipe)\n .catch((err) => console.error('Failed to preload MediaPipe', err));\n }, [engine, modelFilePath, basePath]);\n\n const handleError = useCallback(\n (error: any) => {\n console.warn(\n '[filters] Filter encountered an error and will be disabled',\n );\n disableBackgroundFilter();\n onError?.(error);\n },\n [disableBackgroundFilter, onError],\n );\n\n const isReady = useLegacyFilter ? !!tfLite : !!mediaPipe;\n return (\n <BackgroundFiltersContext.Provider\n value={{\n isSupported,\n performance,\n isReady,\n backgroundImage,\n backgroundBlurLevel,\n backgroundFilter,\n disableBackgroundFilter,\n applyBackgroundBlurFilter,\n applyBackgroundImageFilter,\n backgroundImages,\n tfFilePath,\n modelFilePath,\n basePath,\n onError: handleError,\n }}\n >\n {children}\n {isReady && (\n <BackgroundFilters\n tfLite={tfLite}\n engine={engine}\n onStats={handleStats}\n />\n )}\n </BackgroundFiltersContext.Provider>\n );\n};\n\nconst BackgroundFilters = (props: {\n tfLite?: TFLite;\n engine: FilterEngine;\n onStats: (stats: PerformanceStats) => void;\n}) => {\n const call = useCall();\n const { children, start } = useRenderer(props.tfLite, call, props.engine);\n const { onError, backgroundFilter } = useBackgroundFilters();\n const handleErrorRef = useRef<((error: any) => void) | undefined>(undefined);\n handleErrorRef.current = onError;\n\n const handleStatsRef = useRef<\n ((stats: PerformanceStats) => void) | undefined\n >(undefined);\n handleStatsRef.current = props.onStats;\n\n useEffect(() => {\n if (!call || !backgroundFilter) return;\n\n const { unregister } = call.camera.registerFilter((ms) => {\n return start(\n ms,\n (error) => handleErrorRef.current?.(error),\n (stats: PerformanceStats) => handleStatsRef.current?.(stats),\n );\n });\n return () => {\n unregister().catch((err) => console.warn(`Can't unregister filter`, err));\n };\n }, [call, start, backgroundFilter]);\n\n return children;\n};\n\nconst useRenderer = (\n tfLite: TFLite | undefined,\n call: Call | undefined,\n engine: FilterEngine,\n) => {\n const {\n backgroundFilter,\n backgroundBlurLevel,\n backgroundImage,\n modelFilePath,\n basePath,\n } = useBackgroundFilters();\n\n const videoRef = useRef<HTMLVideoElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const bgImageRef = useRef<HTMLImageElement>(null);\n const [videoSize, setVideoSize] = useState<{ width: number; height: number }>(\n {\n width: 1920,\n height: 1080,\n },\n );\n\n const start = useCallback(\n (\n ms: MediaStream,\n onError?: (error: any) => void,\n onStats?: (stats: PerformanceStats) => void,\n ) => {\n let outputStream: MediaStream | undefined;\n let processor: VirtualBackground | undefined;\n let renderer: Renderer | undefined;\n\n const output = new Promise<MediaStream>((resolve, reject) => {\n if (!backgroundFilter) {\n reject(new Error('No filter specified'));\n return;\n }\n\n const videoEl = videoRef.current;\n const canvasEl = canvasRef.current;\n const bgImageEl = bgImageRef.current;\n\n const [track] = ms.getVideoTracks();\n\n if (!track) {\n reject(new Error('No video tracks in input media stream'));\n return;\n }\n\n if (engine === FilterEngine.MEDIA_PIPE) {\n call?.tracer.trace('backgroundFilters.enable', {\n backgroundFilter,\n backgroundBlurLevel,\n backgroundImage,\n engine,\n });\n\n if (!videoEl) {\n reject(new Error('Renderer started before elements are ready'));\n return;\n }\n\n const trackSettings = track.getSettings();\n flushSync(() =>\n setVideoSize({\n width: trackSettings.width ?? 0,\n height: trackSettings.height ?? 0,\n }),\n );\n\n processor = new VirtualBackground(\n track,\n {\n basePath: basePath,\n modelPath: modelFilePath,\n backgroundBlurLevel,\n backgroundImage,\n backgroundFilter,\n },\n { onError, onStats },\n );\n processor\n .start()\n .then((processedTrack) => {\n outputStream = new MediaStream([processedTrack]);\n resolve(outputStream);\n })\n .catch((error) => {\n reject(error);\n });\n\n return;\n }\n\n if (engine === FilterEngine.TF) {\n if (!videoEl || !canvasEl || (backgroundImage && !bgImageEl)) {\n reject(new Error('Renderer started before elements are ready'));\n return;\n }\n\n videoEl.srcObject = ms;\n videoEl.play().then(\n () => {\n const trackSettings = track.getSettings();\n flushSync(() =>\n setVideoSize({\n width: trackSettings.width ?? 0,\n height: trackSettings.height ?? 0,\n }),\n );\n call?.tracer.trace('backgroundFilters.enable', {\n backgroundFilter,\n backgroundBlurLevel,\n backgroundImage,\n engine,\n });\n\n if (!tfLite) {\n reject(new Error('TensorFlow Lite not loaded'));\n return;\n }\n\n renderer = createRenderer(\n tfLite,\n videoEl,\n canvasEl,\n {\n backgroundFilter,\n backgroundBlurLevel,\n backgroundImage: bgImageEl ?? undefined,\n },\n onError,\n );\n outputStream = canvasEl.captureStream();\n\n resolve(outputStream);\n },\n () => {\n reject(new Error('Could not play the source video stream'));\n },\n );\n return;\n }\n\n reject(new Error('No supported engine available'));\n });\n\n return {\n output,\n stop: () => {\n call?.tracer.trace('backgroundFilters.disable', null);\n processor?.stop();\n renderer?.dispose();\n if (videoRef.current) videoRef.current.srcObject = null;\n if (outputStream) disposeOfMediaStream(outputStream);\n },\n };\n },\n [\n backgroundBlurLevel,\n backgroundFilter,\n backgroundImage,\n call?.tracer,\n tfLite,\n engine,\n modelFilePath,\n basePath,\n ],\n );\n\n const children = (\n <div className=\"str-video__background-filters\">\n <video\n className={clsx(\n 'str-video__background-filters__video',\n videoSize.height > videoSize.width &&\n 'str-video__background-filters__video--tall',\n )}\n ref={videoRef}\n playsInline\n muted\n controls={false}\n {...videoSize}\n />\n {backgroundImage && (\n <img\n className=\"str-video__background-filters__background-image\"\n alt=\"Background\"\n ref={bgImageRef}\n crossOrigin=\"anonymous\"\n src={backgroundImage}\n {...videoSize}\n />\n )}\n <canvas\n className=\"str-video__background-filters__target-canvas\"\n {...videoSize}\n ref={canvasRef}\n />\n </div>\n );\n\n return { start, children };\n};\n","import { ComponentProps, ForwardedRef, forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport { Icon, IconProps } from '../Icon';\n\nexport type ButtonWithIconProps = {\n enabled?: boolean;\n variant?: string;\n} & ComponentProps<'button'> &\n IconProps;\n\nexport const IconButton = forwardRef(function IconButton(\n props: ButtonWithIconProps,\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n const { icon, enabled, variant, onClick, className, ...rest } = props;\n return (\n <button\n className={clsx('str-video__call-controls__button', className, {\n [`str-video__call-controls__button--variant-${variant}`]: variant,\n 'str-video__call-controls__button--enabled': enabled,\n })}\n onClick={(e) => {\n e.preventDefault();\n onClick?.(e);\n }}\n ref={ref}\n {...rest}\n >\n <Icon icon={icon} />\n </button>\n );\n});\n","import clsx from 'clsx';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport {\n ComponentProps,\n ComponentType,\n forwardRef,\n PropsWithChildren,\n ReactElement,\n} from 'react';\nimport { Placement } from '@floating-ui/react';\n\nimport { IconButton } from './IconButton';\nimport { isComponentType } from '../../utilities';\n\nexport type IconButtonWithMenuProps<E extends HTMLElement = HTMLButtonElement> =\n PropsWithChildren<{\n active?: boolean;\n Menu?: ComponentType | ReactElement | null;\n caption?: string;\n className?: string;\n menuPlacement?: Placement;\n menuOffset?: number;\n ToggleMenuButton?: ComponentType<ToggleMenuButtonProps<E>>;\n variant?: 'primary' | 'secondary';\n onMenuToggle?: (menuShown: boolean) => void;\n }> &\n ComponentProps<'button'>;\n\nexport const CompositeButton = forwardRef<\n HTMLDivElement,\n IconButtonWithMenuProps\n>(function CompositeButton(\n {\n disabled,\n caption,\n children,\n className,\n active,\n Menu,\n menuPlacement,\n menuOffset,\n title,\n ToggleMenuButton = DefaultToggleMenuButton,\n variant,\n onClick,\n onMenuToggle,\n ...restButtonProps\n },\n ref,\n) {\n return (\n <div\n className={clsx('str-video__composite-button', className, {\n 'str-video__composite-button--caption': caption,\n 'str-video__composite-button--menu': Menu,\n })}\n title={title}\n ref={ref}\n >\n <div\n className={clsx('str-video__composite-button__button-group', {\n 'str-video__composite-button__button-group--active': active,\n 'str-video__composite-button__button-group--active-primary':\n active && variant === 'primary',\n 'str-video__composite-button__button-group--active-secondary':\n active && variant === 'secondary',\n 'str-video__composite-button__button-group--disabled': disabled,\n })}\n >\n <button\n type=\"button\"\n className=\"str-video__composite-button__button\"\n onClick={(e) => {\n e.preventDefault();\n onClick?.(e);\n }}\n disabled={disabled}\n {...restButtonProps}\n >\n {children}\n </button>\n {Menu && (\n <MenuToggle\n offset={menuOffset}\n placement={menuPlacement}\n ToggleButton={ToggleMenuButton}\n onToggle={onMenuToggle}\n >\n {isComponentType(Menu) ? <Menu /> : Menu}\n </MenuToggle>\n )}\n </div>\n {caption && (\n <div className=\"str-video__composite-button__caption\">{caption}</div>\n )}\n </div>\n );\n});\n\nconst DefaultToggleMenuButton = forwardRef<\n HTMLButtonElement,\n ToggleMenuButtonProps\n>(function DefaultToggleMenuButton({ menuShown }, ref) {\n return (\n <IconButton\n className={clsx('str-video__menu-toggle-button', {\n 'str-video__menu-toggle-button--active': menuShown,\n })}\n icon={menuShown ? 'caret-down' : 'caret-up'}\n ref={ref}\n />\n );\n});\n","import { ComponentProps } from 'react';\n\nexport const TextButton = ({\n children,\n ...rest\n}: Omit<ComponentProps<'button'>, 'ref' | 'className'>) => {\n return (\n <button {...rest} className=\"str-video__text-button\">\n {children}\n </button>\n );\n};\n","import { MouseEventHandler, useCallback } from 'react';\nimport { IconButton } from '../Button';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type AcceptCallButtonProps = {\n disabled?: boolean;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onAccept?: () => void;\n};\n\nexport const AcceptCallButton = ({\n disabled,\n onAccept,\n onClick,\n}: AcceptCallButtonProps) => {\n const call = useCall();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n await call.join();\n onAccept?.();\n }\n },\n [onClick, onAccept, call],\n );\n return (\n <IconButton\n disabled={disabled}\n icon=\"call-accept\"\n variant=\"success\"\n data-testid=\"accept-call-button\"\n onClick={handleClick}\n />\n );\n};\n","import { PropsWithChildren, ReactNode, useEffect } from 'react';\nimport clsx from 'clsx';\nimport { Placement } from '@floating-ui/react';\nimport { useFloatingUIPreset } from '../../hooks';\n\nexport type NotificationProps = {\n message?: ReactNode;\n isVisible?: boolean;\n visibilityTimeout?: number;\n resetIsVisible?: () => void;\n placement?: Placement;\n className?: string;\n iconClassName?: string | null;\n close?: () => void;\n};\n\nexport const Notification = (props: PropsWithChildren<NotificationProps>) => {\n const {\n isVisible,\n message,\n children,\n visibilityTimeout,\n resetIsVisible,\n placement = 'top',\n className,\n iconClassName = 'str-video__notification__icon',\n close,\n } = props;\n\n const { refs, x, y, strategy } = useFloatingUIPreset({\n placement,\n strategy: 'absolute',\n });\n\n useEffect(() => {\n if (!isVisible || !visibilityTimeout || !resetIsVisible) return;\n\n const timeout = setTimeout(() => {\n resetIsVisible();\n }, visibilityTimeout);\n\n return () => clearTimeout(timeout);\n }, [isVisible, resetIsVisible, visibilityTimeout]);\n\n return (\n <div ref={refs.setReference}>\n {isVisible && (\n <div\n className={clsx('str-video__notification', className)}\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n >\n {iconClassName && <i className={iconClassName} />}\n <span className=\"str-video__notification__message\">{message}</span>\n {close ? (\n <i\n className=\"str-video__icon str-video__icon--close str-video__notification__close\"\n onClick={close}\n />\n ) : null}\n </div>\n )}\n {children}\n </div>\n );\n};\n","import { Notification } from './Notification';\nimport { OwnCapability } from '@stream-io/video-client';\nimport {\n PropsWithChildren,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport type PermissionNotificationProps = PropsWithChildren<{\n /**\n * Set this to true if there is ongoing request for the permission.\n */\n isAwaitingApproval: boolean;\n\n /**\n * The message to display in the notification once\n * the requested permission is granted.\n */\n messageApproved: string;\n\n /**\n * The message to display in the notification once a permission\n * is revoked.\n */\n messageRevoked: string;\n\n /**\n * The message to display in the notification while\n * the requested permission is awaiting approval.\n */\n messageAwaitingApproval: string;\n\n /**\n * The permission to check for.\n */\n permission: OwnCapability;\n\n /**\n * The time in milliseconds to display the notification.\n * Defaults to 3500ms.\n */\n visibilityTimeout?: number;\n}>;\n\nexport const PermissionNotification = (props: PermissionNotificationProps) => {\n const {\n permission,\n isAwaitingApproval,\n messageApproved,\n messageAwaitingApproval,\n messageRevoked,\n visibilityTimeout = 3500,\n children,\n } = props;\n const { useHasPermissions } = useCallStateHooks();\n const hasPermission = useHasPermissions(permission);\n const prevHasPermission = useRef(hasPermission);\n const [showNotification, setShowNotification] = useState<\n 'granted' | 'revoked'\n >();\n useEffect(() => {\n if (prevHasPermission.current === hasPermission) return;\n\n if (hasPermission) {\n setShowNotification('granted');\n prevHasPermission.current = true;\n } else {\n setShowNotification('revoked');\n prevHasPermission.current = false;\n }\n }, [hasPermission]);\n\n const resetIsVisible = useCallback(() => setShowNotification(undefined), []);\n if (isAwaitingApproval) {\n return (\n <Notification\n isVisible={isAwaitingApproval && !hasPermission}\n message={messageAwaitingApproval}\n >\n {children}\n </Notification>\n );\n }\n\n return (\n <Notification\n isVisible={!!showNotification}\n visibilityTimeout={visibilityTimeout}\n resetIsVisible={resetIsVisible}\n message={\n showNotification === 'granted' ? messageApproved : messageRevoked\n }\n >\n {children}\n </Notification>\n );\n};\n","import { PropsWithChildren } from 'react';\nimport { Placement } from '@floating-ui/react';\n\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { Notification } from './Notification';\n\nexport type SpeakingWhileMutedNotificationProps = {\n /**\n * Text message displayed by the notification.\n */\n text?: string;\n placement?: Placement;\n};\n\nexport const SpeakingWhileMutedNotification = ({\n children,\n text,\n placement,\n}: PropsWithChildren<SpeakingWhileMutedNotificationProps>) => {\n const { useMicrophoneState } = useCallStateHooks();\n const { isSpeakingWhileMuted } = useMicrophoneState();\n const { t } = useI18n();\n\n const message = text ?? t('You are muted. Unmute to speak.');\n return (\n <Notification\n message={message}\n isVisible={isSpeakingWhileMuted}\n placement={placement || 'top-start'}\n >\n {children}\n </Notification>\n );\n};\n","import { PropsWithChildren, useEffect, useState } from 'react';\nimport {\n useI18n,\n useToggleCallRecording,\n} from '@stream-io/video-react-bindings';\nimport { Notification } from './Notification';\n\nexport type RecordingInProgressNotificationProps = {\n text?: string;\n};\n\nexport const RecordingInProgressNotification = ({\n children,\n text,\n}: PropsWithChildren<RecordingInProgressNotificationProps>) => {\n const { t } = useI18n();\n const { isCallRecordingInProgress } = useToggleCallRecording();\n\n const [isVisible, setVisible] = useState(false);\n\n const message = text ?? t('Recording in progress...');\n\n useEffect(() => {\n if (isCallRecordingInProgress) {\n setVisible(true);\n } else {\n setVisible(false);\n }\n }, [isCallRecordingInProgress]);\n\n return (\n <Notification\n message={message}\n iconClassName=\"str-video__icon str-video__icon--recording-on\"\n isVisible={isVisible}\n placement=\"top-start\"\n close={() => setVisible(false)}\n >\n {children}\n </Notification>\n );\n};\n","import clsx from 'clsx';\n\nexport type LoadingIndicatorProps = {\n className?: string;\n /** String will be injected into class and later used to apply as a CSS mask-image to an element as data URL */\n type?: string;\n /** Text to be displayed under the loading indicator icon */\n text?: string;\n /** Tooltip to be displayed on hover */\n tooltip?: string;\n};\n\nexport const LoadingIndicator = ({\n className,\n type = 'spinner',\n text,\n tooltip,\n}: LoadingIndicatorProps) => {\n return (\n <div\n className={clsx('str-video__loading-indicator', className)}\n title={tooltip}\n >\n <div className={clsx('str-video__loading-indicator__icon', type)}></div>\n {text && <p className=\"str-video__loading-indicator-text\">{text}</p>}\n </div>\n );\n};\n","import { PropsWithChildren, useEffect, useRef } from 'react';\nimport clsx from 'clsx';\nimport { useFloatingUIPreset } from '../../hooks';\nimport { FloatingArrow, Placement, arrow } from '@floating-ui/react';\n\nexport type TooltipProps<T extends HTMLElement> = PropsWithChildren<{\n /** Reference element to which the tooltip should attach to */\n referenceElement: T | null;\n /** Additional class applied to the tooltip root element */\n tooltipClassName?: string;\n /** Popper's modifier (offset) property - [xAxis offset, yAxis offset], default [0, 10] */\n offset?: [number, number];\n /** Popper's placement property defining default position of the tooltip, default 'top' */\n tooltipPlacement?: Placement;\n /** Tells component whether to render its contents */\n visible?: boolean;\n}>;\n\nexport const Tooltip = <T extends HTMLElement>({\n children,\n referenceElement,\n tooltipClassName,\n tooltipPlacement = 'top',\n visible = false,\n}: TooltipProps<T>) => {\n const arrowRef = useRef<SVGSVGElement>(null);\n const { refs, x, y, strategy, context } = useFloatingUIPreset({\n placement: tooltipPlacement,\n strategy: 'absolute',\n middleware: [arrow({ element: arrowRef })],\n });\n\n useEffect(() => {\n refs.setReference(referenceElement);\n }, [referenceElement, refs]);\n\n if (!visible) return null;\n\n return (\n <div\n className={clsx('str-video__tooltip', tooltipClassName)}\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n }}\n >\n <FloatingArrow\n ref={arrowRef}\n context={context}\n fill=\"var(--str-video__tooltip--background-color)\"\n />\n {children}\n </div>\n );\n};\n","import { MouseEventHandler, useCallback, useState } from 'react';\n\nexport const useEnterLeaveHandlers = <T extends HTMLElement>({\n onMouseEnter,\n onMouseLeave,\n}: Partial<\n Record<'onMouseEnter' | 'onMouseLeave', MouseEventHandler<T>>\n> = {}) => {\n const [tooltipVisible, setTooltipVisible] = useState(false);\n\n const handleMouseEnter: MouseEventHandler<T> = useCallback(\n (e) => {\n setTooltipVisible(true);\n onMouseEnter?.(e);\n },\n [onMouseEnter],\n );\n\n const handleMouseLeave: MouseEventHandler<T> = useCallback(\n (e) => {\n setTooltipVisible(false);\n onMouseLeave?.(e);\n },\n [onMouseLeave],\n );\n\n return { handleMouseEnter, handleMouseLeave, tooltipVisible };\n};\n","import { ComponentProps, useState } from 'react';\nimport { Tooltip, TooltipProps } from './Tooltip';\nimport { useEnterLeaveHandlers } from './hooks';\n\ntype WithPopupProps = ComponentProps<'div'> &\n Omit<TooltipProps<HTMLDivElement>, 'referenceElement' | 'children'> & {\n tooltipDisabled?: boolean;\n };\n\n// todo: duplicate of CallParticipantList.tsx#MediaIndicator - refactor to a single component\nexport const WithTooltip = ({\n title,\n tooltipClassName,\n tooltipPlacement,\n tooltipDisabled,\n ...props\n}: WithPopupProps) => {\n const { handleMouseEnter, handleMouseLeave, tooltipVisible } =\n useEnterLeaveHandlers<HTMLDivElement>();\n const [tooltipAnchor, setTooltipAnchor] = useState<HTMLDivElement | null>(\n null,\n );\n const tooltipActuallyVisible =\n !tooltipDisabled && Boolean(title) && tooltipVisible;\n\n return (\n <>\n <Tooltip\n referenceElement={tooltipAnchor}\n visible={tooltipActuallyVisible}\n tooltipClassName={tooltipClassName}\n tooltipPlacement={tooltipPlacement}\n >\n {title || ''}\n </Tooltip>\n <div\n ref={setTooltipAnchor}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n />\n </>\n );\n};\n","import { forwardRef } from 'react';\n\nimport { OwnCapability } from '@stream-io/video-client';\nimport {\n Restricted,\n useI18n,\n useToggleCallRecording,\n} from '@stream-io/video-react-bindings';\nimport { CompositeButton } from '../Button/';\nimport { Icon } from '../Icon';\nimport {\n MenuToggle,\n MenuVisualType,\n ToggleMenuButtonProps,\n useMenuContext,\n} from '../Menu';\nimport { LoadingIndicator } from '../LoadingIndicator';\nimport { WithTooltip } from '../Tooltip';\n\nexport type RecordCallButtonProps = {\n caption?: string;\n};\n\nconst RecordEndConfirmation = () => {\n const { t } = useI18n();\n const { toggleCallRecording, isAwaitingResponse } = useToggleCallRecording();\n\n const { close } = useMenuContext();\n\n return (\n <div className=\"str-video__end-recording__confirmation\">\n <div className=\"str-video__end-recording__header\">\n <Icon icon=\"recording-on\" />\n <h2 className=\"str-video__end-recording__heading\">\n {t('End recording')}\n </h2>\n </div>\n <p className=\"str-video__end-recording__description\">\n {t('Are you sure you want end the recording?')}\n </p>\n <div className=\"str-video__end-recording__actions\">\n <CompositeButton variant=\"secondary\" onClick={close}>\n {t('Cancel')}\n </CompositeButton>\n <CompositeButton variant=\"primary\" onClick={toggleCallRecording}>\n {isAwaitingResponse ? <LoadingIndicator /> : t('End recording')}\n </CompositeButton>\n </div>\n </div>\n );\n};\n\nconst ToggleEndRecordingMenuButton = forwardRef<\n HTMLDivElement,\n ToggleMenuButtonProps\n>(function ToggleEndRecordingMenuButton(props, ref) {\n return (\n <CompositeButton\n ref={ref}\n active={true}\n variant=\"secondary\"\n data-testid=\"recording-stop-button\"\n >\n <Icon icon=\"recording-off\" />\n </CompositeButton>\n );\n});\n\nexport const RecordCallConfirmationButton = ({\n caption,\n}: {\n caption?: string;\n}) => {\n const { t } = useI18n();\n const { toggleCallRecording, isAwaitingResponse, isCallRecordingInProgress } =\n useToggleCallRecording();\n\n if (isCallRecordingInProgress) {\n return (\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <MenuToggle\n ToggleButton={ToggleEndRecordingMenuButton}\n visualType={MenuVisualType.PORTAL}\n >\n <RecordEndConfirmation />\n </MenuToggle>\n </Restricted>\n );\n }\n\n const title = isAwaitingResponse\n ? t('Waiting for recording to start...')\n : (caption ?? t('Record call'));\n\n return (\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <WithTooltip title={title}>\n <CompositeButton\n active={isCallRecordingInProgress}\n caption={caption}\n variant=\"secondary\"\n data-testid=\"recording-start-button\"\n onClick={isAwaitingResponse ? undefined : toggleCallRecording}\n >\n {isAwaitingResponse ? (\n <LoadingIndicator />\n ) : (\n <Icon icon=\"recording-off\" />\n )}\n </CompositeButton>\n </WithTooltip>\n </Restricted>\n );\n};\n\nexport const RecordCallButton = ({ caption }: RecordCallButtonProps) => {\n const { t } = useI18n();\n const { toggleCallRecording, isAwaitingResponse, isCallRecordingInProgress } =\n useToggleCallRecording();\n\n let title = caption ?? t('Record call');\n\n if (isAwaitingResponse) {\n title = isCallRecordingInProgress\n ? t('Waiting for recording to stop...')\n : t('Waiting for recording to start...');\n }\n\n return (\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <CompositeButton\n active={isCallRecordingInProgress}\n caption={caption}\n variant=\"secondary\"\n data-testid={\n isCallRecordingInProgress\n ? 'recording-stop-button'\n : 'recording-start-button'\n }\n title={title}\n onClick={isAwaitingResponse ? undefined : toggleCallRecording}\n >\n {isAwaitingResponse ? (\n <LoadingIndicator />\n ) : (\n <Icon\n icon={isCallRecordingInProgress ? 'recording-on' : 'recording-off'}\n />\n )}\n </CompositeButton>\n </Restricted>\n );\n};\n","import { useEffect } from 'react';\nimport { StreamVideoParticipant } from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type ReactionProps = {\n participant: StreamVideoParticipant;\n hideAfterTimeoutInMs?: number;\n emojiReactionMap?: Record<string, string>;\n};\n\nexport const defaultEmojiReactionMap: Record<string, string> = {\n ':like:': '👍',\n ':raise-hand:': '✋',\n ':fireworks:': '🎉',\n ':dislike:': '👎',\n ':heart:': '❤️',\n ':smile:': '😀',\n};\n\nexport const Reaction = ({\n participant: { reaction, sessionId },\n hideAfterTimeoutInMs = 5500,\n emojiReactionMap = defaultEmojiReactionMap,\n}: ReactionProps) => {\n const call = useCall();\n\n useEffect(() => {\n if (!call || !reaction) return;\n\n const timeoutId = setTimeout(() => {\n call.resetReaction(sessionId);\n }, hideAfterTimeoutInMs);\n\n return () => {\n clearTimeout(timeoutId);\n };\n }, [call, hideAfterTimeoutInMs, reaction, sessionId]);\n\n if (!reaction) return null;\n\n const { emoji_code: emojiCode } = reaction;\n\n return (\n <div className=\"str-video__reaction\">\n <span className=\"str-video__reaction__emoji\">\n {emojiCode && emojiReactionMap[emojiCode]}\n </span>\n </div>\n );\n};\n","import { forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport { OwnCapability, StreamReaction } from '@stream-io/video-client';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\n\nimport {\n MenuToggle,\n MenuVisualType,\n ToggleMenuButtonProps,\n useMenuContext,\n} from '../Menu';\nimport { CompositeButton } from '../Button';\nimport { defaultEmojiReactionMap } from '../Reaction';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\n\nexport const defaultReactions: StreamReaction[] = [\n {\n type: 'reaction',\n emoji_code: ':like:',\n },\n {\n // TODO OL: use `prompt` type?\n type: 'raised-hand',\n emoji_code: ':raise-hand:',\n },\n {\n type: 'reaction',\n emoji_code: ':fireworks:',\n },\n {\n type: 'reaction',\n emoji_code: ':dislike:',\n },\n {\n type: 'reaction',\n emoji_code: ':heart:',\n },\n {\n type: 'reaction',\n emoji_code: ':smile:',\n },\n];\n\nexport interface ReactionsButtonProps {\n reactions?: StreamReaction[];\n}\n\nexport const ReactionsButton = ({\n reactions = defaultReactions,\n}: ReactionsButtonProps) => {\n return (\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <MenuToggle\n placement=\"top\"\n ToggleButton={ToggleReactionsMenuButton}\n visualType={MenuVisualType.MENU}\n >\n <DefaultReactionsMenu reactions={reactions} />\n </MenuToggle>\n </Restricted>\n );\n};\n\nconst ToggleReactionsMenuButton = forwardRef<\n HTMLDivElement,\n ToggleMenuButtonProps\n>(function ToggleReactionsMenuButton({ menuShown }, ref) {\n const { t } = useI18n();\n return (\n <WithTooltip title={t('Reactions')} tooltipDisabled={menuShown}>\n <CompositeButton ref={ref} active={menuShown} variant=\"primary\">\n <Icon icon=\"reactions\" />\n </CompositeButton>\n </WithTooltip>\n );\n});\n\nexport interface DefaultReactionsMenuProps {\n reactions: StreamReaction[];\n layout?: 'horizontal' | 'vertical';\n}\n\nexport const DefaultReactionsMenu = ({\n reactions,\n layout = 'horizontal',\n}: DefaultReactionsMenuProps) => {\n const call = useCall();\n const { close } = useMenuContext();\n return (\n <div\n className={clsx('str-video__reactions-menu', {\n 'str-video__reactions-menu--horizontal': layout === 'horizontal',\n 'str-video__reactions-menu--vertical': layout === 'vertical',\n })}\n >\n {reactions.map((reaction) => (\n <button\n key={reaction.emoji_code}\n type=\"button\"\n className=\"str-video__reactions-menu__button\"\n onClick={() => {\n call?.sendReaction(reaction);\n close?.();\n }}\n >\n {reaction.emoji_code && defaultEmojiReactionMap[reaction.emoji_code]}\n </button>\n ))}\n </div>\n );\n};\n","export type PropsWithErrorHandler<T = unknown> = T & {\n /**\n * Will be called if the call control action failed with an error (e.g. user didn't grant a\n * browser permission to enable a media device). If no callback is provided, just logs the error.\n * @param error Exception which caused call control action to fail\n */\n onError?: (error: unknown) => void;\n};\n\n/**\n * Wraps an event handler, silencing and logging exceptions (excluding the NotAllowedError\n * DOMException, which is a normal situation handled by the SDK)\n *\n * @param props component props, including the onError callback\n * @param handler event handler to wrap\n */\nexport const createCallControlHandler = (\n props: PropsWithErrorHandler,\n handler: () => Promise<void>,\n): (() => Promise<void>) => {\n return async () => {\n try {\n await handler();\n } catch (error) {\n if (props.onError) {\n props.onError(error);\n return;\n }\n\n if (!isNotAllowedError(error)) {\n console.error('Call control handler failed', error);\n }\n }\n };\n};\n\nfunction isNotAllowedError(error: unknown): error is DOMException {\n return error instanceof DOMException && error.name === 'NotAllowedError';\n}\n","import { OwnCapability } from '@stream-io/video-client';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n UseInputMediaDeviceOptions,\n} from '@stream-io/video-react-bindings';\nimport { CompositeButton } from '../Button/';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\nimport {\n PropsWithErrorHandler,\n createCallControlHandler,\n} from '../../utilities/callControlHandler';\n\nexport type ScreenShareButtonProps = PropsWithErrorHandler<\n {\n caption?: string;\n } & UseInputMediaDeviceOptions\n>;\n\nexport const ScreenShareButton = (props: ScreenShareButtonProps) => {\n const { t } = useI18n();\n const { caption, optimisticUpdates } = props;\n\n const { useHasOngoingScreenShare, useScreenShareState, useCallSettings } =\n useCallStateHooks();\n const isSomeoneScreenSharing = useHasOngoingScreenShare();\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(OwnCapability.SCREENSHARE);\n\n const callSettings = useCallSettings();\n const isScreenSharingAllowed = callSettings?.screensharing.enabled;\n\n const { screenShare, optionsAwareIsMute, isTogglePending } =\n useScreenShareState({\n optimisticUpdates,\n });\n const amIScreenSharing = !optionsAwareIsMute;\n const disableScreenShareButton =\n (!amIScreenSharing &&\n (isSomeoneScreenSharing || isScreenSharingAllowed === false)) ||\n (!optimisticUpdates && isTogglePending);\n const handleClick = createCallControlHandler(props, async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await screenShare.toggle();\n }\n });\n\n return (\n <Restricted requiredGrants={[OwnCapability.SCREENSHARE]}>\n <PermissionNotification\n permission={OwnCapability.SCREENSHARE}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now share your screen.')}\n messageAwaitingApproval={t('Awaiting for an approval to share screen.')}\n messageRevoked={t('You can no longer share your screen.')}\n >\n <WithTooltip title={caption ?? t('Share screen')}>\n <CompositeButton\n active={isSomeoneScreenSharing || amIScreenSharing}\n caption={caption}\n variant=\"primary\"\n data-testid={\n isSomeoneScreenSharing\n ? 'screen-share-stop-button'\n : 'screen-share-start-button'\n }\n disabled={disableScreenShareButton}\n onClick={handleClick}\n >\n <Icon\n icon={\n isSomeoneScreenSharing ? 'screen-share-on' : 'screen-share-off'\n }\n />\n </CompositeButton>\n </WithTooltip>\n </PermissionNotification>\n </Restricted>\n );\n};\n","import { useEffect, useState } from 'react';\nimport { createSoundDetector } from '@stream-io/video-client';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { Icon } from '../Icon';\n\nexport const AudioVolumeIndicator = () => {\n const { useMicrophoneState } = useCallStateHooks();\n const { isEnabled, mediaStream } = useMicrophoneState();\n const [audioLevel, setAudioLevel] = useState(0);\n\n useEffect(() => {\n if (!isEnabled || !mediaStream) return;\n const disposeSoundDetector = createSoundDetector(\n mediaStream,\n ({ audioLevel: al }) => setAudioLevel(al),\n { detectionFrequencyInMs: 80, destroyStreamOnStop: false },\n );\n return () => {\n disposeSoundDetector().catch(console.error);\n };\n }, [isEnabled, mediaStream]);\n\n return (\n <div className=\"str-video__audio-volume-indicator\">\n <Icon icon={isEnabled ? 'mic' : 'mic-off'} />\n <div className=\"str-video__audio-volume-indicator__bar\">\n <div\n className=\"str-video__audio-volume-indicator__bar-value\"\n style={{ transform: `scaleX(${audioLevel / 100})` }}\n />\n </div>\n </div>\n );\n};\n","import {\n createContext,\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport clsx from 'clsx';\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n useClick,\n useDismiss,\n useFloating,\n useInteractions,\n useListItem,\n useListNavigation,\n useRole,\n useTypeahead,\n} from '@floating-ui/react';\n\nimport { Icon } from '../Icon';\n\ninterface SelectContextValue {\n activeIndex: number | null;\n selectedIndex: number | null;\n getItemProps: ReturnType<typeof useInteractions>['getItemProps'];\n handleSelect: (index: number | null) => void;\n}\n\nconst SelectContext = createContext<SelectContextValue>(\n {} as SelectContextValue,\n);\n\nconst Select = (props: {\n children: ReactNode;\n icon?: string;\n defaultSelectedLabel: string;\n defaultSelectedIndex: number;\n handleSelect: (index: number) => void;\n}) => {\n const {\n children,\n icon,\n defaultSelectedLabel,\n defaultSelectedIndex,\n handleSelect: handleSelectProp,\n } = props;\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [selectedIndex, setSelectedIndex] = useState<number | null>(\n defaultSelectedIndex,\n );\n const [selectedLabel, setSelectedLabel] = useState<string | null>(\n defaultSelectedLabel,\n );\n\n const { refs, context } = useFloating({\n placement: 'bottom-start',\n open: isOpen,\n onOpenChange: setIsOpen,\n whileElementsMounted: autoUpdate,\n middleware: [flip()],\n });\n\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n const labelsRef = useRef<Array<string | null>>([]);\n\n const handleSelect = useCallback(\n (index: number | null) => {\n setSelectedIndex(index);\n handleSelectProp(index || 0);\n setIsOpen(false);\n if (index !== null) {\n setSelectedLabel(labelsRef.current[index]);\n }\n },\n [handleSelectProp],\n );\n\n const handleTypeaheadMatch = (index: number | null) => {\n if (isOpen) {\n setActiveIndex(index);\n } else {\n handleSelect(index);\n }\n };\n\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n selectedIndex,\n onNavigate: setActiveIndex,\n });\n const typeahead = useTypeahead(context, {\n listRef: labelsRef,\n activeIndex,\n selectedIndex,\n onMatch: handleTypeaheadMatch,\n });\n const click = useClick(context);\n const dismiss = useDismiss(context);\n const role = useRole(context, { role: 'listbox' });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [listNav, typeahead, click, dismiss, role],\n );\n\n const selectContext = useMemo(\n () => ({\n activeIndex,\n selectedIndex,\n getItemProps,\n handleSelect,\n }),\n [activeIndex, selectedIndex, getItemProps, handleSelect],\n );\n\n return (\n <div className=\"str-video__dropdown\">\n <div\n className=\"str-video__dropdown-selected\"\n ref={refs.setReference}\n tabIndex={0}\n {...getReferenceProps()}\n >\n <label className=\"str-video__dropdown-selected__label\">\n {icon && (\n <Icon className=\"str-video__dropdown-selected__icon\" icon={icon} />\n )}\n {selectedLabel}\n </label>\n <Icon\n className=\"str-video__dropdown-selected__chevron\"\n icon={isOpen ? 'chevron-up' : 'chevron-down'}\n />\n </div>\n <SelectContext.Provider value={selectContext}>\n {isOpen && (\n <FloatingFocusManager context={context} modal={false}>\n <div\n className=\"str-video__dropdown-list\"\n ref={refs.setFloating}\n {...getFloatingProps()}\n >\n <FloatingList elementsRef={elementsRef} labelsRef={labelsRef}>\n {children}\n </FloatingList>\n </div>\n </FloatingFocusManager>\n )}\n </SelectContext.Provider>\n </div>\n );\n};\n\nexport type DropDownSelectOptionProps = {\n label: string;\n selected?: boolean;\n icon?: string;\n};\n\nexport const DropDownSelectOption = (props: DropDownSelectOptionProps) => {\n const { selected, label, icon } = props;\n const { getItemProps, handleSelect } = useContext(SelectContext);\n const { ref, index } = useListItem();\n return (\n <div\n className={clsx('str-video__dropdown-option', {\n 'str-video__dropdown-option--selected': selected,\n })}\n ref={ref}\n {...getItemProps({\n onClick: () => handleSelect(index),\n })}\n >\n {icon && <Icon className=\"str-video__dropdown-icon\" icon={icon} />}\n <span className=\"str-video__dropdown-label\">{label}</span>\n </div>\n );\n};\n\nexport const DropDownSelect = (props: {\n icon?: string;\n defaultSelectedLabel: string;\n defaultSelectedIndex: number;\n handleSelect: (index: number) => void;\n children:\n | ReactElement<DropDownSelectOptionProps>\n | ReactElement<DropDownSelectOptionProps>[];\n}) => {\n const {\n children,\n icon,\n handleSelect,\n defaultSelectedLabel,\n defaultSelectedIndex,\n } = props;\n return (\n <Select\n icon={icon}\n handleSelect={handleSelect}\n defaultSelectedIndex={defaultSelectedIndex}\n defaultSelectedLabel={defaultSelectedLabel}\n >\n {children}\n </Select>\n );\n};\n","import clsx from 'clsx';\nimport { ChangeEventHandler, PropsWithChildren, useCallback } from 'react';\n\nimport { useDeviceList } from '../../hooks';\nimport { DropDownSelect, DropDownSelectOption } from '../DropdownSelect';\nimport { useMenuContext } from '../Menu';\n\ntype DeviceSelectorOptionProps = {\n id: string;\n label: string;\n name?: string;\n selected?: boolean;\n value: string;\n disabled?: boolean;\n defaultChecked?: boolean;\n onChange?: ChangeEventHandler<HTMLInputElement>;\n};\n\nconst DeviceSelectorOption = ({\n disabled,\n id,\n label,\n onChange,\n name,\n selected,\n defaultChecked,\n value,\n}: DeviceSelectorOptionProps) => {\n return (\n <label\n className={clsx('str-video__device-settings__option', {\n 'str-video__device-settings__option--selected': selected,\n 'str-video__device-settings__option--disabled': disabled,\n })}\n htmlFor={id}\n >\n <input\n type=\"radio\"\n name={name}\n onChange={onChange}\n value={value}\n id={id}\n checked={selected}\n defaultChecked={defaultChecked}\n disabled={disabled}\n />\n {label}\n </label>\n );\n};\n\nexport type DeviceSelectorType = 'audioinput' | 'audiooutput' | 'videoinput';\n\nconst DeviceSelectorList = (\n props: PropsWithChildren<{\n devices: MediaDeviceInfo[];\n type: DeviceSelectorType;\n selectedDeviceId?: string;\n title?: string;\n onChange?: (deviceId: string) => void;\n }>,\n) => {\n const {\n devices = [],\n selectedDeviceId,\n title,\n type,\n onChange,\n children,\n } = props;\n const { close } = useMenuContext();\n const { deviceList } = useDeviceList(devices, selectedDeviceId);\n\n return (\n <div className=\"str-video__device-settings__device-kind\">\n {title && (\n <div className=\"str-video__device-settings__device-selector-title\">\n {title}\n </div>\n )}\n {deviceList.map((device) => {\n return (\n <DeviceSelectorOption\n id={`${type}--${device.deviceId}`}\n value={device.deviceId}\n label={device.label}\n key={device.deviceId}\n onChange={(e) => {\n const deviceId = e.target.value;\n if (deviceId !== 'default') {\n onChange?.(deviceId);\n }\n close?.();\n }}\n name={type}\n selected={device.isSelected}\n />\n );\n })}\n {children}\n </div>\n );\n};\n\nconst DeviceSelectorDropdown = (props: {\n devices: MediaDeviceInfo[];\n selectedDeviceId?: string;\n title?: string;\n onChange?: (deviceId: string) => void;\n icon: string;\n}) => {\n const { devices = [], selectedDeviceId, title, onChange, icon } = props;\n const { deviceList, selectedDeviceInfo, selectedIndex } = useDeviceList(\n devices,\n selectedDeviceId,\n );\n\n const handleSelect = useCallback(\n (index: number) => {\n const deviceId = deviceList[index].deviceId;\n if (deviceId !== 'default') {\n onChange?.(deviceId);\n }\n },\n [deviceList, onChange],\n );\n\n return (\n <div className=\"str-video__device-settings__device-kind\">\n <div className=\"str-video__device-settings__device-selector-title\">\n {title}\n </div>\n <DropDownSelect\n icon={icon}\n defaultSelectedIndex={selectedIndex}\n defaultSelectedLabel={selectedDeviceInfo.label}\n handleSelect={handleSelect}\n >\n {deviceList.map((device) => (\n <DropDownSelectOption\n key={device.deviceId}\n icon={icon}\n label={device.label}\n selected={device.isSelected}\n />\n ))}\n </DropDownSelect>\n </div>\n );\n};\n\nexport const DeviceSelector = (\n props: PropsWithChildren<{\n devices: MediaDeviceInfo[];\n icon: string;\n type: DeviceSelectorType;\n selectedDeviceId?: string;\n title?: string;\n onChange?: (deviceId: string) => void;\n visualType?: 'list' | 'dropdown';\n }>,\n) => {\n const { visualType = 'list', icon, ...rest } = props;\n\n if (visualType === 'list') {\n return <DeviceSelectorList {...rest} />;\n }\n return <DeviceSelectorDropdown {...rest} icon={icon} />;\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { CompositeButton } from '../Button';\nimport { Icon } from '../Icon';\n\n/**\n * SpeakerTest component that plays a test audio through the selected speaker.\n * This allows users to verify their audio output device is working correctly.\n */\nexport const SpeakerTest = (props: { audioUrl?: string }) => {\n const { useSpeakerState } = useCallStateHooks();\n const { selectedDevice } = useSpeakerState();\n const audioElementRef = useRef<HTMLAudioElement | null>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const { t } = useI18n();\n\n const {\n audioUrl = `https://unpkg.com/${process.env.PKG_NAME}@${process.env.PKG_VERSION}/assets/piano.mp3`,\n } = props;\n\n // Update audio output device when selection changes\n useEffect(() => {\n const audio = audioElementRef.current;\n if (!audio || !selectedDevice) return;\n\n // Set the sinkId to route audio to the selected speaker\n if ('setSinkId' in audio) {\n audio.setSinkId(selectedDevice).catch((err) => {\n console.error('Failed to set audio output device:', err);\n });\n }\n }, [selectedDevice]);\n\n const handleStartTest = useCallback(async () => {\n const audio = audioElementRef.current;\n if (!audio) return;\n\n audio.src = audioUrl;\n\n try {\n if (isPlaying) {\n audio.pause();\n audio.currentTime = 0;\n setIsPlaying(false);\n } else {\n await audio.play();\n setIsPlaying(true);\n }\n } catch (err) {\n console.error('Failed to play test audio:', err);\n setIsPlaying(false);\n }\n }, [isPlaying, audioUrl]);\n\n const handleAudioEnded = useCallback(() => setIsPlaying(false), []);\n return (\n <div className=\"str-video__speaker-test\">\n <audio\n ref={audioElementRef}\n onEnded={handleAudioEnded}\n onPause={handleAudioEnded}\n />\n <CompositeButton\n className=\"str-video__speaker-test__button\"\n onClick={handleStartTest}\n type=\"button\"\n >\n <div className=\"str-video__speaker-test__button-content\">\n <Icon icon=\"speaker\" />\n {isPlaying ? t('Stop test') : t('Test speaker')}\n </div>\n </CompositeButton>\n </div>\n );\n};\n","import { useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { DeviceSelector } from './DeviceSelector';\nimport { AudioVolumeIndicator } from './AudioVolumeIndicator';\nimport { SpeakerTest } from './SpeakerTest';\n\nexport type DeviceSelectorAudioInputProps = {\n title?: string;\n visualType?: 'list' | 'dropdown';\n volumeIndicatorVisible?: boolean;\n};\n\nexport const DeviceSelectorAudioInput = ({\n title,\n visualType,\n volumeIndicatorVisible = true,\n}: DeviceSelectorAudioInputProps) => {\n const { useMicrophoneState } = useCallStateHooks();\n const { microphone, selectedDevice, devices } = useMicrophoneState();\n\n return (\n <DeviceSelector\n devices={devices || []}\n selectedDeviceId={selectedDevice}\n type=\"audioinput\"\n onChange={async (deviceId) => {\n await microphone.select(deviceId);\n }}\n title={title}\n visualType={visualType}\n icon=\"mic\"\n >\n {volumeIndicatorVisible && (\n <>\n <hr className=\"str-video__device-settings__separator\" />\n <AudioVolumeIndicator />\n </>\n )}\n </DeviceSelector>\n );\n};\n\nexport type DeviceSelectorAudioOutputProps = {\n title?: string;\n visualType?: 'list' | 'dropdown';\n speakerTestVisible?: boolean;\n speakerTestAudioUrl?: string;\n};\n\nexport const DeviceSelectorAudioOutput = ({\n title,\n visualType,\n speakerTestVisible = true,\n speakerTestAudioUrl,\n}: DeviceSelectorAudioOutputProps) => {\n const { useSpeakerState } = useCallStateHooks();\n const { speaker, selectedDevice, devices, isDeviceSelectionSupported } =\n useSpeakerState();\n\n if (!isDeviceSelectionSupported) return null;\n\n return (\n <DeviceSelector\n devices={devices}\n type=\"audiooutput\"\n selectedDeviceId={selectedDevice}\n onChange={(deviceId) => {\n speaker.select(deviceId);\n }}\n title={title}\n visualType={visualType}\n icon=\"speaker\"\n >\n {speakerTestVisible && (\n <>\n <hr className=\"str-video__device-settings__separator\" />\n <SpeakerTest audioUrl={speakerTestAudioUrl} />\n </>\n )}\n </DeviceSelector>\n );\n};\n","import { DeviceSelector } from './DeviceSelector';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport type DeviceSelectorVideoProps = {\n title?: string;\n visualType?: 'list' | 'dropdown';\n};\n\nexport const DeviceSelectorVideo = ({\n title,\n visualType,\n}: DeviceSelectorVideoProps) => {\n const { useCameraState } = useCallStateHooks();\n const { camera, devices, selectedDevice } = useCameraState();\n\n return (\n <DeviceSelector\n devices={devices || []}\n type=\"videoinput\"\n selectedDeviceId={selectedDevice}\n onChange={async (deviceId) => {\n await camera.select(deviceId);\n }}\n title={title}\n visualType={visualType}\n icon=\"camera\"\n />\n );\n};\n","import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\nimport { MenuToggle, MenuVisualType, ToggleMenuButtonProps } from '../Menu';\nimport {\n DeviceSelectorAudioInput,\n DeviceSelectorAudioOutput,\n} from './DeviceSelectorAudio';\nimport { DeviceSelectorVideo } from './DeviceSelectorVideo';\nimport { IconButton } from '../Button';\n\nexport type DeviceSettingsProps = {\n visualType?: MenuVisualType;\n};\n\nexport const DeviceSettings = ({\n visualType = MenuVisualType.MENU,\n}: DeviceSettingsProps) => {\n return (\n <MenuToggle\n placement=\"bottom-end\"\n ToggleButton={ToggleDeviceSettingsMenuButton}\n visualType={visualType}\n >\n <Menu />\n </MenuToggle>\n );\n};\n\nconst Menu = () => {\n const { t } = useI18n();\n return (\n <div className=\"str-video__device-settings\">\n <DeviceSelectorVideo title={t('Select a Camera')} />\n <DeviceSelectorAudioInput title={t('Select a Mic')} />\n <DeviceSelectorAudioOutput title={t('Select Speakers')} />\n </div>\n );\n};\n\nconst ToggleDeviceSettingsMenuButton = forwardRef<\n HTMLButtonElement,\n ToggleMenuButtonProps\n>(function ToggleDeviceSettingsMenuButton({ menuShown }, ref) {\n const { t } = useI18n();\n return (\n <IconButton\n className={clsx('str-video__device-settings__button', {\n 'str-video__device-settings__button--active': menuShown,\n })}\n title={t('Toggle device menu')}\n icon=\"device-settings\"\n ref={ref}\n />\n );\n});\n","import { OwnCapability } from '@stream-io/video-client';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n type UseInputMediaDeviceOptions,\n} from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\nimport { CompositeButton, IconButtonWithMenuProps } from '../Button';\nimport { DeviceSelectorAudioInput } from '../DeviceSettings';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\nimport { useState } from 'react';\nimport {\n createCallControlHandler,\n PropsWithErrorHandler,\n} from '../../utilities/callControlHandler';\n\nexport type ToggleAudioPreviewButtonProps = PropsWithErrorHandler<\n Pick<\n IconButtonWithMenuProps,\n 'caption' | 'Menu' | 'menuPlacement' | 'onMenuToggle'\n > &\n UseInputMediaDeviceOptions\n>;\n\nexport const ToggleAudioPreviewButton = (\n props: ToggleAudioPreviewButtonProps,\n) => {\n const {\n caption,\n Menu = DeviceSelectorAudioInput,\n menuPlacement = 'top',\n onMenuToggle,\n optimisticUpdates,\n ...restCompositeButtonProps\n } = props;\n const { t } = useI18n();\n const { useMicrophoneState } = useCallStateHooks();\n const {\n microphone,\n hasBrowserPermission,\n isPromptingPermission,\n optionsAwareIsMute,\n isTogglePending,\n } = useMicrophoneState({ optimisticUpdates });\n const [tooltipDisabled, setTooltipDisabled] = useState(false);\n const handleClick = createCallControlHandler(props, () =>\n microphone.toggle(),\n );\n\n return (\n <WithTooltip\n title={\n !hasBrowserPermission\n ? t('Check your browser audio permissions')\n : (caption ?? t('Mic'))\n }\n tooltipDisabled={tooltipDisabled}\n >\n <CompositeButton\n active={optionsAwareIsMute}\n caption={caption}\n className={clsx(\n !hasBrowserPermission && 'str-video__device-unavailable',\n )}\n variant=\"secondary\"\n disabled={\n !hasBrowserPermission || (!optimisticUpdates && isTogglePending)\n }\n data-testid={\n optionsAwareIsMute\n ? 'preview-audio-unmute-button'\n : 'preview-audio-mute-button'\n }\n onClick={handleClick}\n Menu={Menu}\n menuPlacement={menuPlacement}\n {...restCompositeButtonProps}\n onMenuToggle={(shown) => {\n setTooltipDisabled(shown);\n onMenuToggle?.(shown);\n }}\n >\n <Icon icon={!optionsAwareIsMute ? 'mic' : 'mic-off'} />\n {!hasBrowserPermission && (\n <span\n className=\"str-video__no-media-permission\"\n title={t('Check your browser audio permissions')}\n children=\"!\"\n />\n )}\n {isPromptingPermission && (\n <span\n className=\"str-video__pending-permission\"\n title={t('Waiting for permission')}\n children=\"?\"\n />\n )}\n </CompositeButton>\n </WithTooltip>\n );\n};\n\nexport type ToggleAudioPublishingButtonProps = PropsWithErrorHandler<\n Pick<\n IconButtonWithMenuProps,\n 'caption' | 'Menu' | 'menuPlacement' | 'onMenuToggle'\n > &\n UseInputMediaDeviceOptions\n>;\n\nexport const ToggleAudioPublishingButton = (\n props: ToggleAudioPublishingButtonProps,\n) => {\n const { t } = useI18n();\n const {\n caption,\n Menu = <DeviceSelectorAudioInput visualType=\"list\" />,\n menuPlacement = 'top',\n onMenuToggle,\n optimisticUpdates,\n ...restCompositeButtonProps\n } = props;\n\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(OwnCapability.SEND_AUDIO);\n\n const { useMicrophoneState } = useCallStateHooks();\n const {\n microphone,\n hasBrowserPermission,\n isPromptingPermission,\n isTogglePending,\n optionsAwareIsMute,\n } = useMicrophoneState({ optimisticUpdates });\n\n const [tooltipDisabled, setTooltipDisabled] = useState(false);\n const handleClick = createCallControlHandler(props, async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await microphone.toggle();\n }\n });\n\n return (\n <Restricted requiredGrants={[OwnCapability.SEND_AUDIO]}>\n <PermissionNotification\n permission={OwnCapability.SEND_AUDIO}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now speak.')}\n messageAwaitingApproval={t('Awaiting for an approval to speak.')}\n messageRevoked={t('You can no longer speak.')}\n >\n <WithTooltip\n title={\n !hasPermission\n ? t('You have no permission to share your audio')\n : !hasBrowserPermission\n ? t('Check your browser mic permissions')\n : (caption ?? t('Mic'))\n }\n tooltipDisabled={tooltipDisabled}\n >\n <CompositeButton\n active={optionsAwareIsMute}\n caption={caption}\n variant=\"secondary\"\n disabled={\n !hasBrowserPermission ||\n !hasPermission ||\n // disable button while the toggle action is pending when not using optimistic updates\n (!optimisticUpdates && isTogglePending)\n }\n data-testid={\n optionsAwareIsMute ? 'audio-unmute-button' : 'audio-mute-button'\n }\n onClick={handleClick}\n Menu={Menu}\n menuPlacement={menuPlacement}\n menuOffset={16}\n {...restCompositeButtonProps}\n onMenuToggle={(shown) => {\n setTooltipDisabled(shown);\n onMenuToggle?.(shown);\n }}\n >\n <Icon icon={optionsAwareIsMute ? 'mic-off' : 'mic'} />\n {(!hasBrowserPermission || !hasPermission) && (\n <span className=\"str-video__no-media-permission\">!</span>\n )}\n {isPromptingPermission && (\n <span\n className=\"str-video__pending-permission\"\n title={t('Waiting for permission')}\n >\n ?\n </span>\n )}\n </CompositeButton>\n </WithTooltip>\n </PermissionNotification>\n </Restricted>\n );\n};\n","import {\n Restricted,\n useCallStateHooks,\n useI18n,\n UseInputMediaDeviceOptions,\n} from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\nimport { OwnCapability } from '@stream-io/video-client';\nimport { CompositeButton, IconButtonWithMenuProps } from '../Button/';\nimport { DeviceSelectorVideo } from '../DeviceSettings';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\nimport { useState } from 'react';\nimport {\n createCallControlHandler,\n PropsWithErrorHandler,\n} from '../../utilities/callControlHandler';\n\nexport type ToggleVideoPreviewButtonProps = PropsWithErrorHandler<\n Pick<\n IconButtonWithMenuProps,\n 'caption' | 'Menu' | 'menuPlacement' | 'onMenuToggle'\n > &\n UseInputMediaDeviceOptions\n>;\n\nexport const ToggleVideoPreviewButton = (\n props: ToggleVideoPreviewButtonProps,\n) => {\n const {\n caption,\n Menu = DeviceSelectorVideo,\n menuPlacement = 'top',\n onMenuToggle,\n optimisticUpdates,\n ...restCompositeButtonProps\n } = props;\n const { t } = useI18n();\n const { useCameraState } = useCallStateHooks();\n const {\n camera,\n hasBrowserPermission,\n isPromptingPermission,\n isTogglePending,\n optionsAwareIsMute,\n } = useCameraState({ optimisticUpdates });\n const [tooltipDisabled, setTooltipDisabled] = useState(false);\n const handleClick = createCallControlHandler(props, () => camera.toggle());\n\n return (\n <WithTooltip\n title={\n !hasBrowserPermission\n ? t('Check your browser video permissions')\n : (caption ?? t('Video'))\n }\n tooltipDisabled={tooltipDisabled}\n >\n <CompositeButton\n active={optionsAwareIsMute}\n caption={caption}\n className={clsx(\n !hasBrowserPermission && 'str-video__device-unavailable',\n )}\n variant=\"secondary\"\n data-testid={\n optionsAwareIsMute\n ? 'preview-video-unmute-button'\n : 'preview-video-mute-button'\n }\n onClick={handleClick}\n disabled={\n !hasBrowserPermission || (!optimisticUpdates && isTogglePending)\n }\n Menu={Menu}\n menuPlacement={menuPlacement}\n {...restCompositeButtonProps}\n onMenuToggle={(shown) => {\n setTooltipDisabled(shown);\n onMenuToggle?.(shown);\n }}\n >\n <Icon icon={!optionsAwareIsMute ? 'camera' : 'camera-off'} />\n {!hasBrowserPermission && (\n <span\n className=\"str-video__no-media-permission\"\n title={t('Check your browser video permissions')}\n children=\"!\"\n />\n )}\n {isPromptingPermission && (\n <span\n className=\"str-video__pending-permission\"\n title={t('Waiting for permission')}\n children=\"?\"\n />\n )}\n </CompositeButton>\n </WithTooltip>\n );\n};\n\ntype ToggleVideoPublishingButtonProps = PropsWithErrorHandler<\n Pick<\n IconButtonWithMenuProps,\n 'caption' | 'Menu' | 'menuPlacement' | 'onMenuToggle'\n > &\n UseInputMediaDeviceOptions\n>;\n\nexport const ToggleVideoPublishingButton = (\n props: ToggleVideoPublishingButtonProps,\n) => {\n const { t } = useI18n();\n const {\n caption,\n Menu = <DeviceSelectorVideo visualType=\"list\" />,\n menuPlacement = 'top',\n onMenuToggle,\n optimisticUpdates,\n ...restCompositeButtonProps\n } = props;\n\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(OwnCapability.SEND_VIDEO);\n\n const { useCameraState, useCallSettings } = useCallStateHooks();\n const {\n camera,\n optionsAwareIsMute,\n hasBrowserPermission,\n isPromptingPermission,\n isTogglePending,\n } = useCameraState({ optimisticUpdates });\n const callSettings = useCallSettings();\n const isPublishingVideoAllowed = callSettings?.video.enabled;\n const [tooltipDisabled, setTooltipDisabled] = useState(false);\n const handleClick = createCallControlHandler(props, async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await camera.toggle();\n }\n });\n\n return (\n <Restricted requiredGrants={[OwnCapability.SEND_VIDEO]}>\n <PermissionNotification\n permission={OwnCapability.SEND_VIDEO}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now share your video.')}\n messageAwaitingApproval={t(\n 'Awaiting for an approval to share your video.',\n )}\n messageRevoked={t('You can no longer share your video.')}\n >\n <WithTooltip\n title={\n !hasPermission\n ? t('You have no permission to share your video')\n : !hasBrowserPermission\n ? t('Check your browser video permissions')\n : !isPublishingVideoAllowed\n ? t('Video publishing is disabled by the system')\n : caption || t('Video')\n }\n tooltipDisabled={tooltipDisabled}\n >\n <CompositeButton\n active={optionsAwareIsMute}\n caption={caption}\n variant=\"secondary\"\n disabled={\n !hasBrowserPermission ||\n !hasPermission ||\n !isPublishingVideoAllowed ||\n (!optimisticUpdates && isTogglePending)\n }\n data-testid={\n optionsAwareIsMute ? 'video-unmute-button' : 'video-mute-button'\n }\n onClick={handleClick}\n Menu={Menu}\n menuPlacement={menuPlacement}\n menuOffset={16}\n {...restCompositeButtonProps}\n onMenuToggle={(shown) => {\n setTooltipDisabled(shown);\n onMenuToggle?.(shown);\n }}\n >\n <Icon icon={optionsAwareIsMute ? 'camera-off' : 'camera'} />\n {(!hasBrowserPermission ||\n !hasPermission ||\n !isPublishingVideoAllowed) && (\n <span className=\"str-video__no-media-permission\">!</span>\n )}\n {isPromptingPermission && (\n <span\n className=\"str-video__pending-permission\"\n title={t('Waiting for permission')}\n >\n ?\n </span>\n )}\n </CompositeButton>\n </WithTooltip>\n </PermissionNotification>\n </Restricted>\n );\n};\n","import { forwardRef, MouseEventHandler, useCallback } from 'react';\nimport { OwnCapability } from '@stream-io/video-client';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\n\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\n\nimport { IconButton } from '../Button';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\n\nconst EndCallMenu = (props: {\n onLeave: MouseEventHandler<HTMLButtonElement>;\n onEnd: MouseEventHandler<HTMLButtonElement>;\n}) => {\n const { onLeave, onEnd } = props;\n const { t } = useI18n();\n return (\n <div className=\"str-video__end-call__confirmation\">\n <button\n className=\"str-video__button str-video__end-call__leave\"\n type=\"button\"\n data-testid=\"leave-call-button\"\n onClick={onLeave}\n >\n <Icon\n className=\"str-video__button__icon str-video__end-call__leave-icon\"\n icon=\"logout\"\n />\n {t('Leave call')}\n </button>\n <Restricted requiredGrants={[OwnCapability.END_CALL]}>\n <button\n className=\"str-video__button str-video__end-call__end\"\n type=\"button\"\n data-testid=\"end-call-for-all-button\"\n onClick={onEnd}\n >\n <Icon\n className=\"str-video__button__icon str-video__end-call__end-icon\"\n icon=\"call-end\"\n />\n {t('End call for all')}\n </button>\n </Restricted>\n </div>\n );\n};\n\nconst CancelCallToggleMenuButton = forwardRef<\n HTMLButtonElement,\n ToggleMenuButtonProps\n>(function CancelCallToggleMenuButton({ menuShown }, ref) {\n const { t } = useI18n();\n return (\n <WithTooltip title={t('Leave call')} tooltipDisabled={menuShown}>\n <IconButton\n icon={menuShown ? 'close' : 'call-end'}\n variant={menuShown ? 'active' : 'danger'}\n data-testid=\"leave-call-button\"\n ref={ref}\n />\n </WithTooltip>\n );\n});\n\nexport type CancelCallButtonProps = {\n disabled?: boolean;\n caption?: string;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onLeave?: () => void;\n};\n\nexport const CancelCallConfirmButton = ({\n onClick,\n onLeave,\n}: CancelCallButtonProps) => {\n const call = useCall();\n\n const handleLeave: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n await call.leave();\n onLeave?.();\n }\n },\n [onClick, onLeave, call],\n );\n\n const handleEndCall: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n await call.endCall();\n onLeave?.();\n }\n },\n [onClick, onLeave, call],\n );\n\n return (\n <MenuToggle placement=\"top-start\" ToggleButton={CancelCallToggleMenuButton}>\n <EndCallMenu onEnd={handleEndCall} onLeave={handleLeave} />\n </MenuToggle>\n );\n};\n\nexport const CancelCallButton = ({\n disabled,\n caption,\n onClick,\n onLeave,\n}: CancelCallButtonProps) => {\n const call = useCall();\n const { t } = useI18n();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n await call.leave();\n onLeave?.();\n }\n },\n [onClick, onLeave, call],\n );\n return (\n <IconButton\n disabled={disabled}\n icon=\"call-end\"\n variant=\"danger\"\n title={caption ?? t('Leave call')}\n data-testid=\"cancel-call-button\"\n onClick={handleClick}\n />\n );\n};\n","import { OwnCapability } from '@stream-io/video-client';\nimport { Restricted } from '@stream-io/video-react-bindings';\nimport { SpeakingWhileMutedNotification } from '../Notification';\nimport { RecordCallButton } from './RecordCallButton';\nimport { ReactionsButton } from './ReactionsButton';\nimport { ScreenShareButton } from './ScreenShareButton';\nimport { ToggleAudioPublishingButton } from './ToggleAudioButton';\nimport { ToggleVideoPublishingButton } from './ToggleVideoButton';\nimport { CancelCallButton } from './CancelCallButton';\n\nexport type CallControlsProps = {\n onLeave?: () => void;\n};\n\nexport const CallControls = ({ onLeave }: CallControlsProps) => (\n <div className=\"str-video__call-controls\">\n <Restricted requiredGrants={[OwnCapability.SEND_AUDIO]}>\n <SpeakingWhileMutedNotification>\n <ToggleAudioPublishingButton />\n </SpeakingWhileMutedNotification>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.SEND_VIDEO]}>\n <ToggleVideoPublishingButton />\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <ReactionsButton />\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.SCREENSHARE]}>\n <ScreenShareButton />\n </Restricted>\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <RecordCallButton />\n </Restricted>\n <CancelCallButton onLeave={onLeave} />\n </div>\n);\n","import { lazy, ReactNode, Suspense, useEffect, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport {\n AggregatedStatsReport,\n CallStatsReport,\n SfuModels,\n} from '@stream-io/video-client';\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { useFloating, useHover, useInteractions } from '@floating-ui/react';\nimport { Icon } from '../Icon';\n\nconst CallStatsLatencyChart = lazy(() => import('./CallStatsLatencyChart'));\n\nenum Status {\n GOOD = 'Good',\n OK = 'Ok',\n BAD = 'Bad',\n}\n\nexport type CallStatsProps = {\n latencyLowBound?: number;\n latencyHighBound?: number;\n showCodecInfo?: boolean;\n LatencyChartSuspenseFallback?: ReactNode;\n};\n\nexport const CallStats = (props: CallStatsProps) => {\n const {\n latencyLowBound = 75,\n latencyHighBound = 400,\n showCodecInfo = false,\n LatencyChartSuspenseFallback = null,\n } = props;\n const [latencyBuffer, setLatencyBuffer] = useState<\n Array<{ x: number; y: number }>\n >(() => {\n const now = Date.now();\n return Array.from({ length: 20 }, (_, i) => ({ x: now + i, y: 0 }));\n });\n\n const { t } = useI18n();\n const [publishBitrate, setPublishBitrate] = useState('-');\n const [subscribeBitrate, setSubscribeBitrate] = useState('-');\n const previousStats = useRef<CallStatsReport>(undefined);\n const { useCallStatsReport } = useCallStateHooks();\n const callStatsReport = useCallStatsReport();\n\n useEffect(() => {\n if (!callStatsReport) return;\n if (!previousStats.current) {\n previousStats.current = callStatsReport;\n return;\n }\n const previousCallStatsReport = previousStats.current;\n setPublishBitrate(() => {\n return calculatePublishBitrate(previousCallStatsReport, callStatsReport);\n });\n setSubscribeBitrate(() => {\n return calculateSubscribeBitrate(\n previousCallStatsReport,\n callStatsReport,\n );\n });\n\n setLatencyBuffer((latencyBuf) => {\n const newLatencyBuffer = latencyBuf.slice(-19);\n newLatencyBuffer.push({\n x: callStatsReport.timestamp,\n y: callStatsReport.publisherStats.averageRoundTripTimeInMs,\n });\n return newLatencyBuffer;\n });\n\n previousStats.current = callStatsReport;\n }, [callStatsReport]);\n\n const latencyComparison = {\n lowBound: latencyLowBound,\n highBound: latencyHighBound,\n value: callStatsReport?.publisherStats.averageRoundTripTimeInMs || 0,\n };\n\n return (\n <div className=\"str-video__call-stats\">\n {callStatsReport && (\n <>\n <div className=\"str-video__call-stats__header\">\n <h3 className=\"str-video__call-stats__heading\">\n <Icon\n className=\"str-video__call-stats__icon\"\n icon=\"call-latency\"\n />\n {t('Call Latency')}\n </h3>\n <p className=\"str-video__call-stats__description\">\n {t(\n 'Very high latency values may reduce call quality, cause lag, and make the call less enjoyable.',\n )}\n </p>\n </div>\n\n <div className=\"str-video__call-stats__latencychart\">\n <Suspense fallback={LatencyChartSuspenseFallback}>\n <CallStatsLatencyChart values={latencyBuffer} />\n </Suspense>\n </div>\n\n <div className=\"str-video__call-stats__header\">\n <h3 className=\"str-video__call-stats__heading\">\n <Icon\n className=\"str-video__call-stats__icon\"\n icon=\"network-quality\"\n />\n {t('Call performance')}\n </h3>\n <p className=\"str-video__call-stats__description\">\n {t('Review the key data points below to assess call performance')}\n </p>\n </div>\n\n <div className=\"str-video__call-stats__card-container\">\n <StatCard label={t('Region')} value={callStatsReport.datacenter} />\n <StatCard\n label={t('Latency')}\n value={`${callStatsReport.publisherStats.averageRoundTripTimeInMs} ms.`}\n comparison={latencyComparison}\n />\n <StatCard\n label={t('Receive jitter')}\n value={`${callStatsReport.subscriberStats.averageJitterInMs} ms.`}\n comparison={{\n ...latencyComparison,\n value: callStatsReport.subscriberStats.averageJitterInMs,\n }}\n />\n <StatCard\n label={t('Publish jitter')}\n value={`${callStatsReport.publisherStats.averageJitterInMs} ms.`}\n comparison={{\n ...latencyComparison,\n value: callStatsReport.publisherStats.averageJitterInMs,\n }}\n />\n <StatCard\n label={`${t('Publish resolution')}${showCodecInfo ? formatCodec(callStatsReport) : ''}`}\n value={toFrameSize(callStatsReport.publisherStats)}\n />\n <StatCard\n label={t('Publish quality drop reason')}\n value={callStatsReport.publisherStats.qualityLimitationReasons}\n />\n <StatCard\n label={t('Receiving resolution')}\n value={toFrameSize(callStatsReport.subscriberStats)}\n />\n <StatCard\n label={t('Receive quality drop reason')}\n value={callStatsReport.subscriberStats.qualityLimitationReasons}\n />\n <StatCard label={t('Publish bitrate')} value={publishBitrate} />\n <StatCard label={t('Receiving bitrate')} value={subscribeBitrate} />\n </div>\n </>\n )}\n </div>\n );\n};\n\nconst StatCardExplanation = (props: { description: string }) => {\n const { description } = props;\n const [isOpen, setIsOpen] = useState(false);\n\n const { refs, floatingStyles, context } = useFloating({\n open: isOpen,\n onOpenChange: setIsOpen,\n });\n\n const hover = useHover(context);\n\n const { getReferenceProps, getFloatingProps } = useInteractions([hover]);\n\n return (\n <>\n <div\n className=\"str-video__call-explanation\"\n ref={refs.setReference}\n {...getReferenceProps()}\n >\n <Icon className=\"str-video__call-explanation__icon\" icon=\"info\" />\n </div>\n {isOpen && (\n <div\n className=\"str-video__call-explanation__description\"\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n >\n {description}\n </div>\n )}\n </>\n );\n};\n\nconst StatsTag = (props: { children: ReactNode; status: Status }) => {\n const { children, status } = props;\n return (\n <div\n className={clsx('str-video__call-stats__tag', {\n 'str-video__call-stats__tag--good': status === Status.GOOD,\n 'str-video__call-stats__tag--ok': status === Status.OK,\n 'str-video__call-stats__tag--bad': status === Status.BAD,\n })}\n >\n <div className=\"str-video__call-stats__tag__text\">{children}</div>\n </div>\n );\n};\n\nexport const StatCard = (props: {\n label: string;\n value: string | ReactNode;\n description?: string;\n comparison?: { value: number; highBound: number; lowBound: number };\n}) => {\n const { label, value, description, comparison } = props;\n\n const { t } = useI18n();\n const status = comparison ? toStatus(comparison) : undefined;\n\n return (\n <div className=\"str-video__call-stats__card\">\n <div className=\"str-video__call-stats__card-content\">\n <div className=\"str-video__call-stats__card-label\">\n {label}\n {description && <StatCardExplanation description={description} />}\n </div>\n <div className=\"str-video__call-stats__card-value\">{value}</div>\n </div>\n {status && <StatsTag status={status}>{t(status)}</StatsTag>}\n </div>\n );\n};\n\nconst toStatus = (config: {\n value: number;\n lowBound: number;\n highBound: number;\n}): Status => {\n const { value, lowBound, highBound } = config;\n if (value <= lowBound) return Status.GOOD;\n if (value >= lowBound && value <= highBound) return Status.OK;\n if (value >= highBound) return Status.BAD;\n return Status.GOOD;\n};\n\nconst toFrameSize = (stats: AggregatedStatsReport) => {\n const {\n highestFrameWidth: w,\n highestFrameHeight: h,\n highestFramesPerSecond: fps,\n } = stats;\n let size = `-`;\n if (w && h) {\n size = `${w}x${h}`;\n if (fps) {\n size += `@${fps}fps.`;\n }\n }\n return size;\n};\n\nconst formatCodec = (callStatsReport: CallStatsReport): string => {\n const { codecPerTrackType } = callStatsReport.publisherStats;\n if (!codecPerTrackType || !codecPerTrackType[SfuModels.TrackType.VIDEO]) {\n return '';\n }\n const [, name] = codecPerTrackType[SfuModels.TrackType.VIDEO].split('/');\n return name ? ` (${name})` : '';\n};\n\nconst calculatePublishBitrate = (\n previousCallStatsReport: CallStatsReport,\n callStatsReport: CallStatsReport,\n) => {\n const {\n publisherStats: {\n totalBytesSent: previousTotalBytesSent,\n timestamp: previousTimestamp,\n },\n } = previousCallStatsReport;\n\n const {\n publisherStats: { totalBytesSent, timestamp },\n } = callStatsReport;\n\n const bytesSent = totalBytesSent - previousTotalBytesSent;\n const timeElapsed = timestamp - previousTimestamp;\n return `${((bytesSent * 8) / timeElapsed).toFixed(2)} kbps`;\n};\n\nconst calculateSubscribeBitrate = (\n previousCallStatsReport: CallStatsReport,\n callStatsReport: CallStatsReport,\n) => {\n const {\n subscriberStats: {\n totalBytesReceived: previousTotalBytesReceived,\n timestamp: previousTimestamp,\n },\n } = previousCallStatsReport;\n\n const {\n subscriberStats: { totalBytesReceived, timestamp },\n } = callStatsReport;\n\n const bytesReceived = totalBytesReceived - previousTotalBytesReceived;\n const timeElapsed = timestamp - previousTimestamp;\n return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;\n};\n","import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\n\nimport { CallStats } from '../CallStats';\nimport { CompositeButton } from '../Button/';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport { Icon } from '../Icon';\n\nexport type CallStatsButtonProps = {\n caption?: string;\n};\n\nexport const CallStatsButton = () => (\n <MenuToggle placement=\"top-end\" ToggleButton={ToggleMenuButton}>\n <CallStats />\n </MenuToggle>\n);\n\nconst ToggleMenuButton = forwardRef<\n HTMLDivElement,\n ToggleMenuButtonProps<HTMLDivElement> & CallStatsButtonProps\n>(function ToggleMenuButton(props, ref) {\n const { t } = useI18n();\n const { caption, menuShown } = props;\n\n return (\n <CompositeButton\n ref={ref}\n active={menuShown}\n caption={caption}\n title={caption || t('Statistics')}\n data-testid=\"stats-button\"\n >\n <Icon icon=\"stats\" />\n </CompositeButton>\n );\n});\n","import { CompositeButton, IconButtonWithMenuProps } from '../Button';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport { Icon } from '../Icon';\nimport { DeviceSelectorAudioOutput } from '../DeviceSettings';\nimport { WithTooltip } from '../Tooltip';\nimport { useState } from 'react';\n\nexport type ToggleAudioOutputButtonProps = Pick<\n IconButtonWithMenuProps,\n 'caption' | 'Menu' | 'menuPlacement' | 'onMenuToggle'\n>;\n\nexport const ToggleAudioOutputButton = (\n props: ToggleAudioOutputButtonProps,\n) => {\n const { t } = useI18n();\n const {\n caption,\n Menu = DeviceSelectorAudioOutput,\n menuPlacement = 'top',\n onMenuToggle,\n } = props;\n const [tooltipDisabled, setTooltipDisabled] = useState(false);\n\n return (\n <WithTooltip\n title={caption || t('Speakers')}\n tooltipDisabled={tooltipDisabled}\n >\n <CompositeButton\n Menu={Menu}\n menuPlacement={menuPlacement}\n caption={caption}\n data-testid=\"audio-output-button\"\n onMenuToggle={(shown) => {\n setTooltipDisabled(shown);\n onMenuToggle?.(shown);\n }}\n >\n <Icon icon=\"speaker\" />\n </CompositeButton>\n </WithTooltip>\n );\n};\n","import { Restricted, useCall } from '@stream-io/video-react-bindings';\nimport { OwnCapability } from '@stream-io/video-client';\n\nimport { TextButton } from '../Button';\n\nexport const BlockedUserListing = ({ data }: { data: string[] }) => {\n if (!data.length) return null;\n\n return (\n <>\n <div className=\"str-video__participant-listing\">\n {data.map((userId) => (\n <BlockedUserListingItem key={userId} userId={userId} />\n ))}\n </div>\n </>\n );\n};\n\nconst BlockedUserListingItem = ({ userId }: { userId: string }) => {\n const call = useCall();\n\n const unblockUserClickHandler = () => {\n if (userId) call?.unblockUser(userId);\n };\n\n return (\n <div className=\"str-video__participant-listing-item\">\n <div className=\"str-video__participant-listing-item__display-name\">\n {userId}\n </div>\n <Restricted requiredGrants={[OwnCapability.BLOCK_USERS]}>\n <TextButton onClick={unblockUserClickHandler}>Unblock</TextButton>\n </Restricted>\n </div>\n );\n};\n","import { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\n\nimport { IconButton } from '../Button';\n\nexport type CallParticipantListHeaderProps = {\n /**\n * Click event listener function to be invoked to dismiss / hide the CallParticipantsList from the UI.\n */\n onClose: () => void;\n};\n\nexport const CallParticipantListHeader = ({\n onClose,\n}: CallParticipantListHeaderProps) => {\n const { useParticipants, useAnonymousParticipantCount } = useCallStateHooks();\n const participants = useParticipants();\n const anonymousParticipantCount = useAnonymousParticipantCount();\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__participant-list-header\">\n <div className=\"str-video__participant-list-header__title\">\n {t('Participants')}{' '}\n <span className=\"str-video__participant-list-header__title-count\">\n [{participants.length}]\n </span>\n {anonymousParticipantCount > 0 && (\n <span className=\"str-video__participant-list-header__title-anonymous\">\n {t('Anonymous', { count: anonymousParticipantCount })}\n </span>\n )}\n </div>\n <IconButton\n onClick={onClose}\n className=\"str-video__participant-list-header__close-button\"\n icon=\"close\"\n />\n </div>\n );\n};\n","import clsx from 'clsx';\nimport { ComponentProps, ComponentType, forwardRef } from 'react';\nimport { useConnectedUser, useI18n } from '@stream-io/video-react-bindings';\nimport {\n hasAudio,\n hasVideo,\n isPinned,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport { IconButton } from '../Button';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport { WithTooltip } from '../Tooltip';\nimport { Avatar } from '../Avatar';\nimport { ParticipantActionsContextMenu } from '../../core/components/ParticipantView/ParticipantActionsContextMenu';\nimport { ParticipantViewContext } from '../../core/components/ParticipantView/ParticipantViewContext';\n\ntype CallParticipantListingItemProps = {\n /** Participant object be rendered */\n participant: StreamVideoParticipant;\n /** Custom component used to display participant's name */\n DisplayName?: ComponentType<{ participant: StreamVideoParticipant }>;\n};\nexport const CallParticipantListingItem = ({\n participant,\n DisplayName = DefaultDisplayName,\n}: CallParticipantListingItemProps) => {\n const isAudioOn = hasAudio(participant);\n const isVideoOn = hasVideo(participant);\n const isPinnedOn = isPinned(participant);\n\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__participant-listing-item\">\n <Avatar name={participant.name} imageSrc={participant.image} />\n <DisplayName participant={participant} />\n <div className=\"str-video__participant-listing-item__media-indicator-group\">\n <MediaIndicator\n title={isAudioOn ? t('Microphone on') : t('Microphone off')}\n className={clsx(\n 'str-video__participant-listing-item__icon',\n `str-video__participant-listing-item__icon-${\n isAudioOn ? 'mic' : 'mic-off'\n }`,\n )}\n />\n <MediaIndicator\n title={isVideoOn ? t('Camera on') : t('Camera off')}\n className={clsx(\n 'str-video__participant-listing-item__icon',\n `str-video__participant-listing-item__icon-${\n isVideoOn ? 'camera' : 'camera-off'\n }`,\n )}\n />\n {isPinnedOn && (\n <MediaIndicator\n title={t('Pinned')}\n className={clsx(\n 'str-video__participant-listing-item__icon',\n 'str-video__participant-listing-item__icon-pinned',\n )}\n />\n )}\n\n <MenuToggle placement=\"bottom-end\" ToggleButton={ToggleButton}>\n <ParticipantViewContext.Provider\n value={{ participant, trackType: 'none' }}\n >\n <ParticipantActionsContextMenu />\n </ParticipantViewContext.Provider>\n </MenuToggle>\n </div>\n </div>\n );\n};\n\nconst MediaIndicator = (props: ComponentProps<'div'>) => (\n <WithTooltip {...props} />\n);\n\ntype DisplayNameProps = {\n /** Participant object that provides the data from which display name can be generated */\n participant: StreamVideoParticipant;\n};\n\nconst DefaultDisplayName = ({ participant }: DisplayNameProps) => {\n const connectedUser = useConnectedUser();\n const { t } = useI18n();\n\n const meFlag = participant.userId === connectedUser?.id ? t('Me') : '';\n const nameOrId = participant.name || participant.userId || t('Unknown');\n let displayName;\n if (!participant.name) {\n displayName = meFlag || nameOrId || t('Unknown');\n } else if (meFlag) {\n displayName = `${nameOrId} (${meFlag})`;\n } else {\n displayName = nameOrId;\n }\n\n return (\n <WithTooltip\n className=\"str-video__participant-listing-item__display-name\"\n title={displayName}\n >\n {displayName}\n </WithTooltip>\n );\n};\n\nconst ToggleButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n function ToggleButton(props, ref) {\n return <IconButton enabled={props.menuShown} icon=\"ellipsis\" ref={ref} />;\n },\n);\n","import { ComponentType } from 'react';\nimport { StreamVideoParticipant } from '@stream-io/video-client';\nimport { CallParticipantListingItem } from './CallParticipantListingItem';\n\nexport type CallParticipantListingProps = {\n /** Array of participant objects to be rendered */\n data: StreamVideoParticipant[];\n Header?: ComponentType;\n};\n\nexport const CallParticipantListing = ({\n data,\n}: CallParticipantListingProps) => (\n <div className=\"str-video__participant-listing\">\n {data.map((participant) => (\n <CallParticipantListingItem\n key={participant.sessionId}\n participant={participant}\n />\n ))}\n </div>\n);\n","import { useI18n } from '@stream-io/video-react-bindings';\n\nexport const EmptyParticipantSearchList = () => {\n const { t } = useI18n();\n return (\n <div className=\"str-video__participant-list--empty\">\n {t('No participants found')}\n </div>\n );\n};\n","import { ComponentProps, useEffect, useState } from 'react';\nimport clsx from 'clsx';\n\ntype SearchInputProps = ComponentProps<'input'> & {\n /**\n * Resets the search to its initial state.\n * The function is called when Esc key or inputs clear button are pressed\n */\n exitSearch: () => void;\n /**\n * Flag to signal, whether search input elements should be rendered as active\n */\n isActive: boolean;\n};\nexport const SearchInput = ({\n exitSearch,\n isActive,\n ...rest\n}: SearchInputProps) => {\n const [inputElement, setInputElement] = useState<HTMLInputElement | null>(\n null,\n );\n useEffect(() => {\n if (!inputElement) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() === 'escape') exitSearch();\n };\n\n inputElement.addEventListener('keydown', handleKeyDown);\n\n return () => {\n inputElement.removeEventListener('keydown', handleKeyDown);\n };\n }, [exitSearch, inputElement]);\n\n return (\n <div\n className={clsx('str-video__search-input__container', {\n 'str-video__search-input__container--active': isActive,\n })}\n >\n <input placeholder=\"Search\" {...rest} ref={setInputElement} />\n {isActive ? (\n <button\n className=\"str-video__search-input__clear-btn\"\n onClick={exitSearch}\n >\n <span className=\"str-video__search-input__icon--active\" />\n </button>\n ) : (\n <span className=\"str-video__search-input__icon\" />\n )}\n </div>\n );\n};\n","import { ComponentType } from 'react';\nimport { LoadingIndicator as DefaultLoadingIndicator } from '../LoadingIndicator';\nimport { SearchController } from './hooks';\n\nexport type SearchResultListProps<T> = {\n data: T[];\n};\n\nexport type SearchResultsProps<T> = Pick<\n SearchController<T>,\n 'searchResults' | 'searchQueryInProgress'\n> & {\n /** Component to be displayed, when empty array of search results is provided */\n EmptySearchResultComponent: ComponentType;\n /** Component will be used to render non-empty array of search results */\n SearchResultList: ComponentType<SearchResultListProps<T>>;\n /** Component to be displayed while the search query request is in progress */\n LoadingIndicator?: ComponentType;\n};\n\nexport function SearchResults<T>({\n EmptySearchResultComponent,\n LoadingIndicator = DefaultLoadingIndicator,\n searchQueryInProgress,\n searchResults,\n SearchResultList,\n}: SearchResultsProps<T>) {\n if (searchQueryInProgress) {\n return (\n <div className=\"str-video__search-results--loading\">\n <LoadingIndicator />\n </div>\n );\n }\n if (!searchResults.length) {\n return <EmptySearchResultComponent />;\n }\n\n return <SearchResultList data={searchResults} />;\n}\n","import { useEffect, useRef, useState } from 'react';\n\nexport type SearchController<T> = {\n /** Flag signals that the search request is flight await the response */\n searchQueryInProgress: boolean;\n /** Array of items returned by the search query */\n searchResults: T[];\n};\n\nexport type UseSearchParams<T> = {\n /** Search function performing the search request */\n searchFn: (searchQuery: string) => Promise<T[]>;\n /** Debounce interval applied to the search function */\n debounceInterval?: number;\n /** Search query string */\n searchQuery?: string;\n};\n\nexport const useSearch = <T>({\n debounceInterval = 200,\n searchFn,\n searchQuery = '',\n}: UseSearchParams<T>): SearchController<T> => {\n const [searchResults, setSearchResults] = useState<T[]>([]);\n const [searchQueryInProgress, setSearchQueryInProgress] = useState(false);\n\n const searchFnRef = useRef(searchFn);\n searchFnRef.current = searchFn;\n\n useEffect(() => {\n if (!searchQuery.length) {\n setSearchQueryInProgress(false);\n setSearchResults([]);\n return;\n }\n\n setSearchQueryInProgress(true);\n\n const timeout = setTimeout(async () => {\n try {\n const results = await searchFnRef.current(searchQuery);\n setSearchResults(results);\n } catch (error) {\n console.error(error);\n } finally {\n setSearchQueryInProgress(false);\n }\n }, debounceInterval);\n\n return () => {\n clearTimeout(timeout);\n };\n }, [debounceInterval, searchQuery]);\n\n return {\n searchQueryInProgress,\n searchResults,\n };\n};\n","import {\n Dispatch,\n forwardRef,\n SetStateAction,\n useCallback,\n useState,\n} from 'react';\nimport {\n Restricted,\n useCall,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport {\n name,\n OwnCapability,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\n\nimport { BlockedUserListing } from './BlockedUserListing';\nimport { IconButton, TextButton } from '../Button';\nimport { CallParticipantListHeader } from './CallParticipantListHeader';\nimport { CallParticipantListing } from './CallParticipantListing';\nimport { EmptyParticipantSearchList } from './EmptyParticipantSearchList';\nimport { LoadingIndicator } from '../LoadingIndicator';\nimport { SearchInput, SearchResults } from '../Search';\nimport { useSearch, UseSearchParams } from '../Search/hooks';\nimport {\n GenericMenu,\n GenericMenuButtonItem,\n MenuToggle,\n ToggleMenuButtonProps,\n} from '../Menu';\n\ntype CallParticipantListProps = {\n /** Click event listener function to be invoked in order to dismiss/hide the CallParticipantsList from the UI */\n onClose: () => void;\n /** Custom function to override the searching logic of active participants */\n activeUsersSearchFn?: UseSearchParams<StreamVideoParticipant>['searchFn'];\n /** Custom function to override the searching logic of blocked users */\n blockedUsersSearchFn?: UseSearchParams<string>['searchFn'];\n /** Interval in ms, during which the participant search calls will be debounced. The default value is 200ms. */\n debounceSearchInterval?: number;\n};\n\nconst UserListTypes = {\n active: 'Active users',\n blocked: 'Blocked users',\n} as const;\n\nexport const CallParticipantsList = ({\n onClose,\n activeUsersSearchFn,\n blockedUsersSearchFn,\n debounceSearchInterval,\n}: CallParticipantListProps) => {\n const [searchQuery, setSearchQuery] = useState('');\n const [userListType, setUserListType] =\n useState<keyof typeof UserListTypes>('active');\n\n const exitSearch = useCallback(() => setSearchQuery(''), []);\n\n return (\n <div className=\"str-video__participant-list\">\n <CallParticipantListHeader onClose={onClose} />\n <SearchInput\n value={searchQuery}\n onChange={({ currentTarget }) => setSearchQuery(currentTarget.value)}\n exitSearch={exitSearch}\n isActive={!!searchQuery}\n />\n <CallParticipantListContentHeader\n userListType={userListType}\n setUserListType={setUserListType}\n />\n <div className=\"str-video__participant-list__content\">\n {userListType === 'active' && (\n <ActiveUsersSearchResults\n searchQuery={searchQuery}\n activeUsersSearchFn={activeUsersSearchFn}\n debounceSearchInterval={debounceSearchInterval}\n />\n )}\n {userListType === 'blocked' && (\n <BlockedUsersSearchResults\n searchQuery={searchQuery}\n blockedUsersSearchFn={blockedUsersSearchFn}\n debounceSearchInterval={debounceSearchInterval}\n />\n )}\n </div>\n </div>\n );\n};\n\nconst CallParticipantListContentHeader = ({\n userListType,\n setUserListType,\n}: {\n userListType: keyof typeof UserListTypes;\n setUserListType: Dispatch<SetStateAction<keyof typeof UserListTypes>>;\n}) => {\n const call = useCall();\n const { t } = useI18n();\n\n const muteAll = useCallback(() => {\n call?.muteAllUsers('audio');\n }, [call]);\n\n return (\n <div className=\"str-video__participant-list__content-header\">\n <div className=\"str-video__participant-list__content-header-title\">\n {userListType === 'active' && (\n <Restricted\n requiredGrants={[OwnCapability.MUTE_USERS]}\n hasPermissionsOnly\n >\n <TextButton onClick={muteAll}>{t('Mute all')}</TextButton>\n </Restricted>\n )}\n </div>\n <MenuToggle placement=\"bottom-end\" ToggleButton={ToggleButton}>\n <GenericMenu>\n {(\n Object.keys(UserListTypes) as Array<keyof typeof UserListTypes>\n ).map((lt) => (\n <GenericMenuButtonItem\n key={lt}\n aria-selected={lt === userListType}\n onClick={() => setUserListType(lt)}\n >\n {UserListTypes[lt]}\n </GenericMenuButtonItem>\n ))}\n </GenericMenu>\n </MenuToggle>\n </div>\n );\n};\n\nconst ActiveUsersSearchResults = ({\n searchQuery,\n activeUsersSearchFn: activeUsersSearchFnFromProps,\n debounceSearchInterval,\n}: Pick<\n CallParticipantListProps,\n 'activeUsersSearchFn' | 'debounceSearchInterval'\n> & { searchQuery: string }) => {\n const { useParticipants } = useCallStateHooks();\n const participants = useParticipants({ sortBy: name });\n\n const activeUsersSearchFn = useCallback(\n async (queryString: string) => {\n const queryRegExp = new RegExp(queryString, 'i');\n return participants.filter((p) => p.name.match(queryRegExp));\n },\n [participants],\n );\n\n const { searchQueryInProgress, searchResults } = useSearch({\n searchFn: activeUsersSearchFnFromProps ?? activeUsersSearchFn,\n debounceInterval: debounceSearchInterval,\n searchQuery,\n });\n\n return (\n <SearchResults<StreamVideoParticipant>\n EmptySearchResultComponent={EmptyParticipantSearchList}\n LoadingIndicator={LoadingIndicator}\n searchQueryInProgress={searchQueryInProgress}\n searchResults={searchQuery ? searchResults : participants}\n SearchResultList={CallParticipantListing}\n />\n );\n};\n\nconst BlockedUsersSearchResults = ({\n blockedUsersSearchFn: blockedUsersSearchFnFromProps,\n debounceSearchInterval,\n searchQuery,\n}: Pick<\n CallParticipantListProps,\n 'blockedUsersSearchFn' | 'debounceSearchInterval'\n> & { searchQuery: string }) => {\n const { useCallBlockedUserIds } = useCallStateHooks();\n const blockedUsers = useCallBlockedUserIds();\n\n const blockedUsersSearchFn = useCallback(\n async (queryString: string) => {\n const queryRegExp = new RegExp(queryString, 'i');\n return blockedUsers.filter((userId) => userId.match(queryRegExp));\n },\n [blockedUsers],\n );\n\n const { searchQueryInProgress, searchResults } = useSearch({\n searchFn: blockedUsersSearchFnFromProps ?? blockedUsersSearchFn,\n debounceInterval: debounceSearchInterval,\n searchQuery,\n });\n\n return (\n <SearchResults<string>\n EmptySearchResultComponent={EmptyParticipantSearchList}\n LoadingIndicator={LoadingIndicator}\n searchQueryInProgress={searchQueryInProgress}\n searchResults={searchQuery ? searchResults : blockedUsers}\n SearchResultList={BlockedUserListing}\n />\n );\n};\n\nconst ToggleButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n function ToggleButton(props, ref) {\n return <IconButton enabled={props.menuShown} icon=\"filter\" ref={ref} />;\n },\n);\n","import clsx from 'clsx';\nimport { CSSProperties, useEffect, useState } from 'react';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport type CallPreviewProps = {\n /**\n * Additional CSS class name to apply to the CallPreview element.\n */\n className?: string;\n\n /**\n * Additional CSS properties to apply to the CallPreview element.\n */\n style?: CSSProperties;\n};\n\nexport const CallPreview = (props: CallPreviewProps) => {\n const { className, style } = props;\n const call = useCall();\n const { useCallThumbnail } = useCallStateHooks();\n const thumbnail = useCallThumbnail();\n\n const [imageRef, setImageRef] = useState<HTMLImageElement | null>(null);\n useEffect(() => {\n if (!imageRef || !call) return;\n const cleanup = call.bindCallThumbnailElement(imageRef);\n return () => cleanup();\n }, [imageRef, call]);\n\n if (!thumbnail) return null;\n\n return (\n <img\n className={clsx('str-video__call-preview', className)}\n style={style}\n alt=\"Call Preview Thumbnail\"\n ref={setImageRef}\n />\n );\n};\n","import { CallRecording } from '@stream-io/video-client';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport { IconButton } from '../Button';\n\nexport type CallRecordingListHeaderProps = {\n /** Array of CallRecording objects */\n callRecordings: CallRecording[];\n /** Callback to be invoked when the refresh button is clicked */\n onRefresh?: () => void;\n};\n\nexport const CallRecordingListHeader = ({\n callRecordings,\n onRefresh,\n}: CallRecordingListHeaderProps) => {\n const { t } = useI18n();\n return (\n <div className=\"str-video__call-recording-list__header\">\n <div className=\"str-video__call-recording-list__title\">\n <span>{t('Call Recordings')}</span>\n {callRecordings.length ? <span>({callRecordings.length})</span> : null}\n </div>\n {onRefresh && (\n <IconButton icon=\"refresh\" title={t('Refresh')} onClick={onRefresh} />\n )}\n </div>\n );\n};\n","import clsx from 'clsx';\nimport { CallRecording } from '@stream-io/video-client';\nimport { Icon } from '../Icon';\n\nexport type CallRecordingListItemProps = {\n /** CallRecording object to represent */\n recording: CallRecording;\n};\n\nconst dateFormat = (date: string) => {\n const format = new Date(date);\n return format.toTimeString().split(' ')[0];\n};\nexport const CallRecordingListItem = ({\n recording,\n}: CallRecordingListItemProps) => {\n return (\n <li className=\"str-video__call-recording-list__item\">\n <div className=\"str-video__call-recording-list__table-cell str-video__call-recording-list__filename\">\n {recording.filename}\n </div>\n <div className=\"str-video__call-recording-list__table-cell str-video__call-recording-list__time\">\n {dateFormat(recording.start_time)}\n </div>\n <div className=\"str-video__call-recording-list__table-cell str-video__call-recording-list__time\">\n {dateFormat(recording.end_time)}\n </div>\n <div className=\"str-video__call-recording-list__table-cell str-video__call-recording-list__download\">\n <a\n className={clsx(\n 'str-video__call-recording-list-item__action-button',\n 'str-video__call-recording-list-item__action-button--download',\n )}\n role=\"button\"\n href={recording.url}\n download={recording.filename}\n title=\"Download the recording\"\n >\n <Icon icon=\"download\" />\n </a>\n </div>\n </li>\n );\n};\n","export const EmptyCallRecordingListing = () => {\n return (\n <div className=\"str-video__call-recording-list__listing str-video__call-recording-list__listing--empty\">\n <div className=\"str-video__call-recording-list__listing--icon-empty\" />\n <p className=\"str-video__call-recording-list__listing--text-empty\">\n {/* todo: introduce i18n to enable text customization */}\n No recordings available\n </p>\n </div>\n );\n};\n","import { CallRecording } from '@stream-io/video-client';\nimport { CallRecordingListItem } from './CallRecordingListItem';\nimport { LoadingIndicator } from '../LoadingIndicator';\n\nexport type LoadingCallRecordingListProps = {\n /** Array of CallRecording objects */\n callRecordings: CallRecording[];\n};\n\nexport const LoadingCallRecordingListing = ({\n callRecordings,\n}: LoadingCallRecordingListProps) => {\n return (\n <>\n {callRecordings.map((recording) => (\n <CallRecordingListItem recording={recording} key={recording.filename} />\n ))}\n <LoadingIndicator text=\"Recording getting ready\" />\n </>\n );\n};\n","import { ComponentType } from 'react';\nimport { CallRecording } from '@stream-io/video-client';\n\nimport {\n CallRecordingListHeader as DefaultCallRecordingListHeader,\n CallRecordingListHeaderProps,\n} from './CallRecordingListHeader';\nimport {\n CallRecordingListItem as DefaultCallRecordingListItem,\n CallRecordingListItemProps,\n} from './CallRecordingListItem';\nimport { EmptyCallRecordingListing as DefaultEmptyCallRecordingList } from './EmptyCallRecordingListing';\nimport {\n LoadingCallRecordingListing as DefaultLoadingCallRecordingList,\n LoadingCallRecordingListProps,\n} from './LoadingCallRecordingListing';\n\nexport type CallRecordingListProps = {\n /** Array of CallRecording objects to be displayed */\n callRecordings: CallRecording[];\n /** Custom component to replace the default header implementation */\n CallRecordingListHeader?: ComponentType<CallRecordingListHeaderProps>;\n /** Custom component to replace the default list item implementation */\n CallRecordingListItem?: ComponentType<CallRecordingListItemProps>;\n /** Custom component to replace the default empty list component implementation */\n EmptyCallRecordingList?: ComponentType;\n /** Signals that a request for new list of CallRecording object has been initiated */\n loading?: boolean;\n /** Custom component to be rendered when loading is true */\n LoadingCallRecordingList?: ComponentType<LoadingCallRecordingListProps>;\n /** Callback to be invoked when the refresh button is clicked */\n onRefresh?: () => void;\n};\n\nexport const CallRecordingList = ({\n callRecordings,\n CallRecordingListHeader = DefaultCallRecordingListHeader,\n CallRecordingListItem = DefaultCallRecordingListItem,\n EmptyCallRecordingList = DefaultEmptyCallRecordingList,\n loading,\n LoadingCallRecordingList = DefaultLoadingCallRecordingList,\n onRefresh,\n}: CallRecordingListProps) => {\n return (\n <div className=\"str-video__call-recording-list\">\n <CallRecordingListHeader\n callRecordings={callRecordings}\n onRefresh={onRefresh}\n />\n <div className=\"str-video__call-recording-list__listing\">\n {loading ? (\n <LoadingCallRecordingList callRecordings={callRecordings} />\n ) : callRecordings.length ? (\n <>\n <ul className=\"str-video__call-recording-list__list\">\n <li className=\"str-video__call-recording-list__item\">\n <div className=\"str-video__call-recording-list__filename\">\n Name\n </div>\n <div className=\"str-video__call-recording-list__time\">\n Start time\n </div>\n <div className=\"str-video__call-recording-list__time\">\n End time\n </div>\n <div className=\"str-video__call-recording-list__download\"></div>\n </li>\n </ul>\n <ul className=\"str-video__call-recording-list__list\">\n {callRecordings.map((recording) => (\n <CallRecordingListItem\n recording={recording}\n key={recording.filename}\n />\n ))}\n </ul>\n </>\n ) : (\n <EmptyCallRecordingList />\n )}\n </div>\n </div>\n );\n};\n","import {\n createContext,\n PropsWithChildren,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n NoiseCancellationSettingsModeEnum,\n OwnCapability,\n} from '@stream-io/video-client';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\nimport type { INoiseCancellation } from '@stream-io/audio-filters-web';\n\nexport type NoiseCancellationProviderProps = {\n /**\n * The noise cancellation instance to use.\n */\n noiseCancellation: INoiseCancellation;\n};\n\n/**\n * The Noise Cancellation API.\n */\nexport type NoiseCancellationAPI = {\n /**\n * A boolean providing information whether Noise Cancelling functionalities\n * are supported on this platform and for the current user.\n */\n isSupported: boolean | undefined;\n /**\n * Provides information whether Noise Cancellation is active or not.\n */\n isEnabled: boolean;\n /**\n * Allows you to temporarily enable or disable the Noise Cancellation filters.\n *\n * @param enabled a boolean or a setter.\n */\n setEnabled: (enabled: boolean | ((value: boolean) => boolean)) => void;\n\n /**\n * Sets the noise suppression level (0-100).\n *\n * @param level 0 for no suppression, 100 for maximum suppression.\n */\n setSuppressionLevel: (level: number) => void;\n};\n\nconst NoiseCancellationContext = createContext<NoiseCancellationAPI | null>(\n null,\n);\n\n/**\n * Exposes the NoiseCancellation API.\n * Throws an error if used outside <NoiseCancellationProvider />.\n */\nexport const useNoiseCancellation = (): NoiseCancellationAPI => {\n const context = useContext(NoiseCancellationContext);\n if (!context) {\n throw new Error(\n 'useNoiseCancellation must be used within a NoiseCancellationProvider',\n );\n }\n return context;\n};\n\nexport const NoiseCancellationProvider = (\n props: PropsWithChildren<NoiseCancellationProviderProps>,\n) => {\n const { children, noiseCancellation } = props;\n const call = useCall();\n const { useCallSettings, useHasPermissions } = useCallStateHooks();\n const settings = useCallSettings();\n const noiseCancellationAllowed = !!(\n settings &&\n settings.audio.noise_cancellation &&\n settings.audio.noise_cancellation.mode !==\n NoiseCancellationSettingsModeEnum.DISABLED\n );\n\n const hasCapability = useHasPermissions(\n OwnCapability.ENABLE_NOISE_CANCELLATION,\n );\n const [isSupportedByBrowser, setIsSupportedByBrowser] = useState<boolean>();\n useEffect(() => {\n const result = noiseCancellation.isSupported();\n if (typeof result === 'boolean') {\n setIsSupportedByBrowser(result);\n } else {\n result\n .then((s) => setIsSupportedByBrowser(s))\n .catch((err) =>\n console.error(\n `Can't determine if noise cancellation is supported`,\n err,\n ),\n );\n }\n }, [noiseCancellation]);\n\n const isSupported =\n isSupportedByBrowser && hasCapability && noiseCancellationAllowed;\n\n const [isEnabled, setIsEnabled] = useState(false);\n const deinit = useRef<Promise<void>>(undefined);\n useEffect(() => {\n if (!call || !isSupported) return;\n noiseCancellation.isEnabled().then((e) => setIsEnabled(e));\n const unsubscribe = noiseCancellation.on('change', (v) => setIsEnabled(v));\n const init = (deinit.current || Promise.resolve())\n .then(() => noiseCancellation.init({ tracer: call.tracer }))\n .then(() => call.microphone.enableNoiseCancellation(noiseCancellation))\n .catch((e) => console.error(`Can't initialize noise cancellation`, e));\n\n return () => {\n deinit.current = init\n .then(() => call.microphone.disableNoiseCancellation())\n .then(() => noiseCancellation.dispose())\n .then(() => unsubscribe());\n };\n }, [call, isSupported, noiseCancellation]);\n\n const contextValue = useMemo<NoiseCancellationAPI>(\n () => ({\n isSupported,\n isEnabled,\n setSuppressionLevel: (level) => {\n if (!noiseCancellation) return;\n noiseCancellation.setSuppressionLevel(level);\n },\n setEnabled: (enabledOrSetter) => {\n if (!noiseCancellation) return;\n const enable =\n typeof enabledOrSetter === 'function'\n ? enabledOrSetter(isEnabled)\n : enabledOrSetter;\n if (enable) {\n noiseCancellation.enable().catch((err) => {\n console.error('Failed to enable noise cancellation', err);\n });\n } else {\n noiseCancellation.disable().catch((err) => {\n console.error('Failed to disable noise cancellation', err);\n });\n }\n },\n }),\n [isEnabled, isSupported, noiseCancellation],\n );\n return (\n <NoiseCancellationContext.Provider value={contextValue}>\n {children}\n </NoiseCancellationContext.Provider>\n );\n};\n","import { CallingState } from '@stream-io/video-client';\nimport { AcceptCallButton, CancelCallButton } from '../CallControls';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport const RingingCallControls = () => {\n const call = useCall();\n const { useCallCallingState } = useCallStateHooks();\n const callCallingState = useCallCallingState();\n\n if (!call) return null;\n\n const buttonsDisabled = callCallingState !== CallingState.RINGING;\n return (\n <div className=\"str-video__pending-call-controls\">\n {call.isCreatedByMe ? (\n <CancelCallButton disabled={buttonsDisabled} />\n ) : (\n <>\n <AcceptCallButton disabled={buttonsDisabled} />\n <CancelCallButton\n onClick={() => {\n const reason = call.isCreatedByMe ? 'cancel' : 'decline';\n call.leave({ reject: true, reason });\n }}\n disabled={buttonsDisabled}\n />\n </>\n )}\n </div>\n );\n};\n","import { CallingState, UserResponse } from '@stream-io/video-client';\nimport {\n useCall,\n useCallStateHooks,\n useConnectedUser,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport { Avatar } from '../Avatar';\nimport { RingingCallControls } from './RingingCallControls';\n\nconst CALLING_STATE_TO_LABEL: Record<CallingState, string> = {\n [CallingState.JOINING]: 'Joining',\n [CallingState.RINGING]: 'Ringing',\n [CallingState.MIGRATING]: 'Migrating',\n [CallingState.RECONNECTING]: 'Re-connecting',\n [CallingState.RECONNECTING_FAILED]: 'Failed',\n [CallingState.OFFLINE]: 'No internet connection',\n [CallingState.IDLE]: '',\n [CallingState.UNKNOWN]: '',\n [CallingState.JOINED]: 'Joined',\n [CallingState.LEFT]: 'Left call',\n};\n\nexport type RingingCallProps = {\n /**\n * Whether to include the current user in the list of members to show.\n * @default false.\n */\n includeSelf?: boolean;\n\n /**\n * The maximum number of members to show.\n * @default 3.\n */\n totalMembersToShow?: number;\n};\n\nexport const RingingCall = (props: RingingCallProps) => {\n const { includeSelf = false, totalMembersToShow = 3 } = props;\n const call = useCall();\n const { t } = useI18n();\n const { useCallCallingState, useCallMembers } = useCallStateHooks();\n const callingState = useCallCallingState();\n const members = useCallMembers();\n const connectedUser = useConnectedUser();\n\n if (!call) return null;\n\n // take the first N members to show their avatars\n const membersToShow: UserResponse[] = (members || [])\n .slice(0, totalMembersToShow)\n .map(({ user }) => user)\n .filter((user) => user.id !== connectedUser?.id || includeSelf);\n if (\n includeSelf &&\n !membersToShow.find((user) => user.id === connectedUser?.id)\n ) {\n // if the current user is not in the initial batch of members,\n // replace the first item in membersToShow array with the current user\n const self = members.find(({ user }) => user.id === connectedUser?.id);\n if (self) {\n membersToShow.splice(0, 1, self.user);\n }\n }\n\n const callingStateLabel = CALLING_STATE_TO_LABEL[callingState];\n\n return (\n <div className=\"str-video__call-panel str-video__call-panel--ringing\">\n <div className=\"str-video__call-panel__members-list\">\n {membersToShow.map((user) => (\n <div key={user.id} className=\"str-video__call-panel__member-box\">\n <Avatar name={user.name} imageSrc={user.image} />\n {user.name && (\n <div className=\"str-video__member_details\">\n <span className=\"str-video__member_name\">{user.name}</span>\n </div>\n )}\n </div>\n ))}\n </div>\n\n {callingStateLabel && (\n <div className=\"str-video__call-panel__calling-state-label\">\n {t(callingStateLabel)}\n </div>\n )}\n\n {[CallingState.RINGING, CallingState.JOINING].includes(callingState) && (\n <RingingCallControls />\n )}\n </div>\n );\n};\n","import {\n ButtonHTMLAttributes,\n ComponentProps,\n forwardRef,\n Fragment,\n PropsWithChildren,\n useEffect,\n useState,\n} from 'react';\nimport {\n OwnCapability,\n PermissionRequestEvent,\n UserResponse,\n} from '@stream-io/video-client';\nimport {\n TranslatorFunction,\n useCall,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\n\nimport { useFloatingUIPreset } from '../../hooks';\n\nconst byNameOrId = (a: UserResponse, b: UserResponse) => {\n if (a.name && b.name && a.name < b.name) return -1;\n if (a.name && b.name && a.name > b.name) return 1;\n if (a.id < b.id) return -1;\n if (a.id > b.id) return 1;\n return 0;\n};\n\ntype HandleUpdatePermission = (\n request: PermissionRequestEvent,\n type: 'grant' | 'revoke' | 'dismiss',\n) => () => Promise<void>;\n\nexport const PermissionRequests = () => {\n const call = useCall();\n const { useLocalParticipant, useHasPermissions } = useCallStateHooks();\n const localParticipant = useLocalParticipant();\n const [expanded, setExpanded] = useState(false);\n const [permissionRequests, setPermissionRequests] = useState<\n PermissionRequestEvent[]\n >([]);\n const canUpdateCallPermissions = useHasPermissions(\n OwnCapability.UPDATE_CALL_PERMISSIONS,\n );\n\n const localUserId = localParticipant?.userId;\n useEffect(() => {\n if (!call || !canUpdateCallPermissions) return;\n return call.on('call.permission_request', (event) => {\n if (event.user.id !== localUserId) {\n setPermissionRequests((requests) =>\n [...requests, event].sort((a, b) => byNameOrId(a.user, b.user)),\n );\n }\n });\n }, [call, canUpdateCallPermissions, localUserId]);\n\n const handleUpdatePermission: HandleUpdatePermission = (request, type) => {\n return async () => {\n const { user, permissions } = request;\n switch (type) {\n case 'grant':\n await call?.grantPermissions(user.id, permissions);\n break;\n case 'revoke':\n await call?.revokePermissions(user.id, permissions);\n break;\n default:\n break;\n }\n setPermissionRequests((requests) =>\n requests.filter((r) => r !== request),\n );\n };\n };\n\n const { refs, x, y, strategy } = useFloatingUIPreset({\n placement: 'bottom',\n strategy: 'absolute',\n });\n\n // don't render anything if there are no permission requests\n if (permissionRequests.length === 0) return null;\n\n return (\n <div className=\"str-video__permission-requests\" ref={refs.setReference}>\n <div className=\"str-video__permission-requests__notification\">\n <span className=\"str-video__permission-requests__notification__message\">\n {permissionRequests.length} pending permission requests\n </span>\n <Button\n type=\"button\"\n onClick={() => {\n setExpanded((e) => !e);\n }}\n >\n {expanded ? 'Hide requests' : 'Show requests'}\n </Button>\n </div>\n {expanded && (\n <PermissionRequestList\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n permissionRequests={permissionRequests}\n handleUpdatePermission={handleUpdatePermission}\n />\n )}\n </div>\n );\n};\n\nexport type PermissionRequestListProps = ComponentProps<'div'> & {\n permissionRequests: PermissionRequestEvent[];\n handleUpdatePermission: HandleUpdatePermission;\n};\n\nexport const PermissionRequestList = forwardRef<\n HTMLDivElement,\n PermissionRequestListProps\n>(function PermissionRequestList(props, ref) {\n const { permissionRequests, handleUpdatePermission, ...rest } = props;\n\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__permission-requests-list\" ref={ref} {...rest}>\n {permissionRequests.map((request, reqIndex) => {\n const { user, permissions } = request;\n return (\n <Fragment key={`${user.id}/${reqIndex}`}>\n {permissions.map((permission) => (\n <div className=\"str-video__permission-request\" key={permission}>\n <div className=\"str-video__permission-request__message\">\n {messageForPermission(user.name || user.id, permission, t)}\n </div>\n <Button\n className=\"str-video__permission-request__button--allow\"\n type=\"button\"\n onClick={handleUpdatePermission(request, 'grant')}\n >\n {t('Allow')}\n </Button>\n <Button\n className=\"str-video__permission-request__button--reject\"\n type=\"button\"\n onClick={handleUpdatePermission(request, 'revoke')}\n >\n {t('Revoke')}\n </Button>\n <Button\n className=\"str-video__permission-request__button--reject\"\n type=\"button\"\n onClick={handleUpdatePermission(request, 'dismiss')}\n >\n {t('Dismiss')}\n </Button>\n </div>\n ))}\n </Fragment>\n );\n })}\n </div>\n );\n});\n\nconst Button = (\n props: PropsWithChildren<ButtonHTMLAttributes<HTMLButtonElement>>,\n) => {\n const { className, ...rest } = props;\n return (\n <button\n className={clsx('str-video__permission-request__button', className)}\n {...rest}\n />\n );\n};\n\nconst messageForPermission = (\n userName: string,\n permission: string,\n t: TranslatorFunction,\n) => {\n switch (permission) {\n case OwnCapability.SEND_AUDIO:\n return t('{{ userName }} is requesting to speak', { userName });\n case OwnCapability.SEND_VIDEO:\n return t('{{ userName }} is requesting to share their camera', {\n userName,\n });\n case OwnCapability.SCREENSHARE:\n return t('{{ userName }} is requesting to present their screen', {\n userName,\n });\n default:\n return t('{{ userName }} is requesting permission: {{ permission }}', {\n userName,\n permission,\n });\n }\n};\n","import { ElementType, HTMLProps, PropsWithChildren } from 'react';\nimport clsx from 'clsx';\n\nexport type StreamThemeProps = HTMLProps<HTMLElement> & {\n as?: ElementType;\n};\n\nexport const StreamTheme = ({\n as: Component = 'div',\n className,\n children,\n ...props\n}: PropsWithChildren<StreamThemeProps>) => {\n return (\n <Component {...props} className={clsx('str-video', className)}>\n {children}\n </Component>\n );\n};\n","import { ComponentType } from 'react';\nimport clsx from 'clsx';\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { BaseVideo } from '../../core/components/Video';\nimport { LoadingIndicator } from '../LoadingIndicator';\n\nconst DefaultDisabledVideoPreview = () => {\n const { t } = useI18n();\n return (\n <div className=\"str_video__video-preview__disabled-video-preview\">\n {t('Video is disabled')}\n </div>\n );\n};\n\nconst DefaultNoCameraPreview = () => {\n const { t } = useI18n();\n return (\n <div className=\"str_video__video-preview__no-camera-preview\">\n {t('No camera found')}\n </div>\n );\n};\n\nexport type VideoPreviewProps = {\n /**\n * Additional CSS class name to apply to the root element.\n */\n className?: string;\n /**\n * Enforces mirroring of the video on the X axis. Defaults to true.\n */\n mirror?: boolean;\n /**\n * Component rendered when user turns off the video.\n */\n DisabledVideoPreview?: ComponentType;\n /**\n * Component rendered when no camera devices are available.\n */\n NoCameraPreview?: ComponentType;\n /**\n * Component rendered above the BaseVideo until the video is ready (meaning until the play event is emitted).\n */\n StartingCameraPreview?: ComponentType;\n};\n\nexport const VideoPreview = ({\n className,\n mirror = true,\n DisabledVideoPreview = DefaultDisabledVideoPreview,\n NoCameraPreview = DefaultNoCameraPreview,\n StartingCameraPreview = LoadingIndicator,\n}: VideoPreviewProps) => {\n const { useCameraState } = useCallStateHooks();\n const { devices, status, isMute, mediaStream } = useCameraState();\n\n let contents;\n if (isMute && devices?.length === 0) {\n contents = <NoCameraPreview />;\n } else if (status === 'enabled') {\n const loading = !mediaStream;\n contents = (\n <>\n {mediaStream && (\n <BaseVideo\n stream={mediaStream}\n className={clsx('str-video__video-preview', {\n 'str-video__video-preview--mirror': mirror,\n 'str-video__video-preview--loading': loading,\n })}\n />\n )}\n {loading && <StartingCameraPreview />}\n </>\n );\n } else {\n contents = <DisabledVideoPreview />;\n }\n\n return (\n <div className={clsx('str-video__video-preview-container', className)}>\n {contents}\n </div>\n );\n};\n","import { ComponentType, forwardRef } from 'react';\nimport { Placement } from '@floating-ui/react';\nimport {\n hasAudio,\n hasPausedTrack,\n hasScreenShare,\n hasVideo,\n SfuModels,\n} from '@stream-io/video-client';\nimport { useCall, useI18n } from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\n\nimport {\n Icon,\n IconButton,\n MenuToggle,\n Notification,\n ToggleMenuButtonProps,\n} from '../../../components';\nimport { ParticipantActionsContextMenu as DefaultParticipantActionsContextMenu } from './ParticipantActionsContextMenu';\nimport { Reaction } from '../../../components/Reaction';\nimport { useParticipantViewContext } from './ParticipantViewContext';\n\nexport type DefaultParticipantViewUIProps = {\n /**\n * Turns on/off the status indicator icons (mute, connection quality, etc...).\n */\n indicatorsVisible?: boolean;\n /**\n * Placement of the context menu component when opened\n */\n menuPlacement?: Placement;\n /**\n * Option to show/hide menu button component\n */\n showMenuButton?: boolean;\n /**\n * Custom component to render the context menu\n */\n ParticipantActionsContextMenu?: ComponentType;\n};\n\nconst ToggleButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n function ToggleButton(props, ref) {\n return <IconButton enabled={props.menuShown} icon=\"ellipsis\" ref={ref} />;\n },\n);\n\nexport const DefaultScreenShareOverlay = () => {\n const call = useCall();\n const { t } = useI18n();\n\n const stopScreenShare = () => {\n call?.screenShare.disable().catch((err) => {\n console.error('Failed to stop screen sharing:', err);\n });\n };\n\n return (\n <div className=\"str-video__screen-share-overlay\">\n <Icon icon=\"screen-share-off\" />\n <span className=\"str-video__screen-share-overlay__title\">\n {t('You are presenting your screen')}\n </span>\n <button\n onClick={stopScreenShare}\n type=\"button\"\n className=\"str-video__screen-share-overlay__button\"\n >\n <Icon icon=\"close\" /> {t('Stop Screen Sharing')}\n </button>\n </div>\n );\n};\n\nexport const DefaultParticipantViewUI = ({\n indicatorsVisible = true,\n menuPlacement = 'bottom-start',\n showMenuButton = true,\n ParticipantActionsContextMenu = DefaultParticipantActionsContextMenu,\n}: DefaultParticipantViewUIProps) => {\n const { participant, trackType } = useParticipantViewContext();\n const isScreenSharing = hasScreenShare(participant);\n\n if (\n participant.isLocalParticipant &&\n isScreenSharing &&\n trackType === 'screenShareTrack'\n ) {\n return (\n <>\n <DefaultScreenShareOverlay />\n <ParticipantDetails indicatorsVisible={indicatorsVisible} />\n </>\n );\n }\n\n return (\n <>\n {showMenuButton && (\n <MenuToggle\n strategy=\"fixed\"\n placement={menuPlacement}\n ToggleButton={ToggleButton}\n >\n <ParticipantActionsContextMenu />\n </MenuToggle>\n )}\n <Reaction participant={participant} />\n <ParticipantDetails indicatorsVisible={indicatorsVisible} />\n </>\n );\n};\n\nexport const ParticipantDetails = ({\n indicatorsVisible = true,\n}: Pick<DefaultParticipantViewUIProps, 'indicatorsVisible'>) => {\n const { participant, trackType } = useParticipantViewContext();\n const {\n isLocalParticipant,\n connectionQuality,\n pin,\n sessionId,\n name,\n userId,\n } = participant;\n const call = useCall();\n\n const { t } = useI18n();\n const connectionQualityAsString =\n !!connectionQuality &&\n SfuModels.ConnectionQuality[connectionQuality].toLowerCase();\n\n const hasAudioTrack = hasAudio(participant);\n const hasVideoTrack = hasVideo(participant);\n const canUnpin = !!pin && pin.isLocalPin;\n const isTrackPaused =\n trackType !== 'none' ? hasPausedTrack(participant, trackType) : false;\n\n return (\n <>\n <div className=\"str-video__participant-details\">\n <span className=\"str-video__participant-details__name\">\n {name || userId}\n\n {indicatorsVisible && !hasAudioTrack && (\n <span className=\"str-video__participant-details__name--audio-muted\" />\n )}\n {indicatorsVisible && !hasVideoTrack && (\n <span className=\"str-video__participant-details__name--video-muted\" />\n )}\n {indicatorsVisible && isTrackPaused && (\n <span\n title={t('Video paused due to insufficient bandwidth')}\n className=\"str-video__participant-details__name--track-paused\"\n />\n )}\n {indicatorsVisible && canUnpin && (\n // TODO: remove this monstrosity once we have a proper design\n <span\n title={t('Unpin')}\n onClick={() => call?.unpin(sessionId)}\n className=\"str-video__participant-details__name--pinned\"\n />\n )}\n {indicatorsVisible && <SpeechIndicator />}\n </span>\n </div>\n {indicatorsVisible && (\n <Notification\n isVisible={\n isLocalParticipant &&\n connectionQuality === SfuModels.ConnectionQuality.POOR\n }\n message={t('Poor connection quality')}\n >\n {connectionQualityAsString && (\n <span\n className={clsx(\n 'str-video__participant-details__connection-quality',\n `str-video__participant-details__connection-quality--${connectionQualityAsString}`,\n )}\n title={connectionQualityAsString}\n />\n )}\n </Notification>\n )}\n </>\n );\n};\n\nexport const SpeechIndicator = () => {\n const { participant } = useParticipantViewContext();\n const { isSpeaking, isDominantSpeaker } = participant;\n return (\n <span\n className={clsx(\n 'str-video__speech-indicator',\n isSpeaking && 'str-video__speech-indicator--speaking',\n isDominantSpeaker && 'str-video__speech-indicator--dominant',\n )}\n >\n <span className=\"str-video__speech-indicator__bar\" />\n <span className=\"str-video__speech-indicator__bar\" />\n <span className=\"str-video__speech-indicator__bar\" />\n </span>\n );\n};\n","import {\n ComponentType,\n forwardRef,\n ReactElement,\n useMemo,\n useState,\n} from 'react';\nimport clsx from 'clsx';\nimport {\n hasAudio,\n hasScreenShareAudio,\n hasVideo,\n StreamVideoParticipant,\n VideoTrackType,\n} from '@stream-io/video-client';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\n\nimport { Audio } from '../Audio';\nimport { Video, VideoProps } from '../Video';\nimport { useTrackElementVisibility } from '../../hooks';\nimport { DefaultParticipantViewUI } from './DefaultParticipantViewUI';\nimport { applyElementToRef, isComponentType } from '../../../utilities';\nimport { ParticipantViewContext } from './ParticipantViewContext';\n\nexport type ParticipantViewProps = {\n /**\n * The participant whose video/audio stream we want to play.\n */\n participant: StreamVideoParticipant;\n\n /**\n * Override the default UI for rendering participant information/actions.\n * pass `null` if you wish to not render anything\n * @default DefaultParticipantViewUI\n */\n ParticipantViewUI?: ComponentType | ReactElement | null;\n\n /**\n * The kind of video stream to play for the given participant.\n * The default value is `videoTrack`.\n * You can use `none` if you're building an audio-only call.\n */\n trackType?: VideoTrackType | 'none';\n\n /**\n * Forces participant's video to be mirrored or unmirrored. By default, video track\n * from the local participant is mirrored, and all other videos are not mirrored.\n */\n mirror?: boolean;\n\n /**\n * This prop is only useful for advanced use-cases (for example, building your own layout).\n * When set to `true` it will mute the give participant's audio stream on the client side.\n * The local participant is always muted.\n */\n muteAudio?: boolean;\n\n /**\n * An object with set functions meant for exposing the video\n * and video placeholder elements to the integrators.\n * It's useful when you want to attach custom event handlers to these elements.\n * - `refs.setVideoElement`\n * - `refs.setVideoPlaceholderElement`\n */\n refs?: VideoProps['refs'];\n\n /**\n * Custom class applied to the root DOM element.\n */\n className?: string;\n} & Pick<VideoProps, 'VideoPlaceholder' | 'PictureInPicturePlaceholder'>;\n\nexport const ParticipantView = forwardRef<HTMLDivElement, ParticipantViewProps>(\n function ParticipantView(\n {\n participant,\n trackType = 'videoTrack',\n mirror,\n muteAudio,\n refs: { setVideoElement, setVideoPlaceholderElement } = {},\n className,\n VideoPlaceholder,\n PictureInPicturePlaceholder,\n ParticipantViewUI = DefaultParticipantViewUI as ComponentType,\n },\n ref,\n ) {\n const { isLocalParticipant, isSpeaking, isDominantSpeaker, sessionId } =\n participant;\n\n const hasAudioTrack = hasAudio(participant);\n const hasVideoTrack = hasVideo(participant);\n const hasScreenShareAudioTrack = hasScreenShareAudio(participant);\n\n const [trackedElement, setTrackedElement] = useState<HTMLDivElement | null>(\n null,\n );\n\n const [contextVideoElement, setContextVideoElement] =\n useState<HTMLVideoElement | null>(null);\n\n const [contextVideoPlaceholderElement, setContextVideoPlaceholderElement] =\n useState<HTMLDivElement | null>(null);\n\n // TODO: allow to pass custom ViewportTracker instance from props\n useTrackElementVisibility({\n sessionId,\n trackedElement,\n trackType,\n });\n\n const { useIncomingVideoSettings } = useCallStateHooks();\n const { isParticipantVideoEnabled } = useIncomingVideoSettings();\n\n const participantViewContextValue = useMemo(\n () => ({\n participant,\n participantViewElement: trackedElement,\n videoElement: contextVideoElement,\n videoPlaceholderElement: contextVideoPlaceholderElement,\n trackType,\n }),\n [\n contextVideoElement,\n contextVideoPlaceholderElement,\n participant,\n trackedElement,\n trackType,\n ],\n );\n\n const videoRefs: VideoProps['refs'] = useMemo(\n () => ({\n setVideoElement: (element) => {\n setVideoElement?.(element);\n setContextVideoElement(element);\n },\n setVideoPlaceholderElement: (element) => {\n setVideoPlaceholderElement?.(element);\n setContextVideoPlaceholderElement(element);\n },\n }),\n [setVideoElement, setVideoPlaceholderElement],\n );\n\n return (\n <div\n data-testid=\"participant-view\"\n ref={(element) => {\n applyElementToRef(ref, element);\n setTrackedElement(element);\n }}\n className={clsx(\n 'str-video__participant-view',\n isDominantSpeaker && 'str-video__participant-view--dominant-speaker',\n isSpeaking && 'str-video__participant-view--speaking',\n !hasVideoTrack && 'str-video__participant-view--no-video',\n !hasAudioTrack && 'str-video__participant-view--no-audio',\n className,\n )}\n >\n <ParticipantViewContext.Provider value={participantViewContextValue}>\n {/* mute the local participant, as we don't want to hear ourselves */}\n {!isLocalParticipant && !muteAudio && (\n <>\n {hasAudioTrack && (\n <Audio participant={participant} trackType=\"audioTrack\" />\n )}\n {hasScreenShareAudioTrack && (\n <Audio\n participant={participant}\n trackType=\"screenShareAudioTrack\"\n />\n )}\n </>\n )}\n <Video\n VideoPlaceholder={VideoPlaceholder}\n PictureInPicturePlaceholder={PictureInPicturePlaceholder}\n participant={participant}\n trackType={trackType}\n refs={videoRefs}\n enabled={\n isLocalParticipant ||\n trackType !== 'videoTrack' ||\n isParticipantVideoEnabled(participant.sessionId)\n }\n mirror={mirror}\n autoPlay\n />\n {isComponentType(ParticipantViewUI) ? (\n <ParticipantViewUI />\n ) : (\n ParticipantViewUI\n )}\n </ParticipantViewContext.Provider>\n </div>\n );\n },\n);\n\nParticipantView.displayName = 'ParticipantView';\n","import { ComponentType, PropsWithChildren } from 'react';\nimport {\n StreamCallProvider,\n StreamCallProviderProps,\n} from '@stream-io/video-react-bindings';\n\n// re-exporting the StreamCallProvider as StreamCall\nexport const StreamCall: ComponentType<\n PropsWithChildren<StreamCallProviderProps>\n> = StreamCallProvider;\n\nStreamCall.displayName = 'StreamCall';\n","import en from './en.json';\n\nexport const translations = { en };\n","import {\n StreamVideoProps,\n StreamVideoProvider,\n} from '@stream-io/video-react-bindings';\nimport { PropsWithChildren } from 'react';\nimport { translations } from '../../../translations';\n\nexport const StreamVideo = (props: PropsWithChildren<StreamVideoProps>) => {\n return (\n <StreamVideoProvider translationsOverrides={translations} {...props} />\n );\n};\n\nStreamVideo.displayName = 'StreamVideo';\n","export type Filter<T> =\n | { $and: Array<Filter<T>> }\n | { $or: Array<Filter<T>> }\n | { $not: Filter<T> }\n | Conditions<T>;\n\ntype Conditions<T> = {\n [K in keyof T]?: T[K] extends Array<infer E>\n ? ArrayOperator<E>\n : ScalarOperator<T[K]>;\n};\n\nexport type ScalarOperator<T> =\n | EqOperator<T>\n | NeqOperator<T>\n | InOperator<T>\n | GtOperator<T>\n | GteOperator<T>\n | LtOperator<T>\n | LteOperator<T>\n | T;\n\nexport type ArrayOperator<T> = ContainsOperator<T>;\n\nexport type AutocompleteOperator<T> = { $autocomplete: T };\nexport type EqOperator<T> = { $eq: T };\nexport type GtOperator<T> = { $gt: T };\nexport type GteOperator<T> = { $gte: T };\nexport type LtOperator<T> = { $lt: T };\nexport type LteOperator<T> = { $lte: T };\nexport type NeqOperator<T> = { $neq: T };\nexport type InOperator<T> = { $in: Array<T> };\nexport type ContainsOperator<T> = { $contains: T };\n\nexport function applyFilter<T>(obj: T, filter: Filter<T>): boolean {\n if ('$and' in filter) {\n return filter.$and.every((f) => applyFilter(obj, f));\n }\n\n if ('$or' in filter) {\n return filter.$or.some((f) => applyFilter(obj, f));\n }\n\n if ('$not' in filter) {\n return !applyFilter(obj, filter.$not);\n }\n\n return checkConditions(obj, filter);\n}\n\ntype DateString = string;\nconst isDateString = (value: unknown): value is DateString =>\n typeof value === 'string' &&\n /^((?:(\\d{4}-\\d{2}-\\d{2})T(\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?))(Z|[+-]\\d{2}:\\d{2})?)$/.test(\n value,\n );\n\nfunction checkConditions<T>(obj: T, conditions: Conditions<T>): boolean {\n let match = true;\n\n for (const key of Object.keys(conditions) as Array<keyof T>) {\n const operator = conditions[key];\n const maybeOperator = operator && typeof operator === 'object';\n let value: T[keyof T] | number = obj[key];\n\n if (value instanceof Date) {\n value = value.getTime();\n } else if (isDateString(value)) {\n value = new Date(value).getTime();\n }\n\n if (maybeOperator && '$eq' in operator) {\n const eqOperator = operator as EqOperator<typeof value>;\n const eqOperatorValue = isDateString(eqOperator.$eq)\n ? new Date(eqOperator.$eq).getTime()\n : eqOperator.$eq;\n match &&= eqOperatorValue === value;\n } else if (maybeOperator && '$neq' in operator) {\n const neqOperator = operator as NeqOperator<typeof value>;\n match &&= neqOperator.$neq !== value;\n } else if (maybeOperator && '$in' in operator) {\n const inOperator = operator as InOperator<typeof value>;\n match &&= inOperator.$in.includes(value);\n } else if (maybeOperator && '$contains' in operator) {\n if (Array.isArray(value)) {\n const containsOperator = operator as ContainsOperator<\n (typeof value)[number]\n >;\n match &&= value.includes(containsOperator.$contains);\n } else {\n match = false;\n }\n } else if (maybeOperator && '$gt' in operator) {\n const gtOperator = operator as GtOperator<typeof value>;\n const gtOperatorValue = isDateString(gtOperator.$gt)\n ? new Date(gtOperator.$gt).getTime()\n : gtOperator.$gt;\n match &&= value > gtOperatorValue;\n } else if (maybeOperator && '$gte' in operator) {\n const gteOperator = operator as GteOperator<typeof value>;\n const gteOperatorValue = isDateString(gteOperator.$gte)\n ? new Date(gteOperator.$gte).getTime()\n : gteOperator.$gte;\n match &&= value >= gteOperatorValue;\n } else if (maybeOperator && '$lt' in operator) {\n const ltOperator = operator as LtOperator<typeof value>;\n const ltOperatorValue = isDateString(ltOperator.$lt)\n ? new Date(ltOperator.$lt).getTime()\n : ltOperator.$lt;\n match &&= value < ltOperatorValue;\n } else if (maybeOperator && '$lte' in operator) {\n const lteOperator = operator as LteOperator<typeof value>;\n const lteOperatorValue = isDateString(lteOperator.$lte)\n ? new Date(lteOperator.$lte).getTime()\n : lteOperator.$lte;\n match &&= value <= lteOperatorValue;\n // } else if (maybeOperator && '$autocomplete' in operator) {\n // TODO: regexp solution maybe?\n // match &&= false;\n } else {\n const eqValue = operator as typeof value;\n match &&= eqValue === value;\n }\n\n if (!match) {\n return false;\n }\n }\n\n return true;\n}\n","import { useEffect, useMemo } from 'react';\nimport {\n Call,\n CallTypes,\n combineComparators,\n Comparator,\n defaultSortPreset,\n hasAudio,\n hasScreenShare,\n hasVideo,\n isPinned,\n paginatedLayoutSortPreset,\n screenSharing,\n speakerLayoutSortPreset,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { applyFilter, Filter } from '../../../utilities/filter';\n\nexport type FilterableParticipant = Pick<\n StreamVideoParticipant,\n 'userId' | 'isSpeaking' | 'isDominantSpeaker' | 'name' | 'roles'\n> & {\n isPinned: boolean;\n hasVideo: boolean;\n hasAudio: boolean;\n hasScreenShare: boolean;\n};\n\nexport type ParticipantFilter = Filter<FilterableParticipant>;\nexport type ParticipantPredicate = (\n participant: StreamVideoParticipant,\n) => boolean;\n\nexport const useFilteredParticipants = ({\n excludeLocalParticipant = false,\n filterParticipants,\n}: {\n excludeLocalParticipant?: boolean;\n filterParticipants?: ParticipantFilter | ParticipantPredicate;\n}) => {\n const { useParticipants, useRemoteParticipants } = useCallStateHooks();\n const allParticipants = useParticipants();\n const remoteParticipants = useRemoteParticipants();\n return useMemo(() => {\n const unfilteredParticipants = excludeLocalParticipant\n ? remoteParticipants\n : allParticipants;\n\n return filterParticipants\n ? applyParticipantsFilter(unfilteredParticipants, filterParticipants)\n : unfilteredParticipants;\n }, [\n allParticipants,\n remoteParticipants,\n excludeLocalParticipant,\n filterParticipants,\n ]);\n};\n\nexport const applyParticipantsFilter = (\n participants: StreamVideoParticipant[],\n filter: ParticipantPredicate | ParticipantFilter,\n) => {\n const filterCallback =\n typeof filter === 'function'\n ? filter\n : (participant: StreamVideoParticipant) =>\n applyFilter(\n {\n userId: participant.userId,\n isSpeaking: participant.isSpeaking,\n isDominantSpeaker: participant.isDominantSpeaker,\n name: participant.name,\n roles: participant.roles,\n isPinned: isPinned(participant),\n hasVideo: hasVideo(participant),\n hasAudio: hasAudio(participant),\n hasScreenShare: hasScreenShare(participant),\n },\n filter,\n );\n\n return participants.filter(filterCallback);\n};\n\nexport const usePaginatedLayoutSortPreset = (call: Call | undefined) => {\n useEffect(() => {\n if (!call) return;\n call.setSortParticipantsBy(paginatedLayoutSortPreset);\n return () => {\n resetSortPreset(call);\n };\n }, [call]);\n};\n\nexport const useSpeakerLayoutSortPreset = (\n call: Call | undefined,\n isOneOnOneCall: boolean,\n) => {\n useEffect(() => {\n if (!call) return;\n // always show the remote participant in the spotlight\n if (isOneOnOneCall) {\n call.setSortParticipantsBy(combineComparators(screenSharing, loggedIn));\n } else {\n call.setSortParticipantsBy(speakerLayoutSortPreset);\n }\n return () => {\n resetSortPreset(call);\n };\n }, [call, isOneOnOneCall]);\n};\n\nexport const useRawRemoteParticipants = () => {\n const { useRawParticipants } = useCallStateHooks();\n const rawParticipants = useRawParticipants();\n return useMemo(\n () => rawParticipants.filter((p) => !p.isLocalParticipant),\n [rawParticipants],\n );\n};\n\nconst resetSortPreset = (call: Call) => {\n // reset the sorting to the default for the call type\n const callConfig = CallTypes.get(call.type);\n call.setSortParticipantsBy(\n callConfig.options.sortParticipantsBy || defaultSortPreset,\n );\n};\n\nconst loggedIn: Comparator<StreamVideoParticipant> = (a, b) => {\n if (a.isLocalParticipant) return 1;\n if (b.isLocalParticipant) return -1;\n return 0;\n};\n","import clsx from 'clsx';\nimport {\n ComponentType,\n ReactElement,\n useCallback,\n useEffect,\n useState,\n} from 'react';\nimport {\n useCall,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport { hasScreenShare } from '@stream-io/video-client';\nimport { ParticipantView, useParticipantViewContext } from '../ParticipantView';\nimport { ParticipantsAudio } from '../Audio';\nimport {\n usePaginatedLayoutSortPreset,\n useRawRemoteParticipants,\n} from './hooks';\n\n/**\n * The props for the {@link LivestreamLayout} component.\n */\nexport type LivestreamLayoutProps = {\n /**\n * Whether the livestream is muted. Defaults to `false`.\n */\n muted?: boolean;\n\n /**\n * Whether to show the participant count. Defaults to `true`.\n */\n showParticipantCount?: boolean;\n\n /**\n * Whether to enable fullscreen mode. Defaults to `true`.\n */\n enableFullScreen?: boolean;\n\n /**\n * Whether to show the duration of the call. Defaults to `true`.\n */\n showDuration?: boolean;\n\n /**\n * Whether to show the live badge. Defaults to `true`.\n */\n showLiveBadge?: boolean;\n\n /**\n * Whether to show the speaker name. Defaults to `false`.\n */\n showSpeakerName?: boolean;\n\n /**\n * When set to `false` disables mirroring of the local participant's video.\n * @default true\n */\n mirrorLocalParticipantVideo?: boolean;\n\n /**\n * The props to pass to the floating participant element.\n */\n floatingParticipantProps?: LivestreamLayoutProps & {\n /**\n * The position of the floating participant element. Defaults to `top-right`.\n */\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n };\n\n /**\n * Override the default participant view overlay UI.\n */\n ParticipantViewUI?: ComponentType | ReactElement | null;\n};\n\nexport const LivestreamLayout = (props: LivestreamLayoutProps) => {\n const { useParticipants, useHasOngoingScreenShare } = useCallStateHooks();\n const call = useCall();\n const participants = useParticipants();\n const [currentSpeaker] = participants;\n const remoteParticipants = useRawRemoteParticipants();\n const hasOngoingScreenShare = useHasOngoingScreenShare();\n const presenter = hasOngoingScreenShare\n ? participants.find(hasScreenShare)\n : undefined;\n\n usePaginatedLayoutSortPreset(call);\n\n const { floatingParticipantProps, muted, ParticipantViewUI } = props;\n const overlay = ParticipantViewUI ?? (\n <ParticipantOverlay\n showParticipantCount={props.showParticipantCount}\n showDuration={props.showDuration}\n showLiveBadge={props.showLiveBadge}\n showSpeakerName={props.showSpeakerName}\n enableFullScreen={props.enableFullScreen}\n />\n );\n\n const floatingParticipantOverlay =\n hasOngoingScreenShare &&\n (ParticipantViewUI ?? (\n <ParticipantOverlay\n // these elements aren't needed for the video feed\n showParticipantCount={\n floatingParticipantProps?.showParticipantCount ?? false\n }\n showDuration={floatingParticipantProps?.showDuration ?? false}\n showLiveBadge={floatingParticipantProps?.showLiveBadge ?? false}\n showSpeakerName={floatingParticipantProps?.showSpeakerName ?? true}\n enableFullScreen={floatingParticipantProps?.enableFullScreen ?? true}\n />\n ));\n\n return (\n <div className=\"str-video__livestream-layout__wrapper\">\n {!muted && <ParticipantsAudio participants={remoteParticipants} />}\n {hasOngoingScreenShare && presenter && (\n <ParticipantView\n className=\"str-video__livestream-layout__screen-share\"\n participant={presenter}\n ParticipantViewUI={overlay}\n trackType=\"screenShareTrack\"\n muteAudio // audio is rendered by ParticipantsAudio\n />\n )}\n {currentSpeaker && (\n <ParticipantView\n className={clsx(\n hasOngoingScreenShare &&\n clsx(\n 'str-video__livestream-layout__floating-participant',\n `str-video__livestream-layout__floating-participant--${\n floatingParticipantProps?.position ?? 'top-right'\n }`,\n ),\n )}\n participant={currentSpeaker}\n ParticipantViewUI={floatingParticipantOverlay || overlay}\n mirror={\n props.mirrorLocalParticipantVideo !== false ? undefined : false\n }\n muteAudio // audio is rendered by ParticipantsAudio\n />\n )}\n </div>\n );\n};\n\nLivestreamLayout.displayName = 'LivestreamLayout';\n\n/**\n * The props for the {@link LivestreamLayout} component.\n */\nexport type BackstageLayoutProps = {\n /**\n * Whether to show the counter for participants that joined before\n * the livestream went live. Defaults to `true`.\n */\n showEarlyParticipantCount?: boolean;\n};\n\nexport const BackstageLayout = (props: BackstageLayoutProps) => {\n const { showEarlyParticipantCount = true } = props;\n const { useParticipantCount, useCallStartsAt } = useCallStateHooks();\n const participantCount = useParticipantCount();\n const startsAt = useCallStartsAt();\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__livestream-layout__wrapper\">\n <div className=\"str-video__livestream-layout__backstage\">\n {startsAt && (\n <span className=\"str-video__livestream-layout__starts-at\">\n {startsAt.getTime() < Date.now()\n ? t('Livestream starts soon')\n : t('Livestream starts at {{ startsAt }}', { startsAt })}\n </span>\n )}\n {showEarlyParticipantCount && (\n <span className=\"str-video__livestream-layout__early-viewers-count\">\n {t('{{ count }} participants joined early', {\n count: participantCount,\n })}\n </span>\n )}\n </div>\n </div>\n );\n};\n\nBackstageLayout.displayName = 'BackstageLayout';\n\nconst ParticipantOverlay = (props: {\n enableFullScreen?: boolean;\n showParticipantCount?: boolean;\n showDuration?: boolean;\n showLiveBadge?: boolean;\n showSpeakerName?: boolean;\n}) => {\n const {\n enableFullScreen = true,\n showParticipantCount = true,\n showDuration = true,\n showLiveBadge = true,\n showSpeakerName = false,\n } = props;\n const overlayBarVisible =\n enableFullScreen ||\n showParticipantCount ||\n showDuration ||\n showLiveBadge ||\n showSpeakerName;\n const { participant } = useParticipantViewContext();\n const { useParticipantCount } = useCallStateHooks();\n const participantCount = useParticipantCount();\n const duration = useUpdateCallDuration();\n const toggleFullScreen = useToggleFullScreen();\n const { t } = useI18n();\n return (\n <div className=\"str-video__livestream-layout__overlay\">\n {overlayBarVisible && (\n <div className=\"str-video__livestream-layout__overlay__bar\">\n {showLiveBadge && (\n <span className=\"str-video__livestream-layout__live-badge\">\n {t('Live')}\n </span>\n )}\n {showParticipantCount && (\n <span className=\"str-video__livestream-layout__viewers-count\">\n {participantCount}\n </span>\n )}\n {showSpeakerName && (\n <span\n className=\"str-video__livestream-layout__speaker-name\"\n title={participant.name || participant.userId || ''}\n >\n {participant.name || participant.userId || ''}\n </span>\n )}\n {showDuration && (\n <span className=\"str-video__livestream-layout__duration\">\n {formatDuration(duration)}\n </span>\n )}\n {enableFullScreen && (\n <span\n className=\"str-video__livestream-layout__go-fullscreen\"\n onClick={toggleFullScreen}\n />\n )}\n </div>\n )}\n </div>\n );\n};\n\nconst useUpdateCallDuration = () => {\n const { useIsCallLive, useCallSession } = useCallStateHooks();\n const isCallLive = useIsCallLive();\n const session = useCallSession();\n const [duration, setDuration] = useState(() => {\n if (!session || !session.live_started_at) return 0;\n const liveStartTime = new Date(session.live_started_at);\n const now = new Date();\n return Math.floor((now.getTime() - liveStartTime.getTime()) / 1000);\n });\n\n useEffect(() => {\n if (!isCallLive) return;\n const interval = setInterval(() => {\n setDuration((d) => d + 1);\n }, 1000);\n return () => {\n clearInterval(interval);\n };\n }, [isCallLive]);\n\n return duration;\n};\n\nconst useToggleFullScreen = () => {\n const { participantViewElement } = useParticipantViewContext();\n const [isFullscreen, setIsFullscreen] = useState(\n !!document.fullscreenElement,\n );\n useEffect(() => {\n const handler = () => setIsFullscreen(!!document.fullscreenElement);\n document.addEventListener('fullscreenchange', handler);\n return () => {\n document.removeEventListener('fullscreenchange', handler);\n };\n }, []);\n return useCallback(() => {\n if (isFullscreen) {\n document.exitFullscreen().catch((err) => {\n console.error('Failed to exit fullscreen', err);\n });\n } else {\n participantViewElement?.requestFullscreen().catch((err) => {\n console.error('Failed to enter fullscreen', err);\n });\n }\n }, [isFullscreen, participantViewElement]);\n};\n\nconst formatDuration = (durationInMs: number) => {\n const days = Math.floor(durationInMs / 86400);\n const hours = Math.floor(durationInMs / 3600);\n const minutes = Math.floor((durationInMs % 3600) / 60);\n const seconds = durationInMs % 60;\n\n return `${days ? days + ' ' : ''}${hours ? hours + ':' : ''}${\n minutes < 10 ? '0' : ''\n }${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;\n};\n","import { useEffect, useMemo, useState } from 'react';\nimport { useCall } from '@stream-io/video-react-bindings';\nimport { StreamVideoParticipant } from '@stream-io/video-client';\nimport clsx from 'clsx';\n\nimport {\n DefaultParticipantViewUI,\n ParticipantView,\n ParticipantViewProps,\n} from '../ParticipantView';\nimport { ParticipantsAudio } from '../Audio';\nimport { IconButton } from '../../../components';\nimport { chunk } from '../../../utilities';\nimport {\n ParticipantFilter,\n ParticipantPredicate,\n useFilteredParticipants,\n usePaginatedLayoutSortPreset,\n useRawRemoteParticipants,\n} from './hooks';\n\nconst GROUP_SIZE = 16;\n\ntype PaginatedGridLayoutGroupProps = {\n /**\n * The group of participants to render.\n */\n group: Array<StreamVideoParticipant>;\n} & Pick<\n ParticipantViewProps,\n 'VideoPlaceholder' | 'PictureInPicturePlaceholder' | 'mirror'\n> &\n Required<Pick<ParticipantViewProps, 'ParticipantViewUI'>>;\n\nconst PaginatedGridLayoutGroup = ({\n group,\n mirror,\n VideoPlaceholder,\n PictureInPicturePlaceholder,\n ParticipantViewUI,\n}: PaginatedGridLayoutGroupProps) => {\n return (\n <div\n className={clsx('str-video__paginated-grid-layout__group', {\n 'str-video__paginated-grid-layout--one': group.length === 1,\n 'str-video__paginated-grid-layout--two-four':\n group.length >= 2 && group.length <= 4,\n 'str-video__paginated-grid-layout--five-nine':\n group.length >= 5 && group.length <= 9,\n })}\n >\n {group.map((participant) => (\n <ParticipantView\n key={participant.sessionId}\n participant={participant}\n muteAudio\n mirror={mirror}\n VideoPlaceholder={VideoPlaceholder}\n PictureInPicturePlaceholder={PictureInPicturePlaceholder}\n ParticipantViewUI={ParticipantViewUI}\n />\n ))}\n </div>\n );\n};\n\nexport type PaginatedGridLayoutProps = {\n /**\n * The number of participants to display per page.\n */\n groupSize?: number;\n\n /**\n * Whether to exclude the local participant from the grid.\n * @default false\n */\n excludeLocalParticipant?: boolean;\n\n /**\n * Predicate to filter call participants or a filter object.\n * @example\n * // With a predicate:\n * <PaginatedGridLayout\n * filterParticipants={p => p.roles.includes('student')}\n * />\n * @example\n * // With a filter object:\n * <PaginatedGridLayout\n * filterParticipants={{\n * $or: [\n * { roles: { $contains: 'student' } },\n * { isPinned: true },\n * ],\n * }}\n * />\n */\n filterParticipants?: ParticipantPredicate | ParticipantFilter;\n\n /**\n * When set to `false` disables mirroring of the local partipant's video.\n * @default true\n */\n mirrorLocalParticipantVideo?: boolean;\n\n /**\n * Turns on/off the pagination arrows.\n * @default true\n */\n pageArrowsVisible?: boolean;\n\n /**\n * Whether the layout is muted. Defaults to `false`.\n */\n muted?: boolean;\n} & Pick<\n ParticipantViewProps,\n 'ParticipantViewUI' | 'VideoPlaceholder' | 'PictureInPicturePlaceholder'\n>;\n\nexport const PaginatedGridLayout = (props: PaginatedGridLayoutProps) => {\n const {\n groupSize = (props.groupSize || 0) > 0\n ? props.groupSize || GROUP_SIZE\n : GROUP_SIZE,\n excludeLocalParticipant = false,\n filterParticipants,\n mirrorLocalParticipantVideo = true,\n pageArrowsVisible = true,\n VideoPlaceholder,\n ParticipantViewUI = DefaultParticipantViewUI,\n PictureInPicturePlaceholder,\n muted,\n } = props;\n const [page, setPage] = useState(0);\n const [\n paginatedGridLayoutWrapperElement,\n setPaginatedGridLayoutWrapperElement,\n ] = useState<HTMLDivElement | null>(null);\n\n const call = useCall();\n const remoteParticipants = useRawRemoteParticipants();\n const participants = useFilteredParticipants({\n excludeLocalParticipant,\n filterParticipants,\n });\n\n usePaginatedLayoutSortPreset(call);\n\n useEffect(() => {\n if (!paginatedGridLayoutWrapperElement || !call) return;\n\n const cleanup = call.setViewport(paginatedGridLayoutWrapperElement);\n\n return () => cleanup();\n }, [paginatedGridLayoutWrapperElement, call]);\n\n // only used to render video elements\n const participantGroups = useMemo(\n () => chunk(participants, groupSize),\n [participants, groupSize],\n );\n\n const pageCount = participantGroups.length;\n\n // update page when page count is reduced and selected page no longer exists\n useEffect(() => {\n if (page > pageCount - 1) {\n setPage(Math.max(0, pageCount - 1));\n }\n }, [page, pageCount]);\n\n const selectedGroup = participantGroups[page];\n const mirror = mirrorLocalParticipantVideo ? undefined : false;\n\n if (!call) return null;\n\n return (\n <div\n className=\"str-video__paginated-grid-layout__wrapper\"\n ref={setPaginatedGridLayoutWrapperElement}\n >\n {!muted && <ParticipantsAudio participants={remoteParticipants} />}\n <div className=\"str-video__paginated-grid-layout\">\n {pageArrowsVisible && pageCount > 1 && (\n <IconButton\n icon=\"caret-left\"\n disabled={page === 0}\n onClick={() =>\n setPage((currentPage) => Math.max(0, currentPage - 1))\n }\n />\n )}\n {selectedGroup && (\n <PaginatedGridLayoutGroup\n group={selectedGroup}\n mirror={mirror}\n VideoPlaceholder={VideoPlaceholder}\n ParticipantViewUI={ParticipantViewUI}\n PictureInPicturePlaceholder={PictureInPicturePlaceholder}\n />\n )}\n {pageArrowsVisible && pageCount > 1 && (\n <IconButton\n disabled={page === pageCount - 1}\n icon=\"caret-right\"\n onClick={() =>\n setPage((currentPage) => Math.min(pageCount - 1, currentPage + 1))\n }\n />\n )}\n </div>\n </div>\n );\n};\n\nPaginatedGridLayout.displayName = 'PaginatedGridLayout';\n","import { useEffect, useState } from 'react';\n\nexport const useCalculateHardLimit = (\n /**\n * Element that stretches to 100% of the whole layout component\n */\n wrapperElement: HTMLDivElement | null,\n /**\n * Element that directly hosts individual `ParticipantView` (or wrapper) elements\n */\n hostElement: HTMLDivElement | null,\n limit?: 'dynamic' | number,\n) => {\n const [calculatedLimit, setCalculatedLimit] = useState<{\n vertical: number | null;\n horizontal: number | null;\n }>({\n vertical: typeof limit === 'number' ? limit : null,\n horizontal: typeof limit === 'number' ? limit : null,\n });\n\n useEffect(() => {\n if (\n !hostElement ||\n !wrapperElement ||\n typeof limit === 'number' ||\n typeof limit === 'undefined'\n )\n return;\n\n let childWidth: number | null = null;\n let childHeight: number | null = null;\n\n const resizeObserver = new ResizeObserver((entries, observer) => {\n // this part should ideally run as little times as possible\n // get child measurements and disconnect\n // does not consider dynamically sized children\n // this hook is for SpeakerLayout use only, where children in the bar are fixed size\n if (entries.length > 1) {\n const child = hostElement.firstChild as HTMLElement | null;\n\n if (child) {\n childHeight = child.clientHeight;\n childWidth = child.clientWidth;\n observer.unobserve(hostElement);\n }\n }\n\n // keep the state at { vertical: 1, horizontal: 1 }\n // until we get the proper child measurements\n if (childHeight === null || childWidth === null) return;\n\n const vertical = Math.floor(wrapperElement.clientHeight / childHeight);\n const horizontal = Math.floor(wrapperElement.clientWidth / childWidth);\n\n setCalculatedLimit((pv) => {\n if (pv.vertical !== vertical || pv.horizontal !== horizontal)\n return { vertical, horizontal };\n return pv;\n });\n });\n\n resizeObserver.observe(wrapperElement);\n resizeObserver.observe(hostElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [hostElement, limit, wrapperElement]);\n\n return calculatedLimit;\n};\n","import { useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport { hasScreenShare } from '@stream-io/video-client';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nimport {\n DefaultParticipantViewUI,\n ParticipantView,\n ParticipantViewProps,\n} from '../ParticipantView';\nimport { IconButton } from '../../../components';\nimport {\n useHorizontalScrollPosition,\n useVerticalScrollPosition,\n} from '../../../hooks';\nimport {\n ParticipantFilter,\n ParticipantPredicate,\n useFilteredParticipants,\n useRawRemoteParticipants,\n useSpeakerLayoutSortPreset,\n} from './hooks';\nimport { useCalculateHardLimit } from '../../hooks/useCalculateHardLimit';\nimport { ParticipantsAudio } from '../Audio';\n\nexport type SpeakerLayoutProps = {\n /**\n * The UI to be used for the participant in the spotlight.\n */\n ParticipantViewUISpotlight?: ParticipantViewProps['ParticipantViewUI'];\n\n /**\n * The UI to be used for the participants in the participants bar.\n */\n ParticipantViewUIBar?: ParticipantViewProps['ParticipantViewUI'];\n\n /**\n * The position of the participants who are not in focus.\n * Providing `null` will hide the bar.\n */\n participantsBarPosition?: 'top' | 'bottom' | 'left' | 'right' | null;\n\n /**\n * Hard limits the number of the participants rendered in the participants bar.\n * Providing string `dynamic` will calculate hard limit based on screen width/height.\n */\n participantsBarLimit?: 'dynamic' | number;\n\n /**\n * When set to `true` will exclude the local participant from layout.\n * @default false\n */\n excludeLocalParticipant?: boolean;\n\n /**\n * Predicate to filter call participants or a filter object.\n * @example\n * // With a predicate:\n * <SpeakerLayout\n * filterParticipants={p => p.roles.includes('student')}\n * />\n * @example\n * // With a filter object:\n * <SpeakerLayout\n * filterParticipants={{\n * $or: [\n * { roles: { $contains: 'student' } },\n * { isPinned: true },\n * ],\n * }}\n * />\n */\n filterParticipants?: ParticipantPredicate | ParticipantFilter;\n\n /**\n * When set to `false` disables mirroring of the local participant's video.\n * @default true\n */\n mirrorLocalParticipantVideo?: boolean;\n\n /**\n * Turns on/off the pagination arrows.\n * @default true\n */\n pageArrowsVisible?: boolean;\n\n /**\n * Whether the layout is muted. Defaults to `false`.\n */\n muted?: boolean;\n} & Pick<\n ParticipantViewProps,\n 'VideoPlaceholder' | 'PictureInPicturePlaceholder'\n>;\n\nconst DefaultParticipantViewUIBar = () => (\n <DefaultParticipantViewUI menuPlacement=\"top-end\" />\n);\n\nexport const SpeakerLayout = ({\n ParticipantViewUIBar = DefaultParticipantViewUIBar,\n ParticipantViewUISpotlight = DefaultParticipantViewUI,\n VideoPlaceholder,\n PictureInPicturePlaceholder,\n participantsBarPosition = 'bottom',\n participantsBarLimit,\n mirrorLocalParticipantVideo = true,\n excludeLocalParticipant = false,\n filterParticipants,\n pageArrowsVisible = true,\n muted,\n}: SpeakerLayoutProps) => {\n const call = useCall();\n const { useParticipants } = useCallStateHooks();\n const allParticipants = useParticipants();\n const remoteParticipants = useRawRemoteParticipants();\n const [participantInSpotlight, ...otherParticipants] =\n useFilteredParticipants({ excludeLocalParticipant, filterParticipants });\n const [participantsBarWrapperElement, setParticipantsBarWrapperElement] =\n useState<HTMLDivElement | null>(null);\n const [participantsBarElement, setParticipantsBarElement] =\n useState<HTMLDivElement | null>(null);\n const [buttonsWrapperElement, setButtonsWrapperElement] =\n useState<HTMLDivElement | null>(null);\n\n const isSpeakerScreenSharing =\n participantInSpotlight && hasScreenShare(participantInSpotlight);\n const hardLimit = useCalculateHardLimit(\n buttonsWrapperElement,\n participantsBarElement,\n participantsBarLimit,\n );\n\n const isVertical =\n participantsBarPosition === 'left' || participantsBarPosition === 'right';\n const isHorizontal =\n participantsBarPosition === 'top' || participantsBarPosition === 'bottom';\n\n useEffect(() => {\n if (!participantsBarWrapperElement || !call) return;\n\n const cleanup = call.setViewport(participantsBarWrapperElement);\n\n return () => cleanup();\n }, [participantsBarWrapperElement, call]);\n\n const isOneOnOneCall = allParticipants.length === 2;\n useSpeakerLayoutSortPreset(call, isOneOnOneCall);\n\n let participantsWithAppliedLimit = otherParticipants;\n\n const hardLimitToApply = isVertical\n ? hardLimit.vertical\n : hardLimit.horizontal;\n\n if (\n typeof participantsBarLimit !== 'undefined' &&\n hardLimitToApply !== null\n ) {\n participantsWithAppliedLimit = otherParticipants.slice(\n 0,\n // subtract 1 if speaker is sharing screen as\n // that one is rendered independently from otherParticipants array\n hardLimitToApply - (isSpeakerScreenSharing ? 1 : 0),\n );\n }\n\n const mirror = mirrorLocalParticipantVideo ? undefined : false;\n\n if (!call) return null;\n\n const renderParticipantsBar =\n participantsBarPosition &&\n (participantsWithAppliedLimit.length > 0 || isSpeakerScreenSharing);\n return (\n <div className=\"str-video__speaker-layout__wrapper\">\n {!muted && <ParticipantsAudio participants={remoteParticipants} />}\n <div\n className={clsx(\n 'str-video__speaker-layout',\n participantsBarPosition &&\n `str-video__speaker-layout--variant-${participantsBarPosition}`,\n )}\n >\n <div className=\"str-video__speaker-layout__spotlight\">\n {participantInSpotlight && (\n <ParticipantView\n participant={participantInSpotlight}\n muteAudio={true}\n mirror={mirror}\n trackType={\n isSpeakerScreenSharing ? 'screenShareTrack' : 'videoTrack'\n }\n ParticipantViewUI={ParticipantViewUISpotlight}\n VideoPlaceholder={VideoPlaceholder}\n PictureInPicturePlaceholder={PictureInPicturePlaceholder}\n />\n )}\n </div>\n {renderParticipantsBar && (\n <div\n ref={setButtonsWrapperElement}\n className=\"str-video__speaker-layout__participants-bar-buttons-wrapper\"\n >\n <div\n className=\"str-video__speaker-layout__participants-bar-wrapper\"\n ref={setParticipantsBarWrapperElement}\n >\n <div\n ref={setParticipantsBarElement}\n className=\"str-video__speaker-layout__participants-bar\"\n >\n {isSpeakerScreenSharing && (\n <div\n className=\"str-video__speaker-layout__participant-tile\"\n key={participantInSpotlight.sessionId}\n >\n <ParticipantView\n participant={participantInSpotlight}\n ParticipantViewUI={ParticipantViewUIBar}\n VideoPlaceholder={VideoPlaceholder}\n PictureInPicturePlaceholder={PictureInPicturePlaceholder}\n mirror={mirror}\n muteAudio={true}\n />\n </div>\n )}\n {participantsWithAppliedLimit.map((participant) => (\n <div\n className=\"str-video__speaker-layout__participant-tile\"\n key={participant.sessionId}\n >\n <ParticipantView\n participant={participant}\n ParticipantViewUI={ParticipantViewUIBar}\n VideoPlaceholder={VideoPlaceholder}\n PictureInPicturePlaceholder={PictureInPicturePlaceholder}\n mirror={mirror}\n muteAudio={true}\n />\n </div>\n ))}\n </div>\n </div>\n {pageArrowsVisible && isVertical && (\n <VerticalScrollButtons\n scrollWrapper={participantsBarWrapperElement}\n />\n )}\n {pageArrowsVisible && isHorizontal && (\n <HorizontalScrollButtons\n scrollWrapper={participantsBarWrapperElement}\n />\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nSpeakerLayout.displayName = 'SpeakerLayout';\n\ntype ScrollButtonsProps<T extends HTMLElement> = {\n scrollWrapper: T | null;\n};\n\nconst HorizontalScrollButtons = <T extends HTMLElement>({\n scrollWrapper,\n}: ScrollButtonsProps<T>) => {\n const scrollPosition = useHorizontalScrollPosition(scrollWrapper);\n\n const scrollStartClickHandler = () => {\n scrollWrapper?.scrollBy({ left: -150, behavior: 'smooth' });\n };\n\n const scrollEndClickHandler = () => {\n scrollWrapper?.scrollBy({ left: 150, behavior: 'smooth' });\n };\n return (\n <>\n {scrollPosition && scrollPosition !== 'start' && (\n <IconButton\n onClick={scrollStartClickHandler}\n icon=\"caret-left\"\n className=\"str-video__speaker-layout__participants-bar--button-left\"\n />\n )}\n {scrollPosition && scrollPosition !== 'end' && (\n <IconButton\n onClick={scrollEndClickHandler}\n icon=\"caret-right\"\n className=\"str-video__speaker-layout__participants-bar--button-right\"\n />\n )}\n </>\n );\n};\n\nconst VerticalScrollButtons = <T extends HTMLElement>({\n scrollWrapper,\n}: ScrollButtonsProps<T>) => {\n const scrollPosition = useVerticalScrollPosition(scrollWrapper);\n\n const scrollTopClickHandler = () => {\n scrollWrapper?.scrollBy({ top: -150, behavior: 'smooth' });\n };\n\n const scrollBottomClickHandler = () => {\n scrollWrapper?.scrollBy({ top: 150, behavior: 'smooth' });\n };\n return (\n <>\n {scrollPosition && scrollPosition !== 'top' && (\n <IconButton\n onClick={scrollTopClickHandler}\n icon=\"caret-up\"\n className=\"str-video__speaker-layout__participants-bar--button-top\"\n />\n )}\n {scrollPosition && scrollPosition !== 'bottom' && (\n <IconButton\n onClick={scrollBottomClickHandler}\n icon=\"caret-down\"\n className=\"str-video__speaker-layout__participants-bar--button-bottom\"\n />\n )}\n </>\n );\n};\n","import { useCall, useI18n } from '@stream-io/video-react-bindings';\nimport { useEffect, useState } from 'react';\n\nimport { hasScreenShare } from '@stream-io/video-client';\nimport { Icon } from '../../../components';\nimport { ParticipantsAudio } from '../Audio';\nimport {\n DefaultParticipantViewUI,\n ParticipantView,\n ParticipantViewProps,\n} from '../ParticipantView';\nimport {\n ParticipantFilter,\n ParticipantPredicate,\n useFilteredParticipants,\n usePaginatedLayoutSortPreset,\n useRawRemoteParticipants,\n} from './hooks';\n\nexport type PipLayoutProps = {\n /**\n * Whether to exclude the local participant from the grid.\n * @default false\n */\n excludeLocalParticipant?: boolean;\n\n /**\n * Predicate to filter call participants or a filter object.\n * @example\n * // With a predicate:\n * <PipLayout\n * filterParticipants={p => p.roles.includes('student')}\n * />\n * @example\n * // With a filter object:\n * <PipLayout\n * filterParticipants={{\n * $or: [\n * { roles: { $contains: 'student' } },\n * { isPinned: true },\n * ],\n * }}\n * />\n */\n filterParticipants?: ParticipantPredicate | ParticipantFilter;\n\n /**\n * When set to `false` disables mirroring of the local partipant's video.\n * @default true\n */\n mirrorLocalParticipantVideo?: boolean;\n} & Pick<ParticipantViewProps, 'ParticipantViewUI' | 'VideoPlaceholder'>;\n\nconst Pip = (props: PipLayoutProps) => {\n const { t } = useI18n();\n const {\n excludeLocalParticipant = false,\n filterParticipants,\n mirrorLocalParticipantVideo = true,\n VideoPlaceholder,\n ParticipantViewUI = DefaultParticipantViewUI,\n } = props;\n const [layoutWrapperElement, setLayoutWrapperElement] =\n useState<HTMLDivElement | null>(null);\n\n const call = useCall();\n const participants = useFilteredParticipants({\n excludeLocalParticipant,\n filterParticipants,\n });\n const screenSharingParticipant = participants.find((p) => hasScreenShare(p));\n\n usePaginatedLayoutSortPreset(call);\n\n useEffect(() => {\n if (!layoutWrapperElement || !call) return;\n return call.setViewport(layoutWrapperElement);\n }, [layoutWrapperElement, call]);\n\n const mirror = mirrorLocalParticipantVideo ? undefined : false;\n\n if (!call) return null;\n\n return (\n <div className=\"str-video__pip-layout\" ref={setLayoutWrapperElement}>\n {screenSharingParticipant &&\n (screenSharingParticipant.isLocalParticipant ? (\n <div className=\"str-video__pip-screen-share-local\">\n <Icon icon=\"screen-share-off\" />\n <span className=\"str-video__pip-screen-share-local__title\">\n {t('You are presenting your screen')}\n </span>\n </div>\n ) : (\n <ParticipantView\n participant={screenSharingParticipant}\n trackType=\"screenShareTrack\"\n muteAudio\n mirror={false}\n VideoPlaceholder={VideoPlaceholder}\n ParticipantViewUI={ParticipantViewUI}\n />\n ))}\n {participants.map((participant) => (\n <ParticipantView\n key={participant.sessionId}\n participant={participant}\n muteAudio\n mirror={mirror}\n VideoPlaceholder={VideoPlaceholder}\n ParticipantViewUI={ParticipantViewUI}\n />\n ))}\n </div>\n );\n};\n\nPip.displayName = 'PipLayout.Pip';\n\nconst Host = () => {\n const remoteParticipants = useRawRemoteParticipants();\n return <ParticipantsAudio participants={remoteParticipants} />;\n};\n\nHost.displayName = 'PipLayout.Host';\n\nexport const PipLayout = { Pip, Host };\n","import { PropsWithChildren, useEffect, useState } from 'react';\nimport { Call, CallingState } from '@stream-io/video-client';\nimport {\n useCall,\n useCallStateHooks,\n useEffectEvent,\n useStreamVideoClient,\n} from '@stream-io/video-react-bindings';\nimport {\n BackstageLayout,\n BackstageLayoutProps,\n LivestreamLayout,\n LivestreamLayoutProps,\n StreamCall,\n} from '../../core';\n\nexport type LivestreamPlayerProps = {\n /**\n * The call type. Usually `livestream`.\n */\n callType: string;\n /**\n * The call ID.\n */\n callId: string;\n /**\n * Determines when the viewer joins the call.\n *\n * `\"asap\"` behavior means joining the call as soon as it is possible\n * (either the `join_ahead_time_seconds` setting allows it, or the user\n * has the capability to join backstage).\n *\n * `\"live\"` behavior means joining the call when it goes live.\n *\n * @default \"asap\"\n */\n joinBehavior?: 'asap' | 'live';\n /**\n * The props for the {@link LivestreamLayout} component.\n */\n layoutProps?: LivestreamLayoutProps;\n /**\n * The props for the {@link BackstageLayout} component.\n */\n backstageProps?: BackstageLayoutProps;\n /**\n * Callback to handle errors while fetching or joining livestream.\n */\n onError?: (error: any) => void;\n};\n\nexport const LivestreamPlayer = (\n props: PropsWithChildren<LivestreamPlayerProps>,\n) => {\n const { callType, callId, children, ...restProps } = props;\n const client = useStreamVideoClient();\n const [call, setCall] = useState<Call>();\n const onError = useEffectEvent(props.onError ?? (() => {}));\n\n useEffect(() => {\n if (!client) return;\n const myCall = client.call(callType, callId);\n setCall(myCall);\n myCall.get().catch((e) => {\n console.error('Failed to fetch call', e);\n onError(e);\n });\n return () => {\n myCall.leave().catch((e) => {\n console.error('Failed to leave call', e);\n });\n setCall(undefined);\n };\n }, [callId, callType, client]);\n\n if (!call) {\n return null;\n }\n\n return (\n <StreamCall call={call}>\n <LivestreamCall {...restProps} />\n {children}\n </StreamCall>\n );\n};\n\nconst LivestreamCall = (props: {\n joinBehavior?: 'asap' | 'live';\n layoutProps?: LivestreamLayoutProps;\n backstageProps?: BackstageLayoutProps;\n onError?: (error: any) => void;\n}) => {\n const call = useLivestreamCall(props);\n const { useIsCallLive } = useCallStateHooks();\n const isLive = useIsCallLive();\n\n if (!call) return null;\n\n if (isLive) {\n return <LivestreamLayout {...props.layoutProps} />;\n }\n\n return <BackstageLayout {...props.backstageProps} />;\n};\n\nconst useLivestreamCall = (props: {\n joinBehavior?: 'asap' | 'live';\n onError?: (error: any) => void;\n}) => {\n const call = useCall();\n const { useIsCallLive, useOwnCapabilities } = useCallStateHooks();\n const canJoinLive = useIsCallLive();\n const canJoinEarly = useCanJoinEarly();\n const canJoinBackstage =\n useOwnCapabilities()?.includes('join-backstage') ?? false;\n const canJoinAsap = canJoinLive || canJoinEarly || canJoinBackstage;\n const joinBehavior = props.joinBehavior ?? 'asap';\n const canJoin =\n (joinBehavior === 'asap' && canJoinAsap) ||\n (joinBehavior === 'live' && canJoinLive);\n const onError = useEffectEvent(props.onError ?? (() => {}));\n\n useEffect(() => {\n if (call && call.state.callingState === CallingState.IDLE && canJoin) {\n call.join().catch((e) => {\n console.error('Failed to join call', e);\n onError(e);\n });\n }\n }, [call, canJoin]);\n\n return call;\n};\n\nconst useCanJoinEarly = () => {\n const { useCallStartsAt, useCallSettings } = useCallStateHooks();\n const startsAt = useCallStartsAt();\n const settings = useCallSettings();\n const joinAheadTimeSeconds = settings?.backstage.join_ahead_time_seconds;\n const [canJoinEarly, setCanJoinEarly] = useState(() =>\n checkCanJoinEarly(startsAt, joinAheadTimeSeconds),\n );\n\n useEffect(() => {\n if (!canJoinEarly) {\n const handle = setInterval(() => {\n setCanJoinEarly(checkCanJoinEarly(startsAt, joinAheadTimeSeconds));\n }, 1000);\n\n return () => clearInterval(handle);\n }\n }, [canJoinEarly, startsAt, joinAheadTimeSeconds]);\n\n return canJoinEarly;\n};\n\nconst checkCanJoinEarly = (\n startsAt: Date | undefined,\n joinAheadTimeSeconds: number | undefined,\n) => {\n if (!startsAt) {\n return false;\n }\n\n return Date.now() >= +startsAt - (joinAheadTimeSeconds ?? 0) * 1000;\n};\n","import { setSdkInfo, SfuModels } from '@stream-io/video-client';\n\nexport * from '@stream-io/video-client';\nexport * from '@stream-io/video-react-bindings';\n\nexport * from './src/core';\n\nexport * from './src/components';\nexport * from './src/wrappers';\nexport * from './src/translations';\nexport {\n useHorizontalScrollPosition,\n useVerticalScrollPosition,\n useRequestPermission,\n usePersistedDevicePreferences,\n useDeviceList,\n} from './src/hooks';\nexport { applyFilter, type Filter } from './src/utilities/filter';\n\nconst [major, minor, patch] = (\n process.env.PKG_VERSION || '0.0.0-development'\n).split('.');\n\nsetSdkInfo({\n type: SfuModels.SdkType.REACT,\n major,\n minor,\n patch,\n});\n"],"names":["useCall","useState","useEffect","_jsx","hasAudio","hasScreenShareAudio","_jsxs","Fragment","createContext","useContext","useFloating","offset","shift","flip","size","autoUpdate","useCallStateHooks","CallingState","useCallback","useI18n","useMemo","MenuVisualType","_Fragment","FloatingOverlay","FloatingPortal","useRef","hasVideo","hasScreenShare","Restricted","OwnCapability","isValidElement","forwardRef","Browsers","Video","useLayoutEffect","VisibilityState","hasPausedTrack","PerformanceDegradationReason","isPlatformSupported","isMediaPipePlatformSupported","loadTFLite","loadMediaPipe","flushSync","VirtualBackground","createRenderer","disposeOfMediaStream","useToggleCallRecording","arrow","FloatingArrow","createSoundDetector","useListNavigation","useTypeahead","useClick","useDismiss","useRole","useInteractions","FloatingFocusManager","FloatingList","useListItem","lazy","Suspense","useHover","SfuModels","isPinned","ToggleButton","useConnectedUser","LoadingIndicator","DefaultLoadingIndicator","name","CallRecordingListHeader","DefaultCallRecordingListHeader","CallRecordingListItem","DefaultCallRecordingListItem","DefaultEmptyCallRecordingList","DefaultLoadingCallRecordingList","NoiseCancellationSettingsModeEnum","ParticipantActionsContextMenu","DefaultParticipantActionsContextMenu","StreamCallProvider","StreamVideoProvider","paginatedLayoutSortPreset","combineComparators","screenSharing","speakerLayoutSortPreset","CallTypes","defaultSortPreset","useStreamVideoClient","useEffectEvent","setSdkInfo"],"mappings":"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"}
|