Files
jackboxpartypack-gamepicker/frontend/src/components/GamePoolModal.jsx

102 lines
4.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import React from 'react';
function GamePoolModal({ games, onClose }) {
return (
<div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4">
<div className="bg-white dark:bg-gray-800 rounded-lg max-w-4xl w-full max-h-[90vh] overflow-hidden flex flex-col">
<div className="flex justify-between items-center p-4 sm:p-6 border-b dark:border-gray-700">
<div>
<h2 className="text-xl sm:text-2xl font-bold dark:text-gray-100">Available Game Pool</h2>
<p className="text-sm text-gray-600 dark:text-gray-400 mt-1">
{games.length} {games.length === 1 ? 'game' : 'games'} match your filters
</p>
</div>
<button
onClick={onClose}
className="text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 text-2xl"
>
×
</button>
</div>
<div className="overflow-y-auto p-4 sm:p-6">
{games.length === 0 ? (
<p className="text-gray-500 dark:text-gray-400 text-center py-8">
No games match your current filters. Try adjusting the filters or enabling more games.
</p>
) : (
<div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-3">
{games.map((game) => {
// Determine border color based on favor bias
const getBorderStyle = () => {
if (game.favor_bias === 1) {
return 'border-green-300 dark:border-green-700 bg-green-50 dark:bg-green-900/10';
}
if (game.favor_bias === -1) {
return 'border-red-300 dark:border-red-700 bg-red-50 dark:bg-red-900/10';
}
return 'border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-700';
};
return (
<div
key={game.id}
className={`border rounded-lg p-3 sm:p-4 ${getBorderStyle()}`}
>
<div className="flex items-start justify-between gap-2 mb-1">
<h3 className="font-semibold text-sm sm:text-base dark:text-gray-100 flex-1">
{game.title}
</h3>
{/* Show favor indicator */}
{game.favor_bias === 1 && (
<span className="text-xs font-semibold bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200 px-2 py-0.5 rounded whitespace-nowrap">
Favored
</span>
)}
{game.favor_bias === -1 && (
<span className="text-xs font-semibold bg-red-100 dark:bg-red-900 text-red-800 dark:text-red-200 px-2 py-0.5 rounded whitespace-nowrap">
Disfavored
</span>
)}
</div>
<p className="text-xs text-gray-600 dark:text-gray-400 mb-2">
{game.pack_name}
</p>
<div className="flex flex-wrap gap-2 text-xs">
<span className="bg-indigo-100 dark:bg-indigo-900 text-indigo-800 dark:text-indigo-200 px-2 py-1 rounded">
{game.min_players}-{game.max_players} players
</span>
{game.game_type && (
<span className="bg-gray-200 dark:bg-gray-600 text-gray-700 dark:text-gray-300 px-2 py-1 rounded">
{game.game_type}
</span>
)}
{game.play_count > 0 && (
<span className="bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200 px-2 py-1 rounded">
{game.play_count} plays
</span>
)}
</div>
</div>
);
})}
</div>
)}
</div>
<div className="border-t dark:border-gray-700 p-4 sm:p-6">
<button
onClick={onClose}
className="w-full bg-indigo-600 dark:bg-indigo-700 text-white py-2 sm:py-3 rounded-lg hover:bg-indigo-700 dark:hover:bg-indigo-800 transition"
>
Close
</button>
</div>
</div>
</div>
);
}
export default GamePoolModal;