import AllApplication from '@icon-park/react/lib/icons/AllApplication'; import CheckSmall from '@icon-park/react/lib/icons/CheckSmall'; import History from '@icon-park/react/lib/icons/History'; import classnames from 'classnames'; import React, { useEffect, useState } from 'react'; import { RECOMMEND_COLORS } from './const'; import { StashStore, toHex } from './utils'; const ALLOW_REG = /[^0-9|a-f|A-F]/g; const colorIsEqual = (color1: string, color2: string) => toHex(color1) === toHex(color2); const renderTitle = (title: React.ReactElement) =>
{title}
; const renderColorSpan = (color: string, resetColor: string, selectedColor = '') => ( ); const pureColor = (color: string) => color && color.replace(/#/g, ''); interface IInputColorProps { setColor: (color: string) => any; color: string; onChange: (color: string) => any; } const InputColor = ({ setColor, color, onChange }: IInputColorProps) => { const colorStr = pureColor(color); return (
# onChange((e.target as HTMLInputElement).value)} onFocus={e => e.target.setSelectionRange(0, colorStr.length)} onClick={e => e.stopPropagation()} />
); }; const renderPickData = (data: string[], resetColor: string) => { if (!data.length) return; return ( <> {renderTitle()}
{data.map(color => renderColorSpan(color, resetColor))}
); }; interface IColorListProps { name: string; max?: number; onClick: (color: string | false, force: boolean) => any; resetColor: string; selectedColor: string; } const ColorSelector = ({ name, max = 10, onClick, resetColor, selectedColor }: IColorListProps) => { const [store, setStore] = useState(null); const [inputColor, _setInputColor] = useState(selectedColor); useEffect(() => { const _store = new StashStore(name, max); setStore(_store); }, []); const setInputColor = (color: string) => { if (color === inputColor) { return; } _setInputColor(color); }; const prevPick = store ? store.data : []; const setColor = (color: string, force = false) => { const realColor = toHex(color); if (!realColor) { // remove format when empty if (color === '#') onClick(false, force); return; } setInputColor(color); onClick(color === resetColor ? false : realColor, force); store && store.add(realColor, true); }; return (
{ const target = e.target as HTMLElement; if (target && target.dataset && target.dataset.color) { setColor(target.dataset.color); } }} > {renderPickData(prevPick, resetColor)} {renderTitle()}
{RECOMMEND_COLORS.map(color => renderColorSpan(color, resetColor, selectedColor))}
{ setColor(_color, true); }} color={inputColor} onChange={val => { setInputColor(val.replace(ALLOW_REG, '')); }} />
); }; export { ColorSelector, IColorListProps };