Closes #023-warn - Implement PEAD fallback transparency warning badge
This commit is contained in:
@@ -40,6 +40,7 @@ interface PEADData {
|
||||
epsConsensus: number;
|
||||
surprisePercent: number;
|
||||
driftStatus: 'Active Drift' | 'Consolidating';
|
||||
isLiveApi?: boolean;
|
||||
}
|
||||
|
||||
export default function ScannerDemo() {
|
||||
@@ -71,6 +72,7 @@ export default function ScannerDemo() {
|
||||
{ ticker: 'TSLA', name: 'Tesla Inc.', peadSector: 'Consumer Goods', announcementDate: '2026-04-23', daysElapsed: 52, epsActual: 0.45, epsConsensus: 0.51, surprisePercent: -11.76, driftStatus: 'Consolidating' },
|
||||
{ ticker: 'JPM', name: 'JPMorgan Chase & Co.', peadSector: 'Financial Services', announcementDate: '2026-04-12', daysElapsed: 63, epsActual: 4.44, epsConsensus: 4.15, surprisePercent: 6.99, driftStatus: 'Consolidating' }
|
||||
]);
|
||||
const [isLivePeadApi, setIsLivePeadApi] = useState(false);
|
||||
|
||||
// Cache for metadata and prices retrieved dynamically
|
||||
const [alertsMetadata, setAlertsMetadata] = useState<Record<string, { name: string; whyDropped: string; sentiment: 'GREEN' | 'YELLOW' | 'RED' }>>({});
|
||||
@@ -193,12 +195,16 @@ export default function ScannerDemo() {
|
||||
epsActual: r.epsActual || 0,
|
||||
epsConsensus: r.epsConsensus || 0,
|
||||
surprisePercent: r.surprisePercent || 0,
|
||||
driftStatus: r.driftStatus || 'Consolidating'
|
||||
driftStatus: r.driftStatus || 'Consolidating',
|
||||
isLiveApi: r.isLiveApi
|
||||
});
|
||||
});
|
||||
peadList.sort((a, b) => Math.abs(b.surprisePercent) - Math.abs(a.surprisePercent));
|
||||
setPeadData(peadList);
|
||||
|
||||
const hasLivePead = peadList.some(item => item.isLiveApi === true);
|
||||
setIsLivePeadApi(hasLivePead);
|
||||
|
||||
// Update global store alerts for Sandbox module use
|
||||
updateScannerAlerts(newAlerts);
|
||||
|
||||
@@ -766,12 +772,27 @@ export default function ScannerDemo() {
|
||||
>
|
||||
<Sparkles className="text-amber-400 w-4 h-4 animate-pulse" /> 3-Tier Screener Capacity Grid
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setLeftPanelTab('pead')}
|
||||
className={`text-sm font-bold flex items-center gap-2 pb-1 transition-all cursor-pointer ${leftPanelTab === 'pead' ? 'text-white border-b-2 border-amber-500' : 'text-slate-400 hover:text-slate-200'}`}
|
||||
>
|
||||
<TrendingUp className="text-amber-400 w-4 h-4" /> 🚀 PEAD Drift Radar
|
||||
</button>
|
||||
<div className="flex items-center gap-2">
|
||||
<button
|
||||
onClick={() => setLeftPanelTab('pead')}
|
||||
className={`text-sm font-bold flex items-center gap-2 pb-1 transition-all cursor-pointer ${leftPanelTab === 'pead' ? 'text-white border-b-2 border-amber-500' : 'text-slate-400 hover:text-slate-200'}`}
|
||||
>
|
||||
<TrendingUp className="text-amber-400 w-4 h-4" /> 🚀 PEAD Drift Radar
|
||||
</button>
|
||||
{leftPanelTab === 'pead' && (
|
||||
isLivePeadApi ? (
|
||||
<span className="inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[9px] font-bold bg-emerald-500/10 text-emerald-400 border border-emerald-500/20 shadow-[0_0_10px_rgba(16,185,129,0.15)]">
|
||||
<span className="w-1 h-1 rounded-full bg-emerald-500 animate-ping" />
|
||||
🟢 LIVE EPS FEED
|
||||
</span>
|
||||
) : (
|
||||
<span className="inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[9px] font-bold bg-amber-500/10 text-amber-400 border border-amber-500/20 shadow-[0_0_10px_rgba(245,158,11,0.15)]">
|
||||
<span className="w-1 h-1 rounded-full bg-amber-500 animate-pulse" />
|
||||
⚠️ ARCHIV-DATEN (API OFFLINE)
|
||||
</span>
|
||||
)
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<span className="text-[10px] text-slate-400 font-mono">Modus: {scanMode.toUpperCase()} | Region: {marketRegion.toUpperCase()}</span>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user