| import * as React from 'react';  | 
| import CopyableIcon from './CopyableIcon';  | 
| import type { ThemeType } from './index';  | 
| import type { CategoriesKeys } from './fields';  | 
| import { useIntl } from '@umijs/max';  | 
| import styles from './style.less';  | 
|   | 
| interface CategoryProps {  | 
|   title: CategoriesKeys;  | 
|   icons: string[];  | 
|   theme: ThemeType;  | 
|   newIcons: string[];  | 
|   onSelect: (type: string, name: string) => any;  | 
| }  | 
|   | 
| const Category: React.FC<CategoryProps> = props => {  | 
|   | 
|   const { icons, title, newIcons, theme } = props;  | 
|   const intl = useIntl();  | 
|   const [justCopied, setJustCopied] = React.useState<string | null>(null);  | 
|   const copyId = React.useRef<NodeJS.Timeout | null>(null);  | 
|   const onSelect = React.useCallback((type: string, text: string) => {  | 
|     const { onSelect } = props;  | 
|     if (onSelect) {  | 
|       onSelect(type, text);  | 
|     }  | 
|     setJustCopied(type);  | 
|     copyId.current = setTimeout(() => {  | 
|       setJustCopied(null);  | 
|     }, 2000);  | 
|   }, []);  | 
|   React.useEffect(  | 
|     () => () => {  | 
|       if (copyId.current) {  | 
|         clearTimeout(copyId.current);  | 
|       }  | 
|     },  | 
|     [],  | 
|   );  | 
|   | 
|   return (  | 
|     <div>  | 
|       <h4>{intl.formatMessage({  | 
|         id: `app.docs.components.icon.category.${title}`,  | 
|         defaultMessage: '信息',  | 
|       })}</h4>  | 
|       <ul className={styles.anticonsList}>  | 
|         {icons.map(name => (  | 
|           <CopyableIcon  | 
|             key={name}  | 
|             name={name}  | 
|             theme={theme}  | 
|             isNew={newIcons.includes(name)}  | 
|             justCopied={justCopied}  | 
|             onSelect={onSelect}  | 
|           />  | 
|         ))}  | 
|       </ul>  | 
|     </div>  | 
|   );  | 
| };  | 
|   | 
| export default Category;  |