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