"use client"; import { useState, useEffect } from 'react'; interface LinkDetails { id: string; name: string; shortUrl: string; originalUrl: string; creator: string; createdAt: string; visits: number; visitChange: number; uniqueVisitors: number; uniqueVisitorsChange: number; avgTime: string; avgTimeChange: number; conversionRate: number; conversionChange: number; status: 'active' | 'inactive' | 'expired'; tags: string[]; } interface LinkDetailsCardProps { linkId: string | null; onClose: () => void; } export default function LinkDetailsCard({ linkId, onClose }: LinkDetailsCardProps) { const [linkDetails, setLinkDetails] = useState(null); const [loading, setLoading] = useState(true); const [activeTab, setActiveTab] = useState<'overview' | 'referrers' | 'devices' | 'locations'>('overview'); useEffect(() => { if (linkId) { // Simulate API call to fetch link details const fetchData = async () => { setLoading(true); // In a real app, this would be an API call like: // const response = await fetch(`/api/links/${linkId}`); // const data = await response.json(); // For demo, using mock data setTimeout(() => { setLinkDetails({ id: linkId, name: "Product Launch Campaign", shortUrl: "short.io/prlaunch", originalUrl: "https://example.com/products/new-product-launch-summer-2023", creator: "Sarah Johnson", createdAt: "2023-05-15", visits: 3240, visitChange: 12.5, uniqueVisitors: 2180, uniqueVisitorsChange: 8.3, avgTime: "2m 45s", avgTimeChange: -5.2, conversionRate: 4.8, conversionChange: 1.2, status: 'active', tags: ["marketing", "product", "summer"] }); setLoading(false); }, 800); }; fetchData(); } }, [linkId]); if (!linkId) return null; return (
{/* Header */}
{loading ? (
) : (

{linkDetails?.name}

)}
{loading ? (

Loading link details...

) : ( <> {/* Link Info */}
Short URL
{linkDetails?.shortUrl}
Created By

{linkDetails?.creator}

Created At

{linkDetails?.createdAt}

Status
{linkDetails && ( {linkDetails.status.charAt(0).toUpperCase() + linkDetails.status.slice(1)} )}
{linkDetails?.tags && linkDetails.tags.length > 0 && (
Tags
{linkDetails.tags.map((tag) => ( {tag} ))}
)}
{/* Metrics Overview */} {linkDetails && (

Performance Metrics

{/* Total Visits */}
Total Visits
= 0 ? 'bg-green-500/10 text-accent-green' : 'bg-red-500/10 text-accent-red' }`} > = 0 ? 'text-accent-green' : 'text-accent-red transform rotate-180'}`} fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" > {Math.abs(linkDetails.visitChange)}%

{linkDetails.visits.toLocaleString()}

{/* Unique Visitors */}
Unique Visitors
= 0 ? 'bg-green-500/10 text-accent-green' : 'bg-red-500/10 text-accent-red' }`} > = 0 ? 'text-accent-green' : 'text-accent-red transform rotate-180'}`} fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" > {Math.abs(linkDetails.uniqueVisitorsChange)}%

{linkDetails.uniqueVisitors.toLocaleString()}

{/* Average Time */}
Average Time
= 0 ? 'bg-green-500/10 text-accent-green' : 'bg-red-500/10 text-accent-red' }`} > = 0 ? 'text-accent-green' : 'text-accent-red transform rotate-180'}`} fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" > {Math.abs(linkDetails.avgTimeChange)}%

{linkDetails.avgTime}

{/* Conversion Rate */}
Conversion Rate
= 0 ? 'bg-green-500/10 text-accent-green' : 'bg-red-500/10 text-accent-red' }`} > = 0 ? 'text-accent-green' : 'text-accent-red transform rotate-180'}`} fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" > {Math.abs(linkDetails.conversionChange)}%

{linkDetails.conversionRate}%

)} {/* Tabs Navigation */}
{/* Tab Content */}
{activeTab === 'overview' && (

No chart data available

Charts and detailed analytics would appear here.

)} {activeTab === 'referrers' && (

No referrer data available

Information about traffic sources would appear here.

)} {activeTab === 'devices' && (

No device data available

Breakdown of devices used to access the link would appear here.

)} {activeTab === 'locations' && (

No location data available

Geographic distribution of visitors would appear here.

)}
{/* Footer */}
)}
); }