function AnalyticsView({ onNavigate }) { const [loading, setLoading] = useState(false); const [tips, setTips] = useState([]); const [applied, setApplied] = useState([]); const [selected, setSelected] = useState(null); // selected campaign for preview const [campaigns, setCampaigns] = useState([]); const [isLive, setIsLive] = useState(false); const [fetchError, setFetchError] = useState(null); const [fetching, setFetching] = useState(false); // Auto-fetch from Meta API on mount if settings exist React.useEffect(() => { if (hasMetaKey()) { fetchLiveCampaigns(); } }, []); const fetchLiveCampaigns = async () => { setFetching(true); setFetchError(null); try { const data = await fetchMetaCampaigns(); if (data.length > 0) { setCampaigns(data); setIsLive(true); } else { setFetchError('เชื่อมต่อ Meta API สำเร็จ แต่ยังไม่มีแคมเปญที่ Active'); } } catch (e) { setFetchError(e.message); } setFetching(false); }; const hasData = campaigns.length > 0; const metaConfigured = hasMetaKey(); const run = async () => { if (!hasData) return; setLoading(true); try { const data = await aiOptimize(campaigns); setTips(Array.isArray(data) ? data : OPTIMIZATIONS); } catch(e) { setTips(OPTIMIZATIONS); } setLoading(false); }; const actionLabel = { change_creative:'เปลี่ยนครีเอทีฟ', pause:'หยุดชั่วคราว', adjust_budget:'ปรับงบ', modify_audience:'ปรับกลุ่ม' }; return (
{/* header */}
{metaConfigured && !fetching && ( )} {hasData && ( )}
{/* fetching state */} {fetching && (

กำลังดึงข้อมูลแคมเปญจาก n8n Webhook…

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

)} {/* Error state */} {!fetching && fetchError && metaConfigured && (
ไม่สามารถดึงข้อมูลแคมเปญได้
{fetchError}
)} {/* Live data banner */} {isLive && hasData && (
ข้อมูลแคมเปญจริงผ่าน n8n Webhook · {campaigns.length} แคมเปญ
)} {/* empty state */} {!fetching && !hasData && (

ยังไม่มีข้อมูลแคมเปญ

เชื่อมต่อ n8n Webhook เพื่อดึงข้อมูล Campaigns, Ad Sets และ Ads จริงจาก Facebook Ads Manager มายังหน้านี้โดยอัตโนมัติ

{['Campaigns', 'Ad Sets', 'Ads', 'Insights', 'ROAS', 'CTR', 'CPC'].map(t => ( {t} ))}
API ENDPOINT PREVIEW
GET /v21.0/{'{'}ad_account_id{'}'}/campaigns
GET /v21.0/{'{'}ad_account_id{'}'}/adsets
GET /v21.0/{'{'}ad_account_id{'}'}/insights
)} {/* AI recommendations */} {tips.length > 0 && !loading && hasData && (
OPTIMIZATION ENGINE · AI RECOMMENDATIONS
{tips.map((t, i) => { const done = applied.includes(t.adId); const isPos = t.actionType === 'adjust_budget'; return (
{isPos ? : }

{t.adName}

{t.issue}

{t.recommendation}

{actionLabel[t.actionType]}
); })}
)} {/* campaign table */} {hasData && (

ตารางแคมเปญ {campaigns.length} CAMPAIGNS

n8n Data · Live
{campaigns.map(ad => ( setSelected(ad)} onMouseEnter={e => e.currentTarget.style.background='var(--accent-soft)'} onMouseLeave={e => e.currentTarget.style.background=''}> ))}
ชื่อแคมเปญ สถานะ Spend Revenue ROAS CTR Conv.
{ad.name} {ad.status || 'ACTIVE'} ฿{Number(ad.spend).toLocaleString()} ฿{Number(ad.revenue).toLocaleString()} = 3.5 ? 'var(--pos)' : 'var(--accent-strong)' }}>{Number(ad.roas).toFixed(2)}x {ad.ctr}% {ad.conversions} ดูรายละเอียด
)} {/* Preview panel */} {selected && ( setSelected(null)} tips={tips} /> )}
); } /* ── Campaign Preview Panel ── */