import { useState, useEffect, useRef } from 'react'; import { Search, Loader, X } from 'lucide-react'; import { pokemonApi, type PokemonListItem, type Pokemon } from '../services/pokemonApi'; interface PokemonSelectorProps { onSelect: (pokemonString: string) => void; onClose: () => void; isOpen: boolean; } export function PokemonSelector({ onSelect, onClose, isOpen }: PokemonSelectorProps) { const [searchQuery, setSearchQuery] = useState(''); const [searchResults, setSearchResults] = useState([]); const [selectedPokemon, setSelectedPokemon] = useState(null); const [isSearching, setIsSearching] = useState(false); const [isLoading, setIsLoading] = useState(false); const [level, setLevel] = useState(50); const [selectedMoves, setSelectedMoves] = useState([]); const searchInputRef = useRef(null); useEffect(() => { if (isOpen && searchInputRef.current) { searchInputRef.current.focus(); } }, [isOpen]); useEffect(() => { const searchPokemon = async () => { if (searchQuery.length < 2) { setSearchResults([]); return; } setIsSearching(true); try { const results = await pokemonApi.searchPokemon(searchQuery, 10); setSearchResults(results); } catch (error) { console.error('Search failed:', error); setSearchResults([]); } finally { setIsSearching(false); } }; const timeoutId = setTimeout(searchPokemon, 300); return () => clearTimeout(timeoutId); }, [searchQuery]); const handlePokemonSelect = async (pokemonItem: PokemonListItem) => { setIsLoading(true); try { const pokemon = await pokemonApi.getPokemon(pokemonItem.name); setSelectedPokemon(pokemon); setSearchResults([]); setSearchQuery(''); // Auto-select some random moves const levelMoves = pokemon.moves .filter(moveData => moveData.version_group_details.some(detail => detail.move_learn_method.name === 'level-up' ) ) .map(moveData => moveData.move.name); const randomMoves = levelMoves .sort(() => Math.random() - 0.5) .slice(0, 4); setSelectedMoves(randomMoves); } catch (error) { console.error('Failed to load pokemon:', error); } finally { setIsLoading(false); } }; const handleConfirm = () => { if (selectedPokemon) { const moves = selectedMoves.length > 0 ? ` moves=${selectedMoves.join(',')}` : ''; const pokemonString = `${selectedPokemon.name} level=${level}${moves}`; onSelect(pokemonString); handleClose(); } }; const handleClose = () => { setSearchQuery(''); setSearchResults([]); setSelectedPokemon(null); setSelectedMoves([]); setLevel(50); onClose(); }; const toggleMove = (move: string) => { if (selectedMoves.includes(move)) { setSelectedMoves(selectedMoves.filter(m => m !== move)); } else if (selectedMoves.length < 4) { setSelectedMoves([...selectedMoves, move]); } }; const availableMoves = selectedPokemon?.moves .filter(moveData => moveData.version_group_details.some(detail => detail.move_learn_method.name === 'level-up' ) ) .map(moveData => moveData.move.name) .sort() || []; if (!isOpen) return null; return (
{/* Header */}

Select a Pokémon

{!selectedPokemon ? ( // Search Phase
setSearchQuery(e.target.value)} placeholder="Search for a Pokémon..." className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-indigo-500 focus:border-transparent" /> {isSearching && ( )}
{searchResults.length > 0 && (
{searchResults.map((pokemon) => ( ))}
)} {searchQuery.length >= 2 && searchResults.length === 0 && !isSearching && (

No Pokémon found

)} {isLoading && (
Loading Pokémon details...
)}
) : ( // Configuration Phase
{selectedPokemon.sprites.other?.['official-artwork']?.front_default && ( {selectedPokemon.name} )}

{selectedPokemon.name}

{selectedPokemon.types.map((type) => ( {type.type.name} ))}
{/* Level */}
setLevel(parseInt(e.target.value))} className="w-full" />
{/* Moves */}
{availableMoves.map((move) => ( ))}
)}
{/* Footer */} {selectedPokemon && (
)}
); }