From d4e8aa8192d3f79f2eee96cd41c183e911371235 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?L=C3=A9o?= <leopold.chappuis@savoirfairelinux.com>
Date: Fri, 7 Feb 2025 12:07:38 -0500
Subject: [PATCH] conversation-loading: implement automatic reload upon
 conversation retrieval

This change aims to prevent the user from needing to refresh the page to view their loaded conversation.

Change-Id: Ie4e0e385d261d5a2ac5cab610463ede3caf8d96a
---
 client/src/components/ConversationList.tsx    | 11 ++++-------
 common/src/enums/websocket-message-type.ts    |  1 +
 common/src/interfaces/websocket-interfaces.ts |  4 ++++
 common/src/interfaces/websocket-message.ts    |  2 ++
 server/src/jamid/jamid.ts                     |  3 +++
 5 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/client/src/components/ConversationList.tsx b/client/src/components/ConversationList.tsx
index a6322cb3..0cbcbf0b 100644
--- a/client/src/components/ConversationList.tsx
+++ b/client/src/components/ConversationList.tsx
@@ -116,14 +116,11 @@ const SummariesTabPanel = (props: TabPanelProps) => {
   const refreshConversationsSummaries = useRefreshConversationsSummaries()
 
   useEffect(() => {
-    function conversationMessageListener() {
-      refreshConversationsSummaries()
-    }
-
-    websocket.bind(WebSocketMessageType.ConversationMessage, conversationMessageListener)
-
+    websocket.bind(WebSocketMessageType.ConversationMessage, refreshConversationsSummaries)
+    websocket.bind(WebSocketMessageType.ConversationReady, refreshConversationsSummaries)
     return () => {
-      websocket.unbind(WebSocketMessageType.ConversationMessage, conversationMessageListener)
+      websocket.unbind(WebSocketMessageType.ConversationMessage, refreshConversationsSummaries)
+      websocket.unbind(WebSocketMessageType.ConversationReady, refreshConversationsSummaries)
     }
   }, [websocket, refreshConversationsSummaries])
 
diff --git a/common/src/enums/websocket-message-type.ts b/common/src/enums/websocket-message-type.ts
index 6f791dc5..b0665e5f 100644
--- a/common/src/enums/websocket-message-type.ts
+++ b/common/src/enums/websocket-message-type.ts
@@ -30,6 +30,7 @@ export enum WebSocketMessageType {
   LoadMoreMessages = 'load-more-messages',
   LoadSwarmUntil = 'load-swarm-until',
   KnownDevicesChanged = 'known-devices-changed',
+  ConversationReady = 'conversation-ready',
 
   // calls (in the order they should be sent)
   sendCallInvite = 'sendCallInvite',
diff --git a/common/src/interfaces/websocket-interfaces.ts b/common/src/interfaces/websocket-interfaces.ts
index 11efdfd2..99ab4e3a 100644
--- a/common/src/interfaces/websocket-interfaces.ts
+++ b/common/src/interfaces/websocket-interfaces.ts
@@ -47,6 +47,10 @@ export interface ConversationView {
   conversationId: string
 }
 
+export interface ConversationReady {
+  conversationId: string
+}
+
 export interface AccountMessageStatus {
   conversationId: string
   peer: string
diff --git a/common/src/interfaces/websocket-message.ts b/common/src/interfaces/websocket-message.ts
index 8b6214ff..62d1a0b8 100644
--- a/common/src/interfaces/websocket-message.ts
+++ b/common/src/interfaces/websocket-message.ts
@@ -25,6 +25,7 @@ import {
   ComposingStatus,
   ConversationMemberEvent,
   ConversationMessage,
+  ConversationReady,
   ConversationView,
   IAccountDetails,
   IKnownDevicesChanged,
@@ -54,6 +55,7 @@ export interface WebSocketMessageTable {
   [WebSocketMessageType.LoadMoreMessages]: LoadMoreMessages
   [WebSocketMessageType.LoadSwarmUntil]: LoadSwarmUntil
   [WebSocketMessageType.KnownDevicesChanged]: IKnownDevicesChanged
+  [WebSocketMessageType.ConversationReady]: ConversationReady
 
   // calls (in the order they should be sent)
   [WebSocketMessageType.sendCallInvite]: CallInvite
diff --git a/server/src/jamid/jamid.ts b/server/src/jamid/jamid.ts
index 1832e8e6..1b75d7b8 100644
--- a/server/src/jamid/jamid.ts
+++ b/server/src/jamid/jamid.ts
@@ -856,6 +856,9 @@ export class Jamid {
 
     this.events.onConversationReady.subscribe((signal) => {
       log.debug('Received ConversationReady:', JSON.stringify(signal))
+      this.webSocketServer.send(signal.accountId, WebSocketMessageType.ConversationReady, {
+        conversationId: signal.conversationId,
+      })
     })
 
     this.events.onConversationRemoved.subscribe((signal) => {
-- 
GitLab