@page "/schedules/{Id:int}" @page "/schedules/add" @using ErsatzTV.Application.ProgramSchedules @implements IDisposable @inject NavigationManager _navigationManager @inject ILogger _logger @inject ISnackbar _snackbar @inject IMediator _mediator
@(IsEdit ? "Edit Schedule" : "Add Schedule") @(IsEdit ? "Save Changes" : "Add Schedule")
@code { private readonly CancellationTokenSource _cts = new(); [Parameter] public int Id { get; set; } private readonly ProgramScheduleEditViewModel _model = new(); private EditContext _editContext; private ValidationMessageStore _messageStore; public void Dispose() { _cts.Cancel(); _cts.Dispose(); } protected override async Task OnParametersSetAsync() { if (IsEdit) { Option maybeProgramSchedule = await _mediator.Send(new GetProgramScheduleById(Id), _cts.Token); maybeProgramSchedule.Match( viewModel => { _model.Id = viewModel.Id; _model.Name = viewModel.Name; _model.ShuffleScheduleItems = viewModel.ShuffleScheduleItems; _model.KeepMultiPartEpisodesTogether = viewModel.KeepMultiPartEpisodesTogether; _model.TreatCollectionsAsShows = viewModel.TreatCollectionsAsShows; }, () => _navigationManager.NavigateTo("404")); } else { _model.Name = "New Schedule"; } } 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()) { Either result = IsEdit ? await _mediator.Send(_model.ToUpdate(), _cts.Token).MapT(r => r as EntityIdResult) : await _mediator.Send(_model.ToCreate(), _cts.Token).MapT(r => r as EntityIdResult); result.Match( programSchedule => { string destination = IsEdit ? "/schedules" : $"/schedules/{programSchedule.Id}/items"; _navigationManager.NavigateTo(destination); }, error => { _snackbar.Add(error.Value, Severity.Error); _logger.LogError("Unexpected error saving schedule: {Error}", error.Value); }); } } }