@page "/envelope/{EnvelopeKey}" @rendermode InteractiveAuto @inject IReceiverAuthService ReceiverAuthService @inject EnvelopeState State @implements IDisposable Dokument @switch (State.Status) { case EnvelopePageStatus.Loading: break; case EnvelopePageStatus.NotFound: break; case EnvelopePageStatus.AlreadySigned: break; case EnvelopePageStatus.Rejected: break; case EnvelopePageStatus.Expired: break; case EnvelopePageStatus.RequiresAccessCode: break; case EnvelopePageStatus.RequiresTwoFactor: break; case EnvelopePageStatus.ShowDocument: @* Phase 4 (PSPDFKit) kommt später — vorerst Platzhalter *@

Dokument bereit

«@State.Title» — PDF-Viewer wird in Phase 4 integriert.

@if (State.ReadOnly) { Nur Lesen }
break; case EnvelopePageStatus.Error: break; } @code { [Parameter] public string EnvelopeKey { get; set; } = default!; protected override async Task OnInitializedAsync() { State.OnChange += StateHasChanged; await LoadStatusAsync(); } /// /// Erster API-Call: Status prüfen. /// Entspricht dem GET /Envelope/{key} im Web-Projekt. /// Die API entscheidet, was passiert (AccessCode nötig? Bereits signiert? etc.) /// private async Task LoadStatusAsync() { State.SetLoading(); var result = await ReceiverAuthService.GetStatusAsync(EnvelopeKey); if (result.IsSuccess && result.Data is not null) { State.ApplyApiResponse(result.Data); } else if (result.StatusCode == 404) { State.SetNotFound(); } else { State.SetError(result.ErrorMessage ?? "Verbindung zum Server fehlgeschlagen."); } } /// /// Zweiter API-Call: AccessCode senden. /// Wird von AccessCodeForm aufgerufen (OnSubmit-Callback). /// Die API prüft den Code und antwortet mit dem nächsten Status. /// private async Task HandleAccessCodeSubmit((string Code, bool PreferSms) submission) { var result = await ReceiverAuthService.SubmitAccessCodeAsync( EnvelopeKey, submission.Code, submission.PreferSms); if (result.IsSuccess && result.Data is not null) { State.ApplyApiResponse(result.Data); } else if (result.Data is not null) { // 401 mit Body → falscher Code, API gibt trotzdem ReceiverAuthModel zurück State.ApplyApiResponse(result.Data); } else { State.SetError(result.ErrorMessage ?? "Fehler bei der Code-Prüfung."); } } /// /// Dritter API-Call: TFA-Code senden. /// Wird von TfaForm aufgerufen (OnSubmit-Callback). /// private async Task HandleTfaSubmit((string Code, string Type) submission) { var result = await ReceiverAuthService.SubmitTfaCodeAsync( EnvelopeKey, submission.Code, submission.Type); if (result.IsSuccess && result.Data is not null) { State.ApplyApiResponse(result.Data); } else if (result.Data is not null) { State.ApplyApiResponse(result.Data); } else { State.SetError(result.ErrorMessage ?? "Fehler bei der TFA-Prüfung."); } } public void Dispose() => State.OnChange -= StateHasChanged; }