🎉 feat: initialization
This commit is contained in:
@@ -0,0 +1,226 @@
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user