acud
Version:
acg react 组件库
177 lines • 7.22 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
/**
* @file
* @author chenyaqiu@baidu.com
*/
import React, { useEffect, useState, useMemo, useCallback } from 'react';
import { ChromePicker } from 'react-color';
import classNames from 'classnames';
import Select from '../select';
import Input from '../input';
import { DEFAULT_COLORS, getHexWithAlpha } from './util';
import { ConfigContext } from '../config-provider';
;
var DEFAULT_RGB = {
r: 0,
g: 0,
b: 0,
a: 0
};
var WHITE_REG = /^#(fff|ffffff)([0-9a-f]{3})/;
var HEX_REG = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})([0-9A-Fa-f]{2})?$/;
var ColorPicker = function ColorPicker(props) {
var defaultColor = props.defaultColor,
_props$defaultColors = props.defaultColors,
defaultColors = _props$defaultColors === void 0 ? DEFAULT_COLORS : _props$defaultColors,
_props$disabled = props.disabled,
disabled = _props$disabled === void 0 ? false : _props$disabled,
_props$type = props.type,
type = _props$type === void 0 ? 'default' : _props$type,
color = props.color,
className = props.className,
style = props.style,
_props$placeholder = props.placeholder,
placeholder = _props$placeholder === void 0 ? '请选择色值' : _props$placeholder,
_props$inputPlacehold = props.inputPlaceholder,
inputPlaceholder = _props$inputPlacehold === void 0 ? '请输入hex色值' : _props$inputPlacehold,
customPrefixCls = props.prefixCls,
_props$allowClear = props.allowClear,
allowClear = _props$allowClear === void 0 ? false : _props$allowClear,
_props$dropdownStyle = props.dropdownStyle,
dropdownStyle = _props$dropdownStyle === void 0 ? {
minWidth: 240
} : _props$dropdownStyle,
onChange = props.onChange;
var hasColor = 'color' in props;
var _React$useContext = React.useContext(ConfigContext),
getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls('colorpicker', customPrefixCls);
var _useState = useState(defaultColor),
_useState2 = _slicedToArray(_useState, 2),
curColor = _useState2[0],
setCurColor = _useState2[1];
var _useState3 = useState(defaultColor === 'transparent' ? DEFAULT_RGB : defaultColor),
_useState4 = _slicedToArray(_useState3, 2),
curRgb = _useState4[0],
setCurRgb = _useState4[1];
var _useState5 = useState(),
_useState6 = _slicedToArray(_useState5, 2),
inputVal = _useState6[0],
setInputVal = _useState6[1];
var isTransparent = curColor === 'transparent';
var isWhite = !isTransparent && curColor && WHITE_REG.test(getHexWithAlpha({
hex: curColor
}).toLowerCase());
var isCustom = type === 'custom';
var colorpickerClassName = classNames(prefixCls, _defineProperty({}, "".concat(prefixCls, "-custom"), isCustom), _defineProperty({}, "".concat(prefixCls, "-default"), type === 'default'), _defineProperty({}, "".concat(prefixCls, "-simple"), type === 'simple'), {
className: className
});
var handleChange = useCallback(function (color) {
setInputVal(color);
if (!color || HEX_REG.test(color)) {
setCurColor(color);
setCurRgb(color);
onChange && onChange(color);
}
}, [onChange]);
var selectRender = useMemo(function () {
return /*#__PURE__*/React.createElement("div", {
className: "colorpicker-dropdowns-render"
}, curColor && /*#__PURE__*/React.createElement("div", {
className: classNames('colorpicker-dropdowns-render-block', {
'none': isTransparent,
'white': isWhite
}),
style: !isTransparent && curColor ? {
backgroundColor: curColor
} : {}
}), /*#__PURE__*/React.createElement("span", {
className: "colorpicker-dropdowns-render-text"
}, type !== 'simple' && !isTransparent ? curColor : ''))
// eslint-disable-next-line react-hooks/exhaustive-deps
;
}, [isTransparent, curColor]);
var dropDownRender = useMemo(function () {
return /*#__PURE__*/React.createElement(React.Fragment, null, isCustom && /*#__PURE__*/React.createElement(Input, {
className: "colorpicker-input",
placeholder: inputPlaceholder,
value: isTransparent ? undefined : inputVal || curColor,
onChange: function onChange(e) {
return handleChange(e.target.value);
}
}), /*#__PURE__*/React.createElement("div", {
className: "colorpicker-dropdowns"
}, defaultColors && defaultColors.map(function (color) {
var isSelected = color === curColor;
var isWhite = WHITE_REG.test(color.toLowerCase());
var isTrans = color === 'transparent';
return /*#__PURE__*/React.createElement("div", {
key: color,
className: classNames('colorpicker-dropdowns-color', _defineProperty({
none: isTrans,
white: isWhite
}, 'colorpicker-dropdowns-color-selected', isSelected)),
onClick: function onClick() {
curColor !== color && setCurColor(color);
isCustom && curColor !== color && setCurRgb(isTrans ? DEFAULT_RGB : color);
onChange && onChange(isTrans ? '' : color);
}
}, /*#__PURE__*/React.createElement("div", {
className: "colorpicker-dropdowns-color-block",
style: !isTrans ? {
backgroundColor: color
} : {}
}));
})))
// eslint-disable-next-line react-hooks/exhaustive-deps
;
}, [isCustom, curColor, inputVal, defaultColors, onChange, isTransparent, inputPlaceholder]);
var customDropdownRender = useMemo(function () {
return /*#__PURE__*/React.createElement("div", {
className: "colorpicker-dropdowns-custom"
}, /*#__PURE__*/React.createElement(ChromePicker, {
color: curRgb,
onChangeComplete: function onChangeComplete(color) {
var _a;
setCurRgb(((_a = color === null || color === void 0 ? void 0 : color.rgb) === null || _a === void 0 ? void 0 : _a.a) === 1 ? color.hex : color.rgb);
setCurColor(getHexWithAlpha(color));
onChange && onChange(getHexWithAlpha(color), color);
}
}), dropDownRender);
}, [dropDownRender, curRgb, onChange]);
useEffect(function () {
if (hasColor && color !== curColor) {
setCurColor(color);
setCurRgb(color);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [color, hasColor]);
useEffect(function () {
curColor && setInputVal(undefined);
}, [curColor]);
return /*#__PURE__*/React.createElement("div", {
className: colorpickerClassName,
style: style
}, /*#__PURE__*/React.createElement(Select, {
dropdownClassName: "colorpicker-dropdowns-con".concat(isCustom ? ' custom' : ''),
mode: "multiple",
placeholder: placeholder,
maxTagCount: 1,
allowClear: allowClear,
disabled: disabled,
tagRender: function tagRender() {
return selectRender;
},
dropdownRender: function dropdownRender() {
return isCustom ? customDropdownRender : dropDownRender;
},
dropdownStyle: dropdownStyle,
value: curColor ? [curColor] : undefined,
onClear: function onClear() {
return handleChange('');
},
showSearch: false
}));
};
export default ColorPicker;