diff options
author | Eugene Sokolov <eug-vs@keemail.me> | 2020-08-14 02:50:16 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-14 02:50:16 +0300 |
commit | dc0d09f568ca9eeda4978c4750b548ba81688c23 (patch) | |
tree | 08dfa96410207f5621989c3cb0ea930624af1bee /src/containers/PollCreation/PollCreation.tsx | |
parent | 6ace75beae6ab6a466c4d0a9a60ca30aaad0a87c (diff) | |
parent | fca54f49bb3541f726da1becffaa60197835ca68 (diff) | |
download | which-ui-dc0d09f568ca9eeda4978c4750b548ba81688c23.tar.gz |
Merge pull request #80 from which-ecosystem/improved-poll-creation
Upload progress logging
Diffstat (limited to 'src/containers/PollCreation/PollCreation.tsx')
-rw-r--r-- | src/containers/PollCreation/PollCreation.tsx | 77 |
1 files changed, 39 insertions, 38 deletions
diff --git a/src/containers/PollCreation/PollCreation.tsx b/src/containers/PollCreation/PollCreation.tsx index 64ab7fd..107314a 100644 --- a/src/containers/PollCreation/PollCreation.tsx +++ b/src/containers/PollCreation/PollCreation.tsx @@ -1,20 +1,22 @@ -import React, { useState } from 'react'; +import React from 'react'; import { useHistory } from 'react-router-dom'; import { makeStyles } from '@material-ui/core/styles'; import { Button, Card, Divider, - Container + Container, + LinearProgress } from '@material-ui/core'; import { useSnackbar } from 'notistack'; -import axios from 'axios'; -import PollCreationImage from './PollCreationImage'; +import ImageInput from './ImageInput'; import UserStrip from '../../components/UserStrip/UserStrip'; -import { get, post } from '../../requests'; +import { post } from '../../requests'; import { useAuth } from '../../hooks/useAuth'; import { useFeed } from '../../hooks/APIClient'; +import useS3Preupload from '../../hooks/useS3Preupload'; + const useStyles = makeStyles(theme => ({ root: { @@ -26,36 +28,29 @@ const useStyles = makeStyles(theme => ({ } })); + const PollCreation: React.FC = () => { const classes = useStyles(); const history = useHistory(); - const [left, setLeft] = useState<File | string>(); - const [right, setRight] = useState<File | string>(); const { enqueueSnackbar } = useSnackbar(); const { user } = useAuth(); const { mutate: updateFeed } = useFeed(); - - const readyToSubmit = left && right; - - const uploadFile = (file: File): Promise<string> => { - const headers = { 'Content-Type': 'image/png' }; - return get('/files') - .then(response => response.data) - .then(uploadUrl => axios.put(uploadUrl, file, { headers })) - .then(response => { - const { config: { url } } = response; - return url?.slice(0, url?.indexOf('?')) || ''; - }); - }; - - const resolveFile = async (file?: File | string): Promise<string> => { - if (file instanceof File) return uploadFile(file); - return file || ''; - }; + const { + setValue: setLeft, + progress: progressLeft, + resolve: resolveLeft, + isReady: isLeftReady + } = useS3Preupload(); + const { + setValue: setRight, + progress: progressRight, + resolve: resolveRight, + isReady: isRightReady + } = useS3Preupload(); const handleClick = async () => { - if (readyToSubmit) { - const [leftUrl, rightUrl] = await Promise.all([resolveFile(left), resolveFile(right)]); + if (isLeftReady && isRightReady) { + const [leftUrl, rightUrl] = await Promise.all([resolveLeft(), resolveRight()]); const contents = { left: { url: leftUrl }, @@ -79,18 +74,24 @@ const PollCreation: React.FC = () => { {user && <UserStrip user={user} info="" />} <Divider /> <div className={classes.images}> - <PollCreationImage callback={setLeft} /> - <PollCreationImage callback={setRight} /> + <ImageInput callback={setLeft} progress={progressLeft} /> + <ImageInput callback={setRight} progress={progressRight} /> </div> - <Button - color="primary" - disabled={!readyToSubmit} - variant="contained" - onClick={handleClick} - fullWidth - > - Submit - </Button> + { + progressLeft || progressRight + ? <LinearProgress color="primary" /> + : ( + <Button + color="primary" + disabled={!(isLeftReady && isRightReady)} + variant="contained" + onClick={handleClick} + fullWidth + > + Submit + </Button> + ) + } </Card> </Container> ); |