import { connectedParticipantsObserver } from '@livekit/components-core'; import type { RoomEvent, RemoteParticipant, Room } from 'livekit-client'; import * as React from 'react'; import { useEnsureRoom } from '../context'; /** @public */ export interface UseRemoteParticipantsOptions { /** * To optimize performance, you can use the `updateOnlyOn` property to decide on what RoomEvents the hook updates. * By default it updates on all relevant RoomEvents to keep the returned participants array up to date. * The minimal set of non-overwriteable `RoomEvents` is: `[RoomEvent.ParticipantConnected, RoomEvent.ParticipantDisconnected, RoomEvent.ConnectionStateChanged]` */ updateOnlyOn?: RoomEvent[]; /** * The room to use. If not provided, the hook will use the room from the context. */ room?: Room; } /** * The `useRemoteParticipants` hook returns all remote participants (without the local) of the current room. * @remarks * To optimize performance, you can use the `updateOnlyOn` property to decide on what `RoomEvents` the hook updates. * * @example * ```tsx * const participants = useRemoteParticipants(); * * * * ``` * @public */ export function useRemoteParticipants(options: UseRemoteParticipantsOptions = {}) { const room = useEnsureRoom(options.room); const [participants, setParticipants] = React.useState([]); React.useEffect(() => { const listener = connectedParticipantsObserver(room, { additionalRoomEvents: options.updateOnlyOn, }).subscribe(setParticipants); return () => listener.unsubscribe(); }, [room, JSON.stringify(options.updateOnlyOn)]); return participants; }