- Add ilike import and search/agentId conditions in chatService.listConversations - Extract search and agentId from req.query in GET /conversations route - Extend chatApi.listConversations opts with search and agentId params - Update useChatConversations to accept opts.search and include in queryKey
49 lines
1.8 KiB
TypeScript
49 lines
1.8 KiB
TypeScript
import { useInfiniteQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
|
import { chatApi } from "../api/chat";
|
|
import type { ChatConversationListResponse } from "@paperclipai/shared";
|
|
|
|
export function useChatConversations(companyId: string | null, opts?: { search?: string }) {
|
|
const queryClient = useQueryClient();
|
|
|
|
const query = useInfiniteQuery({
|
|
queryKey: ["chat", "conversations", companyId, opts?.search ?? ""],
|
|
queryFn: ({ pageParam }) =>
|
|
chatApi.listConversations(companyId!, { cursor: pageParam as string | undefined, search: opts?.search || undefined }),
|
|
initialPageParam: undefined as string | undefined,
|
|
getNextPageParam: (lastPage: ChatConversationListResponse) =>
|
|
lastPage.hasMore ? lastPage.items.at(-1)?.updatedAt : undefined,
|
|
enabled: !!companyId,
|
|
placeholderData: (prev) => prev, // keepPreviousData equivalent -- prevents flicker (Pitfall 6)
|
|
});
|
|
|
|
const createMutation = useMutation({
|
|
mutationFn: (data?: { title?: string }) => chatApi.createConversation(companyId!, data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["chat", "conversations", companyId] });
|
|
},
|
|
});
|
|
|
|
const updateMutation = useMutation({
|
|
mutationFn: ({
|
|
id,
|
|
...data
|
|
}: {
|
|
id: string;
|
|
title?: string;
|
|
pinnedAt?: string | null;
|
|
archivedAt?: string | null;
|
|
}) => chatApi.updateConversation(id, data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["chat", "conversations", companyId] });
|
|
},
|
|
});
|
|
|
|
const deleteMutation = useMutation({
|
|
mutationFn: (id: string) => chatApi.deleteConversation(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["chat", "conversations", companyId] });
|
|
},
|
|
});
|
|
|
|
return { ...query, createMutation, updateMutation, deleteMutation };
|
|
}
|