From 44bbdbb835be60190992bfd39492c4f33eb8f550 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 28 Sep 2026 14:11:06 +0200 Subject: [PATCH] Add logout functionality and signed status check Introduced a logout feature to the `ReceiverPage` component: - Added a logout button to the toolbar with `_isLoggingOut` state. - Implemented `LogoutAsync` method to handle logout logic, including navigation and error handling. - Injected `IMediator` and `ILogger` for logging and MediatR functionality. - Added a check in `OnInitializedAsync` to redirect users to `/envelope/signed-result` if the envelope is already signed. - Updated namespaces to include MediatR and custom extensions. These changes improve user experience and enhance the component's functionality. --- .../Components/Pages/ReceiverPage.razor | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/Pages/ReceiverPage.razor b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/Pages/ReceiverPage.razor index d477976a..082213b0 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/Pages/ReceiverPage.razor +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/Pages/ReceiverPage.razor @@ -6,11 +6,14 @@ @using EnvelopeGenerator.Server.Client.Models.Constants @using EnvelopeGenerator.Server.Client.Services @using EnvelopeGenerator.Application.Common.Dto.EnvelopeReceiver +@using EnvelopeGenerator.Application.EnvelopeReceivers.Queries @using Microsoft.JSInterop @using DevExpress.Blazor @using System.Drawing @using System.Security.Claims @using Microsoft.Extensions.Caching.Memory +@using MediatR +@using EnvelopeGenerator.Server.Extensions @inject NavigationManager Navigation @inject IJSRuntime JSRuntime @inject EnvelopeGenerator.Server.Client.Services.AuthService AuthService @@ -19,6 +22,7 @@ @inject AppVersionService AppVersion @inject IMemoryCache MemoryCache @inject ILogger Logger +@inject IMediator Mediator @implements IDisposable @@ -125,6 +129,18 @@ Unterschreiben } + + @@ -386,6 +402,27 @@ string _signerFullName = string.Empty; string _signerPosition = string.Empty; string _signaturePlace = string.Empty; + bool _isLoggingOut = false; + + async Task LogoutAsync() + { + if (_isLoggingOut || string.IsNullOrWhiteSpace(EnvelopeKey)) + return; + + _isLoggingOut = true; + await InvokeAsync(StateHasChanged); + + try + { + await AuthService.LogoutEnvelopeReceiverAsync(EnvelopeKey); + } + catch (Exception ex) + { + Logger.LogWarning(ex, "Receiver logout failed for {EnvelopeKey}", EnvelopeKey); + } + + Navigation.NavigateTo($"/envelope/login/{Uri.EscapeDataString(EnvelopeKey)}", forceLoad: true); + } // ----- Lifecycle ----- protected override async Task OnInitializedAsync() @@ -405,6 +442,12 @@ return; } + if (await Mediator.IsSignedAsync(_receiverUser.EnvelopeUuid(), _receiverUser.ReceiverSignature())) + { + Navigation.NavigateTo("/envelope/signed-result", forceLoad: true); + return; + } + try { // Load PDF bytes via MediatR (uses authenticated user's claims)