Vitron-Front/app/requestHandler/use-collection-hooks.tsx
2026-04-29 01:44:16 +03:30

89 lines
2.6 KiB
TypeScript

import { useInfiniteQuery, useQuery } from "@tanstack/react-query";
import { useCallback } from "react";
import { CollectionCursorPage } from "../../src/api/types/models";
import {
createCollectionsPublicApi,
createCollectionsApi,
} from "../utils/api-client-factory";
/**
* Custom hook for infinite collections loading using cursor-based pagination
*/
export const useCollectionsInfiniteQuery = (params?: {
q?: string;
sellerId?: string;
category?: string;
trending?: number;
pageSize?: number;
}) => {
const collectionsApi = createCollectionsPublicApi();
// Function to get next page URL from previous result
const getNextPageParam = useCallback((lastPage: CollectionCursorPage) => {
return lastPage.next || undefined;
}, []);
return useInfiniteQuery({
queryKey: ["collections", params],
queryFn: async ({ pageParam }) => {
// If pageParam is a full URL, extract the cursor
let cursor: string | undefined = undefined;
if (typeof pageParam === "string" && pageParam.includes("cursor=")) {
const url = new URL(pageParam);
const cursorParam = url.searchParams.get("cursor");
if (cursorParam) cursor = cursorParam;
} else if (typeof pageParam === "string") {
cursor = pageParam;
}
// Call the API with the cursor if available
return await collectionsApi.apiCollectionV1CollectionsList({
cursor: cursor,
q: params?.q,
sellerId: params?.sellerId,
category: params?.category,
trending: params?.trending,
pageSize: params?.pageSize || 20,
});
},
getNextPageParam,
initialPageParam: undefined,
});
};
/**
* Custom hook for getting collection detail with products
*/
export const useCollectionDetail = (collectionId: string) => {
const collectionsApi = createCollectionsPublicApi();
return useQuery({
queryKey: ["collection", collectionId],
queryFn: async () => {
return await collectionsApi.apiCollectionV1CollectionsRead({
id: collectionId,
pageSize: 50, // Get first 50 products
});
},
enabled: !!collectionId,
});
};
/**
* Custom hook for getting similar collections (cursor-based pagination)
*/
export const useSimilarCollections = (collectionId: string) => {
const collectionsApi = createCollectionsApi();
return useQuery({
queryKey: ["similarCollections", collectionId],
queryFn: async () => {
return await collectionsApi.apiCollectionV1CollectionsSimilarList({
collectionId: collectionId,
pageSize: 10,
});
},
enabled: !!collectionId,
});
};