@page "/s/{SessionId:guid}" @layout PublicLayout @inject ISessionStore SessionStore @inject NavigationManager Navigation @using GmRelay.Shared.Features.Showcase @PageTitleText @if (loaded && session is null) {
Недоступно

Сессия не опубликована

Эта игра скрыта, отменена, уже прошла или клуб выключил публичное расписание.

} else if (!loaded) {
} else if (session is not null) { @if (!string.IsNullOrWhiteSpace(session.CoverImageUrl)) {
}
@TranslateStatus(session.Status)

@session.Title

@session.GroupName

@if (!string.IsNullOrWhiteSpace(session.System)) { @GetSystemDisplayName(session.System) } @if (session.IsOneShot) { Ваншот } @if (!string.IsNullOrWhiteSpace(session.Format)) { @TranslateFormat(session.Format) }
Время @session.ScheduledAt.FormatMoscow()
Места @FormatSeats(session)
Статус @TranslateStatus(session.Status)
@if (session.DurationMinutes.HasValue) {
Длительность @FormatDuration(session.DurationMinutes.Value)
}
@if (!string.IsNullOrWhiteSpace(session.Description)) {

Описание

@session.Description

}
@if (!string.IsNullOrWhiteSpace(session.GroupSlug)) { Расписание клуба } Ссылка на сессию @if (session.AllowDirectRegistration) { Записаться }
} @code { [Parameter] public Guid SessionId { get; set; } private ShowcaseSessionDto? session; private bool loaded; private string PageTitleText => session is null ? "Публичная сессия — GM-Relay" : $"{session.Title} — GM-Relay"; private string PublicSessionUrl => Navigation.ToAbsoluteUri($"/s/{SessionId}").ToString(); protected override async Task OnParametersSetAsync() { loaded = false; session = await SessionStore.GetShowcaseSessionAsync(SessionId); loaded = true; } private static string FormatSeats(ShowcaseSessionDto session) { var seats = session.MaxPlayers.HasValue ? $"{session.ActivePlayerCount}/{session.MaxPlayers.Value}" : $"{session.ActivePlayerCount} игроков"; return session.WaitlistedPlayerCount > 0 ? $"{seats}, ожидание {session.WaitlistedPlayerCount}" : seats; } private static string FormatDuration(int minutes) { if (minutes < 60) return $"{minutes} мин"; var hours = minutes / 60; var mins = minutes % 60; return mins > 0 ? $"{hours} ч {mins} мин" : $"{hours} ч"; } private static string GetSystemDisplayName(string? system) { if (string.IsNullOrWhiteSpace(system)) return system ?? string.Empty; if (Enum.TryParse(system, out var gs)) return gs.ToDisplayName(); return system; } private static string TranslateFormat(string format) => format switch { "Online" => "Онлайн", "Offline" => "Офлайн", "Hybrid" => "Гибрид", _ => format }; private static string GetStatusClass(string status) => status switch { SessionStatus.Confirmed => "status-success", SessionStatus.ConfirmationSent => "status-warning", SessionStatus.Planned => "status-info", _ => "status-neutral" }; private static string TranslateStatus(string status) => status switch { SessionStatus.Planned => "Запланировано", SessionStatus.ConfirmationSent => "Ждем подтверждения", SessionStatus.Confirmed => "Подтверждено", _ => status }; }