test_task_crm/frontend/src/features/contacts/hooks.ts

52 lines
1.5 KiB
TypeScript

import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import { createContact, deleteContact, listContacts, updateContact } from '@/features/contacts/api'
import type { ContactFilters, ContactUpdatePayload } from '@/features/contacts/api'
export const contactsQueryKey = ['contacts'] as const
const serializeFilters = (filters?: ContactFilters) => ({
page: filters?.page ?? 1,
pageSize: filters?.pageSize,
search: filters?.search ?? '',
ownerId: filters?.ownerId ?? null,
})
export const useContactsQuery = (filters?: ContactFilters) =>
useQuery({
queryKey: [...contactsQueryKey, serializeFilters(filters)],
queryFn: () => listContacts(filters),
})
export const useInvalidateContacts = () => {
const queryClient = useQueryClient()
return () => queryClient.invalidateQueries({ queryKey: contactsQueryKey })
}
export const useCreateContactMutation = () => {
const invalidate = useInvalidateContacts()
return useMutation({
mutationFn: createContact,
onSuccess: () => invalidate(),
})
}
export const useUpdateContactMutation = () => {
const invalidate = useInvalidateContacts()
return useMutation({
mutationFn: ({ contactId, payload }: { contactId: number; payload: ContactUpdatePayload }) =>
updateContact(contactId, payload),
onSuccess: () => {
invalidate()
},
})
}
export const useDeleteContactMutation = () => {
const invalidate = useInvalidateContacts()
return useMutation({
mutationFn: (contactId: number) => deleteContact(contactId),
onSuccess: () => invalidate(),
})
}