diff --git a/src/renderer/components/sidebar/GlobalTaskList.tsx b/src/renderer/components/sidebar/GlobalTaskList.tsx
index b3526bcf..eed2c5d6 100644
--- a/src/renderer/components/sidebar/GlobalTaskList.tsx
+++ b/src/renderer/components/sidebar/GlobalTaskList.tsx
@@ -141,6 +141,10 @@ export const GlobalTaskList = ({
setRenamingTaskKey(null);
};
+ const handleRenameCancel = (): void => {
+ setRenamingTaskKey(null);
+ };
+
// Fetch tasks on mount — loading guard in the store action prevents
// duplicate IPC calls when the centralized init chain is already fetching.
useEffect(() => {
@@ -211,6 +215,19 @@ export const GlobalTaskList = ({
taskLocalState,
]);
+ // Check if any archived tasks exist (before archive filtering) to conditionally show the toggle
+ const hasArchivedTasks = useMemo(
+ () => globalTasks.some((t) => taskLocalState.isArchived(t.teamName, t.id)),
+ [globalTasks, taskLocalState]
+ );
+
+ // Reset showArchived when archive becomes empty
+ useEffect(() => {
+ if (showArchived && !hasArchivedTasks) {
+ setShowArchived(false);
+ }
+ }, [showArchived, hasArchivedTasks]);
+
// Split into pinned and normal (non-pinned) tasks
const pinnedTasks = useMemo(
() => filtered.filter((t) => taskLocalState.isPinned(t.teamName, t.id)),
@@ -318,6 +335,7 @@ export const GlobalTaskList = ({
showTeamName
renamingKey={renamingTaskKey}
onRenameComplete={handleRenameComplete}
+ onRenameCancel={handleRenameCancel}
getDisplaySubject={(t) => taskLocalState.getRenamedSubject(t.teamName, t.id)}
/>
@@ -352,28 +370,30 @@ export const GlobalTaskList = ({
);
})}
- {/* Archive toggle */}
-
-
-
-
-
-
- {showArchived ? 'Hide archived' : 'Show archived'}
-
-
-
+ {/* Archive toggle — only visible when archived tasks exist */}
+ {hasArchivedTasks && (
+
+
+
+
+
+
+ {showArchived ? 'Hide archived' : 'Show archived'}
+
+
+
+ )}
{/* Content */}
@@ -411,6 +431,7 @@ export const GlobalTaskList = ({
showTeamName
renamingKey={renamingTaskKey}
onRenameComplete={handleRenameComplete}
+ onRenameCancel={handleRenameCancel}
getDisplaySubject={(t) => taskLocalState.getRenamedSubject(t.teamName, t.id)}
/>
@@ -457,6 +478,7 @@ export const GlobalTaskList = ({
hideTeamName
renamingKey={renamingTaskKey}
onRenameComplete={handleRenameComplete}
+ onRenameCancel={handleRenameCancel}
getDisplaySubject={(t) =>
taskLocalState.getRenamedSubject(t.teamName, t.id)
}
@@ -506,6 +528,7 @@ export const GlobalTaskList = ({
task={task}
renamingKey={renamingTaskKey}
onRenameComplete={handleRenameComplete}
+ onRenameCancel={handleRenameCancel}
getDisplaySubject={(t) =>
taskLocalState.getRenamedSubject(t.teamName, t.id)
}
diff --git a/src/renderer/hooks/useTaskLocalState.ts b/src/renderer/hooks/useTaskLocalState.ts
index 8f454db3..2c2d5040 100644
--- a/src/renderer/hooks/useTaskLocalState.ts
+++ b/src/renderer/hooks/useTaskLocalState.ts
@@ -1,4 +1,4 @@
-import { useCallback, useState } from 'react';
+import { useCallback, useMemo, useState } from 'react';
const PINNED_KEY = 'taskPinnedIds';
const ARCHIVED_KEY = 'taskArchivedIds';
@@ -136,15 +136,28 @@ export function useTaskLocalState(): TaskLocalState {
});
}, []);
- return {
- pinnedIds,
- archivedIds,
- renamedSubjects,
- isPinned,
- isArchived,
- getRenamedSubject,
- togglePin,
- toggleArchive,
- renameTask,
- };
+ return useMemo(
+ () => ({
+ pinnedIds,
+ archivedIds,
+ renamedSubjects,
+ isPinned,
+ isArchived,
+ getRenamedSubject,
+ togglePin,
+ toggleArchive,
+ renameTask,
+ }),
+ [
+ pinnedIds,
+ archivedIds,
+ renamedSubjects,
+ isPinned,
+ isArchived,
+ getRenamedSubject,
+ togglePin,
+ toggleArchive,
+ renameTask,
+ ]
+ );
}