import { useState } from "react"; import Web3 from "web3"; import { Button } from "./Button"; import { Input } from "./Input"; interface LobbyProps { account: string; contract: any; config: Config | null; web3: Web3 | null; setStatus: (status: string) => void; } export default function Lobby({ account, contract, config, web3, setStatus, }: Readonly) { const [loading, setLoading] = useState(false); const [registerGameId, setRegisterGameId] = useState("0"); const [registerBet, setRegisterBet] = useState(""); const [betMin, setBetMin] = useState(""); const [activeGameIds, setActiveGameIds] = useState(""); const [contractBalance, setContractBalance] = useState(""); const [gameDetailsId, setGameDetailsId] = useState(""); const [gameDetails, setGameDetails] = useState(null); const [myActiveGameId, setMyActiveGameId] = useState(""); const [pastGameIndex, setPastGameIndex] = useState(""); const [pastGame, setPastGame] = useState(null); const [pastGamesCount, setPastGamesCount] = useState(""); const [whoAmI, setWhoAmI] = useState(""); // Read-only contract function handlers const handleGetBetMin = async () => { if (!contract || !web3) return; setLoading(true); try { const res = await contract.methods.BET_MIN().call(); setBetMin(web3.utils.fromWei(res, "ether") + " ETH"); } catch (err: any) { setStatus("Failed to fetch BET_MIN: " + err.message); } finally { setLoading(false); } }; const handleGetActiveGameIds = async () => { if (!contract) return; setLoading(true); try { const res = await contract.methods.getActiveGameIds().call(); setActiveGameIds(res.join(", ")); } catch (err: any) { setStatus("Failed to fetch active game IDs: " + err.message); } finally { setLoading(false); } }; const handleGetContractBalance = async () => { if (!contract || !web3) return; setLoading(true); try { const res = await contract.methods.getContractBalance().call(); setContractBalance(web3.utils.fromWei(res, "ether") + " ETH"); } catch (err: any) { setStatus("Failed to fetch contract balance: " + err.message); } finally { setLoading(false); } }; const handleGetGameDetails = async () => { if (!contract) return; setLoading(true); try { const res = await contract.methods .getGameDetails(Number(gameDetailsId)) .call(); setGameDetails(res); } catch (err: any) { setStatus("Failed to fetch game details: " + err.message); } finally { setLoading(false); } }; const handleGetMyActiveGameId = async () => { if (!contract || !account) return; setLoading(true); try { const res = await contract.methods .getMyActiveGameId() .call({ from: account }); setMyActiveGameId(res.toString()); } catch (err: any) { setStatus("Failed to fetch my active game ID: " + err.message); } finally { setLoading(false); } }; const handleGetPastGame = async () => { if (!contract) return; setLoading(true); try { const res = await contract.methods .getPastGame(Number(pastGameIndex)) .call(); setPastGame(res); } catch (err: any) { setStatus("Failed to fetch past game: " + err.message); } finally { setLoading(false); } }; const handleGetPastGamesCount = async () => { if (!contract) return; setLoading(true); try { const res = await contract.methods.getPastGamesCount().call(); setPastGamesCount(res.toString()); } catch (err: any) { setStatus("Failed to fetch past games count: " + err.message); } finally { setLoading(false); } }; const handleWhoAmI = async () => { if (!contract || !account) return; setLoading(true); try { const res = await contract.methods.whoAmI().call({ from: account }); setWhoAmI(res.toString()); } catch (err: any) { setStatus("Failed to fetch whoAmI: " + err.message); } finally { setLoading(false); } }; const handleRegister = async () => { if (!contract || !web3 || !account) return; setLoading(true); setStatus(""); try { console.log(registerBet); const bet = web3.utils.toWei(registerBet || "0.01", "ether"); console.log(bet); console.log(web3.utils.toHex(bet)); const tx = contract.methods.register(Number(registerGameId || 0)); const gas = await tx.estimateGas({ from: account, value: bet }); const result = await (globalThis as any).ethereum.request({ method: "eth_sendTransaction", params: [ { from: account, to: config?.GAME_CONTRACT_ADDRESS, data: tx.encodeABI(), value: web3.utils.numberToHex(bet), gas: web3.utils.toHex(gas), chainId: web3.utils.toHex(await web3.eth.net.getId()), }, ], }); setStatus("Register tx sent: " + result); } catch (err: any) { setStatus("Register failed: " + err.message); console.error(err); } finally { setLoading(false); } }; return (

register(uint gameId) (payable)

setRegisterGameId(e.target.value)} className="mr-2" /> setRegisterBet(e.target.value)} className="mr-2" />
Enter amount in ETH (e.g., 0.01 for 0.01 ETH). Entering 1 means 1 full ETH.
{betMin}
{activeGameIds}
{contractBalance}
setGameDetailsId(e.target.value)} className="mr-2" /> {gameDetails &&
{JSON.stringify(gameDetails, (_, v) => typeof v === 'bigint' ? v.toString() : v, 2)}
}

{myActiveGameId}
setPastGameIndex(e.target.value)} className="mr-2" /> {pastGame &&
{JSON.stringify(pastGame, (_, v) => typeof v === 'bigint' ? v.toString() : v, 2)}
}

{pastGamesCount}
{whoAmI}
); }