life-manager/codebase/features/checklists/frontend/useChecklists.ts

117 lines
3.3 KiB
TypeScript

import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { apiClient } from '@/lib/api';
import type {
Checklist,
ChecklistItem,
CreateChecklistDto,
UpdateChecklistDto,
CreateChecklistItemDto,
UpdateChecklistItemDto,
} from '@life-platform/shared';
export function useChecklists(filters?: { domainId?: string; status?: string }) {
return useQuery({
queryKey: ['checklists', filters],
queryFn: () =>
apiClient
.get<Checklist[]>('/checklists', { params: filters })
.then((r) => r.data),
});
}
export function useChecklist(id: string) {
return useQuery({
queryKey: ['checklists', id],
queryFn: () => apiClient.get<Checklist>(`/checklists/${id}`).then((r) => r.data),
enabled: !!id,
});
}
export function useCreateChecklist() {
const qc = useQueryClient();
return useMutation({
mutationFn: (data: CreateChecklistDto) =>
apiClient.post<Checklist>('/checklists', data).then((r) => r.data),
onSuccess: () => {
qc.invalidateQueries({ queryKey: ['checklists'] });
},
});
}
export function useUpdateChecklist() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ id, data }: { id: string; data: UpdateChecklistDto }) =>
apiClient.patch<Checklist>(`/checklists/${id}`, data).then((r) => r.data),
onSuccess: () => {
qc.invalidateQueries({ queryKey: ['checklists'] });
},
});
}
export function useDeleteChecklist() {
const qc = useQueryClient();
return useMutation({
mutationFn: (id: string) =>
apiClient.delete(`/checklists/${id}`).then(() => undefined),
onSuccess: () => {
qc.invalidateQueries({ queryKey: ['checklists'] });
},
});
}
export function useAddChecklistItem() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ checklistId, data }: { checklistId: string; data: CreateChecklistItemDto }) =>
apiClient.post<ChecklistItem>(`/checklists/${checklistId}/items`, data).then((r) => r.data),
onSuccess: () => {
qc.invalidateQueries({ queryKey: ['checklists'] });
},
});
}
export function useUpdateChecklistItem() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({
checklistId,
itemId,
data,
}: {
checklistId: string;
itemId: string;
data: UpdateChecklistItemDto;
}) =>
apiClient
.patch<ChecklistItem>(`/checklists/${checklistId}/items/${itemId}`, data)
.then((r) => r.data),
onSuccess: () => {
qc.invalidateQueries({ queryKey: ['checklists'] });
},
});
}
export function useDeleteChecklistItem() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ checklistId, itemId }: { checklistId: string; itemId: string }) =>
apiClient.delete(`/checklists/${checklistId}/items/${itemId}`).then(() => undefined),
onSuccess: () => {
qc.invalidateQueries({ queryKey: ['checklists'] });
},
});
}
export function useToggleChecklistItem() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ checklistId, itemId }: { checklistId: string; itemId: string }) =>
apiClient
.post<ChecklistItem>(`/checklists/${checklistId}/items/${itemId}/toggle`)
.then((r) => r.data),
onSuccess: () => {
qc.invalidateQueries({ queryKey: ['checklists'] });
},
});
}