import React, { useEffect, useState } from 'react'; import { motion } from 'framer-motion'; import axios from 'axios'; interface Detail { token: string; gains: number; price_at_creation: number; price_now: number; icon_url: string; ca: string; // Add contract address to the Detail interface } const Modal: React.FC<{ isOpen: boolean; onClose: () => void; item: { username: string; points: number; img_url: string }; // Include img_url in the item prop period: string; }> = ({ isOpen, onClose, item, period }) => { const [details, setDetails] = useState(null); const [urls, setUrls] = useState<{ [key: string]: string }>({}); // State to store Dexscreener URLs useEffect(() => { if (isOpen && item) { const fetchDetails = async () => { try { let urlAddition = ''; if (period === 'Weekly') { urlAddition = '_weekly'; } else if (period === 'Monthly') { urlAddition = '_monthly'; } const response = await fetch(`https://api.callfi.io/get_user_callouts${urlAddition}.php?tag=${item.username}`); if (!response.ok) { throw new Error('Network response was not ok'); } const data: Detail[] = await response.json(); setDetails(data); // Fetch URLs for each detail const newUrls: { [key: string]: string } = {}; for (const detail of data) { try { const response = await axios.get(`https://api.dexscreener.com/latest/dex/tokens/${detail.ca}`); if (response.data && response.data.pairs && response.data.pairs.length > 0) { newUrls[detail.ca] = response.data.pairs[0].url; } } catch (error) { console.error(`Failed to fetch URL for ${detail.ca}:`, error); } } setUrls(newUrls); } catch (error) { console.error('Failed to fetch user details:', error); } }; fetchDetails(); } }, [isOpen, item, period]); if (!isOpen) return null; return (
{`${item.username}'s

{item.username}s Callouts

0 ? 'text-green-500' : 'text-red-500' }`} > Total Gains : {parseFloat(item.points.toString()).toFixed(2)} x

{details !== null ? ( ) : (

Loading...

)}
); }; export default Modal;