fix(room): мини-окно игнорировало закрепление, а демонстрация слетала от реплики
Мини-плеер намеренно вёл себя иначе, чем основное окно: без удержания демонстрации экрана (holdScreenShare), без приоритета говорящего с включённой камерой, без антидребезга говорящего и с собственным чистым useState для закрепления. На практике это читалось как поломка — закрепление, сделанное в основном окне, в мини-окне не действовало, а демонстрация экрана пропадала, стоило кому-то сказать слово. Теперь pickStageFocus получает одинаковые правила в обоих вариантах сцены. Единственное сознательное отличие — localKey («показать себя» последним фолбэком), он остаётся только у мини-плеера: это защита от дефекта 0.0.11, когда мини-окно открывалось на самом пользователе. Закрепление переезжает между окнами тем же мостиком через RoomPage, что и фокус (initialPinnedKey/onPinnedKeyChange). Отдельный общий источник правды не нужен: экземпляр сцены в каждый момент ровно один — пока открыт Document PiP, основное окно показывает заглушку. Заодно в снятии закрепления «участник вышел из комнаты» добавлена охрана tracksKnown. На первом рендере нового экземпляра сцены useTracks отдаёт пустой массив, и пустой набор читался как «все вышли»: приехавшее через initialPinnedKey закрепление обнулялось прямо при монтировании, то есть мини-плеер терял его каждый раз. Надпись на булавке — «Закрепить» вместо «Закрепить в основном окне»: закрепление больше не ограничено основным окном.
This commit is contained in:
@@ -126,8 +126,10 @@ function TileBody({
|
||||
const showSharingChip = Boolean(
|
||||
onStopSharing && trackReference.source === Track.Source.ScreenShare && trackReference.participant.isLocal,
|
||||
)
|
||||
// Кнопка закрепления — только там, где сцена умеет закрепление (основное
|
||||
// окно передаёт `onTogglePin`; в мини-плеере плитка одна, закреплять нечего).
|
||||
// Кнопка закрепления — только там, где сцена её даёт (основное окно передаёт
|
||||
// `onTogglePin`; в мини-плеере своего тулбара нет и плитка одна, поэтому
|
||||
// булавки там нет — само закрепление, сделанное в основном окне, с 0.0.25
|
||||
// действует и в мини-плеере, см. `initialPinnedKey` в `RoomStage`).
|
||||
// Ключ плитки берём из её собственного трека: в карусели/гриде плитки
|
||||
// рендерятся шаблоном без пропсов, снаружи «какая это плитка» не передать.
|
||||
const tileKey = stageTrackKey(trackReference)
|
||||
@@ -200,10 +202,8 @@ function TileBody({
|
||||
type="button"
|
||||
className={`room-pin-toggle${isPinned ? ' is-pinned' : ''}`}
|
||||
aria-pressed={isPinned}
|
||||
title={isPinned ? 'Открепить' : 'Закрепить в основном окне'}
|
||||
aria-label={
|
||||
isPinned ? `Открепить: ${displayName}` : `Закрепить в основном окне: ${displayName}`
|
||||
}
|
||||
title={isPinned ? 'Открепить' : 'Закрепить'}
|
||||
aria-label={isPinned ? `Открепить: ${displayName}` : `Закрепить: ${displayName}`}
|
||||
onClick={(e) => {
|
||||
// Иначе клик долетит до самой плитки (`onParticipantClick`
|
||||
// у `ParticipantTile`) — булавка не должна означать «клик по плитке».
|
||||
|
||||
Reference in New Issue
Block a user