From e193e294992a52c3a13c42a97699db7db9dd0df9 Mon Sep 17 00:00:00 2001 From: Harkamal Randhawa Date: Wed, 15 Apr 2026 23:12:23 -0600 Subject: [PATCH] fix contact layout and chat ui --- web/app/ai-chat/page.js | 65 ++++++++++++++++------------- web/app/chat/page.js | 64 +++++++++++++++------------- web/app/contact/page.js | 92 ++++++++++++++++++++--------------------- web/app/globals.css | 4 ++ 4 files changed, 119 insertions(+), 106 deletions(-) diff --git a/web/app/ai-chat/page.js b/web/app/ai-chat/page.js index c059e3f4..6dbf101a 100644 --- a/web/app/ai-chat/page.js +++ b/web/app/ai-chat/page.js @@ -92,6 +92,7 @@ function AiChatPage() { const lastMessageIdRef = useRef(null); const fileInputRef = useRef(null); const lastScrolledIdRef = useRef(null); + const initialLoadDoneRef = useRef(false); useEffect(() => { if (!authLoading && !user) { @@ -103,6 +104,7 @@ function AiChatPage() { if (messages.length === 0) return; const lastMsg = messages[messages.length - 1]; if (lastMsg.id === lastScrolledIdRef.current) return; + if (!initialLoadDoneRef.current) return; lastScrolledIdRef.current = lastMsg.id; const area = messagesAreaRef.current; if (!area) return; @@ -114,6 +116,7 @@ function AiChatPage() { const fetchMessages = useCallback(async (convId) => { if (!token || !convId) return; + initialLoadDoneRef.current = false; try { const res = await fetch(`${API_BASE}/api/v1/chat/conversations/${convId}/messages`, { headers: { Authorization: `Bearer ${token}` }, @@ -122,10 +125,17 @@ function AiChatPage() { const data = await res.json(); if (Array.isArray(data)) { setMessages(data); - if (data.length > 0) lastMessageIdRef.current = data[data.length - 1].id; + if (data.length > 0) { + lastMessageIdRef.current = data[data.length - 1].id; + lastScrolledIdRef.current = data[data.length - 1].id; + } + setTimeout(() => { + const area = messagesAreaRef.current; + if (area) area.scrollTop = area.scrollHeight; + initialLoadDoneRef.current = true; + }, 50); } } catch { - // silent } }, [token]); @@ -491,34 +501,31 @@ function AiChatPage() { ))} - {conversations.some(c => c.status === "CLOSED") && ( - <> - - {closedExpanded && conversations.filter(c => c.status === "CLOSED").map((conv) => ( - - ))} - - )} + {conversations.some(c => c.status === "CLOSED") && ( + <> + + {closedExpanded && conversations.filter(c => c.status === "CLOSED").map((conv) => ( + + ))} + + )} diff --git a/web/app/chat/page.js b/web/app/chat/page.js index 9c8e48f8..dbee3ed3 100644 --- a/web/app/chat/page.js +++ b/web/app/chat/page.js @@ -92,6 +92,7 @@ function ChatPage() { const lastMessageIdRef = useRef(null); const fileInputRef = useRef(null); const lastScrolledIdRef = useRef(null); + const initialLoadDoneRef = useRef(false); useEffect(() => { if (!authLoading && !user) { @@ -103,6 +104,7 @@ function ChatPage() { if (messages.length === 0) return; const lastMsg = messages[messages.length - 1]; if (lastMsg.id === lastScrolledIdRef.current) return; + if (!initialLoadDoneRef.current) return; lastScrolledIdRef.current = lastMsg.id; const area = messagesAreaRef.current; if (!area) return; @@ -114,6 +116,7 @@ function ChatPage() { const fetchMessages = useCallback(async (convId) => { if (!token || !convId) return; + initialLoadDoneRef.current = false; try { const res = await fetch(`${API_BASE}/api/v1/chat/conversations/${convId}/messages`, { headers: { Authorization: `Bearer ${token}` }, @@ -128,10 +131,16 @@ function ChatPage() { if (data.length > 0) { lastMessageIdRef.current = data[data.length - 1].id; + lastScrolledIdRef.current = data[data.length - 1].id; } + setTimeout(() => { + const area = messagesAreaRef.current; + if (area) area.scrollTop = area.scrollHeight; + initialLoadDoneRef.current = true; + }, 50); } - } - + } + catch { setError("Failed to load messages."); } @@ -495,34 +504,31 @@ function ChatPage() { ))} - {conversations.some(c => c.status === "CLOSED") && ( - <> - - {closedExpanded && conversations.filter(c => c.status === "CLOSED").map((conv) => ( - - ))} - - )} + {conversations.some(c => c.status === "CLOSED") && ( + <> + + {closedExpanded && conversations.filter(c => c.status === "CLOSED").map((conv) => ( + + ))} + + )} diff --git a/web/app/contact/page.js b/web/app/contact/page.js index eb8274e9..5ae4b5e4 100644 --- a/web/app/contact/page.js +++ b/web/app/contact/page.js @@ -50,7 +50,7 @@ export default function ContactPage() { setSendSuccess(true); setSubject(""); setBody(""); - } catch (err) { + } catch { setSendError("Failed to send message. Please try again."); } finally { setSending(false); @@ -61,67 +61,63 @@ export default function ContactPage() {

Contact Us

-

Reach the team, find a location, or connect with store personnel.

+

Reach the team, find a location, or send us a message.

-
+
-

General Contact

+

Get in Touch

Email: hello@leonspetstore.com.au

Phone: (03) 9000 0000

Hours: Mon–Sat, 9:00 AM – 6:00 PM

-
- {token && ( -
-

Send Us a Message

- {sendSuccess ? ( -

Your message has been sent. We'll be in touch soon.

- ) : ( -
- -