import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Path } from 'react-hook-form'; import { UnpackNestedValue, UseFormSetValue } from 'react-hook-form/dist/types/form'; import { FieldPathValue } from 'react-hook-form/dist/types/path'; import { FieldValues } from 'react-hook-form/dist/types/fields'; import { FormInput } from '../form/form-input'; import { FormComponent } from '../../models/form-component'; import { AbstractFormItemProps } from './abstract-form-item'; export interface FileType { id?: number, attachment_name?: string, attachment_url?: string } interface FormFileUploadProps extends FormComponent, AbstractFormItemProps { setValue: UseFormSetValue, defaultFile?: FileType, accept?: string, onFileChange?: (value: FileType) => void, onFileRemove?: () => void, } /** * This component allows to upload file, in forms managed by react-hook-form. */ export const FormFileUpload = ({ id, register, defaultFile, className, rules, disabled, error, warning, formState, onFileChange, onFileRemove, accept, setValue }: FormFileUploadProps) => { const { t } = useTranslation('shared'); const [file, setFile] = useState(defaultFile); /** * Check if file is selected */ const hasFile = (): boolean => { return !!file?.attachment_name; }; /** * Callback triggered when the user has ended its selection of a file (or when the selection has been cancelled). */ function onFileSelected (event: React.ChangeEvent) { const f = event.target?.files[0]; if (f) { setFile({ attachment_name: f.name }); setValue( `${id}[_destroy]` as Path, false as UnpackNestedValue>> ); if (typeof onFileChange === 'function') { onFileChange({ attachment_name: f.name }); } } } /** * Callback triggered when the user clicks on the delete button. */ function onRemoveFile () { if (file?.id) { setValue( `${id}[_destroy]` as Path, true as UnpackNestedValue>> ); } setValue( `${id}[attachment_files]` as Path, null as UnpackNestedValue>> ); setFile(null); if (typeof onFileRemove === 'function') { onFileRemove(); } } // Compose classnames from props const classNames = [ `${className || ''}` ].join(' '); return (
{hasFile() && (
{file.attachment_name}
)} {file?.id && file?.attachment_url && ( )}
{!hasFile() && ( {t('app.shared.form_file_upload.browse')} )} {hasFile() && ( {t('app.shared.form_file_upload.edit')} )} {hasFile() && ( )}
); };