memos/web/src/components/Settings/settingSections.ts

151 lines
3.8 KiB
TypeScript

import {
BarChart3Icon,
CogIcon,
DatabaseIcon,
HeartHandshakeIcon,
KeyIcon,
LibraryIcon,
type LucideIcon,
MailIcon,
Settings2Icon,
TagsIcon,
UserIcon,
UsersIcon,
WebhookIcon,
} from "lucide-react";
import { type ComponentType } from "react";
import AISection from "@/components/Settings/AISection";
import InstanceSection from "@/components/Settings/InstanceSection";
import MemberSection from "@/components/Settings/MemberSection";
import MemoRelatedSettings from "@/components/Settings/MemoRelatedSettings";
import MyAccountSection from "@/components/Settings/MyAccountSection";
import NotificationSection from "@/components/Settings/NotificationSection";
import PreferencesSection from "@/components/Settings/PreferencesSection";
import ResourceStatsSection from "@/components/Settings/ResourceStatsSection";
import SSOSection from "@/components/Settings/SSOSection";
import StorageSection from "@/components/Settings/StorageSection";
import TagsSection from "@/components/Settings/TagsSection";
import WebhookSection from "@/components/Settings/WebhookSection";
import { InstanceSetting_Key } from "@/types/proto/api/v1/instance_service_pb";
export type SettingSectionKey =
| "my-account"
| "preference"
| "webhook"
| "member"
| "system"
| "memo"
| "storage"
| "notification"
| "sso"
| "tags"
| "ai"
| "resource-stats";
type SettingSectionScope = "basic" | "admin";
export interface SettingSectionDefinition {
key: SettingSectionKey;
scope: SettingSectionScope;
labelKey: `setting.${SettingSectionKey}.label`;
icon: LucideIcon;
component: ComponentType;
preloadSettingKeys?: InstanceSetting_Key[];
}
export const SETTINGS_SECTIONS: SettingSectionDefinition[] = [
{
key: "my-account",
scope: "basic",
labelKey: "setting.my-account.label",
icon: UserIcon,
component: MyAccountSection,
},
{
key: "preference",
scope: "basic",
labelKey: "setting.preference.label",
icon: CogIcon,
component: PreferencesSection,
},
{
key: "webhook",
scope: "basic",
labelKey: "setting.webhook.label",
icon: WebhookIcon,
component: WebhookSection,
},
{
key: "member",
scope: "admin",
labelKey: "setting.member.label",
icon: UsersIcon,
component: MemberSection,
},
{
key: "system",
scope: "admin",
labelKey: "setting.system.label",
icon: Settings2Icon,
component: InstanceSection,
},
{
key: "memo",
scope: "admin",
labelKey: "setting.memo.label",
icon: LibraryIcon,
component: MemoRelatedSettings,
},
{
key: "tags",
scope: "admin",
labelKey: "setting.tags.label",
icon: TagsIcon,
component: TagsSection,
preloadSettingKeys: [InstanceSetting_Key.TAGS],
},
{
key: "storage",
scope: "admin",
labelKey: "setting.storage.label",
icon: DatabaseIcon,
component: StorageSection,
preloadSettingKeys: [InstanceSetting_Key.STORAGE],
},
{
key: "notification",
scope: "admin",
labelKey: "setting.notification.label",
icon: MailIcon,
component: NotificationSection,
preloadSettingKeys: [InstanceSetting_Key.NOTIFICATION],
},
{
key: "sso",
scope: "admin",
labelKey: "setting.sso.label",
icon: KeyIcon,
component: SSOSection,
},
{
key: "ai",
scope: "admin",
labelKey: "setting.ai.label",
icon: HeartHandshakeIcon,
component: AISection,
preloadSettingKeys: [InstanceSetting_Key.AI],
},
{
key: "resource-stats",
scope: "admin",
labelKey: "setting.resource-stats.label",
icon: BarChart3Icon,
component: ResourceStatsSection,
},
];
export const DEFAULT_SETTING_SECTION: SettingSectionKey = "my-account";
export const isSettingSectionKey = (value: string): value is SettingSectionKey => {
return SETTINGS_SECTIONS.some((section) => section.key === value);
};