feat(web): update public session detail with showcase fields

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-28 16:13:35 +03:00
parent 71ffcce06b
commit 6d59737d07
3 changed files with 83 additions and 9 deletions
@@ -2,6 +2,7 @@
@layout PublicLayout
@inject ISessionStore SessionStore
@inject NavigationManager Navigation
@using GmRelay.Shared.Features.Showcase
<PageTitle>@PageTitleText</PageTitle>
@@ -30,10 +31,29 @@ else if (session is not null)
<meta name="description" content="@($"Публичная сессия {session.Title} клуба {session.GroupName} в GM-Relay.")" />
</HeadContent>
@if (!string.IsNullOrWhiteSpace(session.CoverImageUrl))
{
<div class="session-cover-hero" style="background-image: url('@session.CoverImageUrl')"></div>
}
<section class="public-hero public-hero-compact">
<span class="status-badge @GetStatusClass(session.Status)">@TranslateStatus(session.Status)</span>
<h1>@session.Title</h1>
<p>@session.GroupName</p>
<div class="session-badges">
@if (!string.IsNullOrWhiteSpace(session.System))
{
<span class="status-badge status-info">@GetSystemDisplayName(session.System)</span>
}
@if (session.IsOneShot)
{
<span class="status-badge status-warning">Ваншот</span>
}
@if (!string.IsNullOrWhiteSpace(session.Format))
{
<span class="status-badge status-neutral">@TranslateFormat(session.Format)</span>
}
</div>
</section>
<article class="glass-card public-session-detail">
@@ -50,14 +70,33 @@ else if (session is not null)
<span>Статус</span>
<strong>@TranslateStatus(session.Status)</strong>
</div>
@if (session.DurationMinutes.HasValue)
{
<div>
<span>Длительность</span>
<strong>@FormatDuration(session.DurationMinutes.Value)</strong>
</div>
}
</div>
@if (!string.IsNullOrWhiteSpace(session.Description))
{
<div class="session-description">
<h3>Описание</h3>
<p>@session.Description</p>
</div>
}
<div class="public-settings-actions">
@if (!string.IsNullOrWhiteSpace(session.GroupSlug))
{
<a class="btn-gm btn-gm-primary" href="@($"/club/{session.GroupSlug}")">Расписание клуба</a>
}
<a class="btn-gm btn-gm-outline" href="@PublicSessionUrl" target="_blank" rel="noopener noreferrer">Ссылка на сессию</a>
@if (session.AllowDirectRegistration)
{
<a class="btn-gm btn-gm-primary" href="@($"/s/{SessionId}?register=1")">Записаться</a>
}
</div>
</article>
}
@@ -65,7 +104,7 @@ else if (session is not null)
@code {
[Parameter] public Guid SessionId { get; set; }
private WebPublicSession? session;
private ShowcaseSessionDto? session;
private bool loaded;
private string PageTitleText => session is null ? "Публичная сессия — GM-Relay" : $"{session.Title} — GM-Relay";
@@ -75,11 +114,11 @@ else if (session is not null)
protected override async Task OnParametersSetAsync()
{
loaded = false;
session = await SessionStore.GetPublicSessionAsync(SessionId);
session = await SessionStore.GetShowcaseSessionAsync(SessionId);
loaded = true;
}
private static string FormatSeats(WebPublicSession session)
private static string FormatSeats(ShowcaseSessionDto session)
{
var seats = session.MaxPlayers.HasValue
? $"{session.ActivePlayerCount}/{session.MaxPlayers.Value}"
@@ -90,6 +129,35 @@ else if (session is not null)
: 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<GameSystem>(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",