@implements IDisposable
@if (!string.IsNullOrEmpty(CaFileName)) {
@CaFileName (@FormatSize(CaFileSize))
} @if (!string.IsNullOrEmpty(CaFileError)) {
@CaFileError
}
@if (!string.IsNullOrEmpty(CertFileName)) {
@CertFileName (@FormatSize(CertFileSize))
} @if (!string.IsNullOrEmpty(CertFileError)) {
@CertFileError
}
@if (!string.IsNullOrEmpty(KeyFileName)) {
@KeyFileName (@FormatSize(KeyFileSize))
} @if (!string.IsNullOrEmpty(KeyFileError)) {
@KeyFileError
}
@if (Model.CreatedAt != default || Model.UpdatedAt != default) {
Created: @Model.CreatedAt.ToString("dd/MM/yyyy HH:mm:ss") Updated: @Model.UpdatedAt.ToString("dd/MM/yyyy HH:mm:ss")
}
@code { [Parameter] public RobotVDA5050ConfigDto Model { get; set; } = new(); [Parameter] public EventCallback ModelChanged { get; set; } private EditContext? EditContext; private bool showPassword; private string PasswordInputType => showPassword ? "text" : "password"; private string PasswordIconClass => showPassword ? "mdi mdi-eye-off" : "mdi mdi-eye"; private enum FileSlot { Ca, Cert, Key } private string? CaFileName; private long CaFileSize; private string? CaFileError; private byte[]? CaFileData; private string? CertFileName; private long CertFileSize; private string? CertFileError; private byte[]? CertFileData; private string? KeyFileName; private long KeyFileSize; private string? KeyFileError; private byte[]? KeyFileData; private const long MaxFileSize = 10 * 1024 * 1024; // 10 MB private async Task OnFileSelected(InputFileChangeEventArgs e, FileSlot slot) { var file = e.File; if (file is null) return; if (file.Size > MaxFileSize) { SetFileError(slot, $"File too large (max {FormatSize(MaxFileSize)})"); SetFileInfo(slot, null, 0, null); return; } try { using var stream = file.OpenReadStream(MaxFileSize); using var ms = new MemoryStream(); await stream.CopyToAsync(ms); var data = ms.ToArray(); SetFileData(slot, data, file.Name, file.Size); ClearFileError(slot); // Optionally propagate change to parent via ModelChanged if required // _ = ModelChanged.InvokeAsync(Model); } catch (Exception ex) { SetFileError(slot, "Failed to read file"); Console.Error.WriteLine(ex); } } private void SetFileData(FileSlot slot, byte[] data, string name, long size) { switch (slot) { case FileSlot.Ca: CaFileData = data; CaFileName = name; CaFileSize = size; break; case FileSlot.Cert: CertFileData = data; CertFileName = name; CertFileSize = size; break; case FileSlot.Key: KeyFileData = data; KeyFileName = name; KeyFileSize = size; break; } } private void SetFileError(FileSlot slot, string? error) { switch (slot) { case FileSlot.Ca: CaFileError = error; break; case FileSlot.Cert: CertFileError = error; break; case FileSlot.Key: KeyFileError = error; break; } } private void ClearFileError(FileSlot slot) => SetFileError(slot, null); private void SetFileInfo(FileSlot slot, string? name, long size, byte[]? data) { switch (slot) { case FileSlot.Ca: CaFileName = name; CaFileSize = size; CaFileData = data; break; case FileSlot.Cert: CertFileName = name; CertFileSize = size; CertFileData = data; break; case FileSlot.Key: KeyFileName = name; KeyFileSize = size; KeyFileData = data; break; } } private static string FormatSize(long size) { if (size <= 0) return "0 B"; if (size < 1024) return $"{size} B"; double kb = size / 1024.0; if (kb < 1024) return $"{kb:F1} KB"; double mb = kb / 1024.0; return $"{mb:F2} MB"; } protected override void OnParametersSet() { if (EditContext is null || !EditContext.Model!.Equals(Model)) { if (EditContext is not null) EditContext.OnFieldChanged -= EditContext_OnFieldChanged; EditContext = new EditContext(Model); EditContext.OnFieldChanged += EditContext_OnFieldChanged; } CertFileName = string.Empty; CertFileError = string.Empty; KeyFileName = string.Empty; KeyFileError = string.Empty; CaFileName = string.Empty; CaFileError = string.Empty; } private void TogglePasswordVisibility() { showPassword = !showPassword; } private void EditContext_OnFieldChanged(object? sender, FieldChangedEventArgs e) { _ = ModelChanged.InvokeAsync(Model); } public void Dispose() { if (EditContext is not null) EditContext.OnFieldChanged -= EditContext_OnFieldChanged; } }