Show Ladill profile avatars in the meeting participants UI.
Deploy Ladill Meet / deploy (push) Successful in 1m10s

Resolve participant photos from linked user records for the header host chip and participants panel, with initials as fallback.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-01 10:15:11 +00:00
co-authored by Cursor
parent 11b16b7c52
commit 4cc4970916
3 changed files with 96 additions and 26 deletions
@@ -0,0 +1,64 @@
<?php
namespace App\Services\Meet;
use App\Models\Participant;
use App\Models\User;
use Illuminate\Support\Collection;
class ParticipantPresenter
{
/**
* @param Collection<int, Participant> $participants
*/
public static function avatarMap(Collection $participants, ?string $roomHostUserRef = null): Collection
{
$refs = $participants->pluck('user_ref')->filter();
if ($roomHostUserRef) {
$refs = $refs->push($roomHostUserRef)->unique();
}
if ($refs->isEmpty()) {
return collect();
}
return User::query()
->whereIn('public_id', $refs->all())
->get()
->keyBy('public_id');
}
/**
* @return array<string, mixed>
*/
public static function toArray(Participant $participant, Collection $avatars, ?string $roomHostUserRef = null): array
{
return [
'uuid' => $participant->uuid,
'display_name' => $participant->display_name,
'role' => $participant->role,
'hand_raised' => $participant->hand_raised,
'is_muted' => $participant->is_muted,
'is_video_off' => $participant->is_video_off,
'breakout_room_id' => $participant->breakout_room_id,
'avatar_url' => self::avatarUrl($participant, $avatars, $roomHostUserRef),
];
}
public static function avatarUrl(Participant $participant, Collection $avatars, ?string $roomHostUserRef = null): ?string
{
if ($participant->user_ref) {
$url = $avatars->get($participant->user_ref)?->avatarUrl();
if ($url) {
return $url;
}
}
if (in_array($participant->role, ['host', 'co_host'], true) && $roomHostUserRef) {
return $avatars->get($roomHostUserRef)?->avatarUrl();
}
return null;
}
}