import React from 'react'; import type { MessageBlock } from '@/store/commStore'; import MarkdownBlock from './MarkdownBlock'; import HtmlBlock from './HtmlBlock'; import ImageBlock from './ImageBlock'; import AudioBlock from './AudioBlock'; import VideoBlock from './VideoBlock'; import FileBlock from './FileBlock'; import ActionCardBlock from './ActionCardBlock'; import ContactCardBlock from './ContactCardBlock'; import MiniAppBlock from './MiniAppBlock'; import AgentResultBlock from './AgentResultBlock'; import ApprovalRequestBlock from './ApprovalRequestBlock'; import TaskCardBlock from './TaskCardBlock'; import WorkflowCardBlock from './WorkflowCardBlock'; import KnowledgeCardBlock from './KnowledgeCardBlock'; interface BlockRendererProps { blocks: MessageBlock[]; } const BlockRenderer: React.FC = ({ blocks }) => { if (!blocks || blocks.length === 0) { return null; } // Sort blocks by sort_order to ensure correct rendering sequence const sortedBlocks = [...blocks].sort((a, b) => a.sort_order - b.sort_order); return (
{sortedBlocks.map((block) => { const renderBlock = (): React.ReactNode => { switch (block.block_type) { case 'text': // Text blocks: render as plain text in a styled div return (
{block.block_data.text || block.block_data.content || ''}
); case 'markdown': return ; case 'html': return ; case 'image': return ; case 'audio': return ; case 'video': return ; case 'file': return ; case 'action_card': return ; case 'contact_card': return ; case 'miniapp': return ; case 'agent_result': return ; case 'approval_request': return ; case 'task_card': return ; case 'workflow_card': return ; case 'knowledge_card': return ; default: // Fallback for unknown block types return (
Unbekannter Block-Typ: {block.block_type}
); } }; return (
{renderBlock()}
); })}
); }; export default BlockRenderer;