diff --git a/components/Form/FileInput.tsx b/components/Form/FileInput.tsx index 7a79146..89eeba3 100644 --- a/components/Form/FileInput.tsx +++ b/components/Form/FileInput.tsx @@ -1,43 +1,81 @@ -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" +import { faFile } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { useField, useFormikContext } from "formik"; +import React, { useRef, useState } from "react"; +import ErrorMessage from "./ErrorMessage"; +import RequiredAsterisk from "./RequiredAsterisk"; interface FileInputProps { - label: string - required?: boolean - name: string + label: string; + required?: boolean; + name: string; } const FileInput: React.FC = ({ label, ...props }) => { - const { required } = props - const [field, meta] = useField(props) - const { setFieldValue } = useFormikContext() - const fileInputRef = useRef(null) + const { required } = props; + const [field, meta] = useField(props); + const { setFieldValue } = useFormikContext(); + const fileInputRef = useRef(null); + const [dragging, setDragging] = useState(false); // State to handle drag styling + const [fileInfo, setFileInfo] = useState<{ name: string; size: number } | null>(null); // State to store file info + const [uploadProgress, setUploadProgress] = useState(0); + + const simulateUpload = () => { + let progress = 0; + const interval = setInterval(() => { + progress += 10; + setUploadProgress(progress); + if (progress >= 100) { + clearInterval(interval); + } + }, 20); // Adjust time interval to control speed of the animation + }; const handleChange = (event: React.ChangeEvent) => { - const { files } = event.target - const file = files ? files[0] : null - setFieldValue(props.name, file) // Directly use setFieldValue to update Formik's state - } + const { files } = event.target; + const file = files ? files[0] : null; + setFieldValue(props.name, file); // Update Formik's state + if (file) { + setFileInfo({ name: file.name, size: file.size }); + setUploadProgress(0); // Reset progress + simulateUpload(); // Simulate upload process + } + }; const handleClick = () => { if (fileInputRef.current) { - fileInputRef.current.click() + fileInputRef.current.click(); } - } + }; const handleDrop = (event: React.DragEvent) => { - event.preventDefault() - event.stopPropagation() - const files = event.dataTransfer.files + event.preventDefault(); + event.stopPropagation(); + setDragging(false); // Reset drag state + const files = event.dataTransfer.files; if (files && files.length > 0) { - const file = files[0] - setFieldValue(props.name, file) + const file = files[0]; + if (file) { + setFileInfo({ name: file.name, size: file.size }); + setFieldValue(props.name, file); + } + setUploadProgress(0); // Reset progress + simulateUpload(); // Simulate upload process } - } +}; + + + const handleDragOver = (event: React.DragEvent) => { + event.preventDefault(); + if (!dragging) { + setDragging(true); + } + }; + + const handleDragLeave = (event: React.DragEvent) => { + event.preventDefault(); + setDragging(false); + }; return (
@@ -45,17 +83,37 @@ const FileInput: React.FC = ({ label, ...props }) => { {label} -
e.preventDefault()}> +
-

Drag & Drop Here or Browse

+

Drag & Drop Here or Browse

+ {fileInfo && ( +
+ +
+
+

{fileInfo.name}

+

{Math.round(fileInfo.size / 1024)} KB

+
+
+
+
+
+
+ )}
- ) -} + ); +}; -export default FileInput +export default FileInput; diff --git a/components/Form/index.tsx b/components/Form/index.tsx index e4b5397..ac41a0a 100644 --- a/components/Form/index.tsx +++ b/components/Form/index.tsx @@ -69,7 +69,7 @@ const FormComponent: React.FC = () => { ))} - {/* */} + Tolerance Window: