@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) {
} 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); } }