@@ -20,12 +20,12 @@ export default function MultiImageInput({
20
20
allowCrop,
21
21
...props
22
22
} ) {
23
- const [ numberOfImages , setNumberOfImages ] = useState ( 1 ) ;
23
+ const [ numberOfImages , setNumberOfImages ] = useState (
24
+ Object . keys ( files ) . length < max ? Object . keys ( files ) . length : max
25
+ ) ;
24
26
25
27
const [ fileUploadRefs , setFileUploadRefs ] = useState ( { } ) ;
26
28
27
- const [ imagePreviews , setImagePreviews ] = useState ( { } ) ;
28
-
29
29
const [ currentImage , setCurrentImage ] = useState ( null ) ;
30
30
31
31
const currentFile = useRef ( null ) ;
@@ -55,10 +55,11 @@ export default function MultiImageInput({
55
55
} , [ numberOfImages ] ) ;
56
56
57
57
useEffect ( ( ) => {
58
- if ( numberOfImages < max && files [ numberOfImages - 1 ] ) {
59
- setNumberOfImages ( n => n + 1 ) ;
58
+ let imageCount = Object . keys ( files ) . length ;
59
+ if ( imageCount < max ) {
60
+ setNumberOfImages ( Object . keys ( files ) . length + 1 ) ;
60
61
}
61
- } , [ files , max , numberOfImages ] ) ;
62
+ } , [ files , max ] ) ;
62
63
63
64
const handleFileChange = ( e , index ) => {
64
65
e . preventDefault ( ) ;
@@ -71,11 +72,6 @@ export default function MultiImageInput({
71
72
72
73
reader . onloadend = ( ) => {
73
74
if ( ! allowCrop ) {
74
- setImagePreviews ( {
75
- ...imagePreviews ,
76
- [ index ] : reader . result
77
- } ) ;
78
-
79
75
setFiles ( { ...files , [ index ] : reader . result } ) ;
80
76
return ;
81
77
}
@@ -100,11 +96,6 @@ export default function MultiImageInput({
100
96
if ( imageRef && imageRef . width && imageRef . height ) {
101
97
const base64Image = getCroppedImage ( imageRef , crop ) ;
102
98
103
- setImagePreviews ( {
104
- ...imagePreviews ,
105
- [ currentFileInputIndex . current ] : base64Image
106
- } ) ;
107
-
108
99
setFiles ( { ...files , [ currentFileInputIndex . current ] : base64Image } ) ;
109
100
}
110
101
} ;
@@ -151,25 +142,23 @@ export default function MultiImageInput({
151
142
const removeImage = ( e , index ) => {
152
143
fileUploadRefs [ index ] . current . value = '' ;
153
144
154
- delete files [ index ] ;
155
- delete imagePreviews [ index ] ;
156
-
157
145
const reIndexedFiles = { } ;
158
- const reIndexedPreviews = { } ;
159
146
160
147
for ( let i = index - 1 ; i >= 0 ; i -- ) {
161
148
reIndexedFiles [ i ] = files [ i ] ;
162
- reIndexedPreviews [ i ] = imagePreviews [ i ] ;
163
149
}
164
150
165
- for ( let i = index ; i < numberOfImages - 1 ; i ++ ) {
166
- reIndexedFiles [ i ] = files [ i + 1 ] ;
167
- reIndexedPreviews [ i ] = imagePreviews [ i + 1 ] ;
151
+ if ( Object . keys ( files ) . length === max ) {
152
+ for ( let i = index ; i < numberOfImages - 1 ; i ++ ) {
153
+ reIndexedFiles [ i ] = files [ i + 1 ] ;
154
+ }
155
+ } else {
156
+ for ( let i = index ; i < numberOfImages - 2 ; i ++ ) {
157
+ reIndexedFiles [ i ] = files [ i + 1 ] ;
158
+ }
168
159
}
169
160
170
- setImagePreviews ( reIndexedPreviews ) ;
171
161
setFiles ( reIndexedFiles ) ;
172
- setNumberOfImages ( n => n - 1 ) ;
173
162
174
163
exitCrop ( ) ;
175
164
@@ -184,21 +173,24 @@ export default function MultiImageInput({
184
173
. fill ( )
185
174
. map ( ( _ , index ) => (
186
175
< ImageInput key = { index } >
187
- { imagePreviews [ index ] ? (
176
+ { files [ index ] ? (
188
177
< >
189
178
< DeleteImageButton
179
+ aria-label = { `Delete Image ${ index } ` }
190
180
onClick = { e => removeImage ( e , index ) }
191
181
type = "button"
192
182
/>
193
183
< ImageOverlay >
194
184
< Image
195
- src = { imagePreviews [ index ] }
185
+ alt = { `uploaded image${ index } ` }
186
+ src = { files [ index ] }
196
187
onClick = { ( ) => fileUploadRefs [ index ] . current . click ( ) }
197
188
/>
198
189
</ ImageOverlay >
199
190
</ >
200
191
) : (
201
192
< div
193
+ role = "button"
202
194
onClick = { ( ) => fileUploadRefs [ index ] . current . click ( ) }
203
195
style = { { cursor : 'pointer' } }
204
196
>
0 commit comments