import React, { useCallback, useEffect, useImperativeHandle, useRef, useState, } from 'react'; import PropTypes from 'prop-types'; import { useTranslation } from 'react-i18next'; import TextareaAutosize from 'react-textarea-autosize'; import { Button, Form, TextArea } from 'semantic-ui-react'; import { useClosableForm, useField } from '../../../hooks'; import styles from './EditName.module.css'; const EditName = React.forwardRef(({ children, defaultValue, onUpdate }, ref) => { const [t] = useTranslation(); const [isOpened, setIsOpened] = useState(false); const [value, handleFieldChange, setValue] = useField(null); const field = useRef(null); const open = useCallback(() => { setIsOpened(true); setValue(defaultValue); }, [defaultValue, setValue]); const close = useCallback(() => { setIsOpened(false); setValue(null); }, [setValue]); const submit = useCallback(() => { const cleanValue = value.trim(); if (!cleanValue) { field.current.ref.current.select(); return; } if (cleanValue !== defaultValue) { onUpdate(cleanValue); } close(); }, [defaultValue, onUpdate, value, close]); useImperativeHandle( ref, () => ({ open, close, }), [open, close], ); const handleFieldKeyDown = useCallback( (event) => { if (event.key === 'Enter') { event.preventDefault(); submit(); } }, [submit], ); const [handleFieldBlur, handleControlMouseOver, handleControlMouseOut] = useClosableForm( isOpened, close, ); const handleSubmit = useCallback(() => { submit(); }, [submit]); useEffect(() => { if (isOpened) { field.current.ref.current.select(); } }, [isOpened]); if (!isOpened) { return children; } return (
); }); EditName.propTypes = { children: PropTypes.element.isRequired, defaultValue: PropTypes.string.isRequired, onUpdate: PropTypes.func.isRequired, }; export default React.memo(EditName);