Files
Horux360/apps/web/lib/hooks/use-cfdi.ts
Consultoria AS 08a7312761 perf(cfdi): optimize page performance
Database optimizations:
- Add indexes on fecha_emision, tipo, estado, rfc_emisor, rfc_receptor
- Add trigram indexes for fast ILIKE searches on nombre fields
- Combine COUNT with main query using window function (1 query instead of 2)

Frontend optimizations:
- Add 300ms debounce to autocomplete searches
- Add staleTime (30s) and gcTime (5min) to useCfdis hook
- Reduce unnecessary API calls on every keystroke

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-17 07:15:33 +00:00

68 lines
2.0 KiB
TypeScript

import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import * as cfdiApi from '@/lib/api/cfdi';
import type { CfdiFilters } from '@horux/shared';
import type { CreateCfdiData } from '@/lib/api/cfdi';
export function useCfdis(filters: CfdiFilters) {
return useQuery({
queryKey: ['cfdis', filters],
queryFn: () => cfdiApi.getCfdis(filters),
staleTime: 30 * 1000, // 30 segundos
gcTime: 5 * 60 * 1000, // 5 minutos en cache
});
}
export function useCfdi(id: string) {
return useQuery({
queryKey: ['cfdi', id],
queryFn: () => cfdiApi.getCfdiById(id),
enabled: !!id,
});
}
export function useResumenCfdi(año?: number, mes?: number) {
return useQuery({
queryKey: ['cfdi-resumen', año, mes],
queryFn: () => cfdiApi.getResumenCfdi(año, mes),
});
}
export function useCreateCfdi() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: CreateCfdiData) => cfdiApi.createCfdi(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['cfdis'] });
queryClient.invalidateQueries({ queryKey: ['cfdi-resumen'] });
queryClient.invalidateQueries({ queryKey: ['dashboard'] });
},
});
}
export function useCreateManyCfdis() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (cfdis: CreateCfdiData[]) => cfdiApi.createManyCfdis(cfdis),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['cfdis'] });
queryClient.invalidateQueries({ queryKey: ['cfdi-resumen'] });
queryClient.invalidateQueries({ queryKey: ['dashboard'] });
},
});
}
export function useDeleteCfdi() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: string) => cfdiApi.deleteCfdi(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['cfdis'] });
queryClient.invalidateQueries({ queryKey: ['cfdi-resumen'] });
queryClient.invalidateQueries({ queryKey: ['dashboard'] });
},
});
}