"use client"; import React, { useState, useEffect, useCallback } from "react"; import { Sparkles, HelpCircle, CheckCircle2, RotateCcw } from "lucide-react"; interface MemoryCard { id: number; content: string; pairId: string; isFlipped: boolean; isMatched: boolean; } interface MemoryPlayerProps { title: string; pairs: { id: string, content: string }[]; onComplete: (score: number) => void; } export default function MemoryPlayer({ title, pairs: initialPairs, onComplete }: MemoryPlayerProps) { const [cards, setCards] = useState([]); const [flipped, setFlipped] = useState([]); const [moves, setMoves] = useState(0); const [status, setStatus] = useState<"playing" | "success">("playing"); const initializeGame = useCallback(() => { const gameCards: MemoryCard[] = []; initialPairs.forEach((pair, idx) => { // Add two of each gameCards.push({ id: idx * 2, content: pair.content, pairId: pair.id, isFlipped: false, isMatched: false }); gameCards.push({ id: idx * 2 + 1, content: pair.content, pairId: pair.id, isFlipped: false, isMatched: false }); }); // Shuffle setCards(gameCards.sort(() => Math.random() - 0.5)); setFlipped([]); setMoves(0); setStatus("playing"); }, [initialPairs]); useEffect(() => { initializeGame(); }, [initializeGame]); const handleFlip = (id: number) => { if (flipped.length === 2 || status === "success") return; const cardIndex = cards.findIndex(c => c.id === id); if (cards[cardIndex].isMatched || cards[cardIndex].isFlipped) return; const updatedCards = [...cards]; updatedCards[cardIndex].isFlipped = true; setCards(updatedCards); const newFlipped = [...flipped, id]; setFlipped(newFlipped); if (newFlipped.length === 2) { setMoves(m => m + 1); checkMatch(newFlipped); } }; const checkMatch = (currentFlipped: number[]) => { const [id1, id2] = currentFlipped; const card1 = cards.find(c => c.id === id1)!; const card2 = cards.find(c => c.id === id2)!; if (card1.pairId === card2.pairId) { // Match found setTimeout(() => { const updatedCards = cards.map(c => (c.id === id1 || c.id === id2) ? { ...c, isMatched: true } : c ); setCards(updatedCards); setFlipped([]); if (updatedCards.every(c => c.isMatched)) { setStatus("success"); onComplete(1.0); } }, 500); } else { // No match setTimeout(() => { const updatedCards = cards.map(c => (c.id === id1 || c.id === id2) ? { ...c, isFlipped: false } : c ); setCards(updatedCards); setFlipped([]); }, 1000); } }; return (

{title}

Brain Training Level: Beginner
Moves
{moves}
{cards.map((card) => (
handleFlip(card.id)} className="perspective-1000 h-40 cursor-pointer group" >
{/* Card Front (Hidden) */}
{/* Card Back (Content) */}
{card.content} {card.isMatched && (
)}
))}
{status === "success" && (

BRAVO!

Finished in {moves} moves

)}
); }