import { useInfiniteQuery, useQuery, type InfiniteData, } from "@tanstack/react-query" import { getSectorRadarDates, getSectorRadarRankings, getStockSectorMembership } from "./sector-radar.api" import type { RadarRankingsQuery, RadarRankingsResponse, } from "./sector-radar.types" export const sectorRadarDatesQueryKey = ["sectorRadar", "dates"] as const export const stockSectorMembershipQueryKey = ( tsCode?: string, tradeDate?: string, ) => [ "sectorRadar", "stockMembership", tsCode ?? "none", tradeDate ?? "none", ] as const /** * Read one stock's point-in-time industries and concepts for a detail view. * * Disabled until both the stock code and target trade date are known; the * query stays cached per code-date pair so switching selections refetches * only unseen pairs. */ export function useStockSectorMembership(tsCode?: string, tradeDate?: string) { return useQuery({ enabled: Boolean(tsCode && tradeDate), queryFn: ({ signal }) => getStockSectorMembership(tsCode ?? "", tradeDate ?? "", signal), queryKey: stockSectorMembershipQueryKey(tsCode, tradeDate), staleTime: 5 * 60 * 1000, }) } 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, ReturnType, 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), }) }