import React, { useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react'; import PropTypes from 'prop-types'; import { useTranslation } from 'react-i18next'; import { Button, Form, Input } from 'semantic-ui-react'; import { useDidUpdate, useToggle } from '../../lib/hooks'; import { useClosableForm, useForm } from '../../hooks'; import styles from './AddList.module.css'; const DEFAULT_DATA = { name: '', }; const AddList = React.forwardRef(({ children, onCreate }, ref) => { const [t] = useTranslation(); const [isOpened, setIsOpened] = useState(false); const [data, handleFieldChange, setData] = useForm(DEFAULT_DATA); const [selectNameFieldState, selectNameField] = useToggle(); const nameField = useRef(null); const open = useCallback(() => { setIsOpened(true); }, []); const close = useCallback(() => { setIsOpened(false); }, []); useImperativeHandle( ref, () => ({ open, close, }), [open, close], ); const handleChildrenClick = useCallback(() => { open(); }, [open]); const handleFieldKeyDown = useCallback( (event) => { if (event.key === 'Escape') { close(); } }, [close], ); const [handleFieldBlur, handleControlMouseOver, handleControlMouseOut] = useClosableForm( isOpened, close, ); const handleSubmit = useCallback(() => { const cleanData = { ...data, name: data.name.trim(), }; if (!cleanData.name) { nameField.current.select(); return; } onCreate(cleanData); setData(DEFAULT_DATA); selectNameField(); }, [onCreate, data, setData, selectNameField]); useEffect(() => { if (isOpened) { nameField.current.select(); } }, [isOpened]); useDidUpdate(() => { nameField.current.select(); }, [selectNameFieldState]); if (!isOpened) { return React.cloneElement(children, { onClick: handleChildrenClick, }); } return (
); }); AddList.propTypes = { children: PropTypes.element.isRequired, onCreate: PropTypes.func.isRequired, }; export default React.memo(AddList);