import React, { useEffect, useState } from "react" import { useNavigate, useLocation } from "react-router-dom" import Navbar from "../../components/Navbar/Navbar.jsx" import Background from "../../assets/backgrounds/Background.jsx" import Footer from "../../components/Footer/Footer.jsx" import useRequireAuth from "../../hooks/useRequireAuth.jsx" import ButtonGreen from "../../components/Buttons/ButtonGreen.jsx" import { FaFilter, FaCalendarAlt, FaArrowUp, FaArrowDown, FaSortAlphaDown, FaSortAlphaUp, FaQuestionCircle, FaCheckCircle, FaCircle, } from "react-icons/fa" import SearchBox from "../../components/Search/SearchBox.jsx" import PopUp from "../../components/PopUp/PopUp.jsx" import { motion } from "framer-motion" const deckTypes = [ { label: "Luck", color: "var(--color-luck)" }, { label: "Question", color: "var(--color-question)" }, { label: "Joker", color: "var(--color-fun)" }, ] const origins = ["Mind", "Vállalati", "Saját"] const sortOptions = [ { value: "date-asc", label: "📅↑" }, { value: "date-desc", label: "📅↓" }, { value: "abc-asc", label: "A→Z" }, { value: "abc-desc", label: "Z→A" }, ] const ChooseDeck = () => { const location = useLocation() const locationUsername = location.state?.username ?? null // always call hook (hooks must be called unconditionally) and use as fallback const [authUsername] = useRequireAuth({ key: "username", redirectTo: "/" }) // prefer passed username (from navigate state) over authenticated username const username = locationUsername ?? authUsername const navigate = useNavigate() const [selectedType, setSelectedType] = useState("All") const [selectedOrigin, setSelectedOrigin] = useState("Mind") const [sortBy, setSortBy] = useState("date-desc") const [search, setSearch] = useState("") const [showSortHelp, setShowSortHelp] = useState(false) const [allDecks, setAllDecks] = useState([]) const [loading, setLoading] = useState(false) const [selectedDeckIds, setSelectedDeckIds] = useState([]) // Load all decks once useEffect(() => { let mounted = true const load = async () => { setLoading(true) try { const result = await import("../../api/deckApi.js").then((m) => m.getDecksPage(0, 99)) if (!mounted) return console.log("Loaded decks:", result) const mapped = (result.decks || []).map((d) => ({ id: d.id, name: d.name, type: d.type === 2 ? "Question" : d.type === 1 ? "Joker" : "Luck", created: d.creationdate ? new Date(d.creationdate).toLocaleDateString() : "", origin: d.ctype === 2 ? "Vállalati" : d.ctype === 0 ? "Mind" : "Saját", raw: d, })) console.log("Mapped decks:", mapped) setAllDecks(mapped) } catch (err) { console.error("Failed to load decks", err) } finally { setLoading(false) } } load() return () => { mounted = false } }, []) // Filter logic let filteredDecks = allDecks.filter((deck) => { const typeMatch = selectedType === "All" || deck.type === selectedType const originMatch = selectedOrigin === "Mind" || deck.origin === selectedOrigin const searchMatch = !search || deck.name.toLowerCase().includes(search.toLowerCase()) return typeMatch && originMatch && searchMatch }) // Sort logic filteredDecks = [...filteredDecks].sort((a, b) => { if (sortBy === "date-asc") { return a.created.localeCompare(b.created) } else if (sortBy === "date-desc") { return b.created.localeCompare(a.created) } else if (sortBy === "abc-asc") { return a.name.localeCompare(b.name) } else if (sortBy === "abc-desc") { return b.name.localeCompare(a.name) } return 0 }) // Toggle deck selection const toggleDeckSelection = (deckId) => { setSelectedDeckIds((prev) => { if (prev.includes(deckId)) { return prev.filter((id) => id !== deckId) } else { return [...prev, deckId] } }) } // Handle continue button const handleContinue = () => { if (selectedDeckIds.length === 0) { alert("Kérlek válassz ki legalább egy paklit!") return } console.log("Kiválasztott pakli ID-k:", selectedDeckIds) navigate("/playersetup", { state: { deckIds: selectedDeckIds } }) } return (
{/* Title */} Válassz Paklikat a Játékhoz Válaszd ki azokat a paklikat, amelyekkel játszani szeretnél. Több paklit is kiválaszthatsz egyszerre. {/* Filters */}
setSearch(e.target.value)} width={240} placeholder="Keresés..." className="mr-4" /> Típus: {deckTypes.map((type) => ( ))} Eredet: Rendezés:
{showSortHelp && ( setShowSortHelp(false)}>

Rendezési lehetőségek

  • 📅↑ – Dátum szerint növekvő
  • 📅↓ – Dátum szerint csökkenő
  • A→Z – Név szerint növekvő
  • Z→A – Név szerint csökkenő
)} {/* Selection Info */}
Kiválasztva: {selectedDeckIds.length} pakli
{/* Decks Grid */}
{loading && (
Betöltés...
)} {!loading && filteredDecks.length === 0 && (
Nincsenek elérhető paklik.
)} {!loading && filteredDecks.map((deck) => { const deckType = deckTypes.find((t) => t.label === deck.type) const borderColor = deckType ? deckType.color : "var(--color-success)" const isSelected = selectedDeckIds.includes(deck.id) return (
toggleDeckSelection(deck.id)} > {/* Selection Indicator */}
{isSelected ? ( ) : ( )}
{deck.type === "Luck" ? "Szerencse" : deck.type === "Question" ? "Kérdés" : "Joker"}

{deck.name}

Létrehozva: {deck.created}
) })}
{/* Continue Button */}
) } export default ChooseDeck