import { useMemo, useState } from "react" import { useParams } from "react-router" import { Link } from "react-router-dom" import { GetUserCards } from "../../api/card" import WithDataFetching from "../../components/withdatafetching" import Card from "../../types/card" export default function XpCenter() { const { slug = "gigiz22" } = useParams() return ( queryKey={["user", slug, "cards"]} queryFn={() => GetUserCards(slug)} refetchOnWindowFocus={false} > {(data) => } ) } function CardList({ cards }: { cards: Card[] }) { const [sortConfig, setSortConfig] = useState<{ key: string direction: "asc" | "desc" } | null>(null) const [hideMaxLevelUp, setHideMaxLevelUp] = useState(false) const filteredCards = useMemo(() => { return hideMaxLevelUp ? cards.filter( (card) => card.levelUpAppliedCount < card.maxLevelUpAppliedCount ) : cards }, [cards, hideMaxLevelUp]) const sortedCards = useMemo(() => { let sortableCards = filteredCards.map((card) => ({ ...card, xpNeeded: card.xpNeededForNextGrade > card.xp ? card.xpNeededForNextGrade - card.xp : "N/A", xpPercentage: card.xpNeededForNextGrade > card.xp ? ((card.xpNeededForNextGrade - card.xp) * 100) / (card.xpNeededForNextGrade - card.xpNeededForCurrentGrade) : "N/A", })) if (sortConfig !== null) { sortableCards.sort((a, b) => { const key = sortConfig.key as keyof typeof a if (a[key] < b[key]) { return sortConfig.direction === "asc" ? -1 : 1 } if (a[key] > b[key]) { return sortConfig.direction === "asc" ? 1 : -1 } return 0 }) } return sortableCards }, [filteredCards, sortConfig]) const requestSort = (key: string) => { let direction: "asc" | "desc" = "asc" if ( sortConfig && sortConfig.key === key && sortConfig.direction === "asc" ) { direction = "desc" } setSortConfig({ key, direction }) } const getSortIndicator = (key: string) => { if (!sortConfig || sortConfig.key !== key) return null return sortConfig.direction === "asc" ? "↑" : "↓" } return ( <>
{sortedCards.map((card) => ( ))}
Player requestSort("grade")} > Grade{" "} {getSortIndicator("grade")} requestSort("xp")} > XP{" "} {getSortIndicator("xp")} requestSort("xpNeeded")} > XP Needed for Next Grade{" "} {getSortIndicator("xpNeeded")} requestSort("xpPercentage")} > % Until next grade{" "} {getSortIndicator("xpPercentage")} Level up applied
{card.name}
{card.playerDisplayName}
{card.grade}
{card.xp}
{card.xpNeeded}
{card.xpPercentage !== "N/A" ? `${Number(card.xpPercentage).toFixed(0)}%` : "N/A"}
{card.levelUpAppliedCount} / {card.maxLevelUpAppliedCount}
) }