import { useState, useEffect } from 'react'; import Logo from './Logo'; interface AIInsight { ticker: string; bullishProbability: number; reason: string; creditsRemaining: number; } interface AIAnalystProps { activeTicker: string; insight: AIInsight | null; savedStrategies: any[]; loadingInsight: boolean; insightError: string | null; onTriggerInsight: (tradingStyle: string, riskTolerance: string) => void; onResetInsight: () => void; } export default function AIAnalyst({ activeTicker, insight, savedStrategies, loadingInsight, insightError, onTriggerInsight, onResetInsight, }: AIAnalystProps) { const [activeTab, setActiveTab] = useState<'analysis' | 'history'>('analysis'); const [selectedHistoryItem, setSelectedHistoryItem] = useState(null); const [tradingStyle, setTradingStyle] = useState('swing_trading'); const [riskTolerance, setRiskTolerance] = useState('moderate'); const [isStyleOpen, setIsStyleOpen] = useState(false); const [isRiskOpen, setIsRiskOpen] = useState(false); // Auto-switch to analysis tab when loading starts useEffect(() => { if (loadingInsight) { setActiveTab('analysis'); setSelectedHistoryItem(null); } }, [loadingInsight]); // Parse inline markdown: **bold**, *italic* const parseInline = (text: string, keyPrefix: string) => { // Handle **bold** and *italic* (in that order, bold first) const parts = text.split(/(\*\*[^*]+\*\*|\*[^*]+\*)/g); return parts.map((part, j) => { if (part.startsWith('**') && part.endsWith('**')) { return ( {part.slice(2, -2)} ); } if (part.startsWith('*') && part.endsWith('*')) { return ( {part.slice(1, -1)} ); } return part; }); }; // Full markdown formatter — handles headings, bullets, bold, italic const formatReason = (text: string) => { if (!text) return null; const lines = text.split('\n'); const elements: React.ReactNode[] = []; let bulletBuffer: string[] = []; const flushBullets = (keyBase: string) => { if (bulletBuffer.length === 0) return; elements.push( ); bulletBuffer = []; }; lines.forEach((line, i) => { const trimmed = line.trim(); if (!trimmed) { flushBullets(`${i}`); return; } // ### Heading 3 if (trimmed.startsWith('### ')) { flushBullets(`${i}`); elements.push(

{trimmed.slice(4)}

); return; } // ## Heading 2 if (trimmed.startsWith('## ')) { flushBullets(`${i}`); elements.push(

{parseInline(trimmed.slice(3), `h2-${i}`)}

); return; } // # Heading 1 if (trimmed.startsWith('# ')) { flushBullets(`${i}`); elements.push(

{parseInline(trimmed.slice(2), `h1-${i}`)}

); return; } // * bullet or - bullet if (trimmed.startsWith('* ') || trimmed.startsWith('- ')) { bulletBuffer.push(trimmed.slice(2)); return; } // Plain paragraph flushBullets(`${i}`); elements.push(

{parseInline(trimmed, `p-${i}`)}

); }); flushBullets('end'); return elements; }; const renderGauge = (probability: number) => (
{probability}% Bullish
); return (
QuantIQ AI Analyst
{activeTab === 'analysis' ? ( <> {!insight && !loadingInsight && (

Analyze indicators, watchlists, alerts, and model prediction in a single ReAct workflow.

{/* Style & Risk selectors */} {/* Style & Risk selectors */}
{/* Trading Style Custom Select */}
{ setIsStyleOpen(!isStyleOpen); setIsRiskOpen(false); }} className="premium-select" style={{ width: '100%', padding: '10px 14px', background: 'rgba(255,255,255,0.02)', border: '1px solid var(--border-glass)', borderRadius: '10px', color: 'var(--text-primary)', cursor: 'pointer', fontSize: '12px', display: 'flex', alignItems: 'center', justifyContent: 'space-between', boxSizing: 'border-box', minHeight: '38px' }} > {tradingStyle === 'day_trading' && 'Day Trading'} {tradingStyle === 'swing_trading' && 'Swing Trading'} {tradingStyle === 'investing' && 'Long-term Investing'}
{isStyleOpen && (
{ setTradingStyle('day_trading'); setIsStyleOpen(false); }} style={{ padding: '10px 12px', borderRadius: '8px', cursor: 'pointer', color: tradingStyle === 'day_trading' ? 'var(--neon-cyan)' : 'var(--text-secondary)', background: tradingStyle === 'day_trading' ? 'rgba(0, 242, 254, 0.06)' : 'none', fontSize: '12px', transition: 'all 0.15s ease' }} > Day Trading
{ setTradingStyle('swing_trading'); setIsStyleOpen(false); }} style={{ padding: '10px 12px', borderRadius: '8px', cursor: 'pointer', color: tradingStyle === 'swing_trading' ? 'var(--neon-cyan)' : 'var(--text-secondary)', background: tradingStyle === 'swing_trading' ? 'rgba(0, 242, 254, 0.06)' : 'none', fontSize: '12px', transition: 'all 0.15s ease' }} > Swing Trading
{ setTradingStyle('investing'); setIsStyleOpen(false); }} style={{ padding: '10px 12px', borderRadius: '8px', cursor: 'pointer', color: tradingStyle === 'investing' ? 'var(--neon-cyan)' : 'var(--text-secondary)', background: tradingStyle === 'investing' ? 'rgba(0, 242, 254, 0.06)' : 'none', fontSize: '12px', transition: 'all 0.15s ease' }} > Long-term Investing
)}
{/* Risk Profile Custom Select */}
{ setIsRiskOpen(!isRiskOpen); setIsStyleOpen(false); }} className="premium-select" style={{ width: '100%', padding: '10px 14px', background: 'rgba(255,255,255,0.02)', border: '1px solid var(--border-glass)', borderRadius: '10px', color: 'var(--text-primary)', cursor: 'pointer', fontSize: '12px', display: 'flex', alignItems: 'center', justifyContent: 'space-between', boxSizing: 'border-box', minHeight: '38px' }} > {riskTolerance === 'conservative' && 'Conservative'} {riskTolerance === 'moderate' && 'Moderate'} {riskTolerance === 'aggressive' && 'Aggressive'}
{isRiskOpen && (
{ setRiskTolerance('conservative'); setIsRiskOpen(false); }} style={{ padding: '10px 12px', borderRadius: '8px', cursor: 'pointer', color: riskTolerance === 'conservative' ? 'var(--neon-cyan)' : 'var(--text-secondary)', background: riskTolerance === 'conservative' ? 'rgba(0, 242, 254, 0.06)' : 'none', fontSize: '12px', transition: 'all 0.15s ease' }} > Conservative
{ setRiskTolerance('moderate'); setIsRiskOpen(false); }} style={{ padding: '10px 12px', borderRadius: '8px', cursor: 'pointer', color: riskTolerance === 'moderate' ? 'var(--neon-cyan)' : 'var(--text-secondary)', background: riskTolerance === 'moderate' ? 'rgba(0, 242, 254, 0.06)' : 'none', fontSize: '12px', transition: 'all 0.15s ease' }} > Moderate
{ setRiskTolerance('aggressive'); setIsRiskOpen(false); }} style={{ padding: '10px 12px', borderRadius: '8px', cursor: 'pointer', color: riskTolerance === 'aggressive' ? 'var(--neon-cyan)' : 'var(--text-secondary)', background: riskTolerance === 'aggressive' ? 'rgba(0, 242, 254, 0.06)' : 'none', fontSize: '12px', transition: 'all 0.15s ease' }} > Aggressive
)}
)} {loadingInsight && (
QuantIQ AI is analyzing {activeTicker}... Running ReAct workflow · Scanning indicators · Generating strategy
)} {insightError && (
{insightError}
)} {insight && !loadingInsight && (
{renderGauge(insight.bullishProbability)}
= 50 ? 'tag-bullish' : 'tag-bearish'}`}> {insight.bullishProbability >= 50 ? 'BULLISH BIAS' : 'BEARISH BIAS'}
{formatReason(insight.reason)}
Disclaimer: QuantIQ AI is an automated strategy assistant and can make mistakes. All analysis is for informational purposes only and should not be considered financial advice. Please verify financial data independently.
)} ) : ( /* Strategy History View */
{selectedHistoryItem ? ( /* Expanded Historical Report Details */
Report for {selectedHistoryItem.ticker} generated on {new Date(selectedHistoryItem.createdAt).toLocaleString()}
{renderGauge(selectedHistoryItem.bullishProbability)}
= 50 ? 'tag-bullish' : 'tag-bearish'}`}> {selectedHistoryItem.bullishProbability >= 50 ? 'BULLISH BIAS' : 'BEARISH BIAS'}
{formatReason(selectedHistoryItem.reason)}
Disclaimer: QuantIQ AI is an automated strategy assistant and can make mistakes. All analysis is for informational purposes only and should not be considered financial advice. Please verify financial data independently.
) : ( /* List of historical reports */
{savedStrategies.length === 0 ? (
No saved strategies found. Generate your first strategy analysis to build your history!
) : ( savedStrategies.map((item) => { const dateStr = new Date(item.createdAt).toLocaleString([], { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }); const isPositive = item.bullishProbability >= 50; return (
{item.ticker} {dateStr}
{item.bullishProbability}% Bullish
); }) )}
)}
)}
); }