Deploy Ladill Meet / deploy (push) Successful in 33s
Let attendees request host-granted microphone access with LiveKit reconnect, participant panel controls, and toolbar UI that only shows mic when allowed. Fix Events create URL, surface API key setup guidance, and align the Webinars sidebar icon with other nav items using currentColor strokes. Co-authored-by: Cursor <cursoragent@cursor.com>
108 lines
5.7 KiB
PHP
108 lines
5.7 KiB
PHP
<x-app-layout title="{{ $room->title }}">
|
|
<div class="mx-auto max-w-2xl">
|
|
<div class="flex items-start justify-between gap-4">
|
|
<div>
|
|
<p class="text-xs font-semibold uppercase tracking-wide text-indigo-600">Webinar</p>
|
|
<h1 class="text-2xl font-semibold text-slate-900">{{ $room->title }}</h1>
|
|
<p class="mt-1 text-sm text-slate-500">{{ config('meet.room_statuses')[$room->status] ?? $room->status }}</p>
|
|
</div>
|
|
@if ($room->canRestart())
|
|
<form method="POST" action="{{ route('meet.webinars.start', $room) }}">
|
|
@csrf
|
|
<button type="submit" class="btn-primary">{{ $room->restartLabel() }}</button>
|
|
</form>
|
|
@endif
|
|
</div>
|
|
|
|
@if (session('success'))
|
|
<div class="mt-4 rounded-lg border border-emerald-200 bg-emerald-50 px-4 py-3 text-sm text-emerald-800">
|
|
{{ session('success') }}
|
|
</div>
|
|
@endif
|
|
|
|
<div class="mt-4 rounded-xl border border-indigo-100 bg-indigo-50 px-4 py-3 text-sm text-indigo-900">
|
|
Billed at <span class="font-medium">GHS {{ number_format(config('meet.billing.price_per_participant_ghs', 0.30), 2) }} per participant</span> (peak attendance when the session ends).
|
|
</div>
|
|
|
|
@include('meet.partials.events-integration', ['room' => $room])
|
|
|
|
<div class="mt-6 rounded-2xl border border-slate-200 bg-white p-6">
|
|
<h2 class="text-sm font-medium text-slate-700">Join link (hosts & panelists)</h2>
|
|
<div class="mt-2 flex gap-2">
|
|
<input type="text" readonly value="{{ $room->joinUrl() }}" class="flex-1 rounded-lg border-slate-300 bg-slate-50 text-sm font-mono">
|
|
<x-copy-button :text="$room->joinUrl()" class="btn-secondary btn-secondary-sm shrink-0" />
|
|
</div>
|
|
|
|
<div class="btn-group mt-4">
|
|
<a href="{{ route('meet.rooms.ical', $room) }}" class="btn-secondary btn-secondary-sm">Download iCal</a>
|
|
@if ($room->sessions->isNotEmpty())
|
|
<a href="{{ route('meet.rooms.attendance', $room) }}" class="btn-secondary btn-secondary-sm">Attendance CSV</a>
|
|
@endif
|
|
@if ($room->canRestart() && ($room->status === 'ended' || $room->sessions->isNotEmpty()))
|
|
<form method="POST" action="{{ route('meet.webinars.start', $room) }}" class="inline">
|
|
@csrf
|
|
<button type="submit" class="btn-secondary btn-secondary-sm">{{ $room->restartLabel() }}</button>
|
|
</form>
|
|
@endif
|
|
</div>
|
|
|
|
@if ($room->passcode)
|
|
<p class="mt-3 text-sm text-slate-600">Passcode: <span class="font-mono font-medium">{{ $room->passcode }}</span></p>
|
|
@endif
|
|
|
|
@if ($room->scheduled_at)
|
|
<p class="mt-3 text-sm text-slate-600">
|
|
Scheduled: {{ $room->scheduled_at->timezone($room->safeTimezone())->format('M j, Y g:i A T') }}
|
|
</p>
|
|
@endif
|
|
|
|
@if ($room->status === 'scheduled')
|
|
<form method="POST" action="{{ route('meet.webinars.settings.update', $room) }}" class="mt-6 border-t border-slate-100 pt-6">
|
|
@csrf
|
|
<h2 class="text-sm font-medium text-slate-700">Stage layout</h2>
|
|
<label class="mt-3 flex items-center gap-2 text-sm text-slate-700">
|
|
<input type="checkbox" name="panel_discussions" value="1"
|
|
@checked(old('panel_discussions', $room->setting('panel_discussions'))) class="rounded border-slate-300">
|
|
Enable panel discussions (multi-speaker stage layout)
|
|
</label>
|
|
<button type="submit" class="btn-primary btn-primary-sm mt-3">Save settings</button>
|
|
</form>
|
|
@endif
|
|
</div>
|
|
|
|
@include('meet.partials.programme-agenda', ['room' => $room])
|
|
|
|
@php
|
|
$recordings = $room->sessions->flatMap->recordings->sortByDesc('created_at');
|
|
$summaries = $room->sessions->flatMap->aiSummaries->where('status', 'ready')->sortByDesc('created_at');
|
|
@endphp
|
|
|
|
@if ($recordings->isNotEmpty())
|
|
<div class="mt-6 rounded-2xl border border-slate-200 bg-white p-6">
|
|
<h2 class="text-sm font-medium text-slate-700">Recordings</h2>
|
|
<ul class="mt-3 divide-y divide-slate-100 text-sm">
|
|
@foreach ($recordings as $recording)
|
|
<li class="flex items-center justify-between py-2">
|
|
<span>{{ $recording->created_at->format('M j, Y g:i A') }}</span>
|
|
<a href="{{ route('meet.recordings.show', $recording) }}" class="text-indigo-600 hover:underline">{{ config('meet.recording_statuses')[$recording->status] ?? $recording->status }}</a>
|
|
</li>
|
|
@endforeach
|
|
</ul>
|
|
</div>
|
|
@endif
|
|
|
|
@if ($summaries->isNotEmpty())
|
|
<div class="mt-6 rounded-2xl border border-slate-200 bg-white p-6">
|
|
<h2 class="text-sm font-medium text-slate-700">AI summaries</h2>
|
|
<ul class="mt-3 divide-y divide-slate-100 text-sm">
|
|
@foreach ($summaries as $summary)
|
|
<li class="py-2">
|
|
<a href="{{ route('meet.summaries.show', $summary) }}" class="text-indigo-600 hover:underline">Summary · {{ $summary->created_at->format('M j, Y') }}</a>
|
|
</li>
|
|
@endforeach
|
|
</ul>
|
|
</div>
|
|
@endif
|
|
</div>
|
|
</x-app-layout>
|