108 lines
2.8 KiB
TypeScript
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,
|
|
};
|