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
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ export class HistoryManager {
await writer.init(safeScrollback);
this.historyWriters.set(paneId, writer);

// Mark init complete BEFORE replaying to avoid re-buffering into the same array
const buffered = this.pendingHistoryData.get(paneId) || [];
this.historyInitializing.delete(paneId);
this.pendingHistoryData.delete(paneId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import { electronTrpc } from "renderer/lib/electron-trpc";
import { electronTrpcClient as trpcClient } from "renderer/lib/trpc-client";
import { navigateToWorkspace } from "renderer/routes/_authenticated/_dashboard/utils/workspace-navigation";
import { NotFound } from "renderer/routes/not-found";
import { ContentView } from "renderer/screens/main/components/WorkspaceView/ContentView";
import { WorkspaceInitializingView } from "renderer/screens/main/components/WorkspaceView/WorkspaceInitializingView";
import { WorkspaceLayout } from "renderer/screens/main/components/WorkspaceView/WorkspaceLayout";
import { useAppHotkey } from "renderer/stores/hotkeys";
import { useSidebarStore } from "renderer/stores/sidebar-state";
import { getPaneDimensions } from "renderer/stores/tabs/pane-refs";
Expand Down Expand Up @@ -336,15 +336,15 @@ function WorkspacePage() {

return (
<div className="flex-1 h-full flex flex-col overflow-hidden">
<div className="flex-1 min-h-0 overflow-hidden">
<div className="flex-1 min-h-0 flex overflow-hidden">
{showInitView ? (
<WorkspaceInitializingView
workspaceId={workspaceId}
workspaceName={workspace?.name ?? "Workspace"}
isInterrupted={hasIncompleteInit && !isInitializing}
/>
) : (
<ContentView />
<WorkspaceLayout />
)}
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "@superset/ui/tooltip";
import { cn } from "@superset/ui/utils";
import { useParams } from "@tanstack/react-router";
import { useCallback } from "react";
import { LuGitCompareArrows } from "react-icons/lu";
import { LuDiff } from "react-icons/lu";
import { HotkeyTooltipContent } from "renderer/components/HotkeyTooltipContent";
import { electronTrpc } from "renderer/lib/electron-trpc";
import { useSidebarStore } from "renderer/stores";
Expand Down Expand Up @@ -129,19 +129,19 @@ export function SidebarControl() {
}
aria-pressed={isSidebarOpen}
className={cn(
"no-drag gap-1.5",
"no-drag gap-1.5 h-6 px-1.5 rounded",
isSidebarOpen
? "font-semibold text-foreground bg-accent"
: "text-muted-foreground hover:text-foreground",
)}
>
<LuGitCompareArrows className="size-4" />
<LuDiff className="size-3" />
<span className="text-xs">Changes</span>
</Button>
</TooltipTrigger>
<TooltipContent side="bottom" showArrow={false}>
<HotkeyTooltipContent
label="Toggle Changes Sidebar"
label="Open Changes Sidebar"
hotkeyId="TOGGLE_SIDEBAR"
/>
Comment on lines 142 to 146
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Tooltip text doesn't match PR objectives.

The PR objectives specify the tooltip should say "Open/Close Changes Sidebar", but the current implementation is static "Open Changes Sidebar". Meanwhile, the aria-label on Lines 127-129 correctly differentiates between "Hide" and "Show" states. Consider making the tooltip label dynamic to match the button's current state and align with the PR objectives.

 <TooltipContent side="bottom" showArrow={false}>
   <HotkeyTooltipContent
-    label="Open Changes Sidebar"
+    label={isSidebarOpen ? "Close Changes Sidebar" : "Open Changes Sidebar"}
     hotkeyId="TOGGLE_SIDEBAR"
   />
 </TooltipContent>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<TooltipContent side="bottom" showArrow={false}>
<HotkeyTooltipContent
label="Toggle Changes Sidebar"
label="Open Changes Sidebar"
hotkeyId="TOGGLE_SIDEBAR"
/>
<TooltipContent side="bottom" showArrow={false}>
<HotkeyTooltipContent
label={isSidebarOpen ? "Close Changes Sidebar" : "Open Changes Sidebar"}
hotkeyId="TOGGLE_SIDEBAR"
/>
🤖 Prompt for AI Agents
In
`@apps/desktop/src/renderer/screens/main/components/SidebarControl/SidebarControl.tsx`
around lines 142 - 146, The tooltip text is static but should reflect the
current sidebar state; update the HotkeyTooltipContent label prop inside
SidebarControl.tsx to be dynamic (use the same state/prop that drives the button
aria-label) so it shows "Open Changes Sidebar" when closed and "Close Changes
Sidebar" when open (or use a combined "Open/Close Changes Sidebar" if
preferred); modify the label passed to HotkeyTooltipContent
(hotkeyId="TOGGLE_SIDEBAR") to derive from the component's isOpen/isVisible
state or the same variable used for the aria-label to keep them consistent.

</TooltipContent>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export function ChangesContent() {
return (
<div className="h-full flex items-center justify-center text-muted-foreground">
🚧 GitHub style code review coming soon
</div>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
type PaneActions,
registerCopyPathLineAction,
useEditorActions,
} from "../../../components/EditorContextMenu";
} from "../../../ContentView/components/EditorContextMenu";

function scrollToFirstDiff(
editor: Monaco.editor.IStandaloneDiffEditor,
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export { ChangesContent } from "./ChangesContent";
export { DiffViewer } from "./components/DiffViewer";
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import type { Tab } from "renderer/stores/tabs/types";
import type { DiffViewMode } from "shared/changes-types";
import { detectLanguage } from "shared/detect-language";
import type { FileViewerMode } from "shared/tabs-types";
import { DiffViewer } from "../../../../../ChangesContent/components/DiffViewer";
import { DiffViewer } from "../../../../../../ChangesContent/components/DiffViewer";
import { registerCopyPathLineAction } from "../../../../../components/EditorContextMenu";
import { FileEditorContextMenu } from "../FileEditorContextMenu";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,7 @@
import { useParams } from "@tanstack/react-router";
import { useMemo } from "react";
import { useSidebarStore } from "renderer/stores";
import {
MAX_SIDEBAR_WIDTH,
MIN_SIDEBAR_WIDTH,
} from "renderer/stores/sidebar-state";
import { useTabsStore } from "renderer/stores/tabs/store";
import { resolveActiveTabIdForWorkspace } from "renderer/stores/tabs/utils";
import { ResizablePanel } from "../../../ResizablePanel";
import { Sidebar } from "../../Sidebar";
import { EmptyTabView } from "./EmptyTabView";
import { TabView } from "./TabView";

Expand All @@ -18,14 +11,6 @@ export function TabsContent() {
const activeTabIds = useTabsStore((s) => s.activeTabIds);
const tabHistoryStacks = useTabsStore((s) => s.tabHistoryStacks);

const {
isSidebarOpen,
sidebarWidth,
setSidebarWidth,
isResizing,
setIsResizing,
} = useSidebarStore();

const activeTabId = useMemo(() => {
if (!activeWorkspaceId) return null;

Expand All @@ -47,25 +32,9 @@ export function TabsContent() {
return allTabs.find((tab) => tab.id === activeTabId) || null;
}, [activeTabId, allTabs]);

// Original behavior when persistence disabled: only render active tab
return (
<div className="flex-1 min-h-0 flex overflow-hidden">
<div className="flex-1 min-w-0 overflow-hidden">
{tabToRender ? <TabView tab={tabToRender} /> : <EmptyTabView />}
</div>
{isSidebarOpen && (
<ResizablePanel
width={sidebarWidth}
onWidthChange={setSidebarWidth}
isResizing={isResizing}
onResizingChange={setIsResizing}
minWidth={MIN_SIDEBAR_WIDTH}
maxWidth={MAX_SIDEBAR_WIDTH}
handleSide="left"
>
<Sidebar />
</ResizablePanel>
)}
{tabToRender ? <TabView tab={tabToRender} /> : <EmptyTabView />}
</div>
);
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import { useSidebarStore } from "renderer/stores/sidebar-state";
import { SidebarControl } from "../../SidebarControl";
import { ContentHeader } from "./ContentHeader";
import { TabsContent } from "./TabsContent";
import { GroupStrip } from "./TabsContent/GroupStrip";

export function ContentView() {
const isSidebarOpen = useSidebarStore((s) => s.isSidebarOpen);

return (
<div className="h-full flex flex-col overflow-hidden">
<ContentHeader trailingAction={<SidebarControl />}>
<ContentHeader
trailingAction={!isSidebarOpen ? <SidebarControl /> : undefined}
>
<GroupStrip />
</ContentHeader>
<TabsContent />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@ import {
import { Tooltip, TooltipContent, TooltipTrigger } from "@superset/ui/tooltip";
import { useEffect, useRef, useState } from "react";
import { HiArrowPath } from "react-icons/hi2";
import { LuExpand, LuLoaderCircle, LuX } from "react-icons/lu";
import { LuExpand, LuLoaderCircle, LuShrink, LuX } from "react-icons/lu";
import { VscGitStash, VscGitStashApply } from "react-icons/vsc";
import { HotkeyTooltipContent } from "renderer/components/HotkeyTooltipContent";
import { electronTrpc } from "renderer/lib/electron-trpc";
import { PRIcon } from "renderer/screens/main/components/PRIcon";
import { usePRStatus } from "renderer/screens/main/hooks";
import { useChangesStore } from "renderer/stores/changes";
import { useSidebarStore } from "renderer/stores/sidebar-state";
import { SidebarMode, useSidebarStore } from "renderer/stores/sidebar-state";
import type { ChangesViewMode } from "../../types";
import { ViewModeToggle } from "../ViewModeToggle";

Expand Down Expand Up @@ -232,7 +233,12 @@ export function ChangesHeader({
onStashPop,
isStashPending,
}: ChangesHeaderProps) {
const { toggleSidebar } = useSidebarStore();
const { toggleSidebar, currentMode, setMode } = useSidebarStore();
const isExpanded = currentMode === SidebarMode.Changes;

const handleExpandToggle = () => {
setMode(isExpanded ? SidebarMode.Tabs : SidebarMode.Changes);
};

return (
<div className="flex flex-col">
Expand All @@ -244,12 +250,21 @@ export function ChangesHeader({
<div className="flex-1" />
<Tooltip>
<TooltipTrigger asChild>
<Button variant="ghost" size="icon" className="size-6 p-0">
<LuExpand className="size-3.5" />
<Button
variant="ghost"
size="icon"
onClick={handleExpandToggle}
className="size-6 p-0"
>
{isExpanded ? (
<LuShrink className="size-3.5" />
) : (
<LuExpand className="size-3.5" />
)}
</Button>
</TooltipTrigger>
<TooltipContent side="bottom" showArrow={false}>
Expand sidebar
{isExpanded ? "Collapse sidebar" : "Expand sidebar"}
</TooltipContent>
</Tooltip>
<Tooltip>
Expand All @@ -264,7 +279,10 @@ export function ChangesHeader({
</Button>
</TooltipTrigger>
<TooltipContent side="bottom" showArrow={false}>
Close sidebar
<HotkeyTooltipContent
label="Close Changes Sidebar"
hotkeyId="TOGGLE_SIDEBAR"
/>
</TooltipContent>
</Tooltip>
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import {
MAX_SIDEBAR_WIDTH,
MIN_SIDEBAR_WIDTH,
SidebarMode,
useSidebarStore,
} from "renderer/stores/sidebar-state";
import { ResizablePanel } from "../../ResizablePanel";
import { ChangesContent } from "../ChangesContent";
import { ContentView } from "../ContentView";
import { Sidebar } from "../Sidebar";

export function WorkspaceLayout() {
const {
isSidebarOpen,
sidebarWidth,
setSidebarWidth,
isResizing,
setIsResizing,
currentMode,
} = useSidebarStore();

const isExpanded = currentMode === SidebarMode.Changes;

return (
<>
<div className="flex-1 min-w-0 overflow-hidden">
{isExpanded ? <ChangesContent /> : <ContentView />}
</div>
{isSidebarOpen && (
<ResizablePanel
width={sidebarWidth}
onWidthChange={setSidebarWidth}
isResizing={isResizing}
onResizingChange={setIsResizing}
minWidth={MIN_SIDEBAR_WIDTH}
maxWidth={MAX_SIDEBAR_WIDTH}
handleSide="left"
className={isExpanded ? "border-l-0" : undefined}
>
<Sidebar />
</ResizablePanel>
)}
</>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { WorkspaceLayout } from "./WorkspaceLayout";
36 changes: 29 additions & 7 deletions apps/desktop/src/renderer/stores/sidebar-state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ interface SidebarState {
sidebarWidth: number;
lastOpenSidebarWidth: number;
currentMode: SidebarMode;
lastMode: SidebarMode;
isResizing: boolean;
toggleSidebar: () => void;
setSidebarOpen: (open: boolean) => void;
Expand All @@ -31,26 +32,44 @@ export const useSidebarStore = create<SidebarState>()(
sidebarWidth: DEFAULT_SIDEBAR_WIDTH,
lastOpenSidebarWidth: DEFAULT_SIDEBAR_WIDTH,
currentMode: SidebarMode.Tabs,
lastMode: SidebarMode.Tabs,
isResizing: false,

toggleSidebar: () => {
const { isSidebarOpen, lastOpenSidebarWidth } = get();
const { isSidebarOpen, lastOpenSidebarWidth, currentMode, lastMode } =
get();
if (isSidebarOpen) {
set({ isSidebarOpen: false, sidebarWidth: 0 });
set({
isSidebarOpen: false,
sidebarWidth: 0,
lastMode: currentMode,
currentMode: SidebarMode.Tabs,
});
} else {
set({
isSidebarOpen: true,
sidebarWidth: lastOpenSidebarWidth,
currentMode: lastMode,
});
}
},

setSidebarOpen: (open) => {
const { lastOpenSidebarWidth } = get();
set({
isSidebarOpen: open,
sidebarWidth: open ? lastOpenSidebarWidth : 0,
});
const { lastOpenSidebarWidth, currentMode, lastMode } = get();
if (open) {
set({
isSidebarOpen: true,
sidebarWidth: lastOpenSidebarWidth,
currentMode: lastMode,
});
} else {
set({
isSidebarOpen: false,
sidebarWidth: 0,
lastMode: currentMode,
currentMode: SidebarMode.Tabs,
});
}
},

setSidebarWidth: (width) => {
Expand All @@ -66,9 +85,12 @@ export const useSidebarStore = create<SidebarState>()(
isSidebarOpen: true,
});
} else {
const { currentMode } = get();
set({
sidebarWidth: 0,
isSidebarOpen: false,
lastMode: currentMode,
currentMode: SidebarMode.Tabs,
});
}
},
Expand Down
Loading