React hooks for resumable file uploads using tus.
- 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.
Try out the use-tus demo.
Install the package using your package manager of choice.
npm install use-tus tus-js-client
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>
);
};
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.
-
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
setUpload
function.
- 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.
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)
}
});
-
upload
(type:tus.Upload | undefined
)- Used for resumable file uploads. Undefined unless
setUpload
is 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
.uploadOptions
properties are overwritten ifoptions
is 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.
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
useTusStore
requires TusClientProvider
as a parent or higher element.
-
cacheKey
(type:string
)- Key associated with the
Upload
object created bysetUpload
.
- Key associated with the
-
autoAbort
(type:boolean | undefined
, default:true
)- Automatically abort uploads when
useTusStore
is unmounted.
- Automatically abort uploads when
-
autoStart
(type:boolean | undefined
, default:false
)- Automatically start the upload after calling the
setUpload
function.
- 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
Upload
class with this hook.
- Specify a customized
-
upload
(type:tus.Upload | undefined
)- Used for resumable file uploads. Undefined unless
setUpload
is called. - Corresponds to the
Upload
associated withcacheKey
inTusClientProvider
.
- Used for resumable file uploads. Undefined unless
-
setUpload
(type:(file: tus.Upload['file'], options?: TusHooksUploadFnOptions) => void
)- Function to create an
Upload
.uploadOptions
properties are overwritten ifoptions
is 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
Upload
associated withcacheKey
.
- Function to delete the
() => (
<TusClientProvider defaultOptions={defaultOptions}>
{children}
</TusClientProvider>
)
TusClientProvider
stores Upload
objects created with useTusStore
.
defaultOptions
(type:(file: tus.Upload['file']) => TusHooksUploadFnOptions | undefined
)- Default options object used when creating new uploads. For more details, see here.
const { state, removeUpload, reset } = useTusClient();
useTusClient
retrieves and resets the state of TusClientProvider
.
-
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
Here are some examples of how to use use-tus
.
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 autoStart
to automatically start uploading files after setUpload
is 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} />
);
};
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>
);
};
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 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();
};