From bf61a4ad12b892a977e67db8e054424043bf0a86 Mon Sep 17 00:00:00 2001
From: Brieuc Dubois <git@bhasher.com>
Date: Sat, 16 Mar 2024 23:26:36 +0100
Subject: [PATCH] frontend: realtime disconnection warning

---
 .../lib/components/sessions/chatbox.svelte    | 19 +++++++++++++++++--
 frontend/src/lib/types/session.ts             | 13 ++++++++-----
 2 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/frontend/src/lib/components/sessions/chatbox.svelte b/frontend/src/lib/components/sessions/chatbox.svelte
index 9a9af5e8..e0c05d3f 100644
--- a/frontend/src/lib/components/sessions/chatbox.svelte
+++ b/frontend/src/lib/components/sessions/chatbox.svelte
@@ -17,6 +17,11 @@
 		messages = newMessages;
 	});
 
+	let wsConnected = get(session.wsConnected);
+	session.wsConnected.subscribe((newConnected) => {
+		wsConnected = newConnected;
+	});
+
 	onMount(async () => {
 		await session.loadMessages();
 		session.wsConnect();
@@ -40,12 +45,22 @@
 </script>
 
 <div class="flex flex-col md:my-8 min-w-fit w-full max-w-4xl border-2">
-	<div class="flex-grow h-48 overflow-auto flex-col-reverse px-4 flex" bind:this={htmlMessages}>
+	<div
+		class="flex-grow h-48 overflow-auto flex-col-reverse px-4 flex mb-2"
+		bind:this={htmlMessages}
+	>
 		{#each messages.sort((a, b) => b.created_at.getTime() - a.created_at.getTime()) as message (message.id)}
 			<MessageC {message} />
 		{/each}
 	</div>
-	<div class="flex flex-row h-20 mt-2">
+	{#if !wsConnected}
+		<div
+			class="bg-orange-400 h-10 text-center text-white font-bold flex justify-center items-center"
+		>
+			Real-time sync lost. You may need to refresh the page to see new messages.
+		</div>
+	{/if}
+	<div class="flex flex-row h-20">
 		<textarea
 			class="flex-grow border-2 border-gray-300 rounded-md p-2 resize-none overflow-y-hidden"
 			placeholder="Send a message..."
diff --git a/frontend/src/lib/types/session.ts b/frontend/src/lib/types/session.ts
index 1bb480d4..5573e5a1 100644
--- a/frontend/src/lib/types/session.ts
+++ b/frontend/src/lib/types/session.ts
@@ -23,7 +23,7 @@ export default class Session {
 	private _messages: Writable<Message[]>;
 	private _created_at: Date;
 	private _ws: WebSocket | null = null;
-	private _ws_connected = false;
+	private _ws_connected = writable(false);
 
 	private constructor(
 		id: number,
@@ -64,6 +64,10 @@ export default class Session {
 		return this._messages;
 	}
 
+	get wsConnected(): Writable<boolean> {
+		return this._ws_connected;
+	}
+
 	usersList(maxLength = 30): string {
 		const users = this._users.map((user) => user.username).join(', ');
 		if (users.length < maxLength) {
@@ -142,14 +146,14 @@ export default class Session {
 	}
 
 	public wsConnect() {
-		if (this._ws_connected) return;
+		if (get(this._ws_connected)) return;
 
 		const token = localStorage.getItem('accessToken');
 
 		this._ws = new WebSocket(`${WS_URL}/${token}/${this.id}`);
 
 		this._ws.onopen = () => {
-			this._ws_connected = true;
+			this._ws_connected.set(true);
 			console.log('WS connected');
 		};
 
@@ -160,7 +164,6 @@ export default class Session {
 				if (data['action'] === 'create') {
 					const message = Message.parse(data['data']);
 					if (message) {
-						console.log('Received message:', message);
 						this._messages.update((messages) => {
 							if (!messages.find((m) => m.id === message.id)) {
 								return [...messages, message];
@@ -177,7 +180,7 @@ export default class Session {
 
 		this._ws.onclose = () => {
 			this._ws = null;
-			this._ws_connected = false;
+			this._ws_connected.set(false);
 			console.log('WS closed, reconnecting in 1s');
 			setTimeout(() => this.wsConnect(), 1000);
 		};
-- 
GitLab