2
2
import type { FormState , SanitizedCollectionConfig } from 'payload/types'
3
3
4
4
import { FieldError } from '@payloadcms/ui/forms/FieldError'
5
+ import { useFormQueryParams } from '@payloadcms/ui/providers/FormQueryParams'
5
6
import { isImage } from 'payload/utilities'
6
7
import React , { useCallback , useEffect , useState } from 'react'
7
8
8
9
import { fieldBaseClass } from '../../fields/shared/index.js'
9
- import { useFormSubmitted } from '../../forms/Form/context.js'
10
+ import { useForm , useFormSubmitted } from '../../forms/Form/context.js'
10
11
import { useField } from '../../forms/useField/index.js'
11
12
import { useDocumentInfo } from '../../providers/DocumentInfo/index.js'
12
13
import { useTranslation } from '../../providers/Translation/index.js'
@@ -65,12 +66,15 @@ export const Upload: React.FC<UploadProps> = (props) => {
65
66
const [ replacingFile , setReplacingFile ] = useState ( false )
66
67
const [ fileSrc , setFileSrc ] = useState < null | string > ( null )
67
68
const { t } = useTranslation ( )
69
+ const { setModified } = useForm ( )
70
+ const { dispatchFormQueryParams, formQueryParams } = useFormQueryParams ( )
68
71
const [ doc , setDoc ] = useState ( reduceFieldsToValues ( initialState || { } , true ) )
69
72
const { docPermissions } = useDocumentInfo ( )
70
73
const { errorMessage, setValue, showError, value } = useField < File > ( {
71
74
path : 'file' ,
72
75
validate,
73
76
} )
77
+ const [ crop , setCrop ] = useState ( { x : 0 , y : 0 } )
74
78
75
79
const handleFileNameChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
76
80
const updatedFileName = e . target . value
@@ -96,6 +100,40 @@ export const Upload: React.FC<UploadProps> = (props) => {
96
100
setFileSrc ( '' )
97
101
} , [ setValue ] )
98
102
103
+ const onEditsSave = React . useCallback (
104
+ ( { crop, pointPosition } ) => {
105
+ setCrop ( {
106
+ x : crop . x || 0 ,
107
+ y : crop . y || 0 ,
108
+ } )
109
+ const zoomScale = 100 / Math . min ( crop . width , crop . height )
110
+
111
+ document . documentElement . style . setProperty ( '--file-details-thumbnail--zoom' , `${ zoomScale } ` )
112
+ document . documentElement . style . setProperty (
113
+ '--file-details-thumbnail--top-offset' ,
114
+ `${ zoomScale * ( 50 - crop . height / 2 - crop . y ) } %` ,
115
+ )
116
+ document . documentElement . style . setProperty (
117
+ '--file-details-thumbnail--left-offset' ,
118
+ `${ zoomScale * ( 50 - crop . width / 2 - crop . x ) } %` ,
119
+ )
120
+ setModified ( true )
121
+ dispatchFormQueryParams ( {
122
+ type : 'SET' ,
123
+ params : {
124
+ uploadEdits :
125
+ crop || pointPosition
126
+ ? {
127
+ crop : crop || null ,
128
+ focalPoint : pointPosition ? pointPosition : null ,
129
+ }
130
+ : null ,
131
+ } ,
132
+ } )
133
+ } ,
134
+ [ dispatchFormQueryParams , setModified ] ,
135
+ )
136
+
99
137
useEffect ( ( ) => {
100
138
setDoc ( reduceFieldsToValues ( initialState || { } , true ) )
101
139
setReplacingFile ( false )
@@ -200,6 +238,12 @@ export const Upload: React.FC<UploadProps> = (props) => {
200
238
fileName = { value ?. name || doc ?. filename }
201
239
fileSrc = { fileSrc || doc ?. url }
202
240
imageCacheTag = { lastSubmittedTime }
241
+ initialCrop = { formQueryParams ?. uploadEdits ?. crop ?? { } }
242
+ initialFocalPoint = { {
243
+ x : formQueryParams ?. uploadEdits ?. focalPoint . x || 0 ,
244
+ y : formQueryParams ?. uploadEdits ?. focalPoint . y || 0 ,
245
+ } }
246
+ onSave = { onEditsSave }
203
247
showCrop = { showCrop }
204
248
showFocalPoint = { showFocalPoint }
205
249
/>
0 commit comments