import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import { getAccessToken, getEmbeddedConnectedWallet, usePrivy, useWallets, Google, Twitter, Discord } from "@privy-io/react-auth"; import Head from "next/head"; import { useBalance } from 'wagmi'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faDiscord, faGoogle, faMeta, faTwitter, faXTwitter } from "@fortawesome/free-brands-svg-icons"; import { faAdd, faFileExport, faLink, faTrash, faUnlink, faWallet } from "@fortawesome/free-solid-svg-icons"; import { useSetActiveWallet } from "@privy-io/wagmi"; import { encodeFunctionData, parseAbi } from 'viem'; import { gameDataABI } from "./data"; import { arbitrumSepolia, baseSepolia } from "viem/chains"; export default function DashboardPage() { const [verifyResult, setVerifyResult] = useState(0); const [username, setUsername] = useState(''); const [userId, setUserId] = useState(0); const [vaultData, setVaultData] = useState({ prehp: "0", vc: "0" }); const [showPopup, setShowPopup] = useState(false); const [ticketAmount, setTicketAmount] = useState(1); const router = useRouter(); const { ready, authenticated, user, logout, exportWallet, linkWallet, unlinkWallet, linkDiscord, unlinkDiscord, linkTwitter, unlinkTwitter, linkGoogle, unlinkGoogle } = usePrivy(); const { wallets } = useWallets(); const [activeWallet, setActiveWallet] = useState(user?.wallet?.address); const [activeWalletObj, setActiveWalletObj] = useState(wallets[0]); const [ticketsCount, setTicketsCount] = useState(0); const { data: balanceData } = useBalance({ address: activeWallet as `0x${string}`, token: "0x22b6c31c2beb8f2d0d5373146eed41ab9ede3caf" }); const balance = balanceData?.formatted; const token = balanceData?.symbol; function ToggleDiscord() { if (user?.discord) { unlinkDiscord(user?.discord.subject); } else { linkDiscord(); } } function ToggleTwitter() { if (user?.twitter) { unlinkTwitter(user?.twitter.subject); } else { linkTwitter(); } } function ToggleGoogle() { if (user?.google) { unlinkGoogle(user?.google.subject); } else { linkGoogle(); } } async function handleWalletClick(address: string) { setActiveWallet(address); const url = `https://vps.playpoolstudios.com/metahunt/api/launcher/set_wallet.php?id=${user?.id}&wallet=${address}`; const response = await fetch(url); console.log(url); wallets.forEach((element) => { if (element.address == address) { setActiveWalletObj(element); element.switchChain(chainId); } }); } useEffect(() => { if (ready && !authenticated) { router.push("/"); } if (ready) { if (username == "-1") { console.log(user?.id); router.push("/logincomplete"); } } }, [ready, authenticated, router, username]); useEffect(() => { async function fetchUsername() { if (ready) { try { const response = await fetch(`https://vps.playpoolstudios.com/metahunt/api/launcher/get_display_name_public.php?id=${user?.id}`); const data = await response.text(); setUsername(data); } catch (error) { console.error("Error fetching username:", error); } } } async function fetchVaultData() { if (user?.id) { try { const response = await fetch(`https://vps.playpoolstudios.com/metahunt/api/launcher/get_vault.php?id=${user?.id}`); const data = await response.json(); setVaultData({ prehp: data.prehp, vc: data.vc }); } catch (error) { console.error("Error fetching vault data:", error); } } } async function fetchUserId(){ try { const response = await fetch(`https://vps.playpoolstudios.com/metahunt/api/launcher/get_user_id.php?username=${user?.id}`); const data = await response.text(); setUserId(parseInt(data)); } catch (error) { console.error('Error fetching user ID:', error); return null; } }; fetchUserId(); fetchUsername(); fetchVaultData(); }, [ready]); async function autoSetActiveWallet(){ try { const response = await fetch(`https://vps.playpoolstudios.com/metahunt/api/launcher/get_active_wallet.php?id=${user?.id}`); const activeWalletString = await response.text(); wallets.forEach((element)=>{ if(element.address == activeWalletString){ setActiveWallet(element.address); setActiveWalletObj(element); } }); if(activeWalletString != activeWallet){ setActiveWalletObj(wallets[0]); } } catch (error) { console.error("Error fetching vault data:", error); } } const chainId = arbitrumSepolia.id; useEffect(() => { setActiveWallet(getEmbeddedConnectedWallet(wallets)?.address); autoSetActiveWallet(); getTickets(); }, [wallets]); useEffect(() => { getTickets(); }, [activeWalletObj]); const contractAddress = "0x7e06ae145dc3d73350c7da040355654EbF11f1bc"; async function buyTicket(amount: number) { const isEmbedded = getEmbeddedConnectedWallet(wallets)?.address == activeWalletObj?.address; const provider = await activeWalletObj?.getEthereumProvider(); if (!provider) { console.error("Ethereum provider not found"); return; } const data = encodeFunctionData({ abi: gameDataABI, functionName: 'buyTickets', args: [amount], }); const value = 1000000000000 * amount; console.log(`isEmbbedded : ${isEmbedded}`) const transactionRequest = { from: activeWalletObj?.address, to: contractAddress, data: data, value: isEmbedded ? value : value.toString(), }; try { const transactionHash = await provider.request({ method: 'eth_sendTransaction', params: [transactionRequest], }); // Polling for the transaction receipt const checkTransactionReceipt = async () => { const receipt = await provider.request({ method: 'eth_getTransactionReceipt', params: [transactionHash], }); if (receipt && receipt.status) { if (receipt.status === '0x1') { // Transaction was successful console.log('Transaction confirmed:', receipt); getTickets(); // Call getTickets() after the transaction is confirmed //setShowPopup(false); // Close the popup after successful transaction } else { console.error('Transaction failed:', receipt); } } else { // Retry after some delay if the receipt is not available yet setTimeout(checkTransactionReceipt, 2000); // Poll every 2 seconds } }; checkTransactionReceipt(); setShowPopup(false); // Close the popup after successful transaction } catch (error) { console.error('Transaction failed:', error); } } async function getTickets() { const provider = await activeWalletObj?.getEthereumProvider(); if (!provider) { console.error("Ethereum provider not found"); return; } try { const data = encodeFunctionData({ abi: gameDataABI, functionName: 'balanceOf', args: [activeWalletObj?.address, 0], }); const callRequest = { from: activeWalletObj?.address, to: contractAddress, data: data, }; const result = await provider.request({ method: 'eth_call', params: [callRequest], }); const balanceHex = result; const balance = parseInt(balanceHex, 16); setTicketsCount(balance); } catch (error) { console.error('Call failed:', error); } } return ( <> W3B Games Dashboard
{ready && authenticated && userId >0 ? ( <>

Welcome {username || "Crypto Warrior"}

Vault Credits

{vaultData.vc || "0"} VC

{token} Balance

{balance || 0} {token}

{activeWallet}

Hunt Tickets

{ticketsCount || "0"}

Pre-hunt Points

{vaultData.prehp || "0"} PHP

Socials

{[ { icon: faXTwitter, name: 'Twitter', user: user?.twitter, toggle: ToggleTwitter }, { icon: faDiscord, name: 'Discord', user: user?.discord, toggle: ToggleDiscord }, { icon: faGoogle, name: 'Google', user: user?.google, toggle: ToggleGoogle } ].map((social) => (
{social.name}
{social.user ? ( social.name === 'Google' ? `@${(social.user as Google).email}` : `@${(social.user as Twitter | Discord).username}` ) : 'Not linked'}
))}

Wallets

handleWalletClick(getEmbeddedConnectedWallet(wallets)?.address ?? "")} >

W3B Wallet

{getEmbeddedConnectedWallet(wallets)?.address}

{wallets.map((wallet) => { if (wallet.connectorType == "embedded") return null; const address = wallet.address; return (
handleWalletClick(address)} >

{wallet.walletClientType}

{wallet.address}

{wallet.linked ? ( ) : ( )}
); })}
{showPopup && (

Buy Hunt Tickets

{ticketAmount}
)} ) : (
)}
); }