Skip to content

fix(settings): redesign settings UI, remove dead code (LAC-2628) - #473

Open
lacymorrow wants to merge 1 commit into
mainfrom
LAC-2628-redesign-and-improve-the-uinux-for-the-settings
Open

fix(settings): redesign settings UI, remove dead code (LAC-2628)#473
lacymorrow wants to merge 1 commit into
mainfrom
LAC-2628-redesign-and-improve-the-uinux-for-the-settings

Conversation

@lacymorrow

Copy link
Copy Markdown
Owner

Summary

  • Removed 920 lines of dead/duplicate code from the settings UI
  • Fixed duplicate Companion Mode state (was in both General and Tools panes — independent state that could desync)
  • Fixed duplicate Whisper model card (entire card copy-pasted in VoiceSettings)
  • Deleted dead NotificationSettings component (485 lines, exported but never rendered)
  • Deleted unused SettingsField and SettingsSection wrapper components
  • Consolidated duplicate type definitions (re-export from canonical src/types/settings.ts)
  • Replaced browser confirm() dialog with inline confirmation UI (banned per CLAUDE.md)
  • Cleaned up AI-slop design: removed Brain/Sparkles icons, semantic color rainbow walkthrough, emoji tips
  • Compacted sidebar layout (w-48 vs w-64, 4x4 icons, no descriptions per item)
  • Replaced inline SVG with Lucide MousePointer2 icon

Test plan

  • npx tsc --noEmit passes clean
  • 26/26 frontend tests pass
  • Visual check: open settings window and verify all 8 panes render correctly
  • Verify Companion Mode toggle only appears in Tools pane (not duplicated in General)
  • Verify Whisper model card appears only once in Voice & Audio
  • Verify Reset All Settings uses inline confirm (no browser dialog)
  • Verify sidebar is narrower and items are compact

…s, clean up layout (LAC-2628)

- Remove duplicate Whisper model card in VoiceSettings (106 lines of copy-paste)
- Remove duplicate Companion Mode from GeneralSettings (keep single source in Tools)
- Delete dead NotificationSettings component (485 lines, never rendered)
- Delete unused SettingsField and SettingsSection wrapper components
- Consolidate duplicate types — re-export from canonical src/types/settings.ts
- Remove dead navigation props (onNavigateToDevTools/Chat/Permissions)
- Replace browser confirm() dialog with inline confirmation UI in reset
- Compact sidebar layout (w-48 vs w-64, smaller icons, no descriptions)
- Replace Brain/Sparkles icons and semantic color rainbow (AI slop cleanup)
- Replace inline SVG with Lucide MousePointer2 in ToolsSettings
- Remove commented-out cloud status handler in NetworkSettings
- Condense shortcuts tips and cloud walkthrough to minimal prose

Net: -920 lines across 12 files. TypeScript clean, 26/26 tests pass.
@claude

claude Bot commented Jul 8, 2026

Copy link
Copy Markdown

Claude encountered an error —— View job


I'll analyze this and get back to you.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors and simplifies the settings interface by removing several unused sections and components, including the notification settings, companion mode, and Whisper speech-to-text model configuration. It also updates the layout and styling of the settings window, replaces the native browser confirmation dialog in the advanced settings with an inline UI confirmation, and cleans up various icons and type definitions. Feedback is provided on ModularSettingsWindow.tsx to move the getCurrentWindow() call inside the useEffect hook with an empty dependency array to prevent unnecessary re-runs.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines 41 to 52
const window = getCurrentWindow();

useEffect(() => {
// Set up the window properly for macOS
const setupWindow = async () => {
try {
await window.setTitle("Juno Settings");
if (window.label === "settings") {
console.log("Modular settings window initialized");
}
} catch (error) {
console.error("Failed to setup modular settings window:", error);
console.error("Failed to setup settings window:", error);
}
};

setupWindow();
}, [window]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Calling getCurrentWindow() in the component render body and using the returned window object as a dependency in useEffect can cause the effect to run unnecessarily if the window reference is not stable across renders. Since window is only used inside this effect, we can call getCurrentWindow() directly inside the useEffect and use an empty dependency array [] to ensure it only runs once on mount.

  useEffect(() => {
    const setupWindow = async () => {
      try {
        const win = getCurrentWindow();
        await win.setTitle("Juno Settings");
      } catch (error) {
        console.error("Failed to setup settings window:", error);
      }
    };
    setupWindow();
  }, []);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant