From f98088dd5c90c8cdc3c21c6bbdd18c0650b2442d Mon Sep 17 00:00:00 2001 From: Anastasiia Solop <35258279+anastasiya1155@users.noreply.github.com> Date: Tue, 15 Jul 2025 12:17:38 +0200 Subject: [PATCH] add memo to heavy components (#183) --- .../TaskDetails/DisplayConversationEntry.tsx | 2 +- .../LogsTab/NormalizedConversationViewer.tsx | 2 +- .../src/components/tasks/TaskKanbanBoard.tsx | 6 +- frontend/src/components/tasks/index.ts | 1 - .../src/components/ui/markdown-renderer.tsx | 146 +++++++++--------- frontend/src/pages/project-tasks.tsx | 2 +- 6 files changed, 80 insertions(+), 79 deletions(-) diff --git a/frontend/src/components/tasks/TaskDetails/DisplayConversationEntry.tsx b/frontend/src/components/tasks/TaskDetails/DisplayConversationEntry.tsx index 7e09da99..4138247b 100644 --- a/frontend/src/components/tasks/TaskDetails/DisplayConversationEntry.tsx +++ b/frontend/src/components/tasks/TaskDetails/DisplayConversationEntry.tsx @@ -1,6 +1,6 @@ import { useContext, useMemo, useState } from 'react'; import { DiffCard } from './DiffCard'; -import { MarkdownRenderer } from '@/components/ui/markdown-renderer.tsx'; +import MarkdownRenderer from '@/components/ui/markdown-renderer.tsx'; import { AlertCircle, Bot, diff --git a/frontend/src/components/tasks/TaskDetails/LogsTab/NormalizedConversationViewer.tsx b/frontend/src/components/tasks/TaskDetails/LogsTab/NormalizedConversationViewer.tsx index aabcc601..3e5cb418 100644 --- a/frontend/src/components/tasks/TaskDetails/LogsTab/NormalizedConversationViewer.tsx +++ b/frontend/src/components/tasks/TaskDetails/LogsTab/NormalizedConversationViewer.tsx @@ -2,7 +2,7 @@ import { useCallback, useContext, useEffect, useMemo, useState } from 'react'; import { Bot, Hammer, ToggleLeft, ToggleRight } from 'lucide-react'; import { Loader } from '@/components/ui/loader.tsx'; import { executionProcessesApi } from '@/lib/api.ts'; -import { MarkdownRenderer } from '@/components/ui/markdown-renderer.tsx'; +import MarkdownRenderer from '@/components/ui/markdown-renderer.tsx'; import type { ExecutionProcess, NormalizedConversation, diff --git a/frontend/src/components/tasks/TaskKanbanBoard.tsx b/frontend/src/components/tasks/TaskKanbanBoard.tsx index 45a3fde3..d8afa7c2 100644 --- a/frontend/src/components/tasks/TaskKanbanBoard.tsx +++ b/frontend/src/components/tasks/TaskKanbanBoard.tsx @@ -1,4 +1,4 @@ -import { useMemo } from 'react'; +import { memo, useMemo } from 'react'; import { type DragEndEvent, KanbanBoard, @@ -44,7 +44,7 @@ const statusBoardColors: Record = { cancelled: 'hsl(var(--destructive))', }; -export function TaskKanbanBoard({ +function TaskKanbanBoard({ tasks, searchQuery = '', onDragEnd, @@ -108,3 +108,5 @@ export function TaskKanbanBoard({ ); } + +export default memo(TaskKanbanBoard); diff --git a/frontend/src/components/tasks/index.ts b/frontend/src/components/tasks/index.ts index c8050d73..ad8696c2 100644 --- a/frontend/src/components/tasks/index.ts +++ b/frontend/src/components/tasks/index.ts @@ -1,3 +1,2 @@ export { TaskFormDialog } from './TaskFormDialog'; export { TaskCard } from './TaskCard'; -export { TaskKanbanBoard } from './TaskKanbanBoard'; diff --git a/frontend/src/components/ui/markdown-renderer.tsx b/frontend/src/components/ui/markdown-renderer.tsx index 5db4e3d0..504e27ba 100644 --- a/frontend/src/components/ui/markdown-renderer.tsx +++ b/frontend/src/components/ui/markdown-renderer.tsx @@ -1,84 +1,84 @@ -import ReactMarkdown from 'react-markdown'; +import ReactMarkdown, { Components } from 'react-markdown'; +import { memo, useMemo } from 'react'; interface MarkdownRendererProps { content: string; className?: string; } -export function MarkdownRenderer({ - content, - className = '', -}: MarkdownRendererProps) { +function MarkdownRenderer({ content, className = '' }: MarkdownRendererProps) { + const components: Components = useMemo( + () => ({ + code: ({ children, ...props }) => ( + + {children} + + ), + strong: ({ children, ...props }) => ( + + {children} + + ), + em: ({ children, ...props }) => ( + + {children} + + ), + p: ({ children, ...props }) => ( +

+ {children} +

+ ), + h1: ({ children, ...props }) => ( +

+ {children} +

+ ), + h2: ({ children, ...props }) => ( +

+ {children} +

+ ), + h3: ({ children, ...props }) => ( +

+ {children} +

+ ), + ul: ({ children, ...props }) => ( + + ), + ol: ({ children, ...props }) => ( +
    + {children} +
+ ), + li: ({ children, ...props }) => ( +
  • + {children} +
  • + ), + }), + [] + ); return (
    - ( - - {children} - - ), - strong: ({ children, ...props }) => ( - - {children} - - ), - em: ({ children, ...props }) => ( - - {children} - - ), - p: ({ children, ...props }) => ( -

    - {children} -

    - ), - h1: ({ children, ...props }) => ( -

    - {children} -

    - ), - h2: ({ children, ...props }) => ( -

    - {children} -

    - ), - h3: ({ children, ...props }) => ( -

    - {children} -

    - ), - ul: ({ children, ...props }) => ( -
      - {children} -
    - ), - ol: ({ children, ...props }) => ( -
      - {children} -
    - ), - li: ({ children, ...props }) => ( -
  • - {children} -
  • - ), - }} - > - {content} -
    + {content}
    ); } + +export default memo(MarkdownRenderer); diff --git a/frontend/src/pages/project-tasks.tsx b/frontend/src/pages/project-tasks.tsx index ecac725b..7cef04e0 100644 --- a/frontend/src/pages/project-tasks.tsx +++ b/frontend/src/pages/project-tasks.tsx @@ -14,7 +14,7 @@ import { getMainContainerClasses, } from '@/lib/responsive-config'; -import { TaskKanbanBoard } from '@/components/tasks/TaskKanbanBoard'; +import TaskKanbanBoard from '@/components/tasks/TaskKanbanBoard'; import { TaskDetailsPanel } from '@/components/tasks/TaskDetailsPanel'; import type { CreateTaskAndStart,