2025-11-26 19:56:16 -08:00

227 lines
6.5 KiB
TypeScript

import { useMemo } from "react";
import { useTranslation } from "react-i18next";
export interface NavItem {
title: string;
url?: string;
icon?: string;
items?: NavItem[];
defaultOpen?: boolean;
}
export function useNavs() {
const { t } = useTranslation("menu");
const navs: NavItem[] = useMemo(
() => [
{
title: t("Dashboard", "Dashboard"),
url: "/dashboard",
icon: "flat-color-icons:globe",
},
{
title: t("Maintenance", "Maintenance"),
icon: "flat-color-icons:data-protection",
items: [
{
title: t("Server Management", "Server Management"),
url: "/dashboard/servers",
icon: "flat-color-icons:data-protection",
},
{
title: t("Node Management", "Node Management"),
url: "/dashboard/nodes",
icon: "flat-color-icons:mind-map",
},
{
title: t("Subscribe Config", "Subscribe Config"),
url: "/dashboard/subscribe",
icon: "flat-color-icons:ruler",
},
{
title: t("Product Management", "Product Management"),
url: "/dashboard/product",
icon: "flat-color-icons:shop",
},
],
},
{
title: t("Commerce", "Commerce"),
icon: "flat-color-icons:sales-performance",
items: [
{
title: t("Order Management", "Order Management"),
url: "/dashboard/order",
icon: "flat-color-icons:todo-list",
},
{
title: t("Coupon Management", "Coupon Management"),
url: "/dashboard/coupon",
icon: "flat-color-icons:bookmark",
},
{
title: t("Marketing Management", "Marketing Management"),
url: "/dashboard/marketing",
icon: "flat-color-icons:bullish",
},
{
title: t("Announcement Management", "Announcement Management"),
url: "/dashboard/announcement",
icon: "flat-color-icons:advertising",
},
],
},
{
title: t("Users & Support", "Users & Support"),
icon: "flat-color-icons:collaboration",
items: [
{
title: t("User Management", "User Management"),
url: "/dashboard/user",
icon: "flat-color-icons:conference-call",
},
{
title: t("Ticket Management", "Ticket Management"),
url: "/dashboard/ticket",
icon: "flat-color-icons:collaboration",
},
{
title: t("Document Management", "Document Management"),
url: "/dashboard/document",
icon: "flat-color-icons:document",
},
],
},
{
defaultOpen: false,
title: t("System", "System"),
icon: "flat-color-icons:services",
items: [
{
title: t("System Config", "System Config"),
url: "/dashboard/system",
icon: "flat-color-icons:services",
},
{
title: t("Auth Control", "Auth Control"),
url: "/dashboard/auth-control",
icon: "flat-color-icons:lock-portrait",
},
{
title: t("Payment Config", "Payment Config"),
url: "/dashboard/payment",
icon: "flat-color-icons:currency-exchange",
},
{
title: t("ADS Config", "ADS Config"),
url: "/dashboard/ads",
icon: "flat-color-icons:electrical-sensor",
},
],
},
{
defaultOpen: false,
title: t("Logs & Analytics", "Logs & Analytics"),
icon: "flat-color-icons:statistics",
items: [
{
title: t("Login", "Login"),
url: "/dashboard/log/login",
icon: "flat-color-icons:unlock",
},
{
title: t("Register", "Register"),
url: "/dashboard/log/register",
icon: "flat-color-icons:contacts",
},
{
title: t("Email", "Email"),
url: "/dashboard/log/email",
icon: "flat-color-icons:feedback",
},
{
title: t("Mobile", "Mobile"),
url: "/dashboard/log/mobile",
icon: "flat-color-icons:sms",
},
{
title: t("Subscribe", "Subscribe"),
url: "/dashboard/log/subscribe",
icon: "flat-color-icons:workflow",
},
{
title: t("Reset Subscribe", "Reset Subscribe"),
url: "/dashboard/log/reset-subscribe",
icon: "flat-color-icons:refresh",
},
{
title: t("Subscribe Traffic", "Subscribe Traffic"),
url: "/dashboard/log/subscribe-traffic",
icon: "flat-color-icons:statistics",
},
{
title: t("Server Traffic", "Server Traffic"),
url: "/dashboard/log/server-traffic",
icon: "flat-color-icons:statistics",
},
{
title: t("Traffic Details", "Traffic Details"),
url: "/dashboard/log/traffic-details",
icon: "flat-color-icons:combo-chart",
},
{
title: t("Balance", "Balance"),
url: "/dashboard/log/balance",
icon: "flat-color-icons:sales-performance",
},
{
title: t("Commission", "Commission"),
url: "/dashboard/log/commission",
icon: "flat-color-icons:debt",
},
{
title: t("Gift", "Gift"),
url: "/dashboard/log/gift",
icon: "flat-color-icons:donate",
},
],
},
],
[t]
);
return navs;
}
export function findNavByUrl(navs: NavItem[], url: string) {
function matchDynamicRoute(pattern: string, path: string): boolean {
const regexPattern = pattern
.replace(/:[^/]+/g, "[^/]+")
.replace(/\//g, "\\/");
const regex = new RegExp(`^${regexPattern}$`);
return regex.test(path);
}
function findNav(
items: NavItem[],
url: string,
path: NavItem[] = []
): NavItem[] {
for (const item of items) {
if (item.url === url || (item.url && matchDynamicRoute(item.url, url))) {
return [...path, item];
}
if (item.items) {
const result = findNav(item.items, url, [...path, item]);
if (result.length) return result;
}
}
return [];
}
return findNav(navs, url);
}