Skip to content

Commit 5bba92f

Browse files
committed
feat: add room option for useChat / useTextStream / useTrackToggle / useTranscriptions
1 parent 94f9ded commit 5bba92f

File tree

4 files changed

+26
-15
lines changed

4 files changed

+26
-15
lines changed

packages/react/src/hooks/useChat.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import * as React from 'react';
22
import type { ChatOptions, ReceivedChatMessage } from '@livekit/components-core';
33
import { setupChat } from '@livekit/components-core';
4-
import { ConnectionState } from 'livekit-client';
5-
import { useRoomContext } from '../context';
4+
import { ConnectionState, Room } from 'livekit-client';
5+
import { useEnsureRoom } from '../context';
66
import { useObservableState } from './internal/useObservableState';
77
import { useConnectionState } from './useConnectionStatus';
88

@@ -39,8 +39,8 @@ import { useConnectionState } from './useConnectionStatus';
3939
* ```
4040
* @public
4141
*/
42-
export function useChat(options?: ChatOptions) {
43-
const room = useRoomContext();
42+
export function useChat(options?: ChatOptions & { room?: Room }) {
43+
const room = useEnsureRoom(options?.room);
4444
const connectionState = useConnectionState(room);
4545
const isDisconnected = React.useMemo(
4646
() => connectionState === ConnectionState.Disconnected,

packages/react/src/hooks/useTextStream.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import * as React from 'react';
2-
import { ConnectionState } from 'livekit-client';
2+
import { ConnectionState, Room } from 'livekit-client';
33
import { setupTextStream, type TextStreamData } from '@livekit/components-core';
4-
import { useRoomContext } from '../context';
4+
import { useEnsureRoom } from '../context';
55
import { useConnectionState } from './useConnectionStatus';
66
import { useObservableState } from './internal';
77

8+
export type UseTextStreamOptions = {
9+
room?: Room;
10+
};
11+
812
/**
913
* @beta
1014
* @param topic - the topic to listen to
@@ -15,8 +19,8 @@ import { useObservableState } from './internal';
1519
* return <div>{textStreams.map((textStream) => textStream.text)}</div>;
1620
* ```
1721
*/
18-
export function useTextStream(topic: string) {
19-
const room = useRoomContext();
22+
export function useTextStream(topic: string, options?: UseTextStreamOptions) {
23+
const room = useEnsureRoom(options?.room);
2024

2125
const connectionState = useConnectionState(room);
2226
const isDisconnected = connectionState === ConnectionState.Disconnected;

packages/react/src/hooks/useTrackToggle.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import type { ToggleSource } from '@livekit/components-core';
22
import { setupMediaToggle, setupManualToggle, log } from '@livekit/components-core';
33
import * as React from 'react';
4+
import { type Room } from 'livekit-client';
45
import type { TrackToggleProps } from '../components';
56
import { useMaybeRoomContext } from '../context';
67
import { mergeProps } from '../mergeProps';
78
import { useObservableState } from './internal';
89

910
/** @public */
1011
export interface UseTrackToggleProps<T extends ToggleSource>
11-
extends Omit<TrackToggleProps<T>, 'showIcon'> {}
12+
extends Omit<TrackToggleProps<T>, 'showIcon'> {
13+
room?: Room;
14+
}
1215

1316
/**
1417
* The `useTrackToggle` hook is used to implement the `TrackToggle` component and returns state
@@ -28,19 +31,21 @@ export function useTrackToggle<T extends ToggleSource>({
2831
captureOptions,
2932
publishOptions,
3033
onDeviceError,
34+
room,
3135
...rest
3236
}: UseTrackToggleProps<T>) {
33-
const room = useMaybeRoomContext();
34-
const track = room?.localParticipant?.getTrackPublication(source);
37+
const roomFromContext = useMaybeRoomContext();
38+
const roomFallback = React.useMemo(() => room ?? roomFromContext, [room, roomFromContext]);
39+
const track = roomFallback?.localParticipant?.getTrackPublication(source);
3540
/** `true` if a user interaction such as a click on the TrackToggle button has occurred. */
3641
const userInteractionRef = React.useRef(false);
3742

3843
const { toggle, className, pendingObserver, enabledObserver } = React.useMemo(
3944
() =>
40-
room
41-
? setupMediaToggle<T>(source, room, captureOptions, publishOptions, onDeviceError)
45+
roomFallback
46+
? setupMediaToggle<T>(source, roomFallback, captureOptions, publishOptions, onDeviceError)
4247
: setupManualToggle(),
43-
[room, source, JSON.stringify(captureOptions), publishOptions],
48+
[roomFallback, source, JSON.stringify(captureOptions), publishOptions],
4449
);
4550

4651
const pending = useObservableState(pendingObserver, false);

packages/react/src/hooks/useTranscriptions.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import * as React from 'react';
22
import { useTextStream } from './useTextStream';
33
import { DataTopic, ParticipantAgentAttributes } from '@livekit/components-core';
4+
import { Room } from 'livekit-client';
45

56
/**
67
* @beta
78
*/
89
export interface UseTranscriptionsOptions {
10+
room?: Room;
911
participantIdentities?: string[];
1012
trackSids?: string[];
1113
}
@@ -22,7 +24,7 @@ export interface UseTranscriptionsOptions {
2224
*/
2325
export function useTranscriptions(opts?: UseTranscriptionsOptions) {
2426
const { participantIdentities, trackSids } = opts ?? {};
25-
const { textStreams } = useTextStream(DataTopic.TRANSCRIPTION);
27+
const { textStreams } = useTextStream(DataTopic.TRANSCRIPTION, { room: opts?.room });
2628

2729
const filteredMessages = React.useMemo(
2830
() =>

0 commit comments

Comments
 (0)