next-enterprise/components/Form/FileInput.tsx

62 lines
1.9 KiB
TypeScript
Raw Normal View History

2024-03-03 22:34:43 -05:00
import { faFile } from "@fortawesome/free-solid-svg-icons"
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
import { useField, useFormikContext } from "formik"
import React, { useRef } from "react"
import ErrorMessage from "./ErrorMessage"
import RequiredAsterisk from "./RequiredAsterisk"
2024-03-03 22:09:33 -05:00
interface FileInputProps {
2024-03-03 22:34:43 -05:00
label: string
required?: boolean
name: string
2024-03-03 22:09:33 -05:00
}
2024-03-03 22:34:43 -05:00
const FileInput: React.FC<FileInputProps> = ({ label, ...props }) => {
const { required } = props
const [field, meta] = useField(props)
const { setFieldValue } = useFormikContext()
const fileInputRef = useRef<HTMLInputElement>(null)
2024-03-03 22:09:33 -05:00
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
2024-03-03 22:34:43 -05:00
const { files } = event.target
const file = files ? files[0] : null
setFieldValue(props.name, file) // Directly use setFieldValue to update Formik's state
}
2024-03-03 22:09:33 -05:00
const handleClick = () => {
if (fileInputRef.current) {
2024-03-03 22:34:43 -05:00
fileInputRef.current.click()
2024-03-03 22:09:33 -05:00
}
2024-03-03 22:34:43 -05:00
}
2024-03-03 22:09:33 -05:00
const handleDrop = (event: React.DragEvent<HTMLDivElement>) => {
2024-03-03 22:34:43 -05:00
event.preventDefault()
event.stopPropagation()
const files = event.dataTransfer.files
2024-03-03 22:09:33 -05:00
if (files && files.length > 0) {
2024-03-03 22:34:43 -05:00
const file = files[0]
setFieldValue(props.name, file)
2024-03-03 22:09:33 -05:00
}
2024-03-03 22:34:43 -05:00
}
2024-03-03 22:09:33 -05:00
return (
<div className="mb-4">
<label className="text-md" htmlFor={props.name}>
{label}
<RequiredAsterisk required={required} />
</label>
<div className="drop-area" onClick={handleClick} onDrop={handleDrop} onDragOver={(e) => e.preventDefault()}>
<div>
<FontAwesomeIcon icon={faFile} />
<h4>Drag & Drop Here or Browse</h4>
</div>
<button type="button">Upload Manifest</button>
</div>
2024-03-03 22:34:43 -05:00
<input type="file" className="hidden" ref={fileInputRef} onChange={handleChange} />
2024-03-03 22:09:33 -05:00
<ErrorMessage touched={meta.touched} error={meta.error} />
</div>
2024-03-03 22:34:43 -05:00
)
}
2024-03-03 22:09:33 -05:00
2024-03-03 22:34:43 -05:00
export default FileInput