93 lines
2.7 KiB
TypeScript
93 lines
2.7 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
|
|
import { request } from './client'
|
|
import type { WorkTask } from '../types'
|
|
|
|
export function useTasks(includeSubTasks = true) {
|
|
return useQuery({
|
|
queryKey: ['tasks', { includeSubTasks }],
|
|
queryFn: () => request<WorkTask[]>({ url: '/tasks', params: { includeSubTasks } }),
|
|
})
|
|
}
|
|
|
|
export function useActiveTask() {
|
|
return useQuery({
|
|
queryKey: ['tasks', 'active'],
|
|
queryFn: () => request<WorkTask | null>({ url: '/tasks/active' }),
|
|
refetchInterval: 30_000,
|
|
})
|
|
}
|
|
|
|
export function useTask(id: number) {
|
|
return useQuery({
|
|
queryKey: ['tasks', id],
|
|
queryFn: () => request<WorkTask>({ url: `/tasks/${id}` }),
|
|
})
|
|
}
|
|
|
|
function useInvalidateTasks() {
|
|
const qc = useQueryClient()
|
|
return () => {
|
|
qc.invalidateQueries({ queryKey: ['tasks'] })
|
|
}
|
|
}
|
|
|
|
export function useCreateTask() {
|
|
const invalidate = useInvalidateTasks()
|
|
return useMutation({
|
|
mutationFn: (body: { title: string; description?: string; category?: string; parentTaskId?: number; estimatedMinutes?: number }) =>
|
|
request<WorkTask>({ method: 'POST', url: '/tasks', data: body }),
|
|
onSuccess: invalidate,
|
|
})
|
|
}
|
|
|
|
export function useUpdateTask() {
|
|
const invalidate = useInvalidateTasks()
|
|
return useMutation({
|
|
mutationFn: ({ id, ...body }: { id: number; title?: string; description?: string; category?: string; estimatedMinutes?: number }) =>
|
|
request<WorkTask>({ method: 'PUT', url: `/tasks/${id}`, data: body }),
|
|
onSuccess: invalidate,
|
|
})
|
|
}
|
|
|
|
export function useStartTask() {
|
|
const invalidate = useInvalidateTasks()
|
|
return useMutation({
|
|
mutationFn: (id: number) => request<WorkTask>({ method: 'PUT', url: `/tasks/${id}/start` }),
|
|
onSuccess: invalidate,
|
|
})
|
|
}
|
|
|
|
export function usePauseTask() {
|
|
const invalidate = useInvalidateTasks()
|
|
return useMutation({
|
|
mutationFn: ({ id, note }: { id: number; note?: string }) =>
|
|
request<WorkTask>({ method: 'PUT', url: `/tasks/${id}/pause`, data: { note } }),
|
|
onSuccess: invalidate,
|
|
})
|
|
}
|
|
|
|
export function useResumeTask() {
|
|
const invalidate = useInvalidateTasks()
|
|
return useMutation({
|
|
mutationFn: ({ id, note }: { id: number; note?: string }) =>
|
|
request<WorkTask>({ method: 'PUT', url: `/tasks/${id}/resume`, data: { note } }),
|
|
onSuccess: invalidate,
|
|
})
|
|
}
|
|
|
|
export function useCompleteTask() {
|
|
const invalidate = useInvalidateTasks()
|
|
return useMutation({
|
|
mutationFn: (id: number) => request<WorkTask>({ method: 'PUT', url: `/tasks/${id}/complete` }),
|
|
onSuccess: invalidate,
|
|
})
|
|
}
|
|
|
|
export function useAbandonTask() {
|
|
const invalidate = useInvalidateTasks()
|
|
return useMutation({
|
|
mutationFn: (id: number) => request<void>({ method: 'DELETE', url: `/tasks/${id}` }),
|
|
onSuccess: invalidate,
|
|
})
|
|
}
|