"use client"; import React, { useState, useEffect } from "react"; import Link from 'next/link'; import { SunIcon, MoonIcon } from "@heroicons/react/solid"; import { PrivyProvider, usePrivy } from "@privy-io/react-auth"; import { FaTwitter, FaWallet } from "react-icons/fa"; import { CheckIcon } from "@heroicons/react/outline"; import Modal from './modal'; import CalloutModal from './callout'; import { motion } from 'framer-motion'; import UserDetailModal from "@/components/UserDetailsModal"; // Helper functions to generate pseudo data const generateRandomName = () => { const names = ["Alice", "Bob", "Charlie", "David", "Eva", "Frank", "Grace", "Hannah", "Ivan", "Judy"]; return names[Math.floor(Math.random() * names.length)]; }; const generateRandomCoin = () => { const coins = ["Bitcoin", "Ethereum", "Litecoin", "Ripple", "Cardano", "Polkadot", "Solana", "Chainlink"]; return coins[Math.floor(Math.random() * coins.length)]; }; const generateRandomPoint = () => { return Math.floor(Math.random() * (100 - 10 + 1)) + 10; }; const Home: React.FC = () => { const [modalOpen, setModalOpen] = useState(false); const { login, user, ready, logout, linkTwitter, unlinkTwitter, linkWallet, unlinkWallet } = usePrivy(); const [darkMode, setDarkMode] = useState(true); const [twitterConnected, setTwitterConnected] = useState(false); const [walletConnected, setWalletConnected] = useState(false); const [incrementNumber, setIncrementNumber] = useState(1); const [leaderboardData, setLeaderboardData] = useState([]); const [isJoined, setIsJoined] = useState(false); const [selectedItem, setSelectedItem] = useState(null); const [newCallModalOpen, setNewCallModalOpen] = useState(false); const [userDetailModalOpen, setUserDetailModalOpen] = useState(false); const [selectedPeriod, setSelectedPeriod] = useState('All Time'); const periods = ['All Time', 'Weekly', 'Monthly']; // Function to handle opening modal and setting selected item const openModal = (item) => { setSelectedItem(item); setModalOpen(true); }; // Function to handle closing modal const closeModal = () => { setSelectedItem(null); setModalOpen(false); }; const openNewCallModal = () => { setNewCallModalOpen(true); }; const closeNewCallModal = () => { setNewCallModalOpen(false); }; // Function to handle opening user detail modal const openUserDetailModal = (username) => { setUserDetailModalOpen(true); setTimeout(() => { setModalOpen(false); // Additional logic if needed to fetch user details }, 10); }; // Function to handle closing user detail modal const closeUserDetailModal = () => { setUserDetailModalOpen(false); }; const handleNewCallSubmit = (tokenId, tokenContract, tokenName) => { let twitterIntentURL = `https://x.com/intent/tweet?text=%24${tokenId}%20is%20Booming%20rn%21%20See%20ya%20on%20the%20moon%21%0A%0A%23CallFi%20%23CallingIt`; if(tokenContract.length >0){ twitterIntentURL = `https://x.com/intent/tweet?text=%24${tokenId}%20%23${tokenName}%20is%20Going%20to%20the%20moon%21%0ACA%20%3A${tokenContract}%0A%0A%23CallFi%20%23CallingIt`; } window.open(twitterIntentURL, '_blank'); }; useEffect(() => { if (darkMode) { document.documentElement.classList.add("dark"); } else { document.documentElement.classList.remove("dark"); } }, [darkMode]); let fetchData = async () => { try { let urlAddition = ""; if(selectedPeriod == "Weekly"){ urlAddition = "_weekly"; } else if(selectedPeriod == "Monthly"){ urlAddition = "_monthly"; } const response = await fetch(`https://api.callfi.io/get_leaderboard${urlAddition}.php`); console.log(urlAddition); if (!response.ok) { throw new Error('Network response was not ok'); } const data = await response.json(); console.log('Leaderboard data:', data); setLeaderboardData(data); } catch (error) { console.error('Failed to fetch leaderboard data:', error); } }; useEffect(()=>{ setLeaderboardData([]); fetchData(); }, [selectedPeriod]) useEffect(() => { fetchData(); // Set up the interval to fetch data every 5 seconds const intervalId = setInterval(() => { setIncrementNumber((prevNumber) => prevNumber + 1); fetchData(); }, 5000); // Clean up the interval on component unmount return () => clearInterval(intervalId); }, [selectedPeriod]); const toggleDarkMode = () => { setDarkMode(!darkMode); document.documentElement.classList.toggle("dark", !darkMode); }; const postLoginAPI = async (usertag) => { try { const response = await fetch('https://api.callfi.io/register_twitter_user.php?tag=' + usertag); if (!response.ok) { throw new Error('Network response was not ok'); } const data = await response.json(); console.log('API call successful:', data); setTwitterConnected(true); } catch (error) { console.error('Error during API call:', error); } try { const response = await fetch('https://api.callfi.io/check_user_approved.php?tag=' + usertag); const responseTxt = await response.text(); if (responseTxt == "1") { setIsJoined(true); } } catch (error) { console.error('Error checking user approval:', error); } }; useEffect(() => { if (ready && user) { const username = user.twitter?.username ? `@${user.twitter.username}` : '@unknownUser'; if (username !== "@unknownUser") { postLoginAPI(username); } const walletStatus = user.wallet; if (walletStatus) { setWalletConnected(true); } } }, [ready, user]); return (

CallFi

{ready && user ? (
) : !ready ? (

Loading...

) : ( )}
{ready && user?.twitter && !isJoined && (

Join the Leaderboard

Get on the leaderboard by posting a tweet!

)} {ready && user?.twitter && isJoined && (

Feeling Lucky?

Make a callout to a token you believe in!!

)} {ready && !user?.twitter && (

Join the Leaderboard

Start by linking your Twitter account!

{user ? ( ) : ( )}
)}
{periods.map((period) => ( ))}
{leaderboardData.map((item) => (
= 0 ? 'positive' : 'negative'} mx-auto mb-4`} onClick={() => openModal(item)} >
{`${item["username"]}'s

openUserDetailModal(item["username"])}>{item["username"]}

{parseFloat(item["points"]).toFixed(2)}x

))}
); } export default function App() { return ( ); }