/*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, useContext } from 'react' import { Store } from '../../Store.js' import Grid from '@material-ui/core/Grid'; import styled from 'styled-components' import { apiDomain } from '../../env'; import Stepper from './Stepper.js' import LoadingSpinner from '../LoadingSpinner.js' import MoreIcon from '@material-ui/icons/More'; import SdCardIcon from '@material-ui/icons/SdCard'; import DateRangeIcon from '@material-ui/icons/DateRange'; import UpdateIcon from '@material-ui/icons/Update'; import TranslateIcon from '@material-ui/icons/Translate'; import AssignmentIcon from '@material-ui/icons/Assignment'; import { GrayButton, OrangeButton } from './StyledComponents'; import ModalCancelar from './ModalCancelar.js' import { getDefaultThumbnail } from '../HelperFunctions/getDefaultThumbnail' import { getRequest } from '../HelperFunctions/getAxiosConfig.js' import ReCaptcha from 'react-recaptcha' export default function PartThree(props) { var moment = require('moment') const { state } = useContext(Store) const [loading, setLoading] = useState(false) const [unavailableButton, setButtonAvailability] = useState(true); const [draft, setDraft] = useState({}) const [subjects, setSubjects] = useState('') const [description, setDescription] = useState('') const [author, setAuthor] = useState('') function handleSuccess(data) { console.log(data.tags) console.log(data.language) console.log(data.subjects) // console.log(data.tags) setDraft(data) /*extract subjects*/ setSubjects(data.subjects.map((subject) => (subject.name)).join(', ')) // setTags(data.tags.map(tag => tag.name)) setDescription(data.description) setAuthor(data.author) setLoading(false) } useEffect(() => { setLoading(true) if (state.currentUser.id !== "") { const url = `/learning_objects/${props.draftID}` getRequest(url, handleSuccess, (error) => { console.log(error) }) } }, [state.currentUser.id]) let windowWidth = window.innerWidth const [modalCancelar, toggleModalCancelar] = useState(false) const checkAccessLevel = (levelToCheck) => { if (state.currentUser.id !== '') { return (checkUserRole(levelToCheck)) } } const checkUserRole = (userRole) => { return (state.currentUser.roles.filter((role) => role.name === userRole).length > 0) } function captchaVerified(response) { if (response) { setButtonAvailability(false) } } return ( <React.Fragment> { !loading ? ( <React.Fragment> <ModalCancelar contrast={props.contrast} open={modalCancelar} handleClose={() => { toggleModalCancelar(false) }} draftID={draft.id} /> <Grid container style={props.contrast === "" ? { backgroundColor: "#f4f4f4" } : { backgroundColor: "black" }}> <Grid item xs={12}> <StyledSessao1 contrast={props.contrast} className="page-content-preview"> <div className="cabecalho"> <div className="feedback-upload"> <Stepper contrast={props.contrast} activeStep={props.activeStep} /> <h2>Quase lá, agora só falta publicar!</h2> <span className="subtitle">Veja abaixo como o seu Recurso vai aparecer na Plataforma:</span> </div> </div> </StyledSessao1> <CaixaContainer contrast={props.contrast}> <div> <div className="cabecalho-objeto"> <img alt="" className="img-objeto" src={draft.thumbnail === null ? getDefaultThumbnail(draft.object_type) : apiDomain + draft.thumbnail} /> <div className="texto-objeto"> <h3>{draft.name}</h3> <div className="relacionado"> Relacionado com: {subjects} </div> { draft.tags && <div className="tags-objeto"> Palavras chave: <br/> {draft.tags.map((tag) => { return ( <div className="tag" key={tag.name}>{tag.name}</div> ) })} </div> } </div> </div> <div className="sobre-objeto"> <Grid container> <Grid item xs={windowWidth > 990 ? 7 : 12} className="left"> <div className="titulo"> Sobre o Recurso </div> <div className="sobre-conteudo"> <p className="descricao">{description}</p> { author !== '' && <p className="autor"> <b>Autoria:</b> <br /> {author} </p> } </div> </Grid> <Grid item xs={windowWidth > 990 ? 4 : 12} className="right"> <span className="meta-objeto"> <MoreIcon /> <b>Tipo de mídia: </b>{draft.object_type} </span> <span className="meta-objeto"> <SdCardIcon /> <b>Tamanho: </b> </span> <span className="meta-objeto"> <DateRangeIcon /> <b>Enviado: </b> {moment(draft.created_at).format("DD/MM/YYYY")} </span> <span className="meta-objeto"> <UpdateIcon /><b>Atualização: </b> {moment(draft.updated_at).format("DD/MM/YYYY")} </span> {draft.language && draft.language.map((language => <span className="meta-objeto" key={language.id}> <TranslateIcon /><b>Idioma: </b>{language.name} </span> )) } <span className="meta-objeto"> <AssignmentIcon /><b>Licença: </b>{draft.license ? draft.license.name : ""} </span> </Grid> </Grid> </div> </div> </CaixaContainer> <Sessao3 contrast={props.contrast}> <form> <Grid container> <Grid item xs={windowWidth > 990 ? 6 : 12} style={{ paddingRight: "15px", paddingLeft: "15px", textAlign: windowWidth > 990 ? 'right' : 'center' }}> <span style={{ fontSize: "14px" }}> Para segurança da plataforma <br /> marque que você não é um robô </span> </Grid> <Grid item xs={windowWidth > 990 ? 6 : 12} style={{ paddingRight: "15px", paddingLeft: "15px" }}> <div style={{ margin: "0 auto", width: "304px" }}> { //<ReCaptcha sitekey={process.env.REACT_APP_SITE_KEY} verifyCallback={captchaVerified} /> //when key set in env <ReCaptcha sitekey="6LfxuKUUAAAAAIzYpCzEtJyeE8QRjBYa44dvHlTX" verifyCallback={captchaVerified} /> //use this one on production //<ReCaptcha sitekey="6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI" verifyCallback={captchaVerified} /> //test key, from google, do not use this one on production } </div> </Grid> <Grid item xs={12} style={{ paddingRight: "15px", paddingLeft: "15px", marginTop: "30px", textAlign: 'center' }}> <GrayButton contrast={props.contrast} onClick={() => { props.stepperControl(-1) }}>VOLTAR</GrayButton> <GrayButton contrast={props.contrast} onClick={() => { toggleModalCancelar(true) }}>CANCELAR</GrayButton> { checkAccessLevel("partner") ? ( unavailableButton ? ( <GrayButton contrast={props.contrast} disabled={unavailableButton}>PUBLICAR RECURSO</GrayButton> ) : ( <OrangeButton contrast={props.contrast} onClick={props.handlePost}>PUBLICAR RECURSO</OrangeButton> ) ) : ( unavailableButton ? ( <GrayButton contrast={props.contrast} disabled={unavailableButton}>SUBMETER RECURSO</GrayButton> ) : ( <OrangeButton contrast={props.contrast} onClick={props.handleSubmit}>SUBMETER RECURSO</OrangeButton> ) ) } </Grid> </Grid> </form> </Sessao3> </Grid> </Grid> </React.Fragment> ) : ( <LoadingSpinner contrast={props.contrast} text="CARREGANDO" /> ) } </React.Fragment> ) } const Sessao3 = styled.div` position : relative; top : -120px; padding-right :15px; padding-left :15px; margin-right : auto; margin-left : auto; @media screen and (min-width: 768px) { width : 750px; } @media screen and (min-width: 992px) { width : 970px; } @media screen and (min-width: 1200px) { width : 970px; } color: ${props => props.contrast === "" ? "#666" : "white"}; background-color: ${props => props.contrast === "" ? "#f4f4f4" : "black"}; ` const CaixaContainer = styled.div` background: ${props => props.contrast === "" ? "rgba(238,238,238,.5)" : "black"}; color: ${props => props.contrast === "" ? "#666" : "white"}; border-radius : 5px; position : relative; top : -145px; padding : 10px; margin-right : auto; margin-left : auto; @media screen and (min-width: 768px) { width : 750px; } @media screen and (min-width: 992px) { width : 970px; } @media screen and (min-width: 1200px) { width : 970px; } .cabecalho-objeto { background: ${props => props.contrast === "" ? "#fff" : "black"}; border: ${props => props.contrast === "" ? "0" : "1px solid white"}; box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); padding: 0; margin-top: 30px; margin-bottom: 30px; position: relative; min-height: 100px; margin-top: 0; margin-bottom: 10px; color: ${props => props.contrast === "" ? "#666" : "white"}; overflow: auto; .img-objeto { background: ${props => props.contrast === "" ? "#e5e5e5" : "black"}; height: 270px; width: 400px; float: left; padding: 0; } .texto-objeto { padding: 20px 20px 0 20px; height: content; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -ms-flex-wrap: nowrap; flex-wrap: nowrap; -webkit-box-pack: start; -ms-flex-pack: start; justify-content: flex-start; -ms-flex-line-pack: center; align-content: center; -webkit-box-align: start; -ms-flex-align: start; align-items: flex-start; h3 { font-size: 26px; font-weight: 400; margin: 0; padding-bottom: 15px; } .rating-objeto { margin : 0; display : inline-flex; padding-bottom : 10px; } .relacionado { font-weight : 500; font-size : 13px; } .tags-objeto { max-height: 54px; font-size: .8em; overflow: hidden; clear: both; display: -webkit-inline-box; display: -ms-inline-flexbox; display: inline-flex; -ms-flex-wrap: wrap; flex-wrap: wrap; .tag { display: -webkit-inline-box; display: -ms-inline-flexbox; display: inline-flex; margin-right: 3px; background: ${props => props.contrast === "" ? "#e5e5e5" : "black"}; border: ${props => props.contrast === "" ? "0" : "1px solid white"}; padding: 3px 7px; border-radius: 15px; line-height: 18px; margin-bottom: 3px; } } } } .sobre-objeto { margin-top : 0; margin-bottom : 0; min-height : 275px; display : flex; background: ${props => props.contrast === "" ? "#fff" : "black"}; border: ${props => props.contrast === "" ? "0" : "1px solid white"}; box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); padding: 0; position: relative; min-height: 500px; .left { @media screen and (min-width : 990px) { margin-left : 4% !important; margin-top : 4% !important; } @media screen and (max-width : 989px) { margin : 0; padding : 20px; padding-bottom : 0; } .titulo { margin-top: 2% !important; margin-bottom: 10px; font-family: 'Roboto Light','Roboto Regular',Roboto; font-weight: 300; font-style: normal; font-size: 1.857em; } .sobre-conteudo { flex : 1; font-size : 14px !important; .descricao { text-align: justify; margin-bottom: 20px; margin-top: 20px; } .autor { margin : 0 0 10px !important; } } } .right { margin-top : 4% !important; border-left: 1px solid #e5e5e5; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: start; -ms-flex-pack: start; justify-content: flex-start; padding: 20px; position : relative; margin-bottom : 20px; .meta-objeto { position: relative; width: 100%; font-size: 14px; margin-bottom: 20px; display : inline-block; } .MuiSvgIcon-root { vertical-align : middle !important; margin-right : 15px !important; } } } } ` const StyledSessao1 = styled.div` color : #fff; background: ${props => props.contrast === "" ? "#00bcd4" : "black"}; float : none; height : 300px; text-align : center; padding-top : 48px; padding-bottom : 48px; margin-bottom : 30px; .cabecalho { display : flex; flex-direction : column; align-items : center; margin-bottom : 30px; .feedback-upload { display : flex; flex-direction : column; justify-content : center; text-align : center; margin-top : 20px; width : 55%; } h2 { margin-top : 0; font-size : 26px; font-weight : lighter; margin-bottom : 10px; } .subtitle { font-size : 16px; } } `