diff --git a/src/frontend/src/features/rooms/livekit/components/MediaStateObserver.tsx b/src/frontend/src/features/rooms/livekit/components/MediaStateObserver.tsx index 90687c43..63ffc518 100644 --- a/src/frontend/src/features/rooms/livekit/components/MediaStateObserver.tsx +++ b/src/frontend/src/features/rooms/livekit/components/MediaStateObserver.tsx @@ -1,4 +1,13 @@ import { useLocalParticipant } from '@livekit/components-react' +import { useEffect } from 'react' + +export const MEDIA_STATE_ELEMENT_ID = 'media-state' +export const MEDIA_STATE_CHANGED_EVENT = 'media-state-changed' + +export type MediaStateChangedDetail = { + microphoneEnabled: boolean + cameraEnabled: boolean +} /** * Exposes the local participant's media state in the DOM so external tools @@ -11,9 +20,20 @@ import { useLocalParticipant } from '@livekit/components-react' export const MediaStateObserver = () => { const { isMicrophoneEnabled, isCameraEnabled } = useLocalParticipant() + useEffect(() => { + window.dispatchEvent( + new CustomEvent(MEDIA_STATE_CHANGED_EVENT, { + detail: { + microphoneEnabled: isMicrophoneEnabled, + cameraEnabled: isCameraEnabled, + }, + }) + ) + }, [isMicrophoneEnabled, isCameraEnabled]) + return (