import { useState, useEffect, useRef } from 'react'; import { Search, X } from 'lucide-react'; import { useGuideData } from '../hooks/useGuideData'; import { RARITY_COLORS } from '../constants'; import { RarityDot } from './RarityBadge'; export function GuideDrawer({ open, onClose }: { open: boolean; onClose: () => void }) { const [search, setSearch] = useState(''); const inputRef = useRef(null); const { filteredMonsters, filteredItems, filteredRecipes, matMap, q } = useGuideData(search); useEffect(() => { if (open) { setSearch(''); setTimeout(() => inputRef.current?.focus(), 100); } }, [open]); // Escape to close useEffect(() => { if (!open) return; const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; window.addEventListener('keydown', handler); return () => window.removeEventListener('keydown', handler); }, [open, onClose]); if (!open) return null; const hasResults = q && (filteredMonsters.length > 0 || filteredItems.length > 0 || filteredRecipes.length > 0); const noResults = q && !hasResults; const totalResults = q ? filteredMonsters.length + filteredItems.length + filteredRecipes.length : 0; return ( <> {/* Backdrop */}
{/* Drawer */}
{/* Header */}
📖 Guide rapide
{/* Search */}
setSearch(e.target.value)} placeholder="Monstre, item, matériau, recette…" style={{ width: '100%', padding: '8px 10px 8px 30px', fontSize: 12, background: '#1e2535', border: '1px solid #2a3448', borderRadius: 6, color: '#dce4f0', outline: 'none', boxSizing: 'border-box', }} />
{q && (
{totalResults} résultat{totalResults !== 1 ? 's' : ''}
)}
{/* Results */}
{!q && (
Tapez pour rechercher dans le guide
)} {noResults && (
Aucun résultat pour « {search} »
)} {/* Monstres */} {q && filteredMonsters.length > 0 && (
Monstres ({filteredMonsters.length})
{filteredMonsters.map(m => (
{m.name} Niv. {m.minLevel}–{m.maxLevel}
❤️{m.hp} ⚔️{m.attack} 🛡️{m.defense} · ⭐{m.xpReward}xp · 💰{m.goldMin}–{m.goldMax} {m.dropMaterialId && matMap.get(m.dropMaterialId) && ( · 🎁 {matMap.get(m.dropMaterialId)!.name} )}
))}
)} {/* Items */} {q && filteredItems.length > 0 && (
Équipement ({filteredItems.length})
{filteredItems.map(item => (
{item.type === 'weapon' ? '⚔️' : item.type === 'armor' ? '🛡️' : '🧪'} {item.name}
{item.attackBonus > 0 && `ATK+${item.attackBonus} `} {item.defenseBonus > 0 && `DEF+${item.defenseBonus} `} {item.agiliteBonus > 0 && `AGI+${item.agiliteBonus} `} {item.intelligenceBonus > 0 && `INT+${item.intelligenceBonus} `} {(item as any).buyPrice > 0 ? `· 💰${(item as any).buyPrice}` : '· 🔨 Craft'}
))}
)} {/* Recettes */} {q && filteredRecipes.length > 0 && (
Recettes ({filteredRecipes.length})
{filteredRecipes.map(r => (
{r.resultItem?.name ?? r.name}
{r.ingredients.map((ing, i) => ( {i > 0 ? ' + ' : ''}{ing.quantity}× {matMap.get(ing.materialId)?.name ?? '???'} ))} · ⏱️{r.craftDurationSeconds}s · ⚡{r.enduranceCost}
))}
)}
{/* Footer */}
Ouvrir le guide complet →
); }