diff --git a/src/components/EditorCanvas/Area.jsx b/src/components/EditorCanvas/Area.jsx index eb47ce0..9eb82b5 100644 --- a/src/components/EditorCanvas/Area.jsx +++ b/src/components/EditorCanvas/Area.jsx @@ -1,5 +1,6 @@ import { useMemo, useRef, useState } from "react"; -import { Button, Popover, Input, ColorPicker } from "@douyinfe/semi-ui"; +import { Button, Popover, Input } from "@douyinfe/semi-ui"; +import ColorPicker from "../EditorSidePanel/ColorPicker"; import { IconEdit, IconDeleteStroked, @@ -220,6 +221,42 @@ function EditPopoverContent({ data }) { const { updateArea, deleteArea } = useAreas(); const { setUndoStack, setRedoStack } = useUndoRedo(); const { t } = useTranslation(); + const initialColorRef = useRef(data.color); + + const handleColorPick = (color) => { + setUndoStack((prev) => { + let undoColor = initialColorRef.current; + const lastColorChange = prev.findLast( + (e) => + e.element === ObjectType.AREA && + e.aid === data.id && + e.action === Action.EDIT && + e.redo.color, + ); + if (lastColorChange) { + undoColor = lastColorChange.redo.color; + } + + if (color === undoColor) return prev; + + const newStack = [ + ...prev, + { + action: Action.EDIT, + element: ObjectType.AREA, + aid: data.id, + undo: { color: undoColor }, + redo: { color: color }, + message: t("edit_area", { + areaName: data.name, + extra: "[color]", + }), + }, + ]; + return newStack; + }); + setRedoStack([]); + }; return (
@@ -251,26 +288,10 @@ function EditPopoverContent({ data }) { }} /> { - setUndoStack((prev) => [ - ...prev, - { - action: Action.EDIT, - element: ObjectType.AREA, - aid: data.id, - undo: { color: data.color }, - redo: { color }, - message: t("edit_area", { - areaName: data.name, - extra: "[color]", - }), - }, - ]); - setRedoStack([]); - updateArea(data.id, { color }); - }} usePopover={true} - value={ColorPicker.colorStringToValue(data.color)} + value={data.color} + onChange={(color) => updateArea(data.id, { color })} + onColorPick={(color) => handleColorPick(color)} />
diff --git a/src/components/EditorCanvas/Note.jsx b/src/components/EditorCanvas/Note.jsx index 1885efb..48d859d 100644 --- a/src/components/EditorCanvas/Note.jsx +++ b/src/components/EditorCanvas/Note.jsx @@ -1,6 +1,7 @@ -import { useMemo, useState } from "react"; +import { useMemo, useState, useRef } from "react"; import { Action, ObjectType, Tab, State } from "../../data/constants"; -import { Input, Button, Popover, ColorPicker } from "@douyinfe/semi-ui"; +import { Input, Button, Popover } from "@douyinfe/semi-ui"; +import ColorPicker from "../EditorSidePanel/ColorPicker"; import { IconEdit, IconDeleteStroked, @@ -27,6 +28,42 @@ export default function Note({ data, onPointerDown }) { const { setUndoStack, setRedoStack } = useUndoRedo(); const { selectedElement, setSelectedElement, bulkSelectedElements } = useSelect(); + const initialColorRef = useRef(data.color); + + const handleColorPick = (color) => { + setUndoStack((prev) => { + let undoColor = initialColorRef.current; + const lastColorChange = prev.findLast( + (e) => + e.element === ObjectType.NOTE && + e.nid === data.id && + e.action === Action.EDIT && + e.redo.color, + ); + if (lastColorChange) { + undoColor = lastColorChange.redo.color; + } + + if (color === undoColor) return prev; + + const newStack = [ + ...prev, + { + action: Action.EDIT, + element: ObjectType.NOTE, + nid: data.id, + undo: { color: undoColor }, + redo: { color: color }, + message: t("edit_note", { + noteTitle: data.title, + extra: "[color]", + }), + }, + ]; + return newStack; + }); + setRedoStack([]); + }; const handleChange = (e) => { const textarea = document.getElementById(`note_${data.id}`); @@ -225,32 +262,11 @@ export default function Note({ data, onPointerDown }) { }} /> { - setUndoStack((prev) => [ - ...prev, - { - action: Action.EDIT, - element: ObjectType.NOTE, - nid: data.id, - undo: { color: data.color }, - redo: { color }, - message: t("edit_note", { - noteTitle: data.title, - extra: "[color]", - }), - }, - ]); - setRedoStack([]); - updateNote(data.id, { color }); - }} usePopover={true} - value={ColorPicker.colorStringToValue(data.color)} - > -
- + value={data.color} + onChange={(color) => updateNote(data.id, { color })} + onColorPick={(color) => handleColorPick(color)} + />