import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import { getAccessToken, getEmbeddedConnectedWallet, usePrivy, useWallets } 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 [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 = `http://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(`http://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); } } } fetchUsername(); fetchVaultData(); }, [ready]); async function autoSetActiveWallet(){ try { const response = await fetch(`http://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 ? ( <>

Welcome {username || "User"},

Vault Credits

{vaultData.vc || "0"} VC

{activeWallet}

{balance || 0} {token}

Hunt Tickets

{ticketsCount || "0"}

Pre-hunt Points

{vaultData.prehp || "0"} PHP

Socials

Twitter

{user?.twitter ? "@" + user?.twitter.username : "-"}

Discord

{user?.discord ? "@" + user?.discord?.username : "-"}

Google

{user?.google ? "@" + user?.google?.email : "-"}

Wallets

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

W3B Wallet

{getEmbeddedConnectedWallet(wallets)?.address}

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

{wallet.walletClientType}

{wallet.address}

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

Enter Ticket Amount

setTicketAmount(Number(e.target.value))} className="w-16 text-center text-white bg-black appearance-none" style={{ appearance: 'textfield', WebkitAppearance: 'none', MozAppearance: 'textfield', }} />
)} ) : (

Loading...

)}
); }