From cc0eb60bf50ccb737e7b30064c9cb1a953c03215 Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Sat, 31 Jan 2026 14:48:58 +0000 Subject: [PATCH 1/8] better loading and icon --- packages/frontend/src/components/chat.tsx | 47 ++++++++++++----------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/packages/frontend/src/components/chat.tsx b/packages/frontend/src/components/chat.tsx index 9221e7b..5f6d3bc 100644 --- a/packages/frontend/src/components/chat.tsx +++ b/packages/frontend/src/components/chat.tsx @@ -93,31 +93,34 @@ export function Chat({ setHighlighted }: { setHighlighted: (ids: number[]) => vo

{lastUserMessage}

)} - {response && ( + {(chat.isPending || response) && (
-

- {response.split("\n").map((line, index) => ( - // biome-ignore lint/suspicious/noArrayIndexKey: <> - - {line} -
-
- ))} -

+ {"sprint + + {!response && ( +
+ +
+ )} + + {response && ( +

+ {response.split("\n").map((line, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: <> + + {line} +
+
+ ))} +

+ )}
)} - - {chat.isPending && ( -
- -
- )} -
{models.data && models.data.length > 0 && ( From 82bf3e6d67453be93eb7f0b602617bb3c9d0bf03 Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Sat, 31 Jan 2026 21:31:21 +0000 Subject: [PATCH 8/8] useQuery instead of mutation --- packages/frontend/src/components/chat.tsx | 7 +------ packages/frontend/src/lib/query/hooks/chat.ts | 13 ++++++++----- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/frontend/src/components/chat.tsx b/packages/frontend/src/components/chat.tsx index 97e3910..e827bb7 100644 --- a/packages/frontend/src/components/chat.tsx +++ b/packages/frontend/src/components/chat.tsx @@ -16,7 +16,6 @@ export function Chat({ setHighlighted }: { setHighlighted: (ids: number[]) => vo const selectedOrganisation = useSelectedOrganisation(); const selectedProject = useSelectedProject(); const chat = useChat(); - const models = useModels(); const [isOpen, setIsOpen] = useState(false); const [message, setMessage] = useState(""); @@ -25,11 +24,7 @@ export function Chat({ setHighlighted }: { setHighlighted: (ids: number[]) => vo const [error, setError] = useState(null); const [selectedModel, setSelectedModel] = useState(""); - useEffect(() => { - if (isOpen && !models.data) { - models.mutate(); - } - }, [isOpen, models]); + const models = useModels(isOpen); useEffect(() => { if (models.data && models.data.length > 0 && !selectedModel) { diff --git a/packages/frontend/src/lib/query/hooks/chat.ts b/packages/frontend/src/lib/query/hooks/chat.ts index 83eaa93..1b8aee0 100644 --- a/packages/frontend/src/lib/query/hooks/chat.ts +++ b/packages/frontend/src/lib/query/hooks/chat.ts @@ -1,5 +1,5 @@ import type { ChatRequest, ChatResponse, ModelsResponse } from "@sprint/shared"; -import { useMutation } from "@tanstack/react-query"; +import { useMutation, useQuery } from "@tanstack/react-query"; import { apiClient } from "@/lib/server"; export function useChat() { @@ -14,14 +14,17 @@ export function useChat() { }); } -export function useModels() { - return useMutation({ - mutationKey: ["ai", "models"], - mutationFn: async () => { +export function useModels(enabled: boolean) { + return useQuery({ + queryKey: ["ai", "models"], + queryFn: async () => { const { data, error } = await apiClient.aiModels(); if (error) throw new Error(error); if (!data) throw new Error("failed to get models"); return data as ModelsResponse; }, + enabled, + retry: false, + staleTime: 5 * 60 * 1000, }); }