sixth march

PHOTO EMBED

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;
content_copyCOPY