93 lines
2.8 KiB
TypeScript
93 lines
2.8 KiB
TypeScript
import {
|
|
useMutation,
|
|
useQuery,
|
|
useQueryClient,
|
|
useInfiniteQuery,
|
|
} from "@tanstack/react-query";
|
|
import { useAuthToken } from "../hooks/use-root-data";
|
|
import { createBookmarkApi } from "~/utils/api-client-factory";
|
|
|
|
export function useServiceBookmarkProduct() {
|
|
const token = useAuthToken();
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: async (productId: string) => {
|
|
const bookmarkApi = createBookmarkApi(token);
|
|
return await bookmarkApi.apiEngagementV1BookmarksCreate({
|
|
data: { productId },
|
|
});
|
|
},
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["getUserBookmarksService"] });
|
|
queryClient.invalidateQueries({ queryKey: ["checkBookmarkService"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useServiceDeleteBookmark() {
|
|
const token = useAuthToken();
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: async (productId: string) => {
|
|
const bookmarkApi = createBookmarkApi(token);
|
|
await bookmarkApi.apiEngagementV1BookmarksDelete({ productId });
|
|
return { success: true };
|
|
},
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["getUserBookmarksService"] });
|
|
queryClient.invalidateQueries({ queryKey: ["checkBookmarkService"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useServiceCheckBookmark(productId: string) {
|
|
const token = useAuthToken();
|
|
const response = useQuery({
|
|
retry: 1,
|
|
retryDelay: 3000,
|
|
refetchOnWindowFocus: false,
|
|
queryKey: ["checkBookmarkService", productId],
|
|
queryFn: async () => {
|
|
const bookmarkApi = createBookmarkApi(token);
|
|
return await bookmarkApi.apiEngagementV1BookmarksCheckRead({ productId });
|
|
},
|
|
enabled: !!token && !!productId,
|
|
});
|
|
|
|
return { ...response };
|
|
}
|
|
|
|
export function useServiceGetUserBookmarks() {
|
|
const token = useAuthToken();
|
|
const response = useInfiniteQuery({
|
|
queryKey: ["getUserBookmarksService"],
|
|
queryFn: async ({ pageParam = 1 }) => {
|
|
const bookmarkApi = createBookmarkApi(token);
|
|
const bookmarks = await bookmarkApi.apiEngagementV1BookmarksListList({
|
|
page: pageParam,
|
|
pageSize: 12,
|
|
});
|
|
|
|
// Since the API returns an array instead of a paginated response object,
|
|
// we'll construct a pagination-compatible response
|
|
return {
|
|
results: bookmarks.results,
|
|
next: bookmarks.next,
|
|
previous: bookmarks.previous,
|
|
};
|
|
},
|
|
initialPageParam: 1,
|
|
getNextPageParam: (lastPage) => {
|
|
if (lastPage.next) {
|
|
const url = new URL(lastPage.next, import.meta.env.VITE_API_BASE_URL);
|
|
const page = url.searchParams.get("page");
|
|
return page ? parseInt(page) : undefined;
|
|
}
|
|
return undefined;
|
|
},
|
|
enabled: !!token,
|
|
});
|
|
|
|
return { ...response };
|
|
}
|