Files
frontend/src/entities/stock/api/queries.ts
T
2026-10-11 11:11:58 +03:00

108 lines
2.8 KiB
TypeScript

import {
apiQueryClient,
type paths,
useResourceQuery,
} from "@/shared/api";
type StockCandles = NonNullable<paths["/api/v1/stocks/{uid}/candles"]["get"]["responses"][200]["content"]["application/json"]["data"]>;
type StockDividends = NonNullable<paths["/api/v1/stocks/{uid}/dividends"]["get"]["responses"][200]["content"]["application/json"]["data"]>;
type StockPeriod = NonNullable<
NonNullable<
paths["/api/v1/stocks/{uid}/candles"]["get"]["parameters"]["query"]
>["period"]
>;
type StockPosition = NonNullable<paths["/api/v1/stocks/{uid}/position"]["get"]["responses"][200]["content"]["application/json"]["data"]>;
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,
};