Skip to content
Snippets Groups Projects
CollectionCardFunction.js 14.1 KiB
Newer Older
/*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, useContext} from 'react';
import {Store} from '../Store.js'
import Card from '@material-ui/core/Card';
import {apiDomain, apiUrl} from '../env';
import Options from './CardOptions'
import noAvatar from "../img/default_profile.png";
import { makeStyles } from '@material-ui/core/styles';
import Button from '@material-ui/core/Button';
import styled from 'styled-components'
import Slide from '@material-ui/core/Slide';
import Grid from '@material-ui/core/Grid';
import {StyledCard, CardDiv, CardReaDiv, Footer, LikeCounter, ButtonNoWidth, EnviadoPor, TagContainer} from './ResourceCardFunction.js'
import CardContent from '@material-ui/core/CardContent';
import Rating from '@material-ui/lab/Rating';
import StarBorderIcon from '@material-ui/icons/StarBorder';
import FolderIcon from '@material-ui/icons/Folder';
import FavoriteIcon from '@material-ui/icons/Favorite';
import AddIcon from '@material-ui/icons/Add';
import CheckIcon from '@material-ui/icons/Check';
import LockIcon from '@material-ui/icons/Lock';
import ColCardOwnerOptions from './ColCardOwnerOptions.js'
import ColCardPublicOptions from './ColCardPublicOptions'
import {Link} from 'react-router-dom';

export default function CollectionCardFunction (props) {
    const {state} = useContext(Store)

    const [userAvatar, setUserAvatar] = useState(props.avatar ? (`${apiDomain}` + props.avatar) : noAvatar)

    const [followingHover, handleFollowingHover] = useState(false)
    const toggleFollowingHover = (value) => {handleFollowingHover(value)}

    const [slideIn, setSlide] = useState(false)
    const controlSlide = () => {setSlide(!slideIn)}

    const RenderFollowButton = () => {
        return (
            <FollowButton onClick={() => {console.log("fazer")}}>
                <AddIcon/><span>SEGUIR</span>
            </FollowButton>
        )
    }

    const RenderFollowingButton = () => {
        return (
            <FollowingButton onMouseOver={() => toggleFollowingHover(true)}
                onMouseLeave={() => toggleFollowingHover(false)} onClick={() => {console.log('fazer')}}>
                {
                    followingHover ?
                    (
                        [
                            <span>DEIXAR DE SEGUIR</span>
                        ]
                    )
                    :
                    (
                        [
                            <React.Fragment>
                                <CheckIcon/><span>SEGUINDO</span>
                            </React.Fragment>
                        ]
                    )
                }
            </FollowingButton>
        )
    }

    const SlideAnimationContent = () => {
        return (
            <SlideContentDiv>
                <div style={{display:"flex", flex:"1"}}>{/*marginBottom:10px*/}
                    <SlideAvatarDiv>
                        <img className="img" src={userAvatar} alt="user avatar"/>
                    </SlideAvatarDiv>
                    <EnviadoPor>
                        Enviado por:
                        <br/>
                        <p>{props.author}</p>
                    </EnviadoPor>
                </div>
                {
                props.tags &&
                <TagContainer>
                    <Grid container spacing={1} justify='safe' style={{height : "inherit"}}>
                    {
                        props.tags.map( (tag) =>
                            <Grid item key={tag.id}>
                                <span key={tag.id}>{tag.name}</span>
                            </Grid>
                        )
                    }
                    </Grid>
                </TagContainer>
                }
            </SlideContentDiv>
        )
    }

    return (
        <StyledCard>
            <CardDiv>
                <CardReaDiv>
                    <Header onMouseEnter={controlSlide} onMouseLeave={controlSlide}>
                        {/*slide animation and content*/}
                        <Slide direction="right" in={slideIn} timeout={300}>
                            <Link to={"/colecao-do-usuario/" + props.id} className="text">
                        </Slide>
                        <Slide direction="left" in={!slideIn} timeout={700}>
                            <a href=""> {/*add links to collection later*/}

                                        <UserInfo>
                                            <AvatarDiv>
                                                <img src={userAvatar} alt="user avatar"/>
                                            </AvatarDiv>
                                            <UserAndTitle>
                                                <span>{props.author}</span>
                                                <span className={"col-name"}>{props.name}</span>
                                            </UserAndTitle>
                                        </UserInfo>


                                <StyledGrid container direction="row">
                                    {
                                        props.thumbnails.map( (thumb) =>
                                            <Grid item xs={props.thumbnails <= 4 && props.thumbnails > 0 ? 12/props.thumbnails.length : 6}>
                                                <div style={{backgroundImage : `url(${ `${apiDomain}` + thumb})`, height : "100%", width : "100%", backgroundSize : "cover", backgroundPosition : "center"}}/>
                                            </Grid>
                                        )
                                    }
                                </StyledGrid>
                            </a>
                        </Slide>
                    </Header>

                    <Description> {/*renders rating, number of learning objects and likes count*/}
                        {
                            props.authorID !== state.currentUser.id &&
                            <Rating
                              name="customized-empty"
                              value={props.rating*10}
                              precision={0.5}
                              style={{color:"#666"}}
                              emptyIcon={<StarBorderIcon fontSize="inherit" />}
                            />
                        }

                        <Footer>
                            <Type>
                                <FolderIcon />
                                <span style={{fontWeight:"bold"}}>{props.thumbnails.length} </span>
                                <span>{props.thumbnails.length != 1 ? "Recursos" : "Recurso"}</span>
                            </Type>
                            <LikeCounter>
                                <span>{props.likeCount}</span>
                                <ButtonNoWidth>
                                    <FavoriteIcon style={{color : props.liked ? "red" : "#666" }}/>
                                </ButtonNoWidth>
                            </LikeCounter>
                        </Footer>
                    </Description>

                </CardReaDiv>

                {
                    props.authorID === state.currentUser.id ?
                    (
                        <CardReaFooter style={{justifyContent : "space-between"}}> {/*renders following/unfollow and follow button*/}
                            <Grid container>
                                <Grid item xs={6} style={{display : "flex", justifyContent : "center"}}>
                                    {
                                        props.privacy === 'private' &&
                                        <LockIcon style={{color : "#666"}}/>
                                    }
                                </Grid>
                                <Grid item xs={6} style={{display : "flex", justifyContent : "flex-end"}}>
                                    <ColCardOwnerOptions
                                        id={props.id}
                                        />
                                </Grid>
                            </Grid>
                        </CardReaFooter>
                    )
                    :
                    (
                        <CardReaFooter> {/*renders following/unfollow and follow button*/}
                        {
                            props.followed ?
                            (
                                [
                                    RenderFollowingButton()
                                ]
                            )
                            :
                            (
                                [
                                    RenderFollowButton()
                                ]
                            )
                        }
                        <ColCardPublicOptions
                            id={props.id}
                            />
                        </CardReaFooter>
                    )
                }

            </CardDiv>
        </StyledCard>
    )
}

const SlideAvatarDiv = styled.div`
    vertical-align : middle;
    border : 0;

    img { 
        height : 40px !important;
        width : 40px !important;
        border : 0;
        vertical-align : middle;
        border-radius : 50%;
    }
`

const SlideContentDiv = styled.div`
    background-color : #7e57c2;
    padding : 10px;
    width : 100%;
    height : 100%;
    position : absolute;
    display : flex;
    flex-direction : column;
`

const UserAndTitle = styled.div`
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -ms-flex-direction: column;
    flex-direction: column;
    width: 100%;
    -webkit-box-align: center;
    -ms-flex-align: center;
    align-items: center;
    padding: 30px 10px 10px 10px;
    margin-top: -25px;
    background-color: rgba(0,0,0,.5);
    color: #fff;

    .col-name {
        padding-top: 5px;
        font-size: 17px;
        font-weight: 500;
        text-overflow: ellipsis;
        overflow: hidden;
        text-align: center;
        width: 100%;
    }
`

const AvatarDiv = styled.div`
    z-index : 5;
    overflow : hidden;

    img {
        border-radius : 50%;
        height : 70px;
        width : 70px;
        border : 2px solid #fff !important;
        background-color : #fff;
        box-shadow : 0 1px 3px rgba(0,0,0,.45);
    }
`

const UserInfo = styled.div`
    position : absolute;
    display : flex;
    flex-direction : column;
    width : 100%;
    height : 100%;
    justify-content : flex-end;
    align-items : center;

`

const CardReaFooter = styled.div`
    height : 60px;
    display : flex;
    justify-content : center;
    align-items : center;
    border-top : 1px solid #e5e5e5;

    .MuiSvgIcon-root {
        font-family: 'Material Icons';
        color : inherit;
        font-weight: normal;
        font-style: normal;
        font-size: 24px;
        line-height: 1;
        letter-spacing: normal;
        text-transform: none;
        display: inline-block;
        white-space: nowrap;
        word-wrap: normal;
        direction: ltr;
    }
`

const Type = styled.div`
    line-height : 1;
    font-size : .85em;

    .MuiSvgIcon-root {
        font-size : 21px;
        color : #673ab7;
        vertical-align : middle;
        padding-right : .4em;
    }
`

const StyledGrid = styled(Grid)`
    .MuiGrid-item {
        height : 136px;
        width 130px;
        background : #f9f9f9;
        border : 1px solid #f4f4f4;
        border-color : #f4f4f4;
    }
`

const Header = styled.div`
    display : flex;
    height : 230px;
    position : relative;
    overflow : hidden;
`

const Description = styled.div`
    display : flex;
    height : 60px
    background-color : #fff;
    flex-direction : column;
    justify-content: space-between;
    padding : 15px;
`
const FollowButton = styled(Button)`
    border : 2px solid #503096 !important;
    border-radius : 5px !important;
    margin : 10px !important;
    color :#503096 !important;
    min-width : 150px !important;
    min-height : 36px !important;
    text-align : center !important;
    vertical-align : middle !important;
    background : transparent !important;
    text-transform : uppercase !important;
    font-family : inherit !important;
    overflow : hidden !important;
    font-weight : normal !important;
    text-decoration : none !important;
    letter-spacing: .01em !important;
    white-space : nowrap !important;
    font-weight: 500;

    &:hover {
        background-color : rgba(158,158,158,0.2) !important;

    }

`
const FollowingButton = styled(Button)`
    border : 2px solid #503096 !important;
    border-radius : 5px !important;
    margin : 10px !important;
    color :#fff !important;
    min-width : 150px !important;
    min-height : 36px !important;
    text-align : center !important;
    vertical-align : middle !important;
    background-color : #503096 !important;
    text-transform : uppercase !important;
    font-family : inherit !important;
    overflow : hidden !important;
    font-weight : normal !important;
    text-decoration : none !important;
    letter-spacing: .01em !important;
    white-space : nowrap !important;
    font-weight: 500;

    &:hover {
        background-color : rgba(158,158,158,0.2) !important;
        color : #503096 !important;
        box-shadow : none !important;
    }

`