@using LANCommander.SDK.Enums @using LANCommander.Server.ImportExport @using LANCommander.Server.ImportExport.Factories @using LANCommander.Server.ImportExport.Models @using LANCommander.Server.ImportExport.Services @inherits FeedbackComponent @inject GameService GameService @inject ArchiveClient ArchiveClient @inject StorageLocationService StorageLocationService @inject ImportContextFactory ImportContextFactory @inject IMessageService MessageService @inject ILogger Logger @if (_stage == ImportStage.Upload) {

Drag and Drop

or

@Options.Hint
Use Local File } else if (_stage == ImportStage.RecordSelection) { @foreach (var group in ImportItems.GroupBy(i => i.Type)) { var size = group.Sum(i => i.Size); @group.Key.GetDisplayName() (@group.Count()) @if (size > 0) { } @foreach (var item in group) { @item.Name @if (item.Size > 0) { } } } } else if (_stage == ImportStage.Importing) { } @code { enum ImportStage { Upload, RecordSelection, Importing }; IBrowserFile File; ChunkUploader ChunkUploader; StorageLocation StorageLocation = new(); ImportContext ImportContext; IEnumerable ImportItems = new List(); string RootPath = Path.GetPathRoot(Directory.GetCurrentDirectory()); bool IsValid = false; string Filename; string Status; ImportStage _stage = ImportStage.Upload; string[] _selectedKeys; int _progress { get { return ImportContext.Processed / ImportContext.Total; } } protected override async Task OnInitializedAsync() { ImportContext = ImportContextFactory.Create(); ImportContext.OnRecordError += RecordError; ImportContext.OnRecordAdded += RecordAdded; ImportContext.OnRecordProcessed += RecordProcessed; StorageLocation = await StorageLocationService.FirstAsync(l => l.Default && l.Type == StorageLocationType.Archive); } private void RecordProcessed(object? sender, object e) { } private void RecordAdded(object? sender, object e) { } private void RecordError(object? sender, object e) { } async Task Upload() { await ChunkUploader.Start(); } async Task Import() { _stage = ImportStage.Importing; var selectedGuids = _selectedKeys .Select(k => Guid.TryParse(k, out var id) ? (Guid?)id : null) .Where(id => id.HasValue) .Select(g => g!.Value); try { await ImportContext.PrepareImportQueueAsync(selectedGuids, StorageLocation.Id); await ImportContext.ImportQueueAsync(); MessageService.Success("Game successfully imported!"); } catch (Exception ex) { MessageService.Error("Game could not be imported!"); Logger?.LogError(ex, "An unknown error occurred while trying to import"); } await Clear(); ImportContext.Dispose(); await CloseFeedbackAsync(); } async Task Clear() { await ChunkUploader.Clear(); } async Task Cancel() { await ChunkUploader.Clear(); await CloseFeedbackAsync(); } public override async Task OnFeedbackCancelAsync(ModalClosingEventArgs args) { await Clear(); ImportContext.Dispose(); await base.OnFeedbackCancelAsync(args); } public override async Task OnFeedbackOkAsync(ModalClosingEventArgs args) { await ChunkUploader.Clear(); ImportContext.Dispose(); await base.OnFeedbackOkAsync(args); } public async Task OnUploadCompleted(string data) { if (Guid.TryParse(data, out var objectKey)) { try { var archivePath = await ArchiveClient.GetArchiveFileLocationAsync(objectKey.ToString()); ImportItems = await ImportContext.InitializeImportAsync(archivePath); _selectedKeys = ImportItems.Select(i => i.Id.ToString()).ToArray(); _stage = ImportStage.RecordSelection; await InvokeAsync(StateHasChanged); } catch (Exception ex) { Logger?.LogError(ex, "An unknown error occurred while trying to import"); MessageService.Error("An unknown error occurred while trying to import"); } } else { await InvokeAsync(StateHasChanged); MessageService.Error("Import file failed to upload!"); Logger.LogError("Import file failed to upload!"); await (base.OkCancelRef?.OnCancel?.Invoke() ?? Task.CompletedTask); await CloseFeedbackAsync(); } await Clear(); } public async Task OnUploadError(string message) { await InvokeAsync(StateHasChanged); MessageService.Error("An error occurred while trying to import"); Logger?.LogError($"An error occurred while trying to import: {message}"); await CloseFeedbackAsync(); } public async Task OnLocalFileSelected(string path) { try { ImportItems = await ImportContext.InitializeImportAsync(path); _selectedKeys = ImportItems.Select(i => i.Id.ToString()).ToArray(); _stage = ImportStage.RecordSelection; await InvokeAsync(StateHasChanged); } catch (Exception ex) { Logger?.LogError(ex, "An unknown error occurred while trying to import"); MessageService.Error("An unknown error occurred while trying to import"); } } }