'use client'; import React, { useState, useEffect } from 'react'; import { DisconnectButton, useLayoutContext, useRoomContext } from '@livekit/components-react'; import { Room, RoomEvent, Track } from 'livekit-client'; import { mergeClasses } from '@/lib/client-utils'; import { ToggleSource } from '@livekit/components-core'; import '../../styles/CustomControlBar.css'; import { CameraOffSVG, CameraOnSVG } from '../svg/camera'; import { MicOffSVG, MicOnSVG } from '../svg/mic'; import { ScreenShareOnSVG } from '../svg/screen-share'; import { useCustomLayoutContext } from '../contexts/layout-context'; interface CustomControlBarProps { room: Room; roomName: string; } export function CustomControlBar({ room, roomName }: CustomControlBarProps) { const [recording, setRecording] = useState(false); const [participantCount, setParticipantCount] = useState(1); const { dispatch } = useLayoutContext().widget; const { isParticipantsListOpen } = useCustomLayoutContext(); function ToggleParticipantsList() { if (isParticipantsListOpen.dispatch) isParticipantsListOpen.dispatch({ msg: 'toggle_participants_list' }); } useEffect(() => { if (room) { const updateRecordingStatus = () => setRecording(room.isRecording); const updateParticipantCount = () => { setParticipantCount(room.numParticipants); }; room.on(RoomEvent.Connected, updateParticipantCount); room.on(RoomEvent.ParticipantConnected, updateParticipantCount); room.on(RoomEvent.ParticipantDisconnected, updateParticipantCount); room.on(RoomEvent.RecordingStatusChanged, updateRecordingStatus); return () => { room.off(RoomEvent.Connected, updateParticipantCount); room.off(RoomEvent.ParticipantConnected, updateParticipantCount); room.off(RoomEvent.ParticipantDisconnected, updateParticipantCount); room.off(RoomEvent.RecordingStatusChanged, updateRecordingStatus); }; } }, [room]); const handleCopyLink = () => { navigator.clipboard .writeText(window.location.href) .then(() => alert('Link copied to clipboard!')) .catch((err) => console.error('Failed to copy link:', err)); }; return (