@page "/scan" @using StandManager.Components.Layout @layout PublicLayout @inject IJSRuntime JS @inject BodyClassService BodyClass @rendermode InteractiveServer Scan
@if (!string.IsNullOrWhiteSpace(lastResult)) {
QR letto: @lastResult
} @if (!string.IsNullOrWhiteSpace(errorMessage)) {
Errore: @errorMessage
} @code { private ElementReference videoRef; private DotNetObjectReference? objRef; private bool isScanning; private string? lastResult; private string? errorMessage; protected override void OnInitialized() { objRef = DotNetObjectReference.Create(this); } private async Task StartScan() { errorMessage = null; lastResult = null; if (isScanning) return; isScanning = true; await JS.InvokeVoidAsync("qrScanner.start", videoRef, objRef); } private async Task StopScan() { if (!isScanning) return; isScanning = false; await JS.InvokeVoidAsync("qrScanner.stop", videoRef); } [JSInvokable] public Task OnQrDecoded(string text) { lastResult = text; isScanning = false; StateHasChanged(); return Task.CompletedTask; } [JSInvokable] public Task OnQrError(string message) { errorMessage = message; isScanning = false; StateHasChanged(); return Task.CompletedTask; } public async ValueTask DisposeAsync() { if (isScanning) { await StopScan(); } objRef?.Dispose(); } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) await BodyClass.SetBodyClass("body-marketing body-gradient"); } }