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 (
<>
|
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
|
{sortedCards.map((card) => (
|
|
{card.grade}
|
{card.xp}
|
{card.xpNeeded}
|
{card.xpPercentage !== "N/A"
? `${Number(card.xpPercentage).toFixed(0)}%`
: "N/A"}
|
{card.levelUpAppliedCount} / {card.maxLevelUpAppliedCount}
|
))}
>
)
}