diff --git a/apps/app/src/components/views/settings-view.tsx b/apps/app/src/components/views/settings-view.tsx index 181b2ae9..9f290257 100644 --- a/apps/app/src/components/views/settings-view.tsx +++ b/apps/app/src/components/views/settings-view.tsx @@ -2,7 +2,6 @@ import { useState } from "react"; import { useAppStore } from "@/store/app-store"; -import { Label } from "@/components/ui/label"; import { Key, Palette, @@ -11,12 +10,13 @@ import { Trash2, Settings2, Volume2, - VolumeX, } from "lucide-react"; -import { Checkbox } from "@/components/ui/checkbox"; -import { useCliStatus } from "./settings-view/hooks/use-cli-status"; -import { useScrollTracking } from "@/hooks/use-scroll-tracking"; +import { + useCliStatus, + useSettingsView, + type SettingsViewId, +} from "./settings-view/hooks"; import { SettingsHeader } from "./settings-view/components/settings-header"; import { KeyboardMapDialog } from "./settings-view/components/keyboard-map-dialog"; import { DeleteProjectDialog } from "./settings-view/components/delete-project-dialog"; @@ -24,6 +24,7 @@ import { SettingsNavigation } from "./settings-view/components/settings-navigati import { ApiKeysSection } from "./settings-view/api-keys/api-keys-section"; import { ClaudeCliStatus } from "./settings-view/cli-status/claude-cli-status"; import { AppearanceSection } from "./settings-view/appearance/appearance-section"; +import { AudioSection } from "./settings-view/audio/audio-section"; import { KeyboardShortcutsSection } from "./settings-view/keyboard-shortcuts/keyboard-shortcuts-section"; import { FeatureDefaultsSection } from "./settings-view/feature-defaults/feature-defaults-section"; import { DangerZoneSection } from "./settings-view/danger-zone/danger-zone-section"; @@ -91,23 +92,72 @@ export function SettingsView() { }; // Use CLI status hook - const { - claudeCliStatus, - isCheckingClaudeCli, - handleRefreshClaudeCli, - } = useCliStatus(); + const { claudeCliStatus, isCheckingClaudeCli, handleRefreshClaudeCli } = + useCliStatus(); - // Use scroll tracking hook - const { activeSection, scrollToSection, scrollContainerRef } = - useScrollTracking({ - items: NAV_ITEMS, - filterFn: (item) => item.id !== "danger" || !!currentProject, - initialSection: "api-keys", - }); + // Use settings view navigation hook + const { activeView, navigateTo } = useSettingsView(); const [showDeleteDialog, setShowDeleteDialog] = useState(false); const [showKeyboardMapDialog, setShowKeyboardMapDialog] = useState(false); + // Render the active section based on current view + const renderActiveSection = () => { + switch (activeView) { + case "api-keys": + return ; + case "claude": + return ( + + ); + case "appearance": + return ( + + ); + case "keyboard": + return ( + setShowKeyboardMapDialog(true)} + /> + ); + case "audio": + return ( + + ); + case "defaults": + return ( + + ); + case "danger": + return ( + setShowDeleteDialog(true)} + /> + ); + default: + return ; + } + }; + return (
- {/* Sticky Side Navigation */} + {/* Side Navigation - No longer scrolls, just switches views */} navigateTo(id as SettingsViewId)} /> - {/* Scrollable Content */} -
-
- {/* API Keys Section */} - - - {/* Claude CLI Status Section */} - {claudeCliStatus && ( - - )} - - {/* Appearance Section */} - - - - {/* Keyboard Shortcuts Section */} - setShowKeyboardMapDialog(true)} - /> - - {/* Audio Section */} -
-
-
-
- -
-

- Audio -

-
-

- Configure audio and notification settings. -

-
-
- {/* Mute Done Sound Setting */} -
- - setMuteDoneSound(checked === true) - } - className="mt-1" - data-testid="mute-done-sound-checkbox" - /> -
- -

- When enabled, disables the "ding" sound that - plays when an agent completes a feature. The feature - will still move to the completed column, but without - audio notification. -

-
-
-
-
- - {/* Feature Defaults Section */} - - - {/* Danger Zone Section - Only show when a project is selected */} - setShowDeleteDialog(true)} - /> -
+ {/* Content Panel - Shows only the active section */} +
+
{renderActiveSection()}
diff --git a/apps/app/src/components/views/settings-view/api-keys/api-keys-section.tsx b/apps/app/src/components/views/settings-view/api-keys/api-keys-section.tsx index 527cbf22..874911a2 100644 --- a/apps/app/src/components/views/settings-view/api-keys/api-keys-section.tsx +++ b/apps/app/src/components/views/settings-view/api-keys/api-keys-section.tsx @@ -58,9 +58,8 @@ export function ApiKeysSection() { return (
void; +} + +export function AudioSection({ + muteDoneSound, + onMuteDoneSoundChange, +}: AudioSectionProps) { + return ( +
+
+
+
+ +
+

+ Audio +

+
+

+ Configure audio and notification settings. +

+
+
+
+ onMuteDoneSoundChange(checked === true)} + className="mt-1" + data-testid="mute-done-sound-checkbox" + /> +
+ +

+ When enabled, disables the "ding" sound that plays when + an agent completes a feature. The feature will still move to the + completed column, but without audio notification. +

+
+
+
+
+ ); +} diff --git a/apps/app/src/components/views/settings-view/cli-status/claude-cli-status.tsx b/apps/app/src/components/views/settings-view/cli-status/claude-cli-status.tsx index e0283130..8df5b836 100644 --- a/apps/app/src/components/views/settings-view/cli-status/claude-cli-status.tsx +++ b/apps/app/src/components/views/settings-view/cli-status/claude-cli-status.tsx @@ -23,9 +23,8 @@ export function ClaudeCliStatus({ return (
(initialView); + + const navigateTo = useCallback((viewId: SettingsViewId) => { + setActiveView(viewId); + }, []); + + return { + activeView, + navigateTo, + }; +} diff --git a/apps/app/src/components/views/settings-view/keyboard-shortcuts/keyboard-shortcuts-section.tsx b/apps/app/src/components/views/settings-view/keyboard-shortcuts/keyboard-shortcuts-section.tsx index a62bd3ac..10c25bc6 100644 --- a/apps/app/src/components/views/settings-view/keyboard-shortcuts/keyboard-shortcuts-section.tsx +++ b/apps/app/src/components/views/settings-view/keyboard-shortcuts/keyboard-shortcuts-section.tsx @@ -11,9 +11,8 @@ export function KeyboardShortcutsSection({ }: KeyboardShortcutsSectionProps) { return (