feat: new cockpit
This commit is contained in:
@@ -96,6 +96,68 @@ export const useCalendar = () =>
|
||||
queryFn: () => api.get('/geo/calendar').then(r => r.data),
|
||||
})
|
||||
|
||||
// Real Forex Factory–backed calendar (used by CalendarPage.tsx and InstrumentModels)
|
||||
export interface FFEvent {
|
||||
event_date: string; event_time: string | null; currency: string
|
||||
impact: 'high' | 'medium' | 'low'; event_name: string
|
||||
actual_value: number | null; forecast_value: number | null; previous_value: number | null
|
||||
}
|
||||
export const useEcoCalendar = (params: { period?: string; limit?: number } = {}) =>
|
||||
useQuery<{ events: FFEvent[] }>({
|
||||
queryKey: ['eco-calendar', params],
|
||||
queryFn: () => api.get('/eco/calendar', { params: { period: 'recent', limit: 30, ...params } }).then(r => r.data),
|
||||
staleTime: 5 * 60_000,
|
||||
})
|
||||
|
||||
// ── Instruments Watchlist (Dashboard "radar" card) ────────────────────────────
|
||||
export interface WatchlistItem { ticker: string; name: string; asset_class: string; sort_order: number; added_at: string }
|
||||
export interface WatchlistQuoteItem extends WatchlistItem { price: number | null; change_pct: number | null }
|
||||
|
||||
export const useInstrumentsWatchlist = () =>
|
||||
useQuery<WatchlistItem[]>({
|
||||
queryKey: ['instruments-watchlist'],
|
||||
queryFn: () => api.get('/watchlist/').then(r => r.data),
|
||||
staleTime: 60_000,
|
||||
})
|
||||
|
||||
export const useInstrumentsWatchlistQuotes = () =>
|
||||
useQuery<{ items: WatchlistQuoteItem[] }>({
|
||||
queryKey: ['instruments-watchlist-quotes'],
|
||||
queryFn: () => api.get('/watchlist/quotes').then(r => r.data),
|
||||
refetchInterval: 60_000,
|
||||
staleTime: 30_000,
|
||||
})
|
||||
|
||||
export const useAddWatchlistInstrument = () => {
|
||||
const qc = useQueryClient()
|
||||
return useMutation({
|
||||
mutationFn: (ticker: string) => api.post(`/watchlist/${encodeURIComponent(ticker)}`).then(r => r.data),
|
||||
onSuccess: () => {
|
||||
qc.invalidateQueries({ queryKey: ['instruments-watchlist'] })
|
||||
qc.invalidateQueries({ queryKey: ['instruments-watchlist-quotes'] })
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export const useRemoveWatchlistInstrument = () => {
|
||||
const qc = useQueryClient()
|
||||
return useMutation({
|
||||
mutationFn: (ticker: string) => api.delete(`/watchlist/${encodeURIComponent(ticker)}`).then(r => r.data),
|
||||
onSuccess: () => {
|
||||
qc.invalidateQueries({ queryKey: ['instruments-watchlist'] })
|
||||
qc.invalidateQueries({ queryKey: ['instruments-watchlist-quotes'] })
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
// Latest cycle report — shares the 'cycle-report-latest' queryKey with RapportIA.tsx
|
||||
export const useLatestCycleReport = () =>
|
||||
useQuery({
|
||||
queryKey: ['cycle-report-latest'],
|
||||
queryFn: () => api.get('/reports/cycle/latest').then(r => r.data),
|
||||
staleTime: 60_000,
|
||||
})
|
||||
|
||||
// ── Options ───────────────────────────────────────────────────────────────────
|
||||
export const useIvSurface = (symbol: string) =>
|
||||
useQuery({
|
||||
|
||||
Reference in New Issue
Block a user