import { FC, useCallback, useState } from 'react'; import { FormikProvider } from 'formik'; import { observer } from 'mobx-react-lite'; import { Filler } from '~/components/containers/Filler'; import { Button } from '~/components/input/Button'; import { ERROR_LITERAL } from '~/constants/errors'; import { EMPTY_COMMENT } from '~/constants/node'; import { useCommentFormFormik } from '~/hooks/comments/useCommentFormFormik'; import { useInputPasteUpload } from '~/hooks/dom/useInputPasteUpload'; import { IComment } from '~/types'; import { useUploaderContext } from '~/utils/context/UploaderContextProvider'; import { CommentFormAttachButtons } from './components/CommentFormAttachButtons'; import { CommentFormAttaches } from './components/CommentFormAttaches'; import { CommentFormFormatButtons } from './components/CommentFormFormatButtons'; import { CommentFormTextarea } from './components/CommentFormTextarea'; import styles from './styles.module.scss'; interface IProps { comment?: IComment; allowUploads?: boolean; saveComment: (data: IComment) => Promise; onCancelEdit?: () => void; } const CommentForm: FC = observer( ({ comment, allowUploads, saveComment, onCancelEdit }) => { const [textarea, setTextArea] = useState(null); const uploader = useUploaderContext(); const formik = useCommentFormFormik( comment || EMPTY_COMMENT, uploader.files, uploader.setFiles, saveComment, onCancelEdit, ); const isLoading = formik.isSubmitting || uploader.isUploading; const isEditing = !!comment?.id; const clearError = useCallback(() => { if (formik.status) { formik.setStatus(''); } if (formik.errors.text) { formik.setErrors({ ...formik.errors, text: '', }); } }, [formik]); const error = formik.status || formik.errors.text; const onPaste = useInputPasteUpload(uploader.uploadFiles); return (
{!!error && (
{ERROR_LITERAL[error] || error}
)}
{allowUploads && }
{allowUploads && (
)}
{!!textarea && ( )}
{isEditing && ( )}
); }, ); export { CommentForm };