feat (desktop): added open first file on changes open#693
Conversation
📝 WalkthroughWalkthroughThe SidebarControl component was enhanced to automatically open the first available changed file when the sidebar is activated. It queries workspace context, resolves the base branch, determines file changes by priority category (against-base, staged, unstaged, untracked), and integrates with tab management to display the file while invalidating cached content. Changes
Sequence DiagramssequenceDiagram
actor User
participant SidebarControl
participant WorkspaceStore
participant FileChangesAPI
participant TabManager
participant FileContentCache
User->>SidebarControl: Click toggle button
SidebarControl->>SidebarControl: Check sidebar state
alt Sidebar is closed
SidebarControl->>WorkspaceStore: Fetch active workspace
WorkspaceStore-->>SidebarControl: Return workspace/worktree context
SidebarControl->>WorkspaceStore: Get base branch (with fallback)
WorkspaceStore-->>SidebarControl: Return base branch
SidebarControl->>FileChangesAPI: Query file changes by category
FileChangesAPI-->>SidebarControl: Return prioritized file list
SidebarControl->>SidebarControl: Select first available file
SidebarControl->>TabManager: Add file to viewer pane
TabManager-->>SidebarControl: File opened
SidebarControl->>TabManager: Select file in tabs
SidebarControl->>FileContentCache: Invalidate file content
FileContentCache-->>SidebarControl: Cache cleared
end
SidebarControl->>SidebarControl: Toggle sidebar visibility
SidebarControl-->>User: Sidebar toggled (+ file opened if closed)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Poem
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)
apps/desktop/src/renderer/screens/main/components/SidebarControl/SidebarControl.tsx (1)
107-114: Consider simplifying by extracting the commontoggleSidebar()call.Both branches call
toggleSidebar(), which can be extracted to reduce duplication.♻️ Suggested simplification
const handleClick = useCallback(() => { - if (isSidebarOpen) { - toggleSidebar(); - } else { - toggleSidebar(); + const wasOpen = isSidebarOpen; + toggleSidebar(); + if (!wasOpen) { openFirstFile(); } }, [isSidebarOpen, toggleSidebar, openFirstFile]);
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
apps/desktop/src/renderer/screens/main/components/SidebarControl/SidebarControl.tsx
🧰 Additional context used
📓 Path-based instructions (6)
apps/desktop/**/*.{ts,tsx}
📄 CodeRabbit inference engine (apps/desktop/AGENTS.md)
apps/desktop/**/*.{ts,tsx}: For Electron interprocess communication, ALWAYS use tRPC as defined insrc/lib/trpc
Use alias as defined intsconfig.jsonwhen possible
Prefer zustand for state management if it makes sense. Do not use effect unless absolutely necessary.
For tRPC subscriptions with trpc-electron, ALWAYS use the observable pattern from@trpc/server/observableinstead of async generators, as the library explicitly checksisObservable(result)and throws an error otherwise
Files:
apps/desktop/src/renderer/screens/main/components/SidebarControl/SidebarControl.tsx
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Use object parameters for functions with 2+ parameters instead of positional arguments
Functions with 2+ parameters should accept a single params object with named properties for self-documentation and extensibility
Use prefixed console logging with context pattern: [domain/operation] message
Extract magic numbers and hardcoded values to named constants at module top
Use lookup objects/maps instead of repeated if (type === ...) conditionals
Avoid usinganytype - maintain type safety in TypeScript code
Never swallow errors silently - at minimum log them with context
Import from concrete files directly when possible - avoid barrel file abuse that creates circular dependencies
Avoid deep nesting (4+ levels) - use early returns, extract functions, and invert conditions
Use named properties in options objects instead of boolean parameters to avoid boolean blindness
Files:
apps/desktop/src/renderer/screens/main/components/SidebarControl/SidebarControl.tsx
apps/desktop/src/renderer/**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
Never import Node.js modules (fs, path, os, net) in renderer process or shared code - they are externalized for browser compatibility
Files:
apps/desktop/src/renderer/screens/main/components/SidebarControl/SidebarControl.tsx
**/*.tsx
📄 CodeRabbit inference engine (AGENTS.md)
One component per file - do not create multi-component files
Files:
apps/desktop/src/renderer/screens/main/components/SidebarControl/SidebarControl.tsx
apps/**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
Use Drizzle ORM for all database operations - never use raw SQL
Files:
apps/desktop/src/renderer/screens/main/components/SidebarControl/SidebarControl.tsx
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
Use Biome for formatting and linting - run at root level with
bun run lint:fixorbiome check --write
Files:
apps/desktop/src/renderer/screens/main/components/SidebarControl/SidebarControl.tsx
🧬 Code graph analysis (1)
apps/desktop/src/renderer/screens/main/components/SidebarControl/SidebarControl.tsx (1)
apps/desktop/src/shared/changes-types.ts (1)
ChangeCategory(15-19)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Build
🔇 Additional comments (4)
apps/desktop/src/renderer/screens/main/components/SidebarControl/SidebarControl.tsx (4)
27-44: Query enabling logic is well-structured.The conditional query enabling (
!isSidebarOpen) ensures data is pre-fetched while the sidebar is closed and available immediately when the user clicks. This avoids unnecessary refetches while the sidebar is open.
50-70: LGTM!Good error handling with proper context logging following the
[domain/operation]pattern. The parallel invalidation withPromise.allis efficient.
72-105: LGTM!The priority-based file selection logic is clear and efficient. The early return guards prevent unnecessary processing, and the callback properly chains the file selection, pane opening, and cache invalidation.
14-22: The status object does include theuntrackedproperty. TheGitChangesStatustype (returned by thegetStatusendpoint) explicitly definesuntracked: ChangedFile[], and the router returns this field directly. The FILE_CATEGORIES mapping is correct.
🧹 Preview Cleanup CompleteThe following preview resources have been cleaned up:
Thank you for your contribution! 🎉 |
* added open file on changes open * make less verbose and fewer trpc calls
Description
Related Issues
Type of Change
Testing
Screenshots (if applicable)
Additional Notes
Summary by CodeRabbit
Release Notes
✏️ Tip: You can customize this high-level summary in your review settings.