124 lines
5.0 KiB
Plaintext
124 lines
5.0 KiB
Plaintext
@page "/session/edit/{SessionId:guid}"
|
|
@using GmRelay.Web.Services
|
|
@using GmRelay.Shared.Domain
|
|
@using Microsoft.AspNetCore.Authorization
|
|
@attribute [Authorize]
|
|
@inject SessionService SessionService
|
|
@inject NavigationManager Navigation
|
|
|
|
<PageTitle>Редактирование сессии — GM-Relay</PageTitle>
|
|
|
|
<div class="page-container">
|
|
<ul class="gm-breadcrumb animate-fade-in">
|
|
<li><a href="/">Главная</a></li>
|
|
<li class="active">Редактирование сессии</li>
|
|
</ul>
|
|
|
|
<div class="page-header animate-fade-in">
|
|
<h2>✏️ Редактирование сессии</h2>
|
|
</div>
|
|
|
|
@if (session == null)
|
|
{
|
|
<div class="glass-card" style="padding: 2rem;">
|
|
<div class="skeleton skeleton-text" style="width: 50%; margin-bottom: 1.5rem;"></div>
|
|
<div class="skeleton skeleton-text" style="width: 100%; height: 2.5rem; margin-bottom: 1.5rem;"></div>
|
|
<div class="skeleton skeleton-text" style="width: 50%; margin-bottom: 1.5rem;"></div>
|
|
<div class="skeleton skeleton-text" style="width: 100%; height: 2.5rem; margin-bottom: 1.5rem;"></div>
|
|
<div class="skeleton skeleton-text" style="width: 30%; height: 2.5rem;"></div>
|
|
</div>
|
|
}
|
|
else
|
|
{
|
|
<div class="glass-card animate-slide-up" style="max-width: 640px;">
|
|
<EditForm Model="@model" OnValidSubmit="HandleSubmit">
|
|
<div class="gm-form-group">
|
|
<label class="gm-form-label">Название игры</label>
|
|
<InputText @bind-Value="model.Title" class="gm-form-control" placeholder="например, D&D 5e: Dragon's Hoard" />
|
|
<div class="gm-form-hint">Изменение этого поля обновит все сессии в одной группе.</div>
|
|
</div>
|
|
|
|
<div class="gm-form-group">
|
|
<label class="gm-form-label">Запланированное время (МСК, UTC+3)</label>
|
|
<input type="datetime-local" @bind="model.ScheduledAtLocal" class="gm-form-control" />
|
|
<div class="gm-form-hint">Текущее: @session.ScheduledAt.FormatMoscow()</div>
|
|
</div>
|
|
|
|
<div class="gm-form-group">
|
|
<label class="gm-form-label">Ссылка для подключения</label>
|
|
<InputText @bind-Value="model.JoinLink" class="gm-form-control" placeholder="Ссылка на Discord или VTT" />
|
|
</div>
|
|
|
|
<div style="display: flex; gap: 0.75rem; margin-top: 1.5rem;">
|
|
<button type="submit" class="btn-gm btn-gm-success" disabled="@isSubmitting">
|
|
@(isSubmitting ? "⏳ Сохранение..." : "✅ Сохранить изменения")
|
|
</button>
|
|
<button type="button" class="btn-gm btn-gm-outline" @onclick="GoBack">
|
|
Отмена
|
|
</button>
|
|
</div>
|
|
</EditForm>
|
|
</div>
|
|
|
|
@if (!string.IsNullOrEmpty(errorMessage))
|
|
{
|
|
<div class="gm-alert gm-alert-danger" style="margin-top: 1rem; max-width: 640px;">
|
|
⚠️ @errorMessage
|
|
</div>
|
|
}
|
|
}
|
|
</div>
|
|
|
|
@code {
|
|
[Parameter] public Guid SessionId { get; set; }
|
|
private WebSession? session;
|
|
private SessionEditModel model = new();
|
|
private bool isSubmitting = false;
|
|
private string? errorMessage;
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
session = await SessionService.GetSessionAsync(SessionId);
|
|
if (session != null)
|
|
{
|
|
model.Title = session.Title;
|
|
// Convert UTC to Moscow for the picker
|
|
model.ScheduledAtLocal = session.ScheduledAt.ToMoscow();
|
|
model.JoinLink = session.JoinLink;
|
|
}
|
|
}
|
|
|
|
private async Task HandleSubmit()
|
|
{
|
|
isSubmitting = true;
|
|
errorMessage = null;
|
|
|
|
try
|
|
{
|
|
// The value from <input type="datetime-local"> is considered as "unspecified" or local to browser.
|
|
// We treat it as Moscow time (UTC+3) and convert to UTC.
|
|
var utcTime = new DateTimeOffset(model.ScheduledAtLocal, TimeSpan.FromHours(3)).ToUniversalTime().UtcDateTime;
|
|
|
|
await SessionService.UpdateSessionAsync(SessionId, model.Title, utcTime, model.JoinLink);
|
|
Navigation.NavigateTo($"/group/{session!.GroupId}");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
errorMessage = "Не удалось сохранить изменения: " + ex.Message;
|
|
}
|
|
finally
|
|
{
|
|
isSubmitting = false;
|
|
}
|
|
}
|
|
|
|
private void GoBack() => Navigation.NavigateTo("/");
|
|
|
|
public class SessionEditModel
|
|
{
|
|
public string Title { get; set; } = "";
|
|
public DateTime ScheduledAtLocal { get; set; } = DateTime.Now;
|
|
public string JoinLink { get; set; } = "";
|
|
}
|
|
}
|