@page "/media/collections/{Id:int}/edit" @page "/media/collections/add" @using ErsatzTV.Application.MediaCollections @implements IDisposable @inject NavigationManager NavigationManager @inject ILogger Logger @inject ISnackbar Snackbar @inject IMediator Mediator
@(IsEdit ? "Edit Collection" : "Add Collection") @(IsEdit ? "Save Changes" : "Add Collection")
@code { private readonly CancellationTokenSource _cts = new(); [Parameter] public int Id { get; set; } private readonly CollectionEditViewModel _model = new(); private EditContext _editContext; private ValidationMessageStore _messageStore; public void Dispose() { _cts.Cancel(); _cts.Dispose(); } protected override async Task OnParametersSetAsync() { if (IsEdit) { Option maybeCollection = await Mediator.Send(new GetCollectionById(Id), _cts.Token); maybeCollection.IfSome( collection => { _model.Id = collection.Id; _model.Name = collection.Name; }); } else { _model.Name = "New Collection"; } } protected override void OnInitialized() { _editContext = new EditContext(_model); _messageStore = new ValidationMessageStore(_editContext); } private bool IsEdit => Id != 0; private async Task HandleSubmitAsync() { _messageStore.Clear(); if (_editContext.Validate()) { Seq errorMessage = IsEdit ? (await Mediator.Send(new UpdateCollection(Id, _model.Name), _cts.Token)).LeftToSeq() : (await Mediator.Send(new CreateCollection(_model.Name), _cts.Token)).LeftToSeq(); errorMessage.HeadOrNone().Match( error => { Snackbar.Add(error.Value, Severity.Error); Logger.LogError("Error saving collection: {Error}", error.Value); }, () => NavigationManager.NavigateTo(_model.Id > 0 ? $"media/collections/{_model.Id}" : "media/collections")); } } }