diff --git a/src/Components/CollectionReview.js b/src/Components/CollectionReview.js index 10cc202c3ff6f3908aeb09c7d0d4fb567505fddb..c9dc801016a770dd65acd4378c9db395b6c4d945 100644 --- a/src/Components/CollectionReview.js +++ b/src/Components/CollectionReview.js @@ -27,7 +27,7 @@ import { Store } from '../Store.js' import ReportModal from './ReportModal.js'; import SignUpModal from './SignUpModal.js'; import LoginModal from './LoginModal.js'; -import {putRequest, getRequest} from './HelperFunctions/getAxiosConfig.js' +import { putRequest, getRequest } from './HelperFunctions/getAxiosConfig.js' export default function CollectionReview(props) { const [likes, setLikes] = useState(0); @@ -38,31 +38,31 @@ export default function CollectionReview(props) { const [log_in_open, setLoginOpen] = useState(false); const { state } = useContext(Store); - function handleSuccessfulGet (data) { - setLikes(Number(data.likes_count)); - setLiked(data.liked); - } + function handleSuccessfulGet(data) { + setLikes(Number(data.likes_count)); + setLiked(data.liked); + } useEffect(() => { - const url = `/collections/${props.id}` + const url = `/collections/${props.id}` - getRequest(url, handleSuccessfulGet, (error) => {console.log(error)}) + getRequest(url, handleSuccessfulGet, (error) => { console.log(error) }) - }, [props.id]); + }, [props.id, state.currentUser.id]); const handleClickReport = () => { setReportOpen(true); } - function handleSuccess (data) { - setLiked(!liked) - setLikes(data.count) - } + function handleSuccess(data) { + setLiked(!liked) + setLikes(data.count) + } const handleLikeClick = () => { if (state.currentUser.id) { - const url = `/collections/${props.id}/like` - putRequest(url, {}, handleSuccess, (error) => {console.log(error)}) + const url = `/collections/${props.id}/like` + putRequest(url, {}, handleSuccess, (error) => { console.log(error) }) } else setSignUpOpen(true); } @@ -91,7 +91,7 @@ export default function CollectionReview(props) { </Grid> <Grid item justify="center" alignItems="center"> <IconButton aria-label="like" onClick={handleLikeClick}> - {likes}<FavoriteIcon style={{fill : liked ? "red" : null}} /> + {likes}<FavoriteIcon style={{ fill: liked ? "red" : null }} /> </IconButton> </Grid> </Grid> diff --git a/src/Components/FollowCollectionButton.js b/src/Components/FollowCollectionButton.js index be01ad44329cfe45b7ca167a4111d721cd8f7e7a..974a56fd3492cf7440b46679794fb061ea237e7a 100644 --- a/src/Components/FollowCollectionButton.js +++ b/src/Components/FollowCollectionButton.js @@ -16,37 +16,77 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useContext } from 'react'; import Button from '@material-ui/core/Button'; import CheckIcon from '@material-ui/icons/Check'; import AddIcon from '@material-ui/icons/Add'; import styled from 'styled-components'; import SignUpModal from './SignUpModal.js'; -import {getRequest, putRequest} from './HelperFunctions/getAxiosConfig' +import LoginModal from './LoginModal'; +import SnackBarComponent from './SnackbarComponent'; +import { getRequest, putRequest } from './HelperFunctions/getAxiosConfig' +import { Store } from '../Store' export default function FollowCollectionButton(props) { + const { state } = useContext(Store) const [icon, setIcon] = useState(<AddIcon fontSize="large" />); const [button_text, setButtonText] = useState("Seguir Coleção"); const [variant, setVariant] = useState("outlined"); const [sign_up_open, setSignUpOpen] = useState(false); + const [open_login, setOpenLogin] = useState(false); + const [snackInfo, setSnackInfo] = useState({ + open: false, + text: '', + severity: '', + color: '' + }); const [following, setFollowing] = useState(false); //user following collection - function handleSuccessGet (data) { - if(data) - data.map((e) => { - if (e["followable"]["id"] === Number(props.collection_id)){ - setVariant("contained"); - setButtonText("Seguindo"); - setIcon(<CheckIcon fontSize="large" />) - setFollowing(true); - } - return undefined - }) - } + function handleSuccessGet(data) { + if (!data.errors) + data.map((e) => { + if (e["followable"]["id"] === Number(props.collection_id)) { + setVariant("contained"); + setButtonText("Seguindo"); + setIcon(<CheckIcon fontSize="large" />) + setFollowing(true); + } + return undefined + }) + else { + const info = { + open: true, + text: 'Falha ao verificar se o usuário segue a coleção!', + severity: 'error', + color: 'red' + } + + handleSnackInfo(info) + } + } useEffect(() => { - const url = `/users/${props.user_id}/following/Collection` - getRequest(url, handleSuccessGet, (error) => console.log(error)) - }, []); + if (state.currentUser.id) { + const url = `/users/${props.user_id}/following/Collection` + getRequest( + url, + handleSuccessGet, + (error) => { + const info = { + open: true, + text: 'Falha ao verificar se o usuário segue a coleção!', + severity: 'error', + color: 'red' + } + handleSnackInfo(info) + }) + } + else { + setIcon(<AddIcon fontSize="large" />) + setButtonText("Seguir Coleção") + setVariant("outlined") + setFollowing(false) + } + }, [state.currentUser.id]); //handleMouse{Enter, Leave} only do anything when user follows given collection: const handleMouseEnter = () => { @@ -65,33 +105,120 @@ export default function FollowCollectionButton(props) { } } - function handleSuccessfulFollow (data) { - setVariant("contained"); - setButtonText("Seguindo"); - setIcon(<CheckIcon fontSize="large" />) - setFollowing(true); - } - function handleSuccessfulUnfollow (data) { - setVariant("outlined"); - setButtonText("Seguir Coleção"); - setIcon(<AddIcon fontSize="large" />); - setFollowing(false); - } + function handleOpenSnackSignIn() { + const info = { + open: true, + text: 'Você foi logado com sucesso!', + severity: 'success', + color: '', + } + + handleSnackInfo(info) + } + + function handleCloseSnack() { + setSnackInfo({ + open: false, + text: '', + severity: '', + color: '', + }) + } + + function handleSnackInfo(info) { + setSnackInfo({ + ...info + }) + } + + function handleOpenLogin() { + setOpenLogin(true) + } + + function handleOpenSignUp() { + setSignUpOpen(true) + } + + function handleSuccessfulFollow(data) { + if (data.errors) { + setVariant("contained"); + handleFailFollow() + } + else { + const info = { + open: true, + text: 'Sucesso ao seguir a coleção!', + severity: 'success', + color: 'green' + } + handleSnackInfo(info) + setVariant("contained"); + setButtonText("Seguindo"); + setIcon(<CheckIcon fontSize="large" />) + setFollowing(true); + } + } + + function handleFailFollow(err) { + const info = { + open: true, + text: 'Falha ao seguir coleção', + severity: 'fail', + color: 'red', + } + handleSnackInfo(info) + } + + function handleSuccessfulUnfollow(data) { + if (data.errors) + handleFailUnfollow() + else { + const info = { + open: true, + text: 'Sucesso ao deixar de seguir a coleção!', + severity: 'success', + color: 'green' + } + handleSnackInfo(info) + setVariant("outlined"); + setButtonText("Seguir Coleção"); + setIcon(<AddIcon fontSize="large" />); + setFollowing(false); + } + } + + function handleFailUnfollow(err) { + const info = { + open: true, + text: 'Falha ao deixar de seguir coleção', + severity: 'error', + color: 'red', + } + handleSnackInfo(info) + } + const handleClick = () => { - const url = `/collections/${props.collection_id}/follow` + const url = `/collections/${props.collection_id}/follow` if (!props.user_id) setSignUpOpen(true); else if (!following) { - putRequest(url, {}, handleSuccessfulFollow, (error) => {console.log(error)}) + putRequest(url, {}, handleSuccessfulFollow, handleFailFollow) } else { - putRequest(url, {}, handleSuccessfulUnfollow, (error) => {console.log(error)}) + putRequest(url, {}, handleSuccessfulUnfollow, handleFailUnfollow) } }; if (!props.user_is_owner) return ( <div> + <SnackBarComponent + snackbarOpen={snackInfo.open} + handleClose={handleCloseSnack} + severity={snackInfo.severity} + text={snackInfo.text} + color={snackInfo.color} + /> <FollowButton variant={variant} color="primary" @@ -103,7 +230,17 @@ export default function FollowCollectionButton(props) { > <ButtonText>{button_text}</ButtonText> </FollowButton> - <SignUpModal open={sign_up_open} handleClose={() => setSignUpOpen(false)} /> + <SignUpModal + open={sign_up_open} + handleClose={() => setSignUpOpen(false)} + openLogin={handleOpenLogin} + /> + <LoginModal + openSnackbar={handleOpenSnackSignIn} + open={open_login} + handleClose={() => setOpenLogin(false)} + openSignUp={handleOpenSignUp} + /> </div> ); else return (<div></div>); diff --git a/src/Components/ResourceCardOptions.js b/src/Components/ResourceCardOptions.js index 81d9286c5d0671f8885250daf08f2a4e601b3c87..5d2821f3d9a39cc92af23d5ff1fa7c71de868777 100644 --- a/src/Components/ResourceCardOptions.js +++ b/src/Components/ResourceCardOptions.js @@ -40,6 +40,7 @@ import SignUpModal from './SignUpModal' import LoginModal from './LoginModal.js' import Snackbar from '@material-ui/core/Snackbar'; import MuiAlert from '@material-ui/lab/Alert'; +import { getRequest } from './HelperFunctions/getAxiosConfig' export default function ResourceCardOptions(props) { const { state } = useContext(Store) @@ -78,6 +79,13 @@ export default function ResourceCardOptions(props) { const enableDownload = () => { const url = props.downloadableLink window.open(url, '_blank'); + getRequest( + `/learning_objects/${props.learningObjectId}/download`, + (data, header) => { + }, + (error) => { + } + ) toggleSnackbar(true) } diff --git a/src/Pages/CollectionPage.js b/src/Pages/CollectionPage.js index b0bfdeb7db587ccfa45f4d11ef030f330978322f..3ccb5ab1929d32cc3be204d59fa939664b85596f 100644 --- a/src/Pages/CollectionPage.js +++ b/src/Pages/CollectionPage.js @@ -29,7 +29,7 @@ import Breadcrumbs from "@material-ui/core/Breadcrumbs"; import { Link } from 'react-router-dom'; import FollowCollectionButton from '../Components/FollowCollectionButton'; import { Store } from '../Store.js' -import {getRequest} from '../Components/HelperFunctions/getAxiosConfig.js' +import { getRequest } from '../Components/HelperFunctions/getAxiosConfig.js' export default function CollectionPage(props) { const { state } = useContext(Store); @@ -42,13 +42,13 @@ export default function CollectionPage(props) { const comment_ref = useRef(null); useEffect(() => { - const url = `/collections/${collection_id}` + const url = `/collections/${collection_id}` - getRequest(url, (data) => {setCollection(Object.assign({}, data))}, (error) => {console.log(error)}) + getRequest(url, (data) => { setCollection(Object.assign({}, data)) }, (error) => { console.log(error) }) }, []); const handleScrollToComments = () => { - window.scrollTo(0, comment_ref.current.offsetTop); + comment_ref.current.scrollIntoView({ behavior: 'smooth' }) } return ( <> @@ -78,7 +78,7 @@ export default function CollectionPage(props) { <DowloadButton id={collection.id ? collection.id : 0} /> - <div style={{height : 12}}></div> + <div style={{ height: 12 }}></div> <FollowCollectionButton user_id={state.currentUser.id} collection_id={collection_id} /> @@ -87,7 +87,7 @@ export default function CollectionPage(props) { <VerticalRuler width={1} height={100} color="rgb(238, 238, 238)" /> - <Grid container justify="center" style={{ backgroundColor: '#f4f4f4'}}> + <Grid container justify="center" style={{ backgroundColor: '#f4f4f4' }}> {/* <Grid item xs={1}/> */} <Grid item xs={10}> <ResourceList resources={ @@ -113,7 +113,7 @@ export default function CollectionPage(props) { } /> </Grid> - <Grid container item xs={12} style={{ marginTop: 40, paddingBottom:40 }} ref={comment_ref}> + <Grid container item xs={12} style={{ marginTop: 40, paddingBottom: 40 }} ref={comment_ref}> <CollectionCommentSection id={collection_id} /> </Grid> </Grid>