khofo / client /src /components /modals /ViewHandModal.tsx
Tantawi65
Initial commit
a7b6b46
import { useState } from 'react';
import { motion } from 'framer-motion';
import { Card } from '../game/Card';
import { emitBurnCard } from '../../socket/socket';
import type { CardInstance } from '@shared/types';
import { useGameStore } from '../../store/gameStore';
interface ViewHandModalProps {
cards: CardInstance[];
targetId?: string;
onClose: () => void;
}
export function ViewHandModal({ cards, targetId, onClose }: ViewHandModalProps) {
const [selectedCard, setSelectedCard] = useState<string | null>(null);
const gameState = useGameStore((state) => state.gameState);
const targetName = gameState?.players.find(p => p.id === targetId)?.name ?? 'Opponent';
const handleBurn = () => {
if (selectedCard) {
emitBurnCard(selectedCard);
onClose();
}
};
return (
<motion.div
className="modal-overlay"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
>
<motion.div
className="modal-content max-w-2xl"
initial={{ scale: 0.8, opacity: 0 }}
animate={{ scale: 1, opacity: 1 }}
exit={{ scale: 0.8, opacity: 0 }}
onClick={(e) => e.stopPropagation()}
>
<h2 className="modal-title">👁️ {targetName}'s Hand</h2>
<p className="text-papyrus text-center mb-2">
Select one card to BURN (discard)
</p>
<p className="text-mummy-red text-center text-sm mb-4">
🔥 The chosen card will be destroyed!
</p>
<div className="flex justify-center gap-3 flex-wrap mb-6">
{cards.map((card, index) => (
<motion.div
key={card.instanceId}
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: index * 0.1 }}
onClick={() => setSelectedCard(card.instanceId)}
>
<Card
card={card}
size="medium"
selected={selectedCard === card.instanceId}
/>
</motion.div>
))}
</div>
<div className="flex gap-3">
<button onClick={onClose} className="btn btn-secondary flex-1">
Cancel
</button>
<button
onClick={handleBurn}
disabled={!selectedCard}
className="btn btn-danger flex-1"
>
🔥 Burn Card
</button>
</div>
</motion.div>
</motion.div>
);
}