Skip to content

Commit ffd6617

Browse files
authored
Allow localtrack passing on BarVisualizer (#1222)
1 parent ca070d8 commit ffd6617

File tree

6 files changed

+61
-19
lines changed

6 files changed

+61
-19
lines changed

.changeset/chilled-zebras-jump.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@livekit/components-react": patch
3+
---
4+
5+
allow localtrack passing on bar visualizer

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"format:write": "prettier --write \"**/src/**/*.{ts,tsx,md}\"",
1818
"gen:docs": "turbo run gen:docs",
1919
"gen:docs:watch": "nodemon --watch \"tooling/api-documenter/src/**/*\" --watch \"packages/react/src/**/*\" --ignore \"packages/react/src/assets/**/*\" -e js,jsx,ts,tsx -x \"pnpm gen:docs\"",
20-
"lint": "turbo run lint",
20+
"lint": "turbo run lint -- --quiet",
2121
"preinstall": "npx only-allow pnpm",
2222
"ci:publish": "turbo run build --filter=./packages/* && pnpm gen:docs && changeset publish",
2323
"start:next": "turbo run start --filter=@livekit/component-example-next...",

packages/core/etc/components-core.api.md

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { ConnectionQuality } from 'livekit-client';
1111
import { ConnectionState } from 'livekit-client';
1212
import { DataPacket_Kind } from 'livekit-client';
1313
import { DataPublishOptions } from 'livekit-client';
14+
import { Encryption_Type } from 'livekit-client';
1415
import { LocalAudioTrack } from 'livekit-client';
1516
import { LocalParticipant } from 'livekit-client';
1617
import { LocalVideoTrack } from 'livekit-client';
@@ -114,7 +115,7 @@ export function createChatObserver(room: Room): Observable<[message: ChatMessage
114115
export function createConnectionQualityObserver(participant: Participant): Observable<ConnectionQuality>;
115116

116117
// @public (undocumented)
117-
export function createDataObserver(room: Room): Observable<[payload: Uint8Array<ArrayBufferLike>, participant?: RemoteParticipant | undefined, kind?: DataPacket_Kind | undefined, topic?: string | undefined]>;
118+
export function createDataObserver(room: Room): Observable<[payload: Uint8Array<ArrayBufferLike>, participant?: RemoteParticipant | undefined, kind?: DataPacket_Kind | undefined, topic?: string | undefined, encryptionType?: Encryption_Type | undefined]>;
118119

119120
// @public (undocumented)
120121
export const createDefaultGrammar: () => {
@@ -320,6 +321,20 @@ export function observeRoomEvents(room: Room, ...events: RoomEvent[]): Observabl
320321
// @public (undocumented)
321322
export function observeTrackEvents(track: TrackPublication, ...events: TrackEvent_2[]): Observable<TrackPublication>;
322323

324+
// @public
325+
export enum ParticipantAgentAttributes {
326+
// (undocumented)
327+
AgentState = "lk.agent.state",
328+
// (undocumented)
329+
PublishOnBehalf = "lk.publish_on_behalf",
330+
// (undocumented)
331+
TranscribedTrackId = "lk.transcribed_track_id",
332+
// (undocumented)
333+
TranscriptionFinal = "lk.transcription_final",
334+
// (undocumented)
335+
TranscriptionSegmentId = "lk.segment_id"
336+
}
337+
323338
// @public (undocumented)
324339
export function participantAttributesObserver(participant: Participant): Observable<{
325340
changed: Readonly<Record<string, string>>;
@@ -410,26 +425,39 @@ export const PIN_DEFAULT_STATE: PinState;
410425
// @public (undocumented)
411426
export type PinState = TrackReferenceOrPlaceholder[];
412427

428+
// Warning: (ae-forgotten-export) The symbol "ReceivedMessageWithType" needs to be exported by the entry point index.d.ts
429+
//
413430
// @public (undocumented)
414-
export interface ReceivedChatMessage extends ChatMessage {
415-
// (undocumented)
416-
attributes?: Record<string, string>;
417-
// (undocumented)
431+
export type ReceivedAgentTranscriptionMessage = ReceivedMessageWithType<'agentTranscript', {
432+
message: string;
433+
}>;
434+
435+
// @public (undocumented)
436+
export type ReceivedChatMessage = ReceivedMessageWithType<'chatMessage', ChatMessage & {
418437
from?: Participant;
419-
}
438+
attributes?: Record<string, string>;
439+
}>;
420440

421441
// @public (undocumented)
422442
export interface ReceivedDataMessage<T extends string | undefined = string> extends BaseDataMessage<T> {
423443
// (undocumented)
424444
from?: Participant;
425445
}
426446

447+
// @public (undocumented)
448+
export type ReceivedMessage = ReceivedUserTranscriptionMessage | ReceivedAgentTranscriptionMessage | ReceivedChatMessage;
449+
427450
// @public (undocumented)
428451
export type ReceivedTranscriptionSegment = TranscriptionSegment & {
429452
receivedAtMediaTimestamp: number;
430453
receivedAt: number;
431454
};
432455

456+
// @public (undocumented)
457+
export type ReceivedUserTranscriptionMessage = ReceivedMessageWithType<'userTranscript', {
458+
message: string;
459+
}>;
460+
433461
// @public (undocumented)
434462
export function recordingStatusObservable(room: Room): Observable<boolean>;
435463

@@ -479,6 +507,9 @@ export function selectGridLayout(layoutDefinitions: GridLayoutDefinition[], part
479507
// @public
480508
export function sendMessage(localParticipant: LocalParticipant, payload: Uint8Array, options?: DataPublishOptions): Promise<void>;
481509

510+
// @public (undocumented)
511+
export type SentMessage = ChatMessage;
512+
482513
// @public (undocumented)
483514
export function setDifference<T>(setA: Set<T>, setB: Set<T>): Set<T>;
484515

packages/react/etc/components-react.api.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import { isTrackReference } from '@livekit/components-core';
2323
import { KrispNoiseFilterProcessor } from '@livekit/krisp-noise-filter';
2424
import { LocalAudioTrack } from 'livekit-client';
2525
import { LocalParticipant } from 'livekit-client';
26-
import { LocalTrack } from 'livekit-client';
2726
import { LocalTrackPublication } from 'livekit-client';
2827
import { LocalUserChoices } from '@livekit/components-core';
2928
import { LocalVideoTrack } from 'livekit-client';
@@ -165,6 +164,8 @@ export interface BarVisualizerProps extends React_2.HTMLProps<HTMLDivElement> {
165164
options?: BarVisualizerOptions;
166165
state?: AgentState;
167166
// (undocumented)
167+
track?: TrackReferenceOrPlaceholder | LocalAudioTrack | RemoteAudioTrack;
168+
// @deprecated (undocumented)
168169
trackRef?: TrackReferenceOrPlaceholder;
169170
}
170171

@@ -1147,7 +1148,7 @@ export function usePreviewDevice<T extends LocalVideoTrack | LocalAudioTrack>(en
11471148
};
11481149

11491150
// @public (undocumented)
1150-
export function usePreviewTracks(options: CreateLocalTracksOptions, onError?: (err: Error) => void): LocalTrack<Track.Kind>[] | undefined;
1151+
export function usePreviewTracks(options: CreateLocalTracksOptions, onError?: (err: Error) => void): (LocalAudioTrack | LocalVideoTrack)[] | undefined;
11511152

11521153
// @public
11531154
export function useRemoteParticipant(identifier: ParticipantIdentifier, options?: UseRemoteParticipantOptions): RemoteParticipant | undefined;

packages/react/src/components/participant/BarVisualizer.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import * as React from 'react';
22
import { useBarAnimator } from './animators/useBarAnimator';
33
import { useMultibandTrackVolume, type AgentState } from '../../hooks';
4-
import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';
4+
import { type TrackReferenceOrPlaceholder } from '@livekit/components-core';
55
import { useMaybeTrackRefContext } from '../../context';
66
import { cloneSingleChild, mergeProps } from '../../utils';
7+
import { LocalAudioTrack, RemoteAudioTrack } from 'livekit-client';
78

89
/**
910
* @beta
@@ -23,7 +24,9 @@ export interface BarVisualizerProps extends React.HTMLProps<HTMLDivElement> {
2324
state?: AgentState;
2425
/** Number of bars that show up in the visualizer */
2526
barCount?: number;
27+
/** @deprecated use `track` field instead */
2628
trackRef?: TrackReferenceOrPlaceholder;
29+
track?: TrackReferenceOrPlaceholder | LocalAudioTrack | RemoteAudioTrack;
2730
options?: BarVisualizerOptions;
2831
/** The template component to be used in the visualizer. */
2932
children?: React.ReactNode;
@@ -106,17 +109,18 @@ const getSequencerInterval = (
106109
*/
107110
export const BarVisualizer = /* @__PURE__ */ React.forwardRef<HTMLDivElement, BarVisualizerProps>(
108111
function BarVisualizer(
109-
{ state, options, barCount = 15, trackRef, children, ...props }: BarVisualizerProps,
112+
{ state, options, barCount = 15, trackRef, track, children, ...props }: BarVisualizerProps,
110113
ref,
111114
) {
112115
const elementProps = mergeProps(props, { className: 'lk-audio-bar-visualizer' });
113-
let trackReference = useMaybeTrackRefContext();
116+
let targetTrack: TrackReferenceOrPlaceholder | LocalAudioTrack | RemoteAudioTrack | undefined =
117+
useMaybeTrackRefContext();
114118

115-
if (trackRef) {
116-
trackReference = trackRef;
119+
if (trackRef || track) {
120+
targetTrack = trackRef || track;
117121
}
118122

119-
const volumeBands = useMultibandTrackVolume(trackReference, {
123+
const volumeBands = useMultibandTrackVolume(targetTrack, {
120124
bands: barCount,
121125
loPass: 100,
122126
hiPass: 200,

packages/react/src/prefabs/PreJoin.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type {
22
CreateLocalTracksOptions,
33
LocalAudioTrack,
4-
LocalTrack,
54
LocalVideoTrack,
65
TrackProcessor,
76
} from 'livekit-client';
@@ -59,17 +58,19 @@ export function usePreviewTracks(
5958
options: CreateLocalTracksOptions,
6059
onError?: (err: Error) => void,
6160
) {
62-
const [tracks, setTracks] = React.useState<LocalTrack[]>();
61+
const [tracks, setTracks] = React.useState<Array<LocalAudioTrack | LocalVideoTrack>>();
6362

6463
const trackLock = React.useMemo(() => new Mutex(), []);
6564

6665
React.useEffect(() => {
6766
let needsCleanup = false;
68-
let localTracks: Array<LocalTrack> = [];
67+
let localTracks: Array<LocalAudioTrack | LocalVideoTrack> = [];
6968
trackLock.lock().then(async (unlock) => {
7069
try {
7170
if (options.audio || options.video) {
72-
localTracks = await createLocalTracks(options);
71+
localTracks = (await createLocalTracks(options)) as Array<
72+
LocalAudioTrack | LocalVideoTrack
73+
>;
7374

7475
if (needsCleanup) {
7576
localTracks.forEach((tr) => tr.stop());

0 commit comments

Comments
 (0)