Skip to content

Commit 5e17e65

Browse files
authored
fix: Fix sidebar project switching, stale notifications and auto-scroll (#1182)
1. Fix "+" button not switching project by matching folders case-insensitively on remoteUrl 2. Sync task title updates to session store so notifications use the latest title 3. Rename updateCloudTaskTitle to updateSessionTaskTitle for clarity 4. Fix auto-scroll forcing user to bottom when list is already initialized 5. Remove unnecessary repoDirectories memo in favor of direct folder lookup
1 parent 40e9c9d commit 5e17e65

7 files changed

Lines changed: 22 additions & 26 deletions

File tree

apps/code/src/renderer/features/sessions/components/VirtualizedList.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,13 @@ function VirtualizedListInner<T>(
6363
const handle = listRef.current;
6464
if (!handle) return;
6565

66-
if (items.length > 0) {
66+
if (items.length > 0 && !initializedRef.current) {
6767
handle.scrollToIndex(items.length - 1, { align: "end" });
68-
}
6968

70-
// Allow measurements to settle before reporting scroll state,
71-
// otherwise the scroll-to-bottom button flashes on task open.
72-
requestAnimationFrame(() => {
73-
initializedRef.current = true;
74-
});
69+
requestAnimationFrame(() => {
70+
initializedRef.current = true;
71+
});
72+
}
7573
}, [items.length]);
7674

7775
// biome-ignore lint/correctness/useExhaustiveDependencies: intentionally re-run when items change for streaming scroll

apps/code/src/renderer/features/sessions/hooks/useChatTitleGenerator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export function useChatTitleGenerator(taskId: string): void {
8181
task.id === taskId ? { ...task, title } : task,
8282
),
8383
);
84-
getSessionService().updateCloudTaskTitle(taskId, title);
84+
getSessionService().updateSessionTaskTitle(taskId, title);
8585
log.debug("Updated task title from conversation", {
8686
taskId,
8787
title,

apps/code/src/renderer/features/sessions/service/service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1746,7 +1746,7 @@ export class SessionService {
17461746
);
17471747
}
17481748

1749-
public updateCloudTaskTitle(taskId: string, taskTitle: string): void {
1749+
public updateSessionTaskTitle(taskId: string, taskTitle: string): void {
17501750
const session = sessionStoreSetters.getSessionByTaskId(taskId);
17511751
if (!session) return;
17521752

apps/code/src/renderer/features/sidebar/components/SidebarMenu.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { DotsCircleSpinner } from "@components/DotsCircleSpinner";
22
import { useInboxReports } from "@features/inbox/hooks/useInboxReports";
3+
import { getSessionService } from "@features/sessions/service/service";
34
import { useArchiveTask } from "@features/tasks/hooks/useArchiveTask";
45
import { useTasks, useUpdateTask } from "@features/tasks/hooks/useTasks";
56
import { useWorkspaces } from "@features/workspace/hooks/useWorkspace";
@@ -125,6 +126,9 @@ function SidebarMenuComponent() {
125126
),
126127
);
127128

129+
// Sync to session store so notifications use the updated title
130+
getSessionService().updateSessionTaskTitle(taskId, newTitle);
131+
128132
try {
129133
await updateTask.mutateAsync({
130134
taskId,

apps/code/src/renderer/features/sidebar/components/TaskListView.tsx

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
import { Box, Flex, Popover, Text } from "@radix-ui/themes";
1414
import { useWorkspace } from "@renderer/features/workspace/hooks/useWorkspace";
1515
import { useNavigationStore } from "@stores/navigationStore";
16-
import { useCallback, useEffect, useMemo } from "react";
16+
import { useCallback, useEffect } from "react";
1717
import type { TaskData, TaskGroup } from "../hooks/useSidebarData";
1818
import { useSidebarStore } from "../stores/sidebarStore";
1919
import { DraggableFolder } from "./DraggableFolder";
@@ -255,16 +255,6 @@ export function TaskListView({
255255
(state) => state.navigateToTaskInput,
256256
);
257257

258-
const repoDirectories = useMemo(() => {
259-
const mapping: Record<string, string> = {};
260-
for (const folder of folders) {
261-
if (folder.remoteUrl) {
262-
mapping[folder.remoteUrl] = folder.path;
263-
}
264-
}
265-
return mapping;
266-
}, [folders]);
267-
268258
// biome-ignore lint/correctness/useExhaustiveDependencies: reset pagination when filters change
269259
useEffect(() => {
270260
resetHistoryVisibleCount();
@@ -323,10 +313,11 @@ export function TaskListView({
323313
<Flex direction="column">
324314
{groupedTasks.map((group, index) => {
325315
const isExpanded = !collapsedSections.has(group.id);
326-
const groupPath = repoDirectories[group.id];
327-
const folder = groupPath
328-
? folders.find((f) => f.path === groupPath)
329-
: undefined;
316+
const folder = folders.find(
317+
(f) =>
318+
f.remoteUrl?.toLowerCase() === group.id.toLowerCase() ||
319+
f.path === group.id,
320+
);
330321
return (
331322
<DraggableFolder key={group.id} id={group.id} index={index}>
332323
<SidebarSection
@@ -342,7 +333,7 @@ export function TaskListView({
342333
isExpanded={isExpanded}
343334
onToggle={() => toggleSection(group.id)}
344335
addSpacingBefore={false}
345-
tooltipContent={groupPath ?? group.id}
336+
tooltipContent={folder?.path ?? group.id}
346337
onNewTask={() => {
347338
if (folder) {
348339
navigateToTaskInput(folder.id);

apps/code/src/renderer/features/task-detail/components/TaskLogsPanel.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ export function TaskLogsPanel({ taskId, task }: TaskLogsPanelProps) {
135135
// Keep cloud session title aligned with latest task metadata.
136136
useEffect(() => {
137137
if (!isCloud) return;
138-
getSessionService().updateCloudTaskTitle(
138+
getSessionService().updateSessionTaskTitle(
139139
task.id,
140140
task.title || task.description || "Cloud Task",
141141
);

apps/code/src/renderer/sagas/task/task-creation.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ async function generateTaskTitle(
5050
queryClient.setQueriesData<Task[]>({ queryKey: ["tasks", "list"] }, (old) =>
5151
old?.map((task) => (task.id === taskId ? { ...task, title } : task)),
5252
);
53+
54+
// Sync to session store so notifications use the updated title
55+
getSessionService().updateSessionTaskTitle(taskId, title);
5356
} catch (error) {
5457
log.error("Failed to save task title", { taskId, error });
5558
}

0 commit comments

Comments
 (0)