'use client'; import { useState, useEffect, useImperativeHandle, forwardRef } from 'react'; import { useWallet } from '@solana/wallet-adapter-react'; import { WalletMultiButton } from '@solana/wallet-adapter-react-ui'; import { Connection, PublicKey } from '@solana/web3.js'; import Image from 'next/image'; import '@solana/wallet-adapter-react-ui/styles.css'; import { CLUSTER_URL } from '../shared'; import { DINO_TOKEN_ADDRESS } from '../constants'; export interface HeaderRef { refreshBalance: () => Promise; } const Header = forwardRef((props, ref) => { const { publicKey } = useWallet(); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [isScrolled, setIsScrolled] = useState(false); const [dinoBalance, setDinoBalance] = useState(null); const [isLoadingBalance, setIsLoadingBalance] = useState(false); const fetchDinoBalance = async () => { if (!publicKey) { setDinoBalance(null); return; } setIsLoadingBalance(true); try { const connection = new Connection(CLUSTER_URL); const tokenMint = new PublicKey(DINO_TOKEN_ADDRESS); // Get token accounts for the user const tokenAccounts = await connection.getParsedTokenAccountsByOwner( publicKey, { mint: tokenMint } ); if (tokenAccounts.value.length > 0) { const balance = tokenAccounts.value[0].account.data.parsed.info.tokenAmount.uiAmount; setDinoBalance(balance); } else { setDinoBalance(0); } } catch (error) { console.error('Error fetching DINO balance:', error); setDinoBalance(null); } finally { setIsLoadingBalance(false); } }; // Expose refreshBalance function to parent component useImperativeHandle(ref, () => ({ refreshBalance: fetchDinoBalance })); useEffect(() => { const handleScroll = () => { setIsScrolled(window.scrollY > 10); }; window.addEventListener('scroll', handleScroll); return () => window.removeEventListener('scroll', handleScroll); }, []); useEffect(() => { fetchDinoBalance(); }, [publicKey]); const handleBuyDino = () => { // Redirect to DexScreener - you can update this URL to the actual $DINO token page window.open('https://dexscreener.com/solana', '_blank'); }; const formatBalance = (balance: number | null) => { if (balance === null) return '0'; if (balance === 0) return '0'; if (balance < 0.0001) return '< 0.0001'; return balance.toFixed(4); }; return (
{/* Logo and Title */}
DINO Token Icon

DINO

{/* Desktop Navigation Links */} {/* Buy $DINO Button and Wallet Connect - Desktop */}
{publicKey ? (
{/* DINO Balance Display */}
{isLoadingBalance ? (
Loading...
) : ( `${formatBalance(dinoBalance)} $DINO` )}
) : ( )}
{/* Mobile Menu Button */}
{/* Mobile Menu */} {isMobileMenuOpen && (
Support Whitepaper
Socials:
{publicKey && (
{isLoadingBalance ? (
Loading...
) : ( `${formatBalance(dinoBalance)} $DINO` )}
)}
)}
); }); Header.displayName = 'Header'; export default Header;