From 2550f4c4a7aeb34cda0e14b6816609806a4c734c Mon Sep 17 00:00:00 2001 From: Hermes Date: Thu, 9 Apr 2026 21:34:50 -0500 Subject: [PATCH] Session + message pagination, SVG favicon, load-more buttons --- app/history/[id]/page.tsx | 14 +++++++++++++- app/history/page.tsx | 13 ++++++++++++- app/layout.tsx | 2 +- lib/hooks.ts | 6 +++--- public/favicon.svg | 6 ++++++ 5 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 public/favicon.svg diff --git a/app/history/[id]/page.tsx b/app/history/[id]/page.tsx index 8c26345..0024d91 100644 --- a/app/history/[id]/page.tsx +++ b/app/history/[id]/page.tsx @@ -25,7 +25,8 @@ export default function SessionReplayPage({ params }: { params: Promise<{ id: st const [editingTitle, setEditingTitle] = useState(false); const [titleDraft, setTitleDraft] = useState(""); const { data: sessionData } = useSession(id); - const { data: messagesData, isLoading } = useMessages(id); + const [msgLimit, setMsgLimit] = useState(100); + const { data: messagesData, isLoading } = useMessages(id, msgLimit); const [input, setInput] = useState(""); const [sending, setSending] = useState(false); const [pendingMsg, setPendingMsg] = useState(null); @@ -266,6 +267,17 @@ export default function SessionReplayPage({ params }: { params: Promise<{ id: st Empty session

)} + + {/* Load more (at bottom = older messages since list is reversed) */} + {(messagesData?.total || 0) > msgLimit && ( + + )} )} diff --git a/app/history/page.tsx b/app/history/page.tsx index 7c29071..e592a1a 100644 --- a/app/history/page.tsx +++ b/app/history/page.tsx @@ -19,7 +19,9 @@ export default function HistoryPage() { const [query, setQuery] = useState(""); const [searching, setSearching] = useState(false); - const { data: sessionsData, isLoading } = useSessions(30, filter || undefined); + const [limit, setLimit] = useState(20); + const { data: sessionsData, isLoading } = useSessions(limit, filter || undefined); + const hasMore = (sessionsData?.total || 0) > (sessionsData?.items?.length || 0); const { data: searchData, isFetching: searchLoading } = useSessionSearch(searching ? query : ""); const showSearch = searching && query.length >= 2; @@ -107,6 +109,15 @@ export default function HistoryPage() { {sessionsData?.items?.length === 0 && (

No sessions found

)} + {hasMore && ( + + )} )} diff --git a/app/layout.tsx b/app/layout.tsx index 9b55c90..a657128 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -7,7 +7,7 @@ import { ErrorBoundary } from "@/components/ErrorBoundary"; export const metadata: Metadata = { title: "Hermes OS", description: "Mobile dashboard for Hermes Agent", - icons: { icon: "/icon-192.png", apple: "/icon-192.png" }, + icons: { icon: "/favicon.svg", apple: "/icon-192.png" }, appleWebApp: { capable: true, statusBarStyle: "black-translucent", title: "Hermes" }, }; diff --git a/lib/hooks.ts b/lib/hooks.ts index 2bdf184..e1520ea 100644 --- a/lib/hooks.ts +++ b/lib/hooks.ts @@ -19,10 +19,10 @@ export function useSession(id: string) { }); } -export function useMessages(sessionId: string) { +export function useMessages(sessionId: string, limit = 200) { return useQuery({ - queryKey: ["messages", sessionId], - queryFn: () => api.fetchMessages(sessionId), + queryKey: ["messages", sessionId, limit], + queryFn: () => api.fetchMessages(sessionId, limit), enabled: !!sessionId, }); } diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..af5c87c --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,6 @@ + + + + + +