invites->resolvePortal($shortCode, $token); abort_unless($resolved, 404); $event = $resolved['event']; $speaker = $resolved['speaker']; $content = $event->content(); $programme = null; $programmeSnapshot = null; $programmeId = (int) ($content['programme_qr_id'] ?? 0); if ($programmeId > 0) { $programme = \App\Models\QrCode::query() ->where('id', $programmeId) ->where('type', \App\Models\QrCode::TYPE_ITINERARY) ->first(); $programmeSnapshot = $this->programmes->snapshot($programme); } $token = (string) ($speaker['invite_token'] ?? ''); $virtualSessions = collect((array) ($content['virtual_sessions'] ?? [])) ->filter(fn ($session) => is_array($session) && trim((string) ($session['join_url'] ?? '')) !== '') ->map(function (array $session) use ($event, $token) { return [ 'title' => trim((string) ($session['title'] ?? 'Virtual session')), 'type' => in_array($session['meet_room_type'] ?? '', ['webinar'], true) ? 'Webinar' : 'Conference', 'scheduled_at' => $session['scheduled_at'] ?? null, 'join_url' => $this->invites->speakerJoinUrl($event, $session, $token), ]; }) ->values() ->all(); return view('events.speaker-portal', [ 'event' => $event, 'speaker' => $speaker, 'eventContent' => $content, 'programmeSnapshot' => $programmeSnapshot, 'assignments' => $this->invites->assignmentsForSpeaker($event, $speaker), 'virtualSessions' => $virtualSessions, ]); } }