@werxt/livekit-components-react 2.9.20 → 2.9.21-werxt.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./shared-88J2fzv7.js"),t=require("./shared-CjI_UuOX.js"),u=require("./shared-BDr0qLg4.js"),e=require("./shared-DTHOl3uJ.js"),m=require("react");function P(i){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(i){for(const s in i)if(s!=="default"){const r=Object.getOwnPropertyDescriptor(i,s);Object.defineProperty(a,s,r.get?r:{enumerable:!0,get:()=>i[s]})}}return a.default=i,Object.freeze(a)}const n=P(m),v=n.forwardRef(function(a,s){const{buttonProps:r}=o.useClearPinButton(a);return n.createElement("button",{ref:s,...r},a.children)}),T=n.forwardRef(function({room:a,...s},r){const c=t.useConnectionState(a);return n.createElement("div",{ref:r,...s},c)}),p=n.forwardRef(function({label:a="Allow Audio",...s},r){const c=u.useEnsureRoom(s.room),{mergedProps:l}=t.useStartAudio({room:c,props:s});return n.createElement("button",{ref:r,...l},a)}),f=n.forwardRef(function(a,s){const{room:r,htmlProps:c}=o.useLiveKitRoom(a);return n.createElement("div",{ref:s,...c},r&&n.createElement(u.RoomContext.Provider,{value:r},n.createElement(e.LKFeatureContext.Provider,{value:a.featureFlags},a.children)))}),k=n.forwardRef(function({trackRef:a,...s},r){const g=t.useEnsureTrackRef(a),S=t.useMultibandTrackVolume(g,{bands:7,loPass:300});return n.createElement("svg",{ref:r,width:"100%",height:"100%",viewBox:"0 0 200 90",...s,className:"lk-audio-visualizer"},n.createElement("rect",{x:"0",y:"0",width:"100%",height:"100%"}),n.createElement("g",{style:{transform:`translate(${130/2}px, 0)`}},S.map((d,C)=>n.createElement("rect",{key:C,x:C*10,y:90/2-d*50/2,width:6,height:d*50}))))});function y({participants:i,...a}){return n.createElement(n.Fragment,null,i.map(s=>n.createElement(t.ParticipantContext.Provider,{value:s,key:s.identity},t.cloneSingleChild(a.children))))}const I=n.forwardRef(function({childrenPosition:a="before",children:s,...r},c){const{name:l}=o.useRoomInfo();return n.createElement("span",{ref:c,...r},a==="before"&&s,l,a==="after"&&s)});function x(i){return n.createElement(o.SessionContext.Provider,{value:i.session},n.createElement(u.RoomContext.Provider,{value:i.session.room},i.children))}exports.AgentEvent=o.AgentEvent;exports.MessagesEvent=o.MessagesEvent;exports.SessionEvent=o.SessionEvent;exports.useAgent=o.useAgent;exports.useAudioPlayback=o.useAudioPlayback;exports.useClearPinButton=o.useClearPinButton;exports.useDataChannel=o.useDataChannel;exports.useEnsureSession=o.useEnsureSession;exports.useEvents=o.useEvents;exports.useIsRecording=o.useIsRecording;exports.useLiveKitRoom=o.useLiveKitRoom;exports.useMaybeSessionContext=o.useMaybeSessionContext;exports.useParticipantAttribute=o.useParticipantAttribute;exports.useParticipantAttributes=o.useParticipantAttributes;exports.useParticipantInfo=o.useParticipantInfo;exports.useParticipantPermissions=o.useParticipantPermissions;exports.useParticipantTracks=o.useParticipantTracks;exports.useParticipants=o.useParticipants;exports.useRemoteParticipant=o.useRemoteParticipant;exports.useRemoteParticipants=o.useRemoteParticipants;exports.useRoomInfo=o.useRoomInfo;exports.useSequentialRoomConnectDisconnect=o.useSequentialRoomConnectDisconnect;exports.useSession=o.useSession;exports.useSessionContext=o.useSessionContext;exports.useSessionMessages=o.useSessionMessages;exports.useSortedParticipants=o.useSortedParticipants;exports.useSpeakingParticipants=o.useSpeakingParticipants;exports.useTextStream=o.useTextStream;exports.useToken=o.useToken;exports.useTrackByName=o.useTrackByName;exports.useTrackTranscription=o.useTrackTranscription;exports.useTranscriptions=o.useTranscriptions;exports.useVoiceAssistant=o.useVoiceAssistant;exports.LayoutContext=t.LayoutContext;exports.ParticipantContext=t.ParticipantContext;exports.TrackRefContext=t.TrackRefContext;exports.useAudioWaveform=t.useAudioWaveform;exports.useChat=t.useChat;exports.useChatToggle=t.useChatToggle;exports.useConnectionQualityIndicator=t.useConnectionQualityIndicator;exports.useConnectionState=t.useConnectionState;exports.useCreateLayoutContext=t.useCreateLayoutContext;exports.useDisconnectButton=t.useDisconnectButton;exports.useEnsureCreateLayoutContext=t.useEnsureCreateLayoutContext;exports.useEnsureLayoutContext=t.useEnsureLayoutContext;exports.useEnsureParticipant=t.useEnsureParticipant;exports.useEnsureTrackRef=t.useEnsureTrackRef;exports.useFacingMode=t.useFacingMode;exports.useFocusToggle=t.useFocusToggle;exports.useGridLayout=t.useGridLayout;exports.useIsEncrypted=t.useIsEncrypted;exports.useIsMuted=t.useIsMuted;exports.useIsSpeaking=t.useIsSpeaking;exports.useLayoutContext=t.useLayoutContext;exports.useLocalParticipantPermissions=t.useLocalParticipantPermissions;exports.useMaybeLayoutContext=t.useMaybeLayoutContext;exports.useMaybeParticipantContext=t.useMaybeParticipantContext;exports.useMaybeTrackRefContext=t.useMaybeTrackRefContext;exports.useMediaDeviceSelect=t.useMediaDeviceSelect;exports.useMediaDevices=t.useMediaDevices;exports.useMultibandTrackVolume=t.useMultibandTrackVolume;exports.usePagination=t.usePagination;exports.useParticipantContext=t.useParticipantContext;exports.useParticipantTile=t.useParticipantTile;exports.usePersistentUserChoices=t.usePersistentUserChoices;exports.usePinnedTracks=t.usePinnedTracks;exports.useStartAudio=t.useStartAudio;exports.useStartVideo=t.useStartVideo;exports.useSwipe=t.useSwipe;exports.useTrackMutedIndicator=t.useTrackMutedIndicator;exports.useTrackRefContext=t.useTrackRefContext;exports.useTrackToggle=t.useTrackToggle;exports.useTrackVolume=t.useTrackVolume;exports.useTracks=t.useTracks;exports.useVisualStableUpdate=t.useVisualStableUpdate;exports.RoomContext=u.RoomContext;exports.isTrackReference=u.isTrackReference;exports.setLogExtension=u.setLogExtension;exports.setLogLevel=u.setLogLevel;exports.useEnsureRoom=u.useEnsureRoom;exports.useLocalParticipant=u.useLocalParticipant;exports.useMaybeRoomContext=u.useMaybeRoomContext;exports.useRoomContext=u.useRoomContext;exports.AudioConference=e.AudioConference;exports.AudioTrack=e.AudioTrack;exports.BarVisualizer=e.BarVisualizer;exports.CameraDisabledIcon=e.SvgCameraDisabledIcon;exports.CameraIcon=e.SvgCameraIcon;exports.CarouselLayout=e.CarouselLayout;exports.Chat=e.Chat;exports.ChatCloseIcon=e.SvgChatCloseIcon;exports.ChatEntry=e.ChatEntry;exports.ChatIcon=e.SvgChatIcon;exports.ChatToggle=e.ChatToggle;exports.Chevron=e.SvgChevron;exports.ConnectionQualityIndicator=e.ConnectionQualityIndicator;exports.ConnectionStateToast=e.ConnectionStateToast;exports.ControlBar=e.ControlBar;exports.DisconnectButton=e.DisconnectButton;exports.FocusLayout=e.FocusLayout;exports.FocusLayoutContainer=e.FocusLayoutContainer;exports.FocusToggle=e.FocusToggle;exports.FocusToggleIcon=e.SvgFocusToggleIcon;exports.GearIcon=e.SvgGearIcon;exports.GridLayout=e.GridLayout;exports.LKFeatureContext=e.LKFeatureContext;exports.LayoutContextProvider=e.LayoutContextProvider;exports.LeaveIcon=e.SvgLeaveIcon;exports.LockLockedIcon=e.SvgLockLockedIcon;exports.MediaDeviceMenu=e.MediaDeviceMenu;exports.MediaDeviceSelect=e.MediaDeviceSelect;exports.MicDisabledIcon=e.SvgMicDisabledIcon;exports.MicIcon=e.SvgMicIcon;exports.ParticipantAudioTile=e.ParticipantAudioTile;exports.ParticipantContextIfNeeded=e.ParticipantContextIfNeeded;exports.ParticipantName=e.ParticipantName;exports.ParticipantPlaceholder=e.SvgParticipantPlaceholder;exports.ParticipantTile=e.ParticipantTile;exports.PreJoin=e.PreJoin;exports.QualityExcellentIcon=e.SvgQualityExcellentIcon;exports.QualityGoodIcon=e.SvgQualityGoodIcon;exports.QualityPoorIcon=e.SvgQualityPoorIcon;exports.QualityUnknownIcon=e.SvgQualityUnknownIcon;exports.RoomAudioRenderer=e.RoomAudioRenderer;exports.ScreenShareIcon=e.SvgScreenShareIcon;exports.ScreenShareStopIcon=e.SvgScreenShareStopIcon;exports.SpinnerIcon=e.SvgSpinnerIcon;exports.StartMediaButton=e.StartMediaButton;exports.Toast=e.Toast;exports.TrackLoop=e.TrackLoop;exports.TrackMutedIndicator=e.TrackMutedIndicator;exports.TrackRefContextIfNeeded=e.TrackRefContextIfNeeded;exports.TrackToggle=e.TrackToggle;exports.UnfocusToggleIcon=e.SvgUnfocusToggleIcon;exports.VideoConference=e.VideoConference;exports.VideoTrack=e.VideoTrack;exports.VoiceAssistantControlBar=e.VoiceAssistantControlBar;exports.formatChatMessageLinks=e.formatChatMessageLinks;exports.useFeatureContext=e.useFeatureContext;exports.usePreviewDevice=e.usePreviewDevice;exports.usePreviewTracks=e.usePreviewTracks;exports.AudioVisualizer=k;exports.ClearPinButton=v;exports.ConnectionState=T;exports.LiveKitRoom=f;exports.ParticipantLoop=y;exports.RoomName=I;exports.SessionProvider=x;exports.StartAudio=p;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./shared-88J2fzv7.js"),t=require("./shared-CjI_UuOX.js"),u=require("./shared-BDr0qLg4.js"),e=require("./shared-D2Tkgmsq.js"),m=require("react");function P(i){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(i){for(const s in i)if(s!=="default"){const r=Object.getOwnPropertyDescriptor(i,s);Object.defineProperty(a,s,r.get?r:{enumerable:!0,get:()=>i[s]})}}return a.default=i,Object.freeze(a)}const n=P(m),v=n.forwardRef(function(a,s){const{buttonProps:r}=o.useClearPinButton(a);return n.createElement("button",{ref:s,...r},a.children)}),T=n.forwardRef(function({room:a,...s},r){const c=t.useConnectionState(a);return n.createElement("div",{ref:r,...s},c)}),p=n.forwardRef(function({label:a="Allow Audio",...s},r){const c=u.useEnsureRoom(s.room),{mergedProps:l}=t.useStartAudio({room:c,props:s});return n.createElement("button",{ref:r,...l},a)}),f=n.forwardRef(function(a,s){const{room:r,htmlProps:c}=o.useLiveKitRoom(a);return n.createElement("div",{ref:s,...c},r&&n.createElement(u.RoomContext.Provider,{value:r},n.createElement(e.LKFeatureContext.Provider,{value:a.featureFlags},a.children)))}),k=n.forwardRef(function({trackRef:a,...s},r){const g=t.useEnsureTrackRef(a),S=t.useMultibandTrackVolume(g,{bands:7,loPass:300});return n.createElement("svg",{ref:r,width:"100%",height:"100%",viewBox:"0 0 200 90",...s,className:"lk-audio-visualizer"},n.createElement("rect",{x:"0",y:"0",width:"100%",height:"100%"}),n.createElement("g",{style:{transform:`translate(${130/2}px, 0)`}},S.map((d,C)=>n.createElement("rect",{key:C,x:C*10,y:90/2-d*50/2,width:6,height:d*50}))))});function y({participants:i,...a}){return n.createElement(n.Fragment,null,i.map(s=>n.createElement(t.ParticipantContext.Provider,{value:s,key:s.identity},t.cloneSingleChild(a.children))))}const I=n.forwardRef(function({childrenPosition:a="before",children:s,...r},c){const{name:l}=o.useRoomInfo();return n.createElement("span",{ref:c,...r},a==="before"&&s,l,a==="after"&&s)});function x(i){return n.createElement(o.SessionContext.Provider,{value:i.session},n.createElement(u.RoomContext.Provider,{value:i.session.room},i.children))}exports.AgentEvent=o.AgentEvent;exports.MessagesEvent=o.MessagesEvent;exports.SessionEvent=o.SessionEvent;exports.useAgent=o.useAgent;exports.useAudioPlayback=o.useAudioPlayback;exports.useClearPinButton=o.useClearPinButton;exports.useDataChannel=o.useDataChannel;exports.useEnsureSession=o.useEnsureSession;exports.useEvents=o.useEvents;exports.useIsRecording=o.useIsRecording;exports.useLiveKitRoom=o.useLiveKitRoom;exports.useMaybeSessionContext=o.useMaybeSessionContext;exports.useParticipantAttribute=o.useParticipantAttribute;exports.useParticipantAttributes=o.useParticipantAttributes;exports.useParticipantInfo=o.useParticipantInfo;exports.useParticipantPermissions=o.useParticipantPermissions;exports.useParticipantTracks=o.useParticipantTracks;exports.useParticipants=o.useParticipants;exports.useRemoteParticipant=o.useRemoteParticipant;exports.useRemoteParticipants=o.useRemoteParticipants;exports.useRoomInfo=o.useRoomInfo;exports.useSequentialRoomConnectDisconnect=o.useSequentialRoomConnectDisconnect;exports.useSession=o.useSession;exports.useSessionContext=o.useSessionContext;exports.useSessionMessages=o.useSessionMessages;exports.useSortedParticipants=o.useSortedParticipants;exports.useSpeakingParticipants=o.useSpeakingParticipants;exports.useTextStream=o.useTextStream;exports.useToken=o.useToken;exports.useTrackByName=o.useTrackByName;exports.useTrackTranscription=o.useTrackTranscription;exports.useTranscriptions=o.useTranscriptions;exports.useVoiceAssistant=o.useVoiceAssistant;exports.LayoutContext=t.LayoutContext;exports.ParticipantContext=t.ParticipantContext;exports.TrackRefContext=t.TrackRefContext;exports.useAudioWaveform=t.useAudioWaveform;exports.useChat=t.useChat;exports.useChatToggle=t.useChatToggle;exports.useConnectionQualityIndicator=t.useConnectionQualityIndicator;exports.useConnectionState=t.useConnectionState;exports.useCreateLayoutContext=t.useCreateLayoutContext;exports.useDisconnectButton=t.useDisconnectButton;exports.useEnsureCreateLayoutContext=t.useEnsureCreateLayoutContext;exports.useEnsureLayoutContext=t.useEnsureLayoutContext;exports.useEnsureParticipant=t.useEnsureParticipant;exports.useEnsureTrackRef=t.useEnsureTrackRef;exports.useFacingMode=t.useFacingMode;exports.useFocusToggle=t.useFocusToggle;exports.useGridLayout=t.useGridLayout;exports.useIsEncrypted=t.useIsEncrypted;exports.useIsMuted=t.useIsMuted;exports.useIsSpeaking=t.useIsSpeaking;exports.useLayoutContext=t.useLayoutContext;exports.useLocalParticipantPermissions=t.useLocalParticipantPermissions;exports.useMaybeLayoutContext=t.useMaybeLayoutContext;exports.useMaybeParticipantContext=t.useMaybeParticipantContext;exports.useMaybeTrackRefContext=t.useMaybeTrackRefContext;exports.useMediaDeviceSelect=t.useMediaDeviceSelect;exports.useMediaDevices=t.useMediaDevices;exports.useMultibandTrackVolume=t.useMultibandTrackVolume;exports.usePagination=t.usePagination;exports.useParticipantContext=t.useParticipantContext;exports.useParticipantTile=t.useParticipantTile;exports.usePersistentUserChoices=t.usePersistentUserChoices;exports.usePinnedTracks=t.usePinnedTracks;exports.useStartAudio=t.useStartAudio;exports.useStartVideo=t.useStartVideo;exports.useSwipe=t.useSwipe;exports.useTrackMutedIndicator=t.useTrackMutedIndicator;exports.useTrackRefContext=t.useTrackRefContext;exports.useTrackToggle=t.useTrackToggle;exports.useTrackVolume=t.useTrackVolume;exports.useTracks=t.useTracks;exports.useVisualStableUpdate=t.useVisualStableUpdate;exports.RoomContext=u.RoomContext;exports.isTrackReference=u.isTrackReference;exports.setLogExtension=u.setLogExtension;exports.setLogLevel=u.setLogLevel;exports.useEnsureRoom=u.useEnsureRoom;exports.useLocalParticipant=u.useLocalParticipant;exports.useMaybeRoomContext=u.useMaybeRoomContext;exports.useRoomContext=u.useRoomContext;exports.AudioConference=e.AudioConference;exports.AudioTrack=e.AudioTrack;exports.BarVisualizer=e.BarVisualizer;exports.CameraDisabledIcon=e.SvgCameraDisabledIcon;exports.CameraIcon=e.SvgCameraIcon;exports.CarouselLayout=e.CarouselLayout;exports.Chat=e.Chat;exports.ChatCloseIcon=e.SvgChatCloseIcon;exports.ChatEntry=e.ChatEntry;exports.ChatIcon=e.SvgChatIcon;exports.ChatToggle=e.ChatToggle;exports.Chevron=e.SvgChevron;exports.ConnectionQualityIndicator=e.ConnectionQualityIndicator;exports.ConnectionStateToast=e.ConnectionStateToast;exports.ControlBar=e.ControlBar;exports.DisconnectButton=e.DisconnectButton;exports.FocusLayout=e.FocusLayout;exports.FocusLayoutContainer=e.FocusLayoutContainer;exports.FocusToggle=e.FocusToggle;exports.FocusToggleIcon=e.SvgFocusToggleIcon;exports.GearIcon=e.SvgGearIcon;exports.GridLayout=e.GridLayout;exports.LKFeatureContext=e.LKFeatureContext;exports.LayoutContextProvider=e.LayoutContextProvider;exports.LeaveIcon=e.SvgLeaveIcon;exports.LockLockedIcon=e.SvgLockLockedIcon;exports.MediaDeviceMenu=e.MediaDeviceMenu;exports.MediaDeviceSelect=e.MediaDeviceSelect;exports.MicDisabledIcon=e.SvgMicDisabledIcon;exports.MicIcon=e.SvgMicIcon;exports.ParticipantAudioTile=e.ParticipantAudioTile;exports.ParticipantContextIfNeeded=e.ParticipantContextIfNeeded;exports.ParticipantName=e.ParticipantName;exports.ParticipantPlaceholder=e.SvgParticipantPlaceholder;exports.ParticipantTile=e.ParticipantTile;exports.PreJoin=e.PreJoin;exports.QualityExcellentIcon=e.SvgQualityExcellentIcon;exports.QualityGoodIcon=e.SvgQualityGoodIcon;exports.QualityPoorIcon=e.SvgQualityPoorIcon;exports.QualityUnknownIcon=e.SvgQualityUnknownIcon;exports.RoomAudioRenderer=e.RoomAudioRenderer;exports.ScreenShareIcon=e.SvgScreenShareIcon;exports.ScreenShareStopIcon=e.SvgScreenShareStopIcon;exports.SpinnerIcon=e.SvgSpinnerIcon;exports.StartMediaButton=e.StartMediaButton;exports.Toast=e.Toast;exports.TrackLoop=e.TrackLoop;exports.TrackMutedIndicator=e.TrackMutedIndicator;exports.TrackRefContextIfNeeded=e.TrackRefContextIfNeeded;exports.TrackToggle=e.TrackToggle;exports.UnfocusToggleIcon=e.SvgUnfocusToggleIcon;exports.VideoConference=e.VideoConference;exports.VideoTrack=e.VideoTrack;exports.VoiceAssistantControlBar=e.VoiceAssistantControlBar;exports.formatChatMessageLinks=e.formatChatMessageLinks;exports.useFeatureContext=e.useFeatureContext;exports.usePreviewDevice=e.usePreviewDevice;exports.usePreviewTracks=e.usePreviewTracks;exports.AudioVisualizer=k;exports.ClearPinButton=v;exports.ConnectionState=T;exports.LiveKitRoom=f;exports.ParticipantLoop=y;exports.RoomName=I;exports.SessionProvider=x;exports.StartAudio=p;
2
2
  //# sourceMappingURL=index.js.map
@@ -11,7 +11,7 @@ export interface VideoConferenceProps extends React.HTMLAttributes<HTMLDivElemen
11
11
  chatMessageDecoder?: MessageDecoder;
12
12
  /** @alpha */
13
13
  SettingsComponent?: React.ComponentType;
14
- controlBarProops?: Partial<ControlBarProps>;
14
+ controlBarProps?: Partial<ControlBarProps>;
15
15
  }
16
16
  /**
17
17
  * The `VideoConference` ready-made component is your drop-in solution for a classic video conferencing application.
@@ -31,5 +31,5 @@ export interface VideoConferenceProps extends React.HTMLAttributes<HTMLDivElemen
31
31
  * ```
32
32
  * @public
33
33
  */
34
- export declare function VideoConference({ chatMessageFormatter, chatMessageDecoder, chatMessageEncoder, SettingsComponent, controlBarProops, ...props }: VideoConferenceProps): React.JSX.Element;
34
+ export declare function VideoConference({ chatMessageFormatter, chatMessageDecoder, chatMessageEncoder, SettingsComponent, controlBarProps, ...props }: VideoConferenceProps): React.JSX.Element;
35
35
  //# sourceMappingURL=VideoConference.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VideoConference.d.ts","sourceRoot":"","sources":["../../src/prefabs/VideoConference.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EAGf,MAAM,0BAA0B,CAAC;AAGlC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AActD,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAGhE;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAChF,oBAAoB,CAAC,EAAE,gBAAgB,CAAC;IACxC,kBAAkB,CAAC,EAAE,cAAc,CAAC;IACpC,kBAAkB,CAAC,EAAE,cAAc,CAAC;IACpC,aAAa;IACb,iBAAiB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACxC,gBAAgB,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;CAC7C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,EAC9B,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAqB,EACrB,GAAG,KAAK,EACT,EAAE,oBAAoB,qBAwHtB"}
1
+ {"version":3,"file":"VideoConference.d.ts","sourceRoot":"","sources":["../../src/prefabs/VideoConference.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EAGf,MAAM,0BAA0B,CAAC;AAGlC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AActD,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAGhE;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAChF,oBAAoB,CAAC,EAAE,gBAAgB,CAAC;IACxC,kBAAkB,CAAC,EAAE,cAAc,CAAC;IACpC,kBAAkB,CAAC,EAAE,cAAc,CAAC;IACpC,aAAa;IACb,iBAAiB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;CAC5C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,EAC9B,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,eAAoB,EACpB,GAAG,KAAK,EACT,EAAE,oBAAoB,qBAyHtB"}
package/dist/prefabs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./shared-DTHOl3uJ.js");exports.AudioConference=e.AudioConference;exports.Chat=e.Chat;exports.ControlBar=e.ControlBar;exports.MediaDeviceMenu=e.MediaDeviceMenu;exports.PreJoin=e.PreJoin;exports.VideoConference=e.VideoConference;exports.VoiceAssistantControlBar=e.VoiceAssistantControlBar;exports.usePreviewDevice=e.usePreviewDevice;exports.usePreviewTracks=e.usePreviewTracks;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./shared-D2Tkgmsq.js");exports.AudioConference=e.AudioConference;exports.Chat=e.Chat;exports.ControlBar=e.ControlBar;exports.MediaDeviceMenu=e.MediaDeviceMenu;exports.PreJoin=e.PreJoin;exports.VideoConference=e.VideoConference;exports.VoiceAssistantControlBar=e.VoiceAssistantControlBar;exports.usePreviewDevice=e.usePreviewDevice;exports.usePreviewTracks=e.usePreviewTracks;
2
2
  //# sourceMappingURL=prefabs.js.map
package/dist/prefabs.mjs CHANGED
@@ -451,7 +451,7 @@ function at({
451
451
  chatMessageDecoder: u,
452
452
  chatMessageEncoder: i,
453
453
  SettingsComponent: n,
454
- controlBarProops: S = {},
454
+ controlBarProps: S = {},
455
455
  ...v
456
456
  }) {
457
457
  var h, p;
@@ -494,7 +494,8 @@ function at({
494
494
  /* @__PURE__ */ e.createElement("div", { className: "lk-video-conference-inner" }, l ? /* @__PURE__ */ e.createElement("div", { className: "lk-focus-layout-wrapper" }, /* @__PURE__ */ e.createElement(Se, null, /* @__PURE__ */ e.createElement(ve, { tracks: r }, /* @__PURE__ */ e.createElement(K, null)), l && /* @__PURE__ */ e.createElement(ke, { trackRef: l }))) : /* @__PURE__ */ e.createElement("div", { className: "lk-grid-layout-wrapper" }, /* @__PURE__ */ e.createElement(Ee, { tracks: w }, /* @__PURE__ */ e.createElement(K, null))), /* @__PURE__ */ e.createElement(
495
495
  te,
496
496
  {
497
- controls: { chat: !0, settings: !!n, ...S }
497
+ controls: { chat: !0, settings: !!n },
498
+ ...S
498
499
  }
499
500
  )),
500
501
  /* @__PURE__ */ e.createElement(
@@ -1 +1 @@
1
- {"version":3,"file":"prefabs.mjs","sources":["../src/prefabs/Chat.tsx","../src/prefabs/MediaDeviceMenu.tsx","../src/hooks/useWarnAboutMissingStyles.ts","../src/prefabs/PreJoin.tsx","../src/hooks/useSettingsToggle.ts","../src/components/controls/SettingsMenuToggle.tsx","../src/prefabs/ControlBar.tsx","../src/prefabs/VideoConference.tsx","../src/prefabs/AudioConference.tsx","../src/prefabs/VoiceAssistantControlBar.tsx"],"sourcesContent":["import { type ChatMessage, type ChatOptions } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useMaybeLayoutContext } from '../context';\nimport { cloneSingleChild } from '../utils';\nimport type { MessageFormatter } from '../components/ChatEntry';\nimport { ChatEntry } from '../components/ChatEntry';\nimport { useChat } from '../hooks/useChat';\nimport { ChatToggle } from '../components';\nimport ChatCloseIcon from '../assets/icons/ChatCloseIcon';\n\n/** @public */\nexport interface ChatProps extends React.HTMLAttributes<HTMLDivElement>, ChatOptions {\n messageFormatter?: MessageFormatter;\n}\n\n/**\n * The Chat component provides ready-to-use chat functionality in a LiveKit room.\n * Messages are distributed to all participants in the room in real-time.\n *\n * @remarks\n * - Only users who are in the room at the time of dispatch will receive messages\n * - Message history is not persisted between sessions\n * - Requires `@livekit/components-styles` to be imported for styling\n *\n * @example\n * ```tsx\n * import '@livekit/components-styles';\n *\n * function Room() {\n * return (\n * <LiveKitRoom data-lk-theme=\"default\">\n * <Chat />\n * </LiveKitRoom>\n * );\n * }\n * ```\n *\n * For custom styling, refer to: https://docs.livekit.io/reference/components/react/concepts/style-components/\n *\n * @public\n */\nexport function Chat({\n messageFormatter,\n messageDecoder,\n messageEncoder,\n channelTopic,\n ...props\n}: ChatProps) {\n const ulRef = React.useRef<HTMLUListElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const chatOptions: ChatOptions = React.useMemo(() => {\n return { messageDecoder, messageEncoder, channelTopic };\n }, [messageDecoder, messageEncoder, channelTopic]);\n\n const { chatMessages, send, isSending } = useChat(chatOptions);\n\n const layoutContext = useMaybeLayoutContext();\n const lastReadMsgAt = React.useRef<ChatMessage['timestamp']>(0);\n\n async function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n if (inputRef.current && inputRef.current.value.trim() !== '') {\n await send(inputRef.current.value);\n inputRef.current.value = '';\n inputRef.current.focus();\n }\n }\n\n React.useEffect(() => {\n if (ulRef) {\n ulRef.current?.scrollTo({ top: ulRef.current.scrollHeight });\n }\n }, [ulRef, chatMessages]);\n\n React.useEffect(() => {\n if (!layoutContext || chatMessages.length === 0) {\n return;\n }\n\n if (\n layoutContext.widget.state?.showChat &&\n chatMessages.length > 0 &&\n lastReadMsgAt.current !== chatMessages[chatMessages.length - 1]?.timestamp\n ) {\n lastReadMsgAt.current = chatMessages[chatMessages.length - 1]?.timestamp;\n return;\n }\n\n const unreadMessageCount = chatMessages.filter(\n (msg) => !lastReadMsgAt.current || msg.timestamp > lastReadMsgAt.current,\n ).length;\n\n const { widget } = layoutContext;\n if (unreadMessageCount > 0 && widget.state?.unreadMessages !== unreadMessageCount) {\n widget.dispatch?.({ msg: 'unread_msg', count: unreadMessageCount });\n }\n }, [chatMessages, layoutContext?.widget]);\n\n return (\n <div {...props} className=\"lk-chat\">\n <div className=\"lk-chat-header\">\n Messages\n {layoutContext && (\n <ChatToggle className=\"lk-close-button\">\n <ChatCloseIcon />\n </ChatToggle>\n )}\n </div>\n\n <ul className=\"lk-list lk-chat-messages\" ref={ulRef}>\n {props.children\n ? chatMessages.map((msg, idx) =>\n cloneSingleChild(props.children, {\n entry: msg,\n key: msg.id ?? idx,\n messageFormatter,\n }),\n )\n : chatMessages.map((msg, idx, allMsg) => {\n const hideName = idx >= 1 && allMsg[idx - 1].from === msg.from;\n // If the time delta between two messages is bigger than 60s show timestamp.\n const hideTimestamp = idx >= 1 && msg.timestamp - allMsg[idx - 1].timestamp < 60_000;\n\n return (\n <ChatEntry\n key={msg.id ?? idx}\n hideName={hideName}\n hideTimestamp={hideName === false ? false : hideTimestamp} // If we show the name always show the timestamp as well.\n entry={msg}\n messageFormatter={messageFormatter}\n />\n );\n })}\n </ul>\n <form className=\"lk-chat-form\" onSubmit={handleSubmit}>\n <input\n className=\"lk-form-control lk-chat-form-input\"\n disabled={isSending}\n ref={inputRef}\n type=\"text\"\n placeholder=\"Enter a message...\"\n onInput={(ev) => ev.stopPropagation()}\n onKeyDown={(ev) => ev.stopPropagation()}\n onKeyUp={(ev) => ev.stopPropagation()}\n />\n <button type=\"submit\" className=\"lk-button lk-chat-form-button\" disabled={isSending}>\n Send\n </button>\n </form>\n </div>\n );\n}\n","import { computeMenuPosition, wasClickOutside, log } from '@livekit/components-core';\nimport * as React from 'react';\nimport { MediaDeviceSelect } from '../components/controls/MediaDeviceSelect';\nimport type { LocalAudioTrack, LocalVideoTrack } from 'livekit-client';\n\n/** @public */\nexport interface MediaDeviceMenuProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n kind?: MediaDeviceKind;\n initialSelection?: string;\n onActiveDeviceChange?: (kind: MediaDeviceKind, deviceId: string) => void;\n tracks?: Partial<Record<MediaDeviceKind, LocalAudioTrack | LocalVideoTrack | undefined>>;\n /**\n * this will call getUserMedia if the permissions are not yet given to enumerate the devices with device labels.\n * in some browsers multiple calls to getUserMedia result in multiple permission prompts.\n * It's generally advised only flip this to true, once a (preview) track has been acquired successfully with the\n * appropriate permissions.\n *\n * @see {@link PreJoin}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices | MDN enumerateDevices}\n */\n requestPermissions?: boolean;\n}\n\n/**\n * The `MediaDeviceMenu` component is a button that opens a menu that lists\n * all media devices and allows the user to select them.\n *\n * @remarks\n * This component is implemented with the `MediaDeviceSelect` LiveKit components.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <MediaDeviceMenu />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function MediaDeviceMenu({\n kind,\n initialSelection,\n onActiveDeviceChange,\n tracks,\n requestPermissions = false,\n ...props\n}: MediaDeviceMenuProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [devices, setDevices] = React.useState<MediaDeviceInfo[]>([]);\n const [updateRequired, setUpdateRequired] = React.useState<boolean>(true);\n const [needPermissions, setNeedPermissions] = React.useState(requestPermissions);\n\n const handleActiveDeviceChange = (kind: MediaDeviceKind, deviceId: string) => {\n log.debug('handle device change');\n setIsOpen(false);\n onActiveDeviceChange?.(kind, deviceId);\n };\n\n const button = React.useRef<HTMLButtonElement>(null);\n const tooltip = React.useRef<HTMLDivElement>(null);\n\n React.useLayoutEffect(() => {\n if (isOpen) {\n setNeedPermissions(true);\n }\n }, [isOpen]);\n\n React.useLayoutEffect(() => {\n let cleanup: ReturnType<typeof computeMenuPosition> | undefined;\n if (button.current && tooltip.current && (devices || updateRequired)) {\n cleanup = computeMenuPosition(button.current, tooltip.current, (x, y) => {\n if (tooltip.current) {\n Object.assign(tooltip.current.style, { left: `${x}px`, top: `${y}px` });\n }\n });\n }\n setUpdateRequired(false);\n return () => {\n cleanup?.();\n };\n }, [button, tooltip, devices, updateRequired]);\n\n const handleClickOutside = React.useCallback(\n (event: MouseEvent) => {\n if (!tooltip.current) {\n return;\n }\n if (event.target === button.current) {\n return;\n }\n if (isOpen && wasClickOutside(tooltip.current, event)) {\n setIsOpen(false);\n }\n },\n [isOpen, tooltip, button],\n );\n\n React.useEffect(() => {\n document.addEventListener<'click'>('click', handleClickOutside);\n return () => {\n document.removeEventListener<'click'>('click', handleClickOutside);\n };\n }, [handleClickOutside]);\n\n return (\n <>\n <button\n className=\"lk-button lk-button-menu\"\n aria-pressed={isOpen}\n {...props}\n onClick={() => setIsOpen(!isOpen)}\n ref={button}\n >\n {props.children}\n </button>\n {/** only render when enabled in order to make sure that the permissions are requested only if the menu is enabled */}\n {!props.disabled && (\n <div\n className=\"lk-device-menu\"\n ref={tooltip}\n style={{ visibility: isOpen ? 'visible' : 'hidden' }}\n >\n {kind ? (\n <MediaDeviceSelect\n initialSelection={initialSelection}\n onActiveDeviceChange={(deviceId) => handleActiveDeviceChange(kind, deviceId)}\n onDeviceListChange={setDevices}\n kind={kind}\n track={tracks?.[kind]}\n requestPermissions={needPermissions}\n />\n ) : (\n <>\n <div className=\"lk-device-menu-heading\">Audio inputs</div>\n <MediaDeviceSelect\n kind=\"audioinput\"\n onActiveDeviceChange={(deviceId) =>\n handleActiveDeviceChange('audioinput', deviceId)\n }\n onDeviceListChange={setDevices}\n track={tracks?.audioinput}\n requestPermissions={needPermissions}\n />\n <div className=\"lk-device-menu-heading\">Video inputs</div>\n <MediaDeviceSelect\n kind=\"videoinput\"\n onActiveDeviceChange={(deviceId) =>\n handleActiveDeviceChange('videoinput', deviceId)\n }\n onDeviceListChange={setDevices}\n track={tracks?.videoinput}\n requestPermissions={needPermissions}\n />\n </>\n )}\n </div>\n )}\n </>\n );\n}\n","import * as React from 'react';\nimport { warnAboutMissingStyles } from '../utils';\n\n/**\n * @internal\n */\nexport function useWarnAboutMissingStyles() {\n React.useEffect(() => {\n warnAboutMissingStyles();\n }, []);\n}\n","import type {\n CreateLocalTracksOptions,\n LocalAudioTrack,\n LocalVideoTrack,\n TrackProcessor,\n} from 'livekit-client';\nimport {\n createLocalAudioTrack,\n createLocalTracks,\n createLocalVideoTrack,\n facingModeFromLocalTrack,\n Track,\n VideoPresets,\n Mutex,\n} from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport type { LocalUserChoices } from '@livekit/components-core';\nimport { log } from '@livekit/components-core';\nimport { ParticipantPlaceholder } from '../assets/images';\nimport { useMediaDevices, usePersistentUserChoices } from '../hooks';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\nimport { roomOptionsStringifyReplacer } from '../utils';\n\n/**\n * Props for the PreJoin component.\n * @public\n */\nexport interface PreJoinProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit' | 'onError'> {\n /** This function is called with the `LocalUserChoices` if validation is passed. */\n onSubmit?: (values: LocalUserChoices) => void;\n /**\n * Provide your custom validation function. Only if validation is successful the user choices are past to the onSubmit callback.\n */\n onValidate?: (values: LocalUserChoices) => boolean;\n onError?: (error: Error) => void;\n /** Prefill the input form with initial values. */\n defaults?: Partial<LocalUserChoices>;\n /** Display a debug window for your convenience. */\n debug?: boolean;\n joinLabel?: string;\n micLabel?: string;\n camLabel?: string;\n userLabel?: string;\n /**\n * If true, user choices are persisted across sessions.\n * @defaultValue true\n * @alpha\n */\n persistUserChoices?: boolean;\n videoProcessor?: TrackProcessor<Track.Kind.Video>;\n}\n\n/** @public */\nexport function usePreviewTracks(\n options: CreateLocalTracksOptions,\n onError?: (err: Error) => void,\n) {\n const [tracks, setTracks] = React.useState<Array<LocalAudioTrack | LocalVideoTrack>>();\n\n const trackLock = React.useMemo(() => new Mutex(), []);\n\n React.useEffect(() => {\n let needsCleanup = false;\n let localTracks: Array<LocalAudioTrack | LocalVideoTrack> = [];\n trackLock.lock().then(async (unlock) => {\n try {\n if (options.audio || options.video) {\n localTracks = (await createLocalTracks(options)) as Array<\n LocalAudioTrack | LocalVideoTrack\n >;\n\n if (needsCleanup) {\n localTracks.forEach((tr) => tr.stop());\n } else {\n setTracks(localTracks);\n }\n }\n } catch (e: unknown) {\n if (onError && e instanceof Error) {\n onError(e);\n } else {\n log.error(e);\n }\n } finally {\n unlock();\n }\n });\n\n return () => {\n needsCleanup = true;\n localTracks.forEach((track) => {\n track.stop();\n });\n };\n }, [JSON.stringify(options, roomOptionsStringifyReplacer), onError, trackLock]);\n\n return tracks;\n}\n\n/**\n * @public\n * @deprecated use `usePreviewTracks` instead\n */\nexport function usePreviewDevice<T extends LocalVideoTrack | LocalAudioTrack>(\n enabled: boolean,\n deviceId: string,\n kind: 'videoinput' | 'audioinput',\n) {\n const [deviceError, setDeviceError] = React.useState<Error | null>(null);\n const [isCreatingTrack, setIsCreatingTrack] = React.useState<boolean>(false);\n\n const devices = useMediaDevices({ kind });\n const [selectedDevice, setSelectedDevice] = React.useState<MediaDeviceInfo | undefined>(\n undefined,\n );\n\n const [localTrack, setLocalTrack] = React.useState<T>();\n const [localDeviceId, setLocalDeviceId] = React.useState<string>(deviceId);\n\n React.useEffect(() => {\n setLocalDeviceId(deviceId);\n }, [deviceId]);\n\n const createTrack = async (deviceId: string, kind: 'videoinput' | 'audioinput') => {\n try {\n const track =\n kind === 'videoinput'\n ? await createLocalVideoTrack({\n deviceId,\n resolution: VideoPresets.h720.resolution,\n })\n : await createLocalAudioTrack({ deviceId });\n\n const newDeviceId = await track.getDeviceId(false);\n if (newDeviceId && deviceId !== newDeviceId) {\n prevDeviceId.current = newDeviceId;\n setLocalDeviceId(newDeviceId);\n }\n setLocalTrack(track as T);\n } catch (e) {\n if (e instanceof Error) {\n setDeviceError(e);\n }\n }\n };\n\n const switchDevice = async (track: LocalVideoTrack | LocalAudioTrack, id: string) => {\n await track.setDeviceId(id);\n prevDeviceId.current = id;\n };\n\n const prevDeviceId = React.useRef(localDeviceId);\n\n React.useEffect(() => {\n if (enabled && !localTrack && !deviceError && !isCreatingTrack) {\n log.debug('creating track', kind);\n setIsCreatingTrack(true);\n createTrack(localDeviceId, kind).finally(() => {\n setIsCreatingTrack(false);\n });\n }\n }, [enabled, localTrack, deviceError, isCreatingTrack]);\n\n // switch camera device\n React.useEffect(() => {\n if (!localTrack) {\n return;\n }\n if (!enabled) {\n log.debug(`muting ${kind} track`);\n localTrack.mute().then(() => log.debug(localTrack.mediaStreamTrack));\n } else if (selectedDevice?.deviceId && prevDeviceId.current !== selectedDevice?.deviceId) {\n log.debug(`switching ${kind} device from`, prevDeviceId.current, selectedDevice.deviceId);\n switchDevice(localTrack, selectedDevice.deviceId);\n } else {\n log.debug(`unmuting local ${kind} track`);\n localTrack.unmute();\n }\n }, [localTrack, selectedDevice, enabled, kind]);\n\n React.useEffect(() => {\n return () => {\n if (localTrack) {\n log.debug(`stopping local ${kind} track`);\n localTrack.stop();\n localTrack.mute();\n }\n };\n }, []);\n\n React.useEffect(() => {\n setSelectedDevice(devices?.find((dev) => dev.deviceId === localDeviceId));\n }, [localDeviceId, devices]);\n\n return {\n selectedDevice,\n localTrack,\n deviceError,\n };\n}\n\n/**\n * The `PreJoin` prefab component is normally presented to the user before he enters a room.\n * This component allows the user to check and select the preferred media device (camera und microphone).\n * On submit the user decisions are returned, which can then be passed on to the `LiveKitRoom` so that the user enters the room with the correct media devices.\n *\n * @remarks\n * This component is independent of the `LiveKitRoom` component and should not be nested within it.\n * Because it only accesses the local media tracks this component is self-contained and works without connection to the LiveKit server.\n *\n * @example\n * ```tsx\n * <PreJoin />\n * ```\n * @public\n */\nexport function PreJoin({\n defaults = {},\n onValidate,\n onSubmit,\n onError,\n debug,\n joinLabel = 'Join Room',\n micLabel = 'Microphone',\n camLabel = 'Camera',\n userLabel = 'Username',\n persistUserChoices = true,\n videoProcessor,\n ...htmlProps\n}: PreJoinProps) {\n const {\n userChoices: initialUserChoices,\n saveAudioInputDeviceId,\n saveAudioInputEnabled,\n saveVideoInputDeviceId,\n saveVideoInputEnabled,\n saveUsername,\n } = usePersistentUserChoices({\n defaults,\n preventSave: !persistUserChoices,\n preventLoad: !persistUserChoices,\n });\n\n const [userChoices, setUserChoices] = React.useState(initialUserChoices);\n\n // Initialize device settings\n const [audioEnabled, setAudioEnabled] = React.useState<boolean>(userChoices.audioEnabled);\n const [videoEnabled, setVideoEnabled] = React.useState<boolean>(userChoices.videoEnabled);\n const [audioDeviceId, setAudioDeviceId] = React.useState<string>(userChoices.audioDeviceId);\n const [videoDeviceId, setVideoDeviceId] = React.useState<string>(userChoices.videoDeviceId);\n const [username, setUsername] = React.useState(userChoices.username);\n\n // Save user choices to persistent storage.\n React.useEffect(() => {\n saveAudioInputEnabled(audioEnabled);\n }, [audioEnabled, saveAudioInputEnabled]);\n React.useEffect(() => {\n saveVideoInputEnabled(videoEnabled);\n }, [videoEnabled, saveVideoInputEnabled]);\n React.useEffect(() => {\n saveAudioInputDeviceId(audioDeviceId);\n }, [audioDeviceId, saveAudioInputDeviceId]);\n React.useEffect(() => {\n saveVideoInputDeviceId(videoDeviceId);\n }, [videoDeviceId, saveVideoInputDeviceId]);\n React.useEffect(() => {\n saveUsername(username);\n }, [username, saveUsername]);\n\n const tracks = usePreviewTracks(\n {\n audio: audioEnabled ? { deviceId: initialUserChoices.audioDeviceId } : false,\n video: videoEnabled\n ? { deviceId: initialUserChoices.videoDeviceId, processor: videoProcessor }\n : false,\n },\n onError,\n );\n\n const videoEl = React.useRef(null);\n\n const videoTrack = React.useMemo(\n () => tracks?.filter((track) => track.kind === Track.Kind.Video)[0] as LocalVideoTrack,\n [tracks],\n );\n\n const facingMode = React.useMemo(() => {\n if (videoTrack) {\n const { facingMode } = facingModeFromLocalTrack(videoTrack);\n return facingMode;\n } else {\n return 'undefined';\n }\n }, [videoTrack]);\n\n const audioTrack = React.useMemo(\n () => tracks?.filter((track) => track.kind === Track.Kind.Audio)[0] as LocalAudioTrack,\n [tracks],\n );\n\n React.useEffect(() => {\n if (videoEl.current && videoTrack) {\n videoTrack.unmute();\n videoTrack.attach(videoEl.current);\n }\n\n return () => {\n videoTrack?.detach();\n };\n }, [videoTrack]);\n\n const [isValid, setIsValid] = React.useState<boolean>();\n\n const handleValidation = React.useCallback(\n (values: LocalUserChoices) => {\n if (typeof onValidate === 'function') {\n return onValidate(values);\n } else {\n return values.username !== '';\n }\n },\n [onValidate],\n );\n\n React.useEffect(() => {\n const newUserChoices = {\n username,\n videoEnabled,\n videoDeviceId,\n audioEnabled,\n audioDeviceId,\n };\n setUserChoices(newUserChoices);\n setIsValid(handleValidation(newUserChoices));\n }, [username, videoEnabled, handleValidation, audioEnabled, audioDeviceId, videoDeviceId]);\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n if (handleValidation(userChoices)) {\n if (typeof onSubmit === 'function') {\n onSubmit(userChoices);\n }\n } else {\n log.warn('Validation failed with: ', userChoices);\n }\n }\n\n useWarnAboutMissingStyles();\n\n return (\n <div className=\"lk-prejoin\" {...htmlProps}>\n <div className=\"lk-video-container\">\n {videoTrack && (\n <video ref={videoEl} width=\"1280\" height=\"720\" data-lk-facing-mode={facingMode} />\n )}\n {(!videoTrack || !videoEnabled) && (\n <div className=\"lk-camera-off-note\">\n <ParticipantPlaceholder />\n </div>\n )}\n </div>\n <div className=\"lk-button-group-container\">\n <div className=\"lk-button-group audio\">\n <TrackToggle\n initialState={audioEnabled}\n source={Track.Source.Microphone}\n onChange={(enabled) => setAudioEnabled(enabled)}\n >\n {micLabel}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n initialSelection={audioDeviceId}\n kind=\"audioinput\"\n disabled={!audioTrack}\n tracks={{ audioinput: audioTrack }}\n onActiveDeviceChange={(_, id) => setAudioDeviceId(id)}\n />\n </div>\n </div>\n <div className=\"lk-button-group video\">\n <TrackToggle\n initialState={videoEnabled}\n source={Track.Source.Camera}\n onChange={(enabled) => setVideoEnabled(enabled)}\n >\n {camLabel}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n initialSelection={videoDeviceId}\n kind=\"videoinput\"\n disabled={!videoTrack}\n tracks={{ videoinput: videoTrack }}\n onActiveDeviceChange={(_, id) => setVideoDeviceId(id)}\n />\n </div>\n </div>\n </div>\n\n <form className=\"lk-username-container\">\n <input\n className=\"lk-form-control\"\n id=\"username\"\n name=\"username\"\n type=\"text\"\n defaultValue={username}\n placeholder={userLabel}\n onChange={(inputEl) => setUsername(inputEl.target.value)}\n autoComplete=\"off\"\n />\n <button\n className=\"lk-button lk-join-button\"\n type=\"submit\"\n onClick={handleSubmit}\n disabled={!isValid}\n >\n {joinLabel}\n </button>\n </form>\n\n {debug && (\n <>\n <strong>User Choices:</strong>\n <ul className=\"lk-list\" style={{ overflow: 'hidden', maxWidth: '15rem' }}>\n <li>Username: {`${userChoices.username}`}</li>\n <li>Video Enabled: {`${userChoices.videoEnabled}`}</li>\n <li>Audio Enabled: {`${userChoices.audioEnabled}`}</li>\n <li>Video Device: {`${userChoices.videoDeviceId}`}</li>\n <li>Audio Device: {`${userChoices.audioDeviceId}`}</li>\n </ul>\n </>\n )}\n </div>\n );\n}\n","import { useLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport * as React from 'react';\n\n/** @alpha */\nexport interface UseSettingsToggleProps {\n props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * The `useSettingsToggle` hook provides state and functions for toggling the settings menu.\n * @remarks\n * Depends on the `LayoutContext` to work properly.\n * @see {@link SettingsMenu}\n * @alpha\n */\nexport function useSettingsToggle({ props }: UseSettingsToggleProps) {\n const { dispatch, state } = useLayoutContext().widget;\n const className = 'lk-button lk-settings-toggle';\n\n const mergedProps = React.useMemo(() => {\n return mergeProps(props, {\n className,\n onClick: () => {\n if (dispatch) dispatch({ msg: 'toggle_settings' });\n },\n 'aria-pressed': state?.showSettings ? 'true' : 'false',\n });\n }, [props, className, dispatch, state]);\n\n return { mergedProps };\n}\n","import * as React from 'react';\nimport { useSettingsToggle } from '../../hooks/useSettingsToggle';\n\n/** @alpha */\nexport interface SettingsMenuToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * The `SettingsMenuToggle` component is a button that toggles the visibility of the `SettingsMenu` component.\n * @remarks\n * For the component to have any effect it has to live inside a `LayoutContext` context.\n *\n * @alpha\n */\nexport const SettingsMenuToggle: (\n props: SettingsMenuToggleProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, SettingsMenuToggleProps>(\n function SettingsMenuToggle(props: SettingsMenuToggleProps, ref) {\n const { mergedProps } = useSettingsToggle({ props });\n\n return (\n <button ref={ref} {...mergedProps}>\n {props.children}\n </button>\n );\n },\n);\n","import { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { DisconnectButton } from '../components/controls/DisconnectButton';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport { ChatIcon, GearIcon, LeaveIcon } from '../assets/icons';\nimport { ChatToggle } from '../components/controls/ChatToggle';\nimport { useLocalParticipantPermissions, usePersistentUserChoices } from '../hooks';\nimport { useMediaQuery } from '../hooks/internal';\nimport { useMaybeLayoutContext } from '../context';\nimport { supportsScreenSharing } from '@livekit/components-core';\nimport { mergeProps } from '../utils';\nimport { StartMediaButton } from '../components/controls/StartMediaButton';\nimport { SettingsMenuToggle } from '../components/controls/SettingsMenuToggle';\n\n/** @public */\nexport type ControlBarControls = {\n microphone?: boolean;\n camera?: boolean;\n chat?: boolean;\n screenShare?: boolean;\n leave?: boolean;\n settings?: boolean;\n};\n\nconst trackSourceToProtocol = (source: Track.Source) => {\n // NOTE: this mapping avoids importing the protocol package as that leads to a significant bundle size increase\n switch (source) {\n case Track.Source.Camera:\n return 1;\n case Track.Source.Microphone:\n return 2;\n case Track.Source.ScreenShare:\n return 3;\n default:\n return 0;\n }\n};\n\n/** @public */\nexport interface ControlBarProps extends React.HTMLAttributes<HTMLDivElement> {\n onDeviceError?: (error: { source: Track.Source; error: Error }) => void;\n variation?: 'minimal' | 'verbose' | 'textOnly';\n controls?: ControlBarControls;\n /**\n * If `true`, the user's device choices will be persisted.\n * This will enable the user to have the same device choices when they rejoin the room.\n * @defaultValue true\n * @alpha\n */\n saveUserChoices?: boolean;\n}\n\n/**\n * The `ControlBar` prefab gives the user the basic user interface to control their\n * media devices (camera, microphone and screen share), open the `Chat` and leave the room.\n *\n * @remarks\n * This component is build with other LiveKit components like `TrackToggle`,\n * `DeviceSelectorButton`, `DisconnectButton` and `StartAudio`.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <ControlBar />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function ControlBar({\n variation,\n controls,\n saveUserChoices = true,\n onDeviceError,\n ...props\n}: ControlBarProps) {\n const [isChatOpen, setIsChatOpen] = React.useState(false);\n const layoutContext = useMaybeLayoutContext();\n React.useEffect(() => {\n if (layoutContext?.widget.state?.showChat !== undefined) {\n setIsChatOpen(layoutContext?.widget.state?.showChat);\n }\n }, [layoutContext?.widget.state?.showChat]);\n const isTooLittleSpace = useMediaQuery(`(max-width: ${isChatOpen ? 1000 : 760}px)`);\n\n const defaultVariation = isTooLittleSpace ? 'minimal' : 'verbose';\n variation ??= defaultVariation;\n\n const visibleControls = { leave: true, ...controls };\n\n const localPermissions = useLocalParticipantPermissions();\n\n if (!localPermissions) {\n visibleControls.camera = false;\n visibleControls.chat = false;\n visibleControls.microphone = false;\n visibleControls.screenShare = false;\n } else {\n const canPublishSource = (source: Track.Source) => {\n return (\n localPermissions.canPublish &&\n (localPermissions.canPublishSources.length === 0 ||\n localPermissions.canPublishSources.includes(trackSourceToProtocol(source)))\n );\n };\n visibleControls.camera ??= canPublishSource(Track.Source.Camera);\n visibleControls.microphone ??= canPublishSource(Track.Source.Microphone);\n visibleControls.screenShare ??= canPublishSource(Track.Source.ScreenShare);\n visibleControls.chat ??= localPermissions.canPublishData && controls?.chat;\n }\n\n const showIcon = React.useMemo(\n () => variation === 'minimal' || variation === 'verbose',\n [variation],\n );\n const showText = React.useMemo(\n () => variation === 'textOnly' || variation === 'verbose',\n [variation],\n );\n\n const browserSupportsScreenSharing = supportsScreenSharing();\n\n const [isScreenShareEnabled, setIsScreenShareEnabled] = React.useState(false);\n\n const onScreenShareChange = React.useCallback(\n (enabled: boolean) => {\n setIsScreenShareEnabled(enabled);\n },\n [setIsScreenShareEnabled],\n );\n\n const htmlProps = mergeProps({ className: 'lk-control-bar' }, props);\n\n const {\n saveAudioInputEnabled,\n saveVideoInputEnabled,\n saveAudioInputDeviceId,\n saveVideoInputDeviceId,\n } = usePersistentUserChoices({ preventSave: !saveUserChoices });\n\n const microphoneOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) =>\n isUserInitiated ? saveAudioInputEnabled(enabled) : null,\n [saveAudioInputEnabled],\n );\n\n const cameraOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) =>\n isUserInitiated ? saveVideoInputEnabled(enabled) : null,\n [saveVideoInputEnabled],\n );\n\n return (\n <div {...htmlProps}>\n {visibleControls.microphone && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Microphone}\n showIcon={showIcon}\n onChange={microphoneOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Microphone, error })}\n >\n {showText && 'Microphone'}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"audioinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveAudioInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n {visibleControls.camera && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Camera}\n showIcon={showIcon}\n onChange={cameraOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Camera, error })}\n >\n {showText && 'Camera'}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"videoinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveVideoInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n {visibleControls.screenShare && browserSupportsScreenSharing && (\n <TrackToggle\n source={Track.Source.ScreenShare}\n captureOptions={{ audio: true, selfBrowserSurface: 'include' }}\n showIcon={showIcon}\n onChange={onScreenShareChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.ScreenShare, error })}\n >\n {showText && (isScreenShareEnabled ? 'Stop screen share' : 'Share screen')}\n </TrackToggle>\n )}\n {visibleControls.chat && (\n <ChatToggle>\n {showIcon && <ChatIcon />}\n {showText && 'Chat'}\n </ChatToggle>\n )}\n {visibleControls.settings && (\n <SettingsMenuToggle>\n {showIcon && <GearIcon />}\n {showText && 'Settings'}\n </SettingsMenuToggle>\n )}\n {visibleControls.leave && (\n <DisconnectButton>\n {showIcon && <LeaveIcon />}\n {showText && 'Leave'}\n </DisconnectButton>\n )}\n <StartMediaButton />\n </div>\n );\n}\n","import type {\n MessageDecoder,\n MessageEncoder,\n TrackReferenceOrPlaceholder,\n WidgetState,\n} from '@livekit/components-core';\nimport { isEqualTrackRef, isTrackReference, isWeb, log } from '@livekit/components-core';\nimport { RoomEvent, Track } from 'livekit-client';\nimport * as React from 'react';\nimport type { MessageFormatter } from '../components';\nimport {\n CarouselLayout,\n ConnectionStateToast,\n FocusLayout,\n FocusLayoutContainer,\n GridLayout,\n LayoutContextProvider,\n ParticipantTile,\n RoomAudioRenderer,\n} from '../components';\nimport { useCreateLayoutContext } from '../context';\nimport { usePinnedTracks, useTracks } from '../hooks';\nimport { Chat } from './Chat';\nimport { ControlBar, type ControlBarProps } from './ControlBar';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\n\n/**\n * @public\n */\nexport interface VideoConferenceProps extends React.HTMLAttributes<HTMLDivElement> {\n chatMessageFormatter?: MessageFormatter;\n chatMessageEncoder?: MessageEncoder;\n chatMessageDecoder?: MessageDecoder;\n /** @alpha */\n SettingsComponent?: React.ComponentType;\n controlBarProops?: Partial<ControlBarProps>;\n}\n\n/**\n * The `VideoConference` ready-made component is your drop-in solution for a classic video conferencing application.\n * It provides functionality such as focusing on one participant, grid view with pagination to handle large numbers\n * of participants, basic non-persistent chat, screen sharing, and more.\n *\n * @remarks\n * The component is implemented with other LiveKit components like `FocusContextProvider`,\n * `GridLayout`, `ControlBar`, `FocusLayoutContainer` and `FocusLayout`.\n * You can use these components as a starting point for your own custom video conferencing application.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <VideoConference />\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function VideoConference({\n chatMessageFormatter,\n chatMessageDecoder,\n chatMessageEncoder,\n SettingsComponent,\n controlBarProops = {},\n ...props\n}: VideoConferenceProps) {\n const [widgetState, setWidgetState] = React.useState<WidgetState>({\n showChat: false,\n unreadMessages: 0,\n showSettings: false,\n });\n const lastAutoFocusedScreenShareTrack = React.useRef<TrackReferenceOrPlaceholder | null>(null);\n\n const tracks = useTracks(\n [\n { source: Track.Source.Camera, withPlaceholder: true },\n { source: Track.Source.ScreenShare, withPlaceholder: false },\n ],\n { updateOnlyOn: [RoomEvent.ActiveSpeakersChanged], onlySubscribed: false },\n );\n\n const widgetUpdate = (state: WidgetState) => {\n log.debug('updating widget state', state);\n setWidgetState(state);\n };\n\n const layoutContext = useCreateLayoutContext();\n\n const screenShareTracks = tracks\n .filter(isTrackReference)\n .filter((track) => track.publication.source === Track.Source.ScreenShare);\n\n const focusTrack = usePinnedTracks(layoutContext)?.[0];\n const carouselTracks = tracks.filter((track) => !isEqualTrackRef(track, focusTrack));\n\n React.useEffect(() => {\n // If screen share tracks are published, and no pin is set explicitly, auto set the screen share.\n if (\n screenShareTracks.some((track) => track.publication.isSubscribed) &&\n lastAutoFocusedScreenShareTrack.current === null\n ) {\n log.debug('Auto set screen share focus:', { newScreenShareTrack: screenShareTracks[0] });\n layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: screenShareTracks[0] });\n lastAutoFocusedScreenShareTrack.current = screenShareTracks[0];\n } else if (\n lastAutoFocusedScreenShareTrack.current &&\n !screenShareTracks.some(\n (track) =>\n track.publication.trackSid ===\n lastAutoFocusedScreenShareTrack.current?.publication?.trackSid,\n )\n ) {\n log.debug('Auto clearing screen share focus.');\n layoutContext.pin.dispatch?.({ msg: 'clear_pin' });\n lastAutoFocusedScreenShareTrack.current = null;\n }\n if (focusTrack && !isTrackReference(focusTrack)) {\n const updatedFocusTrack = tracks.find(\n (tr) =>\n tr.participant.identity === focusTrack.participant.identity &&\n tr.source === focusTrack.source,\n );\n if (updatedFocusTrack !== focusTrack && isTrackReference(updatedFocusTrack)) {\n layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: updatedFocusTrack });\n }\n }\n }, [\n screenShareTracks\n .map((ref) => `${ref.publication.trackSid}_${ref.publication.isSubscribed}`)\n .join(),\n focusTrack?.publication?.trackSid,\n tracks,\n ]);\n\n useWarnAboutMissingStyles();\n\n return (\n <div className=\"lk-video-conference\" {...props}>\n {isWeb() && (\n <LayoutContextProvider\n value={layoutContext}\n // onPinChange={handleFocusStateChange}\n onWidgetChange={widgetUpdate}\n >\n <div className=\"lk-video-conference-inner\">\n {!focusTrack ? (\n <div className=\"lk-grid-layout-wrapper\">\n <GridLayout tracks={tracks}>\n <ParticipantTile />\n </GridLayout>\n </div>\n ) : (\n <div className=\"lk-focus-layout-wrapper\">\n <FocusLayoutContainer>\n <CarouselLayout tracks={carouselTracks}>\n <ParticipantTile />\n </CarouselLayout>\n {focusTrack && <FocusLayout trackRef={focusTrack} />}\n </FocusLayoutContainer>\n </div>\n )}\n <ControlBar\n controls={{ chat: true, settings: !!SettingsComponent, ...controlBarProops }}\n />\n </div>\n <Chat\n style={{ display: widgetState.showChat ? 'grid' : 'none' }}\n messageFormatter={chatMessageFormatter}\n messageEncoder={chatMessageEncoder}\n messageDecoder={chatMessageDecoder}\n />\n {SettingsComponent && (\n <div\n className=\"lk-settings-menu-modal\"\n style={{ display: widgetState.showSettings ? 'block' : 'none' }}\n >\n <SettingsComponent />\n </div>\n )}\n </LayoutContextProvider>\n )}\n <RoomAudioRenderer />\n <ConnectionStateToast />\n </div>\n );\n}\n","import * as React from 'react';\nimport { ControlBar } from './ControlBar';\n\nimport { ParticipantAudioTile } from '../components/participant/ParticipantAudioTile';\nimport { LayoutContextProvider } from '../components/layout/LayoutContextProvider';\nimport type { WidgetState } from '@livekit/components-core';\nimport { Chat } from './Chat';\nimport { TrackLoop } from '../components';\nimport { useTracks } from '../hooks';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\nimport { Track } from 'livekit-client';\n\n/** @public */\nexport interface AudioConferenceProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * This component is the default setup of a classic LiveKit audio conferencing app.\n * It provides functionality like switching between participant grid view and focus view.\n *\n * @remarks\n * The component is implemented with other LiveKit components like `FocusContextProvider`,\n * `GridLayout`, `ControlBar`, `FocusLayoutContainer` and `FocusLayout`.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <AudioConference />\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function AudioConference({ ...props }: AudioConferenceProps) {\n const [widgetState, setWidgetState] = React.useState<WidgetState>({\n showChat: false,\n unreadMessages: 0,\n });\n\n const audioTracks = useTracks([Track.Source.Microphone]);\n\n useWarnAboutMissingStyles();\n\n return (\n <LayoutContextProvider onWidgetChange={setWidgetState}>\n <div className=\"lk-audio-conference\" {...props}>\n <div className=\"lk-audio-conference-stage\">\n <TrackLoop tracks={audioTracks}>\n <ParticipantAudioTile />\n </TrackLoop>\n </div>\n <ControlBar\n controls={{ microphone: true, screenShare: false, camera: false, chat: true }}\n />\n {widgetState.showChat && <Chat />}\n </div>\n </LayoutContextProvider>\n );\n}\n","import { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport {\n useLocalParticipant,\n useLocalParticipantPermissions,\n usePersistentUserChoices,\n} from '../hooks';\nimport { mergeProps } from '../utils';\nimport { StartMediaButton } from '../components/controls/StartMediaButton';\nimport { BarVisualizer, DisconnectButton } from '../components';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\n\n/** @beta */\nexport type VoiceAssistantControlBarControls = {\n microphone?: boolean;\n leave?: boolean;\n};\n\n/** @beta */\nexport interface VoiceAssistantControlBarProps extends React.HTMLAttributes<HTMLDivElement> {\n onDeviceError?: (error: { source: Track.Source; error: Error }) => void;\n controls?: VoiceAssistantControlBarControls;\n /**\n * If `true`, the user's device choices will be persisted.\n * This will enables the user to have the same device choices when they rejoin the room.\n * @defaultValue true\n */\n saveUserChoices?: boolean;\n}\n\n/**\n * @example\n * ```tsx\n * <LiveKitRoom ... >\n * <VoiceAssistantControlBar />\n * </LiveKitRoom>\n * ```\n * @beta\n */\nexport function VoiceAssistantControlBar({\n controls,\n saveUserChoices = true,\n onDeviceError,\n ...props\n}: VoiceAssistantControlBarProps) {\n const visibleControls = { leave: true, microphone: true, ...controls };\n\n const localPermissions = useLocalParticipantPermissions();\n const { microphoneTrack, localParticipant } = useLocalParticipant();\n\n const micTrackRef: TrackReferenceOrPlaceholder = React.useMemo(() => {\n return {\n participant: localParticipant,\n source: Track.Source.Microphone,\n publication: microphoneTrack,\n };\n }, [localParticipant, microphoneTrack]);\n\n if (!localPermissions) {\n visibleControls.microphone = false;\n } else {\n visibleControls.microphone ??= localPermissions.canPublish;\n }\n\n const htmlProps = mergeProps({ className: 'lk-agent-control-bar' }, props);\n\n const { saveAudioInputEnabled, saveAudioInputDeviceId } = usePersistentUserChoices({\n preventSave: !saveUserChoices,\n });\n\n const microphoneOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) => {\n if (isUserInitiated) {\n saveAudioInputEnabled(enabled);\n }\n },\n [saveAudioInputEnabled],\n );\n\n return (\n <div {...htmlProps}>\n {visibleControls.microphone && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Microphone}\n showIcon={true}\n onChange={microphoneOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Microphone, error })}\n >\n <BarVisualizer trackRef={micTrackRef} barCount={7} options={{ minHeight: 5 }} />\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"audioinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveAudioInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n\n {visibleControls.leave && <DisconnectButton>{'Disconnect'}</DisconnectButton>}\n <StartMediaButton />\n </div>\n );\n}\n"],"names":["Chat","messageFormatter","messageDecoder","messageEncoder","channelTopic","props","ulRef","React","inputRef","chatOptions","chatMessages","send","isSending","useChat","layoutContext","useMaybeLayoutContext","lastReadMsgAt","handleSubmit","event","_a","_b","_c","unreadMessageCount","msg","widget","_d","_e","ChatToggle","ChatCloseIcon","idx","cloneSingleChild","allMsg","hideName","hideTimestamp","ChatEntry","ev","MediaDeviceMenu","kind","initialSelection","onActiveDeviceChange","tracks","requestPermissions","isOpen","setIsOpen","devices","setDevices","updateRequired","setUpdateRequired","needPermissions","setNeedPermissions","handleActiveDeviceChange","deviceId","log","button","tooltip","cleanup","computeMenuPosition","x","y","handleClickOutside","wasClickOutside","MediaDeviceSelect","useWarnAboutMissingStyles","warnAboutMissingStyles","usePreviewTracks","options","onError","setTracks","trackLock","Mutex","needsCleanup","localTracks","unlock","createLocalTracks","tr","e","track","roomOptionsStringifyReplacer","usePreviewDevice","enabled","deviceError","setDeviceError","isCreatingTrack","setIsCreatingTrack","useMediaDevices","selectedDevice","setSelectedDevice","localTrack","setLocalTrack","localDeviceId","setLocalDeviceId","createTrack","createLocalVideoTrack","VideoPresets","createLocalAudioTrack","newDeviceId","prevDeviceId","switchDevice","id","dev","PreJoin","defaults","onValidate","onSubmit","debug","joinLabel","micLabel","camLabel","userLabel","persistUserChoices","videoProcessor","htmlProps","initialUserChoices","saveAudioInputDeviceId","saveAudioInputEnabled","saveVideoInputDeviceId","saveVideoInputEnabled","saveUsername","usePersistentUserChoices","userChoices","setUserChoices","audioEnabled","setAudioEnabled","videoEnabled","setVideoEnabled","audioDeviceId","setAudioDeviceId","videoDeviceId","setVideoDeviceId","username","setUsername","videoEl","videoTrack","Track","facingMode","facingModeFromLocalTrack","audioTrack","isValid","setIsValid","handleValidation","values","newUserChoices","ParticipantPlaceholder","TrackToggle","_","inputEl","useSettingsToggle","dispatch","state","useLayoutContext","className","mergeProps","SettingsMenuToggle","ref","mergedProps","trackSourceToProtocol","source","ControlBar","variation","controls","saveUserChoices","onDeviceError","isChatOpen","setIsChatOpen","defaultVariation","useMediaQuery","visibleControls","localPermissions","useLocalParticipantPermissions","canPublishSource","showIcon","showText","browserSupportsScreenSharing","supportsScreenSharing","isScreenShareEnabled","setIsScreenShareEnabled","onScreenShareChange","microphoneOnChange","isUserInitiated","cameraOnChange","error","_kind","ChatIcon","GearIcon","DisconnectButton","LeaveIcon","StartMediaButton","VideoConference","chatMessageFormatter","chatMessageDecoder","chatMessageEncoder","SettingsComponent","controlBarProops","widgetState","setWidgetState","lastAutoFocusedScreenShareTrack","useTracks","RoomEvent","widgetUpdate","useCreateLayoutContext","screenShareTracks","isTrackReference","focusTrack","usePinnedTracks","carouselTracks","isEqualTrackRef","updatedFocusTrack","_f","isWeb","LayoutContextProvider","FocusLayoutContainer","CarouselLayout","ParticipantTile","FocusLayout","GridLayout","RoomAudioRenderer","ConnectionStateToast","AudioConference","audioTracks","TrackLoop","ParticipantAudioTile","VoiceAssistantControlBar","microphoneTrack","localParticipant","useLocalParticipant","micTrackRef","BarVisualizer"],"mappings":"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"}
1
+ {"version":3,"file":"prefabs.mjs","sources":["../src/prefabs/Chat.tsx","../src/prefabs/MediaDeviceMenu.tsx","../src/hooks/useWarnAboutMissingStyles.ts","../src/prefabs/PreJoin.tsx","../src/hooks/useSettingsToggle.ts","../src/components/controls/SettingsMenuToggle.tsx","../src/prefabs/ControlBar.tsx","../src/prefabs/VideoConference.tsx","../src/prefabs/AudioConference.tsx","../src/prefabs/VoiceAssistantControlBar.tsx"],"sourcesContent":["import { type ChatMessage, type ChatOptions } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useMaybeLayoutContext } from '../context';\nimport { cloneSingleChild } from '../utils';\nimport type { MessageFormatter } from '../components/ChatEntry';\nimport { ChatEntry } from '../components/ChatEntry';\nimport { useChat } from '../hooks/useChat';\nimport { ChatToggle } from '../components';\nimport ChatCloseIcon from '../assets/icons/ChatCloseIcon';\n\n/** @public */\nexport interface ChatProps extends React.HTMLAttributes<HTMLDivElement>, ChatOptions {\n messageFormatter?: MessageFormatter;\n}\n\n/**\n * The Chat component provides ready-to-use chat functionality in a LiveKit room.\n * Messages are distributed to all participants in the room in real-time.\n *\n * @remarks\n * - Only users who are in the room at the time of dispatch will receive messages\n * - Message history is not persisted between sessions\n * - Requires `@livekit/components-styles` to be imported for styling\n *\n * @example\n * ```tsx\n * import '@livekit/components-styles';\n *\n * function Room() {\n * return (\n * <LiveKitRoom data-lk-theme=\"default\">\n * <Chat />\n * </LiveKitRoom>\n * );\n * }\n * ```\n *\n * For custom styling, refer to: https://docs.livekit.io/reference/components/react/concepts/style-components/\n *\n * @public\n */\nexport function Chat({\n messageFormatter,\n messageDecoder,\n messageEncoder,\n channelTopic,\n ...props\n}: ChatProps) {\n const ulRef = React.useRef<HTMLUListElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const chatOptions: ChatOptions = React.useMemo(() => {\n return { messageDecoder, messageEncoder, channelTopic };\n }, [messageDecoder, messageEncoder, channelTopic]);\n\n const { chatMessages, send, isSending } = useChat(chatOptions);\n\n const layoutContext = useMaybeLayoutContext();\n const lastReadMsgAt = React.useRef<ChatMessage['timestamp']>(0);\n\n async function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n if (inputRef.current && inputRef.current.value.trim() !== '') {\n await send(inputRef.current.value);\n inputRef.current.value = '';\n inputRef.current.focus();\n }\n }\n\n React.useEffect(() => {\n if (ulRef) {\n ulRef.current?.scrollTo({ top: ulRef.current.scrollHeight });\n }\n }, [ulRef, chatMessages]);\n\n React.useEffect(() => {\n if (!layoutContext || chatMessages.length === 0) {\n return;\n }\n\n if (\n layoutContext.widget.state?.showChat &&\n chatMessages.length > 0 &&\n lastReadMsgAt.current !== chatMessages[chatMessages.length - 1]?.timestamp\n ) {\n lastReadMsgAt.current = chatMessages[chatMessages.length - 1]?.timestamp;\n return;\n }\n\n const unreadMessageCount = chatMessages.filter(\n (msg) => !lastReadMsgAt.current || msg.timestamp > lastReadMsgAt.current,\n ).length;\n\n const { widget } = layoutContext;\n if (unreadMessageCount > 0 && widget.state?.unreadMessages !== unreadMessageCount) {\n widget.dispatch?.({ msg: 'unread_msg', count: unreadMessageCount });\n }\n }, [chatMessages, layoutContext?.widget]);\n\n return (\n <div {...props} className=\"lk-chat\">\n <div className=\"lk-chat-header\">\n Messages\n {layoutContext && (\n <ChatToggle className=\"lk-close-button\">\n <ChatCloseIcon />\n </ChatToggle>\n )}\n </div>\n\n <ul className=\"lk-list lk-chat-messages\" ref={ulRef}>\n {props.children\n ? chatMessages.map((msg, idx) =>\n cloneSingleChild(props.children, {\n entry: msg,\n key: msg.id ?? idx,\n messageFormatter,\n }),\n )\n : chatMessages.map((msg, idx, allMsg) => {\n const hideName = idx >= 1 && allMsg[idx - 1].from === msg.from;\n // If the time delta between two messages is bigger than 60s show timestamp.\n const hideTimestamp = idx >= 1 && msg.timestamp - allMsg[idx - 1].timestamp < 60_000;\n\n return (\n <ChatEntry\n key={msg.id ?? idx}\n hideName={hideName}\n hideTimestamp={hideName === false ? false : hideTimestamp} // If we show the name always show the timestamp as well.\n entry={msg}\n messageFormatter={messageFormatter}\n />\n );\n })}\n </ul>\n <form className=\"lk-chat-form\" onSubmit={handleSubmit}>\n <input\n className=\"lk-form-control lk-chat-form-input\"\n disabled={isSending}\n ref={inputRef}\n type=\"text\"\n placeholder=\"Enter a message...\"\n onInput={(ev) => ev.stopPropagation()}\n onKeyDown={(ev) => ev.stopPropagation()}\n onKeyUp={(ev) => ev.stopPropagation()}\n />\n <button type=\"submit\" className=\"lk-button lk-chat-form-button\" disabled={isSending}>\n Send\n </button>\n </form>\n </div>\n );\n}\n","import { computeMenuPosition, wasClickOutside, log } from '@livekit/components-core';\nimport * as React from 'react';\nimport { MediaDeviceSelect } from '../components/controls/MediaDeviceSelect';\nimport type { LocalAudioTrack, LocalVideoTrack } from 'livekit-client';\n\n/** @public */\nexport interface MediaDeviceMenuProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n kind?: MediaDeviceKind;\n initialSelection?: string;\n onActiveDeviceChange?: (kind: MediaDeviceKind, deviceId: string) => void;\n tracks?: Partial<Record<MediaDeviceKind, LocalAudioTrack | LocalVideoTrack | undefined>>;\n /**\n * this will call getUserMedia if the permissions are not yet given to enumerate the devices with device labels.\n * in some browsers multiple calls to getUserMedia result in multiple permission prompts.\n * It's generally advised only flip this to true, once a (preview) track has been acquired successfully with the\n * appropriate permissions.\n *\n * @see {@link PreJoin}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices | MDN enumerateDevices}\n */\n requestPermissions?: boolean;\n}\n\n/**\n * The `MediaDeviceMenu` component is a button that opens a menu that lists\n * all media devices and allows the user to select them.\n *\n * @remarks\n * This component is implemented with the `MediaDeviceSelect` LiveKit components.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <MediaDeviceMenu />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function MediaDeviceMenu({\n kind,\n initialSelection,\n onActiveDeviceChange,\n tracks,\n requestPermissions = false,\n ...props\n}: MediaDeviceMenuProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [devices, setDevices] = React.useState<MediaDeviceInfo[]>([]);\n const [updateRequired, setUpdateRequired] = React.useState<boolean>(true);\n const [needPermissions, setNeedPermissions] = React.useState(requestPermissions);\n\n const handleActiveDeviceChange = (kind: MediaDeviceKind, deviceId: string) => {\n log.debug('handle device change');\n setIsOpen(false);\n onActiveDeviceChange?.(kind, deviceId);\n };\n\n const button = React.useRef<HTMLButtonElement>(null);\n const tooltip = React.useRef<HTMLDivElement>(null);\n\n React.useLayoutEffect(() => {\n if (isOpen) {\n setNeedPermissions(true);\n }\n }, [isOpen]);\n\n React.useLayoutEffect(() => {\n let cleanup: ReturnType<typeof computeMenuPosition> | undefined;\n if (button.current && tooltip.current && (devices || updateRequired)) {\n cleanup = computeMenuPosition(button.current, tooltip.current, (x, y) => {\n if (tooltip.current) {\n Object.assign(tooltip.current.style, { left: `${x}px`, top: `${y}px` });\n }\n });\n }\n setUpdateRequired(false);\n return () => {\n cleanup?.();\n };\n }, [button, tooltip, devices, updateRequired]);\n\n const handleClickOutside = React.useCallback(\n (event: MouseEvent) => {\n if (!tooltip.current) {\n return;\n }\n if (event.target === button.current) {\n return;\n }\n if (isOpen && wasClickOutside(tooltip.current, event)) {\n setIsOpen(false);\n }\n },\n [isOpen, tooltip, button],\n );\n\n React.useEffect(() => {\n document.addEventListener<'click'>('click', handleClickOutside);\n return () => {\n document.removeEventListener<'click'>('click', handleClickOutside);\n };\n }, [handleClickOutside]);\n\n return (\n <>\n <button\n className=\"lk-button lk-button-menu\"\n aria-pressed={isOpen}\n {...props}\n onClick={() => setIsOpen(!isOpen)}\n ref={button}\n >\n {props.children}\n </button>\n {/** only render when enabled in order to make sure that the permissions are requested only if the menu is enabled */}\n {!props.disabled && (\n <div\n className=\"lk-device-menu\"\n ref={tooltip}\n style={{ visibility: isOpen ? 'visible' : 'hidden' }}\n >\n {kind ? (\n <MediaDeviceSelect\n initialSelection={initialSelection}\n onActiveDeviceChange={(deviceId) => handleActiveDeviceChange(kind, deviceId)}\n onDeviceListChange={setDevices}\n kind={kind}\n track={tracks?.[kind]}\n requestPermissions={needPermissions}\n />\n ) : (\n <>\n <div className=\"lk-device-menu-heading\">Audio inputs</div>\n <MediaDeviceSelect\n kind=\"audioinput\"\n onActiveDeviceChange={(deviceId) =>\n handleActiveDeviceChange('audioinput', deviceId)\n }\n onDeviceListChange={setDevices}\n track={tracks?.audioinput}\n requestPermissions={needPermissions}\n />\n <div className=\"lk-device-menu-heading\">Video inputs</div>\n <MediaDeviceSelect\n kind=\"videoinput\"\n onActiveDeviceChange={(deviceId) =>\n handleActiveDeviceChange('videoinput', deviceId)\n }\n onDeviceListChange={setDevices}\n track={tracks?.videoinput}\n requestPermissions={needPermissions}\n />\n </>\n )}\n </div>\n )}\n </>\n );\n}\n","import * as React from 'react';\nimport { warnAboutMissingStyles } from '../utils';\n\n/**\n * @internal\n */\nexport function useWarnAboutMissingStyles() {\n React.useEffect(() => {\n warnAboutMissingStyles();\n }, []);\n}\n","import type {\n CreateLocalTracksOptions,\n LocalAudioTrack,\n LocalVideoTrack,\n TrackProcessor,\n} from 'livekit-client';\nimport {\n createLocalAudioTrack,\n createLocalTracks,\n createLocalVideoTrack,\n facingModeFromLocalTrack,\n Track,\n VideoPresets,\n Mutex,\n} from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport type { LocalUserChoices } from '@livekit/components-core';\nimport { log } from '@livekit/components-core';\nimport { ParticipantPlaceholder } from '../assets/images';\nimport { useMediaDevices, usePersistentUserChoices } from '../hooks';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\nimport { roomOptionsStringifyReplacer } from '../utils';\n\n/**\n * Props for the PreJoin component.\n * @public\n */\nexport interface PreJoinProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit' | 'onError'> {\n /** This function is called with the `LocalUserChoices` if validation is passed. */\n onSubmit?: (values: LocalUserChoices) => void;\n /**\n * Provide your custom validation function. Only if validation is successful the user choices are past to the onSubmit callback.\n */\n onValidate?: (values: LocalUserChoices) => boolean;\n onError?: (error: Error) => void;\n /** Prefill the input form with initial values. */\n defaults?: Partial<LocalUserChoices>;\n /** Display a debug window for your convenience. */\n debug?: boolean;\n joinLabel?: string;\n micLabel?: string;\n camLabel?: string;\n userLabel?: string;\n /**\n * If true, user choices are persisted across sessions.\n * @defaultValue true\n * @alpha\n */\n persistUserChoices?: boolean;\n videoProcessor?: TrackProcessor<Track.Kind.Video>;\n}\n\n/** @public */\nexport function usePreviewTracks(\n options: CreateLocalTracksOptions,\n onError?: (err: Error) => void,\n) {\n const [tracks, setTracks] = React.useState<Array<LocalAudioTrack | LocalVideoTrack>>();\n\n const trackLock = React.useMemo(() => new Mutex(), []);\n\n React.useEffect(() => {\n let needsCleanup = false;\n let localTracks: Array<LocalAudioTrack | LocalVideoTrack> = [];\n trackLock.lock().then(async (unlock) => {\n try {\n if (options.audio || options.video) {\n localTracks = (await createLocalTracks(options)) as Array<\n LocalAudioTrack | LocalVideoTrack\n >;\n\n if (needsCleanup) {\n localTracks.forEach((tr) => tr.stop());\n } else {\n setTracks(localTracks);\n }\n }\n } catch (e: unknown) {\n if (onError && e instanceof Error) {\n onError(e);\n } else {\n log.error(e);\n }\n } finally {\n unlock();\n }\n });\n\n return () => {\n needsCleanup = true;\n localTracks.forEach((track) => {\n track.stop();\n });\n };\n }, [JSON.stringify(options, roomOptionsStringifyReplacer), onError, trackLock]);\n\n return tracks;\n}\n\n/**\n * @public\n * @deprecated use `usePreviewTracks` instead\n */\nexport function usePreviewDevice<T extends LocalVideoTrack | LocalAudioTrack>(\n enabled: boolean,\n deviceId: string,\n kind: 'videoinput' | 'audioinput',\n) {\n const [deviceError, setDeviceError] = React.useState<Error | null>(null);\n const [isCreatingTrack, setIsCreatingTrack] = React.useState<boolean>(false);\n\n const devices = useMediaDevices({ kind });\n const [selectedDevice, setSelectedDevice] = React.useState<MediaDeviceInfo | undefined>(\n undefined,\n );\n\n const [localTrack, setLocalTrack] = React.useState<T>();\n const [localDeviceId, setLocalDeviceId] = React.useState<string>(deviceId);\n\n React.useEffect(() => {\n setLocalDeviceId(deviceId);\n }, [deviceId]);\n\n const createTrack = async (deviceId: string, kind: 'videoinput' | 'audioinput') => {\n try {\n const track =\n kind === 'videoinput'\n ? await createLocalVideoTrack({\n deviceId,\n resolution: VideoPresets.h720.resolution,\n })\n : await createLocalAudioTrack({ deviceId });\n\n const newDeviceId = await track.getDeviceId(false);\n if (newDeviceId && deviceId !== newDeviceId) {\n prevDeviceId.current = newDeviceId;\n setLocalDeviceId(newDeviceId);\n }\n setLocalTrack(track as T);\n } catch (e) {\n if (e instanceof Error) {\n setDeviceError(e);\n }\n }\n };\n\n const switchDevice = async (track: LocalVideoTrack | LocalAudioTrack, id: string) => {\n await track.setDeviceId(id);\n prevDeviceId.current = id;\n };\n\n const prevDeviceId = React.useRef(localDeviceId);\n\n React.useEffect(() => {\n if (enabled && !localTrack && !deviceError && !isCreatingTrack) {\n log.debug('creating track', kind);\n setIsCreatingTrack(true);\n createTrack(localDeviceId, kind).finally(() => {\n setIsCreatingTrack(false);\n });\n }\n }, [enabled, localTrack, deviceError, isCreatingTrack]);\n\n // switch camera device\n React.useEffect(() => {\n if (!localTrack) {\n return;\n }\n if (!enabled) {\n log.debug(`muting ${kind} track`);\n localTrack.mute().then(() => log.debug(localTrack.mediaStreamTrack));\n } else if (selectedDevice?.deviceId && prevDeviceId.current !== selectedDevice?.deviceId) {\n log.debug(`switching ${kind} device from`, prevDeviceId.current, selectedDevice.deviceId);\n switchDevice(localTrack, selectedDevice.deviceId);\n } else {\n log.debug(`unmuting local ${kind} track`);\n localTrack.unmute();\n }\n }, [localTrack, selectedDevice, enabled, kind]);\n\n React.useEffect(() => {\n return () => {\n if (localTrack) {\n log.debug(`stopping local ${kind} track`);\n localTrack.stop();\n localTrack.mute();\n }\n };\n }, []);\n\n React.useEffect(() => {\n setSelectedDevice(devices?.find((dev) => dev.deviceId === localDeviceId));\n }, [localDeviceId, devices]);\n\n return {\n selectedDevice,\n localTrack,\n deviceError,\n };\n}\n\n/**\n * The `PreJoin` prefab component is normally presented to the user before he enters a room.\n * This component allows the user to check and select the preferred media device (camera und microphone).\n * On submit the user decisions are returned, which can then be passed on to the `LiveKitRoom` so that the user enters the room with the correct media devices.\n *\n * @remarks\n * This component is independent of the `LiveKitRoom` component and should not be nested within it.\n * Because it only accesses the local media tracks this component is self-contained and works without connection to the LiveKit server.\n *\n * @example\n * ```tsx\n * <PreJoin />\n * ```\n * @public\n */\nexport function PreJoin({\n defaults = {},\n onValidate,\n onSubmit,\n onError,\n debug,\n joinLabel = 'Join Room',\n micLabel = 'Microphone',\n camLabel = 'Camera',\n userLabel = 'Username',\n persistUserChoices = true,\n videoProcessor,\n ...htmlProps\n}: PreJoinProps) {\n const {\n userChoices: initialUserChoices,\n saveAudioInputDeviceId,\n saveAudioInputEnabled,\n saveVideoInputDeviceId,\n saveVideoInputEnabled,\n saveUsername,\n } = usePersistentUserChoices({\n defaults,\n preventSave: !persistUserChoices,\n preventLoad: !persistUserChoices,\n });\n\n const [userChoices, setUserChoices] = React.useState(initialUserChoices);\n\n // Initialize device settings\n const [audioEnabled, setAudioEnabled] = React.useState<boolean>(userChoices.audioEnabled);\n const [videoEnabled, setVideoEnabled] = React.useState<boolean>(userChoices.videoEnabled);\n const [audioDeviceId, setAudioDeviceId] = React.useState<string>(userChoices.audioDeviceId);\n const [videoDeviceId, setVideoDeviceId] = React.useState<string>(userChoices.videoDeviceId);\n const [username, setUsername] = React.useState(userChoices.username);\n\n // Save user choices to persistent storage.\n React.useEffect(() => {\n saveAudioInputEnabled(audioEnabled);\n }, [audioEnabled, saveAudioInputEnabled]);\n React.useEffect(() => {\n saveVideoInputEnabled(videoEnabled);\n }, [videoEnabled, saveVideoInputEnabled]);\n React.useEffect(() => {\n saveAudioInputDeviceId(audioDeviceId);\n }, [audioDeviceId, saveAudioInputDeviceId]);\n React.useEffect(() => {\n saveVideoInputDeviceId(videoDeviceId);\n }, [videoDeviceId, saveVideoInputDeviceId]);\n React.useEffect(() => {\n saveUsername(username);\n }, [username, saveUsername]);\n\n const tracks = usePreviewTracks(\n {\n audio: audioEnabled ? { deviceId: initialUserChoices.audioDeviceId } : false,\n video: videoEnabled\n ? { deviceId: initialUserChoices.videoDeviceId, processor: videoProcessor }\n : false,\n },\n onError,\n );\n\n const videoEl = React.useRef(null);\n\n const videoTrack = React.useMemo(\n () => tracks?.filter((track) => track.kind === Track.Kind.Video)[0] as LocalVideoTrack,\n [tracks],\n );\n\n const facingMode = React.useMemo(() => {\n if (videoTrack) {\n const { facingMode } = facingModeFromLocalTrack(videoTrack);\n return facingMode;\n } else {\n return 'undefined';\n }\n }, [videoTrack]);\n\n const audioTrack = React.useMemo(\n () => tracks?.filter((track) => track.kind === Track.Kind.Audio)[0] as LocalAudioTrack,\n [tracks],\n );\n\n React.useEffect(() => {\n if (videoEl.current && videoTrack) {\n videoTrack.unmute();\n videoTrack.attach(videoEl.current);\n }\n\n return () => {\n videoTrack?.detach();\n };\n }, [videoTrack]);\n\n const [isValid, setIsValid] = React.useState<boolean>();\n\n const handleValidation = React.useCallback(\n (values: LocalUserChoices) => {\n if (typeof onValidate === 'function') {\n return onValidate(values);\n } else {\n return values.username !== '';\n }\n },\n [onValidate],\n );\n\n React.useEffect(() => {\n const newUserChoices = {\n username,\n videoEnabled,\n videoDeviceId,\n audioEnabled,\n audioDeviceId,\n };\n setUserChoices(newUserChoices);\n setIsValid(handleValidation(newUserChoices));\n }, [username, videoEnabled, handleValidation, audioEnabled, audioDeviceId, videoDeviceId]);\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n if (handleValidation(userChoices)) {\n if (typeof onSubmit === 'function') {\n onSubmit(userChoices);\n }\n } else {\n log.warn('Validation failed with: ', userChoices);\n }\n }\n\n useWarnAboutMissingStyles();\n\n return (\n <div className=\"lk-prejoin\" {...htmlProps}>\n <div className=\"lk-video-container\">\n {videoTrack && (\n <video ref={videoEl} width=\"1280\" height=\"720\" data-lk-facing-mode={facingMode} />\n )}\n {(!videoTrack || !videoEnabled) && (\n <div className=\"lk-camera-off-note\">\n <ParticipantPlaceholder />\n </div>\n )}\n </div>\n <div className=\"lk-button-group-container\">\n <div className=\"lk-button-group audio\">\n <TrackToggle\n initialState={audioEnabled}\n source={Track.Source.Microphone}\n onChange={(enabled) => setAudioEnabled(enabled)}\n >\n {micLabel}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n initialSelection={audioDeviceId}\n kind=\"audioinput\"\n disabled={!audioTrack}\n tracks={{ audioinput: audioTrack }}\n onActiveDeviceChange={(_, id) => setAudioDeviceId(id)}\n />\n </div>\n </div>\n <div className=\"lk-button-group video\">\n <TrackToggle\n initialState={videoEnabled}\n source={Track.Source.Camera}\n onChange={(enabled) => setVideoEnabled(enabled)}\n >\n {camLabel}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n initialSelection={videoDeviceId}\n kind=\"videoinput\"\n disabled={!videoTrack}\n tracks={{ videoinput: videoTrack }}\n onActiveDeviceChange={(_, id) => setVideoDeviceId(id)}\n />\n </div>\n </div>\n </div>\n\n <form className=\"lk-username-container\">\n <input\n className=\"lk-form-control\"\n id=\"username\"\n name=\"username\"\n type=\"text\"\n defaultValue={username}\n placeholder={userLabel}\n onChange={(inputEl) => setUsername(inputEl.target.value)}\n autoComplete=\"off\"\n />\n <button\n className=\"lk-button lk-join-button\"\n type=\"submit\"\n onClick={handleSubmit}\n disabled={!isValid}\n >\n {joinLabel}\n </button>\n </form>\n\n {debug && (\n <>\n <strong>User Choices:</strong>\n <ul className=\"lk-list\" style={{ overflow: 'hidden', maxWidth: '15rem' }}>\n <li>Username: {`${userChoices.username}`}</li>\n <li>Video Enabled: {`${userChoices.videoEnabled}`}</li>\n <li>Audio Enabled: {`${userChoices.audioEnabled}`}</li>\n <li>Video Device: {`${userChoices.videoDeviceId}`}</li>\n <li>Audio Device: {`${userChoices.audioDeviceId}`}</li>\n </ul>\n </>\n )}\n </div>\n );\n}\n","import { useLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport * as React from 'react';\n\n/** @alpha */\nexport interface UseSettingsToggleProps {\n props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * The `useSettingsToggle` hook provides state and functions for toggling the settings menu.\n * @remarks\n * Depends on the `LayoutContext` to work properly.\n * @see {@link SettingsMenu}\n * @alpha\n */\nexport function useSettingsToggle({ props }: UseSettingsToggleProps) {\n const { dispatch, state } = useLayoutContext().widget;\n const className = 'lk-button lk-settings-toggle';\n\n const mergedProps = React.useMemo(() => {\n return mergeProps(props, {\n className,\n onClick: () => {\n if (dispatch) dispatch({ msg: 'toggle_settings' });\n },\n 'aria-pressed': state?.showSettings ? 'true' : 'false',\n });\n }, [props, className, dispatch, state]);\n\n return { mergedProps };\n}\n","import * as React from 'react';\nimport { useSettingsToggle } from '../../hooks/useSettingsToggle';\n\n/** @alpha */\nexport interface SettingsMenuToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * The `SettingsMenuToggle` component is a button that toggles the visibility of the `SettingsMenu` component.\n * @remarks\n * For the component to have any effect it has to live inside a `LayoutContext` context.\n *\n * @alpha\n */\nexport const SettingsMenuToggle: (\n props: SettingsMenuToggleProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, SettingsMenuToggleProps>(\n function SettingsMenuToggle(props: SettingsMenuToggleProps, ref) {\n const { mergedProps } = useSettingsToggle({ props });\n\n return (\n <button ref={ref} {...mergedProps}>\n {props.children}\n </button>\n );\n },\n);\n","import { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { DisconnectButton } from '../components/controls/DisconnectButton';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport { ChatIcon, GearIcon, LeaveIcon } from '../assets/icons';\nimport { ChatToggle } from '../components/controls/ChatToggle';\nimport { useLocalParticipantPermissions, usePersistentUserChoices } from '../hooks';\nimport { useMediaQuery } from '../hooks/internal';\nimport { useMaybeLayoutContext } from '../context';\nimport { supportsScreenSharing } from '@livekit/components-core';\nimport { mergeProps } from '../utils';\nimport { StartMediaButton } from '../components/controls/StartMediaButton';\nimport { SettingsMenuToggle } from '../components/controls/SettingsMenuToggle';\n\n/** @public */\nexport type ControlBarControls = {\n microphone?: boolean;\n camera?: boolean;\n chat?: boolean;\n screenShare?: boolean;\n leave?: boolean;\n settings?: boolean;\n};\n\nconst trackSourceToProtocol = (source: Track.Source) => {\n // NOTE: this mapping avoids importing the protocol package as that leads to a significant bundle size increase\n switch (source) {\n case Track.Source.Camera:\n return 1;\n case Track.Source.Microphone:\n return 2;\n case Track.Source.ScreenShare:\n return 3;\n default:\n return 0;\n }\n};\n\n/** @public */\nexport interface ControlBarProps extends React.HTMLAttributes<HTMLDivElement> {\n onDeviceError?: (error: { source: Track.Source; error: Error }) => void;\n variation?: 'minimal' | 'verbose' | 'textOnly';\n controls?: ControlBarControls;\n /**\n * If `true`, the user's device choices will be persisted.\n * This will enable the user to have the same device choices when they rejoin the room.\n * @defaultValue true\n * @alpha\n */\n saveUserChoices?: boolean;\n}\n\n/**\n * The `ControlBar` prefab gives the user the basic user interface to control their\n * media devices (camera, microphone and screen share), open the `Chat` and leave the room.\n *\n * @remarks\n * This component is build with other LiveKit components like `TrackToggle`,\n * `DeviceSelectorButton`, `DisconnectButton` and `StartAudio`.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <ControlBar />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function ControlBar({\n variation,\n controls,\n saveUserChoices = true,\n onDeviceError,\n ...props\n}: ControlBarProps) {\n const [isChatOpen, setIsChatOpen] = React.useState(false);\n const layoutContext = useMaybeLayoutContext();\n React.useEffect(() => {\n if (layoutContext?.widget.state?.showChat !== undefined) {\n setIsChatOpen(layoutContext?.widget.state?.showChat);\n }\n }, [layoutContext?.widget.state?.showChat]);\n const isTooLittleSpace = useMediaQuery(`(max-width: ${isChatOpen ? 1000 : 760}px)`);\n\n const defaultVariation = isTooLittleSpace ? 'minimal' : 'verbose';\n variation ??= defaultVariation;\n\n const visibleControls = { leave: true, ...controls };\n\n const localPermissions = useLocalParticipantPermissions();\n\n if (!localPermissions) {\n visibleControls.camera = false;\n visibleControls.chat = false;\n visibleControls.microphone = false;\n visibleControls.screenShare = false;\n } else {\n const canPublishSource = (source: Track.Source) => {\n return (\n localPermissions.canPublish &&\n (localPermissions.canPublishSources.length === 0 ||\n localPermissions.canPublishSources.includes(trackSourceToProtocol(source)))\n );\n };\n visibleControls.camera ??= canPublishSource(Track.Source.Camera);\n visibleControls.microphone ??= canPublishSource(Track.Source.Microphone);\n visibleControls.screenShare ??= canPublishSource(Track.Source.ScreenShare);\n visibleControls.chat ??= localPermissions.canPublishData && controls?.chat;\n }\n\n const showIcon = React.useMemo(\n () => variation === 'minimal' || variation === 'verbose',\n [variation],\n );\n const showText = React.useMemo(\n () => variation === 'textOnly' || variation === 'verbose',\n [variation],\n );\n\n const browserSupportsScreenSharing = supportsScreenSharing();\n\n const [isScreenShareEnabled, setIsScreenShareEnabled] = React.useState(false);\n\n const onScreenShareChange = React.useCallback(\n (enabled: boolean) => {\n setIsScreenShareEnabled(enabled);\n },\n [setIsScreenShareEnabled],\n );\n\n const htmlProps = mergeProps({ className: 'lk-control-bar' }, props);\n\n const {\n saveAudioInputEnabled,\n saveVideoInputEnabled,\n saveAudioInputDeviceId,\n saveVideoInputDeviceId,\n } = usePersistentUserChoices({ preventSave: !saveUserChoices });\n\n const microphoneOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) =>\n isUserInitiated ? saveAudioInputEnabled(enabled) : null,\n [saveAudioInputEnabled],\n );\n\n const cameraOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) =>\n isUserInitiated ? saveVideoInputEnabled(enabled) : null,\n [saveVideoInputEnabled],\n );\n\n return (\n <div {...htmlProps}>\n {visibleControls.microphone && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Microphone}\n showIcon={showIcon}\n onChange={microphoneOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Microphone, error })}\n >\n {showText && 'Microphone'}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"audioinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveAudioInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n {visibleControls.camera && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Camera}\n showIcon={showIcon}\n onChange={cameraOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Camera, error })}\n >\n {showText && 'Camera'}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"videoinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveVideoInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n {visibleControls.screenShare && browserSupportsScreenSharing && (\n <TrackToggle\n source={Track.Source.ScreenShare}\n captureOptions={{ audio: true, selfBrowserSurface: 'include' }}\n showIcon={showIcon}\n onChange={onScreenShareChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.ScreenShare, error })}\n >\n {showText && (isScreenShareEnabled ? 'Stop screen share' : 'Share screen')}\n </TrackToggle>\n )}\n {visibleControls.chat && (\n <ChatToggle>\n {showIcon && <ChatIcon />}\n {showText && 'Chat'}\n </ChatToggle>\n )}\n {visibleControls.settings && (\n <SettingsMenuToggle>\n {showIcon && <GearIcon />}\n {showText && 'Settings'}\n </SettingsMenuToggle>\n )}\n {visibleControls.leave && (\n <DisconnectButton>\n {showIcon && <LeaveIcon />}\n {showText && 'Leave'}\n </DisconnectButton>\n )}\n <StartMediaButton />\n </div>\n );\n}\n","import type {\n MessageDecoder,\n MessageEncoder,\n TrackReferenceOrPlaceholder,\n WidgetState,\n} from '@livekit/components-core';\nimport { isEqualTrackRef, isTrackReference, isWeb, log } from '@livekit/components-core';\nimport { RoomEvent, Track } from 'livekit-client';\nimport * as React from 'react';\nimport type { MessageFormatter } from '../components';\nimport {\n CarouselLayout,\n ConnectionStateToast,\n FocusLayout,\n FocusLayoutContainer,\n GridLayout,\n LayoutContextProvider,\n ParticipantTile,\n RoomAudioRenderer,\n} from '../components';\nimport { useCreateLayoutContext } from '../context';\nimport { usePinnedTracks, useTracks } from '../hooks';\nimport { Chat } from './Chat';\nimport { ControlBar, type ControlBarProps } from './ControlBar';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\n\n/**\n * @public\n */\nexport interface VideoConferenceProps extends React.HTMLAttributes<HTMLDivElement> {\n chatMessageFormatter?: MessageFormatter;\n chatMessageEncoder?: MessageEncoder;\n chatMessageDecoder?: MessageDecoder;\n /** @alpha */\n SettingsComponent?: React.ComponentType;\n controlBarProps?: Partial<ControlBarProps>;\n}\n\n/**\n * The `VideoConference` ready-made component is your drop-in solution for a classic video conferencing application.\n * It provides functionality such as focusing on one participant, grid view with pagination to handle large numbers\n * of participants, basic non-persistent chat, screen sharing, and more.\n *\n * @remarks\n * The component is implemented with other LiveKit components like `FocusContextProvider`,\n * `GridLayout`, `ControlBar`, `FocusLayoutContainer` and `FocusLayout`.\n * You can use these components as a starting point for your own custom video conferencing application.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <VideoConference />\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function VideoConference({\n chatMessageFormatter,\n chatMessageDecoder,\n chatMessageEncoder,\n SettingsComponent,\n controlBarProps = {},\n ...props\n}: VideoConferenceProps) {\n const [widgetState, setWidgetState] = React.useState<WidgetState>({\n showChat: false,\n unreadMessages: 0,\n showSettings: false,\n });\n const lastAutoFocusedScreenShareTrack = React.useRef<TrackReferenceOrPlaceholder | null>(null);\n\n const tracks = useTracks(\n [\n { source: Track.Source.Camera, withPlaceholder: true },\n { source: Track.Source.ScreenShare, withPlaceholder: false },\n ],\n { updateOnlyOn: [RoomEvent.ActiveSpeakersChanged], onlySubscribed: false },\n );\n\n const widgetUpdate = (state: WidgetState) => {\n log.debug('updating widget state', state);\n setWidgetState(state);\n };\n\n const layoutContext = useCreateLayoutContext();\n\n const screenShareTracks = tracks\n .filter(isTrackReference)\n .filter((track) => track.publication.source === Track.Source.ScreenShare);\n\n const focusTrack = usePinnedTracks(layoutContext)?.[0];\n const carouselTracks = tracks.filter((track) => !isEqualTrackRef(track, focusTrack));\n\n React.useEffect(() => {\n // If screen share tracks are published, and no pin is set explicitly, auto set the screen share.\n if (\n screenShareTracks.some((track) => track.publication.isSubscribed) &&\n lastAutoFocusedScreenShareTrack.current === null\n ) {\n log.debug('Auto set screen share focus:', { newScreenShareTrack: screenShareTracks[0] });\n layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: screenShareTracks[0] });\n lastAutoFocusedScreenShareTrack.current = screenShareTracks[0];\n } else if (\n lastAutoFocusedScreenShareTrack.current &&\n !screenShareTracks.some(\n (track) =>\n track.publication.trackSid ===\n lastAutoFocusedScreenShareTrack.current?.publication?.trackSid,\n )\n ) {\n log.debug('Auto clearing screen share focus.');\n layoutContext.pin.dispatch?.({ msg: 'clear_pin' });\n lastAutoFocusedScreenShareTrack.current = null;\n }\n if (focusTrack && !isTrackReference(focusTrack)) {\n const updatedFocusTrack = tracks.find(\n (tr) =>\n tr.participant.identity === focusTrack.participant.identity &&\n tr.source === focusTrack.source,\n );\n if (updatedFocusTrack !== focusTrack && isTrackReference(updatedFocusTrack)) {\n layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: updatedFocusTrack });\n }\n }\n }, [\n screenShareTracks\n .map((ref) => `${ref.publication.trackSid}_${ref.publication.isSubscribed}`)\n .join(),\n focusTrack?.publication?.trackSid,\n tracks,\n ]);\n\n useWarnAboutMissingStyles();\n\n return (\n <div className=\"lk-video-conference\" {...props}>\n {isWeb() && (\n <LayoutContextProvider\n value={layoutContext}\n // onPinChange={handleFocusStateChange}\n onWidgetChange={widgetUpdate}\n >\n <div className=\"lk-video-conference-inner\">\n {!focusTrack ? (\n <div className=\"lk-grid-layout-wrapper\">\n <GridLayout tracks={tracks}>\n <ParticipantTile />\n </GridLayout>\n </div>\n ) : (\n <div className=\"lk-focus-layout-wrapper\">\n <FocusLayoutContainer>\n <CarouselLayout tracks={carouselTracks}>\n <ParticipantTile />\n </CarouselLayout>\n {focusTrack && <FocusLayout trackRef={focusTrack} />}\n </FocusLayoutContainer>\n </div>\n )}\n <ControlBar\n controls={{ chat: true, settings: !!SettingsComponent }}\n {...controlBarProps}\n />\n </div>\n <Chat\n style={{ display: widgetState.showChat ? 'grid' : 'none' }}\n messageFormatter={chatMessageFormatter}\n messageEncoder={chatMessageEncoder}\n messageDecoder={chatMessageDecoder}\n />\n {SettingsComponent && (\n <div\n className=\"lk-settings-menu-modal\"\n style={{ display: widgetState.showSettings ? 'block' : 'none' }}\n >\n <SettingsComponent />\n </div>\n )}\n </LayoutContextProvider>\n )}\n <RoomAudioRenderer />\n <ConnectionStateToast />\n </div>\n );\n}\n","import * as React from 'react';\nimport { ControlBar } from './ControlBar';\n\nimport { ParticipantAudioTile } from '../components/participant/ParticipantAudioTile';\nimport { LayoutContextProvider } from '../components/layout/LayoutContextProvider';\nimport type { WidgetState } from '@livekit/components-core';\nimport { Chat } from './Chat';\nimport { TrackLoop } from '../components';\nimport { useTracks } from '../hooks';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\nimport { Track } from 'livekit-client';\n\n/** @public */\nexport interface AudioConferenceProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * This component is the default setup of a classic LiveKit audio conferencing app.\n * It provides functionality like switching between participant grid view and focus view.\n *\n * @remarks\n * The component is implemented with other LiveKit components like `FocusContextProvider`,\n * `GridLayout`, `ControlBar`, `FocusLayoutContainer` and `FocusLayout`.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <AudioConference />\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function AudioConference({ ...props }: AudioConferenceProps) {\n const [widgetState, setWidgetState] = React.useState<WidgetState>({\n showChat: false,\n unreadMessages: 0,\n });\n\n const audioTracks = useTracks([Track.Source.Microphone]);\n\n useWarnAboutMissingStyles();\n\n return (\n <LayoutContextProvider onWidgetChange={setWidgetState}>\n <div className=\"lk-audio-conference\" {...props}>\n <div className=\"lk-audio-conference-stage\">\n <TrackLoop tracks={audioTracks}>\n <ParticipantAudioTile />\n </TrackLoop>\n </div>\n <ControlBar\n controls={{ microphone: true, screenShare: false, camera: false, chat: true }}\n />\n {widgetState.showChat && <Chat />}\n </div>\n </LayoutContextProvider>\n );\n}\n","import { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport {\n useLocalParticipant,\n useLocalParticipantPermissions,\n usePersistentUserChoices,\n} from '../hooks';\nimport { mergeProps } from '../utils';\nimport { StartMediaButton } from '../components/controls/StartMediaButton';\nimport { BarVisualizer, DisconnectButton } from '../components';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\n\n/** @beta */\nexport type VoiceAssistantControlBarControls = {\n microphone?: boolean;\n leave?: boolean;\n};\n\n/** @beta */\nexport interface VoiceAssistantControlBarProps extends React.HTMLAttributes<HTMLDivElement> {\n onDeviceError?: (error: { source: Track.Source; error: Error }) => void;\n controls?: VoiceAssistantControlBarControls;\n /**\n * If `true`, the user's device choices will be persisted.\n * This will enables the user to have the same device choices when they rejoin the room.\n * @defaultValue true\n */\n saveUserChoices?: boolean;\n}\n\n/**\n * @example\n * ```tsx\n * <LiveKitRoom ... >\n * <VoiceAssistantControlBar />\n * </LiveKitRoom>\n * ```\n * @beta\n */\nexport function VoiceAssistantControlBar({\n controls,\n saveUserChoices = true,\n onDeviceError,\n ...props\n}: VoiceAssistantControlBarProps) {\n const visibleControls = { leave: true, microphone: true, ...controls };\n\n const localPermissions = useLocalParticipantPermissions();\n const { microphoneTrack, localParticipant } = useLocalParticipant();\n\n const micTrackRef: TrackReferenceOrPlaceholder = React.useMemo(() => {\n return {\n participant: localParticipant,\n source: Track.Source.Microphone,\n publication: microphoneTrack,\n };\n }, [localParticipant, microphoneTrack]);\n\n if (!localPermissions) {\n visibleControls.microphone = false;\n } else {\n visibleControls.microphone ??= localPermissions.canPublish;\n }\n\n const htmlProps = mergeProps({ className: 'lk-agent-control-bar' }, props);\n\n const { saveAudioInputEnabled, saveAudioInputDeviceId } = usePersistentUserChoices({\n preventSave: !saveUserChoices,\n });\n\n const microphoneOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) => {\n if (isUserInitiated) {\n saveAudioInputEnabled(enabled);\n }\n },\n [saveAudioInputEnabled],\n );\n\n return (\n <div {...htmlProps}>\n {visibleControls.microphone && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Microphone}\n showIcon={true}\n onChange={microphoneOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Microphone, error })}\n >\n <BarVisualizer trackRef={micTrackRef} barCount={7} options={{ minHeight: 5 }} />\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"audioinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveAudioInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n\n {visibleControls.leave && <DisconnectButton>{'Disconnect'}</DisconnectButton>}\n <StartMediaButton />\n </div>\n );\n}\n"],"names":["Chat","messageFormatter","messageDecoder","messageEncoder","channelTopic","props","ulRef","React","inputRef","chatOptions","chatMessages","send","isSending","useChat","layoutContext","useMaybeLayoutContext","lastReadMsgAt","handleSubmit","event","_a","_b","_c","unreadMessageCount","msg","widget","_d","_e","ChatToggle","ChatCloseIcon","idx","cloneSingleChild","allMsg","hideName","hideTimestamp","ChatEntry","ev","MediaDeviceMenu","kind","initialSelection","onActiveDeviceChange","tracks","requestPermissions","isOpen","setIsOpen","devices","setDevices","updateRequired","setUpdateRequired","needPermissions","setNeedPermissions","handleActiveDeviceChange","deviceId","log","button","tooltip","cleanup","computeMenuPosition","x","y","handleClickOutside","wasClickOutside","MediaDeviceSelect","useWarnAboutMissingStyles","warnAboutMissingStyles","usePreviewTracks","options","onError","setTracks","trackLock","Mutex","needsCleanup","localTracks","unlock","createLocalTracks","tr","e","track","roomOptionsStringifyReplacer","usePreviewDevice","enabled","deviceError","setDeviceError","isCreatingTrack","setIsCreatingTrack","useMediaDevices","selectedDevice","setSelectedDevice","localTrack","setLocalTrack","localDeviceId","setLocalDeviceId","createTrack","createLocalVideoTrack","VideoPresets","createLocalAudioTrack","newDeviceId","prevDeviceId","switchDevice","id","dev","PreJoin","defaults","onValidate","onSubmit","debug","joinLabel","micLabel","camLabel","userLabel","persistUserChoices","videoProcessor","htmlProps","initialUserChoices","saveAudioInputDeviceId","saveAudioInputEnabled","saveVideoInputDeviceId","saveVideoInputEnabled","saveUsername","usePersistentUserChoices","userChoices","setUserChoices","audioEnabled","setAudioEnabled","videoEnabled","setVideoEnabled","audioDeviceId","setAudioDeviceId","videoDeviceId","setVideoDeviceId","username","setUsername","videoEl","videoTrack","Track","facingMode","facingModeFromLocalTrack","audioTrack","isValid","setIsValid","handleValidation","values","newUserChoices","ParticipantPlaceholder","TrackToggle","_","inputEl","useSettingsToggle","dispatch","state","useLayoutContext","className","mergeProps","SettingsMenuToggle","ref","mergedProps","trackSourceToProtocol","source","ControlBar","variation","controls","saveUserChoices","onDeviceError","isChatOpen","setIsChatOpen","defaultVariation","useMediaQuery","visibleControls","localPermissions","useLocalParticipantPermissions","canPublishSource","showIcon","showText","browserSupportsScreenSharing","supportsScreenSharing","isScreenShareEnabled","setIsScreenShareEnabled","onScreenShareChange","microphoneOnChange","isUserInitiated","cameraOnChange","error","_kind","ChatIcon","GearIcon","DisconnectButton","LeaveIcon","StartMediaButton","VideoConference","chatMessageFormatter","chatMessageDecoder","chatMessageEncoder","SettingsComponent","controlBarProps","widgetState","setWidgetState","lastAutoFocusedScreenShareTrack","useTracks","RoomEvent","widgetUpdate","useCreateLayoutContext","screenShareTracks","isTrackReference","focusTrack","usePinnedTracks","carouselTracks","isEqualTrackRef","updatedFocusTrack","_f","isWeb","LayoutContextProvider","FocusLayoutContainer","CarouselLayout","ParticipantTile","FocusLayout","GridLayout","RoomAudioRenderer","ConnectionStateToast","AudioConference","audioTracks","TrackLoop","ParticipantAudioTile","VoiceAssistantControlBar","microphoneTrack","localParticipant","useLocalParticipant","micTrackRef","BarVisualizer"],"mappings":"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"}