Skip to content

Commit

Permalink
Support multiple file uploads.
Browse files Browse the repository at this point in the history
  • Loading branch information
tdhooten committed Nov 4, 2024
1 parent b6a166f commit 971e4ca
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 26 deletions.
49 changes: 35 additions & 14 deletions Polyglot/Components/Pages/Home.razor
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
@page "/"
@using Polyglot.Models

@inject IHxMessengerService Messenger
@inject IJSRuntime JsRuntime
Expand Down Expand Up @@ -36,14 +37,12 @@
NullText="-select format-"
NullDataText="Loading options..." />
<p />
<HxInputFile Label="Upload File" Accept=".csv, .json" OnChange="ConvertFile" MaxFileSize="10000000" Multiple="true" />
@if (_fileUploading)
{
<p />
<HxSpinner Color="ThemeColor.Primary" />
}
else
{
<HxInputFile Label="Upload File" Accept=".csv, .json" OnChange="ConvertFile" MaxFileSize="10000000" Multiple="false" />
}
</div>
<div class="col-sm" />
</div>
Expand All @@ -64,7 +63,7 @@
_outputFormats = Enum.GetValues(typeof(OutputFormats)).Cast<OutputFormats>().Select(v => v.ToString());
}

private async Task ConvertFile(InputFileChangeEventArgs e)
private async Task ConvertFile(InputFileChangeEventArgs args)
{
if (String.IsNullOrEmpty(_inputFormat))
{
Expand All @@ -89,28 +88,50 @@
_ => _fileName
};

List<MasterModel> processedLinks = new();

_fileUploading = true;

foreach (IBrowserFile file in e.GetMultipleFiles(1))
foreach (IBrowserFile file in args.GetMultipleFiles(args.FileCount))
{
try
{
using MemoryStream stream = new();
await using MemoryStream stream = new();
await file.OpenReadStream(maxAllowedSize: 10000000).CopyToAsync(stream);
Stream result = ConversionService.ConvertFile(stream, _inputFormat, _outputFormat);

using var streamRef = new DotNetStreamReference(stream: result);
await JsRuntime.InvokeVoidAsync("downloadFileFromStream", _fileName, streamRef);

Messenger.AddInformation($"Successfully converted file from {_inputFormat} to {_outputFormat} format.");
processedLinks.AddRange(ConversionService.ConvertInputFile(stream, _inputFormat));
}
catch (Exception ex)
{
Logger.LogError(ex, ex.Message);
Messenger.AddError($"Error converting file from {_inputFormat} to {_outputFormat} format!");
Messenger.AddError($"Error reading file {file.Name}!");
_fileUploading = false;
return;
}
}

if (processedLinks.Count == 0)
{
Messenger.AddError("No links found in the uploaded file(s)!");
_fileUploading = false;
return;
}

try
{
var result = ConversionService.GenerateOutputFile(processedLinks, _outputFormat);
using var streamRef = new DotNetStreamReference(stream: result);
await JsRuntime.InvokeVoidAsync("downloadFileFromStream", _fileName, streamRef);

if (args.FileCount > 1) Messenger.AddInformation($"Successfully converted {args.FileCount} files from {_inputFormat} to {_outputFormat} format.");
else Messenger.AddInformation($"Successfully converted file from {_inputFormat} to {_outputFormat} format.");
}
catch (Exception ex)
{
Logger.LogError(ex, ex.Message);
if (args.FileCount > 1) Messenger.AddError($"Error converted files from {_inputFormat} to {_outputFormat} format!");
else Messenger.AddError($"Error converted file(s) from {_inputFormat} to {_outputFormat} format!");
}

_fileUploading = false;
}

Expand Down
20 changes: 8 additions & 12 deletions Polyglot/Services/ConversionService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,23 @@ namespace Polyglot.Services;

public static class ConversionService
{
public static Stream ConvertFile(Stream stream, string inputFormat, string outputFormat)
public static IEnumerable<MasterModel> ConvertInputFile(Stream stream, string inputFormat)
{
stream.Position = 0;
IEnumerable<MasterModel> processedLinks = [];

processedLinks = inputFormat switch
return inputFormat switch
{
"GoodLinks" => ImportGoodlinks(stream),
"Instapaper" => ImportInstapaper(stream),
"Omnivore" => ImportOmnivore(stream),
"Raindrop" => ImportRaindrop(stream),
_ => processedLinks
};
}

public static Stream GenerateOutputFile(IEnumerable<MasterModel> processedLinks, string outputFormat)
{
byte[] outputFile = [];

outputFile = outputFormat switch
Expand All @@ -39,10 +42,7 @@ private static IEnumerable<MasterModel> ImportGoodlinks(Stream stream)
{
var baseDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

IEnumerable<GoodLinksModel> importedLinks =
JsonSerializer.Deserialize<IEnumerable<GoodLinksModel>>(stream) ?? [];

foreach (GoodLinksModel importedLink in importedLinks)
foreach (GoodLinksModel importedLink in JsonSerializer.Deserialize<IEnumerable<GoodLinksModel>>(stream) ?? [])
{
var processedLink = new MasterModel
{
Expand All @@ -67,9 +67,7 @@ private static IEnumerable<MasterModel> ImportInstapaper(Stream stream)
using var csvReader = new CsvReader(reader, CultureInfo.InvariantCulture);

// Todo: check for valid headers
IEnumerable<InstapaperModel> importedLinks = csvReader.GetRecords<InstapaperModel>();

foreach (InstapaperModel importedLink in importedLinks)
foreach (InstapaperModel importedLink in csvReader.GetRecords<InstapaperModel>())
{
var processedLink = new MasterModel
{
Expand Down Expand Up @@ -114,9 +112,7 @@ private static IEnumerable<MasterModel> ImportRaindrop(Stream stream)
using var csvReader = new CsvReader(reader, CultureInfo.InvariantCulture);

// Todo: check for valid headers
IEnumerable<RaindropModel> importedLinks = csvReader.GetRecords<RaindropModel>();

foreach (RaindropModel importedLink in importedLinks)
foreach (RaindropModel importedLink in csvReader.GetRecords<RaindropModel>())
{
var processedLink = new MasterModel
{
Expand Down

0 comments on commit 971e4ca

Please sign in to comment.