Spaces:
Running
Running
File size: 2,048 Bytes
5012205 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { type Chat } from '@/lib/db/schema';
import { toast } from 'sonner';
export function useChats(userId: string) {
const queryClient = useQueryClient();
// Main query to fetch chats
const {
data: chats = [],
isLoading,
error,
refetch
} = useQuery<Chat[]>({
queryKey: ['chats', userId],
queryFn: async () => {
if (!userId) return [];
const response = await fetch('/api/chats', {
headers: {
'x-user-id': userId
}
});
if (!response.ok) {
throw new Error('Failed to fetch chats');
}
return response.json();
},
enabled: !!userId, // Only run query if userId exists
staleTime: 1000 * 60 * 5, // Consider data fresh for 5 minutes
refetchOnWindowFocus: true, // Refetch when window regains focus
});
// Mutation to delete a chat
const deleteChat = useMutation({
mutationFn: async (chatId: string) => {
const response = await fetch(`/api/chats/${chatId}`, {
method: 'DELETE',
headers: {
'x-user-id': userId
}
});
if (!response.ok) {
throw new Error('Failed to delete chat');
}
return chatId;
},
onSuccess: (deletedChatId) => {
// Update cache by removing the deleted chat
queryClient.setQueryData<Chat[]>(['chats', userId], (oldChats = []) =>
oldChats.filter(chat => chat.id !== deletedChatId)
);
toast.success('Chat deleted');
},
onError: (error) => {
console.error('Error deleting chat:', error);
toast.error('Failed to delete chat');
}
});
// Function to invalidate chats cache for refresh
const refreshChats = () => {
queryClient.invalidateQueries({ queryKey: ['chats', userId] });
};
return {
chats,
isLoading,
error,
deleteChat: deleteChat.mutate,
isDeleting: deleteChat.isPending,
refreshChats,
refetch
};
} |