namespace EnvelopeGenerator.ReceiverUI.Client.State;
///
/// Hält den aktuellen Zustand des geladenen Umschlags.
///
/// WARUM ein eigenes State-Objekt?
/// - Mehrere Komponenten auf einer Seite brauchen die gleichen Daten
/// - Ohne State müsste jede Komponente die Daten selbst laden → doppelte API-Calls
/// - StateHasChanged() informiert automatisch alle Subscriber
///
/// PATTERN: "Observable State" — Services setzen den State, Komponenten reagieren darauf.
///
public class EnvelopeState
{
private EnvelopePageStatus _status = EnvelopePageStatus.Loading;
private string? _errorMessage;
/// Aktueller Seitenstatus
public EnvelopePageStatus Status
{
get => _status;
private set
{
_status = value;
NotifyStateChanged();
}
}
/// Fehlermeldung (falls vorhanden)
public string? ErrorMessage
{
get => _errorMessage;
private set
{
_errorMessage = value;
NotifyStateChanged();
}
}
// --- Zustandsübergänge (öffentliche Methoden) ---
public void SetLoading() => Status = EnvelopePageStatus.Loading;
public void SetAccessCodeRequired()
{
ErrorMessage = null;
Status = EnvelopePageStatus.RequiresAccessCode;
}
public void SetTwoFactorRequired() => Status = EnvelopePageStatus.RequiresTwoFactor;
public void SetDocument() => Status = EnvelopePageStatus.ShowDocument;
public void SetError(string message)
{
ErrorMessage = message;
Status = EnvelopePageStatus.Error;
}
public void SetAlreadySigned() => Status = EnvelopePageStatus.AlreadySigned;
public void SetRejected() => Status = EnvelopePageStatus.Rejected;
public void SetNotFound() => Status = EnvelopePageStatus.NotFound;
// --- Event: Benachrichtigt Komponenten über Änderungen ---
public event Action? OnChange;
private void NotifyStateChanged() => OnChange?.Invoke();
}
/// Alle möglichen Zustände der Umschlag-Seite
public enum EnvelopePageStatus
{
Loading,
RequiresAccessCode,
RequiresTwoFactor,
ShowDocument,
AlreadySigned,
Rejected,
NotFound,
Expired,
Error
}