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.
This commit is contained in:
parent
9b27378087
commit
878653790c
2 changed files with 70 additions and 34 deletions
|
|
@ -141,6 +141,10 @@ export const GlobalTaskList = ({
|
||||||
setRenamingTaskKey(null);
|
setRenamingTaskKey(null);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleRenameCancel = (): void => {
|
||||||
|
setRenamingTaskKey(null);
|
||||||
|
};
|
||||||
|
|
||||||
// Fetch tasks on mount — loading guard in the store action prevents
|
// Fetch tasks on mount — loading guard in the store action prevents
|
||||||
// duplicate IPC calls when the centralized init chain is already fetching.
|
// duplicate IPC calls when the centralized init chain is already fetching.
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
@ -211,6 +215,19 @@ export const GlobalTaskList = ({
|
||||||
taskLocalState,
|
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
|
// Split into pinned and normal (non-pinned) tasks
|
||||||
const pinnedTasks = useMemo(
|
const pinnedTasks = useMemo(
|
||||||
() => filtered.filter((t) => taskLocalState.isPinned(t.teamName, t.id)),
|
() => filtered.filter((t) => taskLocalState.isPinned(t.teamName, t.id)),
|
||||||
|
|
@ -318,6 +335,7 @@ export const GlobalTaskList = ({
|
||||||
showTeamName
|
showTeamName
|
||||||
renamingKey={renamingTaskKey}
|
renamingKey={renamingTaskKey}
|
||||||
onRenameComplete={handleRenameComplete}
|
onRenameComplete={handleRenameComplete}
|
||||||
|
onRenameCancel={handleRenameCancel}
|
||||||
getDisplaySubject={(t) => taskLocalState.getRenamedSubject(t.teamName, t.id)}
|
getDisplaySubject={(t) => taskLocalState.getRenamedSubject(t.teamName, t.id)}
|
||||||
/>
|
/>
|
||||||
</TaskContextMenu>
|
</TaskContextMenu>
|
||||||
|
|
@ -352,28 +370,30 @@ export const GlobalTaskList = ({
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
{/* Archive toggle */}
|
{/* Archive toggle — only visible when archived tasks exist */}
|
||||||
<div className="ml-auto">
|
{hasArchivedTasks && (
|
||||||
<Tooltip>
|
<div className="ml-auto">
|
||||||
<TooltipTrigger asChild>
|
<Tooltip>
|
||||||
<button
|
<TooltipTrigger asChild>
|
||||||
type="button"
|
<button
|
||||||
onClick={() => setShowArchived(!showArchived)}
|
type="button"
|
||||||
className={cn(
|
onClick={() => setShowArchived(!showArchived)}
|
||||||
'rounded p-0.5 transition-colors',
|
className={cn(
|
||||||
showArchived
|
'rounded p-0.5 transition-colors',
|
||||||
? 'bg-surface-raised text-text-secondary'
|
showArchived
|
||||||
: 'text-text-muted hover:text-text-secondary'
|
? 'bg-surface-raised text-text-secondary'
|
||||||
)}
|
: 'text-text-muted hover:text-text-secondary'
|
||||||
>
|
)}
|
||||||
<Archive className="size-3.5" />
|
>
|
||||||
</button>
|
<Archive className="size-3.5" />
|
||||||
</TooltipTrigger>
|
</button>
|
||||||
<TooltipContent side="top">
|
</TooltipTrigger>
|
||||||
{showArchived ? 'Hide archived' : 'Show archived'}
|
<TooltipContent side="top">
|
||||||
</TooltipContent>
|
{showArchived ? 'Hide archived' : 'Show archived'}
|
||||||
</Tooltip>
|
</TooltipContent>
|
||||||
</div>
|
</Tooltip>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Content */}
|
{/* Content */}
|
||||||
|
|
@ -411,6 +431,7 @@ export const GlobalTaskList = ({
|
||||||
showTeamName
|
showTeamName
|
||||||
renamingKey={renamingTaskKey}
|
renamingKey={renamingTaskKey}
|
||||||
onRenameComplete={handleRenameComplete}
|
onRenameComplete={handleRenameComplete}
|
||||||
|
onRenameCancel={handleRenameCancel}
|
||||||
getDisplaySubject={(t) => taskLocalState.getRenamedSubject(t.teamName, t.id)}
|
getDisplaySubject={(t) => taskLocalState.getRenamedSubject(t.teamName, t.id)}
|
||||||
/>
|
/>
|
||||||
</TaskContextMenu>
|
</TaskContextMenu>
|
||||||
|
|
@ -457,6 +478,7 @@ export const GlobalTaskList = ({
|
||||||
hideTeamName
|
hideTeamName
|
||||||
renamingKey={renamingTaskKey}
|
renamingKey={renamingTaskKey}
|
||||||
onRenameComplete={handleRenameComplete}
|
onRenameComplete={handleRenameComplete}
|
||||||
|
onRenameCancel={handleRenameCancel}
|
||||||
getDisplaySubject={(t) =>
|
getDisplaySubject={(t) =>
|
||||||
taskLocalState.getRenamedSubject(t.teamName, t.id)
|
taskLocalState.getRenamedSubject(t.teamName, t.id)
|
||||||
}
|
}
|
||||||
|
|
@ -506,6 +528,7 @@ export const GlobalTaskList = ({
|
||||||
task={task}
|
task={task}
|
||||||
renamingKey={renamingTaskKey}
|
renamingKey={renamingTaskKey}
|
||||||
onRenameComplete={handleRenameComplete}
|
onRenameComplete={handleRenameComplete}
|
||||||
|
onRenameCancel={handleRenameCancel}
|
||||||
getDisplaySubject={(t) =>
|
getDisplaySubject={(t) =>
|
||||||
taskLocalState.getRenamedSubject(t.teamName, t.id)
|
taskLocalState.getRenamedSubject(t.teamName, t.id)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { useCallback, useState } from 'react';
|
import { useCallback, useMemo, useState } from 'react';
|
||||||
|
|
||||||
const PINNED_KEY = 'taskPinnedIds';
|
const PINNED_KEY = 'taskPinnedIds';
|
||||||
const ARCHIVED_KEY = 'taskArchivedIds';
|
const ARCHIVED_KEY = 'taskArchivedIds';
|
||||||
|
|
@ -136,15 +136,28 @@ export function useTaskLocalState(): TaskLocalState {
|
||||||
});
|
});
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return {
|
return useMemo(
|
||||||
pinnedIds,
|
() => ({
|
||||||
archivedIds,
|
pinnedIds,
|
||||||
renamedSubjects,
|
archivedIds,
|
||||||
isPinned,
|
renamedSubjects,
|
||||||
isArchived,
|
isPinned,
|
||||||
getRenamedSubject,
|
isArchived,
|
||||||
togglePin,
|
getRenamedSubject,
|
||||||
toggleArchive,
|
togglePin,
|
||||||
renameTask,
|
toggleArchive,
|
||||||
};
|
renameTask,
|
||||||
|
}),
|
||||||
|
[
|
||||||
|
pinnedIds,
|
||||||
|
archivedIds,
|
||||||
|
renamedSubjects,
|
||||||
|
isPinned,
|
||||||
|
isArchived,
|
||||||
|
getRenamedSubject,
|
||||||
|
togglePin,
|
||||||
|
toggleArchive,
|
||||||
|
renameTask,
|
||||||
|
]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue