import type { ReactNode } from 'react' import { Mic, MicOff, Video, VideoOff } from 'lucide-react' import type { DeviceCheckStatus } from '@/hooks/useDeviceCheckAccess' import '@/styles/device-check.css' interface DeviceCheckCardProps { /** Коллбэк-реф из `useDeviceCheckAccess` — см. докстринг там: карточка * может рендериться в разных местах JSX-дерева (разные шаги `JoinPage`), * обычный объект-реф не пережил бы такой переезд. */ videoRef: (node: HTMLVideoElement | null) => void videoStatus: DeviceCheckStatus audioStatus: DeviceCheckStatus /** `useDeviceCheckAccess().hint` — `null`, пока отказа нет (см. докстринг хука). */ hint: string | null /** Одновременно и «войти с камерой/микрофоном включёнными», и (для видео) * реальное состояние превью — см. докстринг `useDeviceCheckAccess`. */ videoEnabled: boolean audioEnabled: boolean onToggleVideo: () => void onToggleAudio: () => void /** * Выбор фона под кнопками (сессия 35) — приходит готовым узлом, а не набором * пропсов: карточка про доступ к устройствам и знать про фоны, их лимиты и * загрузку не обязана. `undefined` — модуль выключен, устройство не * десктопное либо браузер не умеет сегментацию; тогда блока нет вовсе. */ backgroundPicker?: ReactNode } /** * Превью камеры + переключатели «микрофон/камера» — окошко превью и кнопки * составляют одну композицию (кнопки не шире окошка, см. `device-check.css`). * Кнопки без подписи — только пиктограмма (иначе не умещаются под окошком * шириной в половину карточки); машиночитаемое состояние — `aria-label`. * Кликабельны только после реального разрешения (`granted`) — до этого * непонятно, что вообще включать. * * `