authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-03-09 09:10:37-07:00
committergravatar for jmarminge@gmail.comJulius Marminge <jmarminge@gmail.com> 2026-03-09 09:31:39-07:00
log5c286cab8b87fa5055533c54721cca52ec32050d
tree94003d24e9959d67c005e7d91c8af369512e2217
parent75ca0d4fa41a4b5a85a6aa852dad813fbcbb94db

Open project folder picker immediately in Electron

- remove mobile-width gating from sidebar project picker behavior - simplify picker logic/tests to depend only on Electron runtime

3 files changed, 5 insertions(+), 16 deletions(-)

apps/web/src/components/Sidebar.logic.test.ts+4-11
......@@ -2,30 +2,23 @@ import { describe, expect, it } from "vitest";
22import { shouldOpenProjectFolderPickerImmediately } from "./Sidebar.logic";
33
44describe("shouldOpenProjectFolderPickerImmediately", () => {
5 it("opens the folder picker immediately in Electron on desktop", () => {
5 it("opens the folder picker immediately in Electron", () => {
66 expect(
77 shouldOpenProjectFolderPickerImmediately({
88 isElectron: true,
9 isMobile: false,
109 }),
1110 ).toBe(true);
1211 });
1312
14 it("keeps manual project entry on mobile Electron layouts", () => {
13 it("still opens the folder picker immediately for mobile-width Electron layouts", () => {
1514 expect(
1615 shouldOpenProjectFolderPickerImmediately({
1716 isElectron: true,
18 isMobile: true,
1917 }),
20 ).toBe(false);
18 ).toBe(true);
2119 });
2220
2321 it("keeps manual project entry outside Electron", () => {
24 expect(
25 shouldOpenProjectFolderPickerImmediately({
26 isElectron: false,
27 isMobile: false,
28 }),
29 ).toBe(false);
22 expect(shouldOpenProjectFolderPickerImmediately({ isElectron: false })).toBe(false);
3023 });
3124});
apps/web/src/components/Sidebar.logic.ts+1-2
......@@ -1,6 +1,5 @@
11export function shouldOpenProjectFolderPickerImmediately(input: {
22 isElectron: boolean;
3 isMobile: boolean;
43}): boolean {
5 return input.isElectron && !input.isMobile;
4 return input.isElectron;
65}
apps/web/src/components/Sidebar.tsx-3
......@@ -32,7 +32,6 @@ import { type Thread } from "../types";
3232import { derivePendingApprovals } from "../session-logic";
3333import { gitRemoveWorktreeMutationOptions, gitStatusQueryOptions } from "../lib/gitReactQuery";
3434import { serverConfigQueryOptions } from "../lib/serverReactQuery";
35import { useMediaQuery } from "../hooks/useMediaQuery";
3635import { readNativeApi } from "../nativeApi";
3736import { type DraftThreadEnvMode, useComposerDraftStore } from "../composerDraftStore";
3837import { selectThreadTerminalState, useTerminalStateStore } from "../terminalStateStore";
......@@ -268,7 +267,6 @@ function ProjectFavicon({ cwd }: { cwd: string }) {
268267}
269268
270269export default function Sidebar() {
271 const isMobile = useMediaQuery("(max-width: 767px)");
272270 const projects = useStore((store) => store.projects);
273271 const threads = useStore((store) => store.threads);
274272 const markThreadUnread = useStore((store) => store.markThreadUnread);
......@@ -317,7 +315,6 @@ export default function Sidebar() {
317315 const [desktopUpdateState, setDesktopUpdateState] = useState<DesktopUpdateState | null>(null);
318316 const shouldBrowseForProjectImmediately = shouldOpenProjectFolderPickerImmediately({
319317 isElectron,
320 isMobile,
321318 });
322319 const shouldShowProjectPathEntry = addingProject && !shouldBrowseForProjectImmediately;
323320 const pendingApprovalByThreadId = useMemo(() => {