Xenova's picture
Xenova HF Staff
Upload application
59c3ada verified
import { useState } from "react";
import type React from "react";
import { Pencil } from "lucide-react";
interface OptionCardProps {
title: string;
options: string[];
selected: string;
onSelect: (value: string) => void;
customValue: string;
onCustomChange: (value: string) => void;
isShuffling: boolean;
isVisible: boolean;
playPopSound: () => void;
playHoverSound: () => void;
}
const OptionCard: React.FC<OptionCardProps> = ({
title,
options,
selected,
onSelect,
customValue,
onCustomChange,
isShuffling,
isVisible,
playPopSound,
playHoverSound,
}) => {
const [isCustom, setIsCustom] = useState(false);
const handleSelect = (option: string) => {
playPopSound();
setIsCustom(false);
onSelect(option);
onCustomChange("");
};
const handleCustomClick = () => {
playPopSound();
setIsCustom(true);
onSelect("");
};
const shuffleClass = isShuffling ? "animate-shake" : "";
const visibilityClass = isVisible ? "animate-slide-in opacity-100" : "opacity-0 pointer-events-none";
return (
<div
className={`bg-white border-2 border-black rounded-xl p-6 shadow-[6px_6px_0px_rgba(0,0,0,0.1)] transition-opacity duration-500 ${shuffleClass} ${visibilityClass}`}
>
<h3 className="text-2xl font-bold mb-4">{title}</h3>
<div className="flex flex-wrap gap-3">
{options.map((option) => (
<button
key={option}
onClick={() => handleSelect(option)}
onMouseEnter={playHoverSound}
className={`font-semibold py-2 px-4 border-2 rounded-md transition-all duration-150 transform hover:-translate-y-0.5 active:translate-y-0 ${selected === option && !isCustom ? "bg-black text-white border-black" : "bg-gray-100 hover:bg-gray-200 border-gray-300"}`}
>
{option}
</button>
))}
<button
onClick={handleCustomClick}
onMouseEnter={playHoverSound}
className={`font-semibold py-2 px-4 border-2 rounded-md transition-all duration-150 flex items-center gap-2 transform hover:-translate-y-0.5 active:translate-y-0 ${isCustom ? "bg-black text-white border-black" : "bg-gray-100 hover:bg-gray-200 border-gray-300"}`}
>
<Pencil size={16} />
Write your own
</button>
</div>
{isCustom && (
<input
type="text"
value={customValue}
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
onCustomChange(e.target.value);
onSelect("");
}}
placeholder="Enter your own option..."
className="mt-4 w-full p-3 border-2 border-black rounded-lg focus:outline-none focus:ring-2 focus:ring-yellow-400"
/>
)}
</div>
);
};
export default OptionCard;