import { Tooltip } from '@components/common/form/Tooltip.js'; import { getNestedError } from '@components/common/form/utils/getNestedError.js'; import { Field, FieldError, FieldLabel } from '@components/common/ui/Field.js'; import { InputGroupInput } from '@components/common/ui/InputGroup.js'; import { _ } from '@evershop/evershop/lib/locale/translate/_'; import React from 'react'; import { useFormContext, RegisterOptions, FieldPath, FieldValues, Controller } from 'react-hook-form'; interface FileFieldProps extends Omit, 'name' | 'type'> { name: FieldPath; label?: string; error?: string; helperText?: string; required?: boolean; validation?: RegisterOptions; maxSize?: number; wrapperClassName?: string; } export function FileField({ name, label, error, wrapperClassName, helperText, required, validation, maxSize, className, accept, multiple = false, ...props }: FileFieldProps) { const { control, formState: { errors }, watch } = useFormContext(); const fieldError = getNestedError(name, errors, error); const fieldId = `field-${name}`; const files = watch(name); const formatFileSize = (bytes: number) => { if (bytes === 0) return '0 Bytes'; const k = 1024; const sizes = ['Bytes', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; }; const { valueAsNumber, valueAsDate, ...cleanValidation } = validation || {}; const validationRules = { ...cleanValidation, ...(required && !validation?.required && { required: _('${field} is required', { field: label || name }) }), validate: { ...validation?.validate, fileSize: (fileList) => { if (!maxSize || !fileList || fileList.length === 0) return true; for (let i = 0; i < fileList.length; i++) { if (fileList[i].size > maxSize) { return _('File size must be less than ${maxSize}', { maxSize: formatFileSize(maxSize) }); } } return true; } } }; return ( {label && ( <> {label} {required && *} {helperText && } )} ( { onChange(e.target.files); }} {...props} /> )} /> {maxSize && (

Maximum file size: {formatFileSize(maxSize)}

)} {files && files.length > 0 && (

Selected files:

    {Array.from(files as FileList).map((file: File, index) => (
  • {file.name} ({formatFileSize(file.size)})
  • ))}
)} {fieldError && {fieldError}}
); }