import React, { useState, useEffect } from "react" import HandleNavigate from "../../utils/HandleNavigate/HandleNavigate" import { FaPlus, FaFilter, FaCalendarAlt, FaArrowUp, FaArrowDown, FaSortAlphaDown, FaSortAlphaUp, FaQuestionCircle, FaChevronLeft, FaChevronRight, } from "react-icons/fa" import SearchBox from "../Search/SearchBox" import PopUp from "../PopUp/PopUp" import DeckInfoPopUp from "../PopUp/DeckInfoPopUp" const deckTypes = [ { label: "Luck", color: "var(--color-luck)" }, { label: "Question", color: "var(--color-question)" }, { label: "Joker", color: "var(--color-fun)" }, ] // initial state will be fetched from backend const origins = ["Mind", "Vállalati", "Saját"] const sortOptions = [ { value: "date-asc", label: ( <> ), }, { value: "date-desc", label: ( <> ), }, { value: "abc-asc", label: ( <> ), }, { value: "abc-desc", label: ( <> ), }, ] const DeckManager = () => { const { goDeckCreator } = HandleNavigate() 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 [selectedDeck, setSelectedDeck] = useState(null) const [allDecks, setAllDecks] = useState([]) // Összes pakli const [loading, setLoading] = useState(false) const [itemsPerPage, setItemsPerPage] = useState(20) const [currentPage, setCurrentPage] = useState(1) // Load all decks once useEffect(() => { let mounted = true const load = async () => { setLoading(true) try { // Load all decks (0-99 is the max limit = 100 decks) const result = await import('../../api/deckApi').then(m => m.getDecksPage(0, 99)) if (!mounted) return console.log('Loaded decks:', result) // Debug // Map backend deck shape to UI shape 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) // Debug 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 }) // Pagination logic - frontend only const totalDecks = filteredDecks.length const totalPages = Math.ceil(totalDecks / itemsPerPage) const startIndex = (currentPage - 1) * itemsPerPage const endIndex = startIndex + itemsPerPage const paginatedDecks = filteredDecks.slice(startIndex, endIndex) // Reset to page 1 when filters or items per page change useEffect(() => { setCurrentPage(1) }, [selectedType, selectedOrigin, search, sortBy, itemsPerPage]) return (
{/* 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 magyarázata

  • 📅↑ – Dátum szerint növekvő sorrendben (legrégebbi elöl)
  • 📅↓ – Dátum szerint csökkenő sorrendben (legújabb elöl)
  • A→Z – Név szerint növekvő sorrendben (A-tól Z-ig)
  • Z→A – Név szerint csökkenő sorrendben (Z-től A-ig)
)}
{/* Items per page selector and pagination info */}
Elemek oldalanként:
{totalDecks > 0 ? ( <> {startIndex + 1}-{Math.min(endIndex, totalDecks)} / {totalDecks} pakli ) : ( <>0 pakli )}
{/* Decks Grid */}
{/* Create New Deck (Mockup) */}
goDeckCreator()} className="flex flex-col items-center justify-center h-40 sm:h-48 bg-[color:var(--color-card)] border-2 border-dashed border-[color:var(--color-success)] rounded-xl sm:rounded-2xl cursor-pointer hover:bg-[color:var(--color-success)]/20 transition-all duration-200 shadow-lg" > Új pakli létrehozása
{/* Existing Decks (from backend) */} {loading && (
Betöltés...
)} {!loading && filteredDecks.length === 0 && (
Nincsenek mentett paklik.
)} {!loading && paginatedDecks.map((deck) => { const deckType = deckTypes.find((t) => t.label === deck.type) const borderColor = deckType ? deckType.color : "var(--color-success)" return (
setSelectedDeck(deck)} >
{deck.type === "Luck" ? "Szerencse" : deck.type === "Question" ? "Kérdés" : deck.type === "Fun" ? "Joker" : deck.type}

{deck.name}

Létrehozva: {deck.created}
) })}
{/* Pagination Controls */} {totalPages > 1 && (
{[...Array(totalPages)].map((_, index) => { const pageNum = index + 1 // Show first page, last page, current page and neighbors if ( pageNum === 1 || pageNum === totalPages || (pageNum >= currentPage - 1 && pageNum <= currentPage + 1) ) { return ( ) } else if ( pageNum === currentPage - 2 || pageNum === currentPage + 2 ) { return ( ... ) } return null })}
)}
{/* Deck Info Popup */} {selectedDeck && setSelectedDeck(null)} />}
) } export default DeckManager