index.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import React from 'react';
  2. import { ChromePicker } from 'react-color';
  3. import Icon from '../Icon';
  4. import Typography from '../Typography';
  5. import {
  6. Group,
  7. Item,
  8. Circle,
  9. PickerContainer,
  10. Blanket,
  11. } from '../../global/toolStyled';
  12. import data from './data';
  13. type Props = {
  14. title?: string;
  15. selectedColor?: string;
  16. onClick: (color: string) => void;
  17. mode?: 'normal' | 'shape' | 'watermark';
  18. isCollapse: boolean;
  19. pickerToggle: (e: React.MouseEvent<HTMLElement>) => void;
  20. };
  21. type ColorItem = {
  22. key: string | number | undefined;
  23. color: string;
  24. icon?: string;
  25. };
  26. const ColorSelector: React.FC<Props> = ({
  27. title = '',
  28. mode = 'normal',
  29. selectedColor = '',
  30. onClick,
  31. pickerToggle,
  32. isCollapse,
  33. }: Props) => {
  34. const colorList: ColorItem[] = data[mode];
  35. return (
  36. <>
  37. {title ? (
  38. <Typography
  39. variant="subtitle"
  40. style={{ marginTop: '8px' }}
  41. align="left"
  42. >
  43. {title}
  44. </Typography>
  45. ) : null}
  46. <Group>
  47. {colorList.map((ele: ColorItem) => (
  48. <Item
  49. key={ele.key}
  50. selected={selectedColor === ele.color}
  51. onMouseDown={(): void => {
  52. onClick(ele.color);
  53. }}
  54. >
  55. {ele.icon ? (
  56. <Icon glyph={ele.icon} />
  57. ) : (
  58. <Circle color={ele.color} />
  59. )}
  60. </Item>
  61. ))}
  62. <Item onMouseDown={pickerToggle}>
  63. <Icon glyph="color-picker" />
  64. </Item>
  65. {!isCollapse ? (
  66. <PickerContainer>
  67. <Blanket onMouseDown={pickerToggle} />
  68. <ChromePicker
  69. color={selectedColor}
  70. disableAlpha
  71. onChange={(color: any, event: any): void => {
  72. event.preventDefault();
  73. onClick(color.hex);
  74. }}
  75. />
  76. </PickerContainer>
  77. ) : null}
  78. </Group>
  79. </>
  80. );
  81. };
  82. export default ColorSelector;