1
1
import { GeneralIcon } from "@/assets/GeneralIcon" ;
2
2
import { AlertType , ButtonType , GeneralIconType } from "@/shared/types" ;
3
3
import { Button } from "../Button" ;
4
- import { ChangeEvent , FC , useCallback , useMemo , useRef , useState } from "react" ;
4
+ import { ChangeEvent , FC , useCallback , useEffect , useMemo , useRef , useState } from "react" ;
5
5
import Big from "big.js" ;
6
6
import classNames from "classnames" ;
7
7
import { useAppDispatch } from "@/store/hooks" ;
@@ -20,6 +20,7 @@ export const FileUpload: FC<FileUploadProps> = ({
20
20
const [ files , setFiles ] = useState < { name : string ; content : string } [ ] > ( [ ] ) ;
21
21
const inputFileRef = useRef < HTMLInputElement > ( null ) ;
22
22
const dispatch = useAppDispatch ( ) ;
23
+ const refFilesLength = useRef < number > ( 0 ) ;
23
24
24
25
const onUploadFile = useCallback ( async ( event : ChangeEvent < HTMLInputElement > ) => {
25
26
let { files : selectedFiles } = event . target ;
@@ -90,16 +91,23 @@ export const FileUpload: FC<FileUploadProps> = ({
90
91
}
91
92
92
93
const newFiles = await Promise . all ( filesToHandle . map ( readFile ) ) ;
94
+
93
95
setFiles ( ( prev ) => isDataEditable ? [ ...prev , ...newFiles ] : [ ...newFiles ] ) ;
94
- dispatch ( setNFTMultipleDataFiles ( newFiles . map ( ( file ) => file . content ) ) ) ;
95
96
} catch ( error ) {
96
97
console . error ( "Error reading files" , error ) ;
97
98
}
98
99
} , [ files , isDataEditable ] ) ;
99
100
101
+ useEffect ( ( ) => {
102
+ if ( files . length !== refFilesLength . current ) {
103
+ dispatch ( setNFTMultipleDataFiles ( files . map ( item => item . content ) ) ) ;
104
+
105
+ refFilesLength . current = files . length ;
106
+ }
107
+ } , [ files ] ) ;
108
+
100
109
const removeFile = useCallback ( ( name : string ) => {
101
110
setFiles ( ( prev ) => prev . filter ( ( file ) => file . name !== name ) ) ;
102
- dispatch ( setNFTMultipleDataFiles ( files . filter ( ( file ) => file . name !== name ) . map ( ( file ) => file . content ) ) ) ;
103
111
} , [ files ] ) ;
104
112
105
113
const renderContent = useMemo ( ( ) => {
@@ -114,14 +122,14 @@ export const FileUpload: FC<FileUploadProps> = ({
114
122
</ div >
115
123
) ) }
116
124
< Button
117
- label = "Choose more files"
125
+ label = { isDataEditable ? "Choose more files" : "Choose another file" }
118
126
type = { ButtonType . Secondary }
119
127
onClick = { ( ) => ! disabled && inputFileRef ?. current ?. click ( ) }
120
128
className = "text-sm !py-2 px-6 rounded-[10px] font-medium w-[160px] !bg-transparent group-hover:opacity-50"
121
129
/>
122
130
</ div >
123
131
< div className = "flex items-center gap-2 text-xs mt-1 text-[#5E6773]" >
124
- < GeneralIcon type = { GeneralIconType . Warning } /> The max file size is 5KB per file
132
+ < GeneralIcon type = { GeneralIconType . Warning } /> The max size of files is 250KB
125
133
</ div >
126
134
</ >
127
135
) ;
@@ -141,11 +149,11 @@ export const FileUpload: FC<FileUploadProps> = ({
141
149
/>
142
150
</ div >
143
151
< div className = "flex items-center gap-2 text-xs mt-1 text-[#5E6773]" >
144
- < GeneralIcon type = { GeneralIconType . Warning } /> The max file size is 5KB per file
152
+ < GeneralIcon type = { GeneralIconType . Warning } /> The max size of files is 250KB
145
153
</ div >
146
154
</ >
147
155
) ;
148
- } , [ files , disabled , removeFile ] ) ;
156
+ } , [ files , disabled , removeFile , isDataEditable ] ) ;
149
157
150
158
return (
151
159
< div
0 commit comments