110 lines
2.4 KiB
Plaintext
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");
|
|
}
|
|
} |