import React, { useState, useCallback, useEffect } from 'react'; import TaskStatusBox from './TaskStatusBox'; import { fmtDate } from '../instaUtils'; import { getInstaTrends, instaCollectTrends, getInstaTask } from '../../../api'; /* ══════════════════════ Trends 탭 패널 2: ExternalTrendsPanel ══════════ */ const CATEGORY_COLORS = { economy: '#0F62FE', psychology: '#A66CFF', celebrity: '#FF5C8A', uncategorized: '#6B7280', }; function ExternalTrendsPanel({ onCreateSlate }) { const [naver, setNaver] = useState([]); const [google, setGoogle] = useState([]); const [lastFetched, setLastFetched] = useState(null); const [collecting, setCollecting] = useState(false); const [task, setTask] = useState(null); const load = useCallback(async () => { const [n, g] = await Promise.all([ getInstaTrends({ source: 'naver_popular', days: 2 }), getInstaTrends({ source: 'youtube_trending', days: 2 }), ]); setNaver(n.items || []); setGoogle(g.items || []); const all = [...(n.items || []), ...(g.items || [])]; if (all.length) { const latest = all.map(t => t.suggested_at).sort().reverse()[0]; setLastFetched(latest); } }, []); useEffect(() => { load(); }, [load]); const trigger = async () => { setCollecting(true); try { const { task_id } = await instaCollectTrends(); let st = null; for (let i = 0; i < 60; i++) { st = await getInstaTask(task_id); setTask(st); if (st.status === 'succeeded' || st.status === 'failed') break; await new Promise(r => setTimeout(r, 3000)); } await load(); } finally { setCollecting(false); } }; const groupByCat = (items) => { const g = {}; items.forEach(it => { (g[it.category] = g[it.category] || []).push(it); }); return g; }; const renderRow = (t) => (
{t.keyword} {(t.score || 0).toFixed(2)}
); const naverGrouped = groupByCat(naver); return (

📈 외부 트렌드

{lastFetched ? `마지막 수집: ${fmtDate(lastFetched)}` : '아직 수집 없음'}
{task && }

🔥 NAVER 인기

{Object.keys(naverGrouped).length === 0 &&

없음

} {Object.entries(naverGrouped).map(([cat, items]) => (
{cat}
{items.map(renderRow)}
))}

📺 YouTube 인기

{google.length === 0 &&

없음

} {google.map(renderRow)}
); } export default ExternalTrendsPanel;