11import { useTaskExecutionStore } from "@features/task-detail/stores/taskExecutionStore" ;
22import { Button , Flex } from "@radix-ui/themes" ;
33import { useWorkspaceStore } from "@/renderer/features/workspace/stores/workspaceStore" ;
4- import type { HistoryData , HistoryTaskData } from "../hooks/useSidebarData" ;
4+ import type {
5+ HistoryData ,
6+ HistoryTaskData ,
7+ PinnedData ,
8+ TaskData ,
9+ } from "../hooks/useSidebarData" ;
510import { useSidebarStore } from "../stores/sidebarStore" ;
611import { TaskItem } from "./items/TaskItem" ;
712
813interface HistoryViewProps {
914 historyData : HistoryData ;
15+ pinnedData : PinnedData ;
1016 activeTaskId : string | null ;
1117 onTaskClick : ( taskId : string ) => void ;
1218 onTaskContextMenu : ( taskId : string , e : React . MouseEvent ) => void ;
@@ -65,8 +71,52 @@ function HistoryTaskItem({
6571 ) ;
6672}
6773
74+ interface PinnedTaskItemProps {
75+ task : TaskData ;
76+ isActive : boolean ;
77+ onClick : ( ) => void ;
78+ onContextMenu : ( e : React . MouseEvent ) => void ;
79+ onDelete : ( ) => void ;
80+ onTogglePin : ( ) => void ;
81+ }
82+
83+ function PinnedTaskItem ( {
84+ task,
85+ isActive,
86+ onClick,
87+ onContextMenu,
88+ onDelete,
89+ onTogglePin,
90+ } : PinnedTaskItemProps ) {
91+ const workspaces = useWorkspaceStore . use . workspaces ( ) ;
92+ const taskStates = useTaskExecutionStore ( ( state ) => state . taskStates ) ;
93+
94+ const workspace = workspaces [ task . id ] ;
95+ const taskState = taskStates [ task . id ] ;
96+
97+ return (
98+ < TaskItem
99+ id = { task . id }
100+ label = { task . title }
101+ isActive = { isActive }
102+ worktreeName = { workspace ?. worktreeName ?? undefined }
103+ worktreePath = { workspace ?. worktreePath ?? workspace ?. folderPath }
104+ workspaceMode = { taskState ?. workspaceMode }
105+ lastActivityAt = { task . lastActivityAt }
106+ isGenerating = { task . isGenerating }
107+ isUnread = { task . isUnread }
108+ isPinned = { task . isPinned }
109+ onClick = { onClick }
110+ onContextMenu = { onContextMenu }
111+ onDelete = { onDelete }
112+ onTogglePin = { onTogglePin }
113+ />
114+ ) ;
115+ }
116+
68117export function HistoryView ( {
69118 historyData,
119+ pinnedData,
70120 activeTaskId,
71121 onTaskClick,
72122 onTaskContextMenu,
@@ -76,11 +126,32 @@ export function HistoryView({
76126 const loadMoreHistory = useSidebarStore ( ( state ) => state . loadMoreHistory ) ;
77127 const { activeTasks, recentTasks, hasMore } = historyData ;
78128
129+ const hasPinnedTasks = pinnedData . tasks . length > 0 ;
79130 const hasActiveTasks = activeTasks . length > 0 ;
80131 const hasRecentTasks = recentTasks . length > 0 ;
81132
82133 return (
83134 < Flex direction = "column" >
135+ { hasPinnedTasks && (
136+ < >
137+ < HistorySectionLabel label = "Pinned" />
138+ { pinnedData . tasks . map ( ( task ) => (
139+ < PinnedTaskItem
140+ key = { task . id }
141+ task = { task }
142+ isActive = { activeTaskId === task . id }
143+ onClick = { ( ) => onTaskClick ( task . id ) }
144+ onContextMenu = { ( e ) => onTaskContextMenu ( task . id , e ) }
145+ onDelete = { ( ) => onTaskDelete ( task . id ) }
146+ onTogglePin = { ( ) => onTaskTogglePin ( task . id ) }
147+ />
148+ ) ) }
149+ { ( hasActiveTasks || hasRecentTasks ) && (
150+ < div className = "mx-2 my-2 border-gray-6 border-t" />
151+ ) }
152+ </ >
153+ ) }
154+
84155 { hasActiveTasks && (
85156 < >
86157 < HistorySectionLabel label = "Active" />
0 commit comments