function DashboardView({ onNavigate }) { const SAMPLE_STATS = [ { label:'ค่าโฆษณา', en:'Spend', value:'฿10,950', trend:'+12%', up:true, Icon:IconCoins }, { label:'รายได้', en:'Revenue', value:'฿31,200', trend:'+24%', up:true, Icon:IconActivity }, { label:'ROAS เฉลี่ย', en:'Avg. ROAS', value:'2.85x', trend:'+0.4', up:true, Icon:IconTarget }, { label:'Conversions', en:'Conversions', value:'142', trend:'+18%', up:true, Icon:IconBolt }, ]; const SAMPLE_PERF = [ { name:'จ.', roas:2.1, spend:1200, revenue:2520 }, { name:'อ.', roas:2.4, spend:1350, revenue:3240 }, { name:'พ.', roas:2.2, spend:1100, revenue:2420 }, { name:'พฤ.', roas:2.8, spend:1500, revenue:4200 }, { name:'ศ.', roas:3.1, spend:1800, revenue:5580 }, { name:'ส.', roas:3.5, spend:2100, revenue:7350 }, { name:'อา.', roas:3.2, spend:1900, revenue:6080 }, ]; const SAMPLE_PLACEMENT = [ { name:'Mobile Feed', value:65, color:'var(--accent)' }, { name:'Desktop Feed', value:15, color:'var(--ink-3)' }, { name:'Instagram', value:12, color:'var(--accent-strong)' }, { name:'Messenger', value:8, color:'var(--ink-4)' }, ]; const [stats, setStats] = useState(null); const [perfData, setPerfData] = useState([]); const [placement, setPlacement] = useState([]); const [insights, setInsights] = useState([]); const [isSample, setIsSample] = useState(false); const [isLive, setIsLive] = useState(false); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); // Auto-fetch from Meta API on mount if settings exist React.useEffect(() => { if (hasMetaKey()) { fetchLiveData(); } }, []); const fetchLiveData = async () => { setLoading(true); setError(null); try { const result = await fetchMetaDashboard(); if (result.perfData.length > 0) { setPerfData(result.perfData); setPlacement(result.placementData); const totalConversions = Math.round(result.totalRevenue / 220); // estimated setStats([ { label:'ค่าโฆษณา', en:'Spend', value:`฿${Math.round(result.totalSpend).toLocaleString()}`, trend:'LIVE', up:true, Icon:IconCoins }, { label:'รายได้', en:'Revenue', value:`฿${Math.round(result.totalRevenue).toLocaleString()}`, trend:'LIVE', up:true, Icon:IconActivity }, { label:'ROAS เฉลี่ย', en:'Avg. ROAS', value:`${result.avgRoas.toFixed(2)}x`, trend:'LIVE', up:result.avgRoas >= 2, Icon:IconTarget }, { label:'Conversions', en:'Conversions', value:`${totalConversions}`, trend:'LIVE', up:true, Icon:IconBolt }, ]); setInsights(result.insights || []); setIsLive(true); setIsSample(false); } else { // API connected but no data in last 7 days setError('เชื่อมต่อ Meta API สำเร็จ แต่ยังไม่มีข้อมูลในรอบ 7 วัน'); } } catch (e) { setError(e.message); } setLoading(false); }; const hasData = perfData.length > 0; const metaConfigured = hasMetaKey(); const loadSample = () => { setStats(SAMPLE_STATS); setPerfData(SAMPLE_PERF); setPlacement(SAMPLE_PLACEMENT); setInsights([]); setIsSample(true); setIsLive(false); }; const clearSample = () => { setStats(null); setPerfData([]); setPlacement([]); setInsights([]); setIsSample(false); setIsLive(false); }; return (
{metaConfigured && !loading && ( )} {isSample && ( )}
{/* Loading state */} {loading && (

กำลังดึงข้อมูลจาก Meta Ads API…

กรุณารอสักครู่

)} {/* Error state with Meta configured */} {!loading && error && metaConfigured && (
ไม่สามารถดึงข้อมูลผ่าน n8n Webhook ได้
{error}
)} {!loading && !hasData ? ( ) : !loading && ( <> {/* live banner */} {isLive && (
ข้อมูลจริงจาก n8n Webhook · อัปเดตล่าสุด
)} {/* sample banner */} {isSample && (
แสดงข้อมูลตัวอย่างเพื่อ Preview — onNavigate('settings')}>เชื่อมต่อ n8n Webhook เพื่อดูข้อมูลจริง
)} {/* stat cards */}
{(stats || SAMPLE_STATS).map((s) => )}

การใช้จ่าย vs รายได้ SPEND & REVENUE

AI Insights

Live
{isSample || insights.length === 0 ? ( <> onNavigate('optimization')} tone="neg" /> onNavigate('optimization')} tone="pos" /> ) : ( insights.map((ins, idx) => ( onNavigate('optimization')} tone={ins.tone || "pos"} /> )) )}

วิเคราะห์ ROAS

การแสดงผลตามตำแหน่ง PLACEMENTS

{placement.length > 0 ? :
ไม่มีข้อมูล Placement
}
)}
); }