@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; _model.RandomStartPoint = viewModel.RandomStartPoint; }, () => 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); }); } } }