Skip to content
Snippets Groups Projects
CommentsArea.js 14.4 KiB
Newer Older
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder 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/>.*/

lfr20's avatar
lfr20 committed
import React, { useState, useContext, useEffect } from 'react'
import { Store } from '../../Store.js'
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
import styled from 'styled-components'
import Grid from '@material-ui/core/Grid';
import { Button } from '@material-ui/core';
import ExitToAppIcon from '@material-ui/icons/ExitToApp';
lfr20's avatar
lfr20 committed
import { apiDomain } from '../../env';
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
import CommentForm from './CommentForm.js'
import Comment from '../Comment.js'
lfr20's avatar
lfr20 committed
import { getRequest } from '../HelperFunctions/getAxiosConfig'
import LoginModal from './../LoginModal.js'
import Snackbar from '@material-ui/core/Snackbar';
import SignUpModal from './../SignUpModal'
import MuiAlert from '@material-ui/lab/Alert';
lfr20's avatar
lfr20 committed
import CircularProgress from '@material-ui/core/CircularProgress';
lfr20's avatar
lfr20 committed
import IconButton from '@material-ui/core/IconButton';
import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';
import SnackBarComponent from '../../Components/SnackbarComponent';
//Image Import
import { Comentarios } from "ImportImages.js"; 
import { noAvatar } from "ImportImages.js"; 

function Alert(props) {
    return <MuiAlert elevation={6} variant="filled" {...props} />;
}
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed

lfr20's avatar
lfr20 committed
export default function CommentsArea(props) {
    const { state } = useContext(Store)
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
    const [comentarios, setComentarios] = useState([])
lfr20's avatar
lfr20 committed
    const [totalReviews, setTotalReviews] = useState(0);
    const [currPageReviews, setCurrPageReviews] = useState(0);
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
    const [gambiarra, setState] = useState(0)
    const forceUpdate = () => { setCurrPageReviews(0); setState(gambiarra + 1); }
    const [loginOpen, setLogin] = useState(false)
    const [successfulLoginOpen, handleSuccessfulLogin] = useState(false)
    const [signUpOpen, setSignUp] = useState(false)
lfr20's avatar
lfr20 committed
    const [isLoading, setIsLoading] = useState(false)
lfr20's avatar
lfr20 committed
    const [snackInfo, setSnackInfo] = useState({
        open: false,
        text: '',
        severity: '',
        color: ''
    });

    function handleSnackInfo(info) {
        setSnackInfo({
            ...info
        })
    }

    function handleCloseSnack() {
        setSnackInfo({
            open: false,
            text: '',
            severity: '',
            color: '',
        })
    }

    const handleSignUp = () => {
        setSignUp(!signUpOpen)
    }

    const handleLogin = () => {
        setLogin(!loginOpen)
    }

lfr20's avatar
lfr20 committed
    const handlePost = () => {
        props.handleSnackbar(2)
    }

    const toggleSnackbar = (event, reason) => {
        if (reason === 'clickaway') {
            return;
        }
lfr20's avatar
lfr20 committed

        handleSuccessfulLogin(false);
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed

lfr20's avatar
lfr20 committed
    function handleLoadMoreReviews() {
        if (comentarios.length !== parseInt(totalReviews))
            setCurrPageReviews((previous) => previous + 1)
        else {
            const info = {
                open: true,
                text: 'Não há mais comentários para carregar.',
                severity: 'warning',
                color: '',
            }
            handleSnackInfo(info)
        }
    }

    function handleSuccess(data, headers) {
lfr20's avatar
lfr20 committed
        setIsLoading(false)
        if (currPageReviews !== 0)
            setComentarios((previous) => previous.concat(data.sort((a, b) => a.updated_at > b.updated_at ? -1 : 1)))
        else   
            setComentarios(data.sort((a, b) => a.updated_at > b.updated_at ? -1 : 1)) 
lfr20's avatar
lfr20 committed
        if (headers.has('X-Total-Count'))
            setTotalReviews(headers.get('X-Total-Count'))
lfr20's avatar
lfr20 committed
    useEffect(() => {
        setIsLoading(true)
lfr20's avatar
lfr20 committed
        const url = `/learning_objects/${props.recursoId}/reviews?page=${currPageReviews}`
lfr20's avatar
lfr20 committed
        getRequest(url, handleSuccess, (error) => { console.log(error); setIsLoading(false) })
lfr20's avatar
lfr20 committed
    }, [gambiarra, currPageReviews])
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed

    return (
lfr20's avatar
lfr20 committed
            <SnackBarComponent
                snackbarOpen={snackInfo.open}
                handleClose={handleCloseSnack}
                severity={snackInfo.severity}
                text={snackInfo.text}
                color={snackInfo.color}
            />
            <Snackbar open={successfulLoginOpen} autoHideDuration={1000} onClose={toggleSnackbar}
                anchorOrigin={{ vertical: 'top', horizontal: 'center' }}
            >
                <Alert severity="success" style={{ backgroundColor: "#00acc1" }}>Você está conectado(a)!</Alert>
            </Snackbar>
            {/*-------------------------------MODALS---------------------------------------*/}
vgm18's avatar
vgm18 committed
            <LoginModal contrast={props.contrast} open={loginOpen} handleClose={() => setLogin(false)} openSignUp={handleSignUp}
                openSnackbar={() => { handleSuccessfulLogin(true) }}
            />
vgm18's avatar
vgm18 committed
            <SignUpModal contrast={props.contrast} open={signUpOpen} handleClose={handleSignUp} openLogin={handleLogin} />
lfr20's avatar
lfr20 committed
            {/*----------------------------------------------------------------------------*/}
            <Grid container spacing={2} style={{ padding: "10px" }}>
lfr20's avatar
lfr20 committed
                                <GrayContainer contrast={state.contrast}>
                                    <h3>Conte sua experiência com o Recurso</h3>
lfr20's avatar
lfr20 committed
                                    <Grid container style={{ paddingTop: "20px" }} spacing={1}>
                                        <Grid item xs={12} sm={2} style={{ paddingLeft: "15px", paddingRight: "15px" }}>
                                            <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
lfr20's avatar
lfr20 committed
                                                <img src={state.currentUser.avatar ? apiDomain + state.currentUser.avatar : noAvatar} className="minha-imagem" alt="user avatar" />
lfr20's avatar
lfr20 committed
                                            </div>
lfr20's avatar
lfr20 committed
                                        <Grid item xs={12} sm={10}>
lfr20's avatar
lfr20 committed
                                                contrast={state.contrast}
                                                recursoId={props.recursoId}
                                                handleSnackbar={props.handleSnackbar}
                                                rerenderCallback={forceUpdate}
                                                recurso={props.recurso}
lfr20's avatar
lfr20 committed
                                            />
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
                                    </Grid>
lfr20's avatar
lfr20 committed
                                <LogInToComment contrast={state.contrast}>
                                    <span className="span-laranja">Você precisa entrar para comentar</span>
lfr20's avatar
lfr20 committed
                                    <Button onClick={() => handleLogin(true)} style={state.contrast === "" ? { textTransform: "uppercase", color: "#666", fontWeight: "700" } : { textTransform: "uppercase", color: "yellow", fontWeight: "700", textDecoration: "underline" }}>
                                        <ExitToAppIcon style={state.contrast === "" ? { color: "inherit" } : { color: "white" }} />ENTRAR
lfr20's avatar
lfr20 committed
                    isLoading ?
lfr20's avatar
lfr20 committed
                        <LoadingDiv contrast={state.contrast}>
lfr20's avatar
lfr20 committed
                            <CircularProgress className="loading" />
                        </LoadingDiv>
                        :
lfr20's avatar
lfr20 committed
                        totalReviews !== 0 ?
lfr20's avatar
lfr20 committed
                                <ComentariosBox contrast={state.contrast}>
lfr20's avatar
lfr20 committed
                                    <h3>{totalReviews} {totalReviews !== 1 ? 'Relatos' : 'Relato'} sobre o uso do Recurso</h3>
lfr20's avatar
lfr20 committed
                                        comentarios.map(comentario =>
                                            <div className="comentario-template" key={comentario.id}>
                                                <Comment
lfr20's avatar
lfr20 committed
                                                    contrast={state.contrast}
lfr20's avatar
lfr20 committed
                                                    isCollection={false}
                                                    authorID={comentario.user ? comentario.user.id : null}
                                                    authorAvatar={comentario.user ? comentario.user.avatar : null}
                                                    authorName={comentario.user ? comentario.user.name : null}
                                                    name={comentario.name}
                                                    rating={comentario.rating_average}
                                                    reviewRatings={comentario.review_ratings}
                                                    description={comentario.description}
                                                    createdAt={comentario.created_at}
                                                    recurso={true}
                                                    reviewID={comentario.id}
                                                    objectID={props.recursoId}
lfr20's avatar
lfr20 committed
                                                    handlePost={handlePost}
lfr20's avatar
lfr20 committed
                                                    rerenderCallback={forceUpdate}
                                                    handleSnackbar={props.handleSnackbar}
                                                />
                                            </div>
lfr20's avatar
lfr20 committed
                                    <div className="load-more">
                                        <IconButton className="button" onClick={handleLoadMoreReviews}>
lfr20's avatar
lfr20 committed
                                            <KeyboardArrowDownIcon className="icon" />
lfr20's avatar
lfr20 committed
                                        </IconButton>
                                    </div>
lfr20's avatar
lfr20 committed
                            )
                            :
                            (
                                <Grid item xs={12}>
lfr20's avatar
lfr20 committed
                                    <LogInToComment contrast={state.contrast}>
lfr20's avatar
lfr20 committed
                                        <img alt="" src={Comentarios} />
                                        <span className="span-laranja">Compartilhe sua experiência com a Rede!</span>
lfr20's avatar
lfr20 committed
                                        <AoRelatar contrast={state.contrast}>
lfr20's avatar
lfr20 committed
                                            Ao relatar sua experiência de uso do Recurso você estará auxiliando professores de todo país.
lfr20's avatar
lfr20 committed
                                        </AoRelatar>
lfr20's avatar
lfr20 committed
                                    </LogInToComment>
                                </Grid>
                            )
lfr20's avatar
lfr20 committed
const LoadingDiv = styled.div`
lfr20's avatar
lfr20 committed
    width: 100%;
	margin: 1em auto;
lfr20's avatar
lfr20 committed
	display: flex; 
	justify-content: center; 
	align-items: center;
	.loading{
lfr20's avatar
lfr20 committed
        align-self: center;
lfr20's avatar
lfr20 committed
        color: ${props => props.contrast === "" ? "#ff7f00" : "white"};
lfr20's avatar
lfr20 committed
		size: 24px; 
	}
`
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed

const ComentariosBox = styled.div`
    display : flex;
    flex-direction : column;
    padding : 20px;
    width : 100%;

    h3 {
        font-family: 'Roboto Light','Roboto Regular',Roboto;
        font-weight: 300;
        font-style: normal;
lfr20's avatar
lfr20 committed
        color: ${props => props.contrast === "" ? "#666" : "white"};
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
        font-size: 1.857em;
        margin: 15px 2%;
        text-align : flex-start;
    }

    .comentario-template {
lfr20's avatar
lfr20 committed
        margin-top: 5px;
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
        padding : 20px 0;
        border-bottom : 1px solid #f4f4f4;
    }
lfr20's avatar
lfr20 committed

	.load-more{
lfr20's avatar
lfr20 committed
        margin-top : 10px;
lfr20's avatar
lfr20 committed
		width: 100%;
		display: flex; 
		flex-direction: row;
		justify-content: center; 
		align-items: center;
	}
		
	.button{
lfr20's avatar
lfr20 committed
        border: ${props => props.contrast === "" ? "0" : "1px solid white"};
lfr20's avatar
lfr20 committed
		box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
lfr20's avatar
lfr20 committed
        :hover{
            background-color: ${props => props.contrast === "" ? "" : "rgba(255,255,0,0.24)"};
        }
lfr20's avatar
lfr20 committed
	}
lfr20's avatar
lfr20 committed

    .icon{
        color: ${props => props.contrast === "" ? "#666" : "yellow"};
    }
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
`
const AoRelatar = styled.div`
    width : 70%;
    font-size : 20px;
    font-weight : 300;
    text-align : center;
    padding-bottom : 20px;
lfr20's avatar
lfr20 committed
    color: ${props => props.contrast === "" ? "#666" : "white"};
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
`

const LogInToComment = styled.div`
    display : flex;
    flex-direction : column;
    text-align : center;
    padding : 20px;
    align-items : center;

    .span-laranja {
        font-size : 24px;
        font-weight : 700;
        padding-bottom : 5px;
lfr20's avatar
lfr20 committed
        color: ${props => props.contrast === "" ? "#ff7f00" : "white"};
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
    }

    img {
        object-fit : contain !important;
        background-color : transparent !important;
    }
`

const GrayContainer = styled.div`
    background-color: ${props => props.contrast === "" ? "white" : "black"};
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
    font-weight : 400;
    font-size : 14px;
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
    padding-bottom : 20px;
    @media screen and (min-width : 990px) {
        padding-right : 15px;
        padding-left : 15px;
    }
Raul Almeida's avatar
Raul Almeida committed
    padding-right : 15px;
    padding-left : 15px;
    padding-bottom : 20px;
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed

    h3 {
        font-family : 'Roboto Light','Roboto Regular',Roboto;
lfr20's avatar
lfr20 committed
        text-align: center;
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
        font-weight: 300;
        font-style: normal;
lfr20's avatar
lfr20 committed
        color: ${props => props.contrast === "" ? "#666" : "white"};
Lucas Eduardo Schoenfelder's avatar
wip
Lucas Eduardo Schoenfelder committed
        font-size: 1.857em;
        margin-bottom : 10px;
        margin-left : 2%;
        margin-top : 2%;
    }

    .minha-imagem {
        height: 60px;
        width: 60px;
        border-radius: 50%;
        margin-left: 2%;
        margin-top: 5%;
    }
    img {
        vertical-align :middle;
    }
`