import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { issuesApi, Issue, CreateIssueDto, UpdateIssueDto } from '@/lib/api/issues'; import { toast } from 'sonner'; export function useIssues(projectId: string, status?: string) { return useQuery({ queryKey: ['issues', projectId, status], queryFn: () => issuesApi.list(projectId, status), enabled: !!projectId, }); } export function useIssue(projectId: string, issueId: string) { return useQuery({ queryKey: ['issue', projectId, issueId], queryFn: () => issuesApi.getById(projectId, issueId), enabled: !!projectId && !!issueId, }); } export function useCreateIssue(projectId: string) { const queryClient = useQueryClient(); return useMutation({ mutationFn: (data: CreateIssueDto) => issuesApi.create(projectId, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['issues', projectId] }); toast.success('Issue created successfully'); }, onError: () => { toast.error('Failed to create issue'); }, }); } export function useUpdateIssue(projectId: string, issueId: string) { const queryClient = useQueryClient(); return useMutation({ mutationFn: (data: UpdateIssueDto) => issuesApi.update(projectId, issueId, data), onSuccess: (updatedIssue) => { queryClient.setQueryData(['issue', projectId, issueId], updatedIssue); queryClient.invalidateQueries({ queryKey: ['issues', projectId] }); toast.success('Issue updated successfully'); }, onError: () => { toast.error('Failed to update issue'); }, }); } export function useChangeIssueStatus(projectId: string) { const queryClient = useQueryClient(); return useMutation({ mutationFn: ({ issueId, status }: { issueId: string; status: string }) => issuesApi.changeStatus(projectId, issueId, status), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['issues', projectId] }); }, onError: () => { toast.error('Failed to change issue status'); }, }); } export function useAssignIssue(projectId: string) { const queryClient = useQueryClient(); return useMutation({ mutationFn: ({ issueId, assigneeId, }: { issueId: string; assigneeId: string | null; }) => issuesApi.assign(projectId, issueId, assigneeId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['issues', projectId] }); toast.success('Issue assigned successfully'); }, onError: () => { toast.error('Failed to assign issue'); }, }); } export function useDeleteIssue(projectId: string) { const queryClient = useQueryClient(); return useMutation({ mutationFn: (issueId: string) => issuesApi.delete(projectId, issueId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['issues', projectId] }); toast.success('Issue deleted successfully'); }, onError: () => { toast.error('Failed to delete issue'); }, }); }