151 lines
3.8 KiB
TypeScript
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);
|
|
};
|