idle_moloch/app/src/providers/PlayerProvider.tsx
Mitja Belak 8c8ca58607
Some checks failed
CI / Foundry project (push) Waiting to run
CI / Foundry project (pull_request) Has been cancelled
Enables registrations with RGCVII and ETH
2024-10-28 18:31:41 +01:00

181 lines
4.3 KiB
TypeScript

import React, { createContext, ReactNode, useCallback, useContext, useEffect, useState } from 'react'
import { useAccount, useReadContract, useWriteContract } from 'wagmi'
import contractAbi from "../../../out/RaidGeld.sol/RaidGeld.json"
import { Hash, parseEther } from 'viem'
import contracts from '../../contract_address'
import WaitingForTxModal from '../components/WaitingForTxModal'
const { contractAddress, daoTokenAddress } = contracts
const abi = contractAbi.abi
export type UnitType = 0 | 1 | 2 | 3
export interface Player {
created_at: bigint,
last_raided_at: bigint,
total_minted: bigint
}
export interface Army {
anointed: { level: number }
apprentice: { level: number }
champion: { level: number }
moloch_denier: { level: number }
profit_per_second: bigint
}
export interface PlayerContextType {
isRegistered: boolean,
player: null | Player,
army: null | Army,
balance: bigint,
register: (arg: "ETH" | "RGCVII") => void,
raid: () => void,
addUnit: (unit: UnitType) => void
}
const PlayerContext = createContext<PlayerContextType>({
isRegistered: false,
player: null,
army: null,
balance: BigInt(0),
register: () => { },
raid: () => { },
addUnit: () => { }
});
const PlayerProvider = ({ children }: { children: ReactNode }) => {
const { address, isConnected } = useAccount();
const { writeContract, error } = useWriteContract();
const [[txHash, callbackFn], setHashAndCallback] = useState<[Hash | null, () => void]>([null, () => { }])
useEffect(() => {
console.warn(error)
}, [error])
const resetHashAndCallback = useCallback(() => {
setHashAndCallback([null, () => { }])
}, [])
const { data: isRegistered } = useReadContract({
address: contractAddress,
abi,
functionName: 'isRegistered',
args: [address],
query: {
enabled: isConnected,
refetchInterval: 15,
}
});
const { data: balance, } = useReadContract({
address: contractAddress,
abi,
functionName: 'balanceOf',
args: [address],
query: {
refetchInterval: 15,
enabled: isConnected
}
});
const { data: player } = useReadContract({
address: contractAddress,
abi,
functionName: 'getPlayer',
args: [address],
query: {
enabled: isConnected,
refetchInterval: 15
}
});
const { data: army } = useReadContract({
address: contractAddress,
abi,
functionName: 'getArmy',
args: [address],
query: {
enabled: isConnected,
refetchInterval: 15
}
});
console.log(balance, player, army)
const register = useCallback((arg: "RGCVII" | "ETH") => {
if (arg === 'ETH') {
writeContract({
abi,
address: contractAddress,
functionName: 'register_eth',
value: parseEther("0.0005"),
}, {
onSuccess: (hash) => {
setHashAndCallback([hash, resetHashAndCallback])
}
})
} else if (arg === "RGCVII") {
writeContract({
abi,
address: daoTokenAddress,
functionName: 'approve',
args: [contractAddress, parseEther("50")],
}, {
onSuccess: (hash) => {
setHashAndCallback([
hash,
() => writeContract({
abi,
address: contractAddress,
functionName: 'register_dao',
}, {
onSuccess: (hash) => {
setHashAndCallback([hash, resetHashAndCallback])
}
})
])
}
});
}
}, [writeContract, resetHashAndCallback])
const raid = useCallback(() => {
writeContract({
abi,
address: contractAddress,
functionName: 'raid',
})
}, [writeContract])
const addUnit = useCallback((unit: UnitType) => {
writeContract({
abi,
address: contractAddress,
functionName: 'addUnit',
args: [unit, 1]
})
}, [writeContract])
return (
<PlayerContext.Provider value={{
isRegistered: isRegistered as boolean,
player: player as Player,
army: army as Army,
balance: balance as bigint,
register,
raid,
addUnit
}}>
{children}
{txHash && <WaitingForTxModal hash={txHash} callbackFn={callbackFn} />}
</PlayerContext.Provider>
);
}
export const usePlayer = () => {
return useContext(PlayerContext);
}
export default PlayerProvider