import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { projectsApi } from '@/lib/api/projects'; import type { Project, CreateProjectDto, UpdateProjectDto } from '@/types/project'; export function useProjects(page = 1, pageSize = 20) { return useQuery({ queryKey: ['projects', page, pageSize], queryFn: async () => { console.log('[useProjects] Fetching projects...', { page, pageSize }); try { const result = await projectsApi.getAll(page, pageSize); console.log('[useProjects] Fetch successful:', result); return result; } catch (error) { console.error('[useProjects] Fetch failed:', error); throw error; } }, staleTime: 5 * 60 * 1000, // 5 minutes retry: 1, // Only retry once to fail faster }); } export function useProject(id: string) { return useQuery({ queryKey: ['projects', id], queryFn: () => projectsApi.getById(id), enabled: !!id, }); } export function useCreateProject() { const queryClient = useQueryClient(); return useMutation({ mutationFn: (data: CreateProjectDto) => projectsApi.create(data), onSuccess: (newProject) => { // Invalidate and refetch projects list queryClient.invalidateQueries({ queryKey: ['projects'] }); // Optimistically update cache queryClient.setQueryData(['projects'], (old) => old ? [...old, newProject] : [newProject] ); }, }); } export function useUpdateProject(id: string) { const queryClient = useQueryClient(); return useMutation({ mutationFn: (data: UpdateProjectDto) => projectsApi.update(id, data), onMutate: async (updatedData) => { // Optimistic update await queryClient.cancelQueries({ queryKey: ['projects', id] }); const previousProject = queryClient.getQueryData(['projects', id]); queryClient.setQueryData(['projects', id], (old) => ({ ...old!, ...updatedData, })); return { previousProject }; }, onError: (err, variables, context) => { // Rollback on error if (context?.previousProject) { queryClient.setQueryData(['projects', id], context.previousProject); } }, onSettled: () => { queryClient.invalidateQueries({ queryKey: ['projects', id] }); queryClient.invalidateQueries({ queryKey: ['projects'] }); }, }); } export function useDeleteProject() { const queryClient = useQueryClient(); return useMutation({ mutationFn: (id: string) => projectsApi.delete(id), onSuccess: (_, id) => { queryClient.invalidateQueries({ queryKey: ['projects'] }); queryClient.removeQueries({ queryKey: ['projects', id] }); }, }); }