1- using Microsoft . AspNetCore . Components ;
1+ using Immense . SimpleMessenger ;
2+ using Microsoft . AspNetCore . Components ;
23using Microsoft . AspNetCore . Components . Web ;
34using Remotely . Server . Hubs ;
5+ using Remotely . Server . Models . Messages ;
46using Remotely . Server . Services ;
7+ using Remotely . Server . Services . Stores ;
58using Remotely . Shared . Enums ;
69using Remotely . Shared . ViewModels ;
710using System ;
8- using System . Collections . Generic ;
9- using System . Linq ;
1011using System . Threading . Tasks ;
1112
1213namespace Remotely . Server . Components . Devices ;
1314
14- public partial class ChatCard : AuthComponentBase , IDisposable
15+ public partial class ChatCard : AuthComponentBase , IAsyncDisposable
1516{
1617 private ElementReference _chatMessagesWindow ;
1718
@@ -22,21 +23,14 @@ public partial class ChatCard : AuthComponentBase, IDisposable
2223 public required ChatSession Session { get ; set ; }
2324
2425 [ Inject ]
25- private IClientAppState AppState { get ; init ; } = null ! ;
26+ private IChatSessionStore ChatSessionStore { get ; init ; } = null ! ;
2627
2728 [ Inject ]
2829 private ICircuitConnection CircuitConnection { get ; init ; } = null ! ;
2930
3031 [ Inject ]
3132 private IJsInterop JsInterop { get ; init ; } = null ! ;
3233
33- public void Dispose ( )
34- {
35- AppState . PropertyChanged -= AppState_PropertyChanged ;
36- CircuitConnection . MessageReceived -= CircuitConnection_MessageReceived ;
37- GC . SuppressFinalize ( this ) ;
38- }
39-
4034 protected override void OnAfterRender ( bool firstRender )
4135 {
4236 JsInterop . ScrollToEnd ( _chatMessagesWindow ) ;
@@ -45,64 +39,55 @@ protected override void OnAfterRender(bool firstRender)
4539 protected override async Task OnInitializedAsync ( )
4640 {
4741 await base . OnInitializedAsync ( ) ;
48- AppState . PropertyChanged += AppState_PropertyChanged ;
49- CircuitConnection . MessageReceived += CircuitConnection_MessageReceived ;
42+ await Register < ChatReceivedMessage , string > (
43+ CircuitConnection . ConnectionId ,
44+ HandleChatMessageReceived ) ;
5045 }
5146
52- private async void AppState_PropertyChanged ( object ? sender , System . ComponentModel . PropertyChangedEventArgs e )
47+ private async Task HandleChatMessageReceived ( ChatReceivedMessage message )
5348 {
54- if ( e . PropertyName == Session . SessionId )
49+ if ( message . DeviceId != Session . DeviceId )
5550 {
56- await InvokeAsync ( StateHasChanged ) ;
51+ return ;
5752 }
58- }
5953
60- private async void CircuitConnection_MessageReceived ( object ? sender , Models . CircuitEvent e )
61- {
62- if ( e . EventName == Models . CircuitEventName . ChatReceived )
54+ if ( ! ChatSessionStore . TryGetSession ( message . DeviceId , out var session ) )
6355 {
64- var deviceId = ( string ) e . Params [ 0 ] ;
56+ return ;
57+ }
6558
66- if ( deviceId == Session . DeviceId )
59+ if ( message . DidDisconnect )
60+ {
61+ session . ChatHistory . Enqueue ( new ChatHistoryItem ( )
6762 {
68- var deviceName = ( string ) e . Params [ 1 ] ;
69- var message = ( string ) e . Params [ 2 ] ;
70- var disconnected = ( bool ) e . Params [ 3 ] ;
71-
72- var session = AppState . DevicesFrameChatSessions . Find ( x => x . DeviceId == deviceId ) ;
73-
74- if ( disconnected )
75- {
76- session . ChatHistory . Add ( new ChatHistoryItem ( )
77- {
78- Message = $ "{ Session . DeviceName } disconnected.",
79- Origin = ChatHistoryItemOrigin . System
80- } ) ;
81- }
82- else
83- {
84- session . ChatHistory . Add ( new ChatHistoryItem ( )
85- {
86- Message = message ,
87- Origin = ChatHistoryItemOrigin . Device
88- } ) ;
89- }
90-
91- if ( ! session . IsExpanded )
92- {
93- session . MissedChats ++ ;
94- }
95-
96- await InvokeAsync ( StateHasChanged ) ;
97-
98- JsInterop . ScrollToEnd ( _chatMessagesWindow ) ;
99- }
63+ Message = $ "{ Session . DeviceName } disconnected.",
64+ Origin = ChatHistoryItemOrigin . System
65+ } ) ;
66+ }
67+ else
68+ {
69+ session . ChatHistory . Enqueue ( new ChatHistoryItem ( )
70+ {
71+ Message = message . MessageText ,
72+ Origin = ChatHistoryItemOrigin . Device
73+ } ) ;
74+ }
75+
76+ if ( ! session . IsExpanded )
77+ {
78+ session . MissedChats ++ ;
10079 }
80+
81+ await InvokeAsync ( StateHasChanged ) ;
82+
83+ JsInterop . ScrollToEnd ( _chatMessagesWindow ) ;
10184 }
102- private void CloseChatCard ( )
85+
86+ private async Task CloseChatCard ( )
10387 {
104- AppState . DevicesFrameChatSessions . RemoveAll ( x => x . DeviceId == Session . DeviceId ) ;
105- AppState . InvokePropertyChanged ( nameof ( AppState . DevicesFrameChatSessions ) ) ;
88+ _ = ChatSessionStore . TryRemove ( $ "{ Session . DeviceId } ", out _ ) ;
89+ var message = new ChatSessionsChangedMessage ( ) ;
90+ await Messenger . Send ( message , CircuitConnection . ConnectionId ) ;
10691 }
10792 private async Task EvaluateInputKeypress ( KeyboardEventArgs args )
10893 {
@@ -115,7 +100,7 @@ private async Task EvaluateInputKeypress(KeyboardEventArgs args)
115100
116101 await CircuitConnection . SendChat ( _inputText , $ "{ Session . DeviceId } ") ;
117102
118- Session . ChatHistory . Add ( new ChatHistoryItem ( )
103+ Session . ChatHistory . Enqueue ( new ChatHistoryItem ( )
119104 {
120105 Origin = ChatHistoryItemOrigin . Self ,
121106 Message = _inputText
0 commit comments