Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 63 additions & 31 deletions src/apps/onboarding/src/components/modal-upload-photo/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'
import { DropzoneState, useDropzone } from 'react-dropzone'
import { DropzoneState, FileRejection, useDropzone } from 'react-dropzone'
import _ from 'lodash'
import classNames from 'classnames'

Expand All @@ -22,8 +22,23 @@ const ModalUploadPhoto: FC<ModalUploadPhotoProps> = (props: ModalUploadPhotoProp
const [imgUrl, setImgUrl] = useState<string>('')
const [isSaving, setIsSaving]: [boolean, Dispatch<SetStateAction<boolean>>]
= useState<boolean>(false)
const [errorUploadFile, setErrorUploadFile] = useState('')

const onDrop = useCallback((acceptedFiles: File[], fileRejections: FileRejection[]) => {
if (!acceptedFiles.length && fileRejections.length) {
const errorCode = _.get(fileRejections, '[0].errors[0].code')
let errorMessage = _.get(fileRejections, '[0].errors[0].message', '')
if (errorCode === 'file-invalid-type') {
errorMessage = 'Invalid file format'
} else if (errorCode === 'file-too-large') {
errorMessage = 'File is larger than 2MB'
}

setErrorUploadFile(errorMessage)
} else {
setErrorUploadFile('')
}

const onDrop = useCallback((acceptedFiles: File[]) => {
setMyFiles([...acceptedFiles])
}, [])

Expand Down Expand Up @@ -64,6 +79,51 @@ const ModalUploadPhoto: FC<ModalUploadPhotoProps> = (props: ModalUploadPhotoProp
}
}

function getDragAndDropUI(): JSX.Element {
if (isSaving) {
return (
<div className={styles.blockDropZone}>
<span>Uploading...</span>
<div className={styles.blockProgressContainer}>
<div className={styles.blockProgress} />
</div>
</div>
)
}

if (errorUploadFile) {
return (
<div {...getRootProps()} className={styles.blockPhoto}>
<input {...getInputProps()} />
<span className='color-red-120'>{errorUploadFile}</span>
</div>
)
}

if (imgUrl) {
return (
<div {...getRootProps()} className={styles.blockPhoto}>
<input {...getInputProps()} />
<img src={imgUrl} alt='' />
</div>
)
}

return (
<div {...getRootProps()} className={styles.blockDropZone}>
<input {...getInputProps()} />
<span className={styles.textDragAndDrop}>
Drag and drop your file here
<br />
or
</span>
<span className={styles.textBrowse}>
BROWSE
</span>
</div>
)
}

return (
<OnboardingBaseModal
buttons={(
Expand Down Expand Up @@ -92,35 +152,7 @@ const ModalUploadPhoto: FC<ModalUploadPhotoProps> = (props: ModalUploadPhotoProp
'd-flex mobile-flex-column align-items-start mobile-gap-16',
)}
>
{(!isSaving && !imgUrl) ? (
<div {...getRootProps()} className={styles.blockDropZone}>
<input {...getInputProps()} />
<span className={styles.textDragAndDrop}>
Drag and drop your file here
<br />
or
</span>
<span className={styles.textBrowse}>
BROWSE
</span>
</div>
) : undefined}

{(!isSaving && imgUrl) ? (
<div {...getRootProps()} className={styles.blockPhoto}>
<input {...getInputProps()} />
<img src={imgUrl} alt='' />
</div>
) : undefined}

{isSaving ? (
<div className={styles.blockDropZone}>
<span>Uploading...</span>
<div className={styles.blockProgressContainer}>
<div className={styles.blockProgress} />
</div>
</div>
) : undefined}
{getDragAndDropUI()}

<div className='d-flex flex-column align-items-start'>
<span>Add a photo that you would like to share to the customers and community members.</span>
Expand Down
59 changes: 21 additions & 38 deletions src/apps/onboarding/src/pages/onboarding/index.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { FC, useContext, useEffect } from 'react'
import { Outlet, Routes } from 'react-router-dom'
import { connect, Provider } from 'react-redux'
import { Outlet, Routes, useLocation } from 'react-router-dom'
import { Provider, useDispatch, useSelector } from 'react-redux'
import classNames from 'classnames'

import { routerContext, RouterContextData } from '~/libs/core'
Expand All @@ -14,45 +14,25 @@ import '../../styles/global/_index.scss'

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

const OnboardingFooterContent: FC<{
fetchMemberInfo: () => void
fetchMemberTraits: () => void
reduxMemberInfo: Member | undefined
}> = props => {
const OnboardingContent: FC<{
}> = () => {
const { getChildRoutes }: RouterContextData = useContext(routerContext)
const location = useLocation()
const dispatch = useDispatch()
const reduxMemberInfo: Member = useSelector((state: any) => state.member.memberInfo)

useEffect(() => {
props.fetchMemberInfo()
props.fetchMemberTraits()
dispatch(fetchMemberInfo())
dispatch(fetchMemberTraits())
/* eslint-disable react-hooks/exhaustive-deps */
}, [])

return (
<span className={styles.textFooter}>
I will complete this onboarding later,
<a href={`${EnvironmentConfig.USER_PROFILE_URL}/${props.reduxMemberInfo?.handle}`}> skip for now</a>
.
</span>
useEffect(
() => {
window.scrollTo(0, 0)
},
[location.pathname],
)
}

const mapStateToProps: any = (state: any) => {
const {
memberInfo,
}: any = state.member

return {
reduxMemberInfo: memberInfo,
}
}

const mapDispatchToProps: any = {
fetchMemberInfo,
fetchMemberTraits,
}
const OnboardingFooter: any = connect(mapStateToProps, mapDispatchToProps)(OnboardingFooterContent)

const OnboardingContent: FC<{
}> = () => {
const { getChildRoutes }: RouterContextData = useContext(routerContext)

return (
<>
Expand All @@ -61,9 +41,12 @@ const OnboardingContent: FC<{
<Routes>
{getChildRoutes(onboardRouteId)}
</Routes>
<div id='calendar-portal' />
</div>
<OnboardingFooter />
<span className={styles.textFooter}>
I will complete this onboarding later,
<a href={`${EnvironmentConfig.USER_PROFILE_URL}/${reduxMemberInfo?.handle}`}> skip for now</a>
.
</span>
</>
)
}
Expand Down
4 changes: 4 additions & 0 deletions src/apps/onboarding/src/styles/global/_color.scss
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,7 @@
.color-black-60 {
color: $black-60;
}

.color-red-120 {
color: $red-120;
}