1
1
'use client'
2
2
import type { FormState , SanitizedCollectionConfig , UploadEdits } from 'payload'
3
3
4
- import { isImage , reduceFieldsToValues } from 'payload/shared'
4
+ import { isImage } from 'payload/shared'
5
5
import React , { useCallback , useEffect , useRef , useState } from 'react'
6
6
import { toast } from 'sonner'
7
7
8
8
import { FieldError } from '../../fields/FieldError/index.js'
9
9
import { fieldBaseClass } from '../../fields/shared/index.js'
10
- import { useForm } from '../../forms/Form/index.js'
10
+ import { useForm , useFormProcessing } from '../../forms/Form/index.js'
11
11
import { useField } from '../../forms/useField/index.js'
12
12
import { useDocumentInfo } from '../../providers/DocumentInfo/index.js'
13
13
import { EditDepthProvider } from '../../providers/EditDepth/index.js'
@@ -94,15 +94,15 @@ export const Upload: React.FC<UploadProps> = (props) => {
94
94
const { t } = useTranslation ( )
95
95
const { setModified } = useForm ( )
96
96
const { resetUploadEdits, updateUploadEdits, uploadEdits } = useUploadEdits ( )
97
- const { docPermissions } = useDocumentInfo ( )
97
+ const { docPermissions, savedDocumentData } = useDocumentInfo ( )
98
+ const isFormSubmitting = useFormProcessing ( )
98
99
const { errorMessage, setValue, showError, value } = useField < File > ( {
99
100
path : 'file' ,
100
101
validate,
101
102
} )
102
103
103
- const [ doc , setDoc ] = useState ( reduceFieldsToValues ( initialState || { } , true ) )
104
104
const [ fileSrc , setFileSrc ] = useState < null | string > ( null )
105
- const [ replacingFile , setReplacingFile ] = useState ( false )
105
+ const [ removedFile , setRemovedFile ] = useState ( false )
106
106
const [ filename , setFilename ] = useState < string > ( value ?. name || '' )
107
107
const [ showUrlInput , setShowUrlInput ] = useState ( false )
108
108
const [ fileUrl , setFileUrl ] = useState < string > ( '' )
@@ -156,11 +156,10 @@ export const Upload: React.FC<UploadProps> = (props) => {
156
156
)
157
157
158
158
const handleFileRemoval = useCallback ( ( ) => {
159
- setReplacingFile ( true )
159
+ setRemovedFile ( true )
160
160
handleFileChange ( null )
161
161
setFileSrc ( '' )
162
162
setFileUrl ( '' )
163
- setDoc ( { } )
164
163
resetUploadEdits ( )
165
164
setShowUrlInput ( false )
166
165
} , [ handleFileChange , resetUploadEdits ] )
@@ -192,11 +191,10 @@ export const Upload: React.FC<UploadProps> = (props) => {
192
191
}
193
192
194
193
useEffect ( ( ) => {
195
- setDoc ( reduceFieldsToValues ( initialState || { } , true ) )
196
194
if ( initialState ?. file ?. value instanceof File ) {
197
195
setFileSrc ( URL . createObjectURL ( initialState . file . value ) )
196
+ setRemovedFile ( false )
198
197
}
199
- setReplacingFile ( false )
200
198
} , [ initialState ] )
201
199
202
200
useEffect ( ( ) => {
@@ -205,6 +203,12 @@ export const Upload: React.FC<UploadProps> = (props) => {
205
203
}
206
204
} , [ showUrlInput ] )
207
205
206
+ useEffect ( ( ) => {
207
+ if ( isFormSubmitting ) {
208
+ setRemovedFile ( false )
209
+ }
210
+ } , [ isFormSubmitting ] )
211
+
208
212
const canRemoveUpload =
209
213
docPermissions ?. update && 'delete' in docPermissions && docPermissions ?. delete
210
214
@@ -222,19 +226,19 @@ export const Upload: React.FC<UploadProps> = (props) => {
222
226
return (
223
227
< div className = { [ fieldBaseClass , baseClass ] . filter ( Boolean ) . join ( ' ' ) } >
224
228
< FieldError message = { errorMessage } showError = { showError } />
225
- { doc . filename && ! replacingFile && (
229
+ { savedDocumentData && savedDocumentData . filename && ! removedFile && (
226
230
< FileDetails
227
231
collectionSlug = { collectionSlug }
228
232
customUploadActions = { customActions }
229
- doc = { doc }
233
+ doc = { savedDocumentData }
230
234
enableAdjustments = { showCrop || showFocalPoint }
231
235
handleRemove = { canRemoveUpload ? handleFileRemoval : undefined }
232
236
hasImageSizes = { hasImageSizes }
233
- imageCacheTag = { doc . updatedAt }
237
+ imageCacheTag = { savedDocumentData . updatedAt }
234
238
uploadConfig = { uploadConfig }
235
239
/>
236
240
) }
237
- { ( ! doc . filename || replacingFile ) && (
241
+ { ( ! savedDocumentData ? .filename || removedFile ) && (
238
242
< div className = { `${ baseClass } __upload` } >
239
243
{ ! value && ! showUrlInput && (
240
244
< Dropzone onChange = { handleFileSelection } >
@@ -339,7 +343,7 @@ export const Upload: React.FC<UploadProps> = (props) => {
339
343
< UploadActions
340
344
customActions = { customActions }
341
345
enableAdjustments = { showCrop || showFocalPoint }
342
- enablePreviewSizes = { hasImageSizes && doc . filename && ! replacingFile }
346
+ enablePreviewSizes = { hasImageSizes && savedDocumentData ? .filename && ! removedFile }
343
347
mimeType = { value . type }
344
348
/>
345
349
</ div >
@@ -356,17 +360,17 @@ export const Upload: React.FC<UploadProps> = (props) => {
356
360
) }
357
361
</ div >
358
362
) }
359
- { ( value || doc . filename ) && (
363
+ { ( value || savedDocumentData ? .filename ) && (
360
364
< EditDepthProvider >
361
365
< Drawer Header = { null } slug = { editDrawerSlug } >
362
366
< EditUpload
363
- fileName = { value ?. name || doc ?. filename }
364
- fileSrc = { doc ?. url || fileSrc }
365
- imageCacheTag = { doc . updatedAt }
367
+ fileName = { value ?. name || savedDocumentData ?. filename }
368
+ fileSrc = { savedDocumentData ?. url || fileSrc }
369
+ imageCacheTag = { savedDocumentData ? .updatedAt }
366
370
initialCrop = { uploadEdits ?. crop ?? undefined }
367
371
initialFocalPoint = { {
368
- x : uploadEdits ?. focalPoint ?. x || doc . focalX || 50 ,
369
- y : uploadEdits ?. focalPoint ?. y || doc . focalY || 50 ,
372
+ x : uploadEdits ?. focalPoint ?. x || savedDocumentData ? .focalX || 50 ,
373
+ y : uploadEdits ?. focalPoint ?. y || savedDocumentData ? .focalY || 50 ,
370
374
} }
371
375
onSave = { onEditsSave }
372
376
showCrop = { showCrop }
@@ -375,14 +379,18 @@ export const Upload: React.FC<UploadProps> = (props) => {
375
379
</ Drawer >
376
380
</ EditDepthProvider >
377
381
) }
378
- { doc && hasImageSizes && (
382
+ { savedDocumentData && hasImageSizes && (
379
383
< Drawer
380
384
className = { `${ baseClass } __previewDrawer` }
381
385
hoverTitle
382
386
slug = { sizePreviewSlug }
383
- title = { t ( 'upload:sizesFor' , { label : doc ? .filename } ) }
387
+ title = { t ( 'upload:sizesFor' , { label : savedDocumentData . filename } ) }
384
388
>
385
- < PreviewSizes doc = { doc } imageCacheTag = { doc . updatedAt } uploadConfig = { uploadConfig } />
389
+ < PreviewSizes
390
+ doc = { savedDocumentData }
391
+ imageCacheTag = { savedDocumentData . updatedAt }
392
+ uploadConfig = { uploadConfig }
393
+ />
386
394
</ Drawer >
387
395
) }
388
396
</ div >
0 commit comments