import { useMemo } from 'react' import { useQuery } from '@tanstack/react-query' import { motion, AnimatePresence } from 'framer-motion' import { api } from '../api/client' import { useAuthStore } from '../stores/auth' /** * 캐릭터 입력 input 아래 뜨는 드롭다운 * - 로그인된 API 키로 /api/character/list 조회 * - input value로 필터링 * - 항목 클릭 시 onSelect(characterName) * - excludeNames: 이미 추가된 캐릭터는 목록에서 제외 */ export default function CharacterSuggestDropdown({ open, filter = '', excludeNames = [], onSelect }) { const apiKey = useAuthStore((s) => s.apiKey) const { data = [], isLoading, error } = useQuery({ queryKey: ['user-character-list', apiKey], queryFn: async () => { const r = await api('/api/character/list', { headers: { 'x-user-api-key': apiKey } }) return r.characters || [] }, enabled: open && !!apiKey, staleTime: 10 * 60 * 1000, retry: false, }) const filtered = useMemo(() => { const exclude = new Set(excludeNames) const q = filter.trim().toLowerCase() return data .filter((c) => !exclude.has(c.character_name)) .filter((c) => !q || c.character_name.toLowerCase().includes(q)) .slice() .sort((a, b) => (b.character_level || 0) - (a.character_level || 0)) .slice(0, 50) }, [data, filter, excludeNames]) return ( {open && apiKey && ( {isLoading ? (
불러오는 중...
) : error ? (
{error.message || '조회 실패'}
) : filtered.length === 0 ? (
{data.length === 0 ? '캐릭터가 없습니다' : '일치하는 캐릭터가 없습니다'}
) : ( )}
)}
) }