'use client'; import React from 'react'; import { MediaDeviceMenu, TrackReference, TrackToggle, useLocalParticipant, VideoTrack, } from '@livekit/components-react'; import { isLocalTrack, LocalTrackPublication, Track } from 'livekit-client'; // Background image paths const BACKGROUND_IMAGES = [ { name: 'Desk', path: { src: '/background-images/samantha-gades-BlIhVfXbi9s-unsplash.jpg' } }, { name: 'Nature', path: { src: '/background-images/ali-kazal-tbw_KQE3Cbg-unsplash.jpg' } }, ]; // Background options type BackgroundType = 'none' | 'blur' | 'image'; export function CameraSettings() { const { cameraTrack, localParticipant } = useLocalParticipant(); const [backgroundType, setBackgroundType] = React.useState( (cameraTrack as LocalTrackPublication)?.track?.getProcessor()?.name === 'background-blur' ? 'blur' : (cameraTrack as LocalTrackPublication)?.track?.getProcessor()?.name === 'virtual-background' ? 'image' : 'none', ); const [virtualBackgroundImagePath, setVirtualBackgroundImagePath] = React.useState( null, ); const camTrackRef: TrackReference | undefined = React.useMemo(() => { return cameraTrack ? { participant: localParticipant, publication: cameraTrack, source: Track.Source.Camera } : undefined; }, [localParticipant, cameraTrack]); const selectBackground = (type: BackgroundType, imagePath?: string) => { setBackgroundType(type); if (type === 'image' && imagePath) { setVirtualBackgroundImagePath(imagePath); } else if (type !== 'image') { setVirtualBackgroundImagePath(null); } }; React.useEffect(() => { if (isLocalTrack(cameraTrack?.track)) { if (backgroundType === 'blur') { import('@livekit/track-processors').then(({ BackgroundBlur }) => { cameraTrack.track?.setProcessor(BackgroundBlur()); }); } else if (backgroundType === 'image' && virtualBackgroundImagePath) { import('@livekit/track-processors').then(({ VirtualBackground }) => { cameraTrack.track?.setProcessor(VirtualBackground(virtualBackgroundImagePath)); }); } else { cameraTrack.track?.stopProcessor(); } } }, [cameraTrack, backgroundType, virtualBackgroundImagePath]); return (
{camTrackRef && ( )}
Camera
Background Effects
{BACKGROUND_IMAGES.map((image) => ( ))}
); }