import type { SessionEntry, ChatMessage, Message } from 'apps/Chat'; import { useAuth } from 'hooks/useAuth'; import { useClient } from 'hooks/useClient'; import { useQuery, useQueryClient } from '@tanstack/react-query'; type SessionWithMessages = { id: string; title: string; model: string; cwd: string; groupSlug?: string | null; createdAt: number; updatedAt: number; messageCount: number; cost: { inputTokens: number; outputTokens: number; totalUSD: number; }; messages: Message[]; }; export function useChatSessions() { const client = useClient(); const queryClient = useQueryClient(); const { isAuthenticated } = useAuth(); const { data: sessions = [] } = useQuery({ queryKey: ['PI_SESSIONS'], enabled: isAuthenticated, queryFn: () => client.post<{ sessions: SessionEntry[] }>('/api/pi/sessions').then((r) => r.sessions), }); function getSession(sessionId: string) { return client.get<{ session: SessionWithMessages }>(`/api/pi/sessions/${sessionId}`); } function saveMessages(sessionId: string, messages: ChatMessage[]) { return client.put(`/api/pi/sessions/${sessionId}/messages`, messages); } async function renameSession(sessionId: string, title: string) { await client.patch(`/api/pi/sessions/${sessionId}`, { title }); queryClient.invalidateQueries({ queryKey: ['PI_SESSIONS'] }); } async function deleteSession(sessionId: string) { await client.delete(`/api/pi/sessions/${sessionId}`); queryClient.setQueryData( ['PI_SESSIONS'], (prev) => prev?.filter((s) => s.id !== sessionId) ?? [], ); } function searchSessions(query: string) { return client.get<{ results: SessionEntry[] }>(`/api/pi/sessions/search?q=${encodeURIComponent(query)}`); } return { sessions, getSession, saveMessages, renameSession, deleteSession, searchSessions, }; }