Skip to content
Snippets Groups Projects
AreasSubPagesFunction.js 15.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, useEffect } from "react";
import "./carousel.css";
import { Col, Row, Container, Hidden, Visible } from "react-grid-system";
import styled from 'styled-components'
import MaterialCard from "./MaterialCard";
import "react-responsive-carousel/lib/styles/carousel.min.css";
import { Carousel } from "react-responsive-carousel";
import recursos from "../img/ilustra_recursos_digitais.png";
import materiais from "../img/ilustra_materiais.png";
import colecoes from "../img/ilustra_colecoes.png";
import ResourceCardFunction from "./ResourceCardFunction.js";
import CollectionCardFunction from "./CollectionCardFunction.js";
import colecoes_obj from './FormationMaterialsResources/formationMaterials';
import ExpandedMaterial from './ExpandedMaterials';
import {getRequest} from './HelperFunctions/getAxiosConfig.js'
import Grid from '@material-ui/core/Grid';
import {Link} from 'react-router-dom'

function objectsPerPage () {
    var pageWidth = window.innerWidth
    if (pageWidth >= 1200) {
        return 3
    }
    else {
        if (pageWidth > 766) {
            return 2
        }
        else {
            return 1
        }
    }
}

function ReqResources () {
    const [rows, setRows] = useState([])

    function onSuccessfulGet (data) {
        var aux = []
        var resources_per_page = objectsPerPage()
        for (let i = 0; i < 12 / resources_per_page; i++) {
          aux.push(data.slice(i * resources_per_page, resources_per_page * (i + 1)))
        }
        setRows(aux)
    }

    useEffect(() => {
        const url = `/learning_objects?limit=12&sort=["published_at", "desc"]`

        getRequest(url, (data) => onSuccessfulGet(data), (error) => {console.log(error)})
    }, [])

    return (
        <Carousel showThumbs={false} infiniteLoop={true} showStatus={false}>
          {
            rows.map((row, index) => (
              <Row style={{ paddingBottom: "5px", margin: '0 auto', width: "80%", justifyContent: "center" }} key={(index + 1)}>
                {row.map((card) => (
                  <div style={{ marginLeft: 10, display: 'flex' }} key={card.id * (index + 1)}>
                    <ResourceCardFunction
                      avatar={card.publisher.avatar}
                      id={card.id}
                      thumbnail={card.thumbnail}
                      type={card.object_type ? card.object_type : "Outros"}
                      title={card.name}
                      published={card.state === "published" ? true : false}
                      likeCount={card.likes_count}
                      liked={card.liked}
                      rating={card.review_average}
                      author={card.publisher.name}
                      tags={card.tags}
                      href={"/recurso/" + card.id}
                      downloadableLink={card.default_attachment_location}
                    />
                  </div>
                ))}
              </Row>
            ))}
        </Carousel>
    )
}

function ReqCollections () {
    const [rows, setRows] = useState([])

    function onSuccessfulGet (data) {
        var aux = []
        var collections_per_page = objectsPerPage()
        for (let i = 0; i < 12 / collections_per_page; i++) {
          aux.push(data.slice(i * collections_per_page, collections_per_page * (i + 1)))
        }
        setRows(aux)
    }

    useEffect(() => {
        const url = `/collections?limit=12&sort=["updated_at", "desc"]`

        getRequest(url, (data) => onSuccessfulGet(data), (error) => {console.log(error)})
    }, [])

    return (
        <Carousel showThumbs={false} infiniteLoop={true} showStatus={false}>
          {
            rows.map((row, index) => (
              <Row style={{ paddingBottom: "5px", margin: '0 auto', width: "80%", justifyContent: "center" }} key={(index + 1)}>
                {row.map((card) => (
                  <div style={{ marginLeft: 10, display: 'flex' }} key={card.id * (index + 1)}>
                    <CollectionCardFunction
                      name={card.name}
                      tags={card.tags}
                      rating={card.score}
                      id={card.id}
                      author={card.owner.name}
                      description={card.description}
                      thumbnails={card.items_thumbnails}
                      avatar={card.owner.avatar}
                      likeCount={card.likes_count}
                      followed={card.followed}
                      liked={card.liked}
                      collections={card.collection_items}
                      authorID={card.owner.id}
                    />
                  </div>
                ))}
              </Row>
            ))}
        </Carousel>
    )
}

function TabRecurso () {
    const text = "Nesta área, você tem acesso a Recursos Educacionais Digitais, isto é, a vídeos, animações e a outros recursos destinados à educação. São Recursos de portais parceiros do MEC e de professores que, como você, atuam na Educação Básica!"

    return (
        <React.Fragment>
            <div style={{ backgroundColor: "#ff7f00", position: "relative" }}>
                <StyledTab container>
                    <Grid item md={3} xs={12}>
                        <img
                            src={recursos}
                            alt="aba recursos"
                            style={{ float: "left", marginRight: 20, marginBottom: 20, marginLeft: window.innerWidth >= 825 ? "25%" : "0px" }}
                        />
                    </Grid>
                    {
                        window.innerWidth <= 501 &&
                        <h4>
                        Recursos Educacionais Digitais
                        </h4>
                    }
                    <Grid item md={6} xs={12}>
                        <p>
                            {text}
                        </p>
                    </Grid>
                    {
                        window.innerWidth <= 501 &&
                        <div style={{display : "flex", justifyContent : "center"}}>
                            <Link to={`/busca?query=&search_class=LearningObject`} className="button-ver">VER RECURSOS</Link>
                        </div>
                    }
                </StyledTab>
            </div>
            {
                window.innerWidth > 501 &&
                <Container style={{ padding: "20px" }}>
                    <p
                        style={{
                            paddingBottom: "5px",
                            borderBottom: "1px solid #ff7f00",
                            color: "#ff7f00",
                        }}
                    >
                        Recursos mais recentes{" "}
                    </p>
                    <Hidden sm xs>
                        <ReqResources />
                    </Hidden>
                    <Visible sm xs>
                        <ReqResources />
                    </Visible>
                </Container>
            }
        </React.Fragment>
    )
}

function TabColecoes () {
    const text = "Nesta área, você tem acesso às coleções criadas e organizadas pelos usuários da plataforma. É mais uma possibilidade de buscar recursos educacionais para sua aula!"

    return (
        <React.Fragment>
            <div style={{ backgroundColor: "#673ab7", position: "relative" }}>
                <StyledTab container>
                    <Grid item md={3} xs={12}>
                        <img
                            src={colecoes}
                            alt="aba recursos"
                            style={{ float: "left", marginRight: 20, marginBottom: 20, marginLeft: window.innerWidth >= 825 ? "25%" : "0px" }}
                        />
                    </Grid>
                    {
                        window.innerWidth <= 501 &&
                        <h4>
                        Coleções dos Usuários
                        </h4>
                    }
                    <Grid item md={6} xs={12}>
                    <p>
                        {text}
                    </p>
                    </Grid>
                    {
                        window.innerWidth <= 501 &&
                        <div style={{display : "flex", justifyContent : "center"}}>
                            <Link to={`/busca?query=&search_class=Collection`} className="button-ver">VER COLEÇÕES</Link>
                        </div>
                    }
                </StyledTab>
            </div>
            {
                window.innerWidth > 501 &&
                <Container style={{ padding: "20px" }}>
                    <p
                        style={{
                            paddingBottom: "5px",
                            borderBottom: "1px solid #673ab7",
                            color: "#673ab7",
                        }}
                    >
                        Coleções mais recentes{" "}
                    </p>
                    <ReqCollections />
                </Container>
            }
       </React.Fragment>
    )
}

function TabMateriais () {
    const text = "Nesta área, você acessa livremente materiais completos de formação, como cursos já oferecidos pelo MEC e seus parceiros. São conteúdos elaborados por equipes multidisciplinares e de autoria de pesquisadores e educadores renomados nas áreas."

    const materials = colecoes_obj()

    const [currMaterial, setCurrMaterial] = useState({
        open : false,
        material : {}
    })

    const handleExpandMaterial = (id) => {
        if (id !== currMaterial.material.id)
            setCurrMaterial({
                open: true,
                material: { ...materials[id] }
            })
        else {
            setCurrMaterial({
                open: false,
                material: {}
            })
        }
    }

    return (
        <React.Fragment>
            <div style={{ backgroundColor: "#e81f4f", position: "relative" }}>
                <StyledTab container>
                    <Grid item md={3} xs={12}>
                        <img
                            src={materiais}
                            alt="aba recursos"
                            style={{ float: "left", marginRight: 20, marginBottom: 20, marginLeft: window.innerWidth >= 825 ? "25%" : "0px" }}
                        />
                    </Grid>
                    {
                        window.innerWidth <= 501 &&
                        <h4>
                        Materiais de formação
                        </h4>
                    }
                    <Grid item md={6} xs={12}>
                        <p>
                            {text}
                        </p>
                    </Grid>
                    {
                        window.innerWidth <= 501 &&
                        <div style={{display : "flex", justifyContent : "center"}}>
                            <Link to={`/material-formacao`} className="button-ver">VER MATERIAIS</Link>
                        </div>
                    }
                </StyledTab>
            </div>
            {
                window.innerWidth > 501 &&
                <Container style={{ padding: "20px" }}>
                    <p
                        style={{
                            paddingBottom: "5px",
                            borderBottom: "1px solid #e81f4f",
                            color: "#e81f4f",
                        }}
                    >
                        Materiais mais recentes{" "}
                    </p>
                    <Carousel
                        style={{ padding: "20px" }}
                        showThumbs={false}
                        infiniteLoop={true}
                        showStatus={false}
                    >
                        <Row>
                        {
                            materials.map((material, index) => {
                                return (
                                    <Col md={3} key={index}>
                                        <MaterialCard
                                            name={material.name}
                                            thumb={material.img}
                                            score={material.score}
                                            modules={material.topics}
                                            handleExpand={handleExpandMaterial}
                                            id={index}
                                        />
                                    </Col>
                            )})
                        }
                        </Row>
                    </Carousel>
                    {
                        currMaterial.open ?
                        <ExpandedMaterial material={currMaterial.material} />
                        :
                        null
                    }
                </Container>
            }
        </React.Fragment >
    )
}

export default function AreasSubPages (props) {

    const areaRender = () => {
        switch (props.banner) {
            case "Recursos":
                return <TabRecurso/>
            case "Materiais":
                return <TabMateriais/>
            case "Colecoes":
                return <TabColecoes/>
            default:
                return null
        }
    }

    return (
        <React.Fragment>
            {
                window.innerWidth <= 501 ? (
                    <React.Fragment>
                        <TabRecurso/>
                        <TabMateriais/>
                        <TabColecoes/>
                    </React.Fragment>
                ) : (
                    areaRender()
                )
            }
        </React.Fragment>
    )
}

const StyledTab = styled(Grid)`
    display : flex;
    justify-content : center;
    @media screen and (min-width : 502px) {
        text-align : justify;
    }
    @media screen and (max-width : 502px) {
        text-align : center;
    }
    color : #fff;
    min-height : 190px;
    padding : 20px 10px 20px 10px;

    img {
        float : left;
        max-height : 155px;
    }

    .MuiGrid-grid-xs-12 {
        display : flex;
        justify-content : center;
    }

    h4 {
        font-size : 18px;
        margin : 10px !important;
    }

    p {
        line-height : 1.42857143;
    }

    .button-ver {
        font-size: 14px;
        padding: 5px 10px;
        border: solid 2px #fff;
        border-radius: 7px;
        color: #fff;
        cursor: pointer;
        text-decoration: none;
    }