52 lines
1.5 KiB
TypeScript
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(),
|
|
})
|
|
}
|