import { apiQueryClient, type paths, useResourceQuery, } from "@/shared/api"; type StockCandles = NonNullable; type StockDividends = NonNullable; type StockPeriod = NonNullable< NonNullable< paths["/api/v1/stocks/{uid}/candles"]["get"]["parameters"]["query"] >["period"] >; type StockPosition = NonNullable; const STOCK_STALE_TIME_MS = 30_000; function useStock(identifier: string) { const isUid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test( identifier, ); // eslint-disable-next-line unicorn/prefer-minimal-ternary -- Hoisting params breaks the generated union of endpoint request shapes. const init = isUid ? { params: { path: { uid: identifier } } } : { params: { path: { ticker: identifier } } }; const options = apiQueryClient.queryOptions( "get", isUid ? "/api/v1/stocks/{uid}" : "/api/v1/stocks/by-ticker/{ticker}", init, ); return useResourceQuery({ ...options, enabled: Boolean(identifier), staleTime: STOCK_STALE_TIME_MS, }); } function useStockCandles(uid: string, period: StockPeriod) { return useResourceQuery({ ...apiQueryClient.queryOptions("get", "/api/v1/stocks/{uid}/candles", { params: { path: { uid }, query: { period } }, }), enabled: Boolean(uid), staleTime: STOCK_STALE_TIME_MS, }); } function useStockCompany(uid: string) { return useResourceQuery({ ...apiQueryClient.queryOptions("get", "/api/v1/stocks/{uid}/company", { params: { path: { uid } }, }), enabled: Boolean(uid), staleTime: STOCK_STALE_TIME_MS, }); } function useStockDividends(uid: string) { return useResourceQuery({ meta: { accessGroup: "brokerage" }, ...apiQueryClient.queryOptions("get", "/api/v1/stocks/{uid}/dividends", { params: { path: { uid } }, }), enabled: Boolean(uid), staleTime: STOCK_STALE_TIME_MS, }); } function useStockPosition(uid: string) { return useResourceQuery({ meta: { accessGroup: "brokerage" }, ...apiQueryClient.queryOptions("get", "/api/v1/stocks/{uid}/position", { params: { path: { uid } }, }), enabled: Boolean(uid), staleTime: STOCK_STALE_TIME_MS, }); } function useStockQuote(uid: string) { return useResourceQuery({ ...apiQueryClient.queryOptions("get", "/api/v1/stocks/{uid}/quote", { params: { path: { uid } }, }), enabled: Boolean(uid), staleTime: STOCK_STALE_TIME_MS, }); } export { type StockCandles, type StockDividends, type StockPosition, useStock, useStockCandles, useStockCompany, useStockDividends, useStockPosition, useStockQuote, };