diff --git a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx index b8cec1f3e..83ed3b892 100644 --- a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx +++ b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx @@ -30,6 +30,7 @@ import { Fragment, useCallback, useEffect, useMemo } from "react"; import type { TaskData, TaskGroup } from "../hooks/useSidebarData"; import { useTaskPrStatus } from "../hooks/useTaskPrStatus"; import { useSidebarStore } from "../stores/sidebarStore"; +import { getNewTaskTarget } from "../utils/getNewTaskTarget"; import { DraggableFolder } from "./DraggableFolder"; import { TaskItem } from "./items/TaskItem"; import { SidebarSection } from "./SidebarSection"; @@ -418,11 +419,12 @@ export function TaskListView({ addSpacingBefore={false} tooltipContent={folder?.path ?? group.id} onNewTask={() => { - if (groupFolderId) { - navigateToTaskInput(groupFolderId); - } else { - navigateToTaskInput(); - } + navigateToTaskInput( + getNewTaskTarget({ + groupFolderId, + groupId: group.id, + }), + ); }} newTaskTooltip={`Start new task in ${folder?.name ?? group.name}`} > diff --git a/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.test.ts b/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.test.ts new file mode 100644 index 000000000..dbe2dc7e8 --- /dev/null +++ b/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from "vitest"; +import { getNewTaskTarget } from "./getNewTaskTarget"; + +describe("getNewTaskTarget", () => { + it.each([ + { + name: "returns the folder id when the group has a matching local folder", + args: { groupFolderId: "folder-1", groupId: "posthog/code" }, + expected: "folder-1", + }, + { + name: "returns initialCloudRepository for a cloud-only group with no local folder", + args: { groupFolderId: undefined, groupId: "posthog/code" }, + expected: { initialCloudRepository: "posthog/code" }, + }, + { + name: "returns undefined for the catch-all 'other' group with no folder id", + args: { groupFolderId: undefined, groupId: "other" }, + expected: undefined, + }, + { + name: "returns undefined when groupId is empty and no folder id is set", + args: { groupFolderId: undefined, groupId: "" }, + expected: undefined, + }, + { + name: "prefers the folder id even when groupId looks like a cloud repo", + args: { groupFolderId: "folder-7", groupId: "posthog/posthog" }, + expected: "folder-7", + }, + ])("$name", ({ args, expected }) => { + expect(getNewTaskTarget(args)).toEqual(expected); + }); +}); diff --git a/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.ts b/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.ts new file mode 100644 index 000000000..b102ca882 --- /dev/null +++ b/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.ts @@ -0,0 +1,12 @@ +import type { TaskInputNavigationOptions } from "@stores/navigationStore"; + +export function getNewTaskTarget(args: { + groupFolderId?: string; + groupId: string; +}): string | TaskInputNavigationOptions | undefined { + if (args.groupFolderId) return args.groupFolderId; + if (args.groupId && args.groupId !== "other") { + return { initialCloudRepository: args.groupId }; + } + return undefined; +} diff --git a/apps/code/src/renderer/stores/navigationStore.ts b/apps/code/src/renderer/stores/navigationStore.ts index 47ca4f1f9..ada0146ed 100644 --- a/apps/code/src/renderer/stores/navigationStore.ts +++ b/apps/code/src/renderer/stores/navigationStore.ts @@ -27,7 +27,7 @@ export interface TaskInputReportAssociation { title: string; } -interface TaskInputNavigationOptions { +export interface TaskInputNavigationOptions { folderId?: string; initialPrompt?: string; initialCloudRepository?: string;