import { useEffect, useState } from "react"; import { ActionIcon, AppShell, Avatar, Button, Card, Divider, Flex, Group, NavLink, Paper, ScrollArea, Stack, Text, Title, Tooltip, } from "@mantine/core"; import { useLocalStorage } from "@mantine/hooks"; import { IconChevronLeft, IconChevronRight, IconDashboard, } from "@tabler/icons-react"; import type { User } from "generated/prisma"; import { Navigate, Outlet, useLocation, useNavigate } from "react-router-dom"; import { default as clientRoute, default as clientRoutes, } from "@/clientRoutes"; import apiFetch from "@/lib/apiFetch"; /* ----------------------- Logout ----------------------- */ function Logout() { return ( ); } /* ----------------------- Layout ----------------------- */ export default function DashboardLayout() { const [opened, setOpened] = useLocalStorage({ key: "nav_open", defaultValue: true, }); const [isAuthenticated, setIsAuthenticated] = useState(null); useEffect(() => { async function checkSession() { try { // backend otomatis baca cookie JWT dari request const res = await apiFetch.api.user.find.get(); setIsAuthenticated(res.status === 200); } catch { setIsAuthenticated(false); } } checkSession(); }, []); if (isAuthenticated === null) return null; if (!isAuthenticated) return ; return ( {/* NAVBAR */} {/* Collapse toggle */} setOpened((v) => !v)} radius="xl" > {opened ? : } {/* Navigation */} {/* User info */} {/* MAIN CONTENT */} {!opened && ( setOpened(true)} radius="xl" > )} App Dashboard ); } /* ----------------------- Host Info ----------------------- */ function HostView() { const [host, setHost] = useState(null); useEffect(() => { async function fetchHost() { const { data } = await apiFetch.api.user.find.get(); setHost(data?.user ?? null); } fetchHost(); }, []); return ( {host ? ( {host.name?.[0]} {host.name} {host.email} ) : ( No host information available )} ); } /* ----------------------- Navigation ----------------------- */ function NavigationDashboard() { const navigate = useNavigate(); const location = useLocation(); const isActive = (path: keyof typeof clientRoute) => location.pathname.startsWith(clientRoute[path]); return ( } label="Dashboard Overview" description="Quick summary and activity highlights" onClick={() => navigate(clientRoutes["/dashboard/dashboard"])} /> } label="API Keys" description="Manage your API credentials" onClick={() => navigate(clientRoutes["/dashboard/apikey/apikey"])} /> ); }