1
- import React , { useState } from "react" ;
1
+ import React , { useEffect , useState } from "react" ;
2
2
import UploadIcon from "../../assets/svgs/form/upload-icon.svg" ;
3
3
import SuccessIcon from "../../assets/svgs/status-icons/success.svg" ;
4
4
import ErrorIcon from "../../assets/svgs/status-icons/error.svg" ;
@@ -25,6 +25,10 @@ interface FileUploaderProps {
25
25
/** Whether the drop target is disabled. If true, the drop target will not accept any drops. */
26
26
isDisabled ?: boolean ;
27
27
className ?: string ;
28
+ /** Provide a custom validation function, returning false invalidates the file */
29
+ validationFunction ?: ( file ?: File ) => boolean ;
30
+ /** Provide File for controlled behaviour */
31
+ selectedFile ?: File ;
28
32
}
29
33
30
34
/** Allows to upload a file by either dropping it on the dropzone or
@@ -37,8 +41,16 @@ function FileUploader({
37
41
acceptedFileTypes,
38
42
fileTriggerProps,
39
43
isDisabled = false ,
44
+ validationFunction,
45
+ selectedFile,
40
46
} : Readonly < FileUploaderProps > ) {
41
- const [ fileSelected , setFileSelected ] = useState < File > ( ) ;
47
+ const [ fileSelected , setFileSelected ] = useState < File | undefined > (
48
+ selectedFile ,
49
+ ) ;
50
+
51
+ useEffect ( ( ) => {
52
+ setFileSelected ( selectedFile ) ;
53
+ } , [ selectedFile ] ) ;
42
54
43
55
return (
44
56
< div className = { cn ( "box-border h-fit w-50" , className ) } >
@@ -71,7 +83,10 @@ function FileUploader({
71
83
72
84
if ( item ) {
73
85
const file = await item . getFile ( ) ;
74
- setFileSelected ( file ) ;
86
+ const validated = validationFunction ?.( file ) ?? true ;
87
+ if ( ! validated ) return ;
88
+ if ( selectedFile === undefined ) setFileSelected ( file ) ;
89
+
75
90
callback ( file ) ;
76
91
}
77
92
} }
@@ -82,7 +97,9 @@ function FileUploader({
82
97
onSelect = { ( e ) => {
83
98
if ( e ) {
84
99
const file = e [ 0 ] ;
85
- setFileSelected ( file ) ;
100
+ const validated = validationFunction ?.( file ) ?? true ;
101
+ if ( ! validated ) return ;
102
+ if ( selectedFile === undefined ) setFileSelected ( file ) ;
86
103
callback ( file ) ;
87
104
}
88
105
} }
@@ -109,7 +126,7 @@ function FileUploader({
109
126
</ FileTrigger >
110
127
</ DropZone >
111
128
{ msg && (
112
- < div className = "mt-4 flex items-start " >
129
+ < div className = "mt-4 flex items-center " >
113
130
{ variant === "success" && (
114
131
< SuccessIcon className = "fill-klerosUIComponentsSuccess mr-2 max-w-4 min-w-4" />
115
132
) }
0 commit comments