Skip to content

Commit 4aa685f

Browse files
committed
Error state when uploading invalid profile picture
1 parent 6d5fb0a commit 4aa685f

File tree

3 files changed

+81
-70
lines changed

3 files changed

+81
-70
lines changed

src/apps/onboarding/src/components/modal-upload-photo/index.tsx

Lines changed: 63 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'
2-
import { DropzoneState, useDropzone } from 'react-dropzone'
2+
import { DropzoneState, FileRejection, useDropzone } from 'react-dropzone'
33
import _ from 'lodash'
44
import 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>

src/apps/onboarding/src/pages/onboarding/index.tsx

Lines changed: 14 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { FC, useContext, useEffect } from 'react'
22
import { Outlet, Routes, useLocation } from 'react-router-dom'
3-
import { connect, Provider } from 'react-redux'
3+
import { Provider, useDispatch, useSelector } from 'react-redux'
44
import classNames from 'classnames'
55

66
import { routerContext, RouterContextData } from '~/libs/core'
@@ -14,46 +14,18 @@ import '../../styles/global/_index.scss'
1414

1515
import styles from './styles.module.scss'
1616

17-
const OnboardingFooterContent: FC<{
18-
fetchMemberInfo: () => void
19-
fetchMemberTraits: () => void
20-
reduxMemberInfo: Member | undefined
21-
}> = props => {
22-
useEffect(() => {
23-
props.fetchMemberInfo()
24-
props.fetchMemberTraits()
25-
/* eslint-disable react-hooks/exhaustive-deps */
26-
}, [])
27-
28-
return (
29-
<span className={styles.textFooter}>
30-
I will complete this onboarding later,
31-
<a href={`${EnvironmentConfig.USER_PROFILE_URL}/${props.reduxMemberInfo?.handle}`}> skip for now</a>
32-
.
33-
</span>
34-
)
35-
}
36-
37-
const mapStateToProps: any = (state: any) => {
38-
const {
39-
memberInfo,
40-
}: any = state.member
41-
42-
return {
43-
reduxMemberInfo: memberInfo,
44-
}
45-
}
46-
47-
const mapDispatchToProps: any = {
48-
fetchMemberInfo,
49-
fetchMemberTraits,
50-
}
51-
const OnboardingFooter: any = connect(mapStateToProps, mapDispatchToProps)(OnboardingFooterContent)
52-
5317
const OnboardingContent: FC<{
5418
}> = () => {
5519
const { getChildRoutes }: RouterContextData = useContext(routerContext)
5620
const location = useLocation()
21+
const dispatch = useDispatch()
22+
const reduxMemberInfo: Member = useSelector((state: any) => state.member.memberInfo)
23+
24+
useEffect(() => {
25+
dispatch(fetchMemberInfo())
26+
dispatch(fetchMemberTraits())
27+
/* eslint-disable react-hooks/exhaustive-deps */
28+
}, [])
5729

5830
useEffect(
5931
() => {
@@ -69,9 +41,12 @@ const OnboardingContent: FC<{
6941
<Routes>
7042
{getChildRoutes(onboardRouteId)}
7143
</Routes>
72-
<div id='calendar-portal' />
7344
</div>
74-
<OnboardingFooter />
45+
<span className={styles.textFooter}>
46+
I will complete this onboarding later,
47+
<a href={`${EnvironmentConfig.USER_PROFILE_URL}/${reduxMemberInfo?.handle}`}> skip for now</a>
48+
.
49+
</span>
7550
</>
7651
)
7752
}

src/apps/onboarding/src/styles/global/_color.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,7 @@
55
.color-black-60 {
66
color: $black-60;
77
}
8+
9+
.color-red-120 {
10+
color: $red-120;
11+
}

0 commit comments

Comments
 (0)