lobehub/src/features/Conversation/Messages/Tasks/TaskItem/ServerTaskItem.tsx
Arvin Xu b8ef02e647
💄 style: fix group task render (#11952)
* improve task messages render

* improve task messages render

* refactor agent task

* fix tests

* improved ui now

* fix

* fix supervisor issue

* add more tests

* fix agent tasks issue

* update i18n

* update createdAt

* fix tests and update dockerfile

* fix max length

* fix max length
2026-01-29 21:44:32 +08:00

72 lines
1.9 KiB
TypeScript

'use client';
import { AccordionItem, Block } from '@lobehub/ui';
import { memo, useMemo, useState } from 'react';
import { ThreadStatus } from '@/types/index';
import type { UIChatMessage } from '@/types/index';
import { TaskContent } from '../shared';
import TaskTitle, { type TaskMetrics } from './TaskTitle';
interface ServerTaskItemProps {
item: UIChatMessage;
}
const ServerTaskItem = memo<ServerTaskItemProps>(({ item }) => {
const { id, metadata, taskDetail, tasks } = item;
const [expanded, setExpanded] = useState(false);
const title = taskDetail?.title || metadata?.taskTitle;
const status = taskDetail?.status;
const threadId = taskDetail?.threadId;
const isCompleted = status === ThreadStatus.Completed;
const isError = status === ThreadStatus.Failed || status === ThreadStatus.Cancel;
// Build metrics for TaskTitle (only for completed/error states)
const metrics: TaskMetrics | undefined = useMemo(() => {
if (isCompleted || isError) {
return {
duration: taskDetail?.duration,
steps: taskDetail?.totalSteps,
toolCalls: taskDetail?.totalToolCalls,
};
}
return undefined;
}, [
isCompleted,
isError,
taskDetail?.duration,
taskDetail?.totalSteps,
taskDetail?.totalToolCalls,
]);
return (
<AccordionItem
expand={expanded}
itemKey={id}
onExpandChange={setExpanded}
paddingBlock={4}
paddingInline={4}
title={<TaskTitle metrics={metrics} status={status} title={title} />}
>
<Block gap={16} padding={12} style={{ marginBlock: 8 }} variant={'outlined'}>
{expanded && (
<TaskContent
id={id}
isError={isError}
messages={tasks}
status={status}
taskDetail={taskDetail}
threadId={threadId}
/>
)}
</Block>
</AccordionItem>
);
}, Object.is);
ServerTaskItem.displayName = 'ServerTaskItem';
export default ServerTaskItem;