Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions src/components/RightSidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,9 @@ const RightSidebarComponent: React.FC<RightSidebarProps> = ({
// Global tab preference (not per-workspace)
const [selectedTab, setSelectedTab] = usePersistedState<TabType>("right-sidebar-tab", "costs");

// Trigger for focusing Review panel (preserves hunk selection)
const [focusTrigger, setFocusTrigger] = React.useState(0);

// Notify parent (AIView) of tab changes so it can enable/disable resize functionality
React.useEffect(() => {
onTabChange?.(selectedTab);
Expand All @@ -192,13 +195,18 @@ const RightSidebarComponent: React.FC<RightSidebarProps> = ({
setSelectedTab("costs");
} else if (matchesKeybind(e, KEYBINDS.REVIEW_TAB)) {
e.preventDefault();
setSelectedTab("review");
// If already on Review tab, focus the panel
if (selectedTab === "review") {
setFocusTrigger((prev) => prev + 1);
} else {
setSelectedTab("review");
}
}
};

window.addEventListener("keydown", handleKeyDown);
return () => window.removeEventListener("keydown", handleKeyDown);
}, [setSelectedTab]);
}, [setSelectedTab, selectedTab]);

const usage = useWorkspaceUsage(workspaceId);
const [use1M] = use1MContext();
Expand Down Expand Up @@ -337,6 +345,7 @@ const RightSidebarComponent: React.FC<RightSidebarProps> = ({
workspaceId={workspaceId}
workspacePath={workspacePath}
onReviewNote={onReviewNote}
focusTrigger={focusTrigger}
/>
</div>
)}
Expand Down
12 changes: 12 additions & 0 deletions src/components/RightSidebar/CodeReview/ReviewPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ interface ReviewPanelProps {
workspaceId: string;
workspacePath: string;
onReviewNote?: (note: string) => void;
/** Trigger to focus panel (increment to trigger) */
focusTrigger?: number;
}

const PanelContainer = styled.div`
Expand Down Expand Up @@ -274,7 +276,9 @@ export const ReviewPanel: React.FC<ReviewPanelProps> = ({
workspaceId,
workspacePath,
onReviewNote,
focusTrigger,
}) => {
const panelRef = useRef<HTMLDivElement>(null);
const [hunks, setHunks] = useState<DiffHunk[]>([]);
const [selectedHunkId, setSelectedHunkId] = useState<string | null>(null);
const [isLoadingHunks, setIsLoadingHunks] = useState(true);
Expand Down Expand Up @@ -322,6 +326,13 @@ export const ReviewPanel: React.FC<ReviewPanelProps> = ({
includeUncommitted: includeUncommitted,
});

// Focus panel when focusTrigger changes (preserves current hunk selection)
useEffect(() => {
if (focusTrigger && focusTrigger > 0) {
panelRef.current?.focus();
}
}, [focusTrigger]);

// Load file tree - when workspace, diffBase, or refreshTrigger changes
useEffect(() => {
let cancelled = false;
Expand Down Expand Up @@ -633,6 +644,7 @@ export const ReviewPanel: React.FC<ReviewPanelProps> = ({

return (
<PanelContainer
ref={panelRef}
tabIndex={0}
onFocus={() => setIsPanelFocused(true)}
onBlur={() => setIsPanelFocused(false)}
Expand Down