({
initialValue,
name = 'file',
id,
className = {},
onChange,
size = 'medium',
viewOnly,
hoverIcon,
children,
enableHover = true,
alwaysShowHover,
fallbackImage = fallbackImages.avatar,
closeable,
fileSizeLimitMB = 2,
uploadButton = false,
}: ImageInputProps)
| 48 | }; |
| 49 | |
| 50 | function ImageInput({ |
| 51 | initialValue, |
| 52 | name = 'file', |
| 53 | id, |
| 54 | className = {}, |
| 55 | onChange, |
| 56 | size = 'medium', |
| 57 | viewOnly, |
| 58 | hoverIcon, |
| 59 | children, |
| 60 | enableHover = true, |
| 61 | alwaysShowHover, |
| 62 | fallbackImage = fallbackImages.avatar, |
| 63 | closeable, |
| 64 | fileSizeLimitMB = 2, |
| 65 | uploadButton = false, |
| 66 | }: ImageInputProps): ReactElement { |
| 67 | const inputRef = useRef<HTMLInputElement>(); |
| 68 | const [image, setImage] = useState(initialValue || fallbackImage); |
| 69 | const onClick = () => { |
| 70 | inputRef.current.click(); |
| 71 | }; |
| 72 | |
| 73 | const { onFileChange: handleFile } = useFileInput({ |
| 74 | acceptedTypes: acceptedTypesList, |
| 75 | limitMb: fileSizeLimitMB, |
| 76 | onChange(base64, file) { |
| 77 | if (!base64) { |
| 78 | return onChange?.(null); |
| 79 | } |
| 80 | |
| 81 | setImage(base64); |
| 82 | return onChange?.(base64, file); |
| 83 | }, |
| 84 | }); |
| 85 | |
| 86 | const onFileChange = (event: ChangeEvent) => { |
| 87 | const input = event.target as HTMLInputElement; |
| 88 | const file = input.files?.[0]; |
| 89 | handleFile(file); |
| 90 | }; |
| 91 | |
| 92 | const onDragOver = (event: DragEvent<HTMLButtonElement>) => { |
| 93 | event.preventDefault(); |
| 94 | }; |
| 95 | |
| 96 | const onDrop = (event: DragEvent<HTMLButtonElement>) => { |
| 97 | event.preventDefault(); |
| 98 | event.stopPropagation(); |
| 99 | const file = event.dataTransfer.files?.[0]; |
| 100 | handleFile(file); |
| 101 | }; |
| 102 | |
| 103 | const onClose = () => { |
| 104 | setImage(null); |
| 105 | onChange?.(null, null); |
| 106 | inputRef.current.value = ''; |
| 107 | }; |
nothing calls this directly
no test coverage detected