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

lfr20's avatar
lfr20 committed
import React, { useState, useEffect, useContext } 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';
lfr20's avatar
lfr20 committed
import TextField from '@material-ui/core/TextField';
import MenuItem from '@material-ui/core/MenuItem';
import { getRequest } from './HelperFunctions/getAxiosConfig.js'
import Grid from '@material-ui/core/Grid';
import { Link } from 'react-router-dom'
import { CircularProgress } from "@material-ui/core";
import ColecaoVazia from '../img/Pagina_vazia_colecao.png'
import RecursoVazio from '../img/Pagina_vazia_Sem_publicar.png'
lfr20's avatar
lfr20 committed
import { Store } from '../Store'
import { makeStyles } from '@material-ui/core/styles'

const useStyles = makeStyles(theme => ({
  contrastTextField: {
    border: "1px solid white",
    borderRadius: theme.shape.borderRadius,
    backgroundColor: "black",
  }
}))
function objectsPerPage() {
  var pageWidth = window.innerWidth
  if (pageWidth >= 1200) {
    return 3
  }
  else {
    if (pageWidth > 766) {
      return 2
      return 1
function ReqResources(props) {
  const [rows, setRows] = useState([])
  const [isLoading, setIsLoading] = useState(false)

  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)
    setIsLoading(false)
  }

  useEffect(() => {
    setIsLoading(true)
    const url = `/search?page=0&results_per_page=12&order=${props.order}&query=*&search_class=LearningObject`

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

  return (
    isLoading ?
      <Grid container justify="center" alignItems="center" style={{ margin: "2em" }} >
        <Grid item>
lfr20's avatar
lfr20 committed
          <CircularProgress size={24} style={props.contrast === "" ? { color: "#ff7f00" } : { color: "yellow" }} />
        </Grid>
      </Grid>
      :
      <Carousel showThumbs={false} infiniteLoop={true} showStatus={false}>
        {
          rows.length >= 1 ?
            rows.map((row, index) => (
vgm18's avatar
vgm18 committed
              <Row style={{ paddingBottom: "5px", margin: '0 auto', width: "80%", justifyContent: "center", minHeight: "50px" }} 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>
            ))
            :
            <Grid container justify="center" alignItems="center">
              <Grid item>
                <img src={RecursoVazio} alt="Não há recursos" />
              </Grid>
            </Grid>
        }
      </Carousel>
function ReqCollections(props) {
  const [rows, setRows] = useState([])
  const [isLoading, setIsLoading] = useState(false)

  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)))
    setIsLoading(false)
    setRows(aux)
  }

  useEffect(() => {
    setIsLoading(true)
    const url = `/search?page=0&results_per_page=12&order=${props.order}&query=*&search_class=Collection`

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

  return (
    isLoading ?
      <Grid container justify="center" alignItems="center" style={{ marginTop: "2em" }}>
        <Grid item>
lfr20's avatar
lfr20 committed
          <CircularProgress size={24} style={props.contrast === "" ? { color: "#673ab7" } : { color: "yellow" }} />
        </Grid>
      </Grid>
      :
      rows.length >= 1 ?
        <Carousel showThumbs={false} infiniteLoop={true} showStatus={false}>
          {
            rows.map((row, index) => (
vgm18's avatar
vgm18 committed
              <Row style={{ paddingBottom: "5px", margin: '0 auto', width: "80%", justifyContent: "center", minHeight: "50px" }} 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 ? card.owner.name : ""}
                      description={card.description}
                      thumbnails={card.items_thumbnails}
                      avatar={card.owner ? card.owner.avatar : ""}
                      likeCount={card.likes_count}
                      followed={card.followed}
                      liked={card.liked}
                      collections={card.collection_items}
                      authorID={card.owner ? card.owner.id : ""}
                    />
                  </div>
                ))}
              </Row>
            ))}
        </Carousel>
        :
        <Grid container justify="center" alignItems="center">
          <Grid item>
            <img src={ColecaoVazia} alt="Não há coleções" />
          </Grid>
        </Grid>
  )
lfr20's avatar
lfr20 committed
function TabRecurso({ contrast }) {
  const classes = useStyles()
  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!"
lfr20's avatar
lfr20 committed
  const [currOrder, setCurrOrder] = useState("Mais Relevante");
  const [currValue, setCurrValue] = useState("score");
  const [ordenar] = useState([
    { label: "Mais Estrelas", value: "review_average" },
    { label: "Mais Relevante", value: "score" },
    { label: "Mais Baixados", value: "downloads" },
    { label: "Mais Favoritados", value: "likes" },
    { label: "Mais Recentes", value: "publicationdesc" },
    { label: "Ordem Alfabética", value: "title" },
  ]);

  return (
    <React.Fragment>
lfr20's avatar
lfr20 committed
      <div style={{ backgroundColor: contrast === "" ? "#ff7f00" : "black", position: "relative" }}>
        <StyledTab container contrast={contrast}>
          <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
          }
          <Grid item md={6} xs={12}>
            <p>
              {text}
            </p>
          </Grid>
          {
            window.innerWidth <= 501 &&
            <div style={{ display: "flex", justifyContent: "center" }}>
lfr20's avatar
lfr20 committed
              <Link to={`/busca?page=0&results_per_page=12&order=review_average&query=*&search_class=LearningObject`} className="button-ver">VER RECURSOS</Link>
          }
        </StyledTab>
      </div>
      {
        window.innerWidth > 501 &&
lfr20's avatar
lfr20 committed
        <div className={`${contrast}BackColor`}>
          <Container style={{ padding: "20px" }}>
            <Grid
              container
              direction="row"
              justify="space-between"
              alignItems="center"
              style={{
                paddingBottom: "5px",
                borderBottom: contrast === "" ? "1px solid #ff7f00" : "1px solid white",
                color: contrast === "" ? "#ff7f00" : "white",
              }}
            >
              <Grid item>
                <p
                  style={{ margin: 0, padding: 0 }}
                >
                  {
                    `Recursos ${currOrder}`
                  }
                </p>
              </Grid>
lfr20's avatar
lfr20 committed
              <Grid item>
                <Grid container direction="row" alignItems="center" spacing={1}>
                  <Grid item>
                    <p style={{ margin: 0, padding: 0 }}>
                      Ordenar por:
lfr20's avatar
lfr20 committed
                  </p>
lfr20's avatar
lfr20 committed
                  </Grid>
                  <Grid item>
                    <TextField
                      select
                      fullWidth
                      value={currValue}
                      variant="outlined"
                      className={contrast === "Contrast" && classes.contrastTextField}
                    >
                      {ordenar.map((option) => (
                        <MenuItem
                          key={option.value}
                          value={option.value}
                          name={option.value}
                          onClick={() => {
                            setCurrOrder(option.label)
                            setCurrValue(option.value)
                          }}
                          className={`${contrast}BackColor`}
                        >
                          <span style={currValue === option.value ? { color: contrast === "" ? "#ff7f00" : "yellow", fontWeight: "500" } : { color: contrast === "" ? "" : "yellow", textDecoration: contrast === "" ? "none" : "underline", fontWeight: "lighter" }} >
                            {option.label}
                          </span>
                        </MenuItem>
                      ))}
                    </TextField>
                  </Grid>
                </Grid>
              </Grid>
            </Grid>
lfr20's avatar
lfr20 committed
            <Hidden sm xs>
              <ReqResources order={currValue} contrast={contrast} />
            </Hidden>
            <Visible sm xs>
              <ReqResources order={currValue} contrast={contrast} />
            </Visible>
          </Container>
        </div>
      }
    </React.Fragment>
  )
lfr20's avatar
lfr20 committed
function TabColecoes({ contrast }) {
  const classes = useStyles()
  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!"
lfr20's avatar
lfr20 committed
  const [currOrder, setCurrOrder] = useState("Mais Relevante");
  const [currValue, setCurrValue] = useState("score");
  const [ordenar] = useState([
    { label: "Mais Estrelas", value: "review_average" },
    { label: "Mais Relevante", value: "score" },
    { label: "Mais Baixados", value: "downloads" },
    { label: "Mais Favoritados", value: "likes" },
    { label: "Mais Recentes", value: "publicationdesc" },
    { label: "Ordem Alfabética", value: "title" },
  ]);

  return (
    <React.Fragment>
      <div style={{ backgroundColor: "#673ab7", position: "relative" }}>
lfr20's avatar
lfr20 committed
        <StyledTab container contrast={contrast}>
          <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
          }
          <Grid item md={6} xs={12}>
            <p>
              {text}
            </p>
          </Grid>
          {
            window.innerWidth <= 501 &&
            <div style={{ display: "flex", justifyContent: "center" }}>
lfr20's avatar
lfr20 committed
              <Link to={`/busca?page=0&results_per_page=12&order=review_average&query=*&search_class=Collection`} className="button-ver">VER COLEÇÕES</Link>
          }
        </StyledTab>
      </div>
      {
        window.innerWidth > 501 &&
lfr20's avatar
lfr20 committed
        <div className={`${contrast}BackColor`}>
          <Container style={{ padding: "20px" }}>
            <Grid
              container
              direction="row"
              justify="space-between"
              alignItems="center"
              style={{
                paddingBottom: "5px",
                borderBottom: contrast === "" ? "1px solid #673ab7" : "1px solid white",
                color: contrast === "" ? "#673ab7" : "white",
              }}
            >
              <Grid item>
                <p
                  style={{ margin: 0, padding: 0 }}
                >
                  {
                    `Coleções ${currOrder}`
                  }
                </p>
              </Grid>
lfr20's avatar
lfr20 committed
              <Grid item>
                <Grid container direction="row" alignItems="center" spacing={1}>
                  <Grid item>
                    <p style={{ margin: 0, padding: 0 }}>
                      Ordenar por:
lfr20's avatar
lfr20 committed
                  </Grid>
                  <Grid item>
                    <TextField
                      select
                      fullWidth
                      value={currValue}
                      variant="outlined"
                      className={contrast === "Contrast" && classes.contrastTextField}
                    >
                      {ordenar.map((option) => (
                        <MenuItem
                          key={option.value}
                          value={option.value}
                          name={option.value}
                          style={contrast === "" ? {} : { backgroundColor: "black" }}
                          onClick={() => {
                            setCurrOrder(option.label)
                            setCurrValue(option.value)
                          }}
                        >
                          <span style={currValue === option.value ? { color: contrast === "" ? "#673ab7" : "yellow", fontWeight: "500" } : { color: contrast === "" ? "" : "yellow", textDecoration: contrast === "" ? "none" : "underline", fontWeight: "lighter" }} >
                            {option.label}
                          </span>
                        </MenuItem>
                      ))}
                    </TextField>
                  </Grid>
                </Grid>
              </Grid>
            </Grid>
lfr20's avatar
lfr20 committed
            <ReqCollections order={currValue} contrast={contrast} />
          </Container>
        </div>
      }
    </React.Fragment>
  )
lfr20's avatar
lfr20 committed
function TabMateriais({ contrast }) {
  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" }}>
lfr20's avatar
lfr20 committed
        <StyledTab container contrast={contrast}>
          <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
          }
          <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>
          }
        </StyledTab>
      </div>
      {
        window.innerWidth > 501 &&
lfr20's avatar
lfr20 committed
        <div className={`${contrast}BackColor`}>
          <Container style={{ padding: "20px" }}>
            <p
              style={{
                paddingBottom: "5px",
                borderBottom: contrast === "" ? "1px solid #e81f4f" : "1px solid white",
                color: contrast === "" ? "#e81f4f" : "white",
              }}
            >
              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>
        </div>
      }
    </React.Fragment >
  )
export default function AreasSubPages(props) {
lfr20's avatar
lfr20 committed
  const { state } = useContext(Store)

  const areaRender = () => {
    switch (props.banner) {
      case "Recursos":
lfr20's avatar
lfr20 committed
        return <TabRecurso contrast={state.contrast} />
      case "Materiais":
lfr20's avatar
lfr20 committed
        return <TabMateriais contrast={state.contrast} />
      case "Colecoes":
lfr20's avatar
lfr20 committed
        return <TabColecoes contrast={state.contrast} />
      default:
        return null
  }

  return (
    <React.Fragment>
      {
        window.innerWidth <= 501 ? (
          <React.Fragment>
lfr20's avatar
lfr20 committed
            <TabRecurso contrast={state.contrast} />
            <TabMateriais contrast={state.contrast} />
            <TabColecoes contrast={state.contrast} />
          </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;
lfr20's avatar
lfr20 committed
    background: ${props => props.contrast === "" ? "" : "black"};

    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;
lfr20's avatar
lfr20 committed
        color: ${props => props.contrast === "" ? "#fff" : "yellow"};
        cursor: pointer;
lfr20's avatar
lfr20 committed
        text-decoration: ${props => props.contrast === "" ? "none" : "underline"};