import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { itemApi, materialApi } from '../api/endpoints'; import type { CharacterItem } from '../api/types'; import { Package, Sword, Shield } from 'lucide-react'; const RARITY_LABEL: Record = { common: 'Commun', rare: 'Rare', epic: 'Épique', legendary: 'Légendaire', }; function ItemCard({ ci, onEquip, onUnequip }: { ci: CharacterItem; onEquip: () => void; onUnequip: () => void }) { const { item } = ci; const bonuses = [ item.attackBonus && `+${item.attackBonus} ATK`, item.defenseBonus && `+${item.defenseBonus} DEF`, item.forceBonus && `+${item.forceBonus} FOR`, item.agiliteBonus && `+${item.agiliteBonus} AGI`, item.intelligenceBonus && `+${item.intelligenceBonus} INT`, item.chanceBonus && `+${item.chanceBonus} CHA`, item.vitaliteBonus && `+${item.vitaliteBonus} VIT`, ].filter(Boolean).join(' · '); return (
{ci.equipped && ( Équipé )} {ci.forgeLevel > 0 && ( +{ci.forgeLevel} )}
{item.type === 'weapon' ? '⚔️' : '🛡️'}
{item.name}
{RARITY_LABEL[item.rarity]}
{bonuses &&
{bonuses}
}
{!ci.equipped ? : }
); } export function InventoryPage() { const qc = useQueryClient(); const { data: inventory, isLoading: loadInv } = useQuery({ queryKey: ['inventory'], queryFn: itemApi.inventory, }); const { data: materials, isLoading: loadMat } = useQuery({ queryKey: ['materials'], queryFn: materialApi.inventory, }); const equipMut = useMutation({ mutationFn: (id: string) => itemApi.equip(id), onSuccess: () => qc.invalidateQueries({ queryKey: ['inventory'] }), }); const unequipMut = useMutation({ mutationFn: (slot: 'weapon' | 'armor') => itemApi.unequip(slot), onSuccess: () => qc.invalidateQueries({ queryKey: ['inventory'] }), }); if (loadInv || loadMat) return
Chargement…
; const weapons = inventory?.filter(ci => ci.item.type === 'weapon') ?? []; const armors = inventory?.filter(ci => ci.item.type === 'armor') ?? []; return (

Inventaire

{inventory?.length === 0 && (
Inventaire vide — gagne des combats pour lootter des matériaux et crafter des équipements !
)} {/* Armes */} {weapons.length > 0 && (

Armes ({weapons.length})

{weapons.map(ci => ( equipMut.mutate(ci.id)} onUnequip={() => unequipMut.mutate('weapon')} /> ))}
)} {/* Armures */} {armors.length > 0 && (

Armures ({armors.length})

{armors.map(ci => ( equipMut.mutate(ci.id)} onUnequip={() => unequipMut.mutate('armor')} /> ))}
)} {/* Matériaux */} {materials && materials.length > 0 && (

🌿 Matériaux

{materials.map(cm => (
🌿
{cm.material.name}
×{cm.quantity}
))}
)}
); }