"use client"; import { useEffect, useState } from "react"; import { motion } from "framer-motion"; import { LiveIndicator } from "@/components/live/LiveIndicator"; interface Activity { id: number; type: string; details: Record; created_at: string; } const typeConfig: Record = { newsletter_subscribe: { label: "New subscriber", color: "text-emerald-400 bg-emerald-400/10", icon: "✉️" }, contact_message: { label: "Contact message", color: "text-blue-400 bg-blue-400/10", icon: "💬" }, server_online: { label: "Server online", color: "text-green-400 bg-green-400/10", icon: "🟢" }, server_offline: { label: "Server offline", color: "text-red-400 bg-red-400/10", icon: "🔴" }, }; function formatTimeAgo(iso: string) { const diff = Date.now() - new Date(iso).getTime(); const minutes = Math.floor(diff / 60000); const hours = Math.floor(diff / 3600000); const days = Math.floor(diff / 86400000); if (minutes < 1) return "just now"; if (minutes < 60) return `${minutes}m ago`; if (hours < 24) return `${hours}h ago`; return `${days}d ago`; } export function ActivityFeed() { const [activities, setActivities] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { fetch("/api/activities?limit=10") .then((r) => r.json()) .then((data) => { setActivities(data.activities || []); setLoading(false); }) .catch(() => setLoading(false)); }, []); if (loading) { return (
{Array.from({ length: 3 }).map((_, i) => (
))}
); } if (activities.length === 0) return null; return (

Recent Activity

{activities.map((activity, i) => { const config = typeConfig[activity.type] || { label: activity.type, color: "text-[#a0a0a8] bg-[rgba(160,160,168,0.1)]", icon: "•" }; const details = activity.details as Record; return ( {config.icon}

{config.label} {details.email && — {details.email}} {details.name && — {details.name}} {details.server && — {details.server}}

{formatTimeAgo(activity.created_at)}
); })}
); }