@arbidocs/blocks 0.5.116 → 0.5.118
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/{ConnectedCallDock-WER7R222.cjs → ConnectedCallDock-E7RMQMMT.cjs} +12 -12
- package/dist/{ConnectedCallDock-WER7R222.cjs.map → ConnectedCallDock-E7RMQMMT.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs → ConnectedCallRoom-FF7X6LQ2.cjs} +12 -12
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs.map → ConnectedCallRoom-FF7X6LQ2.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-546ILGLW.cjs → ConnectedNativeDocxComparison-PB2LXT5U.cjs} +11 -11
- package/dist/{ConnectedNativeDocxComparison-546ILGLW.cjs.map → ConnectedNativeDocxComparison-PB2LXT5U.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs → ConnectedStreamedWordArtifact-S7ICDK5T.cjs} +11 -11
- package/dist/{ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs.map → ConnectedStreamedWordArtifact-S7ICDK5T.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-ZSBZBGFK.cjs → DocumentReviewCard-L472OMQS.cjs} +5 -5
- package/dist/{DocumentReviewCard-ZSBZBGFK.cjs.map → DocumentReviewCard-L472OMQS.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-6UKR5WEF.cjs → FilesViewerDialog-JK25HKKF.cjs} +21 -21
- package/dist/{FilesViewerDialog-6UKR5WEF.cjs.map → FilesViewerDialog-JK25HKKF.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-J3C6VH4T.cjs → WorkspaceTableView-JCTDEMIL.cjs} +8 -8
- package/dist/{WorkspaceTableView-J3C6VH4T.cjs.map → WorkspaceTableView-JCTDEMIL.cjs.map} +1 -1
- package/dist/agents/index.cjs +187 -187
- package/dist/{ai-IM4A23YT.cjs → ai-OBS67QV4.cjs} +16 -16
- package/dist/ai-OBS67QV4.cjs.map +1 -0
- package/dist/calls/index.cjs +2 -2
- package/dist/{chunk-B3LZITVF.cjs → chunk-3LNUQYAF.cjs} +3 -3
- package/dist/{chunk-B3LZITVF.cjs.map → chunk-3LNUQYAF.cjs.map} +1 -1
- package/dist/{chunk-QHOHDNBU.cjs → chunk-5XAJ4N2S.cjs} +4 -4
- package/dist/{chunk-QHOHDNBU.cjs.map → chunk-5XAJ4N2S.cjs.map} +1 -1
- package/dist/{chunk-XKVPSOKP.cjs → chunk-6ULADDBW.cjs} +4 -4
- package/dist/{chunk-XKVPSOKP.cjs.map → chunk-6ULADDBW.cjs.map} +1 -1
- package/dist/{chunk-CPR6EHG7.cjs → chunk-7IPIKMCY.cjs} +3 -3
- package/dist/{chunk-CPR6EHG7.cjs.map → chunk-7IPIKMCY.cjs.map} +1 -1
- package/dist/{chunk-SB4M3ITT.cjs → chunk-CB3YYZAU.cjs} +9 -9
- package/dist/{chunk-SB4M3ITT.cjs.map → chunk-CB3YYZAU.cjs.map} +1 -1
- package/dist/{chunk-6UTKM5AB.cjs → chunk-JSQQV23D.cjs} +3 -3
- package/dist/{chunk-6UTKM5AB.cjs.map → chunk-JSQQV23D.cjs.map} +1 -1
- package/dist/{chunk-VGCTYTEW.cjs → chunk-K6AUKKUN.cjs} +6 -6
- package/dist/{chunk-VGCTYTEW.cjs.map → chunk-K6AUKKUN.cjs.map} +1 -1
- package/dist/{chunk-T23UTIRI.cjs → chunk-KHAO7ZTO.cjs} +5 -5
- package/dist/{chunk-T23UTIRI.cjs.map → chunk-KHAO7ZTO.cjs.map} +1 -1
- package/dist/{chunk-NJCK6V6U.cjs → chunk-L6APDO3Y.cjs} +3 -3
- package/dist/{chunk-NJCK6V6U.cjs.map → chunk-L6APDO3Y.cjs.map} +1 -1
- package/dist/{chunk-NIE3N6OM.cjs → chunk-MMVDVHKE.cjs} +5 -5
- package/dist/{chunk-NIE3N6OM.cjs.map → chunk-MMVDVHKE.cjs.map} +1 -1
- package/dist/{chunk-TDO5UWXF.cjs → chunk-O4F77VSO.cjs} +5 -5
- package/dist/{chunk-TDO5UWXF.cjs.map → chunk-O4F77VSO.cjs.map} +1 -1
- package/dist/{chunk-OEREKAAP.cjs → chunk-OPH4UZQN.cjs} +30 -30
- package/dist/{chunk-OEREKAAP.cjs.map → chunk-OPH4UZQN.cjs.map} +1 -1
- package/dist/{chunk-KTQOGT2L.cjs → chunk-P2MOLUFO.cjs} +6 -6
- package/dist/{chunk-KTQOGT2L.cjs.map → chunk-P2MOLUFO.cjs.map} +1 -1
- package/dist/{chunk-DDIW4HLU.cjs → chunk-PVPRVI54.cjs} +6 -6
- package/dist/{chunk-DDIW4HLU.cjs.map → chunk-PVPRVI54.cjs.map} +1 -1
- package/dist/{chunk-557MJ4IH.cjs → chunk-QOXK5O6M.cjs} +12 -12
- package/dist/{chunk-557MJ4IH.cjs.map → chunk-QOXK5O6M.cjs.map} +1 -1
- package/dist/{chunk-Y24V6HPR.cjs → chunk-SUYPXUE6.cjs} +4 -4
- package/dist/{chunk-Y24V6HPR.cjs.map → chunk-SUYPXUE6.cjs.map} +1 -1
- package/dist/{chunk-R7CJEIA5.cjs → chunk-XZYIS2JZ.cjs} +3 -3
- package/dist/{chunk-R7CJEIA5.cjs.map → chunk-XZYIS2JZ.cjs.map} +1 -1
- package/dist/{chunk-HB2O4THB.cjs → chunk-YDPLSXHB.cjs} +4 -4
- package/dist/{chunk-HB2O4THB.cjs.map → chunk-YDPLSXHB.cjs.map} +1 -1
- package/dist/{chunk-B2HNNG25.cjs → chunk-ZCIQBHH5.cjs} +35 -35
- package/dist/{chunk-B2HNNG25.cjs.map → chunk-ZCIQBHH5.cjs.map} +1 -1
- package/dist/connect/docx.cjs +14 -14
- package/dist/connect/index.cjs +625 -625
- package/dist/connect/viewer.cjs +11 -11
- package/dist/dashboards/index.cjs +1 -1
- package/dist/embed/index.cjs +21 -21
- package/dist/index.cjs +316 -316
- package/dist/settings/index.cjs +147 -147
- package/dist/shell/index.cjs +35 -35
- package/dist/studio/index.cjs +8 -8
- package/dist/workflow-canvas/index.cjs +27 -27
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-T6K2QYNZ.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-U4JZVSOE.js +1 -1
- package/package.json +5 -5
- package/dist/ai-IM4A23YT.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/calls/connected/CallTranscription.tsx","../src/calls/connected/CallRecording.tsx","../src/calls/connected/CallControls.tsx","../src/calls/connected/WebinarChat.tsx","../src/calls/connected/WebinarSidePanel.tsx","../src/calls/connected/ConnectedCallRoom.tsx"],"names":["jsxs","CallControlButton","jsx","Loader2","Captions","useEffect","TranscriptionStatusChip","useMemo","CaptionsStrip","useLocalParticipant","useCallback","useAudioRecorder","LIVE_SEGMENTER","useIsEntitled","RecordControl","MODE_LABEL","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","Button","RecordingStatusChip","pickRecorderMimeType","useTrackUploader","useRef","RECORDING_CHUNK_MS","SPEAKER_AUDIO_BITS_PER_SECOND","useBlocksEnvironment","useTracks","Track","startCompositeCapture","createChunkedRecorder","COMPOSITE_VIDEO_BITS_PER_SECOND","COMPOSITE_AUDIO_BITS_PER_SECOND","classifyMediaError","useTrackToggle","useMediaDeviceSelect","useMirrorSelfView","MediaControl","useAudioPlayback","Volume2","useArbi","useRoomContext","useServerCallsExperimental","useState","MonitorX","MonitorUp","Square","Circle","Link2","LockOpen","Lock","CallControlBar","Fragment","ElapsedTime","LeaveButton","ControlGroup","ControlDivider","MoreMenu","FlaskConical","MessageListRoot","MessageListEmpty","MessageRoot","MessageContent","MessageAuthor","CallUserPill","MessageBubble","MessageBody","PanelComposer","CALL_CHAT_MAX_CHARS","QAPanel","WebinarAudiencePanel","CallSidePanel","DEFAULT_JOIN_CHOICES","useCallRoom","cn","TriangleAlert","CallStateMessage","LiveKitRoom","DisconnectReason","MediaDeviceFailure","RoomAudioRenderer","isTrackReference","startVoiceLevels","useWebinar","useMeetingReadOnly","useCallTranscriber","publishCallStatus","useCallRecorder","useElementSize","useInCallChat","useMuteRequests","useHostMuteNotice","useParticipants","useSpeakingIds","WebinarLiveChip","CallHeader","WebinarEndConfirm","OnStageCheck","WebinarViewer","CallStageFrame","BackstageBanner","CallNotice","SpeakingNow","stageContentHeight","MessageCircleQuestion","ArrowDownToLine","chatPermissionSection","NOTICE_MS","useIsEncrypted","EncryptionStatusChip","useParticipantTile","useIsMuted","useIsSpeaking","useVoiceLevel","useConnectionQualityIndicator","CallTile","ParticipantName","initialsOf","VideoTrack","ConnectionQuality","useSpotlightId","pickSpotlight","CallGrid","CallFocus","MinimisedCall","useVoiceLevels","CallParticipants","useCallSession","callSession","LobbyRequests","useConnectionState","ConnectionState","ConnectionOverlay"],"mappings":"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","file":"chunk-CPR6EHG7.cjs","sourcesContent":["/**\n * Live transcription in a call, wired to {@link useCallTranscriber}: the CC buttons, the\n * \"Transcribing\" header chip everyone sees, the captions strip, and the invisible sender that\n * records my own microphone. The look comes from `@arbidocs/blocks/calls`.\n */\n\nimport { useCallback, useEffect, useMemo, type ReactElement } from 'react'\nimport { Captions, Loader2 } from 'lucide-react'\nimport { useLocalParticipant } from '@livekit/components-react'\nimport {\n useAudioRecorder,\n type AudioSegment,\n LIVE_SEGMENTER,\n type CaptionLine,\n} from '@arbidocs/react'\nimport { CallControlButton, CaptionsStrip, TranscriptionStatusChip, type CaptionEntry } from '../ui'\nimport type { CallTranscription } from '@arbidocs/react/calls'\n\n/**\n * The host's control-bar CC button: turns transcription on or off (captions for everyone, the\n * transcript kept in the meeting chat). Nobody else sees this one.\n */\nexport function TranscriptionToggle({\n transcription,\n}: {\n transcription: CallTranscription\n}): ReactElement | null {\n const { available, on, canToggle, busy, toggle } = transcription\n if (!available || !canToggle) return null\n const label = on ? 'Stop transcription' : 'Transcribe the call'\n return (\n <CallControlButton\n label={label}\n shortcut=\"C\"\n tone={on ? 'active' : 'neutral'}\n aria-pressed={on}\n disabled={busy}\n onClick={() => void toggle()}\n data-testid=\"transcription-toggle\"\n data-call-shortcut=\"c\"\n >\n {busy ? <Loader2 className=\"animate-spin\" aria-hidden /> : <Captions aria-hidden />}\n <span className=\"sr-only\">{label}</span>\n </CallControlButton>\n )\n}\n\n/**\n * \"Transcription on — started by X\", folding to \"Transcribing\", for everyone while it is on; its\n * mic switch stops my own voice being sent. Mounting it is what lets my audio be sent: it reports\n * itself shown, and unmounting stops sending.\n */\nexport function TranscriptionIndicator({\n transcription,\n compact = false,\n announce = true,\n onAnnounced,\n className,\n}: {\n transcription: CallTranscription\n compact?: boolean\n /** Spell out who started it (false once it has been, e.g. after minimising). */\n announce?: boolean\n onAnnounced?(): void\n className?: string\n}): ReactElement {\n const { setIndicatorShown, startedByName, startedByMe, muted, setMuted } = transcription\n useEffect(() => {\n setIndicatorShown(true)\n return () => setIndicatorShown(false)\n }, [setIndicatorShown])\n const by = startedByMe ? 'you' : startedByName || 'a participant'\n return (\n <TranscriptionStatusChip\n sentence={`Transcription on — started by ${by}`}\n short={muted ? 'Transcribing · you are muted' : 'Transcribing'}\n detail=\"Captions are shown to everyone and the transcript is kept in the meeting chat.\"\n muted={muted}\n onMutedChange={setMuted}\n muteLabel=\"Stop sending what I say to the transcriber (others are still transcribed)\"\n unmuteLabel=\"Transcribe what I say again\"\n compact={compact}\n announce={announce}\n onAnnounced={onAnnounced}\n className={className}\n data-testid=\"transcription-indicator\"\n />\n )\n}\n\n/**\n * A captions strip (names, \"Me\" for mine; two lines, newest at the bottom). The call panel no\n * longer shows one — live lines appear in the call's conversation — but it stays the plain view\n * of `transcription.captions`.\n */\nexport function CaptionsOverlay({\n captions,\n reserve = false,\n className,\n}: {\n captions: CaptionLine[]\n reserve?: boolean\n className?: string\n}): ReactElement | null {\n const entries = useMemo<CaptionEntry[]>(\n () =>\n captions.map((c) => ({\n id: c.segmentId,\n speakerId: c.identity,\n // My own lines read \"Me\" on my screen (they are stored under my real name).\n name: c.mine ? 'Me' : c.name || 'Someone',\n text: c.text,\n receivedAt: c.receivedAt,\n })),\n [captions]\n )\n return <CaptionsStrip captions={entries} reserve={reserve} className={className} />\n}\n\n/**\n * Records my own microphone track in speech segments while transcription may send (on, indicator\n * shown, not muted) and my microphone is on. Renders nothing.\n */\nexport function TranscriptionSender({ transcription }: { transcription: CallTranscription }): null {\n const { isMicrophoneEnabled, microphoneTrack } = useLocalParticipant()\n const track = microphoneTrack?.track?.mediaStreamTrack ?? null\n const active = transcription.shouldSend && isMicrophoneEnabled && !!track\n const { handleSegment } = transcription\n // A segment flushed as sending stops (off, mute, mic off, hang-up) is still handed over: the hook\n // sends it only if it started before the stop (the server's final-segment grace).\n const onSegment = useCallback(\n (segment: AudioSegment) => void handleSegment(segment),\n [handleSegment]\n )\n const { start, stop } = useAudioRecorder({ track, onSegment, segmenter: LIVE_SEGMENTER })\n useEffect(() => {\n if (!active) return\n void start()\n return () => stop()\n }, [active, track, start, stop])\n return null\n}\n","/**\n * Call recording UI in a call (ARBI `docs/meeting-chats-plan.md` §6): the host's Record / Stop\n * control with the mode choice and the quota warning, the \"Recording\" header chip everyone sees,\n * and the invisible recorders — my own microphone (everyone, workspace guests included) and, in\n * \"Audio + video\" mode, the host's composite of the stage. State comes from {@link useCallRecorder}.\n */\n\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport type { calls } from '@arbidocs/sdk/browser'\nimport { useCallback, useEffect, useMemo, useRef, type ReactElement, type RefObject } from 'react'\nimport { Track } from 'livekit-client'\nimport { useLocalParticipant, useTracks } from '@livekit/components-react'\nimport {\n createChunkedRecorder,\n pickRecorderMimeType,\n useAudioRecorder,\n type AudioSegment,\n useIsEntitled,\n COMPOSITE_AUDIO_BITS_PER_SECOND,\n COMPOSITE_VIDEO_BITS_PER_SECOND,\n RECORDING_CHUNK_MS,\n SPEAKER_AUDIO_BITS_PER_SECOND,\n type TrackUploader,\n} from '@arbidocs/react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { startCompositeCapture, RecordControl, RecordingStatusChip } from '../ui'\nimport { MODE_LABEL } from '../recording-labels'\nimport { useTrackUploader, type CallRecordingControl } from '@arbidocs/react/calls'\n\n/** The host's record button: picks a mode, or stops. Nobody else sees it. */\nexport function RecordingControl({\n recording,\n}: {\n recording: CallRecordingControl\n}): ReactElement | null {\n const { available, canControl, on, busy, requestStart, stop } = recording\n // Starting a recording is hosting (a paid feature); a running one can always be stopped.\n const canHost = useIsEntitled('host_calls')\n if (!available || !canControl || (!on && !canHost)) return null\n return (\n <RecordControl<calls.RecordingMode>\n on={on}\n busy={busy}\n note=\"Each person’s browser records their own microphone, encrypted.\"\n modes={[\n {\n mode: 'audio',\n label: MODE_LABEL.audio,\n description: 'Everyone’s microphone, one track each',\n testId: 'recording-mode-audio',\n },\n {\n mode: 'audio_video',\n label: MODE_LABEL.audio_video,\n description: 'Plus a video of your view of the call',\n testId: 'recording-mode-video',\n },\n ]}\n onStart={(mode) => void requestStart(mode)}\n onStop={() => void stop()}\n />\n )\n}\n\n/** Near the storage quota: the host confirms before starting. */\nexport function RecordingQuotaWarning({\n recording,\n}: {\n recording: CallRecordingControl\n}): ReactElement | null {\n const { pendingStart, confirmStart, cancelStart } = recording\n if (!pendingStart) return null\n const { quota, mode } = pendingStart\n const left = quota.remaining_mb == null ? null : Math.max(0, Math.floor(quota.remaining_mb))\n const tooLittle = left != null && left < quota.min_start_mb\n return (\n <Dialog open onOpenChange={(o) => !o && cancelStart()}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"recording-quota-warning\">\n <DialogHeader>\n <DialogTitle>Storage nearly full</DialogTitle>\n <DialogDescription>\n {left == null\n ? 'The storage is nearly full.'\n : left > 0\n ? `Only ${left} MB of storage is left${quota.limit_mb ? ` of ${quota.limit_mb} MB` : ''}.`\n : 'There is no storage left.'}{' '}\n {tooLittle && `A recording needs at least ${quota.min_start_mb} MB free to start. `}\n Audio takes about 10 MB per person per hour\n {mode === 'audio_video' ? ', video about 150–300 MB per hour' : ''}. Recording stops\n automatically when the storage is full.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"ghost\" onClick={cancelStart}>\n Cancel\n </Button>\n <Button onClick={() => void confirmStart()} data-testid=\"recording-quota-confirm\">\n Record anyway\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\n/**\n * \"Recording (Audio + video) — started by X\", for everyone, while it is on. Mounting it is what lets\n * the recorders capture: it reports itself shown, and unmounting stops them.\n */\nexport function RecordingIndicator({\n recording,\n compact = false,\n announce = true,\n onAnnounced,\n className,\n}: {\n recording: CallRecordingControl\n /** Dot only once folded (a narrow header, the minimised card). */\n compact?: boolean\n /** Spell out who started it (false once it has been, e.g. after minimising). */\n announce?: boolean\n onAnnounced?(): void\n className?: string\n}): ReactElement {\n const { setIndicatorShown, mode, startedByMe, startedByName } = recording\n useEffect(() => {\n setIndicatorShown(true)\n return () => setIndicatorShown(false)\n }, [setIndicatorShown])\n const by = startedByMe ? 'you' : startedByName || 'the host'\n return (\n <RecordingStatusChip\n sentence={`Recording${mode ? ` (${MODE_LABEL[mode]})` : ''} — started by ${by}`}\n compact={compact}\n announce={announce}\n onAnnounced={onAnnounced}\n className={className}\n data-testid=\"recording-indicator\"\n data-mode={mode ?? undefined}\n />\n )\n}\n\n/** Records my own microphone in ~30 s standalone parts while recording may capture. Renders nothing. */\nexport function SpeakerRecorder({\n recording,\n callKey,\n}: {\n recording: CallRecordingControl\n callKey: Uint8Array | null\n}): null {\n const { microphoneTrack } = useLocalParticipant()\n const track = microphoneTrack?.track?.mediaStreamTrack ?? null\n const mimeType = useMemo(() => pickRecorderMimeType('audio'), [])\n const uploader = useTrackUploader(recording, callKey, 'speaker', mimeType)\n const uploaderRef = useRef(uploader)\n uploaderRef.current = uploader\n const lastUploader = useRef<TrackUploader | null>(null)\n if (uploader) lastUploader.current = uploader\n const onSegment = useCallback((segment: AudioSegment) => {\n // The tail flushed as capture stops still belongs to the recording that was running.\n const target = uploaderRef.current ?? lastUploader.current\n target?.enqueue({\n blob: segment.blob,\n startedAt: segment.startedAt,\n durationMs: segment.durationMs,\n })\n }, [])\n const { start, stop } = useAudioRecorder({\n track,\n onSegment,\n chunkMs: RECORDING_CHUNK_MS,\n mimeType,\n audioBitsPerSecond: SPEAKER_AUDIO_BITS_PER_SECOND,\n })\n const active = !!uploader && !!track\n useEffect(() => {\n if (!active) return\n void start()\n return () => stop()\n }, [active, track, uploader, start, stop])\n return null\n}\n\n/**\n * The host's composite (Audio + video mode): the stage drawn into a canvas plus the audio the host\n * hears, recorded as one continuous file in ~30 s parts. Renders nothing.\n */\nexport function CompositeRecorder({\n recording,\n callKey,\n stageRef,\n}: {\n recording: CallRecordingControl\n callKey: Uint8Array | null\n stageRef: RefObject<HTMLElement | null>\n}): null {\n const { notify } = useBlocksEnvironment()\n const mimeType = useMemo(() => pickRecorderMimeType('video'), [])\n const uploader = useTrackUploader(recording, callKey, 'composite', mimeType)\n const audioRefs = useTracks([Track.Source.Microphone, Track.Source.ScreenShareAudio], {\n onlySubscribed: true,\n })\n const audioTracks = useMemo(\n () =>\n audioRefs\n .map((ref) => ref.publication?.track?.mediaStreamTrack)\n .filter((t): t is MediaStreamTrack => !!t),\n [audioRefs]\n )\n const audioTracksRef = useRef(audioTracks)\n audioTracksRef.current = audioTracks\n const captureRef = useRef<ReturnType<typeof startCompositeCapture> | null>(null)\n\n useEffect(() => {\n const stage = stageRef.current\n if (!uploader || !stage) return\n let capture: ReturnType<typeof startCompositeCapture>\n try {\n capture = startCompositeCapture(stage)\n } catch (err) {\n console.warn('[calls] cannot record the composite', err)\n notify('This browser cannot record the call video; audio is still recorded.', 'warning')\n return\n }\n captureRef.current = capture\n capture.setAudioTracks(audioTracksRef.current)\n const recorder = createChunkedRecorder({\n stream: capture.stream,\n mimeType,\n chunkMs: RECORDING_CHUNK_MS,\n mode: 'timeslice',\n videoBitsPerSecond: COMPOSITE_VIDEO_BITS_PER_SECOND,\n audioBitsPerSecond: COMPOSITE_AUDIO_BITS_PER_SECOND,\n onChunk: (chunk) =>\n uploader.enqueue({\n blob: chunk.blob,\n startedAt: chunk.startedAt,\n durationMs: chunk.durationMs,\n }),\n onError: (err) => console.warn('[calls] the composite recorder failed', err),\n })\n recorder.start()\n return () => {\n captureRef.current = null\n void recorder.stop().finally(() => capture.dispose())\n }\n }, [uploader, stageRef, mimeType])\n\n useEffect(() => {\n captureRef.current?.setAudioTracks(audioTracks)\n }, [audioTracks])\n return null\n}\n","/**\n * The call panel's control bar, wired to the LiveKit room. One row; what fits stays in it and the\n * rest moves into More, so each action lives in exactly one visible place:\n * full — time · mic, camera | share, CC, Record | More · Leave\n * compact — mic, camera | CC, Record | More · Leave\n * tiny — mic, camera | More · Leave\n * Chat is the conversation beside the panel (its own composer) and the participant list is\n * always on show under the video, so neither has a button here.\n */\n\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useState, type ReactElement } from 'react'\nimport { Track } from 'livekit-client'\nimport {\n useAudioPlayback,\n useMediaDeviceSelect,\n useRoomContext,\n useTrackToggle,\n} from '@livekit/components-react'\nimport {\n Captions,\n Circle,\n FlaskConical,\n Link2,\n Lock,\n LockOpen,\n MonitorUp,\n MonitorX,\n Square,\n Volume2,\n} from 'lucide-react'\nimport { classifyMediaError, useArbi, useServerCallsExperimental } from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport {\n CallControlBar,\n CallControlButton,\n ControlDivider,\n ControlGroup,\n ElapsedTime,\n LeaveButton,\n MediaControl,\n MoreMenu,\n type LeaveOption,\n type MoreMenuItem,\n type MoreMenuSection,\n} from '../ui'\nimport { TranscriptionToggle } from './CallTranscription'\nimport { RecordingControl } from './CallRecording'\nimport type { CallTranscription, CallRecordingControl } from '@arbidocs/react/calls'\nimport { useMirrorSelfView } from '../self-view'\n\nexport type ControlDensity = 'full' | 'compact' | 'tiny'\n\ntype MediaSource = Track.Source.Microphone | Track.Source.Camera\n\ntype Notify = ReturnType<typeof useBlocksEnvironment>['notify']\n\nfunction reportDeviceError(notify: Notify, source: MediaSource) {\n return (err: Error) =>\n notify(\n classifyMediaError(err, source === Track.Source.Camera ? 'camera' : 'microphone'),\n 'error'\n )\n}\n\n/** Microphone or camera of the room, with its device list (and, for the camera, the mirror). */\nfunction RoomMediaControl({\n source,\n shortcut,\n testId,\n}: {\n source: MediaSource\n shortcut: string\n testId: string\n}): ReactElement {\n const { notify } = useBlocksEnvironment()\n const mic = source === Track.Source.Microphone\n const { toggle, enabled, pending } = useTrackToggle({\n source,\n onDeviceError: reportDeviceError(notify, source),\n })\n const { devices, activeDeviceId, setActiveMediaDevice } = useMediaDeviceSelect({\n kind: mic ? 'audioinput' : 'videoinput',\n })\n const [mirror, setMirror] = useMirrorSelfView()\n return (\n <MediaControl\n kind={mic ? 'microphone' : 'camera'}\n enabled={enabled}\n pending={pending}\n onToggle={() => void toggle()}\n devices={devices.map((d) => ({ deviceId: d.deviceId, label: d.label }))}\n activeDeviceId={activeDeviceId}\n onSelectDevice={(id) =>\n void setActiveMediaDevice(id).catch((err: Error) => reportDeviceError(notify, source)(err))\n }\n shortcut={shortcut}\n testId={testId}\n options={\n mic\n ? []\n : [\n {\n label: 'Mirror my video',\n checked: mirror,\n onChange: setMirror,\n testId: 'call-mirror-toggle',\n },\n ]\n }\n />\n )\n}\n\nfunction useScreenShare() {\n const { notify } = useBlocksEnvironment()\n return useTrackToggle({\n source: Track.Source.ScreenShare,\n captureOptions: { audio: true, selfBrowserSurface: 'exclude' },\n onDeviceError: (err: Error) => {\n // Cancelling the browser's picker is not worth a toast.\n if (err.name !== 'NotAllowedError') notify(`Could not share: ${err.message}`, 'error')\n },\n })\n}\n\n/** \"Enable audio\" when the browser blocked playback until a click (the bar's left end). */\nexport function EnableAudioButton({ compact = false }: { compact?: boolean }): ReactElement | null {\n const { canPlayAudio, startAudio } = useAudioPlayback()\n if (canPlayAudio) return null\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 gap-1.5 border-yellow-border bg-yellow-bg text-yellow-text hover:bg-yellow-bg/80\"\n onClick={() => void startAudio()}\n data-testid=\"call-start-audio\"\n >\n <Volume2 className=\"size-4\" aria-hidden />\n {compact ? 'Audio' : 'Enable audio'}\n </Button>\n )\n}\n\nexport interface CallControlsProps {\n callExtId: string\n isCreator: boolean\n /** Copy-able join link (anyone with it can ask to join). */\n link: string | null\n startedAt: number\n density: ControlDensity\n /** Single-key shortcuts on (the panel is on screen). */\n shortcuts: boolean\n transcription: CallTranscription\n recording: CallRecordingControl\n /** More groups of the More menu (a webinar's chat setting, panel, Leave stage). */\n menuGroups?: (MoreMenuItem[] | MoreMenuSection)[]\n /** Leave's further choices (a webinar's End webinar for everyone). */\n leaveOptions?: LeaveOption[]\n}\n\nexport function CallControls({\n callExtId,\n isCreator,\n link,\n startedAt,\n density,\n shortcuts,\n transcription: tr,\n recording,\n menuGroups = [],\n leaveOptions,\n}: CallControlsProps): ReactElement {\n const { notify } = useBlocksEnvironment()\n const arbi = useArbi()\n const room = useRoomContext()\n const share = useScreenShare()\n const experimental = useServerCallsExperimental()\n const [locked, setLocked] = useState(false)\n const [locking, setLocking] = useState(false)\n const full = density === 'full'\n const tiny = density === 'tiny'\n\n const toggleLock = async () => {\n setLocking(true)\n try {\n const call = await arbi.calls.update(callExtId, { locked: !locked })\n setLocked(call.locked)\n notify(call.locked ? 'Call locked: nobody new can join' : 'Call unlocked', 'info')\n } catch (err) {\n notify(`Could not change the lock: ${(err as Error).message}`, 'error')\n } finally {\n setLocking(false)\n }\n }\n const copyLink = () => {\n if (!link) return\n void navigator.clipboard\n .writeText(link)\n .then(() => notify('Call link copied', 'success'))\n .catch(() => notify('Could not copy the link', 'error'))\n }\n\n // What does not fit the bar lives in More.\n const overflow: MoreMenuItem[] = [\n ...(!full\n ? [\n {\n key: 'share',\n label: share.enabled ? 'Stop sharing' : 'Share your screen',\n icon: share.enabled ? <MonitorX /> : <MonitorUp />,\n onSelect: () => void share.toggle(),\n disabled: share.pending,\n },\n ]\n : []),\n ...(tiny && tr.available && tr.canToggle\n ? [\n {\n key: 'transcribe',\n label: tr.on ? 'Stop transcription' : 'Transcribe the call',\n icon: <Captions />,\n onSelect: () => void tr.toggle(),\n disabled: tr.busy,\n },\n ]\n : []),\n ...(tiny && recording.available && recording.canControl\n ? recording.on\n ? [\n {\n key: 'stop-recording',\n label: 'Stop recording',\n icon: <Square className=\"fill-current text-red-text\" />,\n onSelect: () => void recording.stop(),\n disabled: recording.busy,\n },\n ]\n : [\n {\n key: 'record-audio',\n label: 'Record audio',\n icon: <Circle className=\"fill-red-solid text-red-solid\" />,\n onSelect: () => void recording.requestStart('audio'),\n disabled: recording.busy,\n },\n {\n key: 'record-video',\n label: 'Record audio + video',\n icon: <Circle className=\"fill-red-solid text-red-solid\" />,\n onSelect: () => void recording.requestStart('audio_video'),\n disabled: recording.busy,\n },\n ]\n : []),\n ]\n const callItems: MoreMenuItem[] = [\n ...(link\n ? [\n {\n key: 'link',\n label: 'Copy call link',\n icon: <Link2 />,\n onSelect: copyLink,\n testId: 'call-copy-link',\n },\n ]\n : []),\n ...(isCreator\n ? [\n {\n key: 'lock',\n label: locked ? 'Unlock call' : 'Lock call (only invited people can join)',\n icon: locked ? <LockOpen /> : <Lock />,\n onSelect: () => void toggleLock(),\n disabled: locking,\n testId: 'call-lock-toggle',\n },\n ]\n : []),\n ]\n\n return (\n <CallControlBar\n shortcuts={shortcuts}\n left={\n <>\n {full && <ElapsedTime since={startedAt} title=\"Time in this call\" />}\n <EnableAudioButton compact={!full} />\n </>\n }\n right={\n <LeaveButton\n compact={!full}\n onLeave={() => void room.disconnect()}\n options={leaveOptions}\n />\n }\n >\n <ControlGroup>\n <RoomMediaControl source={Track.Source.Microphone} shortcut=\"M\" testId=\"call-mic-toggle\" />\n <RoomMediaControl source={Track.Source.Camera} shortcut=\"V\" testId=\"call-camera-toggle\" />\n </ControlGroup>\n {!tiny && (\n <>\n <ControlDivider />\n <ControlGroup>\n {full && (\n <CallControlButton\n label={share.enabled ? 'Stop sharing' : 'Share your screen'}\n tone={share.enabled ? 'active' : 'neutral'}\n aria-pressed={share.enabled}\n disabled={share.pending}\n onClick={() => void share.toggle()}\n data-testid=\"call-share-toggle\"\n >\n {share.enabled ? <MonitorX aria-hidden /> : <MonitorUp aria-hidden />}\n </CallControlButton>\n )}\n <TranscriptionToggle transcription={tr} />\n <RecordingControl recording={recording} />\n </ControlGroup>\n </>\n )}\n <MoreMenu\n details={\n experimental ? (\n <span\n className=\"flex items-center gap-1.5 text-xs text-muted-foreground\"\n data-testid=\"calls-experimental-badge\"\n >\n <FlaskConical className=\"size-3.5\" aria-hidden />\n Calls are an experimental feature.\n </span>\n ) : undefined\n }\n groups={[overflow, callItems, ...menuGroups]}\n />\n </CallControlBar>\n )\n}\n","/**\n * The webinar's live chat (the Chat tab, shown while the audience may chat): the in-call chat's\n * lines in the conversation's own message parts (my messages right, others' left under their\n * pill), and the side panel's composer. Live over the data channel under K; the team's messages\n * are also kept in the meeting chat, the audience's are not.\n */\n\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useEffect, useRef, type ReactElement } from 'react'\nimport { PanelComposer } from '../ui'\nimport {\n MessageBody,\n MessageAuthor,\n MessageBubble,\n MessageContent,\n MessageListEmpty,\n MessageListRoot,\n MessageRoot,\n} from '../../chat'\nimport { CALL_CHAT_MAX_CHARS } from '@arbidocs/react'\nimport type { InCallChatState } from '@arbidocs/react/calls'\nimport { CallUserPill } from './CallUserPill'\n\nexport function WebinarChat({ chat }: { chat: InCallChatState }): ReactElement {\n const { notify } = useBlocksEnvironment()\n const end = useRef<HTMLDivElement>(null)\n const count = chat.lines.length\n useEffect(() => {\n end.current?.scrollIntoView?.({ block: 'end' })\n }, [count])\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\" data-testid=\"webinar-chat\">\n <MessageListRoot className=\"min-h-0 flex-1 overflow-y-auto py-2\" testId=\"webinar-chat-list\">\n {count === 0 ? (\n <MessageListEmpty className=\"h-32 text-sm\">No messages yet.</MessageListEmpty>\n ) : (\n chat.lines.map((line, i) => {\n const startsRun =\n !line.mine && chat.lines[i - 1]?.senderIdentity !== line.senderIdentity\n const id = `${line.senderIdentity}-${line.id}`\n return (\n <MessageRoot key={id} role=\"user\" messageId={id} className=\"px-3\">\n <MessageContent role=\"user\" messageId={id} align={line.mine ? 'end' : 'start'}>\n {startsRun && (\n <MessageAuthor>\n <CallUserPill\n identity={line.senderIdentity}\n name={line.senderName}\n size=\"sm\"\n />\n </MessageAuthor>\n )}\n <MessageBubble\n role=\"user\"\n messageId={id}\n className={line.mine ? undefined : 'border border-border bg-card'}\n >\n <MessageBody messageId={id} className=\"whitespace-pre-wrap text-sm\">\n {line.text}\n </MessageBody>\n </MessageBubble>\n </MessageContent>\n </MessageRoot>\n )\n })\n )}\n <div ref={end} />\n </MessageListRoot>\n <div className=\"shrink-0 border-t border-border p-3\">\n <PanelComposer\n placeholder=\"Message everyone\"\n ariaLabel=\"Message everyone\"\n sendLabel=\"Send\"\n maxLength={CALL_CHAT_MAX_CHARS}\n busy={false}\n onSend={(text) =>\n chat.send(text).then(\n () => true,\n (err: Error) => {\n notify(`Could not send the message: ${err.message}`, 'error')\n return false\n }\n )\n }\n testId=\"webinar-chat-composer\"\n />\n </div>\n </div>\n )\n}\n","/**\n * The webinar's side panel: one `CallSidePanel` with tabs, for the team (under the video, People |\n * Q&A | Chat | Audience) and the audience (the viewer's side, Q&A | Chat). Each view appears once:\n * People — the team's participant list (the stage: visible people only), passed in;\n * Q&A — `QAPanel`, the team moderating;\n * Chat — the live chat, only while the audience may chat (`chat = everyone`);\n * Audience — `WebinarAudiencePanel` (hands queue, everyone in the room), moderators only.\n * An attendee never sees a list of attendees.\n */\n\nimport { useEffect, useMemo, type ReactElement, type ReactNode } from 'react'\nimport {\n CallSidePanel,\n QAPanel,\n WebinarAudiencePanel,\n type CallSidePanelTab,\n type WebinarQuestion,\n} from '../ui'\nimport type { InCallChatState, WebinarControl } from '@arbidocs/react/calls'\nimport { CallUserPill } from './CallUserPill'\nimport { WebinarChat } from './WebinarChat'\n\nexport type WebinarTab = 'people' | 'qa' | 'chat' | 'audience'\n\n/** The moderators' audience list is read again this often while it is on screen (hidden joins are silent). */\nconst AUDIENCE_REFRESH_MS = 10_000\n\n/** The tabs this person gets, in order. */\nfunction webinarTabs(\n webinar: Pick<WebinarControl, 'moderator' | 'team' | 'chat' | 'questions' | 'hands'>,\n opts: { people: boolean; unreadChat: number }\n): CallSidePanelTab[] {\n const open = webinar.questions.filter((q) => q.status === 'open' || q.status === 'answering')\n return [\n ...(opts.people ? [{ id: 'people', label: 'People', testId: 'webinar-tab-people' }] : []),\n { id: 'qa', label: 'Q&A', count: open.length, testId: 'webinar-tab-qa' },\n ...(webinar.chat === 'everyone'\n ? [\n {\n id: 'chat',\n label: 'Chat',\n count: opts.unreadChat || undefined,\n testId: 'webinar-tab-chat',\n },\n ]\n : []),\n ...(webinar.moderator\n ? [\n {\n id: 'audience',\n label: 'Audience',\n count: webinar.hands.length || undefined,\n testId: 'webinar-tab-audience',\n },\n ]\n : []),\n ]\n}\n\nfunction WebinarQA({ webinar }: { webinar: WebinarControl }): ReactElement {\n const questions = useMemo<WebinarQuestion[]>(\n () =>\n webinar.questions.map((q) => ({\n id: q.external_id,\n body: q.text,\n status: q.status,\n answer: q.answerText,\n answeredBy: q.answered_by_ext_id ? (\n <CallUserPill identity={q.answered_by_ext_id} />\n ) : undefined,\n voteCount: q.vote_count,\n voted: q.voted,\n mine: q.mine,\n createdAt: q.created_at,\n // Who asked is hidden from attendees (another attendee's question): \"Attendee\".\n askerName: q.asker_ext_id ? '' : null,\n asker: q.asker_ext_id ? <CallUserPill identity={q.asker_ext_id} /> : undefined,\n })),\n [webinar.questions]\n )\n return (\n <QAPanel\n questions={questions}\n team={webinar.team}\n onAsk={webinar.ask}\n onVote={(q, up) => webinar.vote(q.id, up)}\n onStatusChange={webinar.team ? (q, s) => webinar.setQuestionStatus(q.id, s) : undefined}\n onAnswer={webinar.team ? (q, text) => webinar.answer(q.id, text) : undefined}\n onDelete={(q) => webinar.removeQuestion(q.id)}\n />\n )\n}\n\nfunction WebinarAudience({ webinar }: { webinar: WebinarControl }): ReactElement {\n const { refresh } = webinar\n useEffect(() => {\n void refresh()\n const id = setInterval(() => void refresh(), AUDIENCE_REFRESH_MS)\n return () => clearInterval(id)\n }, [refresh])\n return (\n <WebinarAudiencePanel\n className=\"min-h-0 flex-1 overflow-y-auto\"\n hands={webinar.hands.map((h) => ({\n id: h.identity,\n name: h.name,\n raisedAt: h.raised_at,\n entity: <CallUserPill identity={h.identity} name={h.name} size=\"sm\" />,\n }))}\n attendees={webinar.attendees.map((a) => ({\n id: a.identity,\n name: a.name,\n role: a.role,\n onStage: a.on_stage,\n handRaised: a.hand_raised,\n entity: <CallUserPill identity={a.identity} name={a.name} size=\"sm\" />,\n }))}\n onPromote={webinar.promote}\n onDemote={webinar.demote}\n />\n )\n}\n\nexport function WebinarSidePanel({\n webinar,\n chat,\n people,\n tab,\n onTabChange,\n onClose,\n className,\n}: {\n webinar: WebinarControl\n chat: InCallChatState\n /** The team's People view (omitted for the audience). */\n people?: ReactNode\n tab: WebinarTab\n onTabChange(tab: WebinarTab): void\n onClose(): void\n className?: string\n}): ReactElement {\n const tabs = webinarTabs(webinar, { people: !!people, unreadChat: chat.unread })\n // A tab that went away (the chat closed to the audience) falls back to the first.\n const current = tabs.some((t) => t.id === tab) ? tab : (tabs[0].id as WebinarTab)\n return (\n <CallSidePanel\n title=\"Webinar\"\n tabs={tabs}\n activeTab={current}\n onTabChange={(id) => onTabChange(id as WebinarTab)}\n onClose={onClose}\n closeLabel=\"Close panel\"\n closeTestId=\"webinar-panel-close\"\n className={className}\n data-testid=\"webinar-panel\"\n >\n {current === 'people' && people}\n {current === 'qa' && <WebinarQA webinar={webinar} />}\n {current === 'chat' && <WebinarChat chat={chat} />}\n {current === 'audience' && <WebinarAudience webinar={webinar} />}\n </CallSidePanel>\n )\n}\n","/**\n * ConnectedCallRoom — one LiveKit room, composed from `@arbidocs/blocks/calls`: the call panel (header with\n * the status chips and the view switch, \"Speaking: …\", the speaker or gallery view, the people\n * list, the control bar) or, minimised, the small card. Audio first: who is talking is measured\n * here, fast (`voice-levels`), and drives the rings, the spotlight and the live speaker list.\n * Chat and the transcript live in the call's conversation, beside the panel.\n *\n * The room itself, end-to-end encrypted under the call key, is `useCallRoom` (`@arbidocs/react/calls`).\n * With no key (a session without client keys) the call still connects, unencrypted, and says so.\n *\n * Heavy (pulls livekit-client): always import this module lazily.\n */\n\nimport { useEffect, useMemo, useRef, useState, type ReactElement } from 'react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport {\n ConnectionQuality,\n ConnectionState,\n DisconnectReason,\n MediaDeviceFailure,\n Track,\n} from 'livekit-client'\nimport {\n isTrackReference,\n LiveKitRoom,\n ParticipantName,\n RoomAudioRenderer,\n useConnectionQualityIndicator,\n useConnectionState,\n useIsEncrypted,\n useIsMuted,\n useLocalParticipant,\n useParticipants,\n useParticipantTile,\n useRoomContext,\n useTracks,\n useTrackToggle,\n VideoTrack,\n type TrackReferenceOrPlaceholder,\n} from '@livekit/components-react'\nimport { ArrowDownToLine, MessageCircleQuestion, TriangleAlert } from 'lucide-react'\nimport {\n callSession,\n classifyMediaError,\n useArbi,\n useCallSession,\n useMeetingReadOnly,\n DEFAULT_JOIN_CHOICES,\n} from '@arbidocs/react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport {\n BackstageBanner,\n CallFocus,\n CallGrid,\n CallHeader,\n CallNotice,\n CallParticipants,\n CallStageFrame,\n CallStateMessage,\n CallTile,\n type CallTileSize,\n chatPermissionSection,\n ConnectionOverlay,\n EncryptionStatusChip,\n initialsOf,\n LobbyRequests,\n MinimisedCall,\n NOTICE_MS,\n OnStageCheck,\n pickSpotlight,\n stageContentHeight,\n SpeakingNow,\n useElementSize,\n WebinarEndConfirm,\n WebinarLiveChip,\n WebinarViewer,\n type CallView,\n type JoinChoices,\n type LeaveOption,\n type MoreMenuItem,\n type MoreMenuSection,\n startVoiceLevels,\n useIsSpeaking,\n useSpeakingIds,\n useSpotlightId,\n useVoiceLevel,\n useVoiceLevels,\n type VoiceSource,\n} from '../ui'\nimport type { calls } from '@arbidocs/sdk/browser'\nimport {\n useCallRoom,\n useMuteRequests,\n useHostMuteNotice,\n useCallTranscriber,\n type CallTranscription,\n useCallRecorder,\n type CallRecordingControl,\n useInCallChat,\n useWebinar,\n type WebinarControl,\n} from '@arbidocs/react/calls'\nimport { CaptionsOverlay, TranscriptionIndicator, TranscriptionSender } from './CallTranscription'\nimport {\n CompositeRecorder,\n RecordingIndicator,\n RecordingQuotaWarning,\n SpeakerRecorder,\n} from './CallRecording'\nimport { MODE_LABEL } from '../recording-labels'\nimport { CallControls, EnableAudioButton, type ControlDensity } from './CallControls'\nimport { useMirrorSelfView } from '../self-view'\nimport { CallUserPill } from './CallUserPill'\nimport { publishCallStatus } from '../call-status'\nimport { WebinarSidePanel, type WebinarTab } from './WebinarSidePanel'\n\n/** The webinar viewer's width (px) from which its Q&A column docks beside the stage (`@3xl`). */\nconst VIEWER_SIDE_DOCKS_AT = 768\n/** The stage's box while minimised (laid out, invisible, for the host's video recording). */\nconst OFFSCREEN_STAGE = { top: 0, left: 0, width: 960, height: 540 }\n/** \"Please mute\" requests between participants (a request: the person decides). */\n\nexport interface ConnectedCallRoomProps {\n tokenResponse: calls.CallTokenResponse\n /** The call's E2EE frame key K, or null to join without end-to-end encryption. */\n e2eeKey: Uint8Array | null\n /** Called once the local participant has left (button, kick, room closed, error). */\n onLeave(): void\n /** Devices and mic/camera state picked in the pre-join (default: mic on, camera off). */\n choices?: JoinChoices\n /** The creator may remove participants and turns transcription on or off. */\n isCreator?: boolean\n /** A thread call: the workspace it is locked to (its guests get a read-only meeting chat). */\n lockedWorkspaceExtId?: string | null\n /** The call's name in the header. */\n title?: string\n /** When the call started (the elapsed time). */\n startedAt?: number\n /** The join link \"Copy call link\" copies. */\n link?: string | null\n /** Shown as the small minimised card instead of the panel. */\n minimized?: boolean\n /**\n * Where the stage sits while minimised (viewport pixels). The host's \"Audio + video\" recording\n * draws the stage, so while it runs the stage stays laid out there, invisible and inert,\n * instead of collapsing — the recording keeps its picture.\n */\n stageRect?: { top: number; left: number; width: number; height: number } | null\n onMinimizedChange?(minimized: boolean): void\n /** Live transcription turned on or off. */\n onTranscriptionChange?(on: boolean): void\n /** Recording turned on or off. */\n onRecordingChange?(on: boolean): void\n /**\n * A webinar: my role (the server's `CallResponse.webinar.my_role`). The audience gets the viewer\n * and never publishes; the team gets this call UI with the webinar's controls.\n */\n webinarRole?: calls.WebinarRole | null\n /** The room was closed for everyone (a webinar ended): instead of `onLeave`, when given. */\n onRoomClosed?(): void\n /** The webinar viewer (off stage) is shown, or the call panel again: the dock places it. */\n onViewerChange?(viewer: boolean): void\n className?: string\n}\n\nexport function ConnectedCallRoom({\n tokenResponse,\n e2eeKey,\n onLeave,\n choices = DEFAULT_JOIN_CHOICES,\n isCreator = false,\n lockedWorkspaceExtId,\n title = 'Call',\n startedAt,\n link = null,\n minimized = false,\n stageRect = null,\n onMinimizedChange,\n onTranscriptionChange,\n onRecordingChange,\n webinarRole = null,\n onRoomClosed,\n onViewerChange,\n className,\n}: ConnectedCallRoomProps): ReactElement {\n const { notify } = useBlocksEnvironment()\n const { room, error: setupError } = useCallRoom(e2eeKey, choices)\n const [joinedAt] = useState(() => startedAt ?? Date.now())\n\n if (setupError) {\n return (\n <div className={cn('flex flex-col items-center justify-center gap-3 p-6', className)}>\n <TriangleAlert className=\"size-6 text-destructive\" aria-hidden />\n <p className=\"text-center text-sm text-muted-foreground\">{setupError}</p>\n <Button type=\"button\" variant=\"outline\" onClick={onLeave}>\n Close\n </Button>\n </div>\n )\n }\n\n if (!room) {\n return <CallStateMessage title=\"Connecting…\" testId=\"call-connecting\" />\n }\n\n return (\n <LiveKitRoom\n room={room}\n serverUrl={tokenResponse.server_url}\n token={tokenResponse.token}\n connect\n // A webinar's audience cannot publish: never ask for a microphone or camera.\n audio={choices.audioEnabled && webinarRole !== 'attendee'}\n video={choices.videoEnabled && webinarRole !== 'attendee'}\n data-testid=\"call-room\"\n className={cn('flex size-full min-h-0 flex-col overflow-hidden', className)}\n onDisconnected={(reason?: DisconnectReason) => {\n console.debug('[calls] disconnected', reason)\n if (reason === DisconnectReason.ROOM_DELETED && onRoomClosed) onRoomClosed()\n else onLeave()\n }}\n onError={(err: Error) => {\n console.error('[calls] room error', err)\n notify(`Call error: ${err.message}`, 'error')\n }}\n onEncryptionError={(err: Error) => {\n console.error('[calls] encryption error', err)\n notify('Call encryption error — media may not be decryptable.', 'error')\n }}\n onMediaDeviceFailure={(failure?: MediaDeviceFailure, kind?: MediaDeviceKind) => {\n const device = kind === 'videoinput' ? 'camera' : 'microphone'\n const name =\n failure === MediaDeviceFailure.PermissionDenied\n ? 'NotAllowedError'\n : failure === MediaDeviceFailure.NotFound\n ? 'NotFoundError'\n : 'Error'\n notify(classifyMediaError(new DOMException(failure ?? '', name), device), 'error')\n }}\n >\n <CallBody\n callExtId={tokenResponse.call_ext_id}\n linkVersion={tokenResponse.link_version}\n lockedWorkspaceExtId={lockedWorkspaceExtId ?? null}\n e2eeKey={e2eeKey}\n isCreator={isCreator}\n title={title}\n startedAt={joinedAt}\n link={link}\n minimized={minimized}\n stageRect={stageRect}\n onMinimizedChange={onMinimizedChange}\n onTranscriptionChange={onTranscriptionChange}\n onRecordingChange={onRecordingChange}\n webinarRole={webinarRole}\n onViewerChange={onViewerChange}\n />\n <RoomAudioRenderer />\n </LiveKitRoom>\n )\n}\n\n/** Feeds `voice-levels` from every microphone in the room (mine included). */\nfunction useRoomVoiceLevels(): void {\n const mics = useTracks([{ source: Track.Source.Microphone, withPlaceholder: true }], {\n onlySubscribed: false,\n })\n const sources = useRef<VoiceSource[]>([])\n sources.current = mics.map((t) => ({\n identity: t.participant.identity,\n track: isTrackReference(t) ? (t.publication.track?.mediaStreamTrack ?? null) : null,\n muted: !isTrackReference(t) || t.publication.isMuted,\n local: t.participant.isLocal,\n }))\n useEffect(() => startVoiceLevels(() => sources.current), [])\n}\n\n/**\n * Inside <LiveKitRoom>: the call's state hooks, then the panel or the minimised card. In a webinar\n * the audience (off stage) gets the viewer instead of the panel; the team gets the panel with the\n * webinar's banner, controls and side panel.\n */\nfunction CallBody({\n callExtId,\n linkVersion,\n lockedWorkspaceExtId,\n e2eeKey,\n isCreator,\n title,\n startedAt,\n link,\n minimized,\n stageRect,\n onMinimizedChange,\n onTranscriptionChange,\n onRecordingChange,\n webinarRole,\n onViewerChange,\n}: {\n callExtId: string\n linkVersion: number\n lockedWorkspaceExtId: string | null\n e2eeKey: Uint8Array | null\n isCreator: boolean\n title: string\n startedAt: number\n link: string | null\n minimized: boolean\n stageRect: { top: number; left: number; width: number; height: number } | null\n onMinimizedChange?(minimized: boolean): void\n onTranscriptionChange?(on: boolean): void\n onRecordingChange?(on: boolean): void\n webinarRole: calls.WebinarRole | null\n onViewerChange?(viewer: boolean): void\n}): ReactElement {\n const room = useRoomContext()\n const [view, setView] = useState<CallView>('speaker')\n const webinar = useWebinar({\n role: webinarRole,\n callExtId,\n linkVersion,\n callKey: e2eeKey,\n })\n // Off stage (the audience, or a promoted person still checking their devices): the viewer,\n // which the dock gives the main area (there is no conversation beside it).\n const audienceView = webinar.enabled && (!webinar.onStage || webinar.stageCheck)\n useEffect(() => {\n onViewerChange?.(audienceView)\n }, [audienceView, onViewerChange])\n // Only the stage is ever sent to the transcriber or recorded (the server refuses the rest).\n const sendsMedia = !webinar.enabled || webinar.onStage\n // A workspace guest on a thread call reads the meeting chat but cannot post to it; a webinar's\n // meeting chat is its team's.\n const readOnly = useMeetingReadOnly(lockedWorkspaceExtId)\n const transcription = useCallTranscriber({\n callExtId,\n callKey: e2eeKey,\n isCreator,\n canPost: !readOnly && (!webinar.enabled || webinar.team),\n linkVersion,\n })\n useEffect(() => {\n onTranscriptionChange?.(transcription.on)\n }, [transcription.on, onTranscriptionChange])\n // The call's conversation (beside the panel) reads this for its empty state and live rows.\n useEffect(() => {\n publishCallStatus({ callExtId, transcribing: transcription.on })\n }, [callExtId, transcription.on])\n useEffect(() => () => publishCallStatus({ callExtId: null, transcribing: false }), [])\n const recording = useCallRecorder({ callExtId, callKey: e2eeKey, isCreator, linkVersion })\n useEffect(() => {\n onRecordingChange?.(recording.on)\n }, [recording.on, onRecordingChange])\n // \"Recording — started by X\" is spelled out once per recording / transcription, on its own line\n // under the header (the chips stay short, so the title keeps its room).\n const notices = useCallNotices(recording, transcription)\n\n // The webinar's side panel: open under the video for the team, a toggle in the viewer.\n const [teamPanelOpen, setTeamPanelOpen] = useState(true)\n const [endConfirm, setEndConfirm] = useState(false)\n // The viewer's Q&A column: open by default where it docks beside the stage (wide), closed where\n // it would cover it (narrow), until toggled.\n const [viewerSide, setViewerSide] = useState<boolean | null>(null)\n const [tab, setTab] = useState<WebinarTab>('people')\n const [frameRef, frame] = useElementSize<HTMLDivElement>()\n const viewerSideOpen = viewerSide ?? frame.width >= VIEWER_SIDE_DOCKS_AT\n const sideOpen = audienceView ? viewerSideOpen : teamPanelOpen\n // A webinar's live chat, only while the audience may chat (the team's messages are also kept).\n const chat = useInCallChat({\n callExtId,\n callKey: webinar.enabled && webinar.chat === 'everyone' ? e2eeKey : null,\n open: sideOpen && tab === 'chat',\n persist: webinar.team,\n })\n\n useRoomVoiceLevels()\n const askToMute = useMuteRequests()\n useHostMuteNotice(callExtId)\n const participants = useParticipants()\n const speakingIds = useSpeakingIds()\n const speakingNames = useMemo(\n () =>\n speakingIds\n .map((id) => participants.find((p) => p.identity === id))\n .filter((p): p is NonNullable<typeof p> => !!p)\n .map((p) => <CallUserPill key={p.identity} identity={p.identity} name={p.name} />),\n [speakingIds, participants]\n )\n\n const stageRef = useRef<HTMLDivElement | null>(null)\n // The tiles' shape (speaker view with a filmstrip, or a grid), to size the video to them.\n const { share, cameras } = useStageTracks()\n const stageShape = {\n view:\n share || (view === 'speaker' && cameras.length >= 2) ? ('focus' as const) : ('grid' as const),\n count: cameras.length + (share ? 1 : 0),\n }\n const drawsComposite = recording.on && recording.canControl && recording.mode === 'audio_video'\n const density: ControlDensity =\n frame.width === 0 || frame.width >= 620 ? 'full' : frame.width >= 400 ? 'compact' : 'tiny'\n const shortPanel = frame.height > 0 && frame.height < 520\n const [mirrorSelf] = useMirrorSelfView()\n\n const status = (small: boolean) => (\n <>\n {webinar.enabled && webinar.live && <WebinarLiveChip compact={small} />}\n <StatusChips\n transcription={transcription}\n recording={recording}\n isE2ee={!!e2eeKey}\n compact={small}\n />\n </>\n )\n const header = !minimized && (\n <CallHeader\n title={title}\n status={status}\n view={audienceView ? undefined : view}\n onViewChange={audienceView ? undefined : setView}\n onMinimise={onMinimizedChange ? () => onMinimizedChange(true) : undefined}\n />\n )\n const participantsList = (compact: boolean) => (\n <ParticipantsList\n callExtId={callExtId}\n isCreator={isCreator}\n speakingIds={speakingIds}\n onAskToMute={isCreator ? askToMute : undefined}\n compact={compact}\n />\n )\n const sidePanel = (opts: { people: boolean; onClose(): void; className?: string }) => (\n <WebinarSidePanel\n webinar={webinar}\n chat={chat}\n people={opts.people ? participantsList(false) : undefined}\n tab={tab}\n onTabChange={setTab}\n onClose={opts.onClose}\n className={opts.className}\n />\n )\n\n return (\n <>\n {sendsMedia && transcription.available && (\n <TranscriptionSender transcription={transcription} />\n )}\n {/* Everyone on stage records their own microphone (workspace guests too); the host also the\n composite. A webinar's audience never sends audio. */}\n {sendsMedia && <SpeakerRecorder recording={recording} callKey={e2eeKey} />}\n {recording.canControl && recording.mode === 'audio_video' && (\n <CompositeRecorder recording={recording} callKey={e2eeKey} stageRef={stageRef} />\n )}\n <RecordingQuotaWarning recording={recording} />\n {webinar.moderator && (\n <WebinarEndConfirm open={endConfirm} onOpenChange={setEndConfirm} onEnd={webinar.end} />\n )}\n {webinar.stageCheck && (\n <OnStageCheck\n initialChoices={DEFAULT_JOIN_CHOICES}\n open\n mirror={mirrorSelf}\n describeError={(err, kind) => classifyMediaError(err, kind)}\n onJoinStage={webinar.joinStage}\n onStayInAudience={webinar.stepDown}\n />\n )}\n {/* The stage stays mounted while minimised: the composite recording keeps its element, and\n the status chips move to the card, so each is shown exactly once. While the host records\n video it stays laid out (invisible, inert, behind the card) so the recording keeps\n drawing the call; otherwise it is simply hidden. */}\n <div\n ref={frameRef}\n className={cn(\n 'min-h-0 flex-1',\n !minimized\n ? 'flex'\n : drawsComposite\n ? 'pointer-events-none fixed flex opacity-0'\n : 'hidden'\n )}\n style={minimized && drawsComposite ? (stageRect ?? OFFSCREEN_STAGE) : undefined}\n aria-hidden={minimized || undefined}\n inert={minimized || undefined}\n data-testid=\"call-stage-frame\"\n >\n {audienceView ? (\n <WebinarViewer\n header={header}\n stage={<CallTiles view=\"speaker\" includeLocal={false} />}\n stageRef={stageRef}\n stageOverlay={<ConnectingOverlay />}\n captions={\n transcription.on || transcription.captions.length > 0 ? (\n <CaptionsOverlay captions={transcription.captions} />\n ) : undefined\n }\n side={\n viewerSideOpen\n ? sidePanel({\n people: false,\n onClose: () => setViewerSide(false),\n className: 'size-full',\n })\n : undefined\n }\n sideToggle={{\n open: viewerSideOpen,\n onToggle: () => setViewerSide(!viewerSideOpen),\n label: webinar.chat === 'everyone' ? 'Q&A and chat' : 'Q&A',\n count: openQuestionCount(webinar) + chat.unread,\n }}\n hand={{ raised: webinar.handRaised, onToggle: webinar.setHand }}\n onLeave={() => void room.disconnect()}\n left={<EnableAudioButton compact={density !== 'full'} />}\n shortcuts={!minimized}\n />\n ) : (\n <CallStageFrame\n stageRef={stageRef}\n header={header}\n subheader={\n !minimized && (\n <>\n {webinar.team && !webinar.live && (\n <BackstageBanner onGoLive={webinar.moderator ? webinar.goLive : undefined} />\n )}\n {notices.map((n) => (\n <CallNotice key={n}>{n}</CallNotice>\n ))}\n <SpeakingNow names={speakingNames} />\n </>\n )\n }\n stage={<CallTiles view={view} />}\n stageOverlay={\n <>\n <Lobby callExtId={callExtId} />\n <ConnectingOverlay />\n </>\n }\n // Who is in the call, always on show under the video (a strip in a short panel); in a\n // webinar, the first tab of its side panel.\n people={\n !minimized &&\n (!webinar.enabled\n ? participantsList(shortPanel)\n : teamPanelOpen &&\n sidePanel({\n people: true,\n onClose: () => setTeamPanelOpen(false),\n className: cn(\n 'border-t border-border',\n shortPanel ? 'h-64 shrink-0' : 'min-h-0 flex-1'\n ),\n }))\n }\n stageHeight={\n shortPanel\n ? undefined\n : (w, h) => stageContentHeight(stageShape.view, w, h, stageShape.count)\n }\n controls={\n !minimized && (\n <CallControls\n callExtId={callExtId}\n isCreator={isCreator}\n link={link}\n startedAt={startedAt}\n density={density}\n shortcuts={!minimized}\n transcription={transcription}\n recording={recording}\n {...webinarControls(webinar, {\n panelOpen: teamPanelOpen,\n onOpenPanel: () => setTeamPanelOpen(true),\n unread: chat.unread,\n onEnd: () => setEndConfirm(true),\n })}\n />\n )\n }\n />\n )}\n </div>\n {minimized && (\n <MinimisedRoom\n title={title}\n status={status(true)}\n speakingNames={speakingNames}\n audience={audienceView}\n onRestore={() => onMinimizedChange?.(false)}\n onLeave={() => void room.disconnect()}\n />\n )}\n </>\n )\n}\n\n/** Questions still waiting for an answer (the badge on the Q&A toggles). */\nfunction openQuestionCount(webinar: WebinarControl): number {\n return webinar.questions.filter((q) => q.status === 'open' || q.status === 'answering').length\n}\n\n/**\n * The team's webinar controls, all inside the call's existing controls so the bar never grows: in\n * More, the chat setting (moderators), \"Show the webinar panel\" while it is closed, and Leave stage\n * (anyone on stage but the host); End webinar is the Leave button's second choice (moderators,\n * while live). Nothing outside a webinar.\n */\nfunction webinarControls(\n webinar: WebinarControl,\n opts: { panelOpen: boolean; onOpenPanel(): void; unread: number; onEnd(): void }\n): {\n menuGroups?: (MoreMenuItem[] | MoreMenuSection)[]\n leaveOptions?: LeaveOption[]\n} {\n if (!webinar.enabled) return {}\n const badge = openQuestionCount(webinar) + webinar.hands.length + opts.unread\n const items: MoreMenuItem[] = [\n ...(!opts.panelOpen\n ? [\n {\n key: 'webinar-panel',\n label: 'Show the webinar panel',\n icon: <MessageCircleQuestion />,\n onSelect: opts.onOpenPanel,\n trailing: badge ? (\n <span className=\"text-xs tabular-nums text-muted-foreground\">{badge}</span>\n ) : undefined,\n testId: 'webinar-panel-open',\n },\n ]\n : []),\n ...(webinar.role !== 'host'\n ? [\n {\n key: 'leave-stage',\n label: 'Leave stage',\n icon: <ArrowDownToLine />,\n onSelect: () => void webinar.stepDown().catch(() => {}),\n testId: 'webinar-leave-stage',\n },\n ]\n : []),\n ]\n return {\n menuGroups: [\n ...(webinar.moderator\n ? [chatPermissionSection({ value: webinar.chat, onChange: webinar.setChat })]\n : []),\n items,\n ],\n leaveOptions:\n webinar.moderator && webinar.live\n ? [\n {\n key: 'end',\n label: 'End webinar for everyone',\n onSelect: opts.onEnd,\n testId: 'webinar-end',\n },\n ]\n : undefined,\n }\n}\n\n/**\n * The \"started by\" sentences of a recording / transcription that just began, each shown for\n * {@link NOTICE_MS} under the header (once per recording or transcription).\n */\nfunction useCallNotices(\n recording: CallRecordingControl,\n transcription: CallTranscription\n): string[] {\n const [shown, setShown] = useState<Record<string, string>>({})\n const recordingText = recording.on\n ? `Recording${recording.mode ? ` (${MODE_LABEL[recording.mode]})` : ''} — started by ${\n recording.startedByMe ? 'you' : recording.startedByName || 'the host'\n }`\n : null\n const transcriptionText = transcription.on\n ? `Transcription on — started by ${\n transcription.startedByMe ? 'you' : transcription.startedByName || 'a participant'\n }`\n : null\n useNotice('recording', recordingText, setShown)\n useNotice('transcription', transcriptionText, setShown)\n return Object.values(shown)\n}\n\nfunction useNotice(\n key: string,\n text: string | null,\n setShown: (fn: (s: Record<string, string>) => Record<string, string>) => void\n): void {\n const on = !!text\n const latest = useRef(text)\n latest.current = text\n useEffect(() => {\n if (!on) return\n setShown((s) => ({ ...s, [key]: latest.current ?? '' }))\n const id = setTimeout(\n () =>\n setShown((s) => {\n const next = { ...s }\n delete next[key]\n return next\n }),\n NOTICE_MS\n )\n return () => {\n clearTimeout(id)\n setShown((s) => {\n const next = { ...s }\n delete next[key]\n return next\n })\n }\n }, [on, key, setShown])\n useEffect(() => {\n if (text) setShown((s) => (key in s && s[key] !== text ? { ...s, [key]: text } : s))\n }, [text, key, setShown])\n}\n\n/** Recording, transcription and encryption, each once. */\nfunction StatusChips({\n transcription,\n recording,\n isE2ee,\n compact,\n}: {\n transcription: CallTranscription\n recording: CallRecordingControl\n isE2ee: boolean\n compact: boolean\n}): ReactElement {\n const { localParticipant } = useLocalParticipant()\n const encrypted = useIsEncrypted(localParticipant)\n return (\n <span className=\"flex items-center gap-1.5\" data-testid=\"call-status\">\n {/* The legal notices: shown BEFORE anything is captured (their mount gates the recorders). */}\n {recording.on && (\n <RecordingIndicator recording={recording} compact={compact} announce={false} />\n )}\n {transcription.on && (\n <TranscriptionIndicator transcription={transcription} compact={compact} announce={false} />\n )}\n <EncryptionStatusChip\n state={isE2ee ? (encrypted ? 'on' : 'pending') : 'off'}\n compact={compact}\n />\n </span>\n )\n}\n\nconst trackKey = (t: TrackReferenceOrPlaceholder) =>\n `${t.participant.identity}:${t.source}:${isTrackReference(t) ? t.publication.trackSid : 'placeholder'}`\n\n/** A LiveKit participant as an ARBI tile (keeps LiveKit's tile attributes for the recorder). */\nfunction RoomTile({\n trackRef,\n size = 'md',\n}: {\n trackRef: TrackReferenceOrPlaceholder\n size?: CallTileSize\n}): ReactElement {\n const { participant } = trackRef\n const { elementProps } = useParticipantTile<HTMLDivElement>({ trackRef, htmlProps: {} })\n const screen = trackRef.source === Track.Source.ScreenShare\n const videoMuted = useIsMuted(trackRef)\n const micMuted = useIsMuted({ participant, source: Track.Source.Microphone })\n const speaking = useIsSpeaking(participant.identity)\n const level = useVoiceLevel(participant.identity)\n const { quality } = useConnectionQualityIndicator({ participant })\n const hasVideo = isTrackReference(trackRef) && !!trackRef.publication.track && !videoMuted\n const name = participant.name || participant.identity\n const [mirrorSelf] = useMirrorSelfView()\n return (\n <CallTile\n {...elementProps}\n name={\n <>\n <CallUserPill\n identity={participant.identity}\n name={participant.name}\n variant={size === 'sm' ? 'icon' : 'pill'}\n />\n {/* The host's composite recording reads the name from LiveKit's element. */}\n <ParticipantName participant={participant} hidden />\n </>\n }\n initials={initialsOf(name)}\n video={hasVideo ? <VideoTrack trackRef={trackRef} /> : undefined}\n source={screen ? 'screen' : 'camera'}\n local={participant.isLocal}\n mirror={participant.isLocal && !screen && mirrorSelf}\n speaking={speaking}\n level={level}\n micMuted={micMuted}\n poorConnection={quality === ConnectionQuality.Poor || quality === ConnectionQuality.Lost}\n size={size}\n />\n )\n}\n\n/**\n * Cameras (with placeholders) and screen shares in the room. A webinar's audience is not on the\n * stage, so its viewer leaves me out (`includeLocal` false); LiveKit already hides the others.\n */\nfunction useStageTracks(includeLocal = true) {\n const all = useTracks(\n [\n { source: Track.Source.Camera, withPlaceholder: true },\n { source: Track.Source.ScreenShare, withPlaceholder: false },\n ],\n { onlySubscribed: false }\n )\n const tracks = includeLocal ? all : all.filter((t) => !t.participant.isLocal)\n const share = tracks.find(\n (t) => isTrackReference(t) && t.publication.source === Track.Source.ScreenShare\n )\n const cameras = tracks.filter((t) => t.source === Track.Source.Camera)\n return { share, cameras }\n}\n\n/** The camera to put in the spotlight: the dominant speaker, else someone else, else me. */\nfunction useSpotlightCamera(\n cameras: TrackReferenceOrPlaceholder[]\n): TrackReferenceOrPlaceholder | undefined {\n const spotlight = useSpotlightId()\n // Never me in the large slot while anyone else is in the call.\n const id = pickSpotlight(\n cameras.map((t) => ({ id: t.participant.identity, local: t.participant.isLocal })),\n spotlight\n )\n return cameras.find((t) => t.participant.identity === id)\n}\n\n/**\n * Speaker view: a shared screen, else the dominant speaker, large; everyone else in a filmstrip.\n * Gallery view: everyone equal (a shared screen still takes the large slot).\n */\nfunction CallTiles({\n view,\n includeLocal = true,\n}: {\n view: CallView\n includeLocal?: boolean\n}): ReactElement {\n const { share, cameras } = useStageTracks(includeLocal)\n const spotlight = useSpotlightCamera(cameras)\n const focus = share ?? (view === 'speaker' ? spotlight : undefined)\n if (!focus || (cameras.length < 2 && !share)) {\n return (\n <CallGrid items={cameras} getKey={trackKey} renderTile={(t) => <RoomTile trackRef={t} />} />\n )\n }\n return (\n <CallFocus\n focus={focus}\n others={cameras.filter((t) => t !== focus)}\n getKey={trackKey}\n renderTile={(t, size) => <RoomTile trackRef={t} size={size} />}\n testId={share ? 'call-focus' : 'call-speaker-view'}\n />\n )\n}\n\nfunction MinimisedRoom({\n title,\n status,\n speakingNames,\n audience = false,\n onRestore,\n onLeave,\n}: {\n title: string\n status: ReactElement\n speakingNames: ReactElement[]\n /** A webinar's audience: not on the stage, no microphone or camera. */\n audience?: boolean\n onRestore(): void\n onLeave(): void\n}): ReactElement {\n const { share, cameras } = useStageTracks(!audience)\n const spotlight = useSpotlightCamera(cameras)\n const track = share ?? spotlight\n const mic = useTrackToggle({ source: Track.Source.Microphone })\n const camera = useTrackToggle({ source: Track.Source.Camera })\n return (\n <MinimisedCall\n title={title}\n video={track ? <RoomTile trackRef={track} size=\"sm\" /> : null}\n status={status}\n speaking={<SpeakingNow names={speakingNames} className=\"text-xs\" />}\n micEnabled={audience ? undefined : mic.enabled}\n onToggleMic={audience ? undefined : () => void mic.toggle()}\n cameraEnabled={audience ? undefined : camera.enabled}\n onToggleCamera={audience ? undefined : () => void camera.toggle()}\n onRestore={onRestore}\n onLeave={onLeave}\n />\n )\n}\n\n/**\n * Who is in the room, as a live speaker list (talkers first, each with a voice meter and mic\n * state). The host can ask someone to mute (a request), mute their mic or turn off their camera\n * (they may turn it back on), and remove them (LiveKit RemoveParticipant).\n */\nfunction ParticipantsList({\n callExtId,\n isCreator,\n speakingIds,\n onAskToMute,\n compact,\n}: {\n callExtId: string\n isCreator: boolean\n speakingIds: string[]\n onAskToMute?(identity: string): void\n /** A short panel: one strip with \"Show all (N)\". */\n compact: boolean\n}): ReactElement {\n const { notify } = useBlocksEnvironment()\n const arbi = useArbi()\n const participants = useParticipants()\n const [removing, setRemoving] = useState<string | null>(null)\n const remove = async (identity: string, name: string) => {\n setRemoving(identity)\n try {\n await arbi.calls.removeParticipant(callExtId, identity)\n notify(`Removed ${name} from the call`, 'info')\n } catch (err) {\n notify(`Could not remove ${name}: ${(err as Error).message}`, 'error')\n } finally {\n setRemoving(null)\n }\n }\n // Re-renders with the levels (≤ every 60 ms): a short list, and that is the point.\n const mute = async (identity: string, name: string, track: 'audio' | 'video') => {\n try {\n await arbi.calls.muteParticipant(callExtId, identity, track)\n notify(track === 'audio' ? `Muted ${name}` : `Turned off ${name}’s camera`, 'info')\n } catch (err) {\n notify(\n `Could not ${track === 'audio' ? 'mute' : 'turn off the camera of'} ${name}: ${(err as Error).message}`,\n 'error'\n )\n }\n }\n const levels = useVoiceLevels()\n const ordered = [\n ...speakingIds\n .map((id) => participants.find((p) => p.identity === id))\n .filter((p): p is NonNullable<typeof p> => !!p),\n ...participants.filter((p) => !speakingIds.includes(p.identity)),\n ]\n return (\n <CallParticipants\n // The list takes the panel's spare height; folded to a strip, the video keeps it.\n className={compact ? undefined : 'flex-1'}\n compact={compact}\n people={ordered.map((p) => ({\n id: p.identity,\n name: p.name || p.identity,\n isLocal: p.isLocal,\n entity: (\n <CallUserPill identity={p.identity} name={p.name} size=\"sm\" interactive={!p.isLocal} />\n ),\n speaking: speakingIds.includes(p.identity),\n level: levels[p.identity] ?? 0,\n micMuted: !p.isMicrophoneEnabled,\n cameraOn: p.isCameraEnabled,\n }))}\n canRemove={isCreator}\n removingId={removing}\n onRemove={(p) => void remove(p.id, p.name)}\n onAskToMute={onAskToMute ? (p) => onAskToMute(p.id) : undefined}\n onMute={isCreator ? (p, track) => void mute(p.id, p.name, track) : undefined}\n />\n )\n}\n\n/** People waiting in the lobby of this call; shown to everyone who may admit them. */\nfunction Lobby({ callExtId }: { callExtId: string }): ReactElement | null {\n const { notify } = useBlocksEnvironment()\n const arbi = useArbi()\n const knocks = useCallSession((s) => s.knocks)\n const mine = knocks.filter((k) => k.callExtId === callExtId)\n const decide = async (knockId: string, admit: boolean) => {\n callSession.removeKnock(knockId)\n try {\n await arbi.calls.decideKnock(callExtId, knockId, admit)\n } catch (err) {\n notify(`Could not answer the request: ${(err as Error).message}`, 'error')\n }\n }\n return (\n <LobbyRequests\n requests={mine.map((k) => ({\n id: k.knockId,\n name: k.displayName,\n entity: <CallUserPill identity={k.userExtId} name={k.displayName} />,\n }))}\n onDecide={(id, admit) => void decide(id, admit)}\n />\n )\n}\n\nfunction ConnectingOverlay(): ReactElement | null {\n const state = useConnectionState()\n if (state === ConnectionState.Connected) return null\n const label =\n state === ConnectionState.Reconnecting || state === ConnectionState.SignalReconnecting\n ? 'Reconnecting…'\n : state === ConnectionState.Disconnected\n ? 'Disconnected'\n : 'Connecting…'\n return <ConnectionOverlay label={label} />\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/calls/connected/CallTranscription.tsx","../src/calls/connected/CallRecording.tsx","../src/calls/connected/CallControls.tsx","../src/calls/connected/WebinarChat.tsx","../src/calls/connected/WebinarSidePanel.tsx","../src/calls/connected/ConnectedCallRoom.tsx"],"names":["jsxs","CallControlButton","jsx","Loader2","Captions","useEffect","TranscriptionStatusChip","useMemo","CaptionsStrip","useLocalParticipant","useCallback","useAudioRecorder","LIVE_SEGMENTER","useIsEntitled","RecordControl","MODE_LABEL","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","Button","RecordingStatusChip","pickRecorderMimeType","useTrackUploader","useRef","RECORDING_CHUNK_MS","SPEAKER_AUDIO_BITS_PER_SECOND","useBlocksEnvironment","useTracks","Track","startCompositeCapture","createChunkedRecorder","COMPOSITE_VIDEO_BITS_PER_SECOND","COMPOSITE_AUDIO_BITS_PER_SECOND","classifyMediaError","useTrackToggle","useMediaDeviceSelect","useMirrorSelfView","MediaControl","useAudioPlayback","Volume2","useArbi","useRoomContext","useServerCallsExperimental","useState","MonitorX","MonitorUp","Square","Circle","Link2","LockOpen","Lock","CallControlBar","Fragment","ElapsedTime","LeaveButton","ControlGroup","ControlDivider","MoreMenu","FlaskConical","MessageListRoot","MessageListEmpty","MessageRoot","MessageContent","MessageAuthor","CallUserPill","MessageBubble","MessageBody","PanelComposer","CALL_CHAT_MAX_CHARS","QAPanel","WebinarAudiencePanel","CallSidePanel","DEFAULT_JOIN_CHOICES","useCallRoom","cn","TriangleAlert","CallStateMessage","LiveKitRoom","DisconnectReason","MediaDeviceFailure","RoomAudioRenderer","isTrackReference","startVoiceLevels","useWebinar","useMeetingReadOnly","useCallTranscriber","publishCallStatus","useCallRecorder","useElementSize","useInCallChat","useMuteRequests","useHostMuteNotice","useParticipants","useSpeakingIds","WebinarLiveChip","CallHeader","WebinarEndConfirm","OnStageCheck","WebinarViewer","CallStageFrame","BackstageBanner","CallNotice","SpeakingNow","stageContentHeight","MessageCircleQuestion","ArrowDownToLine","chatPermissionSection","NOTICE_MS","useIsEncrypted","EncryptionStatusChip","useParticipantTile","useIsMuted","useIsSpeaking","useVoiceLevel","useConnectionQualityIndicator","CallTile","ParticipantName","initialsOf","VideoTrack","ConnectionQuality","useSpotlightId","pickSpotlight","CallGrid","CallFocus","MinimisedCall","useVoiceLevels","CallParticipants","useCallSession","callSession","LobbyRequests","useConnectionState","ConnectionState","ConnectionOverlay"],"mappings":"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","file":"chunk-7IPIKMCY.cjs","sourcesContent":["/**\n * Live transcription in a call, wired to {@link useCallTranscriber}: the CC buttons, the\n * \"Transcribing\" header chip everyone sees, the captions strip, and the invisible sender that\n * records my own microphone. The look comes from `@arbidocs/blocks/calls`.\n */\n\nimport { useCallback, useEffect, useMemo, type ReactElement } from 'react'\nimport { Captions, Loader2 } from 'lucide-react'\nimport { useLocalParticipant } from '@livekit/components-react'\nimport {\n useAudioRecorder,\n type AudioSegment,\n LIVE_SEGMENTER,\n type CaptionLine,\n} from '@arbidocs/react'\nimport { CallControlButton, CaptionsStrip, TranscriptionStatusChip, type CaptionEntry } from '../ui'\nimport type { CallTranscription } from '@arbidocs/react/calls'\n\n/**\n * The host's control-bar CC button: turns transcription on or off (captions for everyone, the\n * transcript kept in the meeting chat). Nobody else sees this one.\n */\nexport function TranscriptionToggle({\n transcription,\n}: {\n transcription: CallTranscription\n}): ReactElement | null {\n const { available, on, canToggle, busy, toggle } = transcription\n if (!available || !canToggle) return null\n const label = on ? 'Stop transcription' : 'Transcribe the call'\n return (\n <CallControlButton\n label={label}\n shortcut=\"C\"\n tone={on ? 'active' : 'neutral'}\n aria-pressed={on}\n disabled={busy}\n onClick={() => void toggle()}\n data-testid=\"transcription-toggle\"\n data-call-shortcut=\"c\"\n >\n {busy ? <Loader2 className=\"animate-spin\" aria-hidden /> : <Captions aria-hidden />}\n <span className=\"sr-only\">{label}</span>\n </CallControlButton>\n )\n}\n\n/**\n * \"Transcription on — started by X\", folding to \"Transcribing\", for everyone while it is on; its\n * mic switch stops my own voice being sent. Mounting it is what lets my audio be sent: it reports\n * itself shown, and unmounting stops sending.\n */\nexport function TranscriptionIndicator({\n transcription,\n compact = false,\n announce = true,\n onAnnounced,\n className,\n}: {\n transcription: CallTranscription\n compact?: boolean\n /** Spell out who started it (false once it has been, e.g. after minimising). */\n announce?: boolean\n onAnnounced?(): void\n className?: string\n}): ReactElement {\n const { setIndicatorShown, startedByName, startedByMe, muted, setMuted } = transcription\n useEffect(() => {\n setIndicatorShown(true)\n return () => setIndicatorShown(false)\n }, [setIndicatorShown])\n const by = startedByMe ? 'you' : startedByName || 'a participant'\n return (\n <TranscriptionStatusChip\n sentence={`Transcription on — started by ${by}`}\n short={muted ? 'Transcribing · you are muted' : 'Transcribing'}\n detail=\"Captions are shown to everyone and the transcript is kept in the meeting chat.\"\n muted={muted}\n onMutedChange={setMuted}\n muteLabel=\"Stop sending what I say to the transcriber (others are still transcribed)\"\n unmuteLabel=\"Transcribe what I say again\"\n compact={compact}\n announce={announce}\n onAnnounced={onAnnounced}\n className={className}\n data-testid=\"transcription-indicator\"\n />\n )\n}\n\n/**\n * A captions strip (names, \"Me\" for mine; two lines, newest at the bottom). The call panel no\n * longer shows one — live lines appear in the call's conversation — but it stays the plain view\n * of `transcription.captions`.\n */\nexport function CaptionsOverlay({\n captions,\n reserve = false,\n className,\n}: {\n captions: CaptionLine[]\n reserve?: boolean\n className?: string\n}): ReactElement | null {\n const entries = useMemo<CaptionEntry[]>(\n () =>\n captions.map((c) => ({\n id: c.segmentId,\n speakerId: c.identity,\n // My own lines read \"Me\" on my screen (they are stored under my real name).\n name: c.mine ? 'Me' : c.name || 'Someone',\n text: c.text,\n receivedAt: c.receivedAt,\n })),\n [captions]\n )\n return <CaptionsStrip captions={entries} reserve={reserve} className={className} />\n}\n\n/**\n * Records my own microphone track in speech segments while transcription may send (on, indicator\n * shown, not muted) and my microphone is on. Renders nothing.\n */\nexport function TranscriptionSender({ transcription }: { transcription: CallTranscription }): null {\n const { isMicrophoneEnabled, microphoneTrack } = useLocalParticipant()\n const track = microphoneTrack?.track?.mediaStreamTrack ?? null\n const active = transcription.shouldSend && isMicrophoneEnabled && !!track\n const { handleSegment } = transcription\n // A segment flushed as sending stops (off, mute, mic off, hang-up) is still handed over: the hook\n // sends it only if it started before the stop (the server's final-segment grace).\n const onSegment = useCallback(\n (segment: AudioSegment) => void handleSegment(segment),\n [handleSegment]\n )\n const { start, stop } = useAudioRecorder({ track, onSegment, segmenter: LIVE_SEGMENTER })\n useEffect(() => {\n if (!active) return\n void start()\n return () => stop()\n }, [active, track, start, stop])\n return null\n}\n","/**\n * Call recording UI in a call (ARBI `docs/meeting-chats-plan.md` §6): the host's Record / Stop\n * control with the mode choice and the quota warning, the \"Recording\" header chip everyone sees,\n * and the invisible recorders — my own microphone (everyone, workspace guests included) and, in\n * \"Audio + video\" mode, the host's composite of the stage. State comes from {@link useCallRecorder}.\n */\n\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport type { calls } from '@arbidocs/sdk/browser'\nimport { useCallback, useEffect, useMemo, useRef, type ReactElement, type RefObject } from 'react'\nimport { Track } from 'livekit-client'\nimport { useLocalParticipant, useTracks } from '@livekit/components-react'\nimport {\n createChunkedRecorder,\n pickRecorderMimeType,\n useAudioRecorder,\n type AudioSegment,\n useIsEntitled,\n COMPOSITE_AUDIO_BITS_PER_SECOND,\n COMPOSITE_VIDEO_BITS_PER_SECOND,\n RECORDING_CHUNK_MS,\n SPEAKER_AUDIO_BITS_PER_SECOND,\n type TrackUploader,\n} from '@arbidocs/react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { startCompositeCapture, RecordControl, RecordingStatusChip } from '../ui'\nimport { MODE_LABEL } from '../recording-labels'\nimport { useTrackUploader, type CallRecordingControl } from '@arbidocs/react/calls'\n\n/** The host's record button: picks a mode, or stops. Nobody else sees it. */\nexport function RecordingControl({\n recording,\n}: {\n recording: CallRecordingControl\n}): ReactElement | null {\n const { available, canControl, on, busy, requestStart, stop } = recording\n // Starting a recording is hosting (a paid feature); a running one can always be stopped.\n const canHost = useIsEntitled('host_calls')\n if (!available || !canControl || (!on && !canHost)) return null\n return (\n <RecordControl<calls.RecordingMode>\n on={on}\n busy={busy}\n note=\"Each person’s browser records their own microphone, encrypted.\"\n modes={[\n {\n mode: 'audio',\n label: MODE_LABEL.audio,\n description: 'Everyone’s microphone, one track each',\n testId: 'recording-mode-audio',\n },\n {\n mode: 'audio_video',\n label: MODE_LABEL.audio_video,\n description: 'Plus a video of your view of the call',\n testId: 'recording-mode-video',\n },\n ]}\n onStart={(mode) => void requestStart(mode)}\n onStop={() => void stop()}\n />\n )\n}\n\n/** Near the storage quota: the host confirms before starting. */\nexport function RecordingQuotaWarning({\n recording,\n}: {\n recording: CallRecordingControl\n}): ReactElement | null {\n const { pendingStart, confirmStart, cancelStart } = recording\n if (!pendingStart) return null\n const { quota, mode } = pendingStart\n const left = quota.remaining_mb == null ? null : Math.max(0, Math.floor(quota.remaining_mb))\n const tooLittle = left != null && left < quota.min_start_mb\n return (\n <Dialog open onOpenChange={(o) => !o && cancelStart()}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"recording-quota-warning\">\n <DialogHeader>\n <DialogTitle>Storage nearly full</DialogTitle>\n <DialogDescription>\n {left == null\n ? 'The storage is nearly full.'\n : left > 0\n ? `Only ${left} MB of storage is left${quota.limit_mb ? ` of ${quota.limit_mb} MB` : ''}.`\n : 'There is no storage left.'}{' '}\n {tooLittle && `A recording needs at least ${quota.min_start_mb} MB free to start. `}\n Audio takes about 10 MB per person per hour\n {mode === 'audio_video' ? ', video about 150–300 MB per hour' : ''}. Recording stops\n automatically when the storage is full.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"ghost\" onClick={cancelStart}>\n Cancel\n </Button>\n <Button onClick={() => void confirmStart()} data-testid=\"recording-quota-confirm\">\n Record anyway\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\n/**\n * \"Recording (Audio + video) — started by X\", for everyone, while it is on. Mounting it is what lets\n * the recorders capture: it reports itself shown, and unmounting stops them.\n */\nexport function RecordingIndicator({\n recording,\n compact = false,\n announce = true,\n onAnnounced,\n className,\n}: {\n recording: CallRecordingControl\n /** Dot only once folded (a narrow header, the minimised card). */\n compact?: boolean\n /** Spell out who started it (false once it has been, e.g. after minimising). */\n announce?: boolean\n onAnnounced?(): void\n className?: string\n}): ReactElement {\n const { setIndicatorShown, mode, startedByMe, startedByName } = recording\n useEffect(() => {\n setIndicatorShown(true)\n return () => setIndicatorShown(false)\n }, [setIndicatorShown])\n const by = startedByMe ? 'you' : startedByName || 'the host'\n return (\n <RecordingStatusChip\n sentence={`Recording${mode ? ` (${MODE_LABEL[mode]})` : ''} — started by ${by}`}\n compact={compact}\n announce={announce}\n onAnnounced={onAnnounced}\n className={className}\n data-testid=\"recording-indicator\"\n data-mode={mode ?? undefined}\n />\n )\n}\n\n/** Records my own microphone in ~30 s standalone parts while recording may capture. Renders nothing. */\nexport function SpeakerRecorder({\n recording,\n callKey,\n}: {\n recording: CallRecordingControl\n callKey: Uint8Array | null\n}): null {\n const { microphoneTrack } = useLocalParticipant()\n const track = microphoneTrack?.track?.mediaStreamTrack ?? null\n const mimeType = useMemo(() => pickRecorderMimeType('audio'), [])\n const uploader = useTrackUploader(recording, callKey, 'speaker', mimeType)\n const uploaderRef = useRef(uploader)\n uploaderRef.current = uploader\n const lastUploader = useRef<TrackUploader | null>(null)\n if (uploader) lastUploader.current = uploader\n const onSegment = useCallback((segment: AudioSegment) => {\n // The tail flushed as capture stops still belongs to the recording that was running.\n const target = uploaderRef.current ?? lastUploader.current\n target?.enqueue({\n blob: segment.blob,\n startedAt: segment.startedAt,\n durationMs: segment.durationMs,\n })\n }, [])\n const { start, stop } = useAudioRecorder({\n track,\n onSegment,\n chunkMs: RECORDING_CHUNK_MS,\n mimeType,\n audioBitsPerSecond: SPEAKER_AUDIO_BITS_PER_SECOND,\n })\n const active = !!uploader && !!track\n useEffect(() => {\n if (!active) return\n void start()\n return () => stop()\n }, [active, track, uploader, start, stop])\n return null\n}\n\n/**\n * The host's composite (Audio + video mode): the stage drawn into a canvas plus the audio the host\n * hears, recorded as one continuous file in ~30 s parts. Renders nothing.\n */\nexport function CompositeRecorder({\n recording,\n callKey,\n stageRef,\n}: {\n recording: CallRecordingControl\n callKey: Uint8Array | null\n stageRef: RefObject<HTMLElement | null>\n}): null {\n const { notify } = useBlocksEnvironment()\n const mimeType = useMemo(() => pickRecorderMimeType('video'), [])\n const uploader = useTrackUploader(recording, callKey, 'composite', mimeType)\n const audioRefs = useTracks([Track.Source.Microphone, Track.Source.ScreenShareAudio], {\n onlySubscribed: true,\n })\n const audioTracks = useMemo(\n () =>\n audioRefs\n .map((ref) => ref.publication?.track?.mediaStreamTrack)\n .filter((t): t is MediaStreamTrack => !!t),\n [audioRefs]\n )\n const audioTracksRef = useRef(audioTracks)\n audioTracksRef.current = audioTracks\n const captureRef = useRef<ReturnType<typeof startCompositeCapture> | null>(null)\n\n useEffect(() => {\n const stage = stageRef.current\n if (!uploader || !stage) return\n let capture: ReturnType<typeof startCompositeCapture>\n try {\n capture = startCompositeCapture(stage)\n } catch (err) {\n console.warn('[calls] cannot record the composite', err)\n notify('This browser cannot record the call video; audio is still recorded.', 'warning')\n return\n }\n captureRef.current = capture\n capture.setAudioTracks(audioTracksRef.current)\n const recorder = createChunkedRecorder({\n stream: capture.stream,\n mimeType,\n chunkMs: RECORDING_CHUNK_MS,\n mode: 'timeslice',\n videoBitsPerSecond: COMPOSITE_VIDEO_BITS_PER_SECOND,\n audioBitsPerSecond: COMPOSITE_AUDIO_BITS_PER_SECOND,\n onChunk: (chunk) =>\n uploader.enqueue({\n blob: chunk.blob,\n startedAt: chunk.startedAt,\n durationMs: chunk.durationMs,\n }),\n onError: (err) => console.warn('[calls] the composite recorder failed', err),\n })\n recorder.start()\n return () => {\n captureRef.current = null\n void recorder.stop().finally(() => capture.dispose())\n }\n }, [uploader, stageRef, mimeType])\n\n useEffect(() => {\n captureRef.current?.setAudioTracks(audioTracks)\n }, [audioTracks])\n return null\n}\n","/**\n * The call panel's control bar, wired to the LiveKit room. One row; what fits stays in it and the\n * rest moves into More, so each action lives in exactly one visible place:\n * full — time · mic, camera | share, CC, Record | More · Leave\n * compact — mic, camera | CC, Record | More · Leave\n * tiny — mic, camera | More · Leave\n * Chat is the conversation beside the panel (its own composer) and the participant list is\n * always on show under the video, so neither has a button here.\n */\n\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useState, type ReactElement } from 'react'\nimport { Track } from 'livekit-client'\nimport {\n useAudioPlayback,\n useMediaDeviceSelect,\n useRoomContext,\n useTrackToggle,\n} from '@livekit/components-react'\nimport {\n Captions,\n Circle,\n FlaskConical,\n Link2,\n Lock,\n LockOpen,\n MonitorUp,\n MonitorX,\n Square,\n Volume2,\n} from 'lucide-react'\nimport { classifyMediaError, useArbi, useServerCallsExperimental } from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport {\n CallControlBar,\n CallControlButton,\n ControlDivider,\n ControlGroup,\n ElapsedTime,\n LeaveButton,\n MediaControl,\n MoreMenu,\n type LeaveOption,\n type MoreMenuItem,\n type MoreMenuSection,\n} from '../ui'\nimport { TranscriptionToggle } from './CallTranscription'\nimport { RecordingControl } from './CallRecording'\nimport type { CallTranscription, CallRecordingControl } from '@arbidocs/react/calls'\nimport { useMirrorSelfView } from '../self-view'\n\nexport type ControlDensity = 'full' | 'compact' | 'tiny'\n\ntype MediaSource = Track.Source.Microphone | Track.Source.Camera\n\ntype Notify = ReturnType<typeof useBlocksEnvironment>['notify']\n\nfunction reportDeviceError(notify: Notify, source: MediaSource) {\n return (err: Error) =>\n notify(\n classifyMediaError(err, source === Track.Source.Camera ? 'camera' : 'microphone'),\n 'error'\n )\n}\n\n/** Microphone or camera of the room, with its device list (and, for the camera, the mirror). */\nfunction RoomMediaControl({\n source,\n shortcut,\n testId,\n}: {\n source: MediaSource\n shortcut: string\n testId: string\n}): ReactElement {\n const { notify } = useBlocksEnvironment()\n const mic = source === Track.Source.Microphone\n const { toggle, enabled, pending } = useTrackToggle({\n source,\n onDeviceError: reportDeviceError(notify, source),\n })\n const { devices, activeDeviceId, setActiveMediaDevice } = useMediaDeviceSelect({\n kind: mic ? 'audioinput' : 'videoinput',\n })\n const [mirror, setMirror] = useMirrorSelfView()\n return (\n <MediaControl\n kind={mic ? 'microphone' : 'camera'}\n enabled={enabled}\n pending={pending}\n onToggle={() => void toggle()}\n devices={devices.map((d) => ({ deviceId: d.deviceId, label: d.label }))}\n activeDeviceId={activeDeviceId}\n onSelectDevice={(id) =>\n void setActiveMediaDevice(id).catch((err: Error) => reportDeviceError(notify, source)(err))\n }\n shortcut={shortcut}\n testId={testId}\n options={\n mic\n ? []\n : [\n {\n label: 'Mirror my video',\n checked: mirror,\n onChange: setMirror,\n testId: 'call-mirror-toggle',\n },\n ]\n }\n />\n )\n}\n\nfunction useScreenShare() {\n const { notify } = useBlocksEnvironment()\n return useTrackToggle({\n source: Track.Source.ScreenShare,\n captureOptions: { audio: true, selfBrowserSurface: 'exclude' },\n onDeviceError: (err: Error) => {\n // Cancelling the browser's picker is not worth a toast.\n if (err.name !== 'NotAllowedError') notify(`Could not share: ${err.message}`, 'error')\n },\n })\n}\n\n/** \"Enable audio\" when the browser blocked playback until a click (the bar's left end). */\nexport function EnableAudioButton({ compact = false }: { compact?: boolean }): ReactElement | null {\n const { canPlayAudio, startAudio } = useAudioPlayback()\n if (canPlayAudio) return null\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 gap-1.5 border-yellow-border bg-yellow-bg text-yellow-text hover:bg-yellow-bg/80\"\n onClick={() => void startAudio()}\n data-testid=\"call-start-audio\"\n >\n <Volume2 className=\"size-4\" aria-hidden />\n {compact ? 'Audio' : 'Enable audio'}\n </Button>\n )\n}\n\nexport interface CallControlsProps {\n callExtId: string\n isCreator: boolean\n /** Copy-able join link (anyone with it can ask to join). */\n link: string | null\n startedAt: number\n density: ControlDensity\n /** Single-key shortcuts on (the panel is on screen). */\n shortcuts: boolean\n transcription: CallTranscription\n recording: CallRecordingControl\n /** More groups of the More menu (a webinar's chat setting, panel, Leave stage). */\n menuGroups?: (MoreMenuItem[] | MoreMenuSection)[]\n /** Leave's further choices (a webinar's End webinar for everyone). */\n leaveOptions?: LeaveOption[]\n}\n\nexport function CallControls({\n callExtId,\n isCreator,\n link,\n startedAt,\n density,\n shortcuts,\n transcription: tr,\n recording,\n menuGroups = [],\n leaveOptions,\n}: CallControlsProps): ReactElement {\n const { notify } = useBlocksEnvironment()\n const arbi = useArbi()\n const room = useRoomContext()\n const share = useScreenShare()\n const experimental = useServerCallsExperimental()\n const [locked, setLocked] = useState(false)\n const [locking, setLocking] = useState(false)\n const full = density === 'full'\n const tiny = density === 'tiny'\n\n const toggleLock = async () => {\n setLocking(true)\n try {\n const call = await arbi.calls.update(callExtId, { locked: !locked })\n setLocked(call.locked)\n notify(call.locked ? 'Call locked: nobody new can join' : 'Call unlocked', 'info')\n } catch (err) {\n notify(`Could not change the lock: ${(err as Error).message}`, 'error')\n } finally {\n setLocking(false)\n }\n }\n const copyLink = () => {\n if (!link) return\n void navigator.clipboard\n .writeText(link)\n .then(() => notify('Call link copied', 'success'))\n .catch(() => notify('Could not copy the link', 'error'))\n }\n\n // What does not fit the bar lives in More.\n const overflow: MoreMenuItem[] = [\n ...(!full\n ? [\n {\n key: 'share',\n label: share.enabled ? 'Stop sharing' : 'Share your screen',\n icon: share.enabled ? <MonitorX /> : <MonitorUp />,\n onSelect: () => void share.toggle(),\n disabled: share.pending,\n },\n ]\n : []),\n ...(tiny && tr.available && tr.canToggle\n ? [\n {\n key: 'transcribe',\n label: tr.on ? 'Stop transcription' : 'Transcribe the call',\n icon: <Captions />,\n onSelect: () => void tr.toggle(),\n disabled: tr.busy,\n },\n ]\n : []),\n ...(tiny && recording.available && recording.canControl\n ? recording.on\n ? [\n {\n key: 'stop-recording',\n label: 'Stop recording',\n icon: <Square className=\"fill-current text-red-text\" />,\n onSelect: () => void recording.stop(),\n disabled: recording.busy,\n },\n ]\n : [\n {\n key: 'record-audio',\n label: 'Record audio',\n icon: <Circle className=\"fill-red-solid text-red-solid\" />,\n onSelect: () => void recording.requestStart('audio'),\n disabled: recording.busy,\n },\n {\n key: 'record-video',\n label: 'Record audio + video',\n icon: <Circle className=\"fill-red-solid text-red-solid\" />,\n onSelect: () => void recording.requestStart('audio_video'),\n disabled: recording.busy,\n },\n ]\n : []),\n ]\n const callItems: MoreMenuItem[] = [\n ...(link\n ? [\n {\n key: 'link',\n label: 'Copy call link',\n icon: <Link2 />,\n onSelect: copyLink,\n testId: 'call-copy-link',\n },\n ]\n : []),\n ...(isCreator\n ? [\n {\n key: 'lock',\n label: locked ? 'Unlock call' : 'Lock call (only invited people can join)',\n icon: locked ? <LockOpen /> : <Lock />,\n onSelect: () => void toggleLock(),\n disabled: locking,\n testId: 'call-lock-toggle',\n },\n ]\n : []),\n ]\n\n return (\n <CallControlBar\n shortcuts={shortcuts}\n left={\n <>\n {full && <ElapsedTime since={startedAt} title=\"Time in this call\" />}\n <EnableAudioButton compact={!full} />\n </>\n }\n right={\n <LeaveButton\n compact={!full}\n onLeave={() => void room.disconnect()}\n options={leaveOptions}\n />\n }\n >\n <ControlGroup>\n <RoomMediaControl source={Track.Source.Microphone} shortcut=\"M\" testId=\"call-mic-toggle\" />\n <RoomMediaControl source={Track.Source.Camera} shortcut=\"V\" testId=\"call-camera-toggle\" />\n </ControlGroup>\n {!tiny && (\n <>\n <ControlDivider />\n <ControlGroup>\n {full && (\n <CallControlButton\n label={share.enabled ? 'Stop sharing' : 'Share your screen'}\n tone={share.enabled ? 'active' : 'neutral'}\n aria-pressed={share.enabled}\n disabled={share.pending}\n onClick={() => void share.toggle()}\n data-testid=\"call-share-toggle\"\n >\n {share.enabled ? <MonitorX aria-hidden /> : <MonitorUp aria-hidden />}\n </CallControlButton>\n )}\n <TranscriptionToggle transcription={tr} />\n <RecordingControl recording={recording} />\n </ControlGroup>\n </>\n )}\n <MoreMenu\n details={\n experimental ? (\n <span\n className=\"flex items-center gap-1.5 text-xs text-muted-foreground\"\n data-testid=\"calls-experimental-badge\"\n >\n <FlaskConical className=\"size-3.5\" aria-hidden />\n Calls are an experimental feature.\n </span>\n ) : undefined\n }\n groups={[overflow, callItems, ...menuGroups]}\n />\n </CallControlBar>\n )\n}\n","/**\n * The webinar's live chat (the Chat tab, shown while the audience may chat): the in-call chat's\n * lines in the conversation's own message parts (my messages right, others' left under their\n * pill), and the side panel's composer. Live over the data channel under K; the team's messages\n * are also kept in the meeting chat, the audience's are not.\n */\n\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useEffect, useRef, type ReactElement } from 'react'\nimport { PanelComposer } from '../ui'\nimport {\n MessageBody,\n MessageAuthor,\n MessageBubble,\n MessageContent,\n MessageListEmpty,\n MessageListRoot,\n MessageRoot,\n} from '../../chat'\nimport { CALL_CHAT_MAX_CHARS } from '@arbidocs/react'\nimport type { InCallChatState } from '@arbidocs/react/calls'\nimport { CallUserPill } from './CallUserPill'\n\nexport function WebinarChat({ chat }: { chat: InCallChatState }): ReactElement {\n const { notify } = useBlocksEnvironment()\n const end = useRef<HTMLDivElement>(null)\n const count = chat.lines.length\n useEffect(() => {\n end.current?.scrollIntoView?.({ block: 'end' })\n }, [count])\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\" data-testid=\"webinar-chat\">\n <MessageListRoot className=\"min-h-0 flex-1 overflow-y-auto py-2\" testId=\"webinar-chat-list\">\n {count === 0 ? (\n <MessageListEmpty className=\"h-32 text-sm\">No messages yet.</MessageListEmpty>\n ) : (\n chat.lines.map((line, i) => {\n const startsRun =\n !line.mine && chat.lines[i - 1]?.senderIdentity !== line.senderIdentity\n const id = `${line.senderIdentity}-${line.id}`\n return (\n <MessageRoot key={id} role=\"user\" messageId={id} className=\"px-3\">\n <MessageContent role=\"user\" messageId={id} align={line.mine ? 'end' : 'start'}>\n {startsRun && (\n <MessageAuthor>\n <CallUserPill\n identity={line.senderIdentity}\n name={line.senderName}\n size=\"sm\"\n />\n </MessageAuthor>\n )}\n <MessageBubble\n role=\"user\"\n messageId={id}\n className={line.mine ? undefined : 'border border-border bg-card'}\n >\n <MessageBody messageId={id} className=\"whitespace-pre-wrap text-sm\">\n {line.text}\n </MessageBody>\n </MessageBubble>\n </MessageContent>\n </MessageRoot>\n )\n })\n )}\n <div ref={end} />\n </MessageListRoot>\n <div className=\"shrink-0 border-t border-border p-3\">\n <PanelComposer\n placeholder=\"Message everyone\"\n ariaLabel=\"Message everyone\"\n sendLabel=\"Send\"\n maxLength={CALL_CHAT_MAX_CHARS}\n busy={false}\n onSend={(text) =>\n chat.send(text).then(\n () => true,\n (err: Error) => {\n notify(`Could not send the message: ${err.message}`, 'error')\n return false\n }\n )\n }\n testId=\"webinar-chat-composer\"\n />\n </div>\n </div>\n )\n}\n","/**\n * The webinar's side panel: one `CallSidePanel` with tabs, for the team (under the video, People |\n * Q&A | Chat | Audience) and the audience (the viewer's side, Q&A | Chat). Each view appears once:\n * People — the team's participant list (the stage: visible people only), passed in;\n * Q&A — `QAPanel`, the team moderating;\n * Chat — the live chat, only while the audience may chat (`chat = everyone`);\n * Audience — `WebinarAudiencePanel` (hands queue, everyone in the room), moderators only.\n * An attendee never sees a list of attendees.\n */\n\nimport { useEffect, useMemo, type ReactElement, type ReactNode } from 'react'\nimport {\n CallSidePanel,\n QAPanel,\n WebinarAudiencePanel,\n type CallSidePanelTab,\n type WebinarQuestion,\n} from '../ui'\nimport type { InCallChatState, WebinarControl } from '@arbidocs/react/calls'\nimport { CallUserPill } from './CallUserPill'\nimport { WebinarChat } from './WebinarChat'\n\nexport type WebinarTab = 'people' | 'qa' | 'chat' | 'audience'\n\n/** The moderators' audience list is read again this often while it is on screen (hidden joins are silent). */\nconst AUDIENCE_REFRESH_MS = 10_000\n\n/** The tabs this person gets, in order. */\nfunction webinarTabs(\n webinar: Pick<WebinarControl, 'moderator' | 'team' | 'chat' | 'questions' | 'hands'>,\n opts: { people: boolean; unreadChat: number }\n): CallSidePanelTab[] {\n const open = webinar.questions.filter((q) => q.status === 'open' || q.status === 'answering')\n return [\n ...(opts.people ? [{ id: 'people', label: 'People', testId: 'webinar-tab-people' }] : []),\n { id: 'qa', label: 'Q&A', count: open.length, testId: 'webinar-tab-qa' },\n ...(webinar.chat === 'everyone'\n ? [\n {\n id: 'chat',\n label: 'Chat',\n count: opts.unreadChat || undefined,\n testId: 'webinar-tab-chat',\n },\n ]\n : []),\n ...(webinar.moderator\n ? [\n {\n id: 'audience',\n label: 'Audience',\n count: webinar.hands.length || undefined,\n testId: 'webinar-tab-audience',\n },\n ]\n : []),\n ]\n}\n\nfunction WebinarQA({ webinar }: { webinar: WebinarControl }): ReactElement {\n const questions = useMemo<WebinarQuestion[]>(\n () =>\n webinar.questions.map((q) => ({\n id: q.external_id,\n body: q.text,\n status: q.status,\n answer: q.answerText,\n answeredBy: q.answered_by_ext_id ? (\n <CallUserPill identity={q.answered_by_ext_id} />\n ) : undefined,\n voteCount: q.vote_count,\n voted: q.voted,\n mine: q.mine,\n createdAt: q.created_at,\n // Who asked is hidden from attendees (another attendee's question): \"Attendee\".\n askerName: q.asker_ext_id ? '' : null,\n asker: q.asker_ext_id ? <CallUserPill identity={q.asker_ext_id} /> : undefined,\n })),\n [webinar.questions]\n )\n return (\n <QAPanel\n questions={questions}\n team={webinar.team}\n onAsk={webinar.ask}\n onVote={(q, up) => webinar.vote(q.id, up)}\n onStatusChange={webinar.team ? (q, s) => webinar.setQuestionStatus(q.id, s) : undefined}\n onAnswer={webinar.team ? (q, text) => webinar.answer(q.id, text) : undefined}\n onDelete={(q) => webinar.removeQuestion(q.id)}\n />\n )\n}\n\nfunction WebinarAudience({ webinar }: { webinar: WebinarControl }): ReactElement {\n const { refresh } = webinar\n useEffect(() => {\n void refresh()\n const id = setInterval(() => void refresh(), AUDIENCE_REFRESH_MS)\n return () => clearInterval(id)\n }, [refresh])\n return (\n <WebinarAudiencePanel\n className=\"min-h-0 flex-1 overflow-y-auto\"\n hands={webinar.hands.map((h) => ({\n id: h.identity,\n name: h.name,\n raisedAt: h.raised_at,\n entity: <CallUserPill identity={h.identity} name={h.name} size=\"sm\" />,\n }))}\n attendees={webinar.attendees.map((a) => ({\n id: a.identity,\n name: a.name,\n role: a.role,\n onStage: a.on_stage,\n handRaised: a.hand_raised,\n entity: <CallUserPill identity={a.identity} name={a.name} size=\"sm\" />,\n }))}\n onPromote={webinar.promote}\n onDemote={webinar.demote}\n />\n )\n}\n\nexport function WebinarSidePanel({\n webinar,\n chat,\n people,\n tab,\n onTabChange,\n onClose,\n className,\n}: {\n webinar: WebinarControl\n chat: InCallChatState\n /** The team's People view (omitted for the audience). */\n people?: ReactNode\n tab: WebinarTab\n onTabChange(tab: WebinarTab): void\n onClose(): void\n className?: string\n}): ReactElement {\n const tabs = webinarTabs(webinar, { people: !!people, unreadChat: chat.unread })\n // A tab that went away (the chat closed to the audience) falls back to the first.\n const current = tabs.some((t) => t.id === tab) ? tab : (tabs[0].id as WebinarTab)\n return (\n <CallSidePanel\n title=\"Webinar\"\n tabs={tabs}\n activeTab={current}\n onTabChange={(id) => onTabChange(id as WebinarTab)}\n onClose={onClose}\n closeLabel=\"Close panel\"\n closeTestId=\"webinar-panel-close\"\n className={className}\n data-testid=\"webinar-panel\"\n >\n {current === 'people' && people}\n {current === 'qa' && <WebinarQA webinar={webinar} />}\n {current === 'chat' && <WebinarChat chat={chat} />}\n {current === 'audience' && <WebinarAudience webinar={webinar} />}\n </CallSidePanel>\n )\n}\n","/**\n * ConnectedCallRoom — one LiveKit room, composed from `@arbidocs/blocks/calls`: the call panel (header with\n * the status chips and the view switch, \"Speaking: …\", the speaker or gallery view, the people\n * list, the control bar) or, minimised, the small card. Audio first: who is talking is measured\n * here, fast (`voice-levels`), and drives the rings, the spotlight and the live speaker list.\n * Chat and the transcript live in the call's conversation, beside the panel.\n *\n * The room itself, end-to-end encrypted under the call key, is `useCallRoom` (`@arbidocs/react/calls`).\n * With no key (a session without client keys) the call still connects, unencrypted, and says so.\n *\n * Heavy (pulls livekit-client): always import this module lazily.\n */\n\nimport { useEffect, useMemo, useRef, useState, type ReactElement } from 'react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport {\n ConnectionQuality,\n ConnectionState,\n DisconnectReason,\n MediaDeviceFailure,\n Track,\n} from 'livekit-client'\nimport {\n isTrackReference,\n LiveKitRoom,\n ParticipantName,\n RoomAudioRenderer,\n useConnectionQualityIndicator,\n useConnectionState,\n useIsEncrypted,\n useIsMuted,\n useLocalParticipant,\n useParticipants,\n useParticipantTile,\n useRoomContext,\n useTracks,\n useTrackToggle,\n VideoTrack,\n type TrackReferenceOrPlaceholder,\n} from '@livekit/components-react'\nimport { ArrowDownToLine, MessageCircleQuestion, TriangleAlert } from 'lucide-react'\nimport {\n callSession,\n classifyMediaError,\n useArbi,\n useCallSession,\n useMeetingReadOnly,\n DEFAULT_JOIN_CHOICES,\n} from '@arbidocs/react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport {\n BackstageBanner,\n CallFocus,\n CallGrid,\n CallHeader,\n CallNotice,\n CallParticipants,\n CallStageFrame,\n CallStateMessage,\n CallTile,\n type CallTileSize,\n chatPermissionSection,\n ConnectionOverlay,\n EncryptionStatusChip,\n initialsOf,\n LobbyRequests,\n MinimisedCall,\n NOTICE_MS,\n OnStageCheck,\n pickSpotlight,\n stageContentHeight,\n SpeakingNow,\n useElementSize,\n WebinarEndConfirm,\n WebinarLiveChip,\n WebinarViewer,\n type CallView,\n type JoinChoices,\n type LeaveOption,\n type MoreMenuItem,\n type MoreMenuSection,\n startVoiceLevels,\n useIsSpeaking,\n useSpeakingIds,\n useSpotlightId,\n useVoiceLevel,\n useVoiceLevels,\n type VoiceSource,\n} from '../ui'\nimport type { calls } from '@arbidocs/sdk/browser'\nimport {\n useCallRoom,\n useMuteRequests,\n useHostMuteNotice,\n useCallTranscriber,\n type CallTranscription,\n useCallRecorder,\n type CallRecordingControl,\n useInCallChat,\n useWebinar,\n type WebinarControl,\n} from '@arbidocs/react/calls'\nimport { CaptionsOverlay, TranscriptionIndicator, TranscriptionSender } from './CallTranscription'\nimport {\n CompositeRecorder,\n RecordingIndicator,\n RecordingQuotaWarning,\n SpeakerRecorder,\n} from './CallRecording'\nimport { MODE_LABEL } from '../recording-labels'\nimport { CallControls, EnableAudioButton, type ControlDensity } from './CallControls'\nimport { useMirrorSelfView } from '../self-view'\nimport { CallUserPill } from './CallUserPill'\nimport { publishCallStatus } from '../call-status'\nimport { WebinarSidePanel, type WebinarTab } from './WebinarSidePanel'\n\n/** The webinar viewer's width (px) from which its Q&A column docks beside the stage (`@3xl`). */\nconst VIEWER_SIDE_DOCKS_AT = 768\n/** The stage's box while minimised (laid out, invisible, for the host's video recording). */\nconst OFFSCREEN_STAGE = { top: 0, left: 0, width: 960, height: 540 }\n/** \"Please mute\" requests between participants (a request: the person decides). */\n\nexport interface ConnectedCallRoomProps {\n tokenResponse: calls.CallTokenResponse\n /** The call's E2EE frame key K, or null to join without end-to-end encryption. */\n e2eeKey: Uint8Array | null\n /** Called once the local participant has left (button, kick, room closed, error). */\n onLeave(): void\n /** Devices and mic/camera state picked in the pre-join (default: mic on, camera off). */\n choices?: JoinChoices\n /** The creator may remove participants and turns transcription on or off. */\n isCreator?: boolean\n /** A thread call: the workspace it is locked to (its guests get a read-only meeting chat). */\n lockedWorkspaceExtId?: string | null\n /** The call's name in the header. */\n title?: string\n /** When the call started (the elapsed time). */\n startedAt?: number\n /** The join link \"Copy call link\" copies. */\n link?: string | null\n /** Shown as the small minimised card instead of the panel. */\n minimized?: boolean\n /**\n * Where the stage sits while minimised (viewport pixels). The host's \"Audio + video\" recording\n * draws the stage, so while it runs the stage stays laid out there, invisible and inert,\n * instead of collapsing — the recording keeps its picture.\n */\n stageRect?: { top: number; left: number; width: number; height: number } | null\n onMinimizedChange?(minimized: boolean): void\n /** Live transcription turned on or off. */\n onTranscriptionChange?(on: boolean): void\n /** Recording turned on or off. */\n onRecordingChange?(on: boolean): void\n /**\n * A webinar: my role (the server's `CallResponse.webinar.my_role`). The audience gets the viewer\n * and never publishes; the team gets this call UI with the webinar's controls.\n */\n webinarRole?: calls.WebinarRole | null\n /** The room was closed for everyone (a webinar ended): instead of `onLeave`, when given. */\n onRoomClosed?(): void\n /** The webinar viewer (off stage) is shown, or the call panel again: the dock places it. */\n onViewerChange?(viewer: boolean): void\n className?: string\n}\n\nexport function ConnectedCallRoom({\n tokenResponse,\n e2eeKey,\n onLeave,\n choices = DEFAULT_JOIN_CHOICES,\n isCreator = false,\n lockedWorkspaceExtId,\n title = 'Call',\n startedAt,\n link = null,\n minimized = false,\n stageRect = null,\n onMinimizedChange,\n onTranscriptionChange,\n onRecordingChange,\n webinarRole = null,\n onRoomClosed,\n onViewerChange,\n className,\n}: ConnectedCallRoomProps): ReactElement {\n const { notify } = useBlocksEnvironment()\n const { room, error: setupError } = useCallRoom(e2eeKey, choices)\n const [joinedAt] = useState(() => startedAt ?? Date.now())\n\n if (setupError) {\n return (\n <div className={cn('flex flex-col items-center justify-center gap-3 p-6', className)}>\n <TriangleAlert className=\"size-6 text-destructive\" aria-hidden />\n <p className=\"text-center text-sm text-muted-foreground\">{setupError}</p>\n <Button type=\"button\" variant=\"outline\" onClick={onLeave}>\n Close\n </Button>\n </div>\n )\n }\n\n if (!room) {\n return <CallStateMessage title=\"Connecting…\" testId=\"call-connecting\" />\n }\n\n return (\n <LiveKitRoom\n room={room}\n serverUrl={tokenResponse.server_url}\n token={tokenResponse.token}\n connect\n // A webinar's audience cannot publish: never ask for a microphone or camera.\n audio={choices.audioEnabled && webinarRole !== 'attendee'}\n video={choices.videoEnabled && webinarRole !== 'attendee'}\n data-testid=\"call-room\"\n className={cn('flex size-full min-h-0 flex-col overflow-hidden', className)}\n onDisconnected={(reason?: DisconnectReason) => {\n console.debug('[calls] disconnected', reason)\n if (reason === DisconnectReason.ROOM_DELETED && onRoomClosed) onRoomClosed()\n else onLeave()\n }}\n onError={(err: Error) => {\n console.error('[calls] room error', err)\n notify(`Call error: ${err.message}`, 'error')\n }}\n onEncryptionError={(err: Error) => {\n console.error('[calls] encryption error', err)\n notify('Call encryption error — media may not be decryptable.', 'error')\n }}\n onMediaDeviceFailure={(failure?: MediaDeviceFailure, kind?: MediaDeviceKind) => {\n const device = kind === 'videoinput' ? 'camera' : 'microphone'\n const name =\n failure === MediaDeviceFailure.PermissionDenied\n ? 'NotAllowedError'\n : failure === MediaDeviceFailure.NotFound\n ? 'NotFoundError'\n : 'Error'\n notify(classifyMediaError(new DOMException(failure ?? '', name), device), 'error')\n }}\n >\n <CallBody\n callExtId={tokenResponse.call_ext_id}\n linkVersion={tokenResponse.link_version}\n lockedWorkspaceExtId={lockedWorkspaceExtId ?? null}\n e2eeKey={e2eeKey}\n isCreator={isCreator}\n title={title}\n startedAt={joinedAt}\n link={link}\n minimized={minimized}\n stageRect={stageRect}\n onMinimizedChange={onMinimizedChange}\n onTranscriptionChange={onTranscriptionChange}\n onRecordingChange={onRecordingChange}\n webinarRole={webinarRole}\n onViewerChange={onViewerChange}\n />\n <RoomAudioRenderer />\n </LiveKitRoom>\n )\n}\n\n/** Feeds `voice-levels` from every microphone in the room (mine included). */\nfunction useRoomVoiceLevels(): void {\n const mics = useTracks([{ source: Track.Source.Microphone, withPlaceholder: true }], {\n onlySubscribed: false,\n })\n const sources = useRef<VoiceSource[]>([])\n sources.current = mics.map((t) => ({\n identity: t.participant.identity,\n track: isTrackReference(t) ? (t.publication.track?.mediaStreamTrack ?? null) : null,\n muted: !isTrackReference(t) || t.publication.isMuted,\n local: t.participant.isLocal,\n }))\n useEffect(() => startVoiceLevels(() => sources.current), [])\n}\n\n/**\n * Inside <LiveKitRoom>: the call's state hooks, then the panel or the minimised card. In a webinar\n * the audience (off stage) gets the viewer instead of the panel; the team gets the panel with the\n * webinar's banner, controls and side panel.\n */\nfunction CallBody({\n callExtId,\n linkVersion,\n lockedWorkspaceExtId,\n e2eeKey,\n isCreator,\n title,\n startedAt,\n link,\n minimized,\n stageRect,\n onMinimizedChange,\n onTranscriptionChange,\n onRecordingChange,\n webinarRole,\n onViewerChange,\n}: {\n callExtId: string\n linkVersion: number\n lockedWorkspaceExtId: string | null\n e2eeKey: Uint8Array | null\n isCreator: boolean\n title: string\n startedAt: number\n link: string | null\n minimized: boolean\n stageRect: { top: number; left: number; width: number; height: number } | null\n onMinimizedChange?(minimized: boolean): void\n onTranscriptionChange?(on: boolean): void\n onRecordingChange?(on: boolean): void\n webinarRole: calls.WebinarRole | null\n onViewerChange?(viewer: boolean): void\n}): ReactElement {\n const room = useRoomContext()\n const [view, setView] = useState<CallView>('speaker')\n const webinar = useWebinar({\n role: webinarRole,\n callExtId,\n linkVersion,\n callKey: e2eeKey,\n })\n // Off stage (the audience, or a promoted person still checking their devices): the viewer,\n // which the dock gives the main area (there is no conversation beside it).\n const audienceView = webinar.enabled && (!webinar.onStage || webinar.stageCheck)\n useEffect(() => {\n onViewerChange?.(audienceView)\n }, [audienceView, onViewerChange])\n // Only the stage is ever sent to the transcriber or recorded (the server refuses the rest).\n const sendsMedia = !webinar.enabled || webinar.onStage\n // A workspace guest on a thread call reads the meeting chat but cannot post to it; a webinar's\n // meeting chat is its team's.\n const readOnly = useMeetingReadOnly(lockedWorkspaceExtId)\n const transcription = useCallTranscriber({\n callExtId,\n callKey: e2eeKey,\n isCreator,\n canPost: !readOnly && (!webinar.enabled || webinar.team),\n linkVersion,\n })\n useEffect(() => {\n onTranscriptionChange?.(transcription.on)\n }, [transcription.on, onTranscriptionChange])\n // The call's conversation (beside the panel) reads this for its empty state and live rows.\n useEffect(() => {\n publishCallStatus({ callExtId, transcribing: transcription.on })\n }, [callExtId, transcription.on])\n useEffect(() => () => publishCallStatus({ callExtId: null, transcribing: false }), [])\n const recording = useCallRecorder({ callExtId, callKey: e2eeKey, isCreator, linkVersion })\n useEffect(() => {\n onRecordingChange?.(recording.on)\n }, [recording.on, onRecordingChange])\n // \"Recording — started by X\" is spelled out once per recording / transcription, on its own line\n // under the header (the chips stay short, so the title keeps its room).\n const notices = useCallNotices(recording, transcription)\n\n // The webinar's side panel: open under the video for the team, a toggle in the viewer.\n const [teamPanelOpen, setTeamPanelOpen] = useState(true)\n const [endConfirm, setEndConfirm] = useState(false)\n // The viewer's Q&A column: open by default where it docks beside the stage (wide), closed where\n // it would cover it (narrow), until toggled.\n const [viewerSide, setViewerSide] = useState<boolean | null>(null)\n const [tab, setTab] = useState<WebinarTab>('people')\n const [frameRef, frame] = useElementSize<HTMLDivElement>()\n const viewerSideOpen = viewerSide ?? frame.width >= VIEWER_SIDE_DOCKS_AT\n const sideOpen = audienceView ? viewerSideOpen : teamPanelOpen\n // A webinar's live chat, only while the audience may chat (the team's messages are also kept).\n const chat = useInCallChat({\n callExtId,\n callKey: webinar.enabled && webinar.chat === 'everyone' ? e2eeKey : null,\n open: sideOpen && tab === 'chat',\n persist: webinar.team,\n })\n\n useRoomVoiceLevels()\n const askToMute = useMuteRequests()\n useHostMuteNotice(callExtId)\n const participants = useParticipants()\n const speakingIds = useSpeakingIds()\n const speakingNames = useMemo(\n () =>\n speakingIds\n .map((id) => participants.find((p) => p.identity === id))\n .filter((p): p is NonNullable<typeof p> => !!p)\n .map((p) => <CallUserPill key={p.identity} identity={p.identity} name={p.name} />),\n [speakingIds, participants]\n )\n\n const stageRef = useRef<HTMLDivElement | null>(null)\n // The tiles' shape (speaker view with a filmstrip, or a grid), to size the video to them.\n const { share, cameras } = useStageTracks()\n const stageShape = {\n view:\n share || (view === 'speaker' && cameras.length >= 2) ? ('focus' as const) : ('grid' as const),\n count: cameras.length + (share ? 1 : 0),\n }\n const drawsComposite = recording.on && recording.canControl && recording.mode === 'audio_video'\n const density: ControlDensity =\n frame.width === 0 || frame.width >= 620 ? 'full' : frame.width >= 400 ? 'compact' : 'tiny'\n const shortPanel = frame.height > 0 && frame.height < 520\n const [mirrorSelf] = useMirrorSelfView()\n\n const status = (small: boolean) => (\n <>\n {webinar.enabled && webinar.live && <WebinarLiveChip compact={small} />}\n <StatusChips\n transcription={transcription}\n recording={recording}\n isE2ee={!!e2eeKey}\n compact={small}\n />\n </>\n )\n const header = !minimized && (\n <CallHeader\n title={title}\n status={status}\n view={audienceView ? undefined : view}\n onViewChange={audienceView ? undefined : setView}\n onMinimise={onMinimizedChange ? () => onMinimizedChange(true) : undefined}\n />\n )\n const participantsList = (compact: boolean) => (\n <ParticipantsList\n callExtId={callExtId}\n isCreator={isCreator}\n speakingIds={speakingIds}\n onAskToMute={isCreator ? askToMute : undefined}\n compact={compact}\n />\n )\n const sidePanel = (opts: { people: boolean; onClose(): void; className?: string }) => (\n <WebinarSidePanel\n webinar={webinar}\n chat={chat}\n people={opts.people ? participantsList(false) : undefined}\n tab={tab}\n onTabChange={setTab}\n onClose={opts.onClose}\n className={opts.className}\n />\n )\n\n return (\n <>\n {sendsMedia && transcription.available && (\n <TranscriptionSender transcription={transcription} />\n )}\n {/* Everyone on stage records their own microphone (workspace guests too); the host also the\n composite. A webinar's audience never sends audio. */}\n {sendsMedia && <SpeakerRecorder recording={recording} callKey={e2eeKey} />}\n {recording.canControl && recording.mode === 'audio_video' && (\n <CompositeRecorder recording={recording} callKey={e2eeKey} stageRef={stageRef} />\n )}\n <RecordingQuotaWarning recording={recording} />\n {webinar.moderator && (\n <WebinarEndConfirm open={endConfirm} onOpenChange={setEndConfirm} onEnd={webinar.end} />\n )}\n {webinar.stageCheck && (\n <OnStageCheck\n initialChoices={DEFAULT_JOIN_CHOICES}\n open\n mirror={mirrorSelf}\n describeError={(err, kind) => classifyMediaError(err, kind)}\n onJoinStage={webinar.joinStage}\n onStayInAudience={webinar.stepDown}\n />\n )}\n {/* The stage stays mounted while minimised: the composite recording keeps its element, and\n the status chips move to the card, so each is shown exactly once. While the host records\n video it stays laid out (invisible, inert, behind the card) so the recording keeps\n drawing the call; otherwise it is simply hidden. */}\n <div\n ref={frameRef}\n className={cn(\n 'min-h-0 flex-1',\n !minimized\n ? 'flex'\n : drawsComposite\n ? 'pointer-events-none fixed flex opacity-0'\n : 'hidden'\n )}\n style={minimized && drawsComposite ? (stageRect ?? OFFSCREEN_STAGE) : undefined}\n aria-hidden={minimized || undefined}\n inert={minimized || undefined}\n data-testid=\"call-stage-frame\"\n >\n {audienceView ? (\n <WebinarViewer\n header={header}\n stage={<CallTiles view=\"speaker\" includeLocal={false} />}\n stageRef={stageRef}\n stageOverlay={<ConnectingOverlay />}\n captions={\n transcription.on || transcription.captions.length > 0 ? (\n <CaptionsOverlay captions={transcription.captions} />\n ) : undefined\n }\n side={\n viewerSideOpen\n ? sidePanel({\n people: false,\n onClose: () => setViewerSide(false),\n className: 'size-full',\n })\n : undefined\n }\n sideToggle={{\n open: viewerSideOpen,\n onToggle: () => setViewerSide(!viewerSideOpen),\n label: webinar.chat === 'everyone' ? 'Q&A and chat' : 'Q&A',\n count: openQuestionCount(webinar) + chat.unread,\n }}\n hand={{ raised: webinar.handRaised, onToggle: webinar.setHand }}\n onLeave={() => void room.disconnect()}\n left={<EnableAudioButton compact={density !== 'full'} />}\n shortcuts={!minimized}\n />\n ) : (\n <CallStageFrame\n stageRef={stageRef}\n header={header}\n subheader={\n !minimized && (\n <>\n {webinar.team && !webinar.live && (\n <BackstageBanner onGoLive={webinar.moderator ? webinar.goLive : undefined} />\n )}\n {notices.map((n) => (\n <CallNotice key={n}>{n}</CallNotice>\n ))}\n <SpeakingNow names={speakingNames} />\n </>\n )\n }\n stage={<CallTiles view={view} />}\n stageOverlay={\n <>\n <Lobby callExtId={callExtId} />\n <ConnectingOverlay />\n </>\n }\n // Who is in the call, always on show under the video (a strip in a short panel); in a\n // webinar, the first tab of its side panel.\n people={\n !minimized &&\n (!webinar.enabled\n ? participantsList(shortPanel)\n : teamPanelOpen &&\n sidePanel({\n people: true,\n onClose: () => setTeamPanelOpen(false),\n className: cn(\n 'border-t border-border',\n shortPanel ? 'h-64 shrink-0' : 'min-h-0 flex-1'\n ),\n }))\n }\n stageHeight={\n shortPanel\n ? undefined\n : (w, h) => stageContentHeight(stageShape.view, w, h, stageShape.count)\n }\n controls={\n !minimized && (\n <CallControls\n callExtId={callExtId}\n isCreator={isCreator}\n link={link}\n startedAt={startedAt}\n density={density}\n shortcuts={!minimized}\n transcription={transcription}\n recording={recording}\n {...webinarControls(webinar, {\n panelOpen: teamPanelOpen,\n onOpenPanel: () => setTeamPanelOpen(true),\n unread: chat.unread,\n onEnd: () => setEndConfirm(true),\n })}\n />\n )\n }\n />\n )}\n </div>\n {minimized && (\n <MinimisedRoom\n title={title}\n status={status(true)}\n speakingNames={speakingNames}\n audience={audienceView}\n onRestore={() => onMinimizedChange?.(false)}\n onLeave={() => void room.disconnect()}\n />\n )}\n </>\n )\n}\n\n/** Questions still waiting for an answer (the badge on the Q&A toggles). */\nfunction openQuestionCount(webinar: WebinarControl): number {\n return webinar.questions.filter((q) => q.status === 'open' || q.status === 'answering').length\n}\n\n/**\n * The team's webinar controls, all inside the call's existing controls so the bar never grows: in\n * More, the chat setting (moderators), \"Show the webinar panel\" while it is closed, and Leave stage\n * (anyone on stage but the host); End webinar is the Leave button's second choice (moderators,\n * while live). Nothing outside a webinar.\n */\nfunction webinarControls(\n webinar: WebinarControl,\n opts: { panelOpen: boolean; onOpenPanel(): void; unread: number; onEnd(): void }\n): {\n menuGroups?: (MoreMenuItem[] | MoreMenuSection)[]\n leaveOptions?: LeaveOption[]\n} {\n if (!webinar.enabled) return {}\n const badge = openQuestionCount(webinar) + webinar.hands.length + opts.unread\n const items: MoreMenuItem[] = [\n ...(!opts.panelOpen\n ? [\n {\n key: 'webinar-panel',\n label: 'Show the webinar panel',\n icon: <MessageCircleQuestion />,\n onSelect: opts.onOpenPanel,\n trailing: badge ? (\n <span className=\"text-xs tabular-nums text-muted-foreground\">{badge}</span>\n ) : undefined,\n testId: 'webinar-panel-open',\n },\n ]\n : []),\n ...(webinar.role !== 'host'\n ? [\n {\n key: 'leave-stage',\n label: 'Leave stage',\n icon: <ArrowDownToLine />,\n onSelect: () => void webinar.stepDown().catch(() => {}),\n testId: 'webinar-leave-stage',\n },\n ]\n : []),\n ]\n return {\n menuGroups: [\n ...(webinar.moderator\n ? [chatPermissionSection({ value: webinar.chat, onChange: webinar.setChat })]\n : []),\n items,\n ],\n leaveOptions:\n webinar.moderator && webinar.live\n ? [\n {\n key: 'end',\n label: 'End webinar for everyone',\n onSelect: opts.onEnd,\n testId: 'webinar-end',\n },\n ]\n : undefined,\n }\n}\n\n/**\n * The \"started by\" sentences of a recording / transcription that just began, each shown for\n * {@link NOTICE_MS} under the header (once per recording or transcription).\n */\nfunction useCallNotices(\n recording: CallRecordingControl,\n transcription: CallTranscription\n): string[] {\n const [shown, setShown] = useState<Record<string, string>>({})\n const recordingText = recording.on\n ? `Recording${recording.mode ? ` (${MODE_LABEL[recording.mode]})` : ''} — started by ${\n recording.startedByMe ? 'you' : recording.startedByName || 'the host'\n }`\n : null\n const transcriptionText = transcription.on\n ? `Transcription on — started by ${\n transcription.startedByMe ? 'you' : transcription.startedByName || 'a participant'\n }`\n : null\n useNotice('recording', recordingText, setShown)\n useNotice('transcription', transcriptionText, setShown)\n return Object.values(shown)\n}\n\nfunction useNotice(\n key: string,\n text: string | null,\n setShown: (fn: (s: Record<string, string>) => Record<string, string>) => void\n): void {\n const on = !!text\n const latest = useRef(text)\n latest.current = text\n useEffect(() => {\n if (!on) return\n setShown((s) => ({ ...s, [key]: latest.current ?? '' }))\n const id = setTimeout(\n () =>\n setShown((s) => {\n const next = { ...s }\n delete next[key]\n return next\n }),\n NOTICE_MS\n )\n return () => {\n clearTimeout(id)\n setShown((s) => {\n const next = { ...s }\n delete next[key]\n return next\n })\n }\n }, [on, key, setShown])\n useEffect(() => {\n if (text) setShown((s) => (key in s && s[key] !== text ? { ...s, [key]: text } : s))\n }, [text, key, setShown])\n}\n\n/** Recording, transcription and encryption, each once. */\nfunction StatusChips({\n transcription,\n recording,\n isE2ee,\n compact,\n}: {\n transcription: CallTranscription\n recording: CallRecordingControl\n isE2ee: boolean\n compact: boolean\n}): ReactElement {\n const { localParticipant } = useLocalParticipant()\n const encrypted = useIsEncrypted(localParticipant)\n return (\n <span className=\"flex items-center gap-1.5\" data-testid=\"call-status\">\n {/* The legal notices: shown BEFORE anything is captured (their mount gates the recorders). */}\n {recording.on && (\n <RecordingIndicator recording={recording} compact={compact} announce={false} />\n )}\n {transcription.on && (\n <TranscriptionIndicator transcription={transcription} compact={compact} announce={false} />\n )}\n <EncryptionStatusChip\n state={isE2ee ? (encrypted ? 'on' : 'pending') : 'off'}\n compact={compact}\n />\n </span>\n )\n}\n\nconst trackKey = (t: TrackReferenceOrPlaceholder) =>\n `${t.participant.identity}:${t.source}:${isTrackReference(t) ? t.publication.trackSid : 'placeholder'}`\n\n/** A LiveKit participant as an ARBI tile (keeps LiveKit's tile attributes for the recorder). */\nfunction RoomTile({\n trackRef,\n size = 'md',\n}: {\n trackRef: TrackReferenceOrPlaceholder\n size?: CallTileSize\n}): ReactElement {\n const { participant } = trackRef\n const { elementProps } = useParticipantTile<HTMLDivElement>({ trackRef, htmlProps: {} })\n const screen = trackRef.source === Track.Source.ScreenShare\n const videoMuted = useIsMuted(trackRef)\n const micMuted = useIsMuted({ participant, source: Track.Source.Microphone })\n const speaking = useIsSpeaking(participant.identity)\n const level = useVoiceLevel(participant.identity)\n const { quality } = useConnectionQualityIndicator({ participant })\n const hasVideo = isTrackReference(trackRef) && !!trackRef.publication.track && !videoMuted\n const name = participant.name || participant.identity\n const [mirrorSelf] = useMirrorSelfView()\n return (\n <CallTile\n {...elementProps}\n name={\n <>\n <CallUserPill\n identity={participant.identity}\n name={participant.name}\n variant={size === 'sm' ? 'icon' : 'pill'}\n />\n {/* The host's composite recording reads the name from LiveKit's element. */}\n <ParticipantName participant={participant} hidden />\n </>\n }\n initials={initialsOf(name)}\n video={hasVideo ? <VideoTrack trackRef={trackRef} /> : undefined}\n source={screen ? 'screen' : 'camera'}\n local={participant.isLocal}\n mirror={participant.isLocal && !screen && mirrorSelf}\n speaking={speaking}\n level={level}\n micMuted={micMuted}\n poorConnection={quality === ConnectionQuality.Poor || quality === ConnectionQuality.Lost}\n size={size}\n />\n )\n}\n\n/**\n * Cameras (with placeholders) and screen shares in the room. A webinar's audience is not on the\n * stage, so its viewer leaves me out (`includeLocal` false); LiveKit already hides the others.\n */\nfunction useStageTracks(includeLocal = true) {\n const all = useTracks(\n [\n { source: Track.Source.Camera, withPlaceholder: true },\n { source: Track.Source.ScreenShare, withPlaceholder: false },\n ],\n { onlySubscribed: false }\n )\n const tracks = includeLocal ? all : all.filter((t) => !t.participant.isLocal)\n const share = tracks.find(\n (t) => isTrackReference(t) && t.publication.source === Track.Source.ScreenShare\n )\n const cameras = tracks.filter((t) => t.source === Track.Source.Camera)\n return { share, cameras }\n}\n\n/** The camera to put in the spotlight: the dominant speaker, else someone else, else me. */\nfunction useSpotlightCamera(\n cameras: TrackReferenceOrPlaceholder[]\n): TrackReferenceOrPlaceholder | undefined {\n const spotlight = useSpotlightId()\n // Never me in the large slot while anyone else is in the call.\n const id = pickSpotlight(\n cameras.map((t) => ({ id: t.participant.identity, local: t.participant.isLocal })),\n spotlight\n )\n return cameras.find((t) => t.participant.identity === id)\n}\n\n/**\n * Speaker view: a shared screen, else the dominant speaker, large; everyone else in a filmstrip.\n * Gallery view: everyone equal (a shared screen still takes the large slot).\n */\nfunction CallTiles({\n view,\n includeLocal = true,\n}: {\n view: CallView\n includeLocal?: boolean\n}): ReactElement {\n const { share, cameras } = useStageTracks(includeLocal)\n const spotlight = useSpotlightCamera(cameras)\n const focus = share ?? (view === 'speaker' ? spotlight : undefined)\n if (!focus || (cameras.length < 2 && !share)) {\n return (\n <CallGrid items={cameras} getKey={trackKey} renderTile={(t) => <RoomTile trackRef={t} />} />\n )\n }\n return (\n <CallFocus\n focus={focus}\n others={cameras.filter((t) => t !== focus)}\n getKey={trackKey}\n renderTile={(t, size) => <RoomTile trackRef={t} size={size} />}\n testId={share ? 'call-focus' : 'call-speaker-view'}\n />\n )\n}\n\nfunction MinimisedRoom({\n title,\n status,\n speakingNames,\n audience = false,\n onRestore,\n onLeave,\n}: {\n title: string\n status: ReactElement\n speakingNames: ReactElement[]\n /** A webinar's audience: not on the stage, no microphone or camera. */\n audience?: boolean\n onRestore(): void\n onLeave(): void\n}): ReactElement {\n const { share, cameras } = useStageTracks(!audience)\n const spotlight = useSpotlightCamera(cameras)\n const track = share ?? spotlight\n const mic = useTrackToggle({ source: Track.Source.Microphone })\n const camera = useTrackToggle({ source: Track.Source.Camera })\n return (\n <MinimisedCall\n title={title}\n video={track ? <RoomTile trackRef={track} size=\"sm\" /> : null}\n status={status}\n speaking={<SpeakingNow names={speakingNames} className=\"text-xs\" />}\n micEnabled={audience ? undefined : mic.enabled}\n onToggleMic={audience ? undefined : () => void mic.toggle()}\n cameraEnabled={audience ? undefined : camera.enabled}\n onToggleCamera={audience ? undefined : () => void camera.toggle()}\n onRestore={onRestore}\n onLeave={onLeave}\n />\n )\n}\n\n/**\n * Who is in the room, as a live speaker list (talkers first, each with a voice meter and mic\n * state). The host can ask someone to mute (a request), mute their mic or turn off their camera\n * (they may turn it back on), and remove them (LiveKit RemoveParticipant).\n */\nfunction ParticipantsList({\n callExtId,\n isCreator,\n speakingIds,\n onAskToMute,\n compact,\n}: {\n callExtId: string\n isCreator: boolean\n speakingIds: string[]\n onAskToMute?(identity: string): void\n /** A short panel: one strip with \"Show all (N)\". */\n compact: boolean\n}): ReactElement {\n const { notify } = useBlocksEnvironment()\n const arbi = useArbi()\n const participants = useParticipants()\n const [removing, setRemoving] = useState<string | null>(null)\n const remove = async (identity: string, name: string) => {\n setRemoving(identity)\n try {\n await arbi.calls.removeParticipant(callExtId, identity)\n notify(`Removed ${name} from the call`, 'info')\n } catch (err) {\n notify(`Could not remove ${name}: ${(err as Error).message}`, 'error')\n } finally {\n setRemoving(null)\n }\n }\n // Re-renders with the levels (≤ every 60 ms): a short list, and that is the point.\n const mute = async (identity: string, name: string, track: 'audio' | 'video') => {\n try {\n await arbi.calls.muteParticipant(callExtId, identity, track)\n notify(track === 'audio' ? `Muted ${name}` : `Turned off ${name}’s camera`, 'info')\n } catch (err) {\n notify(\n `Could not ${track === 'audio' ? 'mute' : 'turn off the camera of'} ${name}: ${(err as Error).message}`,\n 'error'\n )\n }\n }\n const levels = useVoiceLevels()\n const ordered = [\n ...speakingIds\n .map((id) => participants.find((p) => p.identity === id))\n .filter((p): p is NonNullable<typeof p> => !!p),\n ...participants.filter((p) => !speakingIds.includes(p.identity)),\n ]\n return (\n <CallParticipants\n // The list takes the panel's spare height; folded to a strip, the video keeps it.\n className={compact ? undefined : 'flex-1'}\n compact={compact}\n people={ordered.map((p) => ({\n id: p.identity,\n name: p.name || p.identity,\n isLocal: p.isLocal,\n entity: (\n <CallUserPill identity={p.identity} name={p.name} size=\"sm\" interactive={!p.isLocal} />\n ),\n speaking: speakingIds.includes(p.identity),\n level: levels[p.identity] ?? 0,\n micMuted: !p.isMicrophoneEnabled,\n cameraOn: p.isCameraEnabled,\n }))}\n canRemove={isCreator}\n removingId={removing}\n onRemove={(p) => void remove(p.id, p.name)}\n onAskToMute={onAskToMute ? (p) => onAskToMute(p.id) : undefined}\n onMute={isCreator ? (p, track) => void mute(p.id, p.name, track) : undefined}\n />\n )\n}\n\n/** People waiting in the lobby of this call; shown to everyone who may admit them. */\nfunction Lobby({ callExtId }: { callExtId: string }): ReactElement | null {\n const { notify } = useBlocksEnvironment()\n const arbi = useArbi()\n const knocks = useCallSession((s) => s.knocks)\n const mine = knocks.filter((k) => k.callExtId === callExtId)\n const decide = async (knockId: string, admit: boolean) => {\n callSession.removeKnock(knockId)\n try {\n await arbi.calls.decideKnock(callExtId, knockId, admit)\n } catch (err) {\n notify(`Could not answer the request: ${(err as Error).message}`, 'error')\n }\n }\n return (\n <LobbyRequests\n requests={mine.map((k) => ({\n id: k.knockId,\n name: k.displayName,\n entity: <CallUserPill identity={k.userExtId} name={k.displayName} />,\n }))}\n onDecide={(id, admit) => void decide(id, admit)}\n />\n )\n}\n\nfunction ConnectingOverlay(): ReactElement | null {\n const state = useConnectionState()\n if (state === ConnectionState.Connected) return null\n const label =\n state === ConnectionState.Reconnecting || state === ConnectionState.SignalReconnecting\n ? 'Reconnecting…'\n : state === ConnectionState.Disconnected\n ? 'Disconnected'\n : 'Connecting…'\n return <ConnectionOverlay label={label} />\n}\n"]}
|