- Add typed API response types and fetch client (responses.ts + client.ts) - Add useSearch hook with TanStack Query - Add Layout with header and search bar - Add SearchBar with debounced search and dropdown - Implement HomePage, StockPage, BondPage with data loading
125 lines
2.3 KiB
TypeScript
125 lines
2.3 KiB
TypeScript
export interface ApiResponseMeta {
|
|
cachedAt: string | null;
|
|
fromCache: boolean;
|
|
}
|
|
|
|
export interface ApiEnvelope<T> {
|
|
data: T;
|
|
meta: ApiResponseMeta;
|
|
}
|
|
|
|
export interface StockMarketData {
|
|
price: number;
|
|
change: number;
|
|
changePercent: number;
|
|
open: number;
|
|
high: number | null;
|
|
low: number | null;
|
|
volume: number;
|
|
value: number;
|
|
issueCapitalization: number | null;
|
|
updatedAt: string;
|
|
}
|
|
|
|
export interface ShareResponse {
|
|
secid: string;
|
|
isin: string;
|
|
name: string;
|
|
shortName: string;
|
|
latName: string | null;
|
|
listLevel: number;
|
|
issueSize: number;
|
|
faceValue: number;
|
|
faceUnit: string;
|
|
type: string;
|
|
marketData: StockMarketData;
|
|
}
|
|
|
|
export interface DividendItem {
|
|
registryCloseDate: string;
|
|
value: number;
|
|
currency: string;
|
|
}
|
|
|
|
export interface ShareHistoryItem {
|
|
date: string;
|
|
open: number;
|
|
high: number;
|
|
low: number;
|
|
close: number;
|
|
volume: number;
|
|
value: number;
|
|
}
|
|
|
|
export interface BondMarketData {
|
|
price: number;
|
|
yieldToMaturity: number | null;
|
|
duration: number | null;
|
|
accruedInt: number;
|
|
couponValue: number;
|
|
couponPercent: number | null;
|
|
nextCouponDate: string | null;
|
|
open: number;
|
|
high: number | null;
|
|
low: number | null;
|
|
volume: number;
|
|
updatedAt: string;
|
|
}
|
|
|
|
export interface BondResponse {
|
|
secid: string;
|
|
isin: string;
|
|
name: string;
|
|
shortName: string;
|
|
latName: string | null;
|
|
listLevel: number;
|
|
issueSize: number;
|
|
faceValue: number;
|
|
faceUnit: string;
|
|
matDate: string;
|
|
couponValue: number;
|
|
couponPercent: number | null;
|
|
couponPeriod: number;
|
|
nextCoupon: string | null;
|
|
accruedInt: number;
|
|
bondType: string;
|
|
bondSubType: string;
|
|
offerDate: string | null;
|
|
buybackDate: string | null;
|
|
marketData: BondMarketData;
|
|
}
|
|
|
|
export interface BondHistoryItem {
|
|
date: string;
|
|
closePrice: number;
|
|
yieldClose: number | null;
|
|
duration: number | null;
|
|
}
|
|
|
|
export interface CandleItem {
|
|
open: number;
|
|
high: number;
|
|
low: number;
|
|
close: number;
|
|
volume: number;
|
|
value: number;
|
|
begin: string;
|
|
end: string;
|
|
}
|
|
|
|
export interface SearchResultItem {
|
|
secid: string;
|
|
isin: string;
|
|
shortName: string;
|
|
type: 'share' | 'bond';
|
|
listLevel: number;
|
|
currency: string | null;
|
|
price: number | null;
|
|
}
|
|
|
|
export interface HealthResponse {
|
|
status: string;
|
|
timestamp: string;
|
|
uptime: number;
|
|
}
|