import React, { useEffect, useState } from 'react'; import { Settings, Users, Sliders, Shield, Palette, Activity, } from '../icons'; import { useToast } from './Toasts/useToast'; import RuleStateControls from './RuleStateControls'; import './Dashboard.css'; import './Config.css'; import type { ConfigTab } from './Config/types'; import { useConfig } from './Config/useConfig'; import { WorkersPanel } from './Config/WorkersPanel'; import { LimitsTab } from './Config/tabs/LimitsTab'; import { UsersTab } from './Config/tabs/UsersTab'; import { GlobalsTab } from './Config/tabs/GlobalsTab'; import { AppearanceTab } from './Config/tabs/AppearanceTab'; const Config: React.FC = () => { const { config, loading, isAdmin, setDeploymentLimit, setGlobalMutationInterval, addUser, deleteUser, setUserRole, resetUserPassword, reinit, } = useConfig(); const { push: pushToast } = useToast(); const [activeTab, setActiveTab] = useState('limits'); // If server didn't send users, force tab away from users. useEffect(() => { if (config && !config.users && activeTab === 'users') { setActiveTab('limits'); } }, [config, activeTab]); if (loading) { return (
LOADING CONFIGURATION...
); } if (!config) { return (

FAILED TO LOAD CONFIGURATION

); } const tabs: { key: ConfigTab; label: string; icon: React.ReactNode }[] = [ { key: 'limits', label: 'DEPLOYMENT LIMITS', icon: }, ...(config.users ? [{ key: 'users' as const, label: 'USER MANAGEMENT', icon: }] : []), { key: 'globals', label: 'GLOBAL VALUES', icon: }, { key: 'appearance', label: 'APPEARANCE', icon: }, ...(isAdmin ? [{ key: 'workers' as const, label: 'WORKERS', icon: }] : []), ...(isAdmin ? [{ key: 'ttp' as const, label: 'TTP RULES', icon: }] : []), ]; return (

SYSTEM CONFIGURATION

{tabs.map((tab) => ( ))}
{activeTab === 'limits' && ( )} {activeTab === 'users' && config.users && ( )} {activeTab === 'globals' && ( )} {activeTab === 'appearance' && } {activeTab === 'workers' && isAdmin && ( )} {/* RuleStateControls also self-gates on /config?.role so a state leak can't render it. */} {activeTab === 'ttp' && isAdmin && }
); }; export default Config;