227 lines
6.5 KiB
TypeScript
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);
|
|
}
|