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)}
+ />