Fix live room header flash and instant sidebar panel switching.
Deploy Ladill Meet / deploy (push) Successful in 1m21s

Server-render the speaker pill on load, hide noisy connection status on mobile, and use a single sidebarPanel slot so desktop panels replace in place instead of animating side by side.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-02 06:39:32 +00:00
co-authored by Cursor
parent 17dd7107ee
commit bbf984bc60
5 changed files with 210 additions and 93 deletions
@@ -63,4 +63,83 @@ class ParticipantPresenter
return null;
}
/**
* @param list<array<string, mixed>> $participants
* @param list<string> $presenterRefs
*/
public static function isSpeakerPerson(array $person, array $presenterRefs = []): bool
{
if (in_array($person['role'] ?? '', ['host', 'co_host', 'panelist'], true)) {
return true;
}
$userRef = $person['user_ref'] ?? null;
return is_string($userRef) && $userRef !== '' && in_array($userRef, $presenterRefs, true);
}
/**
* @param list<array<string, mixed>> $participants
* @param list<string> $presenterRefs
*/
public static function headerCountLabel(array $participants, bool $usesStageLayout, array $presenterRefs = []): string
{
$joined = array_values(array_filter($participants, fn ($p) => ($p['status'] ?? '') === 'joined'));
if ($usesStageLayout) {
$count = count(array_filter($joined, fn ($p) => self::isSpeakerPerson($p, $presenterRefs)));
return $count === 1 ? '1 speaker' : "{$count} speakers";
}
$count = count($joined);
return "{$count} in call";
}
/**
* @param list<array<string, mixed>> $participants
* @return array{display_name: string, avatar_url: ?string}|null
*/
public static function headerHost(array $participants, array $roomHost): ?array
{
foreach ($participants as $person) {
if (($person['status'] ?? '') !== 'joined') {
continue;
}
if (in_array($person['role'] ?? '', ['host', 'co_host'], true)) {
return [
'display_name' => (string) ($person['display_name'] ?? 'Host'),
'avatar_url' => $person['avatar_url'] ?? null,
];
}
}
if (($roomHost['display_name'] ?? '') !== '') {
return [
'display_name' => (string) $roomHost['display_name'],
'avatar_url' => $roomHost['avatar_url'] ?? null,
];
}
return null;
}
public static function initials(?string $name): string
{
$parts = preg_split('/\s+/', trim($name ?? '')) ?: [];
$parts = array_values(array_filter($parts, fn ($part) => $part !== ''));
if ($parts === []) {
return '?';
}
if (count($parts) === 1) {
return strtoupper(substr($parts[0], 0, 2));
}
return strtoupper(substr($parts[0], 0, 1).substr($parts[count($parts) - 1], 0, 1));
}
}