Components
Hooks
Utils
File Upload
Overview
The HeadlessFileUpload
component is a versatile File Upload component for React applications. It allows for File Uploading and Provides Custom Implemnetation Possiblilties.
Installation
To install the HeadlessFileUpload
component, use npm or yarn:
npm install @locoworks/reusejs-react-file-upload
# or
yarn add @locoworks/reusejs-react-file-upload
External Dependencies
There is no External Dependencies.
Importing
Import the HeadlessFileUpload
component into your React application as follows:
import { HeadlessFileUpload } from "@locoworks/reusejs-react-file-upload";
Import the ReuseFileUpload
component into your React application as follows:
import { ReuseFileUpload } from "@locoworks/reusejs-react-file-upload";
Types/ Exported Components
The component exports the following components:
HeadlessFileUpload
: The Base component to create a File UploaderReuseFileUpload
: A customized file Uploader which provides you with many custom option to create the file uploader.
Props
The HeadlessFileUpload
component accepts the following props:
acceptedFileTypes
: Accepted File Type.allowsMultiple
: File Uploader allows multiple file upload or not.handleAfterFileUploadHook
: Function to ran as a callback or after the file is loaded. This function will be Recieve with all the loaded files as a prop.children
: Child component.- `className: CSS Classes for the input.
The ReuseFileUpload
component accepts the following props:
All the Props of the HeadlessFileUpload
can be passed to the ReuseFileUpload
.
baseClassName
: CSS classes for the base input.wrapperClassName
: CSS classes for the Wrapper div.showChildren
: Whether to Show the Children or Not.handleBeforeFileUploadHook
: Async Function to run before upload of files.handleAfterFileUploadHook
: Async Function to run after the upload of files. This function will be Recieve with all the loaded files as a prop.children
: Child Components.loaderStyles
: CSS Styles for the loader.customLoader
: Custom Loader.fileSize
: Size of the file to be uploaded.setCustomError
: Error object.enableDragAndDrop
: If you want to Enable the DragAndDrop import of files.dragAndDropRef
: Pass this Input Ref to Enable the Drop and Drop for Bigger Section.setIsDraggedOver
: Pass this Prop Function to Control what Happen When the file Is Dragged Over and Dragged Outside.
Usage/Examples
HeadlessFileUpload
import React from "react";
import { HeadLessFileUpload } from "@locoworks/reusejs-react-file-upload";
const HeadlessFileUploadSample = () => {
return (
<div className="flex flex-col items-center gap-x-3 justify-center py-10 mt-10 border rounded bg-gray-50">
<HeadLessFileUpload />
</div>
);
};
export default HeadlessFileUploadSample;
ReuseFileUpload
import React from "react";
import { ReuseFileUpload } from "@locoworks/reusejs-react-file-upload";
import { useRef } from "react";
import { ReuseButton } from "@locoworks/reusejs-react-button";
const ReuseFileUploadSample = () => {
const ref = useRef<HTMLInputElement>(null);
return (
<div className="flex flex-col items-center gap-x-3 justify-center py-10 mt-10 border rounded bg-gray-50">
<ReuseFileUpload
ref={ref}
allowsMultiple
showChildren
handleAfterFileUploadHook={async (e: any) => {
console.log(e);
}}
>
<ReuseButton
className="border border-black px-2 py-1 cursor-pointer rounded-xl text-black"
onClick={() => {
console.log(ref.current);
ref.current?.click();
}}
>
Browse
</ReuseButton>
</ReuseFileUpload>
</div>
);
};
export default ReuseFileUploadSample;
BeforeAfterHookFileUpload
import React from "react";
import { ReuseFileUpload } from "@locoworks/reusejs-react-file-upload";
import { useRef } from "react";
import { ReuseButton } from "@locoworks/reusejs-react-button";
const BeforeAfterHookFileUpload = () => {
const ref = useRef<HTMLInputElement>(null);
return (
<div className="flex flex-col items-center gap-x-3 justify-center py-10 mt-10 border rounded bg-gray-50">
<ReuseFileUpload
ref={ref}
fileSize={39804}
handleBeforeFileUploadHook={async () => {
await new Promise<void>((resolve) => {
setTimeout(() => {
console.log("before function");
resolve();
}, 1);
});
}}
handleAfterFileUploadHook={async (e: any) => {
console.log(e, "this is the file type");
}}
baseClassName="hidden"
showChildren
>
<ReuseButton
className="border border-black px-2 py-1 cursor-pointer rounded-xl text-black"
onClick={() => {
console.log("hi this is the onclick of the component");
}}
>
Browse
</ReuseButton>
</ReuseFileUpload>
</div>
);
};
export default BeforeAfterHookFileUpload;
MultiFileReuseFileUpload
import React from "react";
import { ReuseFileUpload } from "@locoworks/reusejs-react-file-upload";
import { useRef } from "react";
import { ReuseButton } from "@locoworks/reusejs-react-button";
const MultiFileReuseFileUpload = () => {
const ref = useRef<HTMLInputElement>(null);
return (
<div className="flex flex-col items-center gap-x-3 justify-center py-10 mt-10 border rounded bg-gray-50">
<ReuseFileUpload
ref={ref}
allowsMultiple
baseClassName="hidden"
showChildren
>
<ReuseButton
className="border border-black px-2 py-1 cursor-pointer rounded-xl text-black"
onClick={() => {
alert("use mutliple files");
}}
>
Browse
</ReuseButton>
</ReuseFileUpload>
</div>
);
};
export default MultiFileReuseFileUpload;
AcceptFileUpload
import React from "react";
import { ReuseFileUpload } from "@locoworks/reusejs-react-file-upload";
import { useRef } from "react";
import { ReuseButton } from "@locoworks/reusejs-react-button";
const AcceptFileUpload = () => {
const ref = useRef<HTMLInputElement>(null);
return (
<div className="flex flex-col items-center gap-x-3 justify-center py-10 mt-10 border rounded bg-gray-50">
<ReuseFileUpload
ref={ref}
allowsMultiple
showChildren
acceptedFileTypes={["image/png", "image/svg"]}
>
<ReuseButton
className="border border-black px-2 py-1 cursor-pointer rounded-xl text-black"
onClick={() => {
console.log(ref.current);
ref.current?.click();
}}
>
Browse
</ReuseButton>
</ReuseFileUpload>
</div>
);
};
export default AcceptFileUpload;
DragAndDrop
import React, { useState } from "react";
import { ReuseFileUpload } from "@locoworks/reusejs-react-file-upload";
import { useRef } from "react";
import { ReuseButton } from "@locoworks/reusejs-react-button";
const DragAndDrop = () => {
const ref = useRef<HTMLInputElement>(null);
const dragAndDropRef = useRef<HTMLInputElement>(null);
const [isDraggedOver, setIsDraggedOver] = useState(false);
return (
<div className="flex flex-col items-center gap-x-3 justify-center py-10 mt-10 rounded bg-gray-50">
<div
ref={dragAndDropRef}
className="border border-red-300 rounded-md px-[200px] py-[100px]"
>
<ReuseFileUpload
ref={ref}
dragAndDropRef={dragAndDropRef}
allowsMultiple
fileSize={999999999}
showChildren
acceptedFileTypes={["image/png", "image/svg", "application/pdf"]}
enableDragAndDrop={true}
setIsDraggedOver={setIsDraggedOver}
handleAfterFileUploadHook={async (e) => {
console.log(e);
}}
>
<ReuseButton
className="border border-black px-2 py-1 cursor-pointer rounded-xl text-black"
onClick={() => {
ref.current?.click();
}}
>
{isDraggedOver ? "Drop Your File Here " : ""}
Browse
</ReuseButton>
</ReuseFileUpload>
</div>
</div>
);
};
export default DragAndDrop;
Styling
You can style the component using Tailwind CSS and CSS. Feel free to customize the component's appearance as per your project's requirements.
HeadlessFileUploadProps
Prop | Type | Default Value | Description |
---|---|---|---|
className | String | "" | Pass this prop to style the base input of headless component. |
ReuseFileUploadProps
Prop | Type | Default Value | Description |
---|---|---|---|
baseClassName | String | "" | styles the base input of headless component. |
wrapperClassName | String | "" | styles the Wrapper div of the ReuseFileUpload. |
loaderStyles | String | "" | styles the default loader. |