import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { ClientDetailSchema, ClientListResponseSchema, ClientNovoResultSchema, ContatoResultSchema, ContatoSchema, type ClientDetail, type ClientListQuery, type ClientListResponse, type ClientNovoResult, type Contato, type ContatoResult, type CreateClientNovo, type CreateContato, } from '@sar/api-interface'; import { z } from 'zod'; import { apiFetch } from '../api-client'; export const CLIENT_KEYS = { all: ['clients'] as const, list: (params: Partial) => ['clients', 'list', params] as const, detail: (id: number) => ['clients', 'detail', id] as const, }; export function useClientList(params: Partial = {}) { const qs = new URLSearchParams(); if (params.q) qs.set('q', params.q); if (params.status) qs.set('status', params.status); if (params.page) qs.set('page', String(params.page)); if (params.limit) qs.set('limit', String(params.limit)); const query = qs.toString(); return useQuery({ queryKey: CLIENT_KEYS.list(params), queryFn: async () => { const res = await apiFetch(`/clients${query ? `?${query}` : ''}`); return ClientListResponseSchema.parse(res); }, }); } export function useClientDetail(id: number | string | undefined) { return useQuery({ queryKey: CLIENT_KEYS.detail(Number(id)), queryFn: async () => { const res = await apiFetch(`/clients/${id}`); return ClientDetailSchema.parse(res); }, enabled: !!id, }); } export function useClientContacts(idCliente: number | undefined) { return useQuery({ queryKey: ['clients', 'contacts', idCliente], queryFn: async () => { const res = await apiFetch(`/clients/${idCliente}/contacts`); return z.array(ContatoSchema).parse(res); }, enabled: !!idCliente, }); } export function useCreateContato(idCliente: number | undefined) { const queryClient = useQueryClient(); return useMutation({ mutationFn: async (data) => { const res = await apiFetch(`/clients/${idCliente}/contacts`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); return ContatoResultSchema.parse(res); }, onSuccess: () => { void queryClient.invalidateQueries({ queryKey: ['clients', 'contacts', idCliente] }); }, }); } export function useCreateClientNovo() { const queryClient = useQueryClient(); return useMutation({ mutationFn: async (data) => { const res = await apiFetch('/clients/novo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); return ClientNovoResultSchema.parse(res); }, onSuccess: () => { void queryClient.invalidateQueries({ queryKey: CLIENT_KEYS.all }); }, }); }