import { useRouter } from "next/router";
import { useEffect, useState } from "react";
import { getAccessToken, getEmbeddedConnectedWallet, usePrivy, useWallets, Google, Twitter, Discord, useFundWallet } 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 {fundWallet} = useFundWallet();
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 = "0x248c005371a0a388FDD60Ec0e00c1dE53e0B79A2";
async function buyTicket(amount: number) {
await fundWallet(activeWalletObj?.address ?? "");
return;
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.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}
)}
>
) : (
)}
>
);
}