- Replace hand-coded skeleton CSS/JSX with boneyard-js auto-generated bones - Remove skeleton.css and @keyframes shimmer from base.css - Add <Skeleton> wrappers with fixtures to all 25+ page components - Generate 20 bone captures via boneyard CLI (CDP auth-gated capture) - Refactor data fetching from useEffect+useState to TanStack Query - Extract query hooks into src/admin/lib/queries/ and apiAdapter - Add usePaginatedQuery hook replacing useApiCall/useListData - Fix parseFloat || 0 anti-pattern in OfferDetail and OffersTemplates inputs - Fix customer_id mandatory validation on offer creation - Fix leave-requests comma-separated status filter (Prisma enum in: []) - Add cross-entity cache invalidation for orders/offers/invoices/projects - Make rate limits configurable via env vars (RATE_LIMIT_MAX, RATE_LIMIT_REFRESH, etc.) - Add boneyard.config.json with routes and breakpoints Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
45 lines
1.1 KiB
TypeScript
45 lines
1.1 KiB
TypeScript
import {
|
|
useQuery,
|
|
keepPreviousData,
|
|
useQueryClient,
|
|
} from "@tanstack/react-query";
|
|
import type { UseQueryOptions } from "@tanstack/react-query";
|
|
|
|
interface PaginatedResult<T> {
|
|
data: T[];
|
|
pagination: {
|
|
total: number;
|
|
page: number;
|
|
per_page: number;
|
|
total_pages: number;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Wrapper around useQuery for paginated list endpoints.
|
|
* Accepts the return value of queryOptions() from lib/queries/*
|
|
* and extracts items + pagination from the response.
|
|
*/
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
export function usePaginatedQuery<T>(options: any) {
|
|
const query = useQuery({
|
|
...options,
|
|
placeholderData: keepPreviousData,
|
|
} as UseQueryOptions<PaginatedResult<T>>);
|
|
|
|
const data = query.data as PaginatedResult<T> | undefined;
|
|
|
|
return {
|
|
items: (data?.data ?? []) as T[],
|
|
pagination: data?.pagination ?? null,
|
|
isPending: query.isPending,
|
|
isFetching: query.isFetching,
|
|
isPlaceholderData: query.isPlaceholderData,
|
|
isError: query.isError,
|
|
error: query.error,
|
|
refetch: query.refetch,
|
|
};
|
|
}
|
|
|
|
export { useQueryClient, useQuery, keepPreviousData };
|