Uecko_ERP/modules/customers/src/web/_archived/hooks/use-customer-query.ts
2026-03-23 12:13:33 +01:00

56 lines
1.6 KiB
TypeScript

import { useDataSource } from "@erp/core/hooks";
import {
type DefaultError,
type QueryClient,
type QueryKey,
useQuery,
} from "@tanstack/react-query";
import type { Customer } from "../schemas";
export const CUSTOMER_DETAIL_SCOPE = "customers:detail" as const;
export const getCustomerQueryKey = (id: string) =>
[CUSTOMER_DETAIL_SCOPE, { id }] satisfies QueryKey;
type CustomerQueryOptions<TSelected> = {
enabled?: boolean;
staleTime?: number;
select?: (data: Customer) => TSelected;
placeholderData?: Customer;
};
export function useCustomerQuery<TSelected = Customer>(
customerId?: string,
options?: CustomerQueryOptions<TSelected>
) {
const dataSource = useDataSource();
const enabled = (options?.enabled ?? true) && Boolean(customerId);
return useQuery<Customer, DefaultError, TSelected>({
queryKey: getCustomerQueryKey(customerId ?? "unknown"),
queryFn: async (context) => {
const { signal } = context;
if (!customerId) {
if (!customerId) throw new Error("customerId is required");
}
return await dataSource.getOne<Customer>("customers", customerId, { signal });
},
enabled,
staleTime: options?.staleTime ?? 60_000, // 1 min por defecto
select: options?.select,
placeholderData: options?.placeholderData,
});
}
export function invalidateCustomerDetailCache(qc: QueryClient, id: string) {
return qc.invalidateQueries({
queryKey: getCustomerQueryKey(id ?? "unknown"),
exact: Boolean(id),
});
}
export function setCustomerDetailCache(qc: QueryClient, id: string, data: unknown) {
qc.setQueryData(getCustomerQueryKey(id), data);
}