move state and functions to reveal component

This commit is contained in:
SamKry
2025-11-18 18:58:08 +01:00
parent 04f8e66204
commit 011708c24e
2 changed files with 86 additions and 99 deletions

View File

@@ -1,43 +1,105 @@
import { useState } from "react";
import Web3 from "web3";
interface RevealProps {
revealMove: string;
setRevealMove: (v: string) => void;
handleReveal: () => void;
loading: boolean;
account: string;
contract: any;
bothRevealed: string;
handleBothRevealed: () => void;
playerARevealed: string;
handlePlayerARevealed: () => void;
playerBRevealed: string;
handlePlayerBRevealed: () => void;
config: Config | null;
web3: Web3 | null;
setStatus: (status: string) => void;
}
export default function Reveal({
revealMove,
setRevealMove,
handleReveal,
loading,
account,
contract,
bothRevealed,
handleBothRevealed,
playerARevealed,
handlePlayerARevealed,
playerBRevealed,
handlePlayerBRevealed,
config,
web3,
setStatus,
}: Readonly<RevealProps>) {
const [loading, setLoading] = useState(false);
const [revealMove, setRevealMove] = useState<string>("");
const [bothRevealed, setBothRevealed] = useState<string>("");
const [playerARevealed, setPlayerARevealed] = useState<string>("");
const [playerBRevealed, setPlayerBRevealed] = useState<string>("");
const [revealTimeLeft, setRevealTimeLeft] = useState<string>("");
// Reveal phase read-only handlers
const handleBothRevealed = async () => {
if (!contract) return;
setLoading(true);
try {
const res = await contract.methods.bothRevealed().call();
setBothRevealed(res ? "true" : "false");
} catch (err: any) {
setStatus("Failed to fetch bothRevealed: " + err.message);
} finally {
setLoading(false);
}
};
const handlePlayerARevealed = async () => {
if (!contract) return;
setLoading(true);
try {
const res = await contract.methods.playerARevealed().call();
setPlayerARevealed(res ? "true" : "false");
} catch (err: any) {
setStatus("Failed to fetch playerARevealed: " + err.message);
} finally {
setLoading(false);
}
};
const handlePlayerBRevealed = async () => {
if (!contract) return;
setLoading(true);
try {
const res = await contract.methods.playerBRevealed().call();
setPlayerBRevealed(res ? "true" : "false");
} catch (err: any) {
setStatus("Failed to fetch playerBRevealed: " + err.message);
} finally {
setLoading(false);
}
};
const handleRevealTimeLeft = async () => {
if (!contract) return;
setLoading(true);
try {
const res = await contract.methods.revealTimeLeft().call();
setRevealTimeLeft(res.toString());
} catch (err: any) {
console.error("Failed to fetch revealTimeLeft: " + err.message);
setStatus("Failed to fetch revealTimeLeft: " + err.message);
} finally {
setLoading(false);
}
};
const handleReveal = async () => {
if (!contract || !web3 || !account) return;
setLoading(true);
setStatus("");
try {
const tx = contract.methods.reveal(revealMove);
const gas = await tx.estimateGas({ from: account });
const result = await (globalThis as any).ethereum.request({
method: "eth_sendTransaction",
params: [
{
from: account,
to: config?.GAME_CONTRACT_ADDRESS,
data: tx.encodeABI(),
gas: web3.utils.toHex(gas),
chainId: web3.utils.toHex(await web3.eth.net.getId()),
},
],
});
setStatus("Reveal tx sent: " + result);
} catch (err: any) {
setStatus("Reveal failed: " + err.message);
} finally {
setLoading(false);
}
};
return (

View File

@@ -19,7 +19,6 @@ export default function Clash() {
const [registerGameId, setRegisterGameId] = useState<string>("0");
const [registerBet, setRegisterBet] = useState<string>("");
const [revealMove, setRevealMove] = useState<string>("");
// State for read-only contract calls
const [betMin, setBetMin] = useState<string>("");
const [activeGameIds, setActiveGameIds] = useState<string>("");
@@ -31,46 +30,6 @@ export default function Clash() {
const [pastGame, setPastGame] = useState<any>(null);
const [pastGamesCount, setPastGamesCount] = useState<string>("");
const [whoAmI, setWhoAmI] = useState<string>("");
const [bothRevealed, setBothRevealed] = useState<string>("");
const [playerARevealed, setPlayerARevealed] = useState<string>("");
const [playerBRevealed, setPlayerBRevealed] = useState<string>("");
// Reveal phase read-only handlers
const handleBothRevealed = async () => {
if (!contract) return;
setLoading(true);
try {
const res = await contract.methods.bothRevealed().call();
setBothRevealed(res ? "true" : "false");
} catch (err: any) {
setStatus("Failed to fetch bothRevealed: " + err.message);
} finally {
setLoading(false);
}
};
const handlePlayerARevealed = async () => {
if (!contract) return;
setLoading(true);
try {
const res = await contract.methods.playerARevealed().call();
setPlayerARevealed(res ? "true" : "false");
} catch (err: any) {
setStatus("Failed to fetch playerARevealed: " + err.message);
} finally {
setLoading(false);
}
};
const handlePlayerBRevealed = async () => {
if (!contract) return;
setLoading(true);
try {
const res = await contract.methods.playerBRevealed().call();
setPlayerBRevealed(res ? "true" : "false");
} catch (err: any) {
setStatus("Failed to fetch playerBRevealed: " + err.message);
} finally {
setLoading(false);
}
};
// Read-only contract function handlers
const handleGetBetMin = async () => {
if (!contract || !web3) return;
@@ -245,33 +204,6 @@ export default function Clash() {
}
};
const handleReveal = async () => {
if (!contract || !web3 || !account) return;
setLoading(true);
setStatus("");
try {
const tx = contract.methods.reveal(revealMove);
const gas = await tx.estimateGas({ from: account });
const result = await (globalThis as any).ethereum.request({
method: "eth_sendTransaction",
params: [
{
from: account,
to: config?.GAME_CONTRACT_ADDRESS,
data: tx.encodeABI(),
gas: web3.utils.toHex(gas),
chainId: web3.utils.toHex(await web3.eth.net.getId()),
},
],
});
setStatus("Reveal tx sent: " + result);
} catch (err: any) {
setStatus("Reveal failed: " + err.message);
} finally {
setLoading(false);
}
};
return (
<div className="flex min-h-screen items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-slate-900 dark:to-slate-800 font-sans">
<main className="w-full max-w-3xl mx-auto py-12 px-6">
@@ -372,18 +304,11 @@ export default function Clash() {
)}
{phase === "reveal" && (
<Reveal
revealMove={revealMove}
setRevealMove={setRevealMove}
handleReveal={handleReveal}
loading={loading}
account={account}
contract={contract}
bothRevealed={bothRevealed}
handleBothRevealed={handleBothRevealed}
playerARevealed={playerARevealed}
handlePlayerARevealed={handlePlayerARevealed}
playerBRevealed={playerBRevealed}
handlePlayerBRevealed={handlePlayerBRevealed}
config={config}
web3={web3}
setStatus={setStatus}
/>
)}
</div>