import { ChevronLeft, Loader2 } from "lucide-react";
import { SkillsCatalogSettings } from "@/components/settings/SkillsCatalogSettings";
import { ImageGenerationSettings } from "@/components/settings/capabilities/ImageGenerationSettings";
import { AdvancedSettings } from "@/components/settings/capabilities/SecuritySettings";
import { TranscriptionSettings } from "@/components/settings/capabilities/TranscriptionSettings";
import { WebSettings } from "@/components/settings/capabilities/WebSettings";
import {
ModelPresetDeleteDialog,
ModelsSettings,
} from "@/components/settings/models/ModelsSettings";
import {
ProviderOAuthLoginDialog,
ProvidersSettings,
providerFormFromRow,
} from "@/components/settings/models/ProviderSettings";
import { AppearanceSettings, OverviewSettings } from "@/components/settings/overview/OverviewSettings";
import { SettingsSidebar, standaloneSectionTitle } from "@/components/settings/SettingsSidebar";
import {
NanobotFeatureInstallDialog,
SettingsGroup,
SettingsRow,
} from "@/components/settings/shared/SettingsControls";
import { AppsCatalogSettings } from "@/components/settings/system/AppsSettings";
import {
AutomationDeleteDialog,
AutomationEditDialog,
AutomationsSettings,
} from "@/components/settings/system/AutomationsSettings";
import { ChannelsSettings } from "@/components/settings/system/ChannelsSettings";
import { RuntimeSettings } from "@/components/settings/system/RuntimeSettings";
import type { SettingsController } from "@/components/settings/useSettingsController";
import type { SkillSummary } from "@/lib/types";
import { cn } from "@/lib/utils";
interface SettingsPageProps {
controller: SettingsController;
theme: "light" | "dark";
showSidebar: boolean;
onToggleTheme: () => void;
onBackToChat: () => void;
skills: SkillSummary[];
onLogout?: () => void;
isRestarting: boolean;
hostChromeInset: boolean;
}
export function SettingsPage({
controller,
theme,
showSidebar,
onToggleTheme,
onBackToChat,
skills,
onLogout,
isRestarting,
hostChromeInset,
}: SettingsPageProps) {
const {
activeSection,
apiService,
apiServiceAction,
apiServiceError,
apiServiceLoading,
appsKindFilter,
appsQuery,
automationAction,
automationPendingDelete,
automationPendingEdit,
automations,
automationsError,
automationsFilter,
automationsLoading,
automationsQuery,
automationsSort,
beginModelPresetCreation,
cancelModelPresetCreation,
changeModelCallOrder,
channelsQuery,
cliApps,
cliAppsAction,
cliAppsError,
cliAppsFocusName,
cliAppsLoading,
cliAppsMessage,
closeProviderOAuthFlow,
completeProviderOAuthResponse,
createCustomProvider,
customMcpForm,
editingProviderKeys,
error,
expandedProvider,
featureCatalog,
form,
handleApiServiceAction,
handleAutomationAction,
handleAutomationEdit,
handleCliAppAction,
handleDeleteModelConfiguration,
handleImportMcpConfig,
handleMcpOAuthCancel,
handleMcpOAuthComplete,
handleMcpOAuthConnect,
handleMcpOAuthOpen,
handleMcpPresetAction,
handleMcpToolsChange,
handleMigrateModelConfigurations,
handleNanobotFeatureAction,
handleSaveCustomMcp,
handleToggleProvider,
handleWebSearchProviderChange,
hasPendingRestart,
hostEngineApplying,
imageGenerationDirty,
imageGenerationForm,
imageGenerationSaving,
installCapabilities,
loading,
localPrefs,
mcpConfigImport,
mcpError,
mcpFieldValues,
mcpMessage,
mcpOAuthCallbackError,
mcpOAuthCallbackUrl,
mcpOAuthCompleting,
mcpOAuthFlow,
mcpOAuthPopupBlocked,
mcpPresetAction,
mcpPresets,
mcpPresetsLoading,
modelCallOrder,
modelCallOrderSaving,
modelConfigurationSaving,
modelDirty,
modelMigrationSaving,
modelPresetBeforeCreateRef,
modelPresetCreating,
modelPresetEditingName,
modelPresetNameError,
modelPresetPendingDelete,
nanobotFeatureAction,
nanobotFeatureConfirm,
nanobotFeatures,
nanobotFeaturesError,
nanobotFeaturesLoading,
networkSafetyDirty,
networkSafetyForm,
networkSafetySaving,
pendingRestartSections,
providerForms,
providerOAuthCompleting,
providerOAuthDialogError,
providerOAuthFlow,
providerOAuthResponse,
providerSaving,
remoteBrowserAccess,
resetWebSearchDraft,
restartViaSettingsSurface,
runProviderOAuth,
saveImageGenerationSettings,
saveModelSettings,
saveNetworkSafetySettings,
saveProvider,
saveTranscriptionSettings,
saveWebSearch,
saving,
selectSection,
setAppsKindFilter,
setAppsQuery,
setAutomationPendingDelete,
setAutomationPendingEdit,
setAutomationsFilter,
setAutomationsQuery,
setAutomationsSort,
setChannelsQuery,
setCliAppsError,
setCliAppsMessage,
setCustomMcpForm,
setForm,
setImageGenerationForm,
setLocalPrefs,
setMcpConfigImport,
setMcpError,
setMcpFieldValues,
setMcpMessage,
setMcpOAuthCallbackError,
setMcpOAuthCallbackUrl,
setModelPresetCreating,
setModelPresetEditingName,
setModelPresetNameError,
setModelPresetPendingDelete,
setNanobotFeatureConfirm,
setNanobotFeatures,
setNanobotFeaturesError,
setNetworkSafetyForm,
setProviderForms,
setProviderOAuthDialogError,
setProviderOAuthResponse,
setTranscriptionForm,
setWebSearchForm,
setWebSearchKeyEditing,
setWebSearchKeyVisible,
settings,
t,
toggleProviderKeyEditing,
toggleProviderKeyVisibility,
token,
transcriptionDirty,
transcriptionForm,
transcriptionSaving,
visibleProviderKeys,
webSearchForm,
webSearchKeyEditing,
webSearchKeyVisible,
webSearchSaving,
} = controller;
const renderSection = () => {
if (!settings) return null;
switch (activeSection) {
case "overview":
return (