Skip to content
Snippets Groups Projects
AreasSubPagesFunction.js 26.8 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 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 { recursos } from "ImportImages.js";
import { materiais } from "ImportImages.js";
import { colecoes } from "ImportImages.js";
import { ColecaoVazia } from "ImportImages.js";
import { RecursoVazio } from "ImportImages.js";
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",
    }
lfr20's avatar
lfr20 committed
}))
function objectsPerPage() {
    var pageWidth = window.innerWidth
    if (pageWidth >= 1200) {
        return 3
        if (pageWidth > 766) {
            return 2
        }
        else {
            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)))
    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>
                <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
                                    contrast={props.contrast}
                                    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>
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)))
    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" }}>
                <CircularProgress size={24} style={props.contrast === "" ? { color: "#673ab7" } : { color: "yellow" }} />
        </Grid>
        :
        rows.length >= 1 ?
            <Carousel showThumbs={false} infiniteLoop={true} showStatus={false}>
                {
                    rows.map((row, index) => (
                    <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
                                    contrast={props.contrast}
                                    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>
                    ))
                }
            <Grid container justify="center" alignItems="center">
                <Grid item>
                    <img src={ColecaoVazia} alt="Não há coleções" />
                </Grid>
lfr20's avatar
lfr20 committed
function TabRecurso({ contrast }) {
    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!"
    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: 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
                        </h4>
                    {
                        window.innerWidth <= 501 &&
                        <div style={{ display: "flex", justifyContent: "center" }}>
                            <Link to={`/busca?page=0&results_per_page=12&order=review_average&query=*&search_class=LearningObject`} className="button-ver">VER RECURSOS</Link>
                        </div>
                    }
                </StyledTab>
            {
                window.innerWidth > 501 &&
                <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>

                            <Grid item>
                                <Grid container direction="row" alignItems="center" spacing={1}>
                                    <Grid item>
                                        <p style={{ margin: 0, padding: 0 }}>
                                            Ordenar por:
                                        </p>
                                    </Grid>
                                    <Grid item>
                                        <StyledTextField
                                            contrast={contrast}
                                            select
                                            fullWidth
                                            value={currValue}
                                            variant="outlined"
                                            className={contrast === "Contrast" && classes.contrastTextField}
                                        >
                                            {ordenar.map((option) => (
                                                <StyledMenuItem
                                                    contrast={contrast}
                                                    key={option.value}
                                                    value={option.value}
                                                    name={option.value}
                                                    onClick={() => {
                                                        setCurrOrder(option.label)
                                                        setCurrValue(option.value)
                                                    }}
                                                >
                                                    <span style={currValue === option.value ? { color: contrast === "" ? "#ff7f00" : "yellow", textDecoration: contrast === "" ? "none" : "underline", fontWeight: "500" } : { color: contrast === "" ? "" : "yellow", textDecoration: contrast === "" ? "none" : "underline", fontWeight: "lighter" }} >
                                                        {option.label}
                                                    </span>
                                                </StyledMenuItem>
                                            ))}
                                        </StyledTextField>
                                    </Grid>
                                </Grid>
                            </Grid>
                        </Grid>
                        <Hidden sm xs>
                            <ReqResources order={currValue} contrast={contrast} />
                        </Hidden>
                        <Visible sm xs>
                            <ReqResources order={currValue} contrast={contrast} />
                        </Visible>
                    </Container>
                </div>
            }
lfr20's avatar
lfr20 committed
function TabColecoes({ contrast }) {
    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!"
    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" }}>
                <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
                        </h4>
                    {
                        window.innerWidth <= 501 &&
                        <div style={{ display: "flex", justifyContent: "center" }}>
                            <Link to={`/busca?page=0&results_per_page=12&order=review_average&query=*&search_class=Collection`} className="button-ver">VER COLEÇÕES</Link>
                        </div>
                    }
                </StyledTab>
            {
                window.innerWidth > 501 &&
                <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>

                            <Grid item>
                                <Grid container direction="row" alignItems="center" spacing={1}>
                                    <Grid item>
                                        <p style={{ margin: 0, padding: 0 }}>
                                            Ordenar por:
                                        </p>
                                    </Grid>
                                    <Grid item>
                                        <StyledTextField
                                            contrast={contrast}
                                            select
                                            fullWidth
                                            value={currValue}
                                            variant="outlined"
                                            className={contrast === "Contrast" && classes.contrastTextField}
                                        >
                                            {ordenar.map((option) => (
                                                <StyledMenuItem
                                                    contrast={contrast}
                                                    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", textDecoration: contrast === "" ? "none" : "underline", fontWeight: "500" } : { color: contrast === "" ? "" : "yellow", textDecoration: contrast === "" ? "none" : "underline", fontWeight: "lighter" }} >
                                                        {option.label}
                                                    </span>
                                                </StyledMenuItem>
                                            ))}
                                        </StyledTextField>
                                    </Grid>
                                </Grid>
                            </Grid>
                        </Grid>
                        <ReqCollections order={currValue} contrast={contrast} />
                    </Container>
                </div>
            }
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 [currMaterial, setCurrMaterial] = useState({
        open: false,
        material: {}
    const handleExpandMaterial = (id) => {
        if (id !== currMaterial.material.id)
            setCurrMaterial({
                open: true,
                material: { ...materials[id] }
            })
            setCurrMaterial({
                open: false,
                material: {}
            })
            <div style={{ backgroundColor: "#e81f4f", position: "relative" }}>
                <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
                        </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>
            {
                window.innerWidth > 501 &&
                <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
                                                contrast={contrast}
                                                name={material.name}
                                                thumb={material.img}
                                                score={material.score}
                                                modules={material.topics}
                                                handleExpand={handleExpandMaterial}
                                                id={index}
                                            />
                                        </Col>
                                    )
                                })
                                }
                            </Row>
                        </Carousel>
                        {
                        currMaterial.open ?
                            <ExpandedMaterial contrast={contrast} material={currMaterial.material} />
                            :
                            null
                        }
                    </Container>
                </div>
            }
export default function AreasSubPages(props) {
    const areaRender = () => {
        switch (props.banner) {
        case "Recursos":
            return <TabRecurso contrast={state.contrast} />
            return <TabMateriais contrast={state.contrast} />
            return <TabColecoes contrast={state.contrast} />

    return (
        <React.Fragment>
        {
            window.innerWidth <= 501 ? (
            <React.Fragment>
                <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"};

const StyledMenuItem = styled(MenuItem)`  
    background-color: ${props => props.contrast === "" ? "" : "black !important"};
`

const StyledTextField = styled(TextField)`
    .MuiOutlinedInput-root {
        &.Mui-focused fieldset {
            border-color: ${props => props.contrast === "" ? "#00bcd4" : "yellow"};
        }
        fieldset {
            border-color: ${props => props.contrast === "" ? "#666" : "white"};
        }
    }
`