feat: new cockpit

This commit is contained in:
OpenSquared
2026-07-14 11:21:43 +02:00
parent 9778c74ae3
commit ad07c8d886
32 changed files with 871 additions and 551 deletions

View File

@@ -96,6 +96,68 @@ export const useCalendar = () =>
queryFn: () => api.get('/geo/calendar').then(r => r.data),
})
// Real Forex Factorybacked 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({