import React, { useState, useEffect } from 'react'; import Axios from 'axios'; import styles from '../styles/Dashboard.module.css'; import { useNavigate } from 'react-router-dom'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faTrash } from '@fortawesome/free-solid-svg-icons'; function Dashboard() { document.title = 'LinkLogger | Dashboard'; interface Log { id: number; link: string; timestamp: string; ip: string; location: string; browser: string; os: string; userAgent: string; isp: string; } interface Link { link: string; owner: number; redirect_link: string; expire_date: string; } const [links, setLinks] = useState([]); const [logs, setLogs] = useState([]); const [visibleLog, setVisibleLog] = useState(null); const navigate = useNavigate(); // Fetch links from API useEffect(() => { Axios.get('/api/links') .then((res) => { if (res.status === 200) { setLinks(res.data); } else { navigate('/login'); } }) .catch(() => { navigate('/login'); }); }, []); // Fetch logs from API useEffect(() => { Axios.get('/api/logs') .then((res) => { if (res.status === 200) { setLogs(res.data); } else { navigate('/login'); } }) .catch(() => { navigate('/login'); }); }, []); const toggleLogRow = (link: string) => { setVisibleLog(visibleLog === link ? null : link); }; return ( {/* For every link and its logs */} {links.map((link) => ( {/* Conditionally render logs for this link */} {visibleLog === link.link && ( )} ))}
Link Visits Redirect Expire Date
{logs.filter((log) => log.link === link.link).length || 0} {link.redirect_link} {link.expire_date}
{/* Render logs only if visibleLog matches the link */} {logs .filter((log) => log.link === link.link) .map((log, index, filteredLogs) => ( ))}
ID Timestamp IP Location ISP
{filteredLogs.length - index} {log.timestamp} {log.ip} {log.location} {log.isp}
); } export default Dashboard;