Files
StandManager/StandManager/Components/Pages/Scan.razor
2025-12-11 08:36:48 +01:00

110 lines
2.4 KiB
Plaintext

@page "/scan"
@using StandManager.Components.Layout
@layout PublicLayout
@inject IJSRuntime JS
@inject BodyClassService BodyClass
@rendermode InteractiveServer
<PageTitle>Scan</PageTitle>
<header class="hero pb-0">
<div class="container">
<div class="mb-3">
<video @ref="videoRef" autoplay playsinline style="width:100%;max-width:400px;border:1px solid #ccc;border-radius:8px;"></video>
</div>
<button class="btn btn-primary" @onclick="StartScan" disabled="@isScanning">
Avvia scansione
</button>
<button class="btn btn-secondary" @onclick="StopScan" disabled="@(!isScanning)">
Ferma
</button>
</div>
</header>
@if (!string.IsNullOrWhiteSpace(lastResult))
{
<div class="alert alert-success">
<strong>QR letto:</strong> @lastResult
</div>
}
@if (!string.IsNullOrWhiteSpace(errorMessage))
{
<div class="alert alert-danger">
<strong>Errore:</strong> @errorMessage
</div>
}
@code {
private ElementReference videoRef;
private DotNetObjectReference<Scan>? 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");
}
}