import * as React from 'react'; import Icon, * as AntdIcons from '@ant-design/icons'; import { Radio, Input } from 'antd'; import { RadioChangeEvent } from 'antd/es/radio/interface'; import { injectIntl } from 'react-intl'; import debounce from 'lodash/debounce'; import Category from './Category'; import IconPicSearcher from './IconPicSearcher'; import { FilledIcon, OutlinedIcon, TwoToneIcon } from './themeIcons'; import { categories, Categories, CategoriesKeys } from './fields'; type ThemeType = 'filled' | 'outlined' | 'twoTone'; const allIcons: { [key: string]: any; } = AntdIcons; interface IconDisplayProps { intl: any; } interface IconDisplayState { theme: ThemeType; searchKey: string; } class IconDisplay extends React.Component { static categories: Categories = categories; static newIconNames: string[] = []; state: IconDisplayState = { theme: 'outlined', searchKey: '', }; constructor(props: IconDisplayProps) { super(props); this.handleSearchIcon = debounce(this.handleSearchIcon, 300); } getComputedDisplayList = () => { return Object.keys(categories) .map((category: CategoriesKeys) => ({ category, icons: (IconDisplay.categories[category] || []).filter(name => !!allIcons[name]), })) .filter(({ icons }) => Boolean(icons.length)); }; handleChangeTheme = (e: RadioChangeEvent) => { this.setState({ theme: e.target.value as ThemeType, }); }; handleSearchIcon = (searchKey: string) => { this.setState(prevState => ({ ...prevState, searchKey, })); }; renderCategories(list: Array<{ category: CategoriesKeys; icons: string[] }>) { const { searchKey, theme } = this.state; return list .filter(({ category }) => category !== 'all') .map(({ category, icons }) => ({ category, icons: icons .filter(name => { if (theme === 'outlined') { return ['filled', 'twotone'].every( themeName => !name.toLowerCase().includes(themeName), ); } return name.toLowerCase().includes(theme); }) .filter(name => name.toLowerCase().includes(searchKey)), })) .filter(({ icons }) => !!icons.length) .map(({ category, icons }) => ( )); } render() { const { intl: { messages }, } = this.props; const list = this.getComputedDisplayList(); return ( <>
{messages['app.docs.components.icon.outlined']} {messages['app.docs.components.icon.filled']} {messages['app.docs.components.icon.two-tone']} this.handleSearchIcon(e.currentTarget.value)} size="large" autoFocus suffix={} />
{this.renderCategories(list)} ); } } export default injectIntl(IconDisplay);