From 1be08612f89d5d92a3531fb5c97d09f66c9de2a1 Mon Sep 17 00:00:00 2001 From: admin-valentin Date: Sat, 1 Aug 2026 20:25:40 +0000 Subject: [PATCH] fix(ceo-web): correct imports in MarketPage (session-provider + apiFetch pattern) --- src/app/dashboard/market/page.tsx | 258 ++++++++++++------------------ 1 file changed, 105 insertions(+), 153 deletions(-) diff --git a/src/app/dashboard/market/page.tsx b/src/app/dashboard/market/page.tsx index be625ff..3f38e2c 100644 --- a/src/app/dashboard/market/page.tsx +++ b/src/app/dashboard/market/page.tsx @@ -1,167 +1,119 @@ 'use client'; -import { useSession } from '../../../lib/session'; -import { apiFetch } from '../../../lib/api'; import { useQuery } from '@tanstack/react-query'; +import { apiFetch, type FinancialSignal } from '../../../lib/api'; +import { useSession } from '../../../components/session-provider'; -interface Signal { - id: string; - category: string; - region: string; - source: string; - title: string; - summary: string; - rawValue?: string; - changePercent?: string; - unit?: string; - severity: string; - publishedAt: string; -} - -const SEV_CLS: Record = { - critical: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300', - warning: 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-300', - info: 'bg-sky-100 text-sky-800 dark:bg-sky-900/30 dark:text-sky-300', +const SEVERITY_COLOR: Record = { + critical: 'bg-red-500/10 text-red-600 border-red-500/30', + high: 'bg-orange-500/10 text-orange-600 border-orange-500/30', + medium: 'bg-yellow-500/10 text-yellow-700 border-yellow-500/30', + low: 'bg-green-500/10 text-green-700 border-green-500/30', + info: 'bg-blue-500/10 text-blue-600 border-blue-500/30', }; -const CAT: Record = { - macro: 'Macro', fx: 'FX / Valute', rates: 'Dobânzi', - commodity: 'Mărfuri', news: 'Știri Economice', +const CATEGORY_LABEL: Record = { + macro: 'Macro', + fx: 'FX', + rates: 'Rate', + commodity: 'Commodity', + news: 'Știri', }; -const REGION: Record = { - ro: 'RO', de: 'DE', eu: 'EU', us: 'US', global: '—', -}; +export default function MarketPage() { + const { activeTenant } = useSession(); + const tenantId = activeTenant?.tenantId ?? null; -function fmt(v?: string, u?: string) { - if (!v) return null; - const n = parseFloat(v); - return isNaN(n) ? null : `${n.toLocaleString('ro-RO', { maximumFractionDigits: 2 })}${u ? ' ' + u : ''}`; -} - -function Chip({ v }: { v?: string }) { - if (!v) return null; - const n = parseFloat(v); - if (isNaN(n)) return null; - return ( - = 0 ? 'text-emerald-600 font-medium' : 'text-red-600 font-medium'}> - {n >= 0 ? '+' : ''}{n.toFixed(2)}% - - ); -} - -export default function MarketIntelligencePage() { - const { session } = useSession(); - const { data: signals = [], isLoading } = useQuery({ - queryKey: ['financial-signals'], - enabled: !!session, - staleTime: 5 * 60_000, - queryFn: () => - apiFetch('/v1/financial-intelligence/signals?limit=100', { - headers: { - Authorization: `Bearer ${session!.access_token}`, - 'x-tenant-id': session!.tenant_id, - }, - }), + const { data: signals = [], isLoading, error } = useQuery({ + queryKey: ['financial-signals', tenantId], + queryFn: () => apiFetch('/v1/financial-intelligence/signals?limit=100', { tenantId }), + enabled: true, + staleTime: 5 * 60 * 1000, }); - const cats = [...new Set(signals.map((s) => s.category))].sort(); - const byCategory = (cat: string) => signals.filter((s) => s.category === cat); + const byCategory = signals.reduce>((acc, s) => { + const cat = s.category ?? 'other'; + if (!acc[cat]) acc[cat] = []; + acc[cat].push(s); + return acc; + }, {}); - const critical = signals.filter((s) => s.severity === 'critical').length; - const warning = signals.filter((s) => s.severity === 'warning').length; - - return ( -
-
-
-

Market Intelligence

-

- Semnale economice live — World Bank · ECB · Eurostat · FRED -

-
-
- {critical > 0 && ( - - {critical} critice - - )} - {warning > 0 && ( - - {warning} atenționări - - )} - - {signals.length} total - -
-
- - {isLoading && ( -
-
- Se încarcă semnalele... -
- )} - - {!isLoading && signals.length === 0 && ( -
-

Fără semnale economice

-

- Importă workflow-ul n8n “08 Economic Data API” în n8n - (rulează la fiecare 6h și populează această pagină automat). -

-
-

Fișier: /root/ceo-os-economic-data-n8n.json

-

POST → /v1/financial-intelligence/ingest

-
-
- )} - - {cats.map((cat) => ( -
-

- {CAT[cat] ?? cat} -

-
- {byCategory(cat).map((s) => ( -
-
- {s.title} - - {s.severity} - -
- - {(s.rawValue || s.changePercent) && ( -
- {s.rawValue && ( - - {fmt(s.rawValue, s.unit)} - - )} - -
- )} - -

{s.summary}

- -
- {s.source} -
- {s.region !== 'global' && ( - - {REGION[s.region] ?? s.region} - - )} - {new Date(s.publishedAt).toLocaleDateString('ro-RO')} -
-
-
- ))} -
-
+ if (isLoading) return ( +
+ {[...Array(3)].map((_, i) => ( +
))}
); -} + + if (error) return ( +
+
+ Nu pot încărca semnalele de piață. +
+
+ ); + + if (signals.length === 0) return ( +
+

Market Intelligence

+
+

Nicio dată disponibilă

+

+ Activează workflow-ul 08 Economic Data API din n8n pentru a incepe + colectarea automată a datelor macro, FX și știri la fiecare 6h. +

+
    +
  1. Deschide n8n → căutați "08 Economic Data API"
  2. +
  3. Toggle ON → datele apar în ~1 minut
  4. +
+
+
+ ); + + return ( +
+
+
+

Market Intelligence

+

+ {signals.length} semnale · actualizat automat la 6h +

+
+
+ + {Object.entries(byCategory).map(([cat, items]) => ( +
+

+ {CATEGORY_LABEL[cat] ?? cat} +

+
+ {items.map((s) => ( +
+
+

{s.title}

+ + {s.severity} + +
+ {s.summary && ( +

{s.summary}

+ )} +
+ {s.rawValue != null && ( + + {Number(s.rawValue).toLocaleString('ro-RO', { maximumFractionDigits: 2 })} + {s.unit ? ` ${s.unit}` : ''} + {s.changePercent != null ? ` (${Number(s.changePercent) >= 0 ? '+' : ''}${Number(s.changePercent).toFixed(2)}%)` : ''} + + )} + {s.region} + {new Date(s.publishedAt).toLocaleDateString('ro-RO')} +
+
+ ))} +
+
+ ))} +
+ ); +} \ No newline at end of file