({ owner })
| 135 | }; |
| 136 | |
| 137 | const TasksSidebarGroup: FC<TasksSidebarGroupProps> = ({ owner }) => { |
| 138 | const filter: TasksFilter = { owner }; |
| 139 | const tasksQuery = useQuery({ |
| 140 | queryKey: ["tasks", filter], |
| 141 | queryFn: () => API.getTasks(filter), |
| 142 | refetchInterval: 10_000, |
| 143 | }); |
| 144 | |
| 145 | return ( |
| 146 | <ScrollArea className="flex-1"> |
| 147 | <div className="flex flex-col gap-2 p-3"> |
| 148 | <div className="text-content-secondary text-xs">Tasks</div> |
| 149 | <div className="flex flex-col flex-1 gap-1"> |
| 150 | {tasksQuery.data ? ( |
| 151 | tasksQuery.data.length > 0 ? ( |
| 152 | tasksQuery.data.map((task) => ( |
| 153 | <TaskSidebarMenuItem key={task.id} task={task} /> |
| 154 | )) |
| 155 | ) : ( |
| 156 | <div className="text-content-secondary text-xs p-4 border-border border-solid rounded text-center"> |
| 157 | No tasks found |
| 158 | </div> |
| 159 | ) |
| 160 | ) : tasksQuery.error ? ( |
| 161 | <div className="text-content-secondary text-xs p-4 border-border border-solid rounded text-center"> |
| 162 | {getErrorMessage(tasksQuery.error, "Failed to load tasks")} |
| 163 | </div> |
| 164 | ) : ( |
| 165 | <div className="flex flex-col gap-1"> |
| 166 | {Array.from({ length: 5 }).map((_, index) => ( |
| 167 | <Skeleton className="h-8 w-full" key={index} /> |
| 168 | ))} |
| 169 | </div> |
| 170 | )} |
| 171 | </div> |
| 172 | </div> |
| 173 | </ScrollArea> |
| 174 | ); |
| 175 | }; |
| 176 | |
| 177 | type TaskSidebarMenuItemProps = { |
| 178 | task: Task; |
nothing calls this directly
no test coverage detected