Skip to content

Commit 280f0bb

Browse files
committed
fix(lexical): update colorpicker value from props
1 parent f29f9c2 commit 280f0bb

File tree

1 file changed

+29
-24
lines changed

1 file changed

+29
-24
lines changed

packages/lexical-editor-actions/src/components/LexicalColorPicker/LexicalColorPicker.tsx

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useCallback, useState, SyntheticEvent } from "react";
1+
import React, { useCallback, useState, SyntheticEvent, useRef, useEffect, useMemo } from "react";
22
import styled from "@emotion/styled";
33
import { css } from "emotion";
44
import { usePageElements } from "@webiny/app-page-builder-elements/hooks/usePageElements";
@@ -122,6 +122,9 @@ interface LexicalColorPickerProps {
122122
handlerClassName?: string;
123123
}
124124

125+
const showPickerStyle = { display: "block" };
126+
const hidePickerStyle = { display: "none" };
127+
125128
export const LexicalColorPicker = ({
126129
value,
127130
onChange,
@@ -130,7 +133,13 @@ export const LexicalColorPicker = ({
130133
const [showPicker, setShowPicker] = useState(false);
131134
// Either a custom color or a color coming from the theme object.
132135
const [actualSelectedColor, setActualSelectedColor] = useState(value || "#fff");
133-
let themeColor = false;
136+
const themeColor = useRef(false);
137+
138+
useEffect(() => {
139+
if (value) {
140+
setActualSelectedColor(value);
141+
}
142+
}, [value]);
134143

135144
const getColorValue = useCallback((rgb: RGBColor) => {
136145
return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${rgb.a})`;
@@ -151,37 +160,36 @@ export const LexicalColorPicker = ({
151160

152161
const onColorChangeComplete = useCallback(
153162
({ rgb }: ColorState, event: React.SyntheticEvent) => {
154-
setActualSelectedColor(value);
155-
onChangeComplete(getColorValue(rgb));
156163
event.preventDefault();
164+
const value = getColorValue(rgb);
165+
setActualSelectedColor(value);
166+
onChangeComplete(value);
157167
},
158168
[onChangeComplete]
159169
);
160170

161-
const togglePicker = useCallback((e: SyntheticEvent, showPicker: boolean) => {
171+
const togglePicker = useCallback((e: SyntheticEvent) => {
162172
e.stopPropagation();
163-
setShowPicker(!showPicker);
173+
setShowPicker(state => !state);
164174
}, []);
165175

166176
const pageElements = usePageElements();
167177

168-
const themeColors: Record<string, any> = {};
169-
const colors = pageElements.theme?.styles?.colors;
170-
if (colors) {
171-
for (const key in colors) {
172-
if (colors[key]) {
173-
themeColors[key] = colors[key];
174-
}
175-
}
176-
}
178+
const themeColors: Record<string, any> = useMemo(() => {
179+
const colors = pageElements.theme?.styles?.colors ?? {};
180+
181+
return Object.keys(colors).reduce((acc, key) => {
182+
return { ...acc, [key]: colors[key] };
183+
}, {});
184+
}, [pageElements.theme?.styles?.colors]);
177185

178186
return (
179187
<ColorPickerStyle>
180188
{Object.keys(themeColors).map((key, index) => {
181189
const color = themeColors[key];
182190

183191
if (color === value || value === "transparent") {
184-
themeColor = true;
192+
themeColor.current = true;
185193
}
186194
return (
187195
<ColorBox key={index}>
@@ -217,26 +225,23 @@ export const LexicalColorPicker = ({
217225
<ColorBox>
218226
<Tooltip content={<span>Color picker</span>} placement="bottom">
219227
<Color
220-
className={value && !themeColor ? styles.selectedColor : ""}
221-
style={{ backgroundColor: themeColor ? "#fff" : value }}
222-
onClick={e => {
223-
togglePicker(e, showPicker);
224-
}}
228+
className={value && !themeColor.current ? styles.selectedColor : ""}
229+
style={{ backgroundColor: themeColor.current ? "#fff" : value }}
230+
onClick={togglePicker}
225231
>
226232
<IconPalette className={iconPaletteStyle} />
227233
</Color>
228234
</Tooltip>
229235
</ColorBox>
230236

231-
{showPicker && (
237+
<div style={showPicker ? showPickerStyle : hidePickerStyle}>
232238
<ChromePicker
233239
className={chromePickerStyle}
234240
color={actualSelectedColor}
235-
// TODO figure out types for the props
236241
onChange={onColorChange as OnChangeHandler}
237242
onChangeComplete={onColorChangeComplete as OnChangeHandler}
238243
/>
239-
)}
244+
</div>
240245
</ColorPickerStyle>
241246
);
242247
};

0 commit comments

Comments
 (0)