Skip to content
Snippets Groups Projects
FollowCollectionButton.js 5.39 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/>.*/

Raul Almeida's avatar
Raul Almeida committed
import React, { useState, useEffect } 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';
Raul Almeida's avatar
Raul Almeida committed
import axios from 'axios';
lfr20's avatar
lfr20 committed
import { apiUrl } from '../env';
Raul Almeida's avatar
Raul Almeida committed

export default function FollowCollectionButton(props) {
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);
Raul Almeida's avatar
Raul Almeida committed
	const [following, setFollowing] = useState(false); //user following collection
Raul Almeida's avatar
Raul Almeida committed

Raul Almeida's avatar
Raul Almeida committed
	useEffect(() => {
lfr20's avatar
lfr20 committed
		const url = apiUrl + '/users/' + props.user_id + '/following/Collection';
		console.log("props: ", props);
		axios({
			method: 'get',
			url: url,
			headers: {
				'Accept': 'application/json',
				'Content-Type': 'application/json; charset=utf-8',
				'access-token': sessionStorage.getItem('@portalmec/accessToken'),
				'client': sessionStorage.getItem('@portalmec/clientToken'),
				'uid': sessionStorage.getItem('@portalmec/uid'),
				'If-None-Match': null
			},
		}).then(response => {
			const data = [...response.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						
lfr20's avatar
lfr20 committed
				})
			SaveNewHeaders(response)
		})
	}, []);
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

lfr20's avatar
lfr20 committed
	const SaveNewHeaders = (response) => {
		if (
			(response.headers['access-token'] === undefined || response.headers['access-token'] === null) &&
			(response.headers.client === undefined || response.headers.client === null)
		) {

		} else {
			sessionStorage.setItem('@portalmec/accessToken', response.headers['access-token'])
			sessionStorage.setItem('@portalmec/clientToken', response.headers.client)
			console.log('saved')
		}
	}

Raul Almeida's avatar
Raul Almeida committed
	const handleClick = () => {
		if (!props.user_id)
			setSignUpOpen(true);
		else if (!following) {
lfr20's avatar
lfr20 committed
			const url = apiUrl + '/collections/' + props.collection_id + '/follow';
Raul Almeida's avatar
Raul Almeida committed
			setVariant("contained");
			setButtonText("Seguindo");
lfr20's avatar
lfr20 committed
			setIcon(<CheckIcon fontSize="large" />)
Raul Almeida's avatar
Raul Almeida committed
			setFollowing(true);
lfr20's avatar
lfr20 committed
			axios({
				method: 'put',
				url: url,
				headers: {
					'Accept': 'application/json',
					'Content-Type': 'application/json; charset=utf-8',
					'access-token': sessionStorage.getItem('@portalmec/accessToken'),
					'client': sessionStorage.getItem('@portalmec/clientToken'),
					'uid': sessionStorage.getItem('@portalmec/uid'),
					'If-None-Match': null
				},
			}).then(response => {
				if (response.status === 201)
					setFollowing(true);
				else if (response.status === 200)
					setFollowing(false);
				SaveNewHeaders(response)
			})
Raul Almeida's avatar
Raul Almeida committed
		} else {
lfr20's avatar
lfr20 committed
			const url = apiUrl + '/collections/' + props.collection_id + '/follow';
Raul Almeida's avatar
Raul Almeida committed
			setVariant("outlined");
lfr20's avatar
lfr20 committed
			setButtonText("Seguir Coleção");
			setIcon(<AddIcon fontSize="large" />);
Raul Almeida's avatar
Raul Almeida committed
			setFollowing(false);
lfr20's avatar
lfr20 committed
			axios({
				method: 'put',
				url: url,
				headers: {
					'Accept': 'application/json',
					'Content-Type': 'application/json; charset=utf-8',
					'access-token': sessionStorage.getItem('@portalmec/accessToken'),
					'client': sessionStorage.getItem('@portalmec/clientToken'),
					'uid': sessionStorage.getItem('@portalmec/uid'),
					'If-None-Match': null
				},
			}).then(response => {
				if (response.status === 201)
					setFollowing(true);
				else if (response.status === 200)
					setFollowing(false);
				SaveNewHeaders(response)
			})
Raul Almeida's avatar
Raul Almeida committed
		}
	if (!props.user_is_owner)
Raul Almeida's avatar
Raul Almeida committed
		return (
			<div>
				<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)} />
			</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
`