import React, { useState, useEffect, useCallback, useMemo } from 'react'; import { getInstaKeywords } from '../../../api'; /* ══════════════════════ 키워드 목록 ══════════════════════════════════════ */ const CATEGORIES = ['전체', 'economy', 'psychology', 'celebrity']; const KEYWORDS_PER_PAGE = 10; function KeywordsPanel({ onCreateSlate }) { const [category, setCategory] = useState('전체'); const [keywords, setKeywords] = useState([]); const [creating, setCreating] = useState(null); // keyword_id being created const [page, setPage] = useState(0); const load = useCallback(() => { const cat = category === '전체' ? undefined : category; getInstaKeywords({ category: cat }).then((r) => setKeywords(r.items || [])).catch(() => {}); }, [category]); useEffect(() => { load(); }, [load]); useEffect(() => { setPage(0); }, [category]); // 카테고리 변경 시 첫 페이지로 // 동일 keyword 중복 제거(최고 score 1개만 유지) + score 내림차순 const deduped = useMemo(() => { const best = new Map(); for (const kw of keywords) { const name = (kw.keyword || '').trim(); if (!name) continue; const prev = best.get(name); if (!prev || (kw.score ?? 0) > (prev.score ?? 0)) best.set(name, kw); } return [...best.values()].sort((a, b) => (b.score ?? 0) - (a.score ?? 0)); }, [keywords]); const totalPages = Math.max(1, Math.ceil(deduped.length / KEYWORDS_PER_PAGE)); const safePage = Math.min(page, totalPages - 1); const pageItems = deduped.slice(safePage * KEYWORDS_PER_PAGE, safePage * KEYWORDS_PER_PAGE + KEYWORDS_PER_PAGE); // 부모(InstaCards)의 handleCreateSlate에 위임 — progress 배너 + 스크롤 + 자동 미리보기 공통화 async function handleCreate(kw) { if (creating) return; setCreating(kw.id); try { await onCreateSlate?.({ keyword: kw.keyword, category: kw.category, keyword_id: kw.id, }); } finally { setCreating(null); } } return (
트렌딩 키워드
{/* 카테고리 필터 */}