From 019436507e8bdbdcea1f6cf338bf986a43e608b1 Mon Sep 17 00:00:00 2001 From: Yaosanqi137 Date: Mon, 6 Apr 2026 02:05:42 +0800 Subject: [PATCH] perf(web-toolbar): reduce rich editor toolbar update cost --- apps/web/src/components/task-rich-editor.tsx | 183 +++++++++++++------ 1 file changed, 127 insertions(+), 56 deletions(-) diff --git a/apps/web/src/components/task-rich-editor.tsx b/apps/web/src/components/task-rich-editor.tsx index bbd7bf4..769f001 100644 --- a/apps/web/src/components/task-rich-editor.tsx +++ b/apps/web/src/components/task-rich-editor.tsx @@ -3,7 +3,7 @@ import imageCompression from "browser-image-compression"; import type { Editor as TiptapEditor } from "@tiptap/core"; import Link from "@tiptap/extension-link"; import StarterKit from "@tiptap/starter-kit"; -import { EditorContent, type JSONContent, useEditor } from "@tiptap/react"; +import { EditorContent, type JSONContent, useEditor, useEditorState } from "@tiptap/react"; import { ResizableImage } from "@/extensions/resizable-image"; import { ResizableVideo } from "@/extensions/resizable-video"; import { ResizableYoutube } from "@/extensions/resizable-youtube"; @@ -26,7 +26,37 @@ type ToolbarButtonProps = { onClick: () => void; }; -function ToolbarButton({ label, disabled = false, active = false, onClick }: ToolbarButtonProps) { +type ToolbarState = { + bold: boolean; + italic: boolean; + heading: boolean; + bulletList: boolean; + link: boolean; +}; + +type EditorToolbarProps = { + editor: TiptapEditor | null; + onInsertImageUrl: () => void; + onOpenImageUpload: () => void; + onInsertVideoUrl: () => void; + onOpenVideoUpload: () => void; + onSetLink: () => void; +}; + +const DEFAULT_TOOLBAR_STATE: ToolbarState = { + bold: false, + italic: false, + heading: false, + bulletList: false, + link: false +}; + +const ToolbarButton = memo(function ToolbarButton({ + label, + disabled = false, + active = false, + onClick +}: ToolbarButtonProps) { return (