2026-09-01 11:16:18 +08:00
|
|
|
import {
|
|
|
|
|
useInfiniteQuery,
|
|
|
|
|
useQuery,
|
|
|
|
|
type InfiniteData,
|
|
|
|
|
} from "@tanstack/react-query"
|
2026-08-29 20:14:42 +08:00
|
|
|
|
|
|
|
|
import { getSectorRadarDates, getSectorRadarRankings } from "./sector-radar.api"
|
2026-09-01 11:16:18 +08:00
|
|
|
import type {
|
|
|
|
|
RadarRankingsQuery,
|
|
|
|
|
RadarRankingsResponse,
|
|
|
|
|
} from "./sector-radar.types"
|
2026-08-29 20:14:42 +08:00
|
|
|
|
|
|
|
|
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) {
|
2026-09-01 11:16:18 +08:00
|
|
|
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),
|
2026-08-29 20:14:42 +08:00
|
|
|
queryKey: sectorRadarRankingsQueryKey(query),
|
|
|
|
|
})
|
|
|
|
|
}
|