diff --git a/app/globals.css b/app/globals.css index 9a63cbb..ef506a2 100644 --- a/app/globals.css +++ b/app/globals.css @@ -15,6 +15,7 @@ body { :root { --glassmorphism-gradient: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(0, 0, 0, 0.1) 100%); + --glassmorphism-gradient-hover: linear-gradient(135deg, rgba(255, 255, 255, 0.3) 0%, rgba(0, 0, 0, 0.3) 100%); --glassmorphism-bg: rgba(255, 255, 255, 0.03); --glassmorphism-blur: 10px; --glassmorphism-border: rgba(255, 255, 255, 0.15); @@ -26,7 +27,8 @@ body { border: 1px solid var(--glassmorphism-border); box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); position: relative; - overflow: hidden; /* Ensure noise texture covers the entire element */ + overflow: hidden; + transition: background 0.3s ease, box-shadow 0.3s ease, border 0.3s ease; } .glassmorphism::before { content: ""; @@ -58,6 +60,12 @@ body { justify-content: center; /* Center vertically */ align-items: center; /* Center horizontally */ position: relative; + transition: background-image 0.3s ease, box-shadow 0.3s ease, border 0.3s ease, backdrop-filter 0.3s ease; + +} + +.leaderboard-card:hover{ + background: var(--glassmorphism-gradient-hover), var(--glassmorphism-bg); } diff --git a/app/modal.tsx b/app/modal.tsx new file mode 100644 index 0000000..e8ce596 --- /dev/null +++ b/app/modal.tsx @@ -0,0 +1,33 @@ +// Modal.js + +import React from 'react'; + +const Modal = ({ isOpen, onClose, item }) => { + if (!isOpen) return null; + + return ( +
+
+ {/* Modal content */} +
+ {/* Header */} +
+

{item.username}s Details

+ +
+ {/* Body */} +
+

{item.username} has {item.points} points.

+
+
+
+
+ ); +}; + +export default Modal; diff --git a/app/page.tsx b/app/page.tsx index 1e8de4c..46b662d 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -5,6 +5,7 @@ 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'; // Helper functions to generate pseudo data const generateRandomName = () => { @@ -22,6 +23,7 @@ const generateRandomPoint = () => { }; function Home() { + 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); // State to track Twitter connection @@ -29,6 +31,19 @@ function Home() { const [incrementNumber, setIncrementNumber] = useState(1); const [leaderboardData, setLeaderboardData] = useState([]); const [isJoined, setIsJoined] = useState(false); + const [selectedItem, setSelectedItem] = useState(null); // State to store selected leaderboard item + + // 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); + }; useEffect(() => { if (darkMode) { @@ -39,17 +54,31 @@ function Home() { }, [darkMode]); useEffect(() => { - const intervalId = setInterval(async () => { - setIncrementNumber((prevNumber) => prevNumber + 1); - const response = await fetch('https://api.callfi.io/get_leaderboard.php'); - if (!response.ok) { - throw new Error('Network response was not ok'); + const fetchData = async () => { + try { + const response = await fetch('https://api.callfi.io/get_leaderboard.php'); + 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); } - const data = await response.json(); - console.log('Leaderboard data:', data); - setLeaderboardData(data); + }; + + // Fetch data immediately on mount + fetchData(); + + // Set up the interval to fetch data every 5 seconds + const intervalId = setInterval(() => { + setIncrementNumber((prevNumber) => prevNumber + 1); + fetchData(); }, 5000); - return () => clearInterval(intervalId); // Clean up the interval on component unmount + + // Clean up the interval on component unmount + return () => clearInterval(intervalId); }, []); const toggleDarkMode = () => { @@ -71,6 +100,17 @@ function Home() { } 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){ + + } }; useEffect(() => { @@ -123,18 +163,33 @@ function Home() { {/* Note card */} { - ready && user?.twitter &&( + 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 && (
@@ -162,13 +217,17 @@ function Home() {
{leaderboardData.map((item) => ( -
= 0 ? 'positive' : 'negative'} mx-auto mb-4`}> +
= 0 ? 'positive' : 'negative'} mx-auto mb-4`} onClick={() => openModal(item)}>

{item["username"]}

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

))}
+ {/* Modal */} + + + {/* Rest of your Home component */}