From 8cdf33e27c633ac30e8851c4617f6063c141660d Mon Sep 17 00:00:00 2001
From: Matthias Nott <mnott@mnsoft.org>
Date: Sat, 07 Mar 2026 17:53:05 +0100
Subject: [PATCH] fix: audio routing, WebSocket reconnection, inverted chat list

---
 contexts/ChatContext.tsx |   32 ++++++++++++++++++++++++++++++--
 1 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/contexts/ChatContext.tsx b/contexts/ChatContext.tsx
index 408e878..be47100 100644
--- a/contexts/ChatContext.tsx
+++ b/contexts/ChatContext.tsx
@@ -112,6 +112,8 @@
   saveTimer = setTimeout(() => persistMessages(map), 1000);
 }
 
+const PAGE_SIZE = 50;
+
 // --- Context ---
 
 interface ChatContextValue {
@@ -131,6 +133,8 @@
   createSession: (opts?: { project?: string; path?: string }) => void;
   fetchProjects: () => void;
   projects: PaiProject[];
+  loadMoreMessages: () => void;
+  hasMoreMessages: boolean;
   unreadCounts: Record<string, number>;
   latestScreenshot: string | null;
   requestScreenshot: () => void;
@@ -155,6 +159,8 @@
   const [isTyping, setIsTyping] = useState(false);
   // PAI projects list
   const [projects, setProjects] = useState<PaiProject[]>([]);
+  // Pagination: does the active session have more messages in storage?
+  const [hasMoreMessages, setHasMoreMessages] = useState(false);
 
   const {
     status,
@@ -184,8 +190,10 @@
           if (prev) {
             messagesMapRef.current[prev] = messages;
           }
-          const stored = messagesMapRef.current[active.id] ?? [];
-          setMessages(stored);
+          const all = messagesMapRef.current[active.id] ?? [];
+          const page = all.length > PAGE_SIZE ? all.slice(-PAGE_SIZE) : all;
+          setMessages(page);
+          setHasMoreMessages(all.length > PAGE_SIZE);
           setUnreadCounts((u) => {
             if (!u[active.id]) return u;
             const next = { ...u };
@@ -550,6 +558,24 @@
     sendCommand("projects");
   }, [sendCommand]);
 
+  const loadMoreMessages = useCallback(() => {
+    setActiveSessionId((sessId) => {
+      if (!sessId) return sessId;
+      const all = messagesMapRef.current[sessId] ?? [];
+      setMessages((current) => {
+        if (current.length >= all.length) {
+          setHasMoreMessages(false);
+          return current;
+        }
+        const nextSize = Math.min(current.length + PAGE_SIZE, all.length);
+        const page = all.slice(-nextSize);
+        setHasMoreMessages(nextSize < all.length);
+        return page;
+      });
+      return sessId;
+    });
+  }, []);
+
   // --- Screenshot / navigation ---
   const requestScreenshot = useCallback(() => {
     sendCommand("screenshot");
@@ -581,6 +607,8 @@
         createSession,
         fetchProjects,
         projects,
+        loadMoreMessages,
+        hasMoreMessages,
         unreadCounts,
         latestScreenshot,
         requestScreenshot,

--
Gitblit v1.3.1