Spaces:
Build error
Build error
| import { NavLink, Outlet, useLocation, useNavigate } from "react-router"; | |
| import { useTranslation } from "react-i18next"; | |
| import React from "react"; | |
| import SettingsIcon from "#/icons/settings.svg?react"; | |
| import { cn } from "#/utils/utils"; | |
| import { useConfig } from "#/hooks/query/use-config"; | |
| import { I18nKey } from "#/i18n/declaration"; | |
| function SettingsScreen() { | |
| const { t } = useTranslation(); | |
| const navigate = useNavigate(); | |
| const { pathname } = useLocation(); | |
| const { data: config } = useConfig(); | |
| const isSaas = config?.APP_MODE === "saas"; | |
| const saasNavItems = [ | |
| { to: "/settings/user", text: t("SETTINGS$NAV_USER") }, | |
| { to: "/settings/git", text: t("SETTINGS$NAV_GIT") }, | |
| { to: "/settings/app", text: t("SETTINGS$NAV_APPLICATION") }, | |
| { to: "/settings/billing", text: t("SETTINGS$NAV_CREDITS") }, | |
| { to: "/settings/secrets", text: t("SETTINGS$NAV_SECRETS") }, | |
| { to: "/settings/api-keys", text: t("SETTINGS$NAV_API_KEYS") }, | |
| ]; | |
| const ossNavItems = [ | |
| { to: "/settings", text: t("SETTINGS$NAV_LLM") }, | |
| { to: "/settings/mcp", text: t("SETTINGS$NAV_MCP") }, | |
| { to: "/settings/git", text: t("SETTINGS$NAV_GIT") }, | |
| { to: "/settings/app", text: t("SETTINGS$NAV_APPLICATION") }, | |
| { to: "/settings/secrets", text: t("SETTINGS$NAV_SECRETS") }, | |
| ]; | |
| React.useEffect(() => { | |
| if (isSaas) { | |
| if (pathname === "/settings") { | |
| navigate("/settings/user"); | |
| } | |
| } else { | |
| const noEnteringPaths = [ | |
| "/settings/user", | |
| "/settings/billing", | |
| "/settings/credits", | |
| "/settings/api-keys", | |
| ]; | |
| if (noEnteringPaths.includes(pathname)) { | |
| navigate("/settings"); | |
| } | |
| } | |
| }, [isSaas, pathname]); | |
| const navItems = isSaas ? saasNavItems : ossNavItems; | |
| return ( | |
| <main | |
| data-testid="settings-screen" | |
| className="bg-base-secondary border border-tertiary h-full rounded-xl flex flex-col" | |
| > | |
| <header className="px-3 py-1.5 border-b border-b-tertiary flex items-center gap-2"> | |
| <SettingsIcon width={16} height={16} /> | |
| <h1 className="text-sm leading-6">{t(I18nKey.SETTINGS$TITLE)}</h1> | |
| </header> | |
| <nav | |
| data-testid="settings-navbar" | |
| className="flex items-end gap-6 px-9 border-b border-tertiary" | |
| > | |
| {navItems.map(({ to, text }) => ( | |
| <NavLink | |
| end | |
| key={to} | |
| to={to} | |
| className={({ isActive }) => | |
| cn( | |
| "border-b-2 border-transparent py-2.5 px-4 min-w-[40px] flex items-center justify-center", | |
| isActive && "border-primary", | |
| ) | |
| } | |
| > | |
| <span className="text-[#F9FBFE] text-sm">{text}</span> | |
| </NavLink> | |
| ))} | |
| </nav> | |
| <div className="flex flex-col grow overflow-auto"> | |
| <Outlet /> | |
| </div> | |
| </main> | |
| ); | |
| } | |
| export default SettingsScreen; | |