import { default as clientRoute, default as clientRoutes, } from "@/clientRoutes"; import apiFetch from "@/lib/apiFetch"; import { ActionIcon, AppShell, Avatar, Badge, Button, Card, Divider, Flex, Group, NavLink, Paper, ScrollArea, Stack, Text, Title, Tooltip, } from "@mantine/core"; import { useLocalStorage } from "@mantine/hooks"; import { IconChevronLeft, IconChevronRight, IconDashboard, IconFileCertificate, IconKey, IconLock, IconMessageReport, IconSettings, IconUser, IconUsersGroup, } from "@tabler/icons-react"; import type { User } from "generated/prisma"; import type { JsonValue } from "generated/prisma/runtime/library"; import { useEffect, useState } from "react"; import { Outlet, useLocation, useNavigate } from "react-router-dom"; function Logout() { return ( ); } export default function DashboardLayout() { const [opened, setOpened] = useLocalStorage({ key: "nav_open", defaultValue: true, }); return ( setOpened((v) => !v)} radius="xl" size="lg" style={{ backgroundColor: "rgba(255,255,255,0.05)", boxShadow: "0 0 6px hsla(167, 100%, 50%, 0.20), 0.20)", }} > {opened ? : } {!opened && ( setOpened(true)} radius="xl" > )} Dashboard Control Panel ); } 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]?.toUpperCase()} {host.name} {host.roleId} ) : ( No user information available )} ); } function NavigationDashboard() { const navigate = useNavigate(); const location = useLocation(); const [permissions, setPermissions] = useState([]); useEffect(() => { async function fetchPermissions() { const { data } = await apiFetch.api.user.find.get(); if (Array.isArray(data?.permissions)) { setPermissions(data.permissions); } else { setPermissions([]); } } fetchPermissions(); }, []); const isActive = (path: keyof typeof clientRoute) => location.pathname.startsWith(clientRoute[path]); const navItems = [ { key: "dashboard", path: "/scr/dashboard/dashboard-home", icon: , label: "Dashboard Overview", description: "Quick summary and insights", }, { key: "pengaduan", path: "/scr/dashboard/pengaduan/list", icon: , label: "Pengaduan Warga", description: "Manage pengaduan warga", }, { key: "pelayanan", path: "/scr/dashboard/pelayanan-surat/list-pelayanan", icon: , label: "Pelayanan Surat", description: "Manage pelayanan surat", }, { key: "warga", path: "/scr/dashboard/warga/list-warga", icon: , label: "Warga", description: "Manage warga", }, { key: "setting", path: "/scr/dashboard/setting/detail-setting", icon: , label: "Setting", description: "Manage setting (category pengaduan dan pelayanan surat, desa, etc)", }, { key: "api_key", path: "/scr/dashboard/apikey/apikey", icon: , label: "API Key Manager", description: "Create and manage API keys", }, { key: "credential", path: "/scr/dashboard/credential/credential", icon: , label: "Credentials", description: "Manage service credentials", }, ]; return ( {navItems .filter((item) => permissions.includes(item.key)) .map((item) => ( {item.label} {( isActive(item.path as keyof typeof clientRoute) || (location.pathname == "/scr/dashboard/pelayanan-surat/detail-pelayanan" && item.path == "/scr/dashboard/pelayanan-surat/list-pelayanan") || (location.pathname == "/scr/dashboard/pengaduan/detail" && item.path == "/scr/dashboard/pengaduan/list") || (location.pathname == "/scr/dashboard/warga/detail-warga" && item.path == "/scr/dashboard/warga/list-warga") ) && ( Active )} } description={item.description} onClick={() => navigate(clientRoutes[item.path as keyof typeof clientRoute]) } style={{ backgroundColor: isActive(item.path as keyof typeof clientRoute) || (location.pathname == "/scr/dashboard/pelayanan-surat/detail-pelayanan" && item.path == "/scr/dashboard/pelayanan-surat/list-pelayanan") || (location.pathname == "/scr/dashboard/pengaduan/detail" && item.path == "/scr/dashboard/pengaduan/list") || (location.pathname == "/scr/dashboard/warga/detail-warga" && item.path == "/scr/dashboard/warga/list-warga") ? "rgba(0,255,200,0.1)" : "transparent", borderRadius: "8px", transition: "all 0.2s ease", }} styles={{ label: { color: "white" }, description: { color: "#aaa" }, section: { color: "teal" }, }} /> ))} ); }