From 878653790c9aff4357d3eafdc7d6e2d75e62b594 Mon Sep 17 00:00:00 2001 From: iliya Date: Wed, 4 Mar 2026 16:22:07 +0200 Subject: [PATCH] feat: enhance GlobalTaskList with archived task handling and renaming improvements - Added functionality to conditionally display the archive toggle based on the presence of archived tasks. - Implemented a new `handleRenameCancel` function to reset the renaming state. - Refactored task state management to improve performance using `useMemo` for returning task local state. - Enhanced overall task management experience by improving the visibility and organization of tasks in the sidebar. --- .../components/sidebar/GlobalTaskList.tsx | 67 +++++++++++++------ src/renderer/hooks/useTaskLocalState.ts | 37 ++++++---- 2 files changed, 70 insertions(+), 34 deletions(-) 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, + ] + ); }