fix(auth): превью и проверка устройств на шаге "Подключиться к конференции"
Продолжение 33: раньше превью показывалось только на карточке "Как вас зовут?" (guest-info), а авторизованный пользователь, входящий через /join, этот шаг вообще не проходит (сразу connecting) — значит, никогда не видел проверку устройств и не мог задать enterWithVideo/Audio. Теперь превью и кнопки — на обоих шагах (input и guest-info), с одним непрерывным потоком: hook enabled/release эффект завязаны на общий флаг "мы на одном из шагов с превью", а не на конкретный step, иначе переход input -> guest-info выглядел бы для эффекта как уход с гашением камеры. Заодно нашёл и починил реальную грабли: <video> на разных шагах — это разные DOM-узлы (разные позиции в JSX), обычный ref.current не пережил бы переезд между ними — поток остаётся жив, но картинка гаснет в чёрный прямоугольник. videoRef хука теперь callback-ref, переподключающий уже открытый поток к любому новому узлу автоматически.
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
import type { RefObject } from 'react'
|
||||
import { Mic, MicOff, Video, VideoOff } from 'lucide-react'
|
||||
import type { DeviceCheckStatus } from '@/hooks/useDeviceCheckAccess'
|
||||
import '@/styles/device-check.css'
|
||||
|
||||
interface DeviceCheckCardProps {
|
||||
videoRef: RefObject<HTMLVideoElement | null>
|
||||
/** Коллбэк-реф из `useDeviceCheckAccess` — см. докстринг там: карточка
|
||||
* может рендериться в разных местах JSX-дерева (разные шаги `JoinPage`),
|
||||
* обычный объект-реф не пережил бы такой переезд. */
|
||||
videoRef: (node: HTMLVideoElement | null) => void
|
||||
videoStatus: DeviceCheckStatus
|
||||
audioStatus: DeviceCheckStatus
|
||||
/** `useDeviceCheckAccess().hint` — `null`, пока отказа нет (см. докстринг хука). */
|
||||
@@ -25,10 +27,10 @@ interface DeviceCheckCardProps {
|
||||
* Кликабельны только после реального разрешения (`granted`) — до этого
|
||||
* непонятно, что вообще включать.
|
||||
*
|
||||
* `<video>` рендерится ВСЕГДА (не только при `videoEnabled`) — хук
|
||||
* привязывает `srcObject` к `videoRef.current` синхронно в момент получения
|
||||
* потока, ДО следующего рендера; если бы элемент монтировался условно,
|
||||
* в момент присвоения его ещё не было бы в DOM и поток повис бы никуда не
|
||||
* `<video>` рендерится ВСЕГДА (не только при `videoEnabled`) — коллбэк-реф
|
||||
* хука подключает `srcObject` при КАЖДОМ монтировании узла (см. докстринг
|
||||
* `useDeviceCheckAccess`); если бы элемент монтировался условно, в момент
|
||||
* присвоения его ещё не было бы в DOM и поток повис бы никуда не
|
||||
* подключённым. Плейсхолдер лежит поверх, пока превью не готово ИЛИ камера
|
||||
* выключена кнопкой (`!videoEnabled`) — кнопка камеры реально останавливает
|
||||
* поток (см. докстринг хука), а не просто прячет картинку.
|
||||
|
||||
Reference in New Issue
Block a user