@using Microsoft.AspNetCore.Components.Forms @using Microsoft.JSInterop @inject HttpClient HttpClient @inject NavigationManager Navigator @inject IJSRuntime JS @inject IMessageService MessageService @namespace LANCommander.UI.Components
@if (File != null) {
@File.Name ()
} @code { [Parameter] public RenderFragment Text { get; set; } [Parameter] public RenderFragment Hint { get; set; } [Parameter] public string Accept { get; set; } [Parameter] public string ObjectKey { get; set; } [Parameter] public EventCallback OnUploadCompleted { get; set; } [Parameter] public EventCallback OnUploadError { get; set; } [Parameter] public string Status { get; set; } [Parameter] public EventCallback StatusChanged { get; set; } [Parameter] public IBrowserFile File { get; set; } [Parameter] public EventCallback FileChanged { get; set; } [Parameter] public Guid StorageLocationId { get; set; } [Parameter] public EventCallback StorageLocationIdChanged { get; set; } Guid UploaderId = Guid.NewGuid(); InputFile FileInput; List FileList = new(); int Progress = 0; bool Uploading = false; bool Finished = false; bool ClearInput = false; double Speed = 0; ProgressStatus CurrentProgressStatus { get { ProgressStatus progressStatus; switch (Status) { case "Complete": return ProgressStatus.Success; case "Uploading": return ProgressStatus.Active; default: return ProgressStatus.Normal; } } } protected override async Task OnInitializedAsync() { HttpClient.BaseAddress = new Uri(Navigator.BaseUri); } public async Task Start() { Uploading = true; await ChangeStatus("Uploading"); ushort i = 0; while (i < 20) { if (FileInput != null) { if (!String.IsNullOrWhiteSpace(ObjectKey) && ObjectKey != Guid.Empty.ToString()) await JS.InvokeVoidAsync("window.Uploader.Init", $"ChunkFileInput-{UploaderId}", StorageLocationId, ObjectKey); else await JS.InvokeVoidAsync("window.Uploader.Init", $"ChunkFileInput-{UploaderId}", StorageLocationId, ""); break; } i++; await Task.Delay(500); } var dotNetReference = DotNetObjectReference.Create(this); await JS.InvokeVoidAsync("window.Uploader.Upload", dotNetReference); await InvokeAsync(StateHasChanged); } public async Task Clear() { await JS.InvokeVoidAsync("window.Uploader.Clear"); File = null; if (FileChanged.HasDelegate) await FileChanged.InvokeAsync(null); Status = ""; if (StatusChanged.HasDelegate) await StatusChanged.InvokeAsync(Status); StateHasChanged(); } async void OnFileSelected(InputFileChangeEventArgs args) { var file = args.File; if (!String.IsNullOrWhiteSpace(Accept)) { var acceptedFileExtensions = Accept.Split(',').Select(x => x.Trim()); if (!acceptedFileExtensions.Any(x => file.Name.ToLower().EndsWith(x.ToLower()))) { MessageService.Error($"Only {String.Join(", ", acceptedFileExtensions)} can be selected!"); return; } } File = file; if (FileChanged.HasDelegate) await FileChanged.InvokeAsync(File); await ChangeStatus(""); } async Task UploadArchiveJS() { Uploading = true; await ChangeStatus("Uploading"); var dotNetReference = DotNetObjectReference.Create(this); await JS.InvokeVoidAsync("window.Uploader.Upload", dotNetReference); await InvokeAsync(StateHasChanged); } async Task ChangeStatus(string status) { Status = status; if (StatusChanged.HasDelegate) await StatusChanged.InvokeAsync(Status); } [JSInvokable] public async Task JSOnUploadComplete(string objectKey) { Uploading = false; Finished = true; await ChangeStatus("Complete"); if (OnUploadCompleted.HasDelegate) await OnUploadCompleted.InvokeAsync(objectKey); } [JSInvokable] public async Task JSOnUploadError(string message) { if (OnUploadError.HasDelegate) await OnUploadError.InvokeAsync(message); } }