import type { ChangeEvent } from 'react'; import { useCallback, useRef, useState } from 'react'; import { useRect } from '@growi/ui/dist/utils'; import { useTranslation } from 'next-i18next'; import type { AutosizeInputProps } from 'react-input-autosize'; import { debounce } from 'throttle-debounce'; import type { InputValidationResult } from '~/client/util/use-input-validator'; import { ValidationTarget, useInputValidator } from '~/client/util/use-input-validator'; import { AutosizeSubmittableInput, getAdjustedMaxWidthForAutosizeInput } from '../Common/SubmittableInput'; import type { SubmittableInputProps } from '../Common/SubmittableInput/types'; type Props = Pick, 'value' | 'onSubmit' | 'onCancel'>; export const BookmarkFolderNameInput = (props: Props): JSX.Element => { const { t } = useTranslation(); const { value, onSubmit, onCancel } = props; const parentRef = useRef(null); const [parentRect] = useRect(parentRef); const [validationResult, setValidationResult] = useState(); const inputValidator = useInputValidator(ValidationTarget.FOLDER); const changeHandler = useCallback(async(e: ChangeEvent) => { const validationResult = inputValidator(e.target.value); setValidationResult(validationResult ?? undefined); }, [inputValidator]); const changeHandlerDebounced = debounce(300, changeHandler); const cancelHandler = useCallback(() => { setValidationResult(undefined); onCancel?.(); }, [onCancel]); const isInvalid = validationResult != null; const maxWidth = parentRect != null ? getAdjustedMaxWidthForAutosizeInput(parentRect.width, 'md', validationResult != null ? false : undefined) : undefined; return (
{ isInvalid && (
{validationResult.message}
) }
); };