Files
zhixing-system/zhixing-web/src/features/sector-radar/api/sector-radar.query.ts
T

67 lines
1.7 KiB
TypeScript
Raw Normal View History

import {
useInfiniteQuery,
useQuery,
type InfiniteData,
} from "@tanstack/react-query"
import { getSectorRadarDates, getSectorRadarRankings } from "./sector-radar.api"
import type {
RadarRankingsQuery,
RadarRankingsResponse,
} from "./sector-radar.types"
export const sectorRadarDatesQueryKey = ["sectorRadar", "dates"] as const
export const sectorRadarRankingsQueryKey = (query: RadarRankingsQuery) =>
[
"sectorRadar",
"rankings",
query.tradeDate ?? "latest",
query.sectorType,
query.view,
query.rankChangeMetric,
query.rankChangeDays,
query.side,
query.search ?? "",
query.pageSize,
] as const
export function useSectorRadarDates() {
return useQuery({
queryFn: ({ signal }) => getSectorRadarDates(signal),
queryKey: sectorRadarDatesQueryKey,
})
}
export function useSectorRadarRankings(query: RadarRankingsQuery) {
return useInfiniteQuery<
RadarRankingsResponse,
Error,
InfiniteData<RadarRankingsResponse>,
ReturnType<typeof sectorRadarRankingsQueryKey>,
number
>({
getNextPageParam: (lastPage, pages, lastPageParam) => {
const loadedRowCount = pages.reduce(
(count, page) => count + page.rows.length,
0,
)
if (
lastPage.status !== "success" ||
lastPage.rows.length === 0 ||
lastPage.page !== lastPageParam ||
loadedRowCount >= lastPage.total
) {
return undefined
}
const nextPageParam = lastPageParam + 1
return Number.isSafeInteger(nextPageParam) ? nextPageParam : undefined
},
initialPageParam: 1,
queryFn: ({ pageParam, signal }) =>
getSectorRadarRankings({ ...query, page: pageParam }, signal),
queryKey: sectorRadarRankingsQueryKey(query),
})
}