ColorPicker.jsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 Color = styled.div`
  8. position: relative;
  9. background-image: url(${backgroundGrid});
  10. width: 32px;
  11. height: 32px;
  12. margin: 5px;
  13. cursor: pointer;
  14. &::after {
  15. inset: 0;
  16. content: "";
  17. position: absolute;
  18. background: ${({ color }) => color};
  19. border: 2px solid #ffffff66;
  20. }
  21. `;
  22. const ColorPickerWrapper = styled.div`
  23. position: fixed;
  24. inset: 0;
  25. background-color: #151515b0;
  26. z-index: 290;
  27. display: flex;
  28. justify-content: center;
  29. align-items: center;
  30. flex-direction: column;
  31. `;
  32. const ColorPicker = ({ value, onChange, disableAlpha = true }) => {
  33. const [showPicker, setShowPicker] = React.useState(false);
  34. const [currentColor, setCurrentColor] = React.useState(() => {
  35. if (value === "") {
  36. return { r: 150, g: 150, b: 150, a: 1 };
  37. }
  38. try {
  39. const [red, green, blue, alpha] = parseToRgba(value);
  40. return { r: red, g: green, b: blue, a: alpha };
  41. } catch (e) {
  42. console.log("Failed to parse color", e);
  43. return { r: 0, g: 0, b: 0, a: 1 };
  44. }
  45. });
  46. const { t } = useTranslation();
  47. const showColorPicker = () => {
  48. setShowPicker((prev) => !prev);
  49. };
  50. const handleChange = React.useCallback((newColor) => {
  51. setCurrentColor(newColor.rgb);
  52. }, []);
  53. const handleChangeComplete = React.useCallback(
  54. (newColor) => {
  55. setCurrentColor(newColor.rgb);
  56. const { r: red, g: green, b: blue, a: alpha } = newColor.rgb;
  57. onChange(rgba(red, green, blue, alpha));
  58. },
  59. [onChange]
  60. );
  61. const handleClick = React.useCallback(() => {
  62. setShowPicker(false);
  63. }, []);
  64. return (
  65. <>
  66. <Color color={value} onClick={showColorPicker} />
  67. {showPicker && (
  68. <ColorPickerWrapper>
  69. <SketchPicker
  70. color={currentColor}
  71. onChange={handleChange}
  72. disableAlpha={disableAlpha}
  73. onChangeComplete={handleChangeComplete}
  74. />
  75. <button onClick={handleClick}>{t("Close")}</button>
  76. </ColorPickerWrapper>
  77. )}
  78. </>
  79. );
  80. };
  81. export default ColorPicker;