@page "/channels/{Id:int?}" @page "/channels/add" @using ErsatzTV.Application.FFmpegProfiles @using ErsatzTV.Application.FFmpegProfiles.Queries @using ErsatzTV.Application.Images.Commands @using ErsatzTV.Application.Channels @using ErsatzTV.Application.Channels.Queries @inject NavigationManager NavigationManager @inject ILogger Logger @inject ISnackbar Snackbar @inject IMediator Mediator
@(IsEdit ? "Edit Channel" : "Add Channel") @foreach (StreamingMode streamingMode in Enum.GetValues()) { @streamingMode } @foreach (FFmpegProfileViewModel profile in _ffmpegProfiles) { @profile.Name } Upload Logo @(IsEdit ? "Save Changes" : "Add Channel")
@code { [Parameter] public int? Id { get; set; } private readonly ChannelEditViewModel _model = new(); private EditContext _editContext; private ValidationMessageStore _messageStore; private List _ffmpegProfiles; protected override async Task OnParametersSetAsync() { await LoadFFmpegProfilesAsync(); if (Id.HasValue) { Option maybeChannel = await Mediator.Send(new GetChannelById(Id.Value)); maybeChannel.Match( channelViewModel => { _model.Id = channelViewModel.Id; _model.Name = channelViewModel.Name; _model.Number = channelViewModel.Number; _model.FFmpegProfileId = channelViewModel.FFmpegProfileId; _model.Logo = channelViewModel.Logo; _model.StreamingMode = channelViewModel.StreamingMode; }, () => NavigationManager.NavigateTo("404")); } else { // TODO: command for new channel int maxNumber = await Mediator.Send(new GetAllChannels()).Map(channels => channels.Max(c => c.Number)); _model.Number = maxNumber + 1; _model.Name = "New Channel"; _model.FFmpegProfileId = _ffmpegProfiles.Head().Id; _model.StreamingMode = StreamingMode.TransportStream; } } protected override void OnInitialized() { _editContext = new EditContext(_model); _messageStore = new ValidationMessageStore(_editContext); } private bool IsEdit => Id.HasValue; private async Task LoadFFmpegProfilesAsync() => _ffmpegProfiles = await Mediator.Send(new GetAllFFmpegProfiles()); private async Task HandleSubmitAsync() { _messageStore.Clear(); if (_editContext.Validate()) { Seq errorMessage = IsEdit ? (await Mediator.Send(_model.ToUpdate())).LeftToSeq() : (await Mediator.Send(_model.ToCreate())).LeftToSeq(); errorMessage.HeadOrNone().Match( error => { Snackbar.Add($"Unexpected error saving channel: {error.Value}"); Logger.LogError("Unexpected error saving channel: {Error}", error.Value); }, () => NavigationManager.NavigateTo("/channels")); } } private async Task UploadLogo(InputFileChangeEventArgs e) { var buffer = new byte[e.File.Size]; await e.File.OpenReadStream().ReadAsync(buffer); Either maybeCacheFileName = await Mediator.Send(new SaveImageToDisk(buffer)); maybeCacheFileName.Match( relativeFileName => _model.Logo = relativeFileName, error => { Snackbar.Add($"Unexpected error saving channel logo: {error.Value}"); Logger.LogError("Unexpected error saving channel logo: {Error}", error.Value); }); } }