sixth march
Thu Mar 06 2025 11:29:30 GMT+0000 (Coordinated Universal Time)
Saved by @Urvashi
// pages/SlotMachine.tsx import React, { useState, useEffect, useRef } from 'react'; import '../styles/mainslot.css'; import { Header } from '../components/Header'; import Reel from '../components/Reel'; import { GameButton } from '../components/GameButton'; import Registration from './Registration'; import spinSound from '../assets/audio/slot.mp3'; import axiosInstance from '../utils/axiosInstance'; import { GameConfig } from '../index'; interface SlotImage { id: number; image_path: string; section_number: number; } const SlotMachine: React.FC<GameConfig> = ({ gameTitle = '', titleColor = '', backgroundImage = '', reelBorder = '', buttonBackgroundColor = '', buttonTextColor = '', }) => { const [reels, setReels] = useState<string[][]>([]); const [isSoundOn, setIsSoundOn] = useState(true); const [slotImages, setSlotImages] = useState<SlotImage[]>([]); const [error, setError] = useState<string | null>(null); const [isSpinning, setIsSpinning] = useState(false); const [completedReels, setCompletedReels] = useState(0); const [isRegistrationOpen, setIsRegistrationOpen] = useState(false); const [spinCombination, setSpinCombination] = useState<string | null>(null); const [spinResult, setSpinResult] = useState<'win' | 'loss' | null>(null); const [spinKey, setSpinKey] = useState(0); const spinAudioRef = useRef(new Audio(spinSound)); const baseSpinDuration = 2000; const delayBetweenStops = 600; const DEFAULT_SLOT_COUNT = 3; useEffect(() => { spinAudioRef.current.loop = true; const fetchImages = async () => { try { const response = await axiosInstance.get('/api/slot/images'); if (response.data.status && response.data.data.images.length > 0) { const images = response.data.data.images; setSlotImages(images); // Log slotImages details after setting state console.log('Slot Images fetched from API:', images); } else { throw new Error(response.data.message || 'Failed to fetch images'); } } catch (error) { console.error('Error fetching slot images:', error); setError('Error fetching slot images'); setIsRegistrationOpen(true); } }; fetchImages(); setReels(Array.from({ length: DEFAULT_SLOT_COUNT }, () => [])); }, []); const handleSpin = () => { if (!isSpinning) { setIsRegistrationOpen(true); setSpinResult(null); } }; const handleRegistrationSubmit = ( username: string, phone: string, eligible: boolean, combination: string, result: string, ) => { console.log('handleRegistrationSubmit:', { username, phone, eligible, combination, result }); if (eligible) { setSpinCombination(combination); setSpinResult(result as 'win' | 'loss'); setIsSpinning(true); setCompletedReels(0); setIsRegistrationOpen(false); setSpinKey((prev) => prev + 1); if (isSoundOn) spinAudioRef.current.play(); } }; useEffect(() => { if (completedReels === reels.length && isSpinning) { setIsSpinning(false); if (isSoundOn) { spinAudioRef.current.pause(); spinAudioRef.current.currentTime = 0; } setTimeout(() => { setIsRegistrationOpen(true); }, 3500); } }, [completedReels, reels.length, isSpinning]); const handleReelComplete = () => { setCompletedReels((prev) => prev + 1); }; const toggleSound = () => { setIsSoundOn((prev) => { if (!prev && isSpinning) spinAudioRef.current.play(); else spinAudioRef.current.pause(); return !prev; }); }; // console.log('SlotMachine backgroundImage:', backgroundImage); // Debug return ( <div className="slot-machine"> <div id="framework-center" style={{ backgroundImage: `url(${backgroundImage})`, backgroundSize: 'cover', backgroundPosition: 'center', backgroundRepeat: 'no-repeat', }} > <div className="game-title" style={{ color: titleColor }}> <Header gameTitle={gameTitle} titleColor={titleColor} /> </div> <div className="control-buttons-container"> <GameButton variant="sound" isActive={isSoundOn} onClick={toggleSound} /> </div> <div className="reels-container" style={{ borderColor: reelBorder }}> {reels.map((_, index) => { const targetId = spinCombination ? parseInt(spinCombination[index] || '0') : -1; return ( <Reel key={`${index}-${spinKey}`} slotImages={slotImages} isSpinning={isSpinning} spinDuration={baseSpinDuration + index * delayBetweenStops} onSpinComplete={handleReelComplete} targetId={targetId} reelBorder={reelBorder} /> ); })} </div> <div className="spin-container"> <div className="spin-button-wrapper"> <GameButton variant="spin" onClick={handleSpin} disabled={isSpinning} buttonBackgroundColor={buttonBackgroundColor} buttonTextColor={buttonTextColor} reelBorder={reelBorder} /> </div> </div> </div> <Registration isOpen={isRegistrationOpen} setIsOpen={setIsRegistrationOpen} onSubmit={handleRegistrationSubmit} spinResult={isSpinning ? null : spinResult} error={error} /> </div> ); }; export default SlotMachine;
Comments