"use client"; import { useCallback, useEffect, useRef, useState } from "react"; import { Address } from "@scaffold-ui/components"; import { useWatchBalance } from "@scaffold-ui/hooks"; import type { NextPage } from "next"; import { Address as AddressType, formatEther, parseEther } from "viem"; import { Amount, Roll, RollEvents, Winner, WinnerEvents } from "~~/app/dice/_components"; import { useScaffoldContract, useScaffoldEventHistory, useScaffoldReadContract, useScaffoldWriteContract, } from "~~/hooks/scaffold-eth"; const ROLL_ETH_VALUE = "0.002"; const MAX_TABLE_ROWS = 10; const DiceGame: NextPage = () => { const [rolls, setRolls] = useState([]); const [winners, setWinners] = useState([]); const videoRef = useRef(null); const [rolled, setRolled] = useState(false); const [isRolling, setIsRolling] = useState(false); const { data: riggedRollContract } = useScaffoldContract({ contractName: "RiggedRoll" }); const { data: riggedRollBalance } = useWatchBalance({ address: riggedRollContract?.address, }); const { data: prize } = useScaffoldReadContract({ contractName: "DiceGame", functionName: "prize" }); const { data: rollsHistoryData, isLoading: rollsHistoryLoading } = useScaffoldEventHistory({ contractName: "DiceGame", eventName: "Roll", watch: true, }); useEffect(() => { if ( !rollsHistoryLoading && Boolean(rollsHistoryData?.length) && (rollsHistoryData?.length as number) > rolls.length ) { setIsRolling(false); setRolls( rollsHistoryData?.map(({ args }) => ({ address: args.player as AddressType, amount: Number(args.amount), roll: (args.roll as bigint).toString(16).toUpperCase(), })) || [], ); } }, [rolls, rollsHistoryData, rollsHistoryLoading]); const { data: winnerHistoryData, isLoading: winnerHistoryLoading } = useScaffoldEventHistory({ contractName: "DiceGame", eventName: "Winner", watch: true, }); useEffect(() => { if ( !winnerHistoryLoading && Boolean(winnerHistoryData?.length) && (winnerHistoryData?.length as number) > winners.length ) { setIsRolling(false); setWinners( winnerHistoryData?.map(({ args }) => ({ address: args.winner as AddressType, amount: args.amount as bigint, })) || [], ); } }, [winnerHistoryData, winnerHistoryLoading, winners.length]); const { writeContractAsync: writeDiceGameAsync, isError: rollTheDiceError } = useScaffoldWriteContract({ contractName: "DiceGame", }); const { writeContractAsync: writeRiggedRollAsync, isError: riggedRollError } = useScaffoldWriteContract({ contractName: "RiggedRoll", }); const immediateStopRolling = useCallback(() => { setIsRolling(false); setRolled(false); }, []); useEffect(() => { if (rollTheDiceError || riggedRollError) { immediateStopRolling(); } }, [immediateStopRolling, riggedRollError, rollTheDiceError]); useEffect(() => { if (videoRef.current && !isRolling) { // show last frame videoRef.current.currentTime = 9999; } }, [isRolling]); return (
Roll a 0, 1, 2, 3, 4 or 5 to win the prize!
Prize:
Rigged Roll
Address:{" "}
{" "}
Balance:
{/* */}
{rolled ? ( isRolling ? (
); }; export default DiceGame;