feat(room): показывать название конференции вместо технического room_name
RoomTopbar рендерил `JoinOut.room_name` — техническое имя комнаты LiveKit вида `hC-Dmos9KEM`, которое туда попало по ошибке (перепутано с человекочитаемым title конференции). Теперь топбар получает `title` (из резолва номера/ссылки или из карточки конференции в лобби) и падает на «Конференция без названия», если организатор его не задал. Номер и slug остаются на своих местах — в инвайт-чипе и в адресе, где они нужны функционально.
This commit is contained in:
@@ -4,7 +4,14 @@ import { useState } from 'react'
|
|||||||
import { pluralizeParticipants } from '@/lib/pluralize'
|
import { pluralizeParticipants } from '@/lib/pluralize'
|
||||||
|
|
||||||
interface RoomTopbarProps {
|
interface RoomTopbarProps {
|
||||||
roomName: string
|
/**
|
||||||
|
* Название конференции (`ConferenceOut.title`/`ResolveOut.title`) —
|
||||||
|
* `null`/не задано, если организатор его не указал. НЕ путать с
|
||||||
|
* `JoinOut.room_name` (техническое имя комнаты LiveKit вида `hC-Dmos9KEM`,
|
||||||
|
* которое сюда раньше и попадало по ошибке, см. задачу A6) — тот нужен
|
||||||
|
* только серверу и в UI показывать нечего.
|
||||||
|
*/
|
||||||
|
title: string | null
|
||||||
/** Slug/номер конференции из адреса — для инвайт-чипа (копирование ссылки). */
|
/** Slug/номер конференции из адреса — для инвайт-чипа (копирование ссылки). */
|
||||||
slug?: string
|
slug?: string
|
||||||
number?: string
|
number?: string
|
||||||
@@ -19,7 +26,7 @@ interface RoomTopbarProps {
|
|||||||
* тёмных токенов темы `room` (см. `--color-room-tile*`), без новых
|
* тёмных токенов темы `room` (см. `--color-room-tile*`), без новых
|
||||||
* цветов и форм.
|
* цветов и форм.
|
||||||
*/
|
*/
|
||||||
export function RoomTopbar({ roomName, slug, number }: RoomTopbarProps) {
|
export function RoomTopbar({ title, slug, number }: RoomTopbarProps) {
|
||||||
const participants = useParticipants()
|
const participants = useParticipants()
|
||||||
const [copied, setCopied] = useState(false)
|
const [copied, setCopied] = useState(false)
|
||||||
|
|
||||||
@@ -39,7 +46,7 @@ export function RoomTopbar({ roomName, slug, number }: RoomTopbarProps) {
|
|||||||
return (
|
return (
|
||||||
<header className="room-topbar">
|
<header className="room-topbar">
|
||||||
<div className="room-title-block">
|
<div className="room-title-block">
|
||||||
<h1>{roomName}</h1>
|
<h1>{title ?? 'Конференция без названия'}</h1>
|
||||||
<p>
|
<p>
|
||||||
<span className="rec-dot" aria-hidden="true" />
|
<span className="rec-dot" aria-hidden="true" />
|
||||||
Конференция активна · <Users className="lucide" style={{ width: 14, height: 14 }} aria-hidden="true" />{' '}
|
Конференция активна · <Users className="lucide" style={{ width: 14, height: 14 }} aria-hidden="true" />{' '}
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ export function JoinPage() {
|
|||||||
state: {
|
state: {
|
||||||
livekitUrl: data.livekit_url,
|
livekitUrl: data.livekit_url,
|
||||||
token: data.token,
|
token: data.token,
|
||||||
roomName: data.room_name,
|
title: resolved.title,
|
||||||
conferenceId: data.conference_id,
|
conferenceId: data.conference_id,
|
||||||
chatEnabled: data.chat_enabled,
|
chatEnabled: data.chat_enabled,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ export function LobbyPage() {
|
|||||||
state: {
|
state: {
|
||||||
livekitUrl: conference.join.livekit_url,
|
livekitUrl: conference.join.livekit_url,
|
||||||
token: conference.join.token,
|
token: conference.join.token,
|
||||||
roomName: conference.join.room_name,
|
title: conference.title,
|
||||||
conferenceId: conference.join.conference_id,
|
conferenceId: conference.join.conference_id,
|
||||||
chatEnabled: conference.join.chat_enabled,
|
chatEnabled: conference.join.chat_enabled,
|
||||||
number: conference.number,
|
number: conference.number,
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ import { loadStageLayoutMode, saveStageLayoutMode, type StageLayoutMode } from '
|
|||||||
interface RoomJoinState {
|
interface RoomJoinState {
|
||||||
livekitUrl: string
|
livekitUrl: string
|
||||||
token: string
|
token: string
|
||||||
roomName: string
|
/** Название конференции (`ConferenceOut.title`/`ResolveOut.title`) — для топбара, см. `RoomTopbar` и задачу A6. */
|
||||||
|
title?: string | null
|
||||||
conferenceId?: string
|
conferenceId?: string
|
||||||
/** Номер конференции — для инвайт-чипа в топбаре (см. RoomTopbar). Есть только сразу после создания. */
|
/** Номер конференции — для инвайт-чипа в топбаре (см. RoomTopbar). Есть только сразу после создания. */
|
||||||
number?: string
|
number?: string
|
||||||
@@ -92,7 +93,7 @@ export function RoomPage() {
|
|||||||
setJoinState({
|
setJoinState({
|
||||||
livekitUrl: result.livekit_url,
|
livekitUrl: result.livekit_url,
|
||||||
token: result.token,
|
token: result.token,
|
||||||
roomName: result.room_name,
|
title: info.title,
|
||||||
conferenceId: result.conference_id,
|
conferenceId: result.conference_id,
|
||||||
chatEnabled: result.chat_enabled,
|
chatEnabled: result.chat_enabled,
|
||||||
})
|
})
|
||||||
@@ -246,7 +247,7 @@ export function RoomPage() {
|
|||||||
onDisconnected={handleDisconnected}
|
onDisconnected={handleDisconnected}
|
||||||
>
|
>
|
||||||
<div data-lk-theme="default" className="room-shell">
|
<div data-lk-theme="default" className="room-shell">
|
||||||
<RoomTopbar roomName={joinState.roomName} slug={slug} number={joinState.number} />
|
<RoomTopbar title={joinState.title ?? null} slug={slug} number={joinState.number} />
|
||||||
<div className="room-main">
|
<div className="room-main">
|
||||||
{pip.mode === 'document' ? (
|
{pip.mode === 'document' ? (
|
||||||
// Сцена сейчас рисуется в PiP-окне (через createPortal ниже) —
|
// Сцена сейчас рисуется в PiP-окне (через createPortal ниже) —
|
||||||
|
|||||||
Reference in New Issue
Block a user