/* eslint-disable @typescript-eslint/no-misused-promises */ import React, { type DragEvent, useState } from 'react' import styles from './styles.module.css' import { Button, Column, LoadingButton, Text } from '../../../../atoms' import { getGlobalStyle } from '../../../../../helpers' interface IImageUploaderProps { error: string formattedList: string inputRef: React.RefObject loading: boolean preview: string onFileChange: (e: React.ChangeEvent) => Promise handleRemoveImage: () => void handleDrop: (event: React.DragEvent) => Promise } /** * ImageUploader component for selecting and previewing an image file * @param {IImageUploaderProps} props * @returns {JSX.Element} */ export const ImageUploader: React.FC = ({ inputRef, onFileChange, handleDrop, handleRemoveImage, preview = '', loading = false, formattedList = '', error }) => { const showPreviewImage = Boolean(preview) const [dragIn, setDragIn] = useState(false) const handleDrag = (e: DragEvent): void => { e.preventDefault() e.stopPropagation() setDragIn(e.type !== 'dragleave' && e.type !== 'drop') } return (
Imagen del producto Se mostrará en el producto actual
Aparece en el listado y en los detalles del producto.
{ e.preventDefault() e.stopPropagation() await handleDrop(e) }} className={styles.dropArea} onClick={() => inputRef.current?.click()} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault() inputRef.current?.click() } }} style={{ borderColor: dragIn ? getGlobalStyle('--color-neutral-gray-silver') : getGlobalStyle('--color-neutral-gray') }} > {showPreviewImage ? (
Preview
) : (
placeholder
)} {showPreviewImage ? : } await onFileChange(e)} /> {loading && (
Cargando...
)}
Formatos: {formattedList} Peso máximo: 20 MB Resolución mínima: 300x275 {Boolean(error !== '') && {error} }
) }