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