121 lines
3.2 KiB
TypeScript
121 lines
3.2 KiB
TypeScript
import { apiQueryClient, type paths, useResourceQuery } from "@/shared/api";
|
|
|
|
type BondCandles = NonNullable<paths["/api/v1/bonds/{uid}/candles"]["get"]["responses"][200]["content"]["application/json"]["data"]>;
|
|
|
|
type BondPosition = NonNullable<paths["/api/v1/bonds/{uid}/position"]["get"]["responses"][200]["content"]["application/json"]["data"]>;
|
|
|
|
const MIN_BOND_SEARCH_LENGTH = 2;
|
|
|
|
type BondCoupons = NonNullable<paths["/api/v1/bonds/{uid}/coupons"]["get"]["responses"][200]["content"]["application/json"]["data"]>;
|
|
|
|
type BondMetrics = NonNullable<paths["/api/v1/bonds/{uid}/metrics"]["get"]["responses"][200]["content"]["application/json"]["data"]>;
|
|
|
|
type BondPeriod = NonNullable<
|
|
NonNullable<
|
|
paths["/api/v1/bonds/{uid}/candles"]["get"]["parameters"]["query"]
|
|
>["period"]
|
|
>;
|
|
|
|
const BOND_STALE_TIME_MS = 30_000;
|
|
|
|
function useBond(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/bonds/{uid}" : "/api/v1/bonds/by-ticker/{ticker}",
|
|
init,
|
|
);
|
|
|
|
return useResourceQuery({
|
|
...options,
|
|
enabled: Boolean(identifier),
|
|
staleTime: BOND_STALE_TIME_MS,
|
|
});
|
|
}
|
|
|
|
function useBondCandles(uid: string, period: BondPeriod) {
|
|
return useResourceQuery({
|
|
...apiQueryClient.queryOptions("get", "/api/v1/bonds/{uid}/candles", {
|
|
params: { path: { uid }, query: { period } },
|
|
}),
|
|
enabled: Boolean(uid),
|
|
staleTime: BOND_STALE_TIME_MS,
|
|
});
|
|
}
|
|
|
|
function useBondCoupons(uid: string) {
|
|
return useResourceQuery({
|
|
meta: { accessGroup: "brokerage" },
|
|
...apiQueryClient.queryOptions("get", "/api/v1/bonds/{uid}/coupons", {
|
|
params: { path: { uid } },
|
|
}),
|
|
enabled: Boolean(uid),
|
|
staleTime: BOND_STALE_TIME_MS,
|
|
});
|
|
}
|
|
|
|
function useBondMetrics(uid: string) {
|
|
return useResourceQuery({
|
|
...apiQueryClient.queryOptions("get", "/api/v1/bonds/{uid}/metrics", {
|
|
params: { path: { uid } },
|
|
}),
|
|
enabled: Boolean(uid),
|
|
staleTime: BOND_STALE_TIME_MS,
|
|
});
|
|
}
|
|
|
|
function useBondPosition(uid: string) {
|
|
return useResourceQuery({
|
|
meta: { accessGroup: "brokerage" },
|
|
...apiQueryClient.queryOptions("get", "/api/v1/bonds/{uid}/position", {
|
|
params: { path: { uid } },
|
|
}),
|
|
enabled: Boolean(uid),
|
|
staleTime: BOND_STALE_TIME_MS,
|
|
});
|
|
}
|
|
|
|
function useBondQuote(uid: string) {
|
|
return useResourceQuery({
|
|
...apiQueryClient.queryOptions("get", "/api/v1/bonds/{uid}/quote", {
|
|
params: { path: { uid } },
|
|
}),
|
|
enabled: Boolean(uid),
|
|
staleTime: BOND_STALE_TIME_MS,
|
|
});
|
|
}
|
|
|
|
function useBondSearch(query: string) {
|
|
return useResourceQuery({
|
|
...apiQueryClient.queryOptions("get", "/api/v1/bonds", {
|
|
params: { query: { query } },
|
|
}),
|
|
enabled: query.length >= MIN_BOND_SEARCH_LENGTH,
|
|
staleTime: BOND_STALE_TIME_MS,
|
|
});
|
|
}
|
|
|
|
export {
|
|
type BondCandles,
|
|
type BondCoupons,
|
|
type BondMetrics,
|
|
type BondPosition,
|
|
MIN_BOND_SEARCH_LENGTH,
|
|
useBond,
|
|
useBondCandles,
|
|
useBondCoupons,
|
|
useBondMetrics,
|
|
useBondPosition,
|
|
useBondQuote,
|
|
useBondSearch,
|
|
};
|