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

lfr20's avatar
lfr20 committed
import React, { useState, useContext } from 'react'
import { Store } from '../Store.js'
Raul Almeida's avatar
Raul Almeida committed
import styled from 'styled-components'
import Grid from '@material-ui/core/Grid';
import { Button } from '@material-ui/core';
lfr20's avatar
lfr20 committed
import { Link } from 'react-router-dom'
import { apiDomain } from '../env';
Raul Almeida's avatar
Raul Almeida committed
import noAvatar from "../img/default_profile.png";
import Rating from '@material-ui/lab/Rating';
import StarBorderIcon from '@material-ui/icons/StarBorder';
import EditIcon from '@material-ui/icons/Edit';
import TextField from "@material-ui/core/TextField";
import Menu from '@material-ui/core/Menu';
import MenuItem from '@material-ui/core/MenuItem';
import ModalExcluir from './ModalExcluirComentario.js'
lfr20's avatar
lfr20 committed
import { putRequest, deleteRequest } from './HelperFunctions/getAxiosConfig'
Raul Almeida's avatar
Raul Almeida committed

lfr20's avatar
lfr20 committed
export default function Comment(props) {
Raul Almeida's avatar
Raul Almeida committed

    /*
    Required props:
        rerenderCallback = callback function to trigger re-render on parent component
        reviewRatings = required to update comment even though the user cannot update their rating score...
        objectID = collection/learning object id
        reviewID = self-explanatory I hope
        authorID = author id; links to public user page
        authorAvatar = either a string denoting the author's avatar file location or null
        rating = star rating
        name = title (?)
        authorName = author username
        description = the  user comment itself
        createdAt
        recurso : boolean; determines whether to display orange or purple font
    */
    var moment = require('moment')

lfr20's avatar
lfr20 committed
    const { state } = useContext(Store)
Raul Almeida's avatar
Raul Almeida committed
    const [displayedComment, setDisplayedComment] = useState(props.description)
    const [editando, setEditando] = useState(false)
    const [anchorEl, setAnchorEl] = React.useState(null);
    const handleClick = (event) => {
        setAnchorEl(event.currentTarget);
    };
    const handleClose = () => {
        setAnchorEl(null);
    };
    const [modalOpen, toggleModal] = useState(false)

    const [comment, setComment] = useState({
lfr20's avatar
lfr20 committed
        error: false,
        value: props.description
Raul Almeida's avatar
Raul Almeida committed
    })
    const handleChange = (e) => {
        const userInput = e.target.value
        const flag = (userInput.length === 0 ? true : false);
lfr20's avatar
lfr20 committed
        setComment({ ...comment, error: flag, value: userInput })
lfr20's avatar
lfr20 committed
    function handleOnSuccessfulComment(data) {
        setDisplayedComment(comment.value)
        setEditando(false)
lfr20's avatar
lfr20 committed
        props.handlePost()
Raul Almeida's avatar
Raul Almeida committed
    const updateComment = () => {
        const finalComment = comment
lfr20's avatar
lfr20 committed
        let url;

        if (props.isCollection)
            url = `/collections/${props.objectID}/reviews/${props.reviewID}`
        else
            url = `/learning_objects/${props.objectID}/reviews/${props.reviewID}`

Raul Almeida's avatar
Raul Almeida committed
        if (!finalComment.error) {
Raul Almeida's avatar
Raul Almeida committed
            let payload = {
lfr20's avatar
lfr20 committed
                "review": {
                    "description": finalComment.value,
                    "review_ratings_attributes": props.reviewRatings
Raul Almeida's avatar
Raul Almeida committed
                }
            }
lfr20's avatar
lfr20 committed
            putRequest(url, payload, handleOnSuccessfulComment, (error) => { console.log(error) })
lfr20's avatar
lfr20 committed
    function handleSuccessDeleteComment(data) {
lfr20's avatar
lfr20 committed
        props.handleSnackbar()
Raul Almeida's avatar
Raul Almeida committed
    const deleteComment = () => {
lfr20's avatar
lfr20 committed
        let url;
lfr20's avatar
lfr20 committed
        if (props.isCollection)
            url = `/collections/${props.objectID}/reviews/${props.reviewID}`
        else
            url = `/learning_objects/${props.objectID}/reviews/${props.reviewID}`

        deleteRequest(url, handleSuccessDeleteComment, (error) => { console.log(error) })
Raul Almeida's avatar
Raul Almeida committed

        toggleModal(false)

    }

    return (
        <React.Fragment>
lfr20's avatar
lfr20 committed
            <ModalExcluir
                open={modalOpen} handleClose={() => { toggleModal(false) }}
                handleConfirm={deleteComment}
Raul Almeida's avatar
Raul Almeida committed
            />
lfr20's avatar
lfr20 committed
            <Grid container style={{ paddingLeft: "20px" }}>
Raul Almeida's avatar
Raul Almeida committed

lfr20's avatar
lfr20 committed
                <Grid item xs={1}>
Raul Almeida's avatar
Raul Almeida committed
                    {
lfr20's avatar
lfr20 committed
                        props.authorID &&
                        <AvatarDiv>
                            <Link to={'/usuario-publico/' + props.authorID}>
                                <img src={props.authorAvatar ? apiDomain + props.authorAvatar : noAvatar} alt="author avatar" />
                            </Link>
                        </AvatarDiv>
Raul Almeida's avatar
Raul Almeida committed
                    }
lfr20's avatar
lfr20 committed
                </Grid>
Raul Almeida's avatar
Raul Almeida committed

lfr20's avatar
lfr20 committed
                <Grid item xs={10}>
                    <Comentario>
                        <div className="star-rating-container">
                            <Rating
                                name="read-only"
                                value={props.rating}
                                readOnly
                                size="small"
                                style={{ color: "#666" }}
                                emptyIcon={<StarBorderIcon fontSize="inherit" style={{ color: "#a5a5a5" }} />}
                            />
                        </div>
lfr20's avatar
lfr20 committed
                            props.name &&
                            <strong>{props.name}</strong>
                        }

                        <div>
                            {
                                editando ?
                                    (
                                        <React.Fragment>
                                            <div style={{ marginTop: "5%", padding: "2px" }}>
                                                <StyledTextField
                                                    colecao={!props.recurso}
                                                    id="input-comentario"
                                                    label={"Editar Comentário"}
                                                    margin="normal"
                                                    value={comment.value}
                                                    multiline={true}
                                                    rows="5"
                                                    onChange={(e) => { handleChange(e) }}
                                                    style={{ width: "100%" }}
                                                />
                                            </div>
                                            <div style={{ float: "right" }}>
                                                <StyledButton
                                                    style={props.recurso ? { backgroundColor: "#ff7f00" } : { backgroundColor: "#673ab7" }}
                                                    onClick={() => { setEditando(false) }}
                                                >
                                                    Fechar
Raul Almeida's avatar
Raul Almeida committed
                                    </StyledButton>
lfr20's avatar
lfr20 committed
                                                <StyledButton
                                                    style={props.recurso ? { backgroundColor: "#ff7f00" } : { backgroundColor: "#673ab7" }}
                                                    onClick={() => updateComment()}
Raul Almeida's avatar
Raul Almeida committed
                                                >
lfr20's avatar
lfr20 committed
                                                    Salvar
                                    </StyledButton>
                                            </div>
                                        </React.Fragment>
                                    )
                                    :
                                    (
                                        <React.Fragment>
                                            <p>
                                                {
                                                    props.authorID &&
                                                    <Link
                                                        to={'/usuario-publico/' + props.authorID}
                                                        style={{
                                                            fontWeight: "bolder",
                                                            color: props.recurso ? "#ff7f00" : "#673ab7"
                                                        }}
                                                    >
                                                        {props.authorName}
                                                    </Link>
                                                }
Raul Almeida's avatar
Raul Almeida committed
                                        : {displayedComment}
lfr20's avatar
lfr20 committed
                                            </p>
                                            {
                                                props.authorID !== state.currentUser.id &&
                                                <span className="date">
                                                    {moment(props.createdAt).format("DD/MM/YYYY")}
                                                </span>
                                            }
                                        </React.Fragment>
                                    )
                            }
                        </div>
Raul Almeida's avatar
Raul Almeida committed

lfr20's avatar
lfr20 committed
                    </Comentario>
                </Grid>
Raul Almeida's avatar
Raul Almeida committed

lfr20's avatar
lfr20 committed
                {
                    props.authorID === state.currentUser.id &&
                    <Grid item xs={1}>
                        <StyledDiv>
                            <Button onClick={handleClick}><EditIcon /></Button>
Raul Almeida's avatar
Raul Almeida committed
                            <Menu
                                id="simple-menu"
                                anchorEl={anchorEl}
                                keepMounted
                                open={Boolean(anchorEl)}
                                onClose={handleClose}
                            >
lfr20's avatar
lfr20 committed
                                <MenuItem onClick={() => { setEditando(true); handleClose() }}>Editar</MenuItem>
                                <MenuItem onClick={() => { toggleModal(true); handleClose() }}>Excluir</MenuItem>
Raul Almeida's avatar
Raul Almeida committed
                            </Menu>
lfr20's avatar
lfr20 committed
                        </StyledDiv>
                    </Grid>
                }
            </Grid>
Raul Almeida's avatar
Raul Almeida committed
        </React.Fragment>
    )
}

const StyledTextField = styled(TextField)`
    label.Mui-focused {
        color : ${props => props.colecao ? "rgb(103,58,183)" : "rgb(255,127,0)"};
    }

    .MuiInput-underline::after {
        border-bottom: ${props => props.colecao ? "2px solid rgb(103,58,183)" : "2px solid rgb(255,127,0)"};
    }

`

const StyledDiv = styled.div`
     text-align : center;
     .MuiButton-root {
         @media screen and (max-width: 990px) {
             padding-right : 35px !important;
         }
     }
`
const StyledButton = styled(Button)`
    color : rgba(255,255,255,0.87) !important;
    box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important;
    margin : 6px 8px !important;
    font-weight : 600 !important;
`

const Comentario = styled.div`
    @media screen and (max-width: 990px) {
        padding-left : 55px !important;
    }
    font-size : 14px;

    .star-rating-container {
        width : 100px;
    }

    p {
        margin : 0 0 10px;
        padding-left : 2px
    }

    a {
        text-decoration : none !important;
    }

    .date {
        color : #ababab;
        font-size : 12px;
        font-weight : lighter;
        padding-left : 3px;
    }
`

const AvatarDiv = styled.div`
    text-align : center;
    float : left;
    position : relative;
    width : 65px;
    height : 65px;
    a {
        text-decoration : none !important;
    }

    img {
        width : 100% !important;
        height : 100% !important;
        border-radius : 100%
        vertical-align : middle;
    }
`