@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")); } } }