1
0
Fork 0
mirror of https://github.com/plankanban/planka.git synced 2025-07-20 13:49:43 +02:00
planka/client/src/components/CardModal/NameField.jsx

69 lines
1.6 KiB
React
Raw Normal View History

2019-08-31 04:07:25 +05:00
import React, { useCallback, useRef } from 'react';
import PropTypes from 'prop-types';
import TextareaAutosize from 'react-textarea-autosize';
import { TextArea } from 'semantic-ui-react';
import { useDidUpdate, usePrevious } from '../../lib/hooks';
2019-08-31 04:07:25 +05:00
import { useField } from '../../hooks';
2019-08-31 04:07:25 +05:00
import styles from './NameField.module.scss';
2019-08-31 04:07:25 +05:00
const NameField = React.memo(({ defaultValue, onUpdate }) => {
const prevDefaultValue = usePrevious(defaultValue);
const [value, handleChange, setValue] = useField(defaultValue);
const isFocused = useRef(false);
const handleFocus = useCallback(() => {
isFocused.current = true;
}, []);
2020-03-25 00:15:47 +05:00
const handleKeyDown = useCallback((event) => {
2019-08-31 04:07:25 +05:00
if (event.key === 'Enter') {
event.preventDefault();
event.target.blur();
}
}, []);
const handleBlur = useCallback(() => {
isFocused.current = false;
const cleanValue = value.trim();
if (cleanValue) {
if (cleanValue !== defaultValue) {
onUpdate(cleanValue);
}
} else {
setValue(defaultValue);
}
}, [defaultValue, onUpdate, value, setValue]);
useDidUpdate(() => {
if (!isFocused.current && defaultValue !== prevDefaultValue) {
setValue(defaultValue);
}
}, [defaultValue, prevDefaultValue, setValue]);
return (
<TextArea
as={TextareaAutosize}
value={value}
spellCheck={false}
className={styles.field}
onFocus={handleFocus}
onKeyDown={handleKeyDown}
onChange={handleChange}
onBlur={handleBlur}
/>
);
});
NameField.propTypes = {
defaultValue: PropTypes.string.isRequired,
onUpdate: PropTypes.func.isRequired,
};
export default NameField;