11"use client" ;
22
3- import { useState } from "react" ;
3+ import { useState , useTransition } from "react" ;
44
5- import { Future } from "uploadthing/client" ;
5+ import { AnyFile } from "uploadthing/client-future " ;
66
77import { future_createUpload , future_uploadFiles } from "../../lib/uploadthing" ;
88import { UploadRouter } from "../api/uploadthing/route" ;
99
1010function AsyncUploader ( ) {
11- const [ files , setFiles ] = useState <
12- Future . AnyFile < UploadRouter [ "anything" ] > [ ]
13- > ( [ ] ) ;
11+ const [ files , setFiles ] = useState < AnyFile < UploadRouter [ "anyPrivate" ] > [ ] > ( [ ] ) ;
1412
1513 return (
1614 < div className = "mx-auto max-w-2xl p-8" >
@@ -20,7 +18,7 @@ function AsyncUploader() {
2018 const files = formData . getAll ( "files" ) as File [ ] ;
2119 console . log ( "SUBMITTED" , files ) ;
2220
23- const result = await future_uploadFiles ( "anything " , {
21+ const result = await future_uploadFiles ( "anyPrivate " , {
2422 files,
2523 onEvent : ( event ) => {
2624 console . log ( "EVENT" , event ) ;
@@ -54,49 +52,52 @@ function AsyncUploader() {
5452}
5553
5654function ControlledUploader ( ) {
57- const [ files , setFiles ] = useState <
58- Future . AnyFile < UploadRouter [ "anything" ] > [ ]
59- > ( [ ] ) ;
55+ const [ files , setFiles ] = useState < AnyFile < UploadRouter [ "anyPrivate" ] > [ ] > ( [ ] ) ;
6056 const [ selectedFiles , setSelectedFiles ] = useState < File [ ] > ( [ ] ) ;
6157 const [ uploadControls , setUploadControls ] = useState < Awaited <
6258 ReturnType < typeof future_createUpload >
6359 > | null > ( null ) ;
6460 const [ isUploading , setIsUploading ] = useState ( false ) ;
61+ const [ isPending , startTransition ] = useTransition ( ) ;
6562
6663 const handleFileChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
6764 if ( e . target . files && e . target . files . length > 0 ) {
6865 setSelectedFiles ( Array . from ( e . target . files ) ) ;
6966 }
7067 } ;
7168
72- const handleSubmit = async ( e : React . FormEvent ) => {
69+ const handleSubmit = ( e : React . FormEvent ) => {
7370 e . preventDefault ( ) ;
7471 if ( selectedFiles . length === 0 ) return ;
7572
76- setIsUploading ( true ) ;
73+ startTransition ( async ( ) => {
74+ setIsUploading ( true ) ;
7775
78- // Create uploads for each file
79- const controls = await future_createUpload ( "anything " , {
80- files : selectedFiles ,
81- onEvent : ( event ) => {
82- console . log ( "EVENT" , event ) ;
83- setFiles ( [ ...event . files ] ) ;
84- } ,
85- input : { } ,
86- } ) ;
76+ // Create uploads for each file
77+ const controls = await future_createUpload ( "anyPrivate " , {
78+ files : selectedFiles ,
79+ onEvent : ( event ) => {
80+ console . log ( "EVENT" , event ) ;
81+ setFiles ( [ ...event . files ] ) ;
82+ } ,
83+ input : { } ,
84+ } ) ;
8785
88- setUploadControls ( controls ) ;
86+ setUploadControls ( controls ) ;
87+ } ) ;
8988 } ;
9089
91- const handleComplete = async ( ) => {
90+ const handleComplete = ( ) => {
9291 if ( uploadControls ?. done ) {
93- const result = await uploadControls . done ( ) ;
94- console . log ( "COMPLETE" , result ) ;
95- setIsUploading ( false ) ;
96- setSelectedFiles ( [ ] ) ;
97- setFiles ( [ ] ) ;
98- setUploadControls ( null ) ;
99- alert ( "Upload complete!" ) ;
92+ startTransition ( async ( ) => {
93+ const result = await uploadControls . done ( ) ;
94+ console . log ( "COMPLETE" , result ) ;
95+ setIsUploading ( false ) ;
96+ setSelectedFiles ( [ ] ) ;
97+ setFiles ( [ ] ) ;
98+ setUploadControls ( null ) ;
99+ alert ( "Upload complete!" ) ;
100+ } ) ;
100101 }
101102 } ;
102103
@@ -121,8 +122,9 @@ function ControlledUploader() {
121122 { isUploading && uploadControls && (
122123 < button
123124 type = "button"
124- className = "inline-flex rounded bg-green-500 px-4 py-2 text-black transition-colors hover:bg-green-600"
125+ className = "inline-flex rounded bg-green-500 px-4 py-2 text-black transition-colors hover:bg-green-600 disabled:opacity-50 "
125126 onClick = { handleComplete }
127+ disabled = { isPending }
126128 >
127129 Complete Upload
128130 </ button >
0 commit comments