feat: add bond pages and portfolio navigation

This commit is contained in:
2026-09-10 22:30:47 +03:00
parent 561222e468
commit 232d7f9990
39 changed files with 4217 additions and 221 deletions
+97
View File
@@ -0,0 +1,97 @@
import { apiQueryClient, useAuthenticatedQuery } from "@/shared/api";
type BondPeriod = "month" | "halfYear" | "year" | "all";
function useBondSearch(query: string) {
return useAuthenticatedQuery({
...apiQueryClient.queryOptions("get", "/api/v1/bonds", {
params: { query: { query } },
}),
enabled: query.length >= 2,
staleTime: 30_000,
});
}
function bondQueryOptions(uid: string) {
return {
...apiQueryClient.queryOptions("get", "/api/v1/bonds/{uid}", {
params: { path: { uid } },
}),
staleTime: 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,
);
const byUid = useAuthenticatedQuery({
...bondQueryOptions(identifier),
enabled: Boolean(identifier) && isUid,
});
const byTicker = useAuthenticatedQuery({
...apiQueryClient.queryOptions("get", "/api/v1/bonds/by-ticker/{ticker}", {
params: { path: { ticker: identifier } },
}),
enabled: Boolean(identifier) && !isUid,
staleTime: 30_000,
});
return isUid ? byUid : byTicker;
}
function useBondMetrics(uid: string) {
return useAuthenticatedQuery({
...apiQueryClient.queryOptions("get", "/api/v1/bonds/{uid}/metrics", {
params: { path: { uid } },
}),
enabled: Boolean(uid),
staleTime: 30_000,
});
}
function useBondQuote(uid: string) {
return useAuthenticatedQuery({
...apiQueryClient.queryOptions("get", "/api/v1/bonds/{uid}/quote", {
params: { path: { uid } },
}),
enabled: Boolean(uid),
staleTime: 30_000,
});
}
function useBondCandles(uid: string, period: BondPeriod) {
return useAuthenticatedQuery({
...apiQueryClient.queryOptions("get", "/api/v1/bonds/{uid}/candles", {
params: { path: { uid }, query: { period } },
}),
enabled: Boolean(uid),
staleTime: 30_000,
});
}
function useBondPosition(uid: string) {
return useAuthenticatedQuery({
...apiQueryClient.queryOptions("get", "/api/v1/bonds/{uid}/position", {
params: { path: { uid } },
}),
enabled: Boolean(uid),
staleTime: 30_000,
});
}
function useBondCoupons(uid: string) {
return useAuthenticatedQuery({
...apiQueryClient.queryOptions("get", "/api/v1/bonds/{uid}/coupons", {
params: { path: { uid } },
}),
enabled: Boolean(uid),
staleTime: 30_000,
});
}
export {
type BondPeriod,
useBond,
useBondCandles,
useBondCoupons,
useBondMetrics,
useBondPosition,
useBondQuote,
useBondSearch,
};