From e07330e0b1f70e3e1e87fdc52a3f3b3c014ed545 Mon Sep 17 00:00:00 2001
From: Lucas Schoenfelder <les17@inf.ufpr.br>
Date: Thu, 6 Feb 2020 17:19:53 -0300
Subject: [PATCH] terminando de adicionar chamadas para as rotas; adicionada
 animacao de carregando e tentando criar o modal de mudar avatar

---
 src/Components/ComponentAlterarAvatar.js | 226 +++++++++++++++++++++++
 src/Components/LoadingSpinner.js         |  11 ++
 src/Components/LoginContainer.js         |  16 +-
 src/Components/LoginContainerFunction.js |   6 +-
 src/Components/LoginModal.js             |  12 +-
 src/Components/ModalAlterarAvatar.js     |  81 +++-----
 src/Components/SignUpContainer.js        |   2 +-
 src/Components/SignUpModal.js            |  18 +-
 src/Components/TabPanelAtividades.js     |  93 +++++++---
 src/Components/TabPanelColecoes.js       | 147 +++++++++++----
 src/Components/TabPanelFavoritos.js      | 181 +++++++++++++-----
 src/Components/TabPanelMeusRecursos.js   | 196 +++++++++++++++-----
 src/Components/TabPanelRede.js           |  10 +-
 src/Pages/UserPage.js                    |  36 +++-
 src/img/Bolo.png                         | Bin 0 -> 394 bytes
 src/img/loading_busca.gif                | Bin 0 -> 10901 bytes
 16 files changed, 787 insertions(+), 248 deletions(-)
 create mode 100644 src/Components/ComponentAlterarAvatar.js
 create mode 100644 src/Components/LoadingSpinner.js
 create mode 100644 src/img/Bolo.png
 create mode 100644 src/img/loading_busca.gif

diff --git a/src/Components/ComponentAlterarAvatar.js b/src/Components/ComponentAlterarAvatar.js
new file mode 100644
index 00000000..3115167a
--- /dev/null
+++ b/src/Components/ComponentAlterarAvatar.js
@@ -0,0 +1,226 @@
+/*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, {useContext,Component} from 'react';
+import { Button } from '@material-ui/core';
+import Modal from '@material-ui/core/Modal';
+import Backdrop from '@material-ui/core/Backdrop';
+import Zoom from '@material-ui/core/Fade';
+import styled from 'styled-components'
+import {Store} from '../Store.js'
+import axios from 'axios'
+import {apiUrl} from '../env';
+import CloseIcon from '@material-ui/icons/Close';
+import Profile from '../img/default_profile0.png'
+
+const ChangeAvatarDiv = styled.div`
+    color:rgba(255,255,255,.7);
+    background-color:rgba(0,0,0,.5);
+    position: absolute;bottom: 0;
+    width: inherit;
+    text-align: center;
+    font-size: 18px;
+    padding-bottom: 5px;
+    font-weight: 400;
+    height: 30%;
+    cursor: pointer;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+`
+
+export default function ComponentAlterarAvatar (props) {
+
+
+
+        return (
+            <ModalDiv style={{maxWidth:"500px", maxHeight:"500px"}}>
+            <HeaderDiv>
+                <span style={{width:"32px"}}/>
+                    <StyledH2>Editar Foto</StyledH2>
+                    <StyledCloseModalButton onClick={props.handleClose}>
+                        <CloseIcon/>
+                    </StyledCloseModalButton>
+            </HeaderDiv>
+            <DialogDiv>
+                <div style={{marginTop:"0"}}>
+                    <form>
+                        <DivAlterarFoto>
+                            <DivFlowHolder>
+                                <AvatarCircleDiv>
+                                    {
+                                        props.userAvatar == '' || props.userAvatar == null ?
+                                        (
+
+                                            <img src={Profile} alt={'user avatar'} style={{height:"inherit", width:"inherit", objectFit:"cover"}}/>
+                                        ):
+                                        (
+                                            <img src={this.props.userAvatar} alt={'user avatar'} style={{height:"inherit", width:"inherit", objectFit:"cover"}}/>
+                                        )
+                                    }
+                                    <ChangeAvatarDiv>
+                                        <span>Alterar</span>
+                                        <input accept="image/*" id="icon-button-file"
+                                        type="file"
+                                        onChange={(e) => props.handleFile(e.target.files) }/>
+                                    </ChangeAvatarDiv>
+                                </AvatarCircleDiv>
+                            </DivFlowHolder>
+                        </DivAlterarFoto>
+                        <ButtonsDiv>
+                            <ButtonCancelar><span>Cancelar</span></ButtonCancelar><ButtonConfirmar><span>Salvar Alterações</span></ButtonConfirmar>
+                        </ButtonsDiv>
+                    </form>
+                </div>
+            </DialogDiv>
+            </ModalDiv>
+        )
+
+}
+
+const ModalDiv = styled.div`
+    background-color : #fff;
+    border-radius : 4px;
+    min-width : 560px;
+    color : #666;
+    display: flex;
+    flex-direction : column;
+`
+
+const ButtonConfirmar = styled(Button)`
+    color : rgba(255,255,255,0.87);
+    background-color: rgb(0,188,212);
+    display: inline-block;
+    position: relative;
+    cursor: pointer;
+    min-height: 36px;
+    min-width: 88px;
+    line-height: 36px;
+    vertical-align: middle;
+    align-items: center;
+    text-align: center;
+    border-radius: 3px;
+    box-sizing: border-box;
+    user-select: none;
+    border: 0;
+    padding: 0 6px;
+    margin: 6px 8px;
+    background: transparent;
+    background-color: transparent;
+    color: currentColor;
+    white-space: nowrap;
+    text-transform: uppercase;
+    font-weight: 500;
+    font-size: 14px;
+    font-style: inherit;
+    font-variant: inherit;
+    font-family: inherit;
+    text-decoration: none;
+    overflow: hidden;
+`
+
+const ButtonCancelar = styled(Button)`
+    outline : none;
+    display: inline-block;
+    position: relative;
+    cursor: pointer;
+    min-height: 36px;
+    min-width: 88px;
+    line-height: 36px;
+    vertical-align: middle;
+    align-items: center;
+    text-align: center;
+    border-radius: 3px;
+    box-sizing: border-box;
+    user-select: none;
+    border: 0;
+    padding: 0 6px;
+    margin: 6px 8px;
+    background:transparent;
+    color: currentColor;
+    white-space: nowrap;
+    text-transform: uppercase;
+    font-weight: 500;
+    font-size: 14px;
+    font-style: inherit;
+    font-variant: inherit;
+    font-family: inherit;
+    text-decoration: none;
+    overflow: hidden;
+`
+
+const ButtonsDiv = styled.div`
+    display: flex;
+    justify-content:flex-end;
+`
+
+const AvatarCircleDiv = styled.div`
+    margin-bottom : 0;
+    border-radius : 50%;
+    height : 150px;
+    width : 150px;
+    position : relative;
+`
+
+const DivFlowHolder =styled.div`
+    align-self : auto;
+`
+
+const DivAlterarFoto = styled.div`
+    display : flex;
+    margin-bottom : 30px;
+    flex-direction : row;
+    align-items : center;
+    justify-content :center;
+`
+
+const DialogDiv = styled.div`
+    padding : 20px 30px;
+    overflow : visible !important;
+`
+
+const HeaderDiv = styled.div`
+    display : flex;
+    flex-direction : row;
+    align-items : center;
+    align-content : center;
+    justify-content : center;
+    max-width : 100%;
+`
+const StyledH2 = styled.h2`
+    font-size : 26px;
+    font-weight : lighter;
+    margin-top : 20px;
+    margin-bottom : 10px;
+    font-family: inherit;
+    line-height: 1.1;
+    color: inherit;
+`
+const StyledCloseModalButton = styled(Button)`
+    display : inline-block;
+    position : relative;
+    float : right !important;
+    margin-right : -8px !important;
+    background : transparent !important;
+    min-width: 0 !important;
+    width : 40px;
+    border-radius : 50%;
+    padding : 8px;
+    height : 40px;
+    margin : 0 6px;
+`
diff --git a/src/Components/LoadingSpinner.js b/src/Components/LoadingSpinner.js
new file mode 100644
index 00000000..ffeec909
--- /dev/null
+++ b/src/Components/LoadingSpinner.js
@@ -0,0 +1,11 @@
+import React from 'react';
+import LoadingGif from '../img/loading_busca.gif'
+
+  const LoadingSpinner = (props) => (
+    <div style={{display:"flex", flexDirection:"column", alignItems:"center", justifyContent:"center"}}>
+      <img src={LoadingGif} />
+      <span style={{textTransform:"uppercase"}}>{props.text}</span>
+    </div>
+  );
+
+  export default LoadingSpinner;
diff --git a/src/Components/LoginContainer.js b/src/Components/LoginContainer.js
index 8546fc4c..ccdc075a 100644
--- a/src/Components/LoginContainer.js
+++ b/src/Components/LoginContainer.js
@@ -36,8 +36,8 @@ class LoginContainer extends Component {
         super(props);
 
         this.state = {
-            email : "",
-            senha : "",
+            email : localStorage.getItem("@portalmec/email") || "",
+            senha : localStorage.getItem("@portalmec/senha") ||"",
             checkboxChecked : false
         };
         this.handleChecked = this.handleChecked.bind(this)
@@ -55,8 +55,9 @@ class LoginContainer extends Component {
 
     onSubmit = (e) => {
         e.preventDefault();
+        const login = this.state
 
-        this.props.handleLoginInfo(this.state);
+        this.props.handleLoginInfo(login);
 
         this.setState({
             email: "",
@@ -65,8 +66,11 @@ class LoginContainer extends Component {
     }
 
     handleChecked = (e) => {
+        const value = !this.state.checkboxChecked
+        console.log(this.state.checkboxChecked)
+        console.log(value)
         this.setState({
-            checkboxChecked : !this.state.checkboxChecked
+            checkboxChecked :value
         })
     }
 
@@ -124,12 +128,12 @@ class LoginContainer extends Component {
                         <br/>
 
                         <RememberRecover>
-                            <LabeledCheckbox label={<StyledLabel><StyledSpan>Lembrar-me</StyledSpan></StyledLabel>} onchange={this.handleChecked} disabledCheckbox={this.state.checkboxChecked}/>
+                            <LabeledCheckbox label={<StyledLabel><StyledSpan>Lembrar-me</StyledSpan></StyledLabel>} handleChange={this.handleChecked} />
                             <UserForgotTheirPasswordSpan>Esqueceu a senha? <a href="recuperar-senha" style={{textAlign: "right", color:"#4cd0e1"}}>Clique aqui!</a></UserForgotTheirPasswordSpan>
                         </RememberRecover>
 
                         <ConfirmContainerStyled>
-                            <StyledLoginButton onClick={e => this.onSubmit(e)} variant="contained">
+                            <StyledLoginButton type="submit" variant="contained">
                                 <span style={{borderRadius:"3px", boxSizing:"border-box", fontFamily:"Roboto, sans serif", fontWeight:"500", color:"#fff"}}>ENTRAR</span>
                             </StyledLoginButton>
                         </ConfirmContainerStyled>
diff --git a/src/Components/LoginContainerFunction.js b/src/Components/LoginContainerFunction.js
index d1a5451b..c55da450 100644
--- a/src/Components/LoginContainerFunction.js
+++ b/src/Components/LoginContainerFunction.js
@@ -122,7 +122,7 @@ export default function LoginContainer (props) {
     }
 
     return (
-
+        <div>
             <ContainerStyled >
                 <DialogHeaderStyled>
                     <span style={{width:"32px"}}/>
@@ -190,7 +190,7 @@ export default function LoginContainer (props) {
                     </DialogFooterStyled>
                 </DialogContentDiv>
             </ContainerStyled>
-
+        </div>
     )
 }
 
@@ -202,7 +202,7 @@ export default function LoginContainer (props) {
     display : flex;
     flex-direction : column;
     min-width : 440px;
-    
+
     align : center;
     padding : 10px;
     border-radius: 4px;
diff --git a/src/Components/LoginModal.js b/src/Components/LoginModal.js
index 26607d36..052084e7 100644
--- a/src/Components/LoginModal.js
+++ b/src/Components/LoginModal.js
@@ -79,14 +79,18 @@ export default function LoginModal (props){
                 }
             )
             // console.log(response.headers)
-            // console.log(response.data)
+             console.log(login)
             // console.log(response.data.data.name)
             // console.log(response.data.data.uid)
             localStorage.setItem('@portalmec/accessToken', response.headers['access-token'])
             localStorage.setItem('@portalmec/clientToken', response.headers.client,)
-            localStorage.setItem('@portalmec/id', response.data.data.id)
-            localStorage.setItem('@portalmec/username', response.data.data.name)
-            localStorage.setItem('@portalmec/uid', response.data.data.uid)
+            sessionStorage.setItem('@portalmec/id', response.data.data.id)
+            sessionStorage.setItem('@portalmec/username', response.data.data.name)
+            sessionStorage.setItem('@portalmec/uid', response.data.data.uid)
+            if (login.checkboxChecked) {
+                localStorage.setItem('@portalmec/email', login.email)
+                localStorage.setItem('@portalmec/senha', login.senha) //MUDAR ISSO ASAP
+            }
             props.handleClose();
             props.openSnackbar();
             }, (error) => {
diff --git a/src/Components/ModalAlterarAvatar.js b/src/Components/ModalAlterarAvatar.js
index f770ebf1..8bd1c57e 100644
--- a/src/Components/ModalAlterarAvatar.js
+++ b/src/Components/ModalAlterarAvatar.js
@@ -20,24 +20,26 @@ import React, {useContext, useState} from 'react';
 import { Button } from '@material-ui/core';
 import Modal from '@material-ui/core/Modal';
 import Backdrop from '@material-ui/core/Backdrop';
-import Zoom from '@material-ui/core/Fade';
+import Fade from '@material-ui/core/Fade';
 import styled from 'styled-components'
 import {Store} from '../Store.js'
 import axios from 'axios'
 import {apiUrl} from '../env';
 import CloseIcon from '@material-ui/icons/Close';
+import Profile from '../img/default_profile0.png'
+import ComponentAlterarAvatar from './ComponentAlterarAvatar.js'
 
 const StyledModal = styled(Modal)`
     display : flex;
-    flex-direction : column;
-    border-radius : 4px;
-    background-color : #fff;
-    min-width : 560px;
+    align-items: center;
+    justify-content : center;
+    text-align : center;
+    padding : 10px !important;
 `
 
 export default function ModarAlterarAvatar (props){
     const {state, dispatch} = useContext(Store)
-
+    const [avatarFile, setFile] = useState('')
     const handleLoginInfo = (login) => {
         axios.post(`${apiUrl}`,
             {
@@ -47,13 +49,18 @@ export default function ModarAlterarAvatar (props){
 
             }, (error) => {
 
-            }
-        )
+                }
+            )
+        })
     }
 
+    const handleFile = (selectorFiles : FileList) => {
+        console.log(selectorFiles)
+        {/*setFile()*/}
+    }
 
     return (
-        <>
+
         <StyledModal
             aria-labelledby="transition-modal-title"
             aria-describedby="transition-modal-description"
@@ -67,53 +74,15 @@ export default function ModarAlterarAvatar (props){
                 timeout: 500,
             }}
          >
-            <Zoom in={props.open} style={{ transitionDelay :"0.4ms"}}>
-                <HeaderDiv>
-                    <span style={{width:"32px"}}/>
-                        <StyledH2>Editar Foto</StyledH2>
-                        <StyledCloseModalButton onClick={this.props.handleClose}>
-                            <CloseIcon/>
-                        </StyledCloseModalButton>
-                </HeaderDiv>
-                <DialogDiv>
-                </DialogDiv>
-            </Zoom>
+            <Fade in={props.open} style={{ transitionDelay :"0.4ms"}}>
+
+                <ComponentAlterarAvatar
+                    userAvatar={state.currentUser.userAvatar}
+                    handleFile={handleFile}
+                    handleClose={props.handleClose}
+                />
+            </Fade>
         </StyledModal>
-        </>
+
     )
 }
-
-const DialogDiv = styled.div`
-    padding : 20px 30px;
-    overflow : visible !important;
-`
-
-const HeaderDiv = styled.div`
-    display : flex;
-    flex-direction : row;
-    align-items : center;
-    align-content : center;
-    max-width : 100%;
-`
-const StyledH2 = styled.h2`
-    font-size : 26px;
-    font-weight : lighter;
-    margin-top : 20px;
-    margin-bottom : 10px;
-    font-family: inherit;
-    line-height: 1.1;
-    color: inherit;
-`
-const StyledCloseModalButton = styled(Button)`
-    display : inline-block;
-    position : relative;
-    float : right !important;
-    margin-right : -8px !important;
-    background : transparent !important;
-    min-width: 0 !important;
-    width : 40px;
-    border-radius : 50%;
-    padding : 8px;
-    height : 40px;
-    margin : 0 6px;
-`
diff --git a/src/Components/SignUpContainer.js b/src/Components/SignUpContainer.js
index 21652735..9d01f58d 100644
--- a/src/Components/SignUpContainer.js
+++ b/src/Components/SignUpContainer.js
@@ -176,7 +176,7 @@ class SignUpContainer extends Component {
                         onloadCallback={callback}
                     />
                     <ConfirmContainerStyled>
-                        <StyledSignUpButton onClick={e => this.onSubmit(e)} variant="contained">
+                        <StyledSignUpButton type="submit" variant="contained">
                             <span
                                 style={{paddingLeft:"16px", paddingRight:"16px", borderRadius:"3px", boxSizing:"border-box",
                                     fontFamily:"Roboto, sans serif", fontWeight:"500", color:"#fff"}}
diff --git a/src/Components/SignUpModal.js b/src/Components/SignUpModal.js
index cf38fc14..49386ce7 100644
--- a/src/Components/SignUpModal.js
+++ b/src/Components/SignUpModal.js
@@ -41,23 +41,7 @@ const StyledModalSignUp = styled(Modal)`
 
 `
 
-const useStyles = makeStyles(theme => ({
-  modal: {
-    display: 'flex',
-    alignItems: 'center',
-    justifyContent: 'center',
-    textAlign: "center",
-    maxBlockSize: "350px",
-    width: '100%',
-    minBlockSize: "100px",
-  },
-  paper: {
-    backgroundColor: "theme.palette.background.paper",
-    border: '2px solid #000',
-    boxShadow: " 0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12);",
-    align:"center",
-  },
-}));
+
 
 export default function SignUpModal (props) {
     const { state, dispatch } = useContext(Store)
diff --git a/src/Components/TabPanelAtividades.js b/src/Components/TabPanelAtividades.js
index e26988af..074c12ed 100644
--- a/src/Components/TabPanelAtividades.js
+++ b/src/Components/TabPanelAtividades.js
@@ -5,29 +5,22 @@ import Paper from '@material-ui/core/Paper';
 import Button from '@material-ui/core/Button';
 import axios from 'axios'
 import {apiUrl} from '../env';
+import Bolo from '../img/Bolo.png'
+import LoadingSpinner from './LoadingSpinner.js'
 
 export default function TabPanelAtividades (props) {
     const [notifications, setNotifications] = useState([]);
     const [notificatonsLength, setLength] = useState(0);
-
-    const config = {
-        headers : {
-            'Accept': 'application/json',
-            'Content-Type': 'application/json',
-            'Access-Token': localStorage.getItem('@portalmec/accessToken'),
-            'Client': localStorage.getItem('@portalmec/clientToken'),
-            'Uid': localStorage.getItem('@portalmec/uid'),
-            'Host': 'api.portalmec.c3sl.ufpr.br',
-            'Cookie': ''
-        }
-    }
+    const [loading, handleLoading] = useState(true)
 
     useEffect( () => {
-        axios.get(`${apiUrl}/feed`, config)
+        axios.get(`${apiUrl}/feed`, props.config)
         .then( (response) => {
-                // console.log(response)
-                setNotifications(response)
-                setLength(response.length)
+                handleLoading(false)
+                console.log(response)
+                setNotifications(response.data)
+                console.log(response.data.length)
+                setLength(response.data.length)
             },
             (error) => {
                 console.log('error while running getNotifications')
@@ -36,6 +29,7 @@ export default function TabPanelAtividades (props) {
     }, [])
 
     return (
+
         <ContainerDivStyled>
             <Paper elevation={3}>
                 <div>
@@ -46,17 +40,74 @@ export default function TabPanelAtividades (props) {
                             </TituloContent>
                         </InnerDivTitulo>
                     </DivTitulo>
-                    {/*some sort of map with a list of notifications idk what though*/}
-                    <div>
-                        <LoadMoreButton><span>CARREGAR MAIS 4</span></LoadMoreButton>
-                        <LoadMoreButton><span>CARREGAR MAIS 20</span></LoadMoreButton>
-                    </div>
+                    {
+                        loading ?
+                        (
+                            <LoadingSpinner text={'Carregando Atividades'}/>
+                        )
+                        :
+                        (
+                            [
+                                <div>
+                                {
+                                    notificatonsLength == 0 ?
+                                    (
+                                        [
+                                            <NoNotificationsDiv>
+                                            <div>
+                                            <div>
+                                            <H3Styled><img src={Bolo} alt='bolo' style={{width:"23px"}}/>  Você se cadastrou na Plataforma</H3Styled>
+                                            </div>
+                                            <p
+                                            style={{fontSize:"15px", fontWeight:"lighter", margin:"0 0 10px", display:"flex", justifyContent:"center", textAlign:"center"}}
+                                            >Construa conosco a plataforma e amplie sua rede de conhecimento interagindo
+                                            <br/>
+                                            com pessoas envolvidas com experiências que ocorrem em todo o Brasil!
+                                            </p>
+
+                                            </div>
+                                            </NoNotificationsDiv>
+                                        ]
+                                    )
+                                    :
+                                    (
+                                        [   <>
+                                            {/*some sort of map with a list of notifications idk what though*/}
+                                            <LoadMoreButton><span>CARREGAR MAIS 4</span></LoadMoreButton>
+                                            <LoadMoreButton><span>CARREGAR MAIS 20</span></LoadMoreButton>
+                                            </>
+                                        ]
+                                    )
+                                }
+                                </div>
+
+                            ]
+                        )
+                }
                 </div>
             </Paper>
         </ContainerDivStyled>
     )
 }
 
+const H3Styled = styled.h3`
+    font-size: 24px;
+    font-weight : lighter;
+    color : #00bcd4;
+    margin-top : 20px;
+    margin-bottom : 10px;
+    display : flex;
+    justify-content : center;
+    align-items : center;
+`
+
+const NoNotificationsDiv = styled.div`
+    height : 250px;
+    display: flex;
+    align-items : center;
+    justify-content : center;
+`
+
 const LoadMoreButton = styled(Button)`
     outline : none !important;
     display : inline-block !important;
diff --git a/src/Components/TabPanelColecoes.js b/src/Components/TabPanelColecoes.js
index 85d97654..b865f48b 100644
--- a/src/Components/TabPanelColecoes.js
+++ b/src/Components/TabPanelColecoes.js
@@ -1,44 +1,123 @@
-import React, {useContext} from 'react'
+import React, {useContext, useState, useEffect} from 'react'
 import styled from 'styled-components'
 import { Container } from 'react-grid-system'
 import Paper from '@material-ui/core/Paper';
 import Button from '@material-ui/core/Button';
 import {ButtonMostrarTodos, ButtonMostrarMais, BtnAlinhaRecPvt, DivContainerRecursosPublicados, ContainerDivStyled, DivTitulo, StyledP, StyledHR} from './TabPanelMeusRecursos.js'
+import {NoPubSpan, DivConteudoNaoPublicado, DivTextoNoPublications} from './TabPanelMeusRecursos.js'
+import LoadingSpinner from './LoadingSpinner.js'
+import axios from 'axios'
+import {apiUrl} from '../env';
 
 export default function TabPanelColecoes (props) {
+    const [loading, handleLoading] = useState(true)
+
+    const [userCollections, setuserCollections] = useState([])
+    const [userCollectionsLength, setuserCollectionsLength] = useState(0)
+
+    const [followedCollections, setFollowedCollections] = useState([])
+    const [followedCollectionsLength, setfollowedCollectionsLength] = useState(0)
+
+    useEffect( () => {
+        axios.all([
+            axios.get((`${apiUrl}/users/` + props.id + '/collections'), props.config),
+            axios.get((`${apiUrl}/users/` + props.id + '/following/Collection'), props.config),
+        ])
+        .then( (responseArr) => {
+                handleLoading(false)
+                console.log(responseArr)
+                console.log(responseArr[0].data)
+                console.log(responseArr[1].data)
+            },
+            (error) => {
+                handleLoading(false)
+                console.log('error while running axios all')
+            }
+        )
+    }, [])
+
     return (
-        <React.Fragment>
-            <ContainerDivStyled>
-                <Paper elevation={3}>
-                        <DivTitulo>
-                            <StyledP>Minhas Coleções <b style={{fontWeight:"700", fontSize:"20px"}}>(2)</b></StyledP>
-                            <StyledHR/>
-                        </DivTitulo>
-                        <div style={{height : "400px"}}> //REMOVER ISSO
-                            <DivContainerRecursosPublicados>
-                            </DivContainerRecursosPublicados>
-                            <BtnAlinhaRecPvt>
-                                <p style={{margin:"0 0 10px", fontSize:"14px"}}>Carregados 2 de 2</p>
-                            </BtnAlinhaRecPvt>
-                        </div>
-                </Paper>
-            </ContainerDivStyled>
-
-            <ContainerDivStyled>
-                <Paper elevation={3}>
-                        <DivTitulo>
-                            <StyledP>Coleções que eu sigo <b style={{fontWeight:"700", fontSize:"20px"}}>(4)</b></StyledP>
-                            <StyledHR/>
-                        </DivTitulo>
-                        <div style={{height : "400px"}}> //REMOVER ISSO
-                            <DivContainerRecursosPublicados>
-                            </DivContainerRecursosPublicados>
-                            <BtnAlinhaRecPvt>
-                                <p style={{margin:"0 0 10px", fontSize:"14px"}}>Carregados 4 de 4</p>
-                            </BtnAlinhaRecPvt>
-                        </div>
-                </Paper>
-            </ContainerDivStyled>
-        </React.Fragment>
+        <>
+        {
+            loading ?
+            (
+                <LoadingSpinner text={'CARREGANDO COLEÇÕES'}/>
+
+            )
+            :
+            (
+                [
+                    <React.Fragment>
+                        <ContainerDivStyled>
+                            <Paper elevation={3}>
+                                    <DivTitulo>
+                                        <StyledP>Minhas Coleções <b style={{fontWeight:"700", fontSize:"20px"}}>({userCollectionsLength})</b></StyledP>
+                                        <StyledHR/>
+                                    </DivTitulo>
+                                    <div style={{height : "400px"}}>
+                                    {
+                                        userCollectionsLength == 0 ?
+                                        (
+                                            [
+                                                <span>Adicionar tela "criar colecao" e a imagem</span>
+                                            ]
+                                        )
+                                        :
+                                        (
+                                            <>
+                                            <DivContainerRecursosPublicados>
+                                            </DivContainerRecursosPublicados>
+                                            <BtnAlinhaRecPvt>
+                                                <p style={{margin:"0 0 10px", fontSize:"14px"}}>Carregados 2 de 2</p>
+                                            </BtnAlinhaRecPvt>
+                                            </>
+                                        )
+                                    }
+
+                                    </div>
+                            </Paper>
+                        </ContainerDivStyled>
+
+                        <ContainerDivStyled>
+                            <Paper elevation={3}>
+                                    <DivTitulo>
+                                        <StyledP>Coleções que eu sigo <b style={{fontWeight:"700", fontSize:"20px"}}>({followedCollectionsLength})</b></StyledP>
+                                        <StyledHR/>
+                                    </DivTitulo>
+                                    <div style={{height : "400px"}}>
+                                        {
+                                            followedCollectionsLength == 0 ?
+                                            (
+                                                [
+                                                    <>
+                                                    <DivTextoNoPublications>
+                                                    <DivConteudoNaoPublicado>
+                                                    <NoPubSpan>Você ainda não segue nenhuma coleção.</NoPubSpan>
+                                                    </DivConteudoNaoPublicado>
+                                                    </DivTextoNoPublications>
+                                                    </>
+                                                ]
+                                            )
+                                            :
+                                            (
+                                                [
+                                                    <>
+                                                    <DivContainerRecursosPublicados>
+                                                    </DivContainerRecursosPublicados>
+                                                    <BtnAlinhaRecPvt>
+                                                        <p style={{margin:"0 0 10px", fontSize:"14px"}}>Carregados 4 de 4</p>
+                                                    </BtnAlinhaRecPvt>
+                                                    </>
+                                                ]
+                                            )
+                                        }
+                                    </div>
+                            </Paper>
+                        </ContainerDivStyled>
+                    </React.Fragment>
+                ]
+            )
+        }
+        </>
     )
 }
diff --git a/src/Components/TabPanelFavoritos.js b/src/Components/TabPanelFavoritos.js
index 1615309d..71c3e50a 100644
--- a/src/Components/TabPanelFavoritos.js
+++ b/src/Components/TabPanelFavoritos.js
@@ -1,57 +1,148 @@
-import React, {useContext} from 'react'
+import React, {useContext, useState, useEffect} from 'react'
 import styled from 'styled-components'
 import { Container } from 'react-grid-system'
 import Paper from '@material-ui/core/Paper';
 import Button from '@material-ui/core/Button';
+import axios from 'axios'
+import {apiUrl} from '../env';
 import {ButtonMostrarTodos, ButtonMostrarMais, BtnAlinhaRecPvt, DivContainerRecursosPublicados, ContainerDivStyled, DivTitulo, StyledP, StyledHR} from './TabPanelMeusRecursos.js'
+import {NoPubSpan, DivConteudoNaoPublicado, DivTextoNoPublications} from './TabPanelMeusRecursos.js'
+import LoadingSpinner from './LoadingSpinner.js'
 
 export default function TabPanelFavoritos (props) {
+    const [loading, handleLoading] = useState(true)
+
+    const [likedLearnObjs, setlikedLearnObjs] = useState([])
+    const [likedLearnObjsLength, setlikedLearnObjsLength] = useState(0)
+
+    const [likedCollections, setlikedCollections] = useState([])
+    const [likedCollectionsLength, setlikedCollectionsLength] = useState(0)
+
+    useEffect( () => {
+        axios.all([
+            axios.get((`${apiUrl}/users/` + props.id + '/learning_objects/liked'), props.config),
+            axios.get((`${apiUrl}/users/` + props.id + '/collections/liked'), props.config),
+        ])
+        .then( (responseArr) => {
+                handleLoading(false)
+                console.log(responseArr)
+                console.log(responseArr[0].data)
+                console.log(responseArr[1].data)
+            },
+            (error) => {
+                handleLoading(false)
+                console.log('error while running axios all')
+            }
+        )
+    }, [])
+
     return (
-        <React.Fragment>
-            <ContainerDivStyled>
-                <Paper elevation={3}>
-                        <DivTitulo>
-                            <StyledP>Recursos Favoritados <b style={{fontWeight:"700", fontSize:"20px"}}>(43)</b></StyledP>
-                            <StyledHR/>
-                        </DivTitulo>
-                        <div style={{height : "400px"}}> //REMOVER ISSO
-                            <DivContainerRecursosPublicados>
-                            </DivContainerRecursosPublicados>
-                            <BtnAlinhaRecPvt>
-                                <p style={{margin:"0 0 10px", fontSize:"14px"}}>Carregados 4 de 7</p>
-                                <ButtonMostrarMais>
-                                    <span style={{color:"#fff", fontSize:"14px", fontWeight:"500"}}>MOSTRAR MAIS</span>
-                                </ButtonMostrarMais>
-                                <ButtonMostrarTodos>
-                                    <span style={{color:"#666", fontSize:"14px", fontWeight:"500"}}>MOSTRAR TODOS</span>
-                                </ButtonMostrarTodos>
-                            </BtnAlinhaRecPvt>
-                        </div>
-                </Paper>
-            </ContainerDivStyled>
+        <>
+        {
+            loading?
+            (
+                <LoadingSpinner text={'CARREGANDO...'}/>
+            )
+            :
+            (
+                [
+                    <React.Fragment>
+                        <ContainerDivStyled>
+                            <Paper elevation={3}>
+                                    <DivTitulo>
+                                        <StyledP>Recursos Favoritados <b style={{fontWeight:"700", fontSize:"20px"}}>({likedLearnObjsLength})</b></StyledP>
+                                        <StyledHR/>
+                                    </DivTitulo>
+                                    <div style={{height : "400px"}}>
+                                        {
+                                            likedLearnObjsLength == 0 ?
+                                            (
+                                                [
+                                                    <>
+                                                    <DivTextoNoPublications>
+                                                    <DivConteudoNaoPublicado>
+                                                    <NoPubSpan>Você ainda não curtiu nenhum Recurso.</NoPubSpan>
+                                                    <p style={{fontFamily:"Roboto",fontSize:"16px"}}>Quando você favorita um recurso ele aparece nesta seção. Além disso, você
+                                                    <br/>
+                                                    aumenta o prestígio dele na Plataforma. Para favoritar, basta clicar no ícone de
+                                                    <br/>
+                                                    coração que aparece nos Recursos.
+                                                    </p>
+                                                    </DivConteudoNaoPublicado>
+                                                    </DivTextoNoPublications>
+                                                    </>
+                                                ]
+                                            )
+                                            :
+                                            (
+                                                [
+                                                    <>
+                                                        <DivContainerRecursosPublicados>
+                                                        </DivContainerRecursosPublicados>
+                                                        <BtnAlinhaRecPvt>
+                                                            <p style={{margin:"0 0 10px", fontSize:"14px"}}>Carregados 4 de 7</p>
+                                                            <ButtonMostrarMais>
+                                                                <span style={{color:"#fff", fontSize:"14px", fontWeight:"500"}}>MOSTRAR MAIS</span>
+                                                            </ButtonMostrarMais>
+                                                            <ButtonMostrarTodos>
+                                                                <span style={{color:"#666", fontSize:"14px", fontWeight:"500"}}>MOSTRAR TODOS</span>
+                                                            </ButtonMostrarTodos>
+                                                        </BtnAlinhaRecPvt>
+                                                    </>
+                                                ]
+                                            )
+                                        }
+                                    </div>
+                            </Paper>
+                        </ContainerDivStyled>
 
-            <ContainerDivStyled>
-                <Paper elevation={3}>
-                        <DivTitulo>
-                            <StyledP>Recursos Favoritados <b style={{fontWeight:"700", fontSize:"20px"}}>(43)</b></StyledP>
-                            <StyledHR/>
-                        </DivTitulo>
-                        <div style={{height : "400px"}}> //REMOVER ISSO
-                            <DivContainerRecursosPublicados>
-                            </DivContainerRecursosPublicados>
-                            <BtnAlinhaRecPvt>
-                                <p style={{margin:"0 0 10px", fontSize:"14px"}}>Carregados 4 de 7</p>
-                                <ButtonMostrarMaisColecao>
-                                    <span style={{color:"#fff", fontSize:"14px", fontWeight:"500"}}>MOSTRAR MAIS</span>
-                                </ButtonMostrarMaisColecao>
-                                <ButtonMostrarTodos>
-                                    <span style={{color:"#666", fontSize:"14px", fontWeight:"500"}}>MOSTRAR TODOS</span>
-                                </ButtonMostrarTodos>
-                            </BtnAlinhaRecPvt>
-                        </div>
-                </Paper>
-            </ContainerDivStyled>
-        </React.Fragment>
+                        <ContainerDivStyled>
+                            <Paper elevation={3}>
+                                    <DivTitulo>
+                                        <StyledP>Coleções Favoritadas <b style={{fontWeight:"700", fontSize:"20px"}}>({likedCollectionsLength})</b></StyledP>
+                                        <StyledHR/>
+                                    </DivTitulo>
+                                    <div style={{height : "400px"}}>
+                                        {
+                                            likedCollectionsLength  == 0 ?
+                                            (
+                                                [
+                                                    <>
+                                                    <DivTextoNoPublications>
+                                                    <DivConteudoNaoPublicado>
+                                                    <NoPubSpan>Você ainda não curtiu nenhuma coleção.</NoPubSpan>
+                                                    </DivConteudoNaoPublicado>
+                                                    </DivTextoNoPublications>
+                                                    </>
+                                                ]
+                                            )
+                                            :
+                                            (
+                                                [
+                                                    <>
+                                                    <DivContainerRecursosPublicados>
+                                                    </DivContainerRecursosPublicados>
+                                                    <BtnAlinhaRecPvt>
+                                                        <p style={{margin:"0 0 10px", fontSize:"14px"}}>Carregados 4 de 7</p>
+                                                        <ButtonMostrarMaisColecao>
+                                                            <span style={{color:"#fff", fontSize:"14px", fontWeight:"500"}}>MOSTRAR MAIS</span>
+                                                        </ButtonMostrarMaisColecao>
+                                                        <ButtonMostrarTodos>
+                                                            <span style={{color:"#666", fontSize:"14px", fontWeight:"500"}}>MOSTRAR TODOS</span>
+                                                        </ButtonMostrarTodos>
+                                                    </BtnAlinhaRecPvt>
+                                                    </>
+                                                ]
+                                            )
+                                        }
+                                    </div>
+                            </Paper>
+                        </ContainerDivStyled>
+                    </React.Fragment>
+                ]
+            )
+        }
+        </>
     )
 }
 
diff --git a/src/Components/TabPanelMeusRecursos.js b/src/Components/TabPanelMeusRecursos.js
index d43f9643..1f2b432b 100644
--- a/src/Components/TabPanelMeusRecursos.js
+++ b/src/Components/TabPanelMeusRecursos.js
@@ -5,66 +5,160 @@ import Paper from '@material-ui/core/Paper';
 import Button from '@material-ui/core/Button';
 import axios from 'axios'
 import {apiUrl} from '../env';
+import LoadingSpinner from './LoadingSpinner.js'
 
 export default function TabPanelAtividades (props) {
+    const [loading, handleLoading] = useState(true)
+
+    const [learningObjects, setLearningObjects] = useState([]);
+    const [learningObjectsLength, setLengthLearnObj] = useState(0);
+
+    const [drafts, setDrafts] = useState([]);
+    const [draftsLength, setLengthDrafts] = useState(0);
+
+    const [curating, setCurating] = useState([]);
+    const [curatingLength, setLengthCurating] = useState(0);
+
+    useEffect( () => {
+        axios.all([
+            axios.get((`${apiUrl}/users/` + props.id + '/learning_objects'), props.config),
+            axios.get((`${apiUrl}/users/` + props.id + '/drafts'), props.config),
+            axios.get((`${apiUrl}/users/` + props.id + '/submissions?stats=submitted'), props.config)
+        ])
+        .then( (responseArr) => {
+                handleLoading(false)
+                console.log(responseArr)
+                console.log(responseArr[0].data)
+                console.log(responseArr[1].data)
+                console.log(responseArr[2].data)
+
+            },
+            (error) => {
+                handleLoading(false)
+                console.log('error while running axios all')
+            }
+        )
+    }, [])
+
+
     return (
-        <React.Fragment>
-            <ContainerDivStyled>
-                <Paper elevation={3}>
-
-                        <DivTitulo>
-                            <StyledP>Recurso Publicado <b style={{fontWeight:"700", fontSize:"20px"}}>(0)</b></StyledP>
-                            <StyledHR/>
-                        </DivTitulo>
-                        <div>
-                            <DivTextoNoPublications>
+        <>
+            {
+                loading ?
+                (
+                    <LoadingSpinner text={'Carregando Recursos'}/>
+                )
+                :
+                ([
+                    <React.Fragment>
+                    <ContainerDivStyled>
+                    <Paper elevation={3}>
+
+                    <DivTitulo>
+                    <StyledP>Recurso Publicado <b style={{fontWeight:"700", fontSize:"20px"}}>({learningObjectsLength})</b></StyledP>
+                    <StyledHR/>
+                    </DivTitulo>
+                    <div>
+                    {
+                        learningObjectsLength == 0 ?
+                        (
+                            [
+                                <>
+                                <DivTextoNoPublications>
                                 <DivConteudoNaoPublicado>
-                                    <NoPubSpan>Você ainda não publicou nenhum Recurso!</NoPubSpan>
+                                <NoPubSpan>Você ainda não publicou nenhum Recurso!</NoPubSpan>
                                 </DivConteudoNaoPublicado>
-                            </DivTextoNoPublications>
-                        </div>
-                </Paper>
-            </ContainerDivStyled>
-
-            <ContainerDivStyled>
-                <Paper elevation={3}>
-                        <DivTitulo>
-                            <StyledP>Rascunhos<b style={{fontWeight:"700", fontSize:"20px"}}>(7)</b></StyledP>
-                            <StyledHR/>
-                        </DivTitulo>
-                        <div style={{height : "400px"}}> //REMOVER ISSO
-                            <DivContainerRecursosPublicados>
-                            </DivContainerRecursosPublicados>
-                            <BtnAlinhaRecPvt>
+                                </DivTextoNoPublications>
+                                </>
+                            ]
+                        )
+                        :
+                        (
+                            <>
+                            {/**some sort of map with a list of notifications idk what though**/}
+                            <span>stuff goes here</span>
+                            </>
+                        )
+
+                    }
+                    </div>
+                    </Paper>
+                    </ContainerDivStyled>
+
+                    <ContainerDivStyled>
+                    <Paper elevation={3}>
+                    <DivTitulo>
+                    <StyledP>Rascunhos <b style={{fontWeight:"700", fontSize:"20px"}}>({draftsLength})</b></StyledP>
+                    <StyledHR/>
+                    </DivTitulo>
+                    <div style={{height : "400px"}}>
+                    {
+                        draftsLength == 0 ?
+                        (
+                            [
+                                <>
+                                <DivTextoNoPublications>
+                                <DivConteudoNaoPublicado>
+                                <NoPubSpan>Você não tem nenhum recurso sendo editado.</NoPubSpan>
+                                </DivConteudoNaoPublicado>
+                                </DivTextoNoPublications>
+                                </>
+                            ]
+                        )
+                        : (
+                            [
+                                <>
+                                <DivContainerRecursosPublicados>
+                                </DivContainerRecursosPublicados>
+                                <BtnAlinhaRecPvt>
                                 <p style={{margin:"0 0 10px", fontSize:"14px"}}>Carregados 4 de 7</p>
                                 <ButtonMostrarMais>
-                                    <span style={{color:"#fff", fontSize:"14px", fontWeight:"500"}}>MOSTRAR MAIS</span>
+                                <span style={{color:"#fff", fontSize:"14px", fontWeight:"500"}}>MOSTRAR MAIS</span>
                                 </ButtonMostrarMais>
                                 <ButtonMostrarTodos>
-                                    <span style={{color:"#666", fontSize:"14px", fontWeight:"500"}}>MOSTRAR TODOS</span>
+                                <span style={{color:"#666", fontSize:"14px", fontWeight:"500"}}>MOSTRAR TODOS</span>
                                 </ButtonMostrarTodos>
-                            </BtnAlinhaRecPvt>
-                        </div>
-                </Paper>
-            </ContainerDivStyled>
-
-            <ContainerDivStyled>
-                <Paper elevation={3}>
-
-                        <DivTitulo>
-                            <StyledP>Recurso sendo avaliado pela curadoria <b style={{fontWeight:"700", fontSize:"20px"}}>(0)</b></StyledP>
-                            <StyledHR/>
-                        </DivTitulo>
-                        <div>
+                                </BtnAlinhaRecPvt>
+                                </>
+                            ]
+                        )
+                    }
+                    </div>
+                    </Paper>
+                    </ContainerDivStyled>
+
+                    <ContainerDivStyled>
+                    <Paper elevation={3}>
+
+                    <DivTitulo>
+                    <StyledP>Recurso sendo avaliado pela curadoria <b style={{fontWeight:"700", fontSize:"20px"}}>({curatingLength})</b></StyledP>
+                    <StyledHR/>
+                    </DivTitulo>
+                    <div>
+                    {
+                        curatingLength == 0 ?
+                        (
                             <DivTextoNoPublications>
-                                <DivConteudoNaoPublicado>
-                                    <NoPubSpan>Você não tem nenhum recurso sendo avaliado pelos curadores.</NoPubSpan>
-                                </DivConteudoNaoPublicado>
+                            <DivConteudoNaoPublicado>
+                            <NoPubSpan>Você não tem nenhum recurso sendo avaliado pelos curadores.</NoPubSpan>
+                            </DivConteudoNaoPublicado>
                             </DivTextoNoPublications>
-                        </div>
-                </Paper>
-            </ContainerDivStyled>
-        </React.Fragment>
+                        )
+                        :
+                        (
+                            <>
+                            {/**some sort of map with a list of notifications idk what though**/}
+                            <span>stuff goes here</span>
+                            </>
+                        )
+                    }
+                    </div>
+                    </Paper>
+                    </ContainerDivStyled>
+                    </React.Fragment>
+                ])
+            }
+            </>
     )
 }
 
@@ -118,19 +212,19 @@ export const DivContainerRecursosPublicados = styled.div`
     padding-left : 15px;
 `
 
-const NoPubSpan = styled.span`
+export const NoPubSpan = styled.span`
     font-size : 24px;
     font-family : Roboto;
     font-weight : lighter;
 `
 
-const DivConteudoNaoPublicado = styled.div`
+export const DivConteudoNaoPublicado = styled.div`
     position : relative;
     top : 50%;
     transform : translateY(-50%);
 `
 
-const DivTextoNoPublications = styled.div`
+export const DivTextoNoPublications = styled.div`
     height : 360px;
     text-align : center;
     width : 100%;
diff --git a/src/Components/TabPanelRede.js b/src/Components/TabPanelRede.js
index cebbf197..e3f3aa61 100644
--- a/src/Components/TabPanelRede.js
+++ b/src/Components/TabPanelRede.js
@@ -1,11 +1,15 @@
-import React, {useContext} from 'react'
+import React, {useContext, useState, useEffect} from 'react'
 import styled from 'styled-components'
 import { Container } from 'react-grid-system'
 import Paper from '@material-ui/core/Paper';
 import Button from '@material-ui/core/Button';
 import {ButtonMostrarTodos, ButtonMostrarMais, BtnAlinhaRecPvt, DivContainerRecursosPublicados, ContainerDivStyled, DivTitulo, StyledP, StyledHR} from './TabPanelMeusRecursos.js'
+import axios from 'axios'
+import {apiUrl} from '../env';
 
 export default function TabPanelRede (props) {
+    
+
     return (
         <React.Fragment>
             <ContainerDivStyled>
@@ -14,7 +18,7 @@ export default function TabPanelRede (props) {
                             <StyledP>Seguidor <b style={{fontWeight:"700", fontSize:"20px"}}>(1)</b></StyledP>
                             <StyledHR/>
                         </DivTitulo>
-                        <div style={{height : "400px"}}> //REMOVER ISSO
+                        <div style={{height : "400px"}}>
                             <DivContainerRecursosPublicados>
                             </DivContainerRecursosPublicados>
                             <BtnAlinhaRecPvt>
@@ -30,7 +34,7 @@ export default function TabPanelRede (props) {
                             <StyledP>Seguindo <b style={{fontWeight:"700", fontSize:"20px"}}>(1)</b></StyledP>
                             <StyledHR/>
                         </DivTitulo>
-                        <div style={{height : "400px"}}> //REMOVER ISSO
+                        <div style={{height : "400px"}}>
                             <DivContainerRecursosPublicados>
                             </DivContainerRecursosPublicados>
                             <BtnAlinhaRecPvt>
diff --git a/src/Pages/UserPage.js b/src/Pages/UserPage.js
index d8fef866..e39dbe78 100644
--- a/src/Pages/UserPage.js
+++ b/src/Pages/UserPage.js
@@ -39,6 +39,7 @@ import TabPanelColecoes from '../Components/TabPanelColecoes.js'
 import TabPanelRede from '../Components/TabPanelRede.js'
 import axios from 'axios'
 import {apiUrl} from '../env';
+import ModarAlterarAvatar from '../Components/ModalAlterarAvatar.js'
 
 export default function UserPage (props){
     const {state, dispatch} = useContext(Store)
@@ -46,6 +47,23 @@ export default function UserPage (props){
     const [value, setValue] = useState(0);
     const user = localStorage.getItem('@portalmec/username')
     const id = localStorage.getItem('@portalmec/id')
+    const [modalOpen, handleModal] = useState(false)
+
+    const config = {
+        headers : {
+            'Accept': 'application/json',
+            'Content-Type': 'application/json',
+            'Access-Token': localStorage.getItem('@portalmec/accessToken'),
+            'Client': localStorage.getItem('@portalmec/clientToken'),
+            'Uid': sessionStorage.getItem('@portalmec/uid'),
+            'Host': 'api.portalmec.c3sl.ufpr.br',
+            'Cookie': ''
+        }
+    }
+
+    const modalControl = () => {
+        handleModal(!modalOpen)
+    }
 
     const handleHoverAlterarFoto = () => {
         handleAlterarFoto(!hoverAlterarFoto)
@@ -97,6 +115,10 @@ export default function UserPage (props){
             (
                 [
                     <React.Fragment>
+                        <ModarAlterarAvatar
+                            open={modalOpen}
+                            handleClose={modalControl}
+                        />
                         <HeaderDiv>
                             <ContainerNoPad>
                                 <BreadcrumbsDiv>
@@ -129,7 +151,7 @@ export default function UserPage (props){
                                                     </Tooltip>
                                                 </label>
                                             </CoverContainer>
-                                            <ProfileAvatarDiv onMouseEnter={handleHoverAlterarFoto} onMouseLeave={handleHoverAlterarFoto}>
+                                            <ProfileAvatarDiv onMouseEnter={handleHoverAlterarFoto} onMouseLeave={handleHoverAlterarFoto} onClick={modalControl}>
                                                 <img src={state.currentUser.userAvatar} alt = "user avatar" style={{border:"0", verticalAlign:"middle"}}/>
                                                 <ChangeAvatarDiv  style={ {display : hoverAlterarFoto ? 'flex' : 'none'}}>
                                                     <span>Alterar Foto</span>
@@ -198,11 +220,11 @@ export default function UserPage (props){
                                     </Paper>
                                 </MainContainerDesktop>
                                 </div>
-                                {value === 0 && <TabPanelAtividades/>}
-                                {value === 1 && <TabPanelMeusRecursos/>}
-                                {value === 2 && <TabPanelFavoritos/>}
-                                {value === 3 && <TabPanelColecoes/>}
-                                {value === 4 && <TabPanelRede/>}
+                                {value === 0 && <TabPanelAtividades id={id} config={config}/>}
+                                {value === 1 && <TabPanelMeusRecursos id={id} config={config}/>}
+                                {value === 2 && <TabPanelFavoritos id={id} config={config}/>}
+                                {value === 3 && <TabPanelColecoes id={id} config={config}/>}
+                                {value === 4 && <TabPanelRede id={id} config={config}/>}
                             </ContainerNoPad>
                         </HeaderDiv>
                     </React.Fragment>
@@ -279,7 +301,7 @@ export default function UserPage (props){
     outline : 0;
     cursor : pointer;
   `
-  const ChangeAvatarDiv = styled.div`
+  export const ChangeAvatarDiv = styled.div`
   height : 40px;
   position: absolute;
   width : 100%;
diff --git a/src/img/Bolo.png b/src/img/Bolo.png
new file mode 100644
index 0000000000000000000000000000000000000000..509d2acae8705430a4707bb88fc07bd04ae33999
GIT binary patch
literal 394
zcmV;50d@X~P)<h;3K|Lk000e1NJLTq000vJ000*V1^@s6>A`f`00009a7bBm000XU
z000XU0RWnu7ytkO8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0T)R`
zK~#9!%v8Y<f-n#S8<4kt@a;o7fUyEgh#jN^?7$MB0%<_S4tVGvAO5uhyki!}VG;tG
zalDxwa&wo>v3H46Rh83)$^PsUa#J2-<d`icgww-Cni5@R)EN;(^f|(P5d7P6e%Ixj
zDid$(F=5q}Y$EeozW)u`7Qe@KB_tnf2Hm*2fV9d@4d~O&jGI8Du?@1`R{thWmFU<|
zV=X1gkhwJ7-0q!)!e%2>WW$72&2(gILaK?Sx)_t?3Zjez6^czM#8$;hZh!~f0!(~?
z0}5<v5AZ8SzQBFu!xJXsu_!?z5o|`}geQn&5!Q>=^~zC5T^T!}1^qWa>E?fsB^G%2
o&C8mL9w=VbAy(38lurQ$07q<+GPoGwnE(I)07*qoM6N<$f@Uk9nE(I)

literal 0
HcmV?d00001

diff --git a/src/img/loading_busca.gif b/src/img/loading_busca.gif
new file mode 100644
index 0000000000000000000000000000000000000000..3ce6d59693025fbd428c063f7f565a858c20d4db
GIT binary patch
literal 10901
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

literal 0
HcmV?d00001

-- 
GitLab