use-tus
v0.8.3
Published
React hooks for resumable file uploads using tus-js-client
Maintainers
Readme
Features
- Resumable file uploads in React.
- Improved file upload management within the React component lifecycle.
- Lightweight and simple interface hooks.
- Manage Upload instances via context.
- TypeScript support.
Demo
Try out the use-tus demo.
Installation
Install the package using your package manager of choice.
npm install use-tus tus-js-clientUsage
Below is an example of how to use useTus.
import { useTus } from 'use-tus'
const Uploader = () => {
const { upload, setUpload, isSuccess, error, remove } = useTus();
const handleSetUpload = useCallback((event: ChangeEvent<HTMLInputElement>) => {
const file = event.target.files.item(0);
if (!file) return;
setUpload(file, {
endpoint: 'https://tusd.tusdemo.net/files/',
metadata: {
filename: file.name,
filetype: file.type,
},
});
}, [setUpload]);
const handleStart = useCallback(() => {
if (upload) upload.start();
}, [upload]);
return (
<div>
<input type="file" onChange={handleSetUpload} />
<button type="button" onClick={handleStart}>Upload</button>
</div>
);
};API
useTus hooks
const { upload, setUpload, isSuccess, isAborted, isUploading, error, remove } = useTus({ autoAbort, autoStart, uploadOptions, Upload });useTus is a hooks that creates an object to perform Resumable file upload.
Arguments
autoAbort(type:boolean | undefined) (default: true)- Whether or not to automatically abort uploads when useTus hooks is unmounted.
autoStart(type:boolean | undefined) (default: false)- Whether or not to start upload the file after
setUploadfunction.
- Whether or not to start upload the file after
uploadOptions(type:TusHooksUploadFnOptions | undefined) (default: undefined)- Option to used by upload object that generated by that hooks.
Upload(type:Upload | undefined) (default: undefined)- Option to specify customized own Upload class with this hooks.
uploadOptions
This option extends the UploadOptions provided by tus-js-client, allowing every callback to receive the upload instance as the final argument. For detailed type information on UploadOptions, see here.
Example:
setUpload(file, {
onSuccess: (upload) => {
console.log(upload.url)
},
onError: (error, upload) => {
console.log(error)
setTimeout(() => {
upload.start()
}, 1000)
}
});Returns
upload(type:tus.Upload | undefined)- Used for resumable file uploads. Undefined unless
setUploadis called. - For detailed usage, see here.
- Used for resumable file uploads. Undefined unless
setUpload(type:(file: tus.Upload['file'], options?: TusHooksUploadFnOptions) => void)- Function to create an
Upload.uploadOptionsproperties are overwritten ifoptionsis specified.
- Function to create an
isSuccess(type:boolean)- Indicates if the upload was successful.
isAborted(type:boolean)- Indicates if the upload was aborted.
isUploading(type:boolean)- Indicates if an upload is in progress.
error(type:Error | undefined)- Error when the upload fails.
remove(type:() => void)- Function to reset states.
useTusStore hooks
const { upload, setUpload, isSuccess, isAborted, isUploading, error, remove } = useTusStore(cacheKey, { autoAbort, autoStart, uploadOptions, Upload });useTusStore creates an object for resumable file uploads and stores it in a context. This is useful for handling uploads across components or pages.
[!NOTE]
useTusStorerequiresTusClientProvideras a parent or higher element.
Arguments
cacheKey(type:string)- Key associated with the
Uploadobject created bysetUpload.
- Key associated with the
autoAbort(type:boolean | undefined, default:true)- Automatically abort uploads when
useTusStoreis unmounted.
- Automatically abort uploads when
autoStart(type:boolean | undefined, default:false)- Automatically start the upload after calling the
setUploadfunction.
- Automatically start the upload after calling the
uploadOptions(type:TusHooksUploadFnOptions | undefined, default:undefined)- Set options to be used by the upload object generated by this hook.
Upload(type:Upload | undefined, default:undefined)- Specify a customized
Uploadclass with this hook.
- Specify a customized
Returns
upload(type:tus.Upload | undefined)- Used for resumable file uploads. Undefined unless
setUploadis called. - Corresponds to the
Uploadassociated withcacheKeyinTusClientProvider.
- Used for resumable file uploads. Undefined unless
setUpload(type:(file: tus.Upload['file'], options?: TusHooksUploadFnOptions) => void)- Function to create an
Upload.uploadOptionsproperties are overwritten ifoptionsis specified.
- Function to create an
isSuccess(type:boolean)- Indicates if the upload was successful.
isAborted(type:boolean)- Indicates if the upload was aborted.
isUploading(type:boolean)- Indicates if an upload is in progress.
error(type:Error | undefined)- Error when the upload fails.
remove(type:() => void)- Function to delete the
Uploadassociated withcacheKey.
- Function to delete the
TusClientProvider
() => (
<TusClientProvider defaultOptions={defaultOptions}>
{children}
</TusClientProvider>
)TusClientProvider stores Upload objects created with useTusStore.
Props
defaultOptions(type:(file: tus.Upload['file']) => TusHooksUploadFnOptions | undefined)- Default options object used when creating new uploads. For more details, see here.
useTusClient
const { state, removeUpload, reset } = useTusClient();useTusClient retrieves and resets the state of TusClientProvider.
Returns
state(type:{ [cacheKey: string]: UploadState | undefined })- Upload information associated with
cacheKey.
- Upload information associated with
removeUpload(type:(cacheKey: string) => void)- Remove the upload instance associated with
cacheKey.
- Remove the upload instance associated with
reset(type:() => void)- Initialize the value of
TusClientProvider.
- Initialize the value of
Examples
Here are some examples of how to use use-tus.
Uploading a file
Use setUpload and upload.start functions to perform resumable file uploads.
import { useTus } from 'use-tus'
const Uploader = () => {
const { upload, setUpload } = useTus();
const handleSetUpload = useCallback((event: ChangeEvent<HTMLInputElement>) => {
const file = event.target.files.item(0);
if (!file) return;
setUpload(file, {
endpoint: 'https://tusd.tusdemo.net/files/',
metadata: {
filename: file.name,
filetype: file.type,
},
});
}, [setUpload]);
const handleStart = useCallback(() => {
if (upload) upload.start();
}, [upload]);
return (
<div>
<input type="file" onChange={handleSetUpload} />
<button type="button" onClick={handleStart}>Upload</button>
</div>
);
};[!TIP] You can also set
autoStartto automatically start uploading files aftersetUploadis called.
import { useTus } from 'use-tus'
const Uploader = () => {
const { upload, setUpload } = useTus({ autoStart: true });
const handleSetUpload = useCallback((event: ChangeEvent<HTMLInputElement>) => {
const file = event.target.files.item(0);
if (!file) return;
setUpload(file, {
endpoint: 'https://tusd.tusdemo.net/files/',
metadata: {
filename: file.name,
filetype: file.type,
},
});
}, [setUpload]);
return (
<input type="file" onChange={handleSetUpload} />
);
};Aborting a File Upload
Use the upload.abort function to abort an upload.
import { useTus } from 'use-tus'
const Aborter = () => {
const { upload } = useTus();
const handleAbort = useCallback(() => {
if (upload) upload.abort();
}, [upload]);
return (
<div>
<button type="button" onClick={handleAbort}>Abort</button>
</div>
);
};Default Options for Upload
Specify default options in defaultOptions props of the TusClientProvider.
import { useTusStore, DefaultOptions, TusClientProvider } from 'use-tus'
const defaultOptions: DefaultOptions = (file) => ({
endpoint: 'https://tusd.tusdemo.net/files/',
metadata:
file instanceof File
? {
filename: file.name,
filetype: file.type,
}
: undefined,
});
const App = () => (
<TusClientProvider defaultOptions={defaultOptions}>
<Uploader />
</TusClientProvider>
);
const Uploader = () => {
const { setUpload } = useTusStore('cacheKey', { autoStart: true });
const handleSetUpload = useCallback((event: ChangeEvent<HTMLInputElement>) => {
const file = event.target.files.item(0);
if (!file) return;
// Uploads the selected file using default options.
// Overrides if options are provided to setUpload.
setUpload(file);
}, [setUpload]);
return <input type="file" onChange={handleSetUpload} />;
};Specify Upload Key
Specify cacheKey to associate uploads across components/pages.
import { useTusStore } from 'use-tus'
const SelectFileComponent = (file: File) => {
const { setUpload } = useTusStore('upload-thumbnail');
setUpload(file);
};
const UploadFileComponent = () => {
const { upload } = useTusStore('upload-thumbnail');
if (upload) upload.start();
};