68 lines
1.9 KiB
TypeScript
68 lines
1.9 KiB
TypeScript
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<SessionEntry[]>({
|
|
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<SessionEntry[]>(
|
|
['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,
|
|
};
|
|
}
|