@using Microsoft.AspNetCore.Components.Forms
@using SharepointToolbox.Web.Core.Models
@inject TranslationSource T
@* Reusable logo picker. Reads an image into a base64 LogoData (no disk/blob storage). *@
@if (Value is not null)
{
@T["logoupload.remove"]
}
else
{
@string.Format(T["logoupload.hint"], MaxBytes / 1024)
}
@if (!string.IsNullOrEmpty(_error)) {
@_error
}
@code {
[Parameter] public LogoData? Value { get; set; }
[Parameter] public EventCallback ValueChanged { get; set; }
/// Upload size cap. Logos are stored inline as base64 in JSON, so keep small.
[Parameter] public long MaxBytes { get; set; } = 512 * 1024;
private string _error = string.Empty;
private async Task OnChange(InputFileChangeEventArgs e)
{
_error = string.Empty;
var file = e.File;
if (file is null) return;
if (file.Size > MaxBytes)
{
_error = string.Format(T["logoupload.err.toolarge"], file.Size / 1024, MaxBytes / 1024);
return;
}
try
{
using var ms = new MemoryStream();
await file.OpenReadStream(MaxBytes).CopyToAsync(ms);
var mime = string.IsNullOrWhiteSpace(file.ContentType) ? "image/png" : file.ContentType;
var logo = new LogoData { Base64 = Convert.ToBase64String(ms.ToArray()), MimeType = mime };
Value = logo;
await ValueChanged.InvokeAsync(logo);
}
catch (Exception ex)
{
_error = string.Format(T["logoupload.err.read"], ex.Message);
}
}
private async Task Remove()
{
Value = null;
_error = string.Empty;
await ValueChanged.InvokeAsync(null);
}
}