1
0

index.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import React, { PropsWithChildren, ReactNode } from 'react';
  2. import { HsvaColor, RgbaColor } from '@douyinfe/semi-foundation/colorPicker/interface';
  3. import Input from "../../input";
  4. import InputGroup from "../../input/inputGroup";
  5. import InputNumber from "../../inputNumber";
  6. import Select from "../../select";
  7. import Button from "../../button";
  8. import ColorPickerFoundation, { ColorPickerProps } from '@douyinfe/semi-foundation/colorPicker/foundation';
  9. import { isEqual } from 'lodash';
  10. import { IconEyedropper } from '@douyinfe/semi-icons';
  11. import { cssClasses } from '@douyinfe/semi-foundation/colorPicker/constants';
  12. import BaseComponent from "../../_base/baseComponent";
  13. import DataPartFoundation, {
  14. DataPartAdapter,
  15. DataPartBaseProps,
  16. DataPartBaseState
  17. } from "@douyinfe/semi-foundation/colorPicker/DataPartFoundation";
  18. export interface DataPartProps extends DataPartBaseProps {
  19. }
  20. export interface DataPartState extends DataPartBaseState {
  21. }
  22. class DataPart extends BaseComponent<PropsWithChildren<DataPartProps>, DataPartState> {
  23. constructor(props: DataPartProps) {
  24. super(props);
  25. this.foundation = new DataPartFoundation(this.adapter);
  26. this.state = {
  27. format: this.props.defaultFormat,
  28. inputValue: ''
  29. };
  30. }
  31. get adapter(): DataPartAdapter<DataPartBaseProps, DataPartBaseState> {
  32. return {
  33. ...super.adapter,
  34. getColorPickerFoundation: () => this.props.foundation,
  35. };
  36. }
  37. componentDidMount() {
  38. this.foundation.handleInputValueChange(this.foundation.getInputValue());
  39. }
  40. componentDidUpdate(prevProps: Readonly<DataPartProps>, prevState: Readonly<DataPartState>, snapshot?: any) {
  41. if (!isEqual(prevProps.currentColor, this.props.currentColor) || prevState.format !== this.state.format) {
  42. this.foundation.handleInputValueChange(this.foundation.getInputValue());
  43. }
  44. }
  45. handleChange = (newColor: RgbaColor | HsvaColor | string) => {
  46. this.props.foundation.handleChange(newColor, this.state.format);
  47. }
  48. render() {
  49. const rgba = this.props.currentColor.rgba;
  50. return <div className={`${cssClasses.PREFIX}-dataPart`} style={{ width: this.props.width }}>
  51. <div className={`${cssClasses.PREFIX}-colorDemoBlock`} style={{
  52. minWidth: 20, minHeight: 20, backgroundColor:
  53. `rgba(${rgba.r},${rgba.g},${rgba.b},${rgba.a})`
  54. }}>
  55. </div>
  56. <InputGroup size={'small'} className={`${cssClasses.PREFIX}-inputGroup`}>
  57. <Input className={`${cssClasses.PREFIX}-colorPickerInput`}
  58. value={this.state.inputValue}
  59. onChange={(v) => {
  60. const value = this.foundation.getValueByInputValue(v);
  61. if (value) {
  62. this.handleChange(value);
  63. }
  64. this.foundation.handleInputValueChange(v);
  65. }}
  66. />
  67. {
  68. this.props.alpha && <InputNumber
  69. min={0}
  70. max={100}
  71. className={`${cssClasses.PREFIX}-colorPickerInputNumber`}
  72. value={Number(Math.round(this.props.currentColor.rgba.a * 100))}
  73. onNumberChange={v => {
  74. if (this.state.format === 'rgba') {
  75. this.handleChange({ ...this.props.currentColor.rgba, a: Number((v / 100).toFixed(2)) });
  76. } else if (this.state.format === 'hex') {
  77. const rgba = { ...this.props.currentColor.rgba, a: Number((v / 100).toFixed(2)) };
  78. const hex = ColorPickerFoundation.rgbaToHex(rgba);
  79. this.handleChange(hex);
  80. } else if (this.state.format === 'hsva') {
  81. const rgba = { ...this.props.currentColor.hsva, a: Number((v / 100).toFixed(2)) };
  82. this.handleChange(rgba);
  83. }
  84. }}
  85. suffix={<span className={`${cssClasses.PREFIX}-inputNumberSuffix`}>%</span>} hideButtons={true}/>
  86. }
  87. <Select className={`${cssClasses.PREFIX}-formatSelect`}
  88. size={'small'}
  89. value={this.state.format}
  90. onSelect={v => this.foundation.handleFormatChange(v)}
  91. optionList={['hex', 'rgba', 'hsva'].map(type => ({ label: type, value: type }))}/>
  92. </InputGroup>
  93. {this.props.eyeDropper && <Button type={'tertiary'} theme={'light'} size={'small'}
  94. onClick={this.foundation.handlePickValueWithStraw}
  95. icon={<IconEyedropper/>}/>}
  96. </div>;
  97. }
  98. }
  99. export default DataPart;