'use client' import Link from 'next/link' import Image from 'next/image' import { Site } from '@/lib/api/sites' import type { Stats } from '@/lib/api/stats' import { formatNumber } from '@ciphera-net/ui' import { BarChartIcon, SettingsIcon, BookOpenIcon, ExternalLinkIcon, Button } from '@ciphera-net/ui' import { useAuth } from '@/lib/auth/context' export type SiteStatsMap = Record interface SiteListProps { sites: Site[] siteStats: SiteStatsMap loading: boolean onDelete: (id: string) => void } interface SiteCardProps { site: Site stats: Stats | null statsLoading: boolean onDelete: (id: string) => void canDelete: boolean } function SiteCard({ site, stats, statsLoading, onDelete, canDelete }: SiteCardProps) { const visitors24h = stats?.visitors ?? 0 const pageviews = stats?.pageviews ?? 0 return (
{/* Header: Icon + Name + Live Status */}
{site.name}

{site.name}

Active
{/* Mini Stats Grid */}

Visitors (24h)

{statsLoading ? '--' : formatNumber(visitors24h)}

Pageviews

{statsLoading ? '--' : formatNumber(pageviews)}

{/* Actions */}
{canDelete && ( )}
) } export default function SiteList({ sites, siteStats, loading, onDelete }: SiteListProps) { const { user } = useAuth() const canDelete = user?.role === 'owner' || user?.role === 'admin' if (loading) { return (
{[1, 2, 3].map((i) => (
))}
) } if (sites.length === 0) { return (

No sites yet

Create your first site to get started.

) } return (
{sites.map((site) => { const data = siteStats[site.id] return ( ) })} {/* Resources Card */}

Need help setup?

Check our documentation for installation guides.

Read Documentation →
) }