import React, { useEffect, useState } from "react"; import { Link, Navigate, Outlet, useLocation, useNavigate } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { Button, Drawer, Dropdown, Layout, Menu, Tooltip, theme, type ButtonProps, type MenuProps } from "antd"; import { Languages as LanguagesIcon, LogOut as LogOutIcon, Home as HomeIcon, Menu as MenuIcon, Moon as MoonIcon, Server as ServerIcon, Settings as SettingsIcon, ShieldCheck as ShieldCheckIcon, Sun as SunIcon, Workflow as WorkflowIcon, } from "lucide-react"; import Version from "@/components/certimate/Version"; import { useTheme } from "@/hooks"; import { getPocketBase } from "@/repository/pocketbase"; const ConsoleLayout = () => { const navigate = useNavigate(); const { t } = useTranslation(); const { token: themeToken } = theme.useToken(); const [siderOpen, setSiderOpen] = useState(false); const handleSiderOpen = () => { setSiderOpen(true); }; const handleSiderClose = () => { setSiderOpen(false); }; const handleLogoutClick = () => { auth.clear(); navigate("/login"); }; const handleSettingsClick = () => { navigate("/settings/account"); }; const auth = getPocketBase().authStore; if (!auth.isValid || !auth.isAdmin) { return ; } return (
); }; const SiderMenu = React.memo(({ onSelect }: { onSelect?: (key: string) => void }) => { const location = useLocation(); const navigate = useNavigate(); const { t } = useTranslation(); const MENU_KEY_HOME = "/"; const MENU_KEY_WORKFLOWS = "/workflows"; const MENU_KEY_CERTIFICATES = "/certificates"; const MENU_KEY_ACCESSES = "/accesses"; const menuItems: Required["items"] = [ { key: MENU_KEY_HOME, icon: , label: t("dashboard.page.title"), onClick: () => { navigate(MENU_KEY_HOME); onSelect?.(MENU_KEY_HOME); }, }, { key: MENU_KEY_WORKFLOWS, icon: , label: t("workflow.page.title"), onClick: () => { navigate(MENU_KEY_WORKFLOWS); onSelect?.(MENU_KEY_WORKFLOWS); }, }, { key: MENU_KEY_CERTIFICATES, icon: , label: t("certificate.page.title"), onClick: () => { navigate(MENU_KEY_CERTIFICATES); onSelect?.(MENU_KEY_CERTIFICATES); }, }, { key: MENU_KEY_ACCESSES, icon: , label: t("access.page.title"), onClick: () => { navigate(MENU_KEY_ACCESSES); onSelect?.(MENU_KEY_ACCESSES); }, }, ]; const [menuSelectedKey, setMenuSelectedKey] = useState(); const getActiveMenuItem = () => { const item = menuItems.find((item) => item!.key === location.pathname) ?? menuItems.find((item) => item!.key !== MENU_KEY_HOME && location.pathname.startsWith(item!.key as string)); return item; }; useEffect(() => { const item = getActiveMenuItem(); if (item) { setMenuSelectedKey(item.key as string); } else { setMenuSelectedKey(undefined); } }, [location.pathname]); useEffect(() => { if (menuSelectedKey && menuSelectedKey !== getActiveMenuItem()?.key) { navigate(menuSelectedKey); } }, [menuSelectedKey]); return ( <> Certimate
{ setMenuSelectedKey(key); }} />
); }); const ThemeToggleButton = React.memo(({ size }: { size?: ButtonProps["size"] }) => { const { t } = useTranslation(); const { theme, setThemeMode } = useTheme(); const items: Required["items"] = [ { key: "light", label: <>{t("common.theme.light")}, onClick: () => setThemeMode("light"), }, { key: "dark", label: <>{t("common.theme.dark")}, onClick: () => setThemeMode("dark"), }, { key: "system", label: <>{t("common.theme.system")}, onClick: () => setThemeMode("system"), }, ]; return (