fix(room): мини-окно открывается на плитке из основного окна
В Chrome мини-плеер показывал самого пользователя вместо того, что он видел крупно. Сцена в мини-окне — отдельный экземпляр RoomStage (портал в PiP-окно), и состояние фокуса он начинал с нуля: демонстрации нет, никто прямо сейчас не говорит — pickStageFocus доходил до последнего фолбэка localKey, то есть до «показать себя». В Safari бага не было видно: там Document PiP не используется, а video-фолбэк берёт <video> прямо из фокус-плитки основного окна. Ключ фокуса теперь передаётся наружу (onFocusKeyChange), живёт в состоянии RoomPage и достаётся следующему экземпляру сцены (initialFocusKey). Работает в обе стороны — возврат из мини-плеера тоже не сбрасывает фокус. Правила выбора фокуса (pickStageFocus) не тронуты.
This commit is contained in:
@@ -168,6 +168,13 @@ export function RoomPage() {
|
||||
saveStageLayoutMode(mode)
|
||||
}, [])
|
||||
|
||||
// Ключ трека, который сцена показывает крупно. Живёт ЗДЕСЬ, а не только
|
||||
// внутри `RoomStage`, потому что при открытии мини-плеера сцена
|
||||
// размонтируется в основном окне и монтируется заново в PiP-окне (портал
|
||||
// ниже) — без этого мостика новый экземпляр начинал бы выбор фокуса с нуля и
|
||||
// открывал мини-окно на самом пользователе. Подробнее — докстринг `RoomStage`.
|
||||
const [stageFocusKey, setStageFocusKey] = useState<string | null>(null)
|
||||
|
||||
// Сохранённый выбор устройств — читаем через собственный вызов
|
||||
// usePersistentUserChoices (независимый от того, что использует
|
||||
// DeviceSettingsDialog: там свой вызов хука со своим состоянием). ВАЖНО:
|
||||
@@ -241,6 +248,8 @@ export function RoomPage() {
|
||||
hideOthers={hideOthers}
|
||||
onShowOthers={() => setHideOthers(false)}
|
||||
onHideOthers={() => setHideOthers(true)}
|
||||
initialFocusKey={stageFocusKey}
|
||||
onFocusKeyChange={setStageFocusKey}
|
||||
/>
|
||||
)}
|
||||
{chatVisible && chatOpen && (
|
||||
@@ -284,8 +293,13 @@ export function RoomPage() {
|
||||
рендерящийся в PiP-окне, продолжает читать RoomContext/треки.
|
||||
`variant="pip"` — мини-плеер
|
||||
показывает только активное окно (одну плитку), без карусели/грида
|
||||
основного окна. */}
|
||||
{pip.pipWindow && createPortal(<RoomStage variant="pip" />, pip.pipWindow.document.body)}
|
||||
основного окна. `initialFocusKey` — то, что было крупно в основном
|
||||
окне: без него мини-окно открывалось на самом пользователе. */}
|
||||
{pip.pipWindow &&
|
||||
createPortal(
|
||||
<RoomStage variant="pip" initialFocusKey={stageFocusKey} onFocusKeyChange={setStageFocusKey} />,
|
||||
pip.pipWindow.document.body,
|
||||
)}
|
||||
</LiveKitRoom>
|
||||
</div>
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user