import React from "react";
import { type TFunction } from "i18next";
import {
createConfigNavSections as createCoreConfigNavSections,
type ConfigNavSection,
} from "@core/components/shared/config/configNavSections";
import HotkeysSection from "@app/components/shared/config/configSections/HotkeysSection";
import GeneralSection from "@app/components/shared/config/configSections/GeneralSection";
import PasswordSecurity from "@app/components/shared/config/configSections/PasswordSecurity";
import ApiKeys from "@app/components/shared/config/configSections/ApiKeys";
import Plan from "@app/components/shared/config/configSections/Plan";
type OverviewComponent = React.ComponentType<{ onLogoutClick: () => void }>;
interface CreateSaasConfigNavSectionsOptions {
isDev?: boolean;
isAnonymous?: boolean;
t: TFunction<"translation", undefined>;
}
function ensurePreferencesSection(sections: ConfigNavSection[]): ConfigNavSection[] {
const preferencesIndex = sections.findIndex((section) => section.title === "Preferences");
if (preferencesIndex === -1) {
return [
...sections,
{
title: "Preferences",
items: [
{
key: "general",
label: "General",
icon: "settings-rounded",
component: ,
},
{
key: "hotkeys",
label: "Keyboard Shortcuts",
icon: "keyboard-rounded",
component: ,
},
],
},
];
}
return sections;
}
function appendDeveloperSection(sections: ConfigNavSection[]): ConfigNavSection[] {
const hasDeveloper = sections.some((section) =>
section.items.some((item) => item.key === "developer" || item.key === "api-keys"),
);
if (hasDeveloper) {
return sections;
}
return [
...sections,
{
title: "Developer",
items: [
{
key: "api-keys",
label: "API Keys",
icon: "key-rounded",
component: ,
},
],
},
];
}
function appendBillingSection(sections: ConfigNavSection[], t: TFunction<"translation", undefined>): ConfigNavSection[] {
const hasPlan = sections.some((section) => section.items.some((item) => item.key === "plan"));
if (hasPlan) {
return sections;
}
return [
...sections,
{
title: "Billing",
items: [
{
key: "plan",
label: t("config.plan", "Plan"),
icon: "credit-card",
component: ,
},
],
},
];
}
export function createSaasConfigNavSections(
Overview: OverviewComponent,
onLogoutClick: () => void,
{ isDev = false, isAnonymous = false, t }: CreateSaasConfigNavSectionsOptions,
): ConfigNavSection[] {
const baseSections = createCoreConfigNavSections(false, false, false);
// Create Account section as the first section with Overview and Passwords & Security
const accountSection: ConfigNavSection = {
title: t("config.account.overview.title", "Account Settings"),
items: [
{
key: "overview",
label: t("config.account.overview.label", "Overview"),
icon: "account-circle",
component: ,
},
{
key: "security",
label: "Passwords & Security",
icon: "lock",
component: ,
},
],
};
let sections = [accountSection, ...baseSections];
// Suppress OSS-only sections (update checker, login config banner) not relevant in SaaS
sections = sections.map((section) => ({
...section,
items: section.items.map((item) =>
item.key === "general" ? { ...item, component: } : item,
),
}));
sections = ensurePreferencesSection(sections);
sections = appendDeveloperSection(sections);
if (!isAnonymous) {
sections = appendBillingSection(sections, t);
}
if (isDev) {
console.debug("[AppConfigModal] SaaS navigation sections", sections);
}
return sections;
}