From da78fad79e8161c8983ecb3a82fd38a25cc0d916 Mon Sep 17 00:00:00 2001 From: Rian8337 <52914632+Rian8337@users.noreply.github.com> Date: Fri, 8 Sep 2023 16:30:44 +0700 Subject: [PATCH] Split color pickers into single and multiple The single color picker binds to the user input unlike the multiple one. --- ...olorEditor.css => MultipleColorEditor.css} | 0 ...olorEditor.tsx => MultipleColorEditor.tsx} | 37 +++++---- src/components/editors/SingleColorEditor.tsx | 80 +++++++++++++++++++ .../skin/Color/MenuItemDefaultColor.tsx | 4 +- .../skin/Color/MenuItemDefaultTextColor.tsx | 4 +- .../skin/Color/MenuItemOnTouchColor.tsx | 4 +- .../skin/Color/MenuItemSelectedTextColor.tsx | 4 +- .../Color/MenuItemVersionsDefaultColor.tsx | 4 +- .../Color/MenuItemVersionsSelectedColor.tsx | 4 +- .../groups/skin/ComboColor/ColorList.tsx | 34 +------- .../groups/skin/Slider/SliderBodyColor.tsx | 4 +- .../groups/skin/Slider/SliderBorderColor.tsx | 4 +- .../groups/skin/Slider/SliderHintColor.tsx | 4 +- 13 files changed, 125 insertions(+), 62 deletions(-) rename src/components/editors/{ColorEditor.css => MultipleColorEditor.css} (100%) rename src/components/editors/{ColorEditor.tsx => MultipleColorEditor.tsx} (72%) create mode 100644 src/components/editors/SingleColorEditor.tsx diff --git a/src/components/editors/ColorEditor.css b/src/components/editors/MultipleColorEditor.css similarity index 100% rename from src/components/editors/ColorEditor.css rename to src/components/editors/MultipleColorEditor.css diff --git a/src/components/editors/ColorEditor.tsx b/src/components/editors/MultipleColorEditor.tsx similarity index 72% rename from src/components/editors/ColorEditor.tsx rename to src/components/editors/MultipleColorEditor.tsx index 47026ec..4cba9f9 100644 --- a/src/components/editors/ColorEditor.tsx +++ b/src/components/editors/MultipleColorEditor.tsx @@ -1,6 +1,6 @@ import { useState } from "react"; import { Resettable } from "../../structures/resettable/Resettable"; -import "./ColorEditor.css"; +import "./MultipleColorEditor.css"; interface Props { /** @@ -16,24 +16,34 @@ interface Props { /** * The configuration that the input is responsible for. */ - resettable: Resettable; + resettable: Resettable; /** * The label beside the color input box. */ inputLabel?: string; - - /** - * Whether to accept multiple colors. Defaults to `false`. - */ - acceptMultipleColors?: boolean; } -export default function ColorEditor(props: Props) { - const { title, description, resettable, inputLabel, acceptMultipleColors } = - props; +export default function MultipleColorEditor(props: Props) { + const { title, description, resettable, inputLabel } = props; const [hexCode, setHexCode] = useState("#FFFFFF"); + // Introduce additional hooks to convert the value from an array. + const defaultValue = resettable.defaultValue[0]; + const [value, setValue] = useState(defaultValue); + + const modifyValue = (value = defaultValue) => { + setValue(value); + + resettable.setValue(value.split(",").map((v) => v.trim())); + }; + + const resetValue = () => { + setValue(defaultValue); + + resettable.reset(); + }; + return (
{title}
@@ -51,10 +61,9 @@ export default function ColorEditor(props: Props) { { - resettable.setValue(event.target.value || undefined); + modifyValue(event.target.value || undefined); }} /> @@ -62,7 +71,7 @@ export default function ColorEditor(props: Props) { className="json-item-editor-input" type="reset" onClick={() => { - resettable.reset(); + resetValue(); }} />
diff --git a/src/components/editors/SingleColorEditor.tsx b/src/components/editors/SingleColorEditor.tsx new file mode 100644 index 0000000..1dec693 --- /dev/null +++ b/src/components/editors/SingleColorEditor.tsx @@ -0,0 +1,80 @@ +import { Resettable } from "../../structures/resettable/Resettable"; +import { validateColor } from "../../utils/validators"; + +interface Props { + /** + * The title of the input. + */ + title: string; + + /** + * The description of the input. + */ + description?: string; + + /** + * The configuration that the input is responsible for. + */ + resettable: Resettable; +} + +export default function SingleColorEditor(props: Props) { + const { title, description, resettable } = props; + + return ( +
+
{title}
+ {description ? ( +
+ {description} +
+ ) : null} + +
+ { + resettable.setValue( + event.target.value.toUpperCase() || undefined + ); + }} + /> + + { + const value = event.target.value; + + if (value) { + resettable.setValue( + validateColor(value) + ? value.toUpperCase() + : value + ); + } else { + resettable.reset(); + } + }} + /> + + { + resettable.reset(); + }} + /> +
+
+ ); +} diff --git a/src/components/groups/skin/Color/MenuItemDefaultColor.tsx b/src/components/groups/skin/Color/MenuItemDefaultColor.tsx index b8520a8..deb8bd6 100644 --- a/src/components/groups/skin/Color/MenuItemDefaultColor.tsx +++ b/src/components/groups/skin/Color/MenuItemDefaultColor.tsx @@ -1,12 +1,12 @@ import { useContext } from "react"; import { MenuItemDefaultColorContext } from "../../../../hooks/Color/MenuItemDefaultColorContext"; -import ColorEditor from "../../../editors/ColorEditor"; +import SingleColorEditor from "../../../editors/SingleColorEditor"; export default function MenuItemDefaultColor() { const ctx = useContext(MenuItemDefaultColorContext); return ( - { - setValue(value); - - ctx.setValue(value.split(",").map((v) => v.trim())); - }; - - const resetValue = () => { - setValue(defaultValue); - - ctx.reset(); - }; - return ( - { - ctx.saveToJSON(json); - }, - }} + resettable={ctx} /> ); } diff --git a/src/components/groups/skin/Slider/SliderBodyColor.tsx b/src/components/groups/skin/Slider/SliderBodyColor.tsx index f93b5cd..8203702 100644 --- a/src/components/groups/skin/Slider/SliderBodyColor.tsx +++ b/src/components/groups/skin/Slider/SliderBodyColor.tsx @@ -1,9 +1,9 @@ import { useContext } from "react"; import { SliderBodyColorContext } from "../../../../hooks/Slider/SliderBodyColorContext"; -import ColorEditor from "../../../editors/ColorEditor"; +import SingleColorEditor from "../../../editors/SingleColorEditor"; export default function SliderBodyColor() { const ctx = useContext(SliderBodyColorContext); - return ; + return ; } diff --git a/src/components/groups/skin/Slider/SliderBorderColor.tsx b/src/components/groups/skin/Slider/SliderBorderColor.tsx index 9210303..b3be5f5 100644 --- a/src/components/groups/skin/Slider/SliderBorderColor.tsx +++ b/src/components/groups/skin/Slider/SliderBorderColor.tsx @@ -1,9 +1,9 @@ import { useContext } from "react"; import { SliderBorderColorContext } from "../../../../hooks/Slider/SliderBorderColorContext"; -import ColorEditor from "../../../editors/ColorEditor"; +import SingleColorEditor from "../../../editors/SingleColorEditor"; export default function SliderBorderColor() { const ctx = useContext(SliderBorderColorContext); - return ; + return ; } diff --git a/src/components/groups/skin/Slider/SliderHintColor.tsx b/src/components/groups/skin/Slider/SliderHintColor.tsx index 36ab0bc..373388b 100644 --- a/src/components/groups/skin/Slider/SliderHintColor.tsx +++ b/src/components/groups/skin/Slider/SliderHintColor.tsx @@ -1,9 +1,9 @@ import { useContext } from "react"; import { SliderHintColorContext } from "../../../../hooks/Slider/SliderHintColorContext"; -import ColorEditor from "../../../editors/ColorEditor"; +import SingleColorEditor from "../../../editors/SingleColorEditor"; export default function SliderHintColor() { const ctx = useContext(SliderHintColorContext); - return ; + return ; }