Skip to content
Snippets Groups Projects
FollowCollectionButton.js 6.17 KiB
Newer Older
Raul Almeida's avatar
Raul Almeida committed
/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre
Departamento de Informatica - Universidade Federal do Parana

This file is part of Plataforma Integrada MEC.

Plataforma Integrada MEC is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Plataforma Integrada MEC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
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, useContext } from 'react';
Raul Almeida's avatar
Raul Almeida committed
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 LoginModal from './LoginModal';
import SnackBarComponent from './SnackbarComponent';
import { getRequest, putRequest } from './HelperFunctions/getAxiosConfig'
import { Store } from '../Store'
Raul Almeida's avatar
Raul Almeida committed

export default function FollowCollectionButton(props) {
	const { state } = useContext(Store)
lfr20's avatar
lfr20 committed
	const [icon, setIcon] = useState(<AddIcon fontSize="large" />);
Raul Almeida's avatar
Raul Almeida committed
	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: ''
	});
Raul Almeida's avatar
Raul Almeida committed
	const [following, setFollowing] = useState(false); //user following collection
Raul Almeida's avatar
Raul Almeida committed

	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)
		}
	}
Raul Almeida's avatar
Raul Almeida committed
	useEffect(() => {
		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]);
Raul Almeida's avatar
Raul Almeida committed

Raul Almeida's avatar
Raul Almeida committed
	//handleMouse{Enter, Leave} only do anything when user follows given collection:
	const handleMouseEnter = () => {
		if (following) {
			setVariant("outlined");
			setButtonText("Deixar de seguir");
			setIcon(null);
		}
	}
lfr20's avatar
lfr20 committed

Raul Almeida's avatar
Raul Almeida committed
	const handleMouseLeave = () => {
		if (following) {
			setVariant("contained");
			setButtonText("Seguindo");
			setIcon(<CheckIcon fontSize="large" />);
		}
	}
Raul Almeida's avatar
Raul Almeida committed

	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)
	}

Raul Almeida's avatar
Raul Almeida committed
	const handleClick = () => {
		const url = `/collections/${props.collection_id}/follow`
Raul Almeida's avatar
Raul Almeida committed
		if (!props.user_id)
			setSignUpOpen(true);
		else if (!following) {
			putRequest(url, {}, handleSuccessfulFollow, handleFailFollow)
Raul Almeida's avatar
Raul Almeida committed
		} else {
			putRequest(url, {}, handleSuccessfulUnfollow, handleFailUnfollow)
Raul Almeida's avatar
Raul Almeida committed
		}
	if (!props.user_is_owner)
Raul Almeida's avatar
Raul Almeida committed
		return (
			<div>
				<SnackBarComponent
					snackbarOpen={snackInfo.open}
					handleClose={handleCloseSnack}
					severity={snackInfo.severity}
					text={snackInfo.text}
					color={snackInfo.color}
				/>
Raul Almeida's avatar
Raul Almeida committed
				<FollowButton
					variant={variant}
					color="primary"
					startIcon={icon}
lfr20's avatar
lfr20 committed
					size="small"
Raul Almeida's avatar
Raul Almeida committed
					onMouseEnter={handleMouseEnter}
					onMouseLeave={handleMouseLeave}
					onClick={handleClick}
				>
					<ButtonText>{button_text}</ButtonText>
				</FollowButton>
				<SignUpModal
					open={sign_up_open}
					handleClose={() => setSignUpOpen(false)}
					openLogin={handleOpenLogin}
				/>
				<LoginModal
					openSnackbar={handleOpenSnackSignIn}
					open={open_login}
					handleClose={() => setOpenLogin(false)}
					openSignUp={handleOpenSignUp}
				/>
Raul Almeida's avatar
Raul Almeida committed
			</div>
		);
lfr20's avatar
lfr20 committed
	else return (<div></div>);
lfr20's avatar
lfr20 committed
const ButtonText = styled.span`
Raul Almeida's avatar
Raul Almeida committed
	font-weight: bolder;
	font-size: 1.2em;
`
lfr20's avatar
lfr20 committed
const FollowButton = styled(Button)`
Raul Almeida's avatar
Raul Almeida committed
	padding-left: 10;
	padding-right: 10;
	width: 250px;
Raul Almeida's avatar
Raul Almeida committed
`