"use client"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { useAuth } from "@/hooks/useAuth"; import { api } from "@/lib/api"; import { formatDate } from "@/lib/utils"; import { Calendar, FileText, Tag, User, Plus, Download, FolderOpen } from "lucide-react"; import Link from "next/link"; export default function OverviewPage() { const { user, loading: authLoading } = useAuth(); const router = useRouter(); const [meetups, setMeetups] = useState([]); const [posts, setPosts] = useState([]); const [categories, setCategories] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); useEffect(() => { if (!authLoading && !user) { router.push("/admin"); } }, [authLoading, user, router]); useEffect(() => { if (!user) return; async function load() { try { const [m, p, c] = await Promise.all([ api.getMeetups(), api.getPosts({ limit: 5, all: true }), api.getCategories(), ]); setMeetups(Array.isArray(m) ? m : []); setPosts(p.posts || []); setCategories(Array.isArray(c) ? c : []); } catch (err: any) { setError(err.message || "Failed to load dashboard data"); } finally { setLoading(false); } } load(); }, [user]); if (authLoading || !user) { return (
Loading...
); } const shortPubkey = `${user.pubkey.slice(0, 8)}...${user.pubkey.slice(-8)}`; const upcomingMeetup = meetups.find( (m) => new Date(m.date) > new Date() ); if (loading) { return (
Loading dashboard...
); } return (

Welcome back

{shortPubkey}

{error && (
{error}
)}
{upcomingMeetup && (

Next Upcoming Meetup

{upcomingMeetup.title}

{formatDate(upcomingMeetup.date)} ยท {upcomingMeetup.location}

)}

Recent Posts

{posts.length === 0 ? (

No posts yet.

) : (
{posts.slice(0, 5).map((post: any) => (

{post.title}

{post.slug}

{post.featured && ( Featured )}
))}
)}

Quick Actions

Create Meetup Import Post Manage Categories
); } function StatCard({ icon: Icon, label, value, }: { icon: any; label: string; value: string | number; }) { return (
{label}

{value}

); }