import { Dropdown, Icon, type IconName } from "@nodedc/ui-react"; import type { ObservationSourceAvailability, ObservationSourceDescriptor, ObservationSourceModality, } from "../core/runtime/contracts"; import { MseFmp4WebSocketPlayer } from "./MseFmp4WebSocketPlayer"; import { RecordedFmp4Player, type RecordedObservationPlayback, } from "./RecordedFmp4Player"; import type { RecordedAdmissionPhase, RecordedCameraAdmissionState, } from "../core/observation/recordedSessionAdmission"; const sourceIcon: Record = { "point-cloud": "globe", video: "video", image: "image", depth: "image", }; const availabilityCopy: Record = { unverified: "Не подтверждён", declared: "Канал объявлен", available: "Доступен", connecting: "Подключение", streaming: "Эфир", degraded: "Нестабильно", unavailable: "Недоступен", error: "Ошибка", }; export function observationSourceStatusLabel(source: ObservationSourceDescriptor): string { return availabilityCopy[source.availability]; } export function ObservationMedia({ source, playback, prepareRecorded = true, recordedSessionGate = "ready", recordedAdmissionKey = null, onRecordedAdmissionChange, }: { source: ObservationSourceDescriptor; playback?: RecordedObservationPlayback | null; prepareRecorded?: boolean; recordedSessionGate?: RecordedAdmissionPhase; recordedAdmissionKey?: string | null; onRecordedAdmissionChange?: ( sourceId: string, state: RecordedCameraAdmissionState, ) => void; }) { const sourceSelected = source.activation ? source.activation.selected : true; const deliveryActive = Boolean(source.delivery && sourceSelected); if ( deliveryActive && source.delivery?.kind === "mse-fmp4-websocket" && source.modality === "video" ) { return ; } if ( deliveryActive && source.delivery?.kind === "recorded-fmp4-manifest" && source.modality === "video" ) { if (!prepareRecorded) { return (
); } return ( onRecordedAdmissionChange?.(source.id, state)} /> ); } if (deliveryActive && source.delivery?.kind === "video-url" && source.modality === "video") { return (