From f22a187148272494c2767a57efb122b06e475745 Mon Sep 17 00:00:00 2001 From: Harkamal Randhawa Date: Wed, 15 Apr 2026 01:31:29 -0600 Subject: [PATCH 1/2] always show chat sidebar --- web/app/chat/page.js | 81 +++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/web/app/chat/page.js b/web/app/chat/page.js index 0bc1bf26..74a2834e 100644 --- a/web/app/chat/page.js +++ b/web/app/chat/page.js @@ -22,7 +22,6 @@ function ChatPage() { const [error, setError] = useState(null); const [conversations, setConversations] = useState([]); const [convsLoading, setConvsLoading] = useState(false); - const [showSidebar, setShowSidebar] = useState(false); const [selectedFile, setSelectedFile] = useState(null); const messagesEndRef = useRef(null); @@ -172,13 +171,17 @@ function ChatPage() { } if (!convId) { + await fetchConversations(); setLoadingConv(false); setConversation(null); return; } - await fetchConversation(convId); - await fetchMessages(convId); + await Promise.all([ + fetchConversation(convId), + fetchMessages(convId), + fetchConversations(), + ]); setLoadingConv(false); startPolling(convId); } @@ -188,11 +191,7 @@ function ChatPage() { return () => { if (pollRef.current) clearInterval(pollRef.current); }; - }, [token, authLoading, conversationIdParam, fetchConversation, fetchMessages, startPolling]); - - useEffect(() => { - if (showSidebar && token) fetchConversations(); - }, [showSidebar, token, fetchConversations]); + }, [token, authLoading, conversationIdParam, fetchConversation, fetchMessages, startPolling, fetchConversations]); async function handleSend(e) { e?.preventDefault(); @@ -334,7 +333,7 @@ function ChatPage() { }); setConversation(conv); - await fetchMessages(conv.id); + await Promise.all([fetchMessages(conv.id), fetchConversations()]); setLoadingConv(false); startPolling(conv.id); router.replace(`/chat?id=${conv.id}`, { scroll: false }); @@ -354,7 +353,26 @@ function ChatPage() { setLoadingConv(false); startPolling(convId); router.replace(`/chat?id=${convId}`, { scroll: false }); - setShowSidebar(false); + } + + async function handleCloseConversation() { + if (!conversation || conversation.status === "CLOSED") return; + try { + const res = await fetch(`${API_BASE}/api/v1/chat/conversations/${conversation.id}`, { + method: "PUT", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ status: "CLOSED" }), + }); + if (!res.ok) return; + const updated = await res.json(); + setConversation(updated); + await fetchConversations(); + } catch { + // silent + } } if (authLoading || loadingConv) { @@ -392,11 +410,9 @@ function ChatPage() {
- {showSidebar && (
All Conversations -
{convsLoading &&

Loading...

} {!convsLoading && conversations.length === 0 && ( @@ -422,12 +438,11 @@ function ChatPage() { ))}
-
- )} -
+
{!conversation ? (
💬
@@ -437,9 +452,6 @@ function ChatPage() { - @@ -460,12 +472,15 @@ function ChatPage() {
- + {!isClosed && ( + + )} + ))} +
+
-
- {messages.length === 0 && ( -
-
🐾
-

- Hello{user.fullName ? `, ${user.fullName.split(" ")[0]}` : ""}! I'm your pet care assistant. - Ask me about pet recommendations, care tips, supplies, or anything pet-related! -

+
+ {!conversation ? ( +
+
🐾
+

No active conversation

+

Start a new conversation with the AI assistant.

+ {error &&
{error}
} + +
- )} - - {messages.map((msg) => ( -
- {msg.role === "assistant" && ( -
🐾
- )} -
- {msg.content.split("\n").map((line, i) => ( - - {line} - {i < msg.content.split("\n").length - 1 &&
} -
- ))} + ) : ( +
+
+
+
🐾
+
+
Leon's Pet Assistant
+
+ Online +
+
+
+
+ {!isEscalated && !isClosed && ( + + )} + +
- {msg.role === "user" && ( -
- {user.fullName ? user.fullName.charAt(0).toUpperCase() : "U"} + +
+ {messages.length === 0 && ( +
+
🐾
+

+ Hello{user.fullName ? `, ${user.fullName.split(" ")[0]}` : ""}! I'm your pet care assistant. + Ask me about pet recommendations, care tips, supplies, or anything pet-related! +

+
+ )} + + {messages.map((msg) => { + const isOwn = msg.senderId === user.id; + return ( +
+ {!isOwn &&
🐾
} +
+ {msg.content && msg.content.split("\n").map((line, i, arr) => ( + + {line} + {i < arr.length - 1 &&
} +
+ ))} + {msg.attachmentUrl && ( + + )} +
+ {msg.timestamp ? new Date(msg.timestamp).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }) : ""} +
+
+ {isOwn && ( +
+ {user.fullName ? user.fullName.charAt(0).toUpperCase() : "U"} +
+ )} +
+ ); + })} +
+
+ + {error && ( +
+ {error} +
)} -
- ))} - {sending && ( -
-
🐾
-
- - - -
+ {isClosed ? ( +
+ This conversation has been closed. + +
+ ) : ( +
+ + {selectedFile && ( +
+ 📎 {selectedFile.name} + +
+ )} +
+ +