// АРМ курсанта: приём вызова и разговор голосом. // Карточка КИО — lct-10, таймеры — lct-11. import { KioCard } from "@/features/kio-card/KioCard"; import { ModeBanner, hintsAllowed } from "@/features/mode-banner/ModeBanner"; import { Debrief } from "@/features/debrief/Debrief"; import { SelfAssessment } from "@/features/self-assessment/SelfAssessment"; import { InterviewTimer, Timers } from "@/features/timers/Timers"; import { display } from "@/features/kio-card/merge"; import { useCall } from "@/features/call/useCall"; import { sessionIdFromUrl } from "@/shared/api/session"; const STATUS_LABEL: Record = { connecting: "подключение", open: "на связи", reconnecting: "связь потеряна, переподключение", closed: "отключено", }; export function Call() { const sessionId = sessionIdFromUrl(); const call = useCall(sessionId); if (!sessionId) { return (

АРМ курсанта

В адресе нет номера занятия: откройте ссылку вида /trainee?session=…

); } return (

АРМ оператора 112

Канал{STATUS_LABEL[call.status]}
Вызов{call.incoming ? `${call.incoming.caller_number} · сценарий ${call.incoming.scenario_id} · режим ${call.incoming.mode}` : "ожидание"}
Гарнитура{call.micOn ? "микрофон включён" : "выключен"}
Звонящий{call.callerSpeaking ? "говорит" : "молчит"}

{call.phase === "incoming" && !call.micOn && ( )} {call.micOn && }{" "} {call.micOn && hintsAllowed(call.incoming?.mode) && ( )}

{call.error &&

{call.error}

} {call.phase === "ended" && !call.selfAssessed && call.checklist.length > 0 && ( )} {call.selfAssessed && !call.report &&

Самооценка принята, оценка считается…

} {call.report && }

Карточка информационного обмена

Нормативы

Разговор

{call.lines.map((line, index) => ( ))} {call.lines.length === 0 && }
{line.speaker === "caller" ? "звонящий" : "оператор"} {line.text}
—
); }