"use client"; import { useEffect, useState } from "react"; import Web3 from "web3"; import GameList from "./GameList"; import GameModal from "./GameModal"; import { showErrorToast } from "@/app/lib/toast"; export default function Clash() { const [config, setConfig] = useState(null); const [web3, setWeb3] = useState(null); const [contract, setContract] = useState(null); const [status, setStatus] = useState(""); // Modal state const [isModalOpen, setIsModalOpen] = useState(false); const [selectedGameId, setSelectedGameId] = useState(); const [availableAccounts, setAvailableAccounts] = useState([]); const [selectedAccount, setSelectedAccount] = useState(""); const [balance, setBalance] = useState("0"); const handlePlayClick = (gameId: number) => { setSelectedGameId(gameId); setIsModalOpen(true); }; // Load config and contract useEffect(() => { const loadConfig = async () => { try { const response = await fetch("/crypto_clash/config.json"); const data = await response.json(); setConfig(data); const web3Instance = new Web3(data.API_URL); setWeb3(web3Instance); const contractInstance = new web3Instance.eth.Contract( data.GAME_ABI, data.GAME_CONTRACT_ADDRESS ); setContract(contractInstance); // Get accounts from MetaMask if (globalThis.window !== undefined && (globalThis as any).ethereum) { try { const accounts = await (globalThis as any).ethereum.request({ method: "eth_requestAccounts", }); setAvailableAccounts(accounts); setSelectedAccount(accounts[0]); } catch (err: any) { showErrorToast("MetaMask not available or user denied access: " + err.message); } } } catch (err: any) { showErrorToast("Failed to load config: " + err.message); } }; loadConfig(); }, []); // Fetch balance when selected account changes useEffect(() => { const fetchBalance = async () => { if (web3 && selectedAccount) { try { const balanceWei = await web3.eth.getBalance(selectedAccount); const balanceEth = web3.utils.fromWei(balanceWei, "ether"); setBalance(parseFloat(balanceEth).toFixed(4)); } catch (err: any) { showErrorToast("Failed to fetch balance: " + err.message); } } }; fetchBalance(); }, [web3, selectedAccount]); return (
Crypto Clash Logo

Crypto Clash

Browse and join games.

{availableAccounts.length > 0 ? ( ) : (

No accounts available

)}

Active Account:{" "} {selectedAccount ? `${selectedAccount.slice(0, 6)}...${selectedAccount.slice(-4)}` : "Not connected"}

Current Balance:{" "} {balance} ETH

Game Contract Address:{" "} {config?.GAME_CONTRACT_ADDRESS}

{/* Game Modal */} setIsModalOpen(false)} account={selectedAccount} contract={contract} config={config} web3={web3} setStatus={setStatus} />
); }