🩹(frontend) make recording statuses more accurate

Link recording statuses to the `isRecording` attribute from the room on the
client side.

After the refactor, the frontend relied only on recording statuses computed by
the backend. However, when egress is started and the backend is notified, the
recording is not actually active yet. It takes some time for the egress to join
the room and begin recording.

Enrich the frontend by combining backend statuses with the room recording state
to more accurately reflect when recording is truly active. This avoids missing
the first few seconds of audio at the beginning of a recording.
This commit is contained in:
lebaudantoine
2026-01-04 19:47:01 +01:00
committed by aleb_the_flash
parent 37a2f3985a
commit 8a0dfd1478
2 changed files with 19 additions and 5 deletions

View File

@@ -12,6 +12,7 @@ import { Button as RACButton } from 'react-aria-components'
import { useSidePanel } from '@/features/rooms/livekit/hooks/useSidePanel'
import { useRoomMetadata } from '../hooks/useRoomMetadata'
import { RecordingStatusIcon } from './RecordingStatusIcon'
import { useIsRecording } from '@livekit/components-react'
export const RecordingStateToast = () => {
const { t } = useTranslation('rooms', {
@@ -46,6 +47,7 @@ export const RecordingStateToast = () => {
const isStarting = isTranscriptStarting || isScreenRecordingStarting
const metadata = useRoomMetadata()
const isRecording = useIsRecording()
const key = useMemo(() => {
if (!metadata?.recording_status || !metadata?.recording_mode) {
@@ -56,8 +58,14 @@ export const RecordingStateToast = () => {
return undefined
}
return `${metadata.recording_mode}.${metadata.recording_status}`
}, [metadata, isStarted, isStarting])
let status = metadata.recording_status
if (isStarted && !isRecording) {
status = 'starting'
}
return `${metadata.recording_mode}.${status}`
}, [metadata, isStarted, isStarting, isRecording])
if (!key) return null

View File

@@ -1,6 +1,7 @@
import { RecordingMode } from '@/features/recording'
import { useRoomMetadata } from './useRoomMetadata'
import { useMemo } from 'react'
import { useIsRecording } from '@livekit/components-react'
export enum RecordingStatus {
Starting = 'starting',
@@ -26,13 +27,18 @@ export const useRecordingStatuses = (
mode: RecordingMode
): RecordingStatuses => {
const metadata = useRoomMetadata()
const isRecording = useIsRecording()
return useMemo(() => {
if (metadata && metadata?.recording_mode === mode) {
return {
isAnotherModeStarted: false,
isStarting: metadata.recording_status === RecordingStatus.Starting,
isStarted: metadata.recording_status === RecordingStatus.Started,
isStarting:
metadata.recording_status === RecordingStatus.Starting ||
(metadata.recording_status === RecordingStatus.Started &&
!isRecording),
isStarted:
metadata.recording_status === RecordingStatus.Started && isRecording,
isSaving: metadata.recording_status === RecordingStatus.Saving,
isActive: ACTIVE_STATUSES.includes(
metadata.recording_status as RecordingStatus
@@ -52,5 +58,5 @@ export const useRecordingStatuses = (
isSaving: false,
isActive: false,
}
}, [mode, metadata])
}, [mode, metadata, isRecording])
}