feat: add sticker visibility toggle UI with pulse animation
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -34,6 +34,16 @@ function Picker() {
|
|||||||
const [sessionEnded, setSessionEnded] = useState(false);
|
const [sessionEnded, setSessionEnded] = useState(false);
|
||||||
const [stickerMode, setStickerMode] = useState('auto');
|
const [stickerMode, setStickerMode] = useState('auto');
|
||||||
const stickerSendRef = useRef(null);
|
const stickerSendRef = useRef(null);
|
||||||
|
const [stickerPulse, setStickerPulse] = useState(false);
|
||||||
|
const prevStickerModeRef = useRef(stickerMode);
|
||||||
|
useEffect(() => {
|
||||||
|
if (stickerMode === 'auto' && prevStickerModeRef.current !== 'auto') {
|
||||||
|
setStickerPulse(true);
|
||||||
|
const timer = setTimeout(() => setStickerPulse(false), 2000);
|
||||||
|
return () => clearTimeout(timer);
|
||||||
|
}
|
||||||
|
prevStickerModeRef.current = stickerMode;
|
||||||
|
}, [stickerMode]);
|
||||||
|
|
||||||
// Filters
|
// Filters
|
||||||
const [playerCount, setPlayerCount] = useState('');
|
const [playerCount, setPlayerCount] = useState('');
|
||||||
@@ -874,6 +884,44 @@ function Picker() {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* Sticker Visibility Toggle */}
|
||||||
|
<div
|
||||||
|
className={`flex items-center justify-between border rounded-lg p-3 mb-4 transition-all duration-300 ${
|
||||||
|
stickerPulse
|
||||||
|
? 'border-indigo-400 dark:border-indigo-500 bg-indigo-50 dark:bg-indigo-900/20 animate-pulse'
|
||||||
|
: 'border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<span className="text-sm font-semibold text-gray-700 dark:text-gray-300">Stickers</span>
|
||||||
|
<div className="flex border border-gray-300 dark:border-gray-600 rounded-lg overflow-hidden">
|
||||||
|
{[
|
||||||
|
{ value: 'auto', label: 'Auto', activeClass: 'bg-gray-500 text-white' },
|
||||||
|
{ value: 'show', label: 'Show', activeClass: 'bg-green-500 text-white' },
|
||||||
|
{ value: 'hide', label: 'Hide', activeClass: 'bg-red-500 text-white' },
|
||||||
|
].map((opt, i) => (
|
||||||
|
<button
|
||||||
|
key={opt.value}
|
||||||
|
onClick={() => {
|
||||||
|
setStickerMode(opt.value);
|
||||||
|
stickerSendRef.current?.(opt.value);
|
||||||
|
}}
|
||||||
|
disabled={!stickerSendRef.current}
|
||||||
|
className={`px-3 py-1.5 text-xs font-medium transition ${
|
||||||
|
i === 1 ? 'border-x border-gray-300 dark:border-gray-600 ' : ''
|
||||||
|
}${
|
||||||
|
stickerMode === opt.value
|
||||||
|
? opt.activeClass
|
||||||
|
: 'bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300'
|
||||||
|
}${
|
||||||
|
!stickerSendRef.current ? ' opacity-50 cursor-not-allowed' : ''
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{opt.label}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Poll Leader Indicator */}
|
{/* Poll Leader Indicator */}
|
||||||
{leadingGame && (
|
{leadingGame && (
|
||||||
<div className="bg-indigo-50 dark:bg-indigo-900/20 border border-indigo-200 dark:border-indigo-800 rounded-lg p-3 sm:p-4 mb-4">
|
<div className="bg-indigo-50 dark:bg-indigo-900/20 border border-indigo-200 dark:border-indigo-800 rounded-lg p-3 sm:p-4 mb-4">
|
||||||
|
|||||||
Reference in New Issue
Block a user