"use client" import React, { useState } from 'react' const layouts = (process.env.NEXT_PUBLIC_TRADINGVIEW_LAYOUTS || 'ai,Diy module').split(',').map(l => l.trim()) const timeframes = [ { label: '1m', value: '1' }, { label: '5m', value: '5' }, { label: '15m', value: '15' }, { label: '1h', value: '60' }, { label: '4h', value: '240' }, { label: '1d', value: 'D' }, { label: '1w', value: 'W' }, { label: '1M', value: 'M' }, ] const popularCoins = [ { name: 'Bitcoin', symbol: 'BTCUSD', icon: '₿' }, { name: 'Ethereum', symbol: 'ETHUSD', icon: 'Ξ' }, { name: 'Solana', symbol: 'SOLUSD', icon: '◎' }, { name: 'Sui', symbol: 'SUIUSD', icon: '🔷' }, { name: 'Avalanche', symbol: 'AVAXUSD', icon: '🔺' }, { name: 'Cardano', symbol: 'ADAUSD', icon: '♠' }, { name: 'Polygon', symbol: 'MATICUSD', icon: '🔷' }, { name: 'Chainlink', symbol: 'LINKUSD', icon: '🔗' }, ] export default function AIAnalysisPanel() { const [symbol, setSymbol] = useState('BTCUSD') const [selectedLayouts, setSelectedLayouts] = useState([layouts[0]]) const [timeframe, setTimeframe] = useState('60') const [loading, setLoading] = useState(false) const [result, setResult] = useState(null) const [error, setError] = useState(null) // Helper function to safely render any value const safeRender = (value: any): string => { if (typeof value === 'string') return value if (typeof value === 'number') return value.toString() if (Array.isArray(value)) return value.join(', ') if (typeof value === 'object' && value !== null) { return JSON.stringify(value) } return String(value) } const toggleLayout = (layout: string) => { setSelectedLayouts(prev => prev.includes(layout) ? prev.filter(l => l !== layout) : [...prev, layout] ) } const selectCoin = (coinSymbol: string) => { setSymbol(coinSymbol) } const quickAnalyze = async (coinSymbol: string) => { setSymbol(coinSymbol) setSelectedLayouts([layouts[0]]) // Use first layout setLoading(true) setError(null) setResult(null) try { const res = await fetch('/api/analyze', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ symbol: coinSymbol, layouts: [layouts[0]], timeframe }) }) const data = await res.json() if (!res.ok) throw new Error(data.error || 'Unknown error') setResult(data) } catch (e: any) { setError(e.message) } setLoading(false) } async function handleAnalyze() { setLoading(true) setError(null) setResult(null) if (selectedLayouts.length === 0) { setError('Please select at least one layout') setLoading(false) return } try { const res = await fetch('/api/analyze', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ symbol, layouts: selectedLayouts, timeframe }) }) const data = await res.json() if (!res.ok) throw new Error(data.error || 'Unknown error') setResult(data) } catch (e: any) { setError(e.message) } setLoading(false) } return (

AI Chart Analysis

{/* Quick Coin Selection */}

Quick Analysis - Popular Coins

{popularCoins.map(coin => ( ))}
{/* Manual Input Section */}

Manual Analysis

setSymbol(e.target.value)} placeholder="Symbol (e.g. BTCUSD)" />
{/* Layout selection */}
{layouts.map(layout => ( ))}
{selectedLayouts.length > 0 && (
Selected: {selectedLayouts.join(', ')}
)}
{error && (
{error.includes('frame was detached') ? ( <> TradingView Error: Chart could not be loaded. Please check your symbol and layout, or try again.
Technical: {error} ) : error.includes('layout not found') ? ( <> Layout Error: TradingView layout not found. Please select a valid layout.
Technical: {error} ) : error.includes('Private layout access denied') ? ( <> Access Error: The selected layout is private or requires authentication. Try a different layout or check your TradingView login.
Technical: {error} ) : ( <> Analysis Error: {error} )}
)} {loading && (
Analyzing {symbol} chart...
)} {result && (

Analysis Results

{result.layoutsAnalyzed && (
Layouts analyzed: {result.layoutsAnalyzed.join(', ')}
)}
Summary:

{safeRender(result.summary)}

Sentiment:

{safeRender(result.marketSentiment)}

Recommendation:

{safeRender(result.recommendation)}

({safeRender(result.confidence)}% confidence)
{result.keyLevels && (
Support Levels:

{result.keyLevels.support?.join(', ') || 'None identified'}

Resistance Levels:

{result.keyLevels.resistance?.join(', ') || 'None identified'}

)} {/* Enhanced Trading Analysis */} {result.entry && (
Entry:

${safeRender(result.entry.price || result.entry)}

{result.entry.buffer &&

{safeRender(result.entry.buffer)}

} {result.entry.rationale &&

{safeRender(result.entry.rationale)}

}
)} {result.stopLoss && (
Stop Loss:

${safeRender(result.stopLoss.price || result.stopLoss)}

{result.stopLoss.rationale &&

{safeRender(result.stopLoss.rationale)}

}
)} {result.takeProfits && (
Take Profits: {typeof result.takeProfits === 'object' ? ( <> {result.takeProfits.tp1 && (

TP1: ${safeRender(result.takeProfits.tp1.price || result.takeProfits.tp1)}

{result.takeProfits.tp1.description &&

{safeRender(result.takeProfits.tp1.description)}

}
)} {result.takeProfits.tp2 && (

TP2: ${safeRender(result.takeProfits.tp2.price || result.takeProfits.tp2)}

{result.takeProfits.tp2.description &&

{safeRender(result.takeProfits.tp2.description)}

}
)} ) : (

{safeRender(result.takeProfits)}

)}
)} {result.riskToReward && (
Risk to Reward:

{safeRender(result.riskToReward)}

)} {result.confirmationTrigger && (
Confirmation Trigger:

{safeRender(result.confirmationTrigger)}

)} {result.indicatorAnalysis && (
Indicator Analysis: {typeof result.indicatorAnalysis === 'object' ? (
{result.indicatorAnalysis.rsi && (
RSI: {safeRender(result.indicatorAnalysis.rsi)}
)} {result.indicatorAnalysis.vwap && (
VWAP: {safeRender(result.indicatorAnalysis.vwap)}
)} {result.indicatorAnalysis.obv && (
OBV: {safeRender(result.indicatorAnalysis.obv)}
)}
) : (

{safeRender(result.indicatorAnalysis)}

)}
)}
Reasoning:

{safeRender(result.reasoning)}

)}
) }