'use client'; import { useState, useEffect } from 'react'; import { Analytics } from '@/types/analytics'; import styles from './AnalyticsTable.module.css'; interface AnalyticsTableProps { analytics: Analytics[]; allAnalytics: Analytics[]; totalItems: number; currentPage: number; itemsPerPage: number; onPageChange: (page: number) => void; onDeleteClick: (id: string) => void; } export default function AnalyticsTable({ analytics, allAnalytics, totalItems, currentPage, itemsPerPage, onPageChange, onDeleteClick, }: AnalyticsTableProps) { const [expandedRows, setExpandedRows] = useState>(new Set()); const [searchQuery, setSearchQuery] = useState(''); const [searchResults, setSearchResults] = useState([]); const [isSearching, setIsSearching] = useState(false); const totalPages = Math.ceil(totalItems / itemsPerPage); useEffect(() => { if (!searchQuery.trim()) { setSearchResults([]); setIsSearching(false); return; } setIsSearching(true); const query = searchQuery.toLowerCase(); const filtered = allAnalytics.filter(item => { return ( // IP and location item.ip_address.toLowerCase().includes(query) || item.ip_version.toLowerCase().includes(query) || item.country.toLowerCase().includes(query) || (item.ip_data?.isp && item.ip_data.isp.toLowerCase().includes(query)) || // Device and browser info item.platform .toLowerCase() .includes(query) || item.browser.toLowerCase().includes(query) || item.version.toLowerCase().includes(query) || item.language.toLowerCase().includes(query) || // Additional details item.user_agent .toLowerCase() .includes(query) || item.referrer.toLowerCase().includes(query) || item.remote_port.toLowerCase().includes(query) || item.accept?.toLowerCase().includes(query) || item.accept_language?.toLowerCase().includes(query) || item.accept_encoding?.toLowerCase().includes(query) ); }); setSearchResults(filtered); }, [searchQuery, allAnalytics]); const toggleRowExpansion = (id: string) => { const newExpandedRows = new Set(expandedRows); if (expandedRows.has(id)) { newExpandedRows.delete(id); } else { newExpandedRows.add(id); } setExpandedRows(newExpandedRows); }; const handleSearchChange = (e: React.ChangeEvent) => { setSearchQuery(e.target.value); if (currentPage !== 1) { onPageChange(1); } }; const clearSearch = () => { setSearchQuery(''); if (currentPage !== 1) { onPageChange(1); } }; const displayedAnalytics = isSearching ? searchResults : analytics; return (

Click Details

{searchQuery && ( )}
{isSearching && (
Found {searchResults.length} result{searchResults.length !== 1 ? 's' : ''}
)}
{displayedAnalytics.map(item => { const id = item._id?.toString() || ''; const isExpanded = expandedRows.has(id); return ( ); })}
Time IP Address Location Device Browser Actions
{new Date(item.timestamp).toLocaleString()} {item.ip_address}
{item.ip_version}
{item.country}
ISP: {item.ip_data?.isp || 'Unknown'}
{item.platform} {item.browser} {item.version}
Lang: {item.language}
{displayedAnalytics.length === 0 && (
{isSearching ? `No results found for "${searchQuery}"` : 'No analytics data available'}
)} {expandedRows.size > 0 && (
{displayedAnalytics.map(item => { const id = item._id?.toString() || ''; if (!expandedRows.has(id)) return null; return (

Additional Details

User Agent:
{item.user_agent}
Referrer:
{item.referrer}
Remote Port:
{item.remote_port}
Accept:
{item.accept}
Accept-Language:
{item.accept_language}
Accept-Encoding:
{item.accept_encoding}
); })}
)} {totalPages > 1 && !isSearching && (
Page {currentPage} of {totalPages}
)}
); }