@using Microsoft.AspNetCore.Components.Forms @using SharepointToolbox.Web.Core.Models @* Reusable logo picker. Reads an image into a base64 LogoData (no disk/blob storage). *@
@if (Value is not null) {
} else { PNG, JPEG, SVG or GIF — max @(MaxBytes / 1024) KB. } @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 = $"File too large ({file.Size / 1024} KB). Max {MaxBytes / 1024} KB."; 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 = $"Could not read image: {ex.Message}"; } } private async Task Remove() { Value = null; _error = string.Empty; await ValueChanged.InvokeAsync(null); } }