import React, { useEffect, useState } from "react"; import { Group, Text, ScrollArea, ActionIcon, Tooltip } from "@mantine/core"; import { IconUser, IconSettings, IconUsers, IconArrowLeft, IconUsersGroup, IconSpaces, IconBrush, IconCoin, IconLock, IconKey, IconWorld, IconSparkles, } from "@tabler/icons-react"; import { Link, useLocation } from "react-router-dom"; import classes from "./settings.module.css"; import { useTranslation } from "react-i18next"; import { isCloud } from "@/lib/config.ts"; import useUserRole from "@/hooks/use-user-role.tsx"; import { useAtom } from "jotai"; import { workspaceAtom } from "@/features/user/atoms/current-user-atom.ts"; import { prefetchApiKeyManagement, prefetchApiKeys, prefetchBilling, prefetchGroups, prefetchLicense, prefetchShares, prefetchSpaces, prefetchSsoProviders, prefetchWorkspaceMembers, } from "@/components/settings/settings-queries.tsx"; import AppVersion from "@/components/settings/app-version.tsx"; import { mobileSidebarAtom } from "@/components/layouts/global/hooks/atoms/sidebar-atom.ts"; import { useToggleSidebar } from "@/components/layouts/global/hooks/hooks/use-toggle-sidebar.ts"; import { useSettingsNavigation } from "@/hooks/use-settings-navigation"; interface DataItem { label: string; icon: React.ElementType; path: string; isCloud?: boolean; isEnterprise?: boolean; isAdmin?: boolean; isSelfhosted?: boolean; showDisabledInNonEE?: boolean; } interface DataGroup { heading: string; items: DataItem[]; } const groupedData: DataGroup[] = [ { heading: "Account", items: [ { label: "Profile", icon: IconUser, path: "/settings/account/profile" }, { label: "Preferences", icon: IconBrush, path: "/settings/account/preferences", }, { label: "API keys", icon: IconKey, path: "/settings/account/api-keys", isCloud: true, isEnterprise: true, showDisabledInNonEE: true, }, ], }, { heading: "Workspace", items: [ { label: "General", icon: IconSettings, path: "/settings/workspace" }, { label: "Members", icon: IconUsers, path: "/settings/members", }, { label: "Billing", icon: IconCoin, path: "/settings/billing", isCloud: true, isAdmin: true, }, { label: "Security & SSO", icon: IconLock, path: "/settings/security", isCloud: true, isEnterprise: true, isAdmin: true, showDisabledInNonEE: true, }, { label: "Groups", icon: IconUsersGroup, path: "/settings/groups" }, { label: "Spaces", icon: IconSpaces, path: "/settings/spaces" }, { label: "Public sharing", icon: IconWorld, path: "/settings/sharing" }, { label: "API management", icon: IconKey, path: "/settings/api-keys", isCloud: true, isEnterprise: true, isAdmin: true, showDisabledInNonEE: true, }, { label: "AI settings", icon: IconSparkles, path: "/settings/ai", isAdmin: true, }, ], }, { heading: "System", items: [ { label: "License & Edition", icon: IconKey, path: "/settings/license", }, ], }, ]; export default function SettingsSidebar() { const { t } = useTranslation(); const location = useLocation(); const [active, setActive] = useState(location.pathname); const { goBack } = useSettingsNavigation(); const { isAdmin } = useUserRole(); const [workspace] = useAtom(workspaceAtom); const [mobileSidebarOpened] = useAtom(mobileSidebarAtom); const toggleMobileSidebar = useToggleSidebar(mobileSidebarAtom); useEffect(() => { setActive(location.pathname); }, [location.pathname]); const canShowItem = (item: DataItem) => { if (item.showDisabledInNonEE && item.isEnterprise) { // Check admin permission regardless of license return item.isAdmin ? isAdmin : true; } if (item.isCloud && item.isEnterprise) { if (!(isCloud() || workspace?.hasLicenseKey)) return false; return item.isAdmin ? isAdmin : true; } if (item.isCloud) { return isCloud() ? (item.isAdmin ? isAdmin : true) : false; } if (item.isSelfhosted) { return !isCloud() ? (item.isAdmin ? isAdmin : true) : false; } if (item.isEnterprise) { return workspace?.hasLicenseKey ? (item.isAdmin ? isAdmin : true) : false; } if (item.isAdmin) { return isAdmin; } return true; }; const isItemDisabled = (item: DataItem) => { if (item.showDisabledInNonEE && item.isEnterprise) { return !(isCloud() || workspace?.hasLicenseKey); } return false; }; const menuItems = groupedData.map((group) => { if (group.heading === "System" && (!isAdmin || isCloud())) { return null; } return (