import { Modal, Box, Button, ModalHeader, ModalTitle, ModalClose, ModalContent, ModalFooter, ModalFooterControllers, } from '@rocket.chat/fuselage'; import { TextInput, TextAreaInput, Field, FieldError, FieldRow, FieldLabel, FieldGroup, FieldDescription, } from '@rocket.chat/fuselage-forms'; import type { ComponentProps } from 'react'; import { memo, useCallback, useId } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import FilePreview from './FilePreview'; import { getMimeTypeFromFileName } from '../../../../../app/utils/lib/mimeTypes'; import { fileUploadIsValidContentType } from '../../../../lib/utils/restrictions'; export type FileUploadModalProps = { onClose: () => void; onSubmit: (name: string, altText?: string) => void; file: File; fileName: string; fileAltText?: string; }; const FileUploadModal = ({ onClose, file, fileName, fileAltText = '', onSubmit }: FileUploadModalProps) => { const { t } = useTranslation(); const fileUploadFormId = useId(); const isImage = file.type.startsWith('image/'); const { control, handleSubmit, formState: { errors, isDirty, isSubmitting }, } = useForm({ mode: 'onBlur', defaultValues: { name: fileName, altText: fileAltText } }); const validateFileName = useCallback( (fieldValue: string) => { const type = getMimeTypeFromFileName(fieldValue); if (fileUploadIsValidContentType(type)) { return undefined; } return t('FileUpload_MediaType_NotAccepted__type__', { type }); }, [t], ); return ( ) => ( onSubmit(name, altText?.trim()))} {...props} /> )} > {t('FileUpload')} {t('Upload_file_name')} } /> {errors.name && {errors.name.message}} {isImage && ( {t('Alternative_text')} {t('Alt_text_description')} } /> )} ); }; export default memo(FileUploadModal);