Feat: Add commander and Bset stats

This commit is contained in:
globuzma 2025-01-27 12:40:17 +01:00
parent b2010dae41
commit 64a4c5fb87
24 changed files with 626 additions and 977 deletions

View file

@ -0,0 +1,46 @@
import * as React from "react"
import { cn } from "@/lib/utils"
import { MTGCardProps } from "@/components/ui/mtg-card"
import { MTGCard } from '@/components/ui/mtg-card'
interface carte_from_stats {
id: string,
name: string,
normal_image: string,
sanitized_name: string,
nbr_decks: number,
total_decks: number,
percent_decks: number,
price: string,
cardmarket_uri: string
}
interface CardGroupProps {
className?: string,
groupName: string,
cards: carte_from_stats[],
showPrice?: boolean,
showStats?: boolean
}
const CardGroup = ({ className, groupName, cards, showPrice=true, showStats=true}: CardGroupProps) => {
return (
<div>
<h1>{groupName}</h1>
<div
className={cn(
"flex flex-row flex-wrap gap-4 p-8",
className
)}
>
{cards.map((card: carte_from_stats) => (
<MTGCard key={card.id} cardname={card.name} imageURI={card.normal_image} url={"/card/" + card.sanitized_name} nbrDecks={card.nbr_decks} totalDecks={card.total_decks} percentDecks={card.percent_decks} price={card.price} cardmarketURI={card.cardmarket_uri}/>
))}
</div>
</div>
)}
MTGCard.displayName = "MTGCard"
export { CardGroup }

View file

View file

@ -44,4 +44,4 @@ const MTGCard = ({ className, imageURI, cardname, url, nbrDecks, totalDecks, per
)}
MTGCard.displayName = "MTGCard"
export { MTGCard }
export { MTGCard, type MTGCardProps }

View file

@ -18,13 +18,36 @@ import { Input } from "@/components/ui/input"
import { Button } from "@/components/ui/button"
import { IconUserFilled } from "@tabler/icons-react"
import { Black, Blue, Green, White, Red, Colorless } from "@/components/ui/mana-icons"
import { useEffect, useState } from 'react'
interface NavigationProps {
isLoggedIn: boolean,
username: string
}
interface bsetJsonObject {
name: string,
sanitized_name: string,
set_codes: string[],
icons: string[]
}
export function NavigationBar ({ isLoggedIn, username}: NavigationProps) {
const [bsetsList, setBsetsList] = useState<bsetJsonObject[]>([])
useEffect(() => {
fetch('http://localhost:8072/misc/bsets.json').then((res) => {
if(res.status == 200) {
res.json().then((data) => {
setBsetsList(data)
console.log(data)
})
}
})
}, [])
return (
<div className="flex z-50 flex-row p-4 gap-4 w-full fixed top-0 left-0 bg-slate-700 items-center justify-between">
<div className="flex flex-row gap-4 items-center">
@ -34,137 +57,12 @@ export function NavigationBar ({ isLoggedIn, username}: NavigationProps) {
</a>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button>Cartes</Button>
<Button>Commandants</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuGroup>
<DropdownMenuItem>
<span>Top cartes</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Terrains</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Cartes salées</span>
</DropdownMenuItem>
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<span>Par couleurs</span>
</DropdownMenuSubTrigger>
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuItem>
<a className="flex flex-row gap-2" href="/top/white">
<White className="h-4 w-4"/>
<span>Blanc</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<a className="flex flex-row gap-2" href="/top/blue">
<Blue className="h-4 w-4"/>
<span>Bleu</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<a className="flex flex-row gap-2" href="/top/black">
<Black className="h-4 w-4"/>
<span>Noir</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<a className="flex flex-row gap-2" href="/top/red">
<Red className="h-4 w-4"/>
<span>Rouge</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<a className="flex flex-row gap-2" href="/top/green">
<Green className="h-4 w-4"/>
<span>Vert</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<a className="flex flex-row gap-2" href="/top/colorless">
<Colorless className="h-4 w-4"/>
<span>Incolor</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<a className="flex flex-row gap-2" href="/top/multicolor">
<span>Multicolor</span>
</a>
</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuPortal>
</DropdownMenuSub>
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<span>Par type</span>
</DropdownMenuSubTrigger>
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuItem>
<span>Créatures</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Éphémères</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Rituels</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Artefacts</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Équipements</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Artefacts de mana</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Artefacts utilitaires</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Enchantements</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Aura</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Planeswalker</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Terrains</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Terrains utilitaires</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Terrains ajusteurs</span>
</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuPortal>
</DropdownMenuSub>
<DropdownMenuItem>
<span>Combos</span>
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button>Commandant·es</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuGroup>
<DropdownMenuItem>
<span>Top commandant·es</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Second plan</span>
</DropdownMenuItem>
<DropdownMenuItem>
<span>Partenaires</span>
<a href="/commander/top">Top commandants</a>
</DropdownMenuItem>
<DropdownMenuSub>
<DropdownMenuSubTrigger>
@ -173,28 +71,40 @@ export function NavigationBar ({ isLoggedIn, username}: NavigationProps) {
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuItem>
<White className="h-4 w-4"/>
<span>Blanc</span>
<a className="flex flex-row gap-2 items-center" href="/commander/white">
<White className="h-4 w-4"/>
<span>White</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Blue className="h-4 w-4"/>
<span>Bleu</span>
<a className="flex flex-row gap-2 items-center" href="/commander/blue">
<Blue className="h-4 w-4"/>
<span>Bleu</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Black className="h-4 w-4"/>
<span>Noir</span>
<a className="flex flex-row gap-2 items-center" href="/commander/black">
<Black className="h-4 w-4"/>
<span>Noir</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Red className="h-4 w-4"/>
<span>Rouge</span>
<a className="flex flex-row gap-2 items-center" href="/commander/red">
<Red className="h-4 w-4"/>
<span>Rouge</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Green className="h-4 w-4"/>
<span>Vert</span>
<a className="flex flex-row gap-2 items-center" href="/commander/green">
<Green className="h-4 w-4"/>
<span>Vert</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Colorless className="h-4 w-4"/>
<span>Incolor</span>
<a className="flex flex-row gap-2 items-center" href="/commander/colorless">
<Colorless className="h-4 w-4"/>
<span>Incolor</span>
</a>
</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuPortal>
@ -206,54 +116,74 @@ export function NavigationBar ({ isLoggedIn, username}: NavigationProps) {
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuItem>
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<span>Azorius</span>
<a className="flex flex-row gap-2 items-center" href="/commander/azorius">
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<span>Azorius</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<span>Dimir</span>
<a className="flex flex-row gap-2 items-center" href="/commander/dimir">
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<span>Dimir</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<span>Rakdos</span>
<a className="flex flex-row gap-2 items-center" href="/commander/rakdos">
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<span>Rakdos</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<span>Gruul</span>
<a className="flex flex-row gap-2 items-center" href="/commander/gruul">
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<span>Gruul</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Green className="h-4 w-4"/>
<White className="h-4 w-4"/>
<span>Selesnya</span>
<a className="flex flex-row gap-2 items-center" href="/commander/selesnya">
<Green className="h-4 w-4"/>
<White className="h-4 w-4"/>
<span>Selesnya</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<White className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<span>Orzhov</span>
<a className="flex flex-row gap-2 items-center" href="/commander/orzhov">
<White className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<span>Orzhov</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Blue className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<span>Izzet</span>
<a className="flex flex-row gap-2 items-center" href="/commander/izzet">
<Blue className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<span>Izzet</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Black className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<span>Golgari</span>
<a className="flex flex-row gap-2 items-center" href="/commander/golgari">
<Black className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<span>Golgari</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Red className="h-4 w-4"/>
<White className="h-4 w-4"/>
<span>Boros</span>
<a className="flex flex-row gap-2 items-center" href="/commander/boros">
<Red className="h-4 w-4"/>
<White className="h-4 w-4"/>
<span>Boros</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Green className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<span>Simic</span>
<a className="flex flex-row gap-2 items-center" href="/commander/simic">
<Green className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<span>Simic</span>
</a>
</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuPortal>
@ -265,64 +195,84 @@ export function NavigationBar ({ isLoggedIn, username}: NavigationProps) {
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuItem>
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<span>Esper</span>
<a className="flex flex-row gap-2 items-center" href="/commander/esper">
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<span>Esper</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<span>Grixis</span>
<a className="flex flex-row gap-2 items-center" href="/commander/grixis">
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<span>Grixis</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<span>Jund</span>
<a className="flex flex-row gap-2 items-center" href="/commander/jund">
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<span>Jund</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<White className="h-4 w-4"/>
<span>Naya</span>
<a className="flex flex-row gap-2 items-center" href="/commander/naya">
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<White className="h-4 w-4"/>
<span>Naya</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Green className="h-4 w-4"/>
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<span>Bant</span>
<a className="flex flex-row gap-2 items-center" href="/commander/bant">
<Green className="h-4 w-4"/>
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<span>Bant</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<span>Abzan</span>
<a className="flex flex-row gap-2 items-center" href="/commander/abzan">
<White className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<span>Abzan</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Blue className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<White className="h-4 w-4"/>
<span>Jeskai</span>
<a className="flex flex-row gap-2 items-center" href="/commander/jeskai">
<Blue className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<White className="h-4 w-4"/>
<span>Jeskai</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Black className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<span>Sultai</span>
<a className="flex flex-row gap-2 items-center" href="/commander/sultai">
<Black className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<span>Sultai</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Red className="h-4 w-4"/>
<White className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<span>Mardu</span>
<a className="flex flex-row gap-2 items-center" href="/commander/mardu">
<Red className="h-4 w-4"/>
<White className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<span>Mardu</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Green className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<span>Temur</span>
<a className="flex flex-row gap-2 items-center" href="/commander/temur">
<Green className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<span>Temur</span>
</a>
</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuPortal>
@ -334,47 +284,59 @@ export function NavigationBar ({ isLoggedIn, username}: NavigationProps) {
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuItem>
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<span>Yore-Tiller</span>
<a className="flex flex-row gap-2 items-center" href="/commander/yore-tiller">
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<span>Yore-Tiller</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<span>Glint-Eye</span>
<a className="flex flex-row gap-2 items-center" href="/commander/glint-eye">
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<span>Glint-Eye</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<White className="h-4 w-4"/>
<span>Dune-Brood</span>
<a className="flex flex-row gap-2 items-center" href="/commander/dune-brood">
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<White className="h-4 w-4"/>
<span>Dune-Brood</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<span>Ink-Treader</span>
<a className="flex flex-row gap-2 items-center" href="/commander/ink-treader">
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<span>Ink-Treader</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<Green className="h-4 w-4"/>
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<span>Witch-Maw</span>
<a className="flex flex-row gap-2 items-center" href="/commander/witch-maw">
<Green className="h-4 w-4"/>
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<span>Witch-Maw</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem>
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<span>5 couleurs</span>
<a className="flex flex-row gap-2 items-center" href="/commander/five-color">
<White className="h-4 w-4"/>
<Blue className="h-4 w-4"/>
<Black className="h-4 w-4"/>
<Red className="h-4 w-4"/>
<Green className="h-4 w-4"/>
<span>5 couleurs</span>
</a>
</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuPortal>
@ -382,6 +344,35 @@ export function NavigationBar ({ isLoggedIn, username}: NavigationProps) {
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button>BSets</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuGroup>
{ bsetsList.length == 0 && (
<DropdownMenuItem>
<span>Loading</span>
</DropdownMenuItem>
)}
{ bsetsList.length != 0 && bsetsList.slice(0,7).map((bset) => (
<DropdownMenuItem>
<a href={"/bset/" + bset.sanitized_name} className="flex flex-row gap-2 items-center">
<div className="flex flex-row gap-1">
{ bset.icons.map((icon) => (
<img src={icon} className="w-4 h-4"/>
))}
</div>
<span>{bset.name}</span>
</a>
</DropdownMenuItem>
))}
<DropdownMenuItem>
<a href="/bset/all">Plus de BSets...</a>
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
<a href="/rules"><Button>Règles</Button></a>
</div>
<div className="flex flex-row gap-4">