import { motion } from 'motion/react' import { useCallback, useState } from 'react' import add from '@/assets/game/add.webp' import arrow from '@/assets/game/arrow.webp' import chipBg from '@/assets/game/chip-bg.webp' import chipLineBg from '@/assets/game/chip-line-bg.webp' import confirmBg from '@/assets/game/confirm-bg.png' import controlBg from '@/assets/game/control-bg.png' import leftBottomBg from '@/assets/game/left-bg.webp' import reduce from '@/assets/game/reduce.webp' import totalBg from '@/assets/game/total-bg.webp' import { SmartBackground } from '@/components/smart-background.tsx' import { SmartImage } from '@/components/smart-image.tsx' import { ACTION_OPTIONS, CHIP_OPTIONS } from '@/constants' import { cn } from '@/lib/utils' export function DesktopControl() { const [chips, setChips] = useState(CHIP_OPTIONS) const [selectedChipId, setSelectedChipId] = useState( CHIP_OPTIONS[CHIP_OPTIONS.length - 1]?.id ?? '', ) const [clickedId, setClickedId] = useState(null) const [hidingId, setHidingId] = useState(null) const [confirmClicked, setConfirmClicked] = useState(false) const selectedChip = chips.find((chip) => chip.id === selectedChipId) ?? CHIP_OPTIONS[0] const handleChipClick = (chipId: string) => { setSelectedChipId(chipId) setChips((current) => { const next = [...current] const index = next.findIndex((chip) => chip.id === chipId) if (index === -1 || index === next.length - 1) { return next } const [selected] = next.splice(index, 1) next.push(selected) return next }) } const handleActionClick = useCallback((id: string) => { setClickedId(id) setTimeout(() => { setClickedId(null) setHidingId(id) setTimeout(() => { setHidingId(null) }, 180) }, 200) }, []) const handleConfirmClick = useCallback(() => { setConfirmClicked(true) setTimeout(() => { setConfirmClicked(false) }, 200) }, []) return (
TREBD
MAP
{chips.map((chip) => { const isSelected = chip.id === selectedChipId return ( handleChipClick(chip.id)} whileTap={{ scale: 0.94 }} transition={{ layout: { type: 'spring', stiffness: 420, damping: 32, }, duration: 0.18, }} className={ 'relative flex h-design-70 w-design-70 shrink-0 cursor-pointer items-center justify-center rounded-full' } > ) })}
{selectedChip.value}
SELECTED:3/5
Total Bet:150
{ACTION_OPTIONS.map(({ id, label, Icon, bg }) => { const isClicked = clickedId === id const isHiding = hidingId === id const showBg = isClicked || isHiding return ( handleActionClick(id)} whileHover={{ y: -1, scale: 1.01 }} whileTap={{ scale: 0.96 }} className={cn( 'relative flex h-full flex-1 cursor-pointer items-center justify-center overflow-hidden', { '-translate-x-1.5': id === 'auto-spin' }, )} > {showBg && ( )}
{label}
) })}
{confirmClicked && ( )} confirm
) }