@@ -10,8 +10,9 @@ import { useAppSelector } from 'app/store/storeHooks';
10
10
import { DndDropOverlay } from 'features/dnd/DndDropOverlay' ;
11
11
import type { DndTargetState } from 'features/dnd/types' ;
12
12
import { selectAutoAddBoardId } from 'features/gallery/store/gallerySelectors' ;
13
+ import { selectMaxImageUploadCount } from 'features/system/store/configSlice' ;
13
14
import { toast } from 'features/toast/toast' ;
14
- import { memo , useCallback , useEffect , useRef , useState } from 'react' ;
15
+ import { memo , useCallback , useEffect , useMemo , useRef , useState } from 'react' ;
15
16
import { useTranslation } from 'react-i18next' ;
16
17
import { uploadImages } from 'services/api/endpoints/images' ;
17
18
import { useBoardName } from 'services/api/hooks/useBoardName' ;
@@ -20,7 +21,8 @@ import { z } from 'zod';
20
21
21
22
const ACCEPTED_IMAGE_TYPES = [ 'image/png' , 'image/jpg' , 'image/jpeg' ] ;
22
23
const ACCEPTED_FILE_EXTENSIONS = [ '.png' , '.jpg' , '.jpeg' ] ;
23
- const log = logger ( 'gallery' ) ;
24
+
25
+ const log = logger ( 'generation' ) ;
24
26
25
27
// const MAX_IMAGE_SIZE = 4; //In MegaBytes
26
28
// const sizeInMB = (sizeInBytes: number, decimalsNum = 2) => {
@@ -67,19 +69,20 @@ const sx = {
67
69
} ,
68
70
} satisfies SystemStyleObject ;
69
71
70
- const maxImageUploadCount = undefined ;
71
-
72
72
export const FullscreenDropzone = memo ( ( ) => {
73
73
const { t } = useTranslation ( ) ;
74
74
const ref = useRef < HTMLDivElement > ( null ) ;
75
-
75
+ const maxImageUploadCount = useAppSelector ( selectMaxImageUploadCount ) ;
76
76
const [ dndState , setDndState ] = useState < DndTargetState > ( 'idle' ) ;
77
77
78
+ const uploadFilesSchema = useMemo ( ( ) => getFilesSchema ( maxImageUploadCount ) , [ maxImageUploadCount ] ) ;
79
+
78
80
const validateAndUploadFiles = useCallback (
79
81
( files : File [ ] ) => {
82
+ log . info ( 'validateAndUploadFiles' ) ;
80
83
const { getState } = getStore ( ) ;
81
- const uploadFilesSchema = getFilesSchema ( maxImageUploadCount ) ;
82
84
const parseResult = uploadFilesSchema . safeParse ( files ) ;
85
+ log . info ( 'parseResult' ) ;
83
86
84
87
if ( ! parseResult . success ) {
85
88
const description =
@@ -107,7 +110,7 @@ export const FullscreenDropzone = memo(() => {
107
110
108
111
uploadImages ( uploadArgs ) ;
109
112
} ,
110
- [ t ]
113
+ [ maxImageUploadCount , t , uploadFilesSchema ]
111
114
) ;
112
115
113
116
useEffect ( ( ) => {
@@ -148,57 +151,30 @@ export const FullscreenDropzone = memo(() => {
148
151
useEffect ( ( ) => {
149
152
log . info ( 'use effect' ) ;
150
153
const controller = new AbortController ( ) ;
151
-
152
- window . addEventListener (
153
- 'paste' ,
154
- ( e ) => {
155
- log . info ( 'event listener' ) ;
156
- log . info ( JSON . stringify ( e . clipboardData ) ) ;
157
- if ( ! e . clipboardData ?. files ) {
158
- log . info ( 'no files' ) ;
159
- return ;
160
- }
161
- const files = Array . from ( e . clipboardData . files ) ;
162
- const { getState } = getStore ( ) ;
163
- const uploadFilesSchema = getFilesSchema ( undefined ) ;
164
- const parseResult = uploadFilesSchema . safeParse ( files ) ;
165
-
166
- if ( ! parseResult . success ) {
167
- // const description =
168
- // maxImageUploadCount === undefined
169
- // ? t('toast.uploadFailedInvalidUploadDesc')
170
- // : t('toast.uploadFailedInvalidUploadDesc_withCount', { count: maxImageUploadCount });
171
-
172
- // toast({
173
- // id: 'UPLOAD_FAILED',
174
- // title: t('toast.uploadFailed'),
175
- // description,
176
- // status: 'error',
177
- // });
178
- log . info ( "couldn't parse" ) ;
179
- return ;
180
- }
181
- const autoAddBoardId = selectAutoAddBoardId ( getState ( ) ) ;
182
-
183
- const uploadArgs : UploadImageArg [ ] = files . map ( ( file , i ) => ( {
184
- file,
185
- image_category : 'user' ,
186
- is_intermediate : false ,
187
- board_id : autoAddBoardId === 'none' ? undefined : autoAddBoardId ,
188
- isFirstUploadOfBatch : i === 0 ,
189
- } ) ) ;
190
-
191
- uploadImages ( uploadArgs ) ;
192
- // validateAndUploadFiles(files);
193
- } ,
194
- { signal : controller . signal }
195
- ) ;
154
+ try {
155
+ window . addEventListener (
156
+ 'paste' ,
157
+ ( e ) => {
158
+ log . info ( 'in paste' ) ;
159
+ log . info ( `clipboardData: ${ JSON . stringify ( e . clipboardData ) } ` ) ;
160
+ if ( ! e . clipboardData ?. files ) {
161
+ log . info ( 'no files' ) ;
162
+ return ;
163
+ }
164
+ const files = Array . from ( e . clipboardData . files ) ;
165
+ validateAndUploadFiles ( files ) ;
166
+ } ,
167
+ { signal : controller . signal }
168
+ ) ;
169
+ } catch ( error ) {
170
+ log . info ( `error: ${ JSON . stringify ( error ) } ` ) ;
171
+ }
196
172
197
173
return ( ) => {
198
- log . info ( 'aborted ' ) ;
174
+ log . info ( 'abort ' ) ;
199
175
controller . abort ( ) ;
200
176
} ;
201
- } , [ ] ) ;
177
+ } , [ validateAndUploadFiles ] ) ;
202
178
203
179
return (
204
180
< Box ref = { ref } data-dnd-state = { dndState } sx = { sx } >
0 commit comments