@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.JSInterop
@inject HttpClient HttpClient
@inject NavigationManager Navigator
@inject IJSRuntime JS
@inject IMessageService MessageService
@if (File != null)
{
}
@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);
}
}