ColorPicker.jsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import React from "react";
  2. import { SketchPicker } from "react-color";
  3. import { useTranslation } from "react-i18next";
  4. import { parseToRgba, rgba } from "color2k";
  5. import styled from "styled-components";
  6. import backgroundGrid from "../../media/images/background-grid.png";
  7. const defaultColors = [
  8. "#FFF1E8",
  9. "#FFEC27",
  10. "#29ADFF",
  11. "#FFCCAA",
  12. "#00E436",
  13. "#C2C3C7",
  14. "#FFA300",
  15. "#FF77A8",
  16. "#83769C",
  17. "#FF004D",
  18. "#008751",
  19. "#AB5236",
  20. "#5F574F",
  21. "#1D2B53",
  22. "#7E2553",
  23. "#000000 ",
  24. ];
  25. const Color = styled.div`
  26. position: relative;
  27. background-image: url(${backgroundGrid});
  28. width: 32px;
  29. height: 32px;
  30. margin: 5px;
  31. cursor: pointer;
  32. &::after {
  33. inset: 0;
  34. content: "";
  35. position: absolute;
  36. background: ${({ color }) => color};
  37. border: 2px solid #ffffff66;
  38. }
  39. `;
  40. const ColorPickerWrapper = styled.div`
  41. position: fixed;
  42. inset: 0;
  43. background-color: #151515b0;
  44. z-index: 290;
  45. display: flex;
  46. justify-content: center;
  47. align-items: center;
  48. flex-direction: column;
  49. `;
  50. const ColorPicker = ({
  51. value,
  52. onChange,
  53. disableAlpha = true,
  54. colors = defaultColors,
  55. }) => {
  56. const [showPicker, setShowPicker] = React.useState(false);
  57. const [currentColor, setCurrentColor] = React.useState(() => {
  58. if (value === "") {
  59. return { r: 150, g: 150, b: 150, a: 1 };
  60. }
  61. try {
  62. const [red, green, blue, alpha] = parseToRgba(value);
  63. return { r: red, g: green, b: blue, a: alpha };
  64. } catch (e) {
  65. console.log("Failed to parse color", e);
  66. return { r: 0, g: 0, b: 0, a: 1 };
  67. }
  68. });
  69. const { t } = useTranslation();
  70. const showColorPicker = () => {
  71. setShowPicker((prev) => !prev);
  72. };
  73. const handleChange = React.useCallback((newColor) => {
  74. setCurrentColor(newColor.rgb);
  75. }, []);
  76. const handleChangeComplete = React.useCallback(
  77. (newColor) => {
  78. setCurrentColor(newColor.rgb);
  79. const { r: red, g: green, b: blue, a: alpha } = newColor.rgb;
  80. onChange(rgba(red, green, blue, alpha));
  81. },
  82. [onChange]
  83. );
  84. const handleClick = React.useCallback(() => {
  85. setShowPicker(false);
  86. }, []);
  87. return (
  88. <>
  89. <Color color={value} onClick={showColorPicker} />
  90. {showPicker && (
  91. <ColorPickerWrapper>
  92. <SketchPicker
  93. color={currentColor}
  94. onChange={handleChange}
  95. disableAlpha={disableAlpha}
  96. onChangeComplete={handleChangeComplete}
  97. presetColors={colors}
  98. />
  99. <button onClick={handleClick}>{t("Close")}</button>
  100. </ColorPickerWrapper>
  101. )}
  102. </>
  103. );
  104. };
  105. export default ColorPicker;