Skip to content

Commit 3e7d084

Browse files
authored
Infer default controls from permissions (#13)
1 parent 8cd6443 commit 3e7d084

File tree

3 files changed

+48
-11
lines changed

3 files changed

+48
-11
lines changed

app/page.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { RoomAudioRenderer, RoomContext, StartAudio } from '@livekit/components-
66
import { toastAlert } from '@/components/alert-toast';
77
import SessionView from '@/components/session-view';
88
import { Toaster } from '@/components/ui/sonner';
9-
import { toastAlert } from '@/components/warning-toast';
109
import { Welcome } from '@/components/welcome';
1110
import useConnectionDetails from '@/hooks/useConnectionDetails';
1211

components/livekit/agent-control-bar/hooks/use-agent-control-bar.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
usePersistentUserChoices,
77
useRoomContext,
88
} from '@livekit/components-react';
9+
import { usePublishPermissions } from './use-publish-permissions';
910

1011
export interface UseAgentControlBarProps {
1112
controls?: {
@@ -26,14 +27,10 @@ export function useAgentControlBar({
2627
}: UseAgentControlBarProps) {
2728
const visibleControls = {
2829
leave: true,
29-
microphone: true,
30-
screenShare: true,
31-
chat: true,
32-
camera: true,
3330
...controls,
3431
};
35-
const localPermissions = useLocalParticipantPermissions();
3632
const { microphoneTrack, localParticipant } = useLocalParticipant();
33+
const publishPermissions = usePublishPermissions();
3734
const room = useRoomContext();
3835

3936
const micTrackRef = React.useMemo(() => {
@@ -44,11 +41,10 @@ export function useAgentControlBar({
4441
};
4542
}, [localParticipant, microphoneTrack]);
4643

47-
if (!localPermissions) {
48-
visibleControls.microphone = false;
49-
} else {
50-
visibleControls.microphone ??= localPermissions.canPublish;
51-
}
44+
visibleControls.microphone ??= publishPermissions.microphone;
45+
visibleControls.screenShare ??= publishPermissions.screenShare;
46+
visibleControls.camera ??= publishPermissions.camera;
47+
visibleControls.chat ??= publishPermissions.data;
5248

5349
const { saveAudioInputEnabled, saveAudioInputDeviceId } = usePersistentUserChoices({
5450
preventSave: !saveUserChoices,
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { Track } from 'livekit-client';
2+
import { useLocalParticipantPermissions } from '@livekit/components-react';
3+
4+
const trackSourceToProtocol = (source: Track.Source) => {
5+
// NOTE: this mapping avoids importing the protocol package as that leads to a significant bundle size increase
6+
switch (source) {
7+
case Track.Source.Camera:
8+
return 1;
9+
case Track.Source.Microphone:
10+
return 2;
11+
case Track.Source.ScreenShare:
12+
return 3;
13+
default:
14+
return 0;
15+
}
16+
};
17+
18+
export interface PublishPermissions {
19+
camera: boolean;
20+
microphone: boolean;
21+
screenShare: boolean;
22+
data: boolean;
23+
}
24+
25+
export function usePublishPermissions(): PublishPermissions {
26+
const localPermissions = useLocalParticipantPermissions();
27+
28+
const canPublishSource = (source: Track.Source) => {
29+
return (
30+
!!localPermissions?.canPublish &&
31+
(localPermissions.canPublishSources.length === 0 ||
32+
localPermissions.canPublishSources.includes(trackSourceToProtocol(source)))
33+
);
34+
};
35+
36+
return {
37+
camera: canPublishSource(Track.Source.Camera),
38+
microphone: canPublishSource(Track.Source.Microphone),
39+
screenShare: canPublishSource(Track.Source.ScreenShare),
40+
data: localPermissions?.canPublishData ?? false,
41+
};
42+
}

0 commit comments

Comments
 (0)