"use client" import { Nav } from "@/components/core/nav"; import { authClient } from "@/util/auth-client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { SiForgejo, SiJellyfin, SiOllama } from "react-icons/si"; import { TbDashboard, TbUser, TbMail, TbCalendar, TbShield, TbDeviceTv, TbExternalLink, TbServer, TbCheck, TbReceipt, } from "react-icons/tb"; export default function Dashboard() { const router = useRouter(); const { data: session, isPending } = authClient.useSession(); const [mounted, setMounted] = useState(false); const [userServices, setUserServices] = useState([]); const [openServices, setOpenServices] = useState([]); useEffect(() => { setMounted(true); }, []); useEffect(() => { if (mounted && !isPending && !session) { router.push("/login?message=Please sign in to access the dashboard"); } }, [session, isPending, mounted, router]); useEffect(() => { if (session) { fetchUserServices(); } }, [session]); const fetchUserServices = async () => { try { const response = await fetch("/api/user-services"); if (response.ok) { const data = await response.json(); const services = data.services; setUserServices(services.map((s: { serviceName: string }) => s.serviceName)); setOpenServices(services.filter((s: { isOpen: boolean }) => s.isOpen).map((s: { serviceName: string }) => s.serviceName)); } } catch (error) { console.error("Error fetching services:", error); } }; if (!mounted || isPending) { return (
); } if (!session) { return (
); } const formatDate = (date: Date) => { return new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' }).format(date); }; return (
); } function ServiceCard({ title, icon, link, signupType, signupLink, hasAccess, isOpen }: { title: string, icon: React.ReactNode, link?: string, signupType: "request" | "self" | "invite", signupLink: string, hasAccess: boolean, isOpen: boolean }) { const cardClassName = hasAccess ? "bg-green-50 dark:bg-green-900/20 p-6 rounded-xl shadow-sm border border-green-200 dark:border-green-700" : "bg-red-50 dark:bg-red-900/20 p-6 rounded-xl shadow-sm border border-red-200 dark:border-red-700"; return (
hasAccess && link && window.open(link, '_blank')}> {icon}

{title}

{hasAccess && link &&
window.open(link, '_blank')} />
}
{hasAccess ? (
Access granted
{isOpen && (

Open service: {signupType === "request" ? "Request account" : "Create account"}

)}
) : (

Need an account? {signupType === "request" ? "Request one!" : "Sign up!"}

)}
); }