Skip to content

Commit 9797b22

Browse files
authored
Merge branch 'develop' into develop
2 parents c119bea + 960a884 commit 9797b22

File tree

6 files changed

+121
-14
lines changed

6 files changed

+121
-14
lines changed

roles/lib/files/FWO.Api.Client/GraphQlApiConnection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Text.Json;
1+
using System.Text.Json;
22
using GraphQL;
33
using GraphQL.Client.Http;
44
using GraphQL.Client.Serializer.SystemTextJson;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using FWO.Services.EventMediator.Interfaces;
2+
3+
namespace FWO.Services.EventMediator.Events
4+
{
5+
public class UserSessionClosedEvent(UserSessionClosedEventArgs? eventArgs = default) : IEvent
6+
{
7+
public UserSessionClosedEventArgs? EventArgs { get; set; } = eventArgs ?? new UserSessionClosedEventArgs();
8+
9+
IEventArgs? IEvent.EventArgs
10+
{
11+
get => EventArgs;
12+
set => EventArgs = value as UserSessionClosedEventArgs;
13+
}
14+
}
15+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using FWO.Data;
2+
using FWO.Services.EventMediator.Interfaces;
3+
4+
namespace FWO.Services.EventMediator.Events
5+
{
6+
public class UserSessionClosedEventArgs(string userName = "", string? userDn = "") : IEventArgs
7+
{
8+
public string? UserName { get; set; } = userName;
9+
public string? UserDn { get; set; } = userDn;
10+
}
11+
}

roles/ui/files/FWO.UI/Data/UIMessage.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace FWO.Ui.Data
44
{
5-
public class UIMessage
5+
public class UIMessage : IDisposable
66
{
77
public string Id { get; } = Guid.NewGuid().ToString();
88
public string? Title { get; set; }
@@ -35,11 +35,27 @@ private static string GetCSSClass(MessageType messageType)
3535
case MessageType.Error:
3636
cssClass += " alert alert-danger";
3737
break;
38-
default:
38+
default:
3939
break;
4040
}
4141

4242
return cssClass;
4343
}
44+
45+
public void Dispose()
46+
{
47+
Dispose(true);
48+
GC.SuppressFinalize(this);
49+
}
50+
51+
protected virtual void Dispose(bool disposing)
52+
{
53+
if(ShowTimer != null)
54+
{
55+
ShowTimer.Stop();
56+
ShowTimer.Dispose();
57+
ShowTimer = null;
58+
}
59+
}
4460
}
4561
}
Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,33 @@
1-
using System.Collections.Generic;
2-
using System.Threading;
3-
using System.Threading.Tasks;
41
using Microsoft.AspNetCore.Components.Server.Circuits;
52
using FWO.Logging;
6-
using FWO.Basics;
73
using FWO.Data;
8-
using System.Collections.Concurrent;
4+
using FWO.Services.EventMediator.Interfaces;
5+
using FWO.Services.EventMediator.Events;
96

107
namespace FWO.Ui.Services
118
{
12-
public class CircuitHandlerService : CircuitHandler
9+
public class CircuitHandlerService(IEventMediator eventMediator) : CircuitHandler
1310
{
1411
public UiUser? User { get; set; }
1512

13+
private readonly UserSessionClosedEvent OnUserSessionClosed = new();
14+
1615
public override Task OnCircuitClosedAsync(Circuit circuit, CancellationToken cancellationToken)
1716
{
1817
if (User != null)
1918
{
2019
Log.WriteAudit($"Session of \"{User.Name}\" closed", $"Session of user \"{User.Name}\" (last logged in) with DN: \"{User.Dn}\" was closed.");
20+
21+
OnUserSessionClosed.EventArgs = new UserSessionClosedEventArgs
22+
{
23+
UserDn = User.Dn,
24+
UserName = User.Name,
25+
};
26+
27+
eventMediator.Publish(nameof(CircuitHandlerService), OnUserSessionClosed);
2128
}
29+
2230
return base.OnCircuitClosedAsync(circuit, cancellationToken);
2331
}
24-
}
32+
}
2533
}

roles/ui/files/FWO.UI/Shared/MainLayout.razor

Lines changed: 61 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
@inherits LayoutComponentBase
22
@using FWO.Middleware.Client
3+
@using FWO.Services.EventMediator
4+
@using FWO.Services.EventMediator.Events
5+
@using FWO.Services.EventMediator.Interfaces
36
@using FWO.Ui.Auth
47
@using FWO.Ui.Data
58
@using FWO.Ui.Services
@@ -17,6 +20,9 @@
1720
@inject AuthenticationStateProvider authenticationProvider
1821
@inject ProtectedSessionStorage sessionStorage
1922
@inject CircuitHandler circuitHandler
23+
@inject IEventMediator EventMediator
24+
25+
@implements IDisposable
2026

2127
<NavigationMenu @bind-ShowAlert="showAlert" />
2228

@@ -27,7 +33,7 @@
2733
<button type="button" @onclick="@(() => ShowMessage("warning", "warning", MessageType.Warning))">warning</button>
2834
<button type="button" @onclick="@(() => ShowMessage("error", "error", MessageType.Error))">error</button>
2935
<button type="button" @onclick="@(() => ShowMessage("success", "success", MessageType.Success))">success</button>
30-
<button type="button" @onclick="@(() => { UIMessageQue.Clear(); UIMessages.Clear(); })">clear</button> *@
36+
<button type="button" @onclick="@(() => { UIMessageQue.Clear(); UIMessages.Clear(); })">clear</button> *@
3137
<CascadingValue Value="@DisplayMessageInUiFunction">
3238
@Body
3339
</CascadingValue>
@@ -118,13 +124,24 @@
118124
UIMessageQueTimer = new()
119125
{
120126
AutoReset = true,
121-
Enabled = true,
122-
Interval = 150
127+
Enabled = false,
128+
Interval = 500
123129
};
124130

125131
UIMessageQueTimer.Elapsed += OnUIMessageTimerTick;
132+
133+
EventMediator.Subscribe<UserSessionClosedEvent>(nameof(CircuitHandlerService), _ => OnUserSessionClosedEvent(_.EventArgs));
126134
}
127135

136+
private void OnUserSessionClosedEvent(UserSessionClosedEventArgs? e)
137+
{
138+
if (e == null || string.IsNullOrEmpty(e.UserDn))
139+
{
140+
return;
141+
}
142+
143+
JwtEventService.RemoveJwtTimers(e.UserDn);
144+
}
128145

129146
private async Task KeyHandler(KeyboardEventArgs ev)
130147
{
@@ -250,6 +267,8 @@
250267
{
251268
UIMessageQue.Enqueue(uiMessage);
252269
}
270+
271+
UIMessageQueTimer?.Start();
253272
}
254273
}
255274

@@ -260,6 +279,17 @@
260279

261280
private void OnUIMessageTimerTick(object? _, ElapsedEventArgs __)
262281
{
282+
if(UIMessageQueTimer is null)
283+
{
284+
return;
285+
}
286+
287+
if(UIMessageQue == null || UIMessageQue.Count == 0)
288+
{
289+
UIMessageQueTimer.Stop();
290+
return;
291+
}
292+
263293
if (UIMessageQue.Count > 0 && UIMessages.Count < userConfig.MaxMessages)
264294
{
265295
UIMessage uiMessage = UIMessageQue.Dequeue();
@@ -271,6 +301,15 @@
271301

272302
private void HideUIMessage(string messageId)
273303
{
304+
UIMessage? uiMessage = UIMessages.FirstOrDefault(_ => _.Id == messageId);
305+
306+
if (uiMessage is null)
307+
{
308+
return;
309+
}
310+
311+
uiMessage.Dispose();
312+
274313
UIMessages.RemoveAll(_ => _.Id == messageId);
275314

276315
InvokeAsync(StateHasChanged);
@@ -433,5 +472,23 @@
433472
{
434473
Log.WriteError("Acknowledge Alert", $"Could not acknowledge alert for ui: ", exception);
435474
}
436-
}
475+
}
476+
477+
public void Dispose()
478+
{
479+
JwtEventService.OnPermissionChanged -= OnPermissionsChanged;
480+
JwtEventService.OnJwtAboutToExpire -= OnJwtAboutToExpire;
481+
JwtEventService.OnJwtExpired -= OnJwtExpired;
482+
483+
if(UIMessageQueTimer is not null)
484+
{
485+
UIMessageQueTimer.Stop();
486+
UIMessageQueTimer.Elapsed -= OnUIMessageTimerTick;
487+
UIMessageQueTimer.Dispose();
488+
}
489+
490+
alertSubscription?.Dispose();
491+
492+
EventMediator.Unsubscribe<UserSessionClosedEvent>(nameof(CircuitHandlerService));
493+
}
437494
}

0 commit comments

Comments
 (0)