function ResearchView() { const [query, setQuery] = useState(''); const [loading, setLoading] = useState(false); const [result, setResult] = useState(null); const [tab, setTab] = useState(0); const [validating, setValidating] = useState(false); const [validation, setValidation] = useState(null); const [sortAud, setSortAud] = useState({ col: 'efficiencyScore', dir: -1 }); const [expandedAud, setExpandedAud] = useState(null); const [expandedAngle, setExpandedAngle] = useState(null); const [aiMode, setAiMode] = useState(null); // 'live' | 'demo' | 'error' const [aiError, setAiError] = useState(null); const run = async () => { if (!query.trim() || loading) return; setLoading(true); setResult(null); setValidation(null); setTab(0); setAiError(null); try { const data = await aiResearch(query); setResult(data); setAiMode('live'); } catch(e) { const mockData = getMockResearch(query); setResult(mockData); if (e.code === 'NO_KEY') { setAiMode('demo'); } else { setAiMode('error'); setAiError(e.message); } } setLoading(false); }; const runValidate = async () => { if (validating || !result) return; setValidating(true); setTab(3); try { const data = await aiValidateResearch(result); setValidation(data); } catch(e) { const mockVal = getMockValidation(query, result); setValidation(mockVal); } setValidating(false); }; const sortedAud = result ? [...result.targetAudiences].sort((a, b) => { const av = a[sortAud.col]; const bv = b[sortAud.col]; return typeof av === 'number' ? (av - bv) * sortAud.dir : av.localeCompare(bv) * sortAud.dir; }) : []; const sortBy = (col) => setSortAud(s => ({ col, dir: s.col === col ? -s.dir : -1 })); const SortIcon = ({ col }) => sortAud.col === col ? {sortAud.dir === -1 ? '↓' : '↑'} : ; const TABS = ['กลุ่มเป้าหมาย', 'มุมมองสื่อสาร', 'คู่แข่ง', 'ตรวจสอบ AI']; const TABS_EN = ['AUDIENCES', 'AD ANGLES', 'COMPETITORS', 'AI VALIDATOR']; return (
{/* ── Search bar ── */}
setQuery(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && run()} placeholder="เช่น: ครีมกันแดดเนื้อบางเบา ผิวแพ้ง่าย SPF50…" />
{result && ( )}
ลองเลย : {['ครีมกันแดดผิวแพ้ง่าย', 'อาหารเสริมคอลลาเจน', 'รองเท้าวิ่งน้ำหนักเบา', 'กาแฟสดส่งตรงบ้าน'].map(s => ( ))}
{loading && } {result && !loading && (
{/* ── Result header row ── */}
ผลวิเคราะห์ {result.productSector} Thailand {aiMode === 'live' && Live AI} {aiMode === 'demo' && Demo Mode} {aiMode === 'error' && AI Error} {validation && ( AI Validator: {validation.overallScore}/100 )}
{result.targetAudiences.length} กลุ่ม {result.angles.length} Angles {result.competitorInsights.length} คู่แข่ง
{/* ── Tabs ── */}
{TABS.map((t, i) => ( ))}
{/* ── Tab 0: กลุ่มเป้าหมาย ── */} {tab === 0 && (
{/* Summary bar */}
{result.targetAudiences.map((a, i) => (
setExpandedAud(expandedAud === i ? null : i)}>
{i + 1}
{a.segment.split(' ')[0]}
{a.efficiencyScore}%
))}
{/* Sortable table */}

รายการกลุ่มเป้าหมายทั้งหมด

คลิกชื่อคอลัมน์เพื่อเรียงลำดับ
{sortedAud.map((a, i) => { const origIdx = result.targetAudiences.indexOf(a); const isExp = expandedAud === origIdx; return ( {isExp && ( )} ); })}
sortBy('segment')}>กลุ่มเป้าหมาย sortBy('efficiencyScore')}>Efficiency sortBy('searchTrend')}>เทรนด์ค้นหา Est. CPC ทำไมถึงดี
{a.segment}
{a.description.substring(0, 55)}…
= 85 ? 'var(--pos)' : a.efficiencyScore >= 70 ? 'var(--accent)' : 'var(--ink-4)'} /> = 85 ? 'var(--pos)' : 'var(--accent-strong)' }}>{a.efficiencyScore}%
{a.searchTrend} {a.estimatedCpc} {a.rationale}
{a.description}
เทรนด์ {a.searchTrend} CPC {a.estimatedCpc} Efficiency {a.efficiencyScore}%
)} {/* ── Tab 1: มุมมองสื่อสาร ── */} {tab === 1 && (

Ad Angles ที่แนะนำ

{result.angles.length} ANGLES
{result.angles.map((a, i) => { const isExp = expandedAngle === i; return ( {isExp && ( )} ); })}
#มุมมองการสื่อสารEfficiency เทรนด์Est. CPA
#{i + 1}
{a.title}
{a.description.substring(0, 60)}…
{a.efficiencyScore}
{a.searchTrend} {a.estimatedCpa}
{a.description}
{/* Angle ranking visual */}

จัดอันดับ Efficiency Score

{[...result.angles].sort((a, b) => b.efficiencyScore - a.efficiencyScore).map((a, i) => (
#{i + 1}
{a.title}
{a.efficiencyScore}
))}
)} {/* ── Tab 2: คู่แข่ง ── */} {tab === 2 && (

ภูมิทัศน์คู่แข่ง COMPETITIVE LANDSCAPE

{result.competitorInsights.map((c, i) => ( ))}
กลยุทธ์คู่แข่งโอกาสของเราEst. Spend/เดือน
{c.strategy}
{c.opportunity}
{c.estimatedSpend}
{/* Gap analysis cards */}
{result.competitorInsights.map((c, i) => (
COMPETITOR {i + 1}

{c.strategy}

{c.opportunity}

EST. SPEND {c.estimatedSpend}
))}
)} {/* ── Tab 3: AI Validator ── */} {tab === 3 && (
{!validation && !validating && (
ยังไม่ได้ตรวจสอบ

กด "ตรวจสอบความแม่นยำ AI" เพื่อให้ระบบตรวจสอบว่าผลวิเคราะห์ใช้ได้จริงใน Meta Ads หรือต้องปรับก่อน

)} {validating && } {validation && !validating && (
{/* Overall score */}
{validation.overallScore}
/100
ผลตรวจสอบ: {validation.verdict}

{validation.summary}

{/* Audience validation table */}

ตรวจสอบกลุ่มเป้าหมาย

{validation.audienceValidation.map((av, i) => ( {av.checks.map((ch, ci) => ( ))} ))}
กลุ่มเป้าหมายผลตรวจConfidenceInterest ใน MetaAudience SizeCPC
{av.segment} {av.verdict === 'pass' ? : } {av.verdict === 'pass' ? 'ใช้ได้' : 'ควรระวัง'}
= 80 ? 'var(--pos)' : 'var(--accent)'} /> {av.confidence}%
{ch.pass ? : } {ch.note}
{/* Angle validation */}

ตรวจสอบ Ad Angles

{validation.angleValidation.map((av, i) => ( ))}
Ad AngleผลตรวจConfidenceหมายเหตุ AI
{av.title} {av.verdict === 'pass' ? : } {av.verdict === 'pass' ? 'ดี' : 'ควรปรับ'}
= 80 ? 'var(--pos)' : 'var(--accent)'} /> {av.confidence}%
{av.note}
{/* Meta Ads Tips */}

คำแนะนำการตั้งค่า Meta Ads

{validation.metaAdsTips.map((tip, i) => (
0{i + 1} {tip}
))}
)}
)}
)}
); } /* ============================ CREATE AD ============================ */ // MOCK_CONTEXTS ถูกลบออกแล้ว — ใช้ aiGenContext(title) เท่านั้น const MOCK_CONTEXTS = [];