namespace SteUp.Shared.Core.Messages.System;
///
/// Ponte fra il tasto indietro del dispositivo (host nativo) e la UI Blazor.
/// Il form scheda si registra mentre è aperto così il back non manda l'app in
/// background buttando via il lavoro non salvato: passa invece dallo stesso
/// percorso del pulsante "Annulla", che propone il salvataggio come bozza.
///
public class BackButtonService
{
private Func? _handler;
/// Registra il gestore corrente. Ritorna l'azione di deregistrazione.
public IDisposable Register(Func handler)
{
_handler = handler;
return new Registration(this, handler);
}
///
/// Invocato dall'host nativo. Ritorna true se la UI Blazor ha preso in carico
/// il tasto indietro: in quel caso l'host non deve fare altro.
///
public bool TryHandleBackPressed()
{
var handler = _handler;
if (handler is null) return false;
// Fire-and-forget: il gestore rientra nel dispatcher Blazor da solo.
_ = handler();
return true;
}
private sealed class Registration(BackButtonService owner, Func handler) : IDisposable
{
public void Dispose()
{
// Non azzerare se nel frattempo si è registrato qualcun altro.
if (ReferenceEquals(owner._handler, handler)) owner._handler = null;
}
}
}