diff --git a/surfsense_web/atoms/chats/chat-mutation.atoms.ts b/surfsense_web/atoms/chats/chat-mutation.atoms.ts index 382ebb6d3..f7ad5cf4b 100644 --- a/surfsense_web/atoms/chats/chat-mutation.atoms.ts +++ b/surfsense_web/atoms/chats/chat-mutation.atoms.ts @@ -1,7 +1,11 @@ import { atomWithMutation } from "jotai-tanstack-query"; import { toast } from "sonner"; import type { Chat } from "@/app/dashboard/[search_space_id]/chats/chats-client"; -import type { DeleteChatRequest } from "@/contracts/types/chat.types"; +import type { + CreateChatRequest, + DeleteChatRequest, + UpdateChatRequest, +} from "@/contracts/types/chat.types"; import { chatsApiService } from "@/lib/apis/chats-api.service"; import { cacheKeys } from "@/lib/query-client/cache-keys"; import { queryClient } from "@/lib/query-client/client"; @@ -31,3 +35,43 @@ export const deleteChatMutationAtom = atomWithMutation((get) => { }, }; }); + +export const createChatMutationAtom = atomWithMutation((get) => { + const searchSpaceId = get(activeSearchSpaceIdAtom); + const authToken = localStorage.getItem("surfsense_bearer_token"); + const chatsQueryParams = get(globalChatsQueryParamsAtom); + + return { + mutationKey: cacheKeys.chats.globalQueryParams(chatsQueryParams), + enabled: !!searchSpaceId && !!authToken, + mutationFn: async (request: CreateChatRequest) => { + return chatsApiService.createChat(request); + }, + + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: cacheKeys.chats.globalQueryParams(chatsQueryParams), + }); + }, + }; +}); + +export const updateChatMutationAtom = atomWithMutation((get) => { + const searchSpaceId = get(activeSearchSpaceIdAtom); + const authToken = localStorage.getItem("surfsense_bearer_token"); + const chatsQueryParams = get(globalChatsQueryParamsAtom); + + return { + mutationKey: cacheKeys.chats.globalQueryParams(chatsQueryParams), + enabled: !!searchSpaceId && !!authToken, + mutationFn: async (request: UpdateChatRequest) => { + return chatsApiService.updateChat(request); + }, + + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: cacheKeys.chats.globalQueryParams(chatsQueryParams), + }); + }, + }; +}); diff --git a/surfsense_web/contracts/types/chat.types.ts b/surfsense_web/contracts/types/chat.types.ts index 0b8b5975c..23c78c424 100644 --- a/surfsense_web/contracts/types/chat.types.ts +++ b/surfsense_web/contracts/types/chat.types.ts @@ -34,10 +34,17 @@ export const deleteChatResponse = z.object({ export const deleteChatRequest = chatSummary.pick({ id: true }); -export const createChatRequest = chatDetails.omit({ - created_at: true, - id: true, - state_version: true, +export const createChatRequest = z.object({ + type: chatTypeEnum, + title: z.string().optional().default("Untitled Chat"), + initial_connectors: z.array(z.string()), + messages: z.array( + z.object({ + role: z.enum(["user", "assistant"]), + content: z.string(), + }) + ), + search_space_id: z.number(), }); export const updateChatRequest = chatDetails.omit({ diff --git a/surfsense_web/lib/apis/chats-api.service.ts b/surfsense_web/lib/apis/chats-api.service.ts index ce012715b..7c53815a4 100644 --- a/surfsense_web/lib/apis/chats-api.service.ts +++ b/surfsense_web/lib/apis/chats-api.service.ts @@ -86,20 +86,12 @@ class ChatApiService { throw new ValidationError(`Invalid request: ${errorMessage}`); } - const { type, title, initial_connectors, messages, search_space_id } = parsedRequest.data; - return baseApiService.post( `/api/v1/chats`, chatSummary, { - body: { - type, - title, - initial_connectors, - messages, - search_space_id, - }, + body: parsedRequest.data, } ); };