diff --git a/src/renderer/components/sidebar/GlobalTaskList.tsx b/src/renderer/components/sidebar/GlobalTaskList.tsx index d4ac79a1..108ceaf1 100644 --- a/src/renderer/components/sidebar/GlobalTaskList.tsx +++ b/src/renderer/components/sidebar/GlobalTaskList.tsx @@ -6,6 +6,7 @@ import { confirm } from '@renderer/components/common/ConfirmDialog'; import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip'; import { useCollapsedGroups } from '@renderer/hooks/useCollapsedGroups'; import { useTaskLocalState } from '@renderer/hooks/useTaskLocalState'; +import { useTheme } from '@renderer/hooks/useTheme'; import { cn } from '@renderer/lib/utils'; import { markTaskUnread } from '@renderer/services/commentReadStorage'; import { useStore } from '@renderer/store'; @@ -347,6 +348,7 @@ interface GlobalTaskRowProps { hideTeamName?: boolean; hideProjectName?: boolean; showTeamName?: boolean; + isLight: boolean; onTogglePin: TaskRowAction; onToggleArchive: TaskRowAction; onMarkUnread: TaskRowAction; @@ -409,6 +411,7 @@ const GlobalTaskRow = memo( hideTeamName, hideProjectName, showTeamName, + isLight, onTogglePin, onToggleArchive, onMarkUnread, @@ -459,6 +462,7 @@ const GlobalTaskRow = memo( hideTeamName={hideTeamName} hideProjectName={hideProjectName} showTeamName={showTeamName} + isLight={isLight} teamOffline={teamOffline} renamingKey={effectiveRenamingKey} onRenameComplete={onRenameComplete} @@ -481,6 +485,7 @@ const GlobalTaskRow = memo( prev.hideTeamName === next.hideTeamName && prev.hideProjectName === next.hideProjectName && prev.showTeamName === next.showTeamName && + prev.isLight === next.isLight && prev.onTogglePin === next.onTogglePin && prev.onToggleArchive === next.onToggleArchive && prev.onMarkUnread === next.onMarkUnread && @@ -504,6 +509,7 @@ interface TaskRowsProps { hideTeamName?: boolean; hideProjectName?: boolean; showTeamName?: boolean; + isLight: boolean; showTeamHeader?: boolean; pinnedOverride?: boolean; archivedOverride?: boolean; @@ -594,6 +600,7 @@ const TaskRows = memo(function TaskRows({ hideTeamName, hideProjectName, showTeamName, + isLight, showTeamHeader, pinnedOverride, archivedOverride, @@ -625,6 +632,7 @@ const TaskRows = memo(function TaskRows({ hideTeamName={hideTeamName} hideProjectName={hideProjectName} showTeamName={showTeamName} + isLight={isLight} teamOffline={isTeamOffline(task.teamName)} ownerColorName={getOwnerColorName(task)} renamingKey={renamingKey} @@ -668,6 +676,7 @@ function areTaskRowsPropsEqual(prev: TaskRowsProps, next: TaskRowsProps): boolea prev.hideTeamName === next.hideTeamName && prev.hideProjectName === next.hideProjectName && prev.showTeamName === next.showTeamName && + prev.isLight === next.isLight && prev.showTeamHeader === next.showTeamHeader && prev.pinnedOverride === next.pinnedOverride && prev.archivedOverride === next.archivedOverride && @@ -710,6 +719,7 @@ interface ProjectTaskGroupProps { isNewTask: (task: GlobalTask) => boolean; isTeamOffline: TeamBooleanResolver; renamingKey: string | null; + isLight: boolean; formatTeamHeader: TeamHeaderFormatter; onToggleGroup: (projectKey: string) => void; onVisibleCountChange: ProjectGroupVisibleCountChange; @@ -737,6 +747,7 @@ const ProjectTaskGroup = memo( isNewTask, isTeamOffline, renamingKey, + isLight, formatTeamHeader, onToggleGroup, onVisibleCountChange, @@ -799,6 +810,7 @@ const ProjectTaskGroup = memo( isArchived={isArchived} isNewTask={isNewTask} isTeamOffline={isTeamOffline} + isLight={isLight} hideTeamName hideProjectName showTeamHeader @@ -860,6 +872,7 @@ const ProjectTaskGroup = memo( prev.showMoreLabel === next.showMoreLabel && prev.showLessLabel === next.showLessLabel && prev.renamingKey === next.renamingKey && + prev.isLight === next.isLight && prev.formatTeamHeader === next.formatTeamHeader && prev.onToggleGroup === next.onToggleGroup && prev.onVisibleCountChange === next.onVisibleCountChange && @@ -902,6 +915,7 @@ export const GlobalTaskList = memo(function GlobalTaskList({ onFiltersPopoverOpenChange: externalOnFiltersPopoverOpenChange, }: GlobalTaskListProps = {}): React.JSX.Element { const { t } = useAppTranslation('common'); + const { isLight } = useTheme(); const { globalTasks, globalTasksLoading, @@ -1498,6 +1512,7 @@ export const GlobalTaskList = memo(function GlobalTaskList({ isArchived={taskLocalState.isArchived} isNewTask={isNewTask} isTeamOffline={isTeamOffline} + isLight={isLight} pinnedOverride={true} archivedOverride={false} showTeamName @@ -1601,6 +1616,7 @@ export const GlobalTaskList = memo(function GlobalTaskList({ isArchived={taskLocalState.isArchived} isNewTask={isNewTask} isTeamOffline={isTeamOffline} + isLight={isLight} showTeamName renamingKey={renamingTaskKey} onTogglePin={handleToggleTaskPin} @@ -1634,6 +1650,7 @@ export const GlobalTaskList = memo(function GlobalTaskList({ isArchived={taskLocalState.isArchived} isNewTask={isNewTask} isTeamOffline={isTeamOffline} + isLight={isLight} renamingKey={renamingTaskKey} formatTeamHeader={formatTeamHeader} onToggleGroup={handleToggleProjectGroup} @@ -1682,6 +1699,7 @@ export const GlobalTaskList = memo(function GlobalTaskList({ isArchived={taskLocalState.isArchived} isNewTask={isNewTask} isTeamOffline={isTeamOffline} + isLight={isLight} showTeamHeader formatTeamHeader={formatTeamHeader} renamingKey={renamingTaskKey} diff --git a/src/renderer/components/sidebar/SidebarTaskItem.tsx b/src/renderer/components/sidebar/SidebarTaskItem.tsx index 99d4b7bd..2e1a25fb 100644 --- a/src/renderer/components/sidebar/SidebarTaskItem.tsx +++ b/src/renderer/components/sidebar/SidebarTaskItem.tsx @@ -69,6 +69,8 @@ interface SidebarTaskItemProps { hideTeamName?: boolean; hideProjectName?: boolean; showTeamName?: boolean; + /** Optional theme value from list parents to avoid one theme subscription per row. */ + isLight?: boolean; /** Pauses the in-progress spinner when the parent team is offline. */ teamOffline?: boolean; /** The composite key "teamName:taskId" of the task being renamed, or null */ @@ -82,18 +84,19 @@ interface SidebarTaskItemProps { ownerColorName?: string | null; } -export const SidebarTaskItem = memo(function SidebarTaskItem({ +const SidebarTaskItemContent = ({ task, hideTeamName, hideProjectName, showTeamName, + isLight, teamOffline = false, renamingKey, onRenameComplete, onRenameCancel, getDisplaySubject, ownerColorName, -}: SidebarTaskItemProps): React.JSX.Element { +}: SidebarTaskItemProps & { isLight: boolean }): React.JSX.Element => { const { t } = useAppTranslation('team'); const { t: tCommon } = useAppTranslation('common'); const openGlobalTaskDetail = useStore((s) => s.openGlobalTaskDetail); @@ -104,7 +107,6 @@ export const SidebarTaskItem = memo(function SidebarTaskItem({ ) ); const unreadCount = useUnreadCommentCount(task.teamName, task.id, task.comments); - const { isLight } = useTheme(); const isRenaming = renamingKey === `${task.teamName}:${task.id}`; const displaySubject = getDisplaySubject?.(task) ?? task.subject; @@ -317,4 +319,18 @@ export const SidebarTaskItem = memo(function SidebarTaskItem({ )} ); +}; + +const ThemedSidebarTaskItem = (props: SidebarTaskItemProps): React.JSX.Element => { + const { isLight } = useTheme(); + return ; +}; + +export const SidebarTaskItem = memo(function SidebarTaskItem( + props: SidebarTaskItemProps +): React.JSX.Element { + if (typeof props.isLight === 'boolean') { + return ; + } + return ; });