11import { Dispatch , FC , SetStateAction , useCallback , useEffect , useState } from 'react'
2- import { DropzoneState , useDropzone } from 'react-dropzone'
2+ import { DropzoneState , FileRejection , useDropzone } from 'react-dropzone'
33import _ from 'lodash'
44import classNames from 'classnames'
55
@@ -22,8 +22,23 @@ const ModalUploadPhoto: FC<ModalUploadPhotoProps> = (props: ModalUploadPhotoProp
2222 const [ imgUrl , setImgUrl ] = useState < string > ( '' )
2323 const [ isSaving , setIsSaving ] : [ boolean , Dispatch < SetStateAction < boolean > > ]
2424 = useState < boolean > ( false )
25+ const [ errorUploadFile , setErrorUploadFile ] = useState ( '' )
26+
27+ const onDrop = useCallback ( ( acceptedFiles : File [ ] , fileRejections : FileRejection [ ] ) => {
28+ if ( ! acceptedFiles . length && fileRejections . length ) {
29+ const errorCode = _ . get ( fileRejections , '[0].errors[0].code' )
30+ let errorMessage = _ . get ( fileRejections , '[0].errors[0].message' , '' )
31+ if ( errorCode === 'file-invalid-type' ) {
32+ errorMessage = 'Invalid file format'
33+ } else if ( errorCode === 'file-too-large' ) {
34+ errorMessage = 'File is larger than 2MB'
35+ }
36+
37+ setErrorUploadFile ( errorMessage )
38+ } else {
39+ setErrorUploadFile ( '' )
40+ }
2541
26- const onDrop = useCallback ( ( acceptedFiles : File [ ] ) => {
2742 setMyFiles ( [ ...acceptedFiles ] )
2843 } , [ ] )
2944
@@ -64,6 +79,51 @@ const ModalUploadPhoto: FC<ModalUploadPhotoProps> = (props: ModalUploadPhotoProp
6479 }
6580 }
6681
82+ function getDragAndDropUI ( ) : JSX . Element {
83+ if ( isSaving ) {
84+ return (
85+ < div className = { styles . blockDropZone } >
86+ < span > Uploading...</ span >
87+ < div className = { styles . blockProgressContainer } >
88+ < div className = { styles . blockProgress } />
89+ </ div >
90+ </ div >
91+ )
92+ }
93+
94+ if ( errorUploadFile ) {
95+ return (
96+ < div { ...getRootProps ( ) } className = { styles . blockPhoto } >
97+ < input { ...getInputProps ( ) } />
98+ < span className = 'color-red-120' > { errorUploadFile } </ span >
99+ </ div >
100+ )
101+ }
102+
103+ if ( imgUrl ) {
104+ return (
105+ < div { ...getRootProps ( ) } className = { styles . blockPhoto } >
106+ < input { ...getInputProps ( ) } />
107+ < img src = { imgUrl } alt = '' />
108+ </ div >
109+ )
110+ }
111+
112+ return (
113+ < div { ...getRootProps ( ) } className = { styles . blockDropZone } >
114+ < input { ...getInputProps ( ) } />
115+ < span className = { styles . textDragAndDrop } >
116+ Drag and drop your file here
117+ < br />
118+ or
119+ </ span >
120+ < span className = { styles . textBrowse } >
121+ BROWSE
122+ </ span >
123+ </ div >
124+ )
125+ }
126+
67127 return (
68128 < OnboardingBaseModal
69129 buttons = { (
@@ -92,35 +152,7 @@ const ModalUploadPhoto: FC<ModalUploadPhotoProps> = (props: ModalUploadPhotoProp
92152 'd-flex mobile-flex-column align-items-start mobile-gap-16' ,
93153 ) }
94154 >
95- { ( ! isSaving && ! imgUrl ) ? (
96- < div { ...getRootProps ( ) } className = { styles . blockDropZone } >
97- < input { ...getInputProps ( ) } />
98- < span className = { styles . textDragAndDrop } >
99- Drag and drop your file here
100- < br />
101- or
102- </ span >
103- < span className = { styles . textBrowse } >
104- BROWSE
105- </ span >
106- </ div >
107- ) : undefined }
108-
109- { ( ! isSaving && imgUrl ) ? (
110- < div { ...getRootProps ( ) } className = { styles . blockPhoto } >
111- < input { ...getInputProps ( ) } />
112- < img src = { imgUrl } alt = '' />
113- </ div >
114- ) : undefined }
115-
116- { isSaving ? (
117- < div className = { styles . blockDropZone } >
118- < span > Uploading...</ span >
119- < div className = { styles . blockProgressContainer } >
120- < div className = { styles . blockProgress } />
121- </ div >
122- </ div >
123- ) : undefined }
155+ { getDragAndDropUI ( ) }
124156
125157 < div className = 'd-flex flex-column align-items-start' >
126158 < span > Add a photo that you would like to share to the customers and community members.</ span >
0 commit comments