diff --git a/src/Components/ColCardOwnerOptions.js b/src/Components/ColCardOwnerOptions.js index 279ffa96b70221a6d28b2d34bdcf8082fdadd2b7..a075780622f76c453592afb7d07b84de6ccd3df3 100644 --- a/src/Components/ColCardOwnerOptions.js +++ b/src/Components/ColCardOwnerOptions.js @@ -42,7 +42,6 @@ export default function ColCardOwnerOptions (props) { } const [modalExcluirOpen, toggleModalExcluir] = useState(false) - const openModalExcluir = () => {toggleModalExcluir(true)} const [modalEditarOpen, toggleModalEditar] = useState(false) @@ -50,7 +49,7 @@ export default function ColCardOwnerOptions (props) { return ( <> <ModalExcluirColecao id={props.id} - open={modalExcluirOpen} handleClose={() => {toggleModalExcluir(false)}} + open={modalExcluirOpen} handleClose={() => {toggleModalExcluir(false)}} removeColl={props.removeColl} /> <ModalEditarColecao id={props.id} open={modalEditarOpen} handleClose={() => {toggleModalEditar(false)}} @@ -78,7 +77,7 @@ export default function ColCardOwnerOptions (props) { <ListItemIcon><CreateIcon /></ListItemIcon>Editar </StyledMenuItem> - <StyledMenuItem onClick={openModalExcluir}> + <StyledMenuItem onClick={() => {toggleModalExcluir(true)}} > <ListItemIcon><DeleteForeverIcon /></ListItemIcon>Excluir </StyledMenuItem> diff --git a/src/Components/CollectionCardFunction.js b/src/Components/CollectionCardFunction.js index 85f59e03ce1471a18330239ee2480e0ef1b41d99..6f7322e7261536655d78098ad28b3639e87af2a5 100644 --- a/src/Components/CollectionCardFunction.js +++ b/src/Components/CollectionCardFunction.js @@ -272,6 +272,7 @@ export default function CollectionCardFunction(props) { id={props.id} changeColName={changeColName} changeColPrivacy={changeColPrivacy} + removeColl={props.removeColl} /> </Grid> </Grid> diff --git a/src/Components/ModalExcluirColecao.js b/src/Components/ModalExcluirColecao.js index 879112aebb46690447dcc1b3cdecb62e90adbbff..f23b819d88584a3ee2fab19dd94bf3935c90b782 100644 --- a/src/Components/ModalExcluirColecao.js +++ b/src/Components/ModalExcluirColecao.js @@ -31,6 +31,7 @@ export default function ModalExcluirColecao (props) { function handleDeleteSuccess (data) { toggleSnackbar(true) + props.removeColl(props.id) props.handleClose() } const handleDelete = () => { diff --git a/src/Components/TabPanels/PanelComponents/TemplateRede.js b/src/Components/TabPanels/PanelComponents/TemplateRede.js index 4fd3364085585a62ff575b4833c9aedd7ba97394..c792b7d2de531c63ef2ec1b44b2f4a61b992b163 100644 --- a/src/Components/TabPanels/PanelComponents/TemplateRede.js +++ b/src/Components/TabPanels/PanelComponents/TemplateRede.js @@ -76,7 +76,7 @@ export default function PanelTemplateRede(props) { props.sliceArr.map((card) => <> { - card.follower && + card.follower && card.followable && <Grid item xs={12} sm={6} md={'auto'} lg={3} key={card.id}> {RenderContactCard(card, props.follower)} </Grid> diff --git a/src/Components/TabPanels/PublicUserPageTabs/LastCollections.js b/src/Components/TabPanels/PublicUserPageTabs/LastCollections.js index 553b9788dc860e290de3b72bf1acdfd7e06b1730..6e32577f77617b47bda1298c2a583ce7a50cf249 100644 --- a/src/Components/TabPanels/PublicUserPageTabs/LastCollections.js +++ b/src/Components/TabPanels/PublicUserPageTabs/LastCollections.js @@ -54,7 +54,7 @@ export default function LastCols(props) { <StyledGrid container spacing={1} style={{ paddingLeft: "0.5em" }}> { props.collections.slice(0, 4).map((card) => - <Grid item md={3} xs={12} key={card.id}> + <Grid item container md={3} xs={12} key={card.id}> <CollectionCardFunction name={card.name} tags={card.tags} diff --git a/src/Components/TabPanels/PublicUserPageTabs/TabColecoes.js b/src/Components/TabPanels/PublicUserPageTabs/TabColecoes.js index 22fe8e4da3e4ba7e536b2227ca7319f39f600805..4b46dc0700385baa2b787e847b8a671ed3f1f262 100644 --- a/src/Components/TabPanels/PublicUserPageTabs/TabColecoes.js +++ b/src/Components/TabPanels/PublicUserPageTabs/TabColecoes.js @@ -17,79 +17,104 @@ You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ import React, { useState, useEffect } from 'react' -import { HeaderGrid, ContainerStyled, Carregados, StyledGrid } from '../StyledComponents.js' -import Grid from '@material-ui/core/Grid'; -import CollectionCardFunction from '../../CollectionCardFunction.js' -import { ButtonMostrarMaisColecao } from '../PanelComponents/ButtonsArea.js' - -export default function TabRecursos(props) { - const [arr, setArr] = useState([]) - const [colsSlice, setSlice] = useState([]) - const handleSlice = (newArr) => { setSlice(newArr) } - +import { fetchAllRequest, getRequest } from '../../HelperFunctions/getAxiosConfig' +import PanelTemplateColecao from '../PanelComponents/TemplateColecao.js' +import LoadingSpinner from '../../LoadingSpinner.js' + +export default function TabColecoes(props) { + const [loading, handleLoading] = useState(true) + + const [errorInUserColl, setErrorInUserColl] = useState(false) + + const [userCollections, setUserCollections] = useState([]) + + const [currLimitUserColl, setCurrLimitUserColl] = useState(4) + + const [loadingMoreUserColl, setLoadingMoreUserColl] = useState(false); + + const [endOfUserColl, setEndOfUserColl] = useState(false); + + function handleSuccess(responseArr, headersArr) { + setErrorInUserColl(responseArr[0].errors ? true : false) + + handleLoading(false) + setUserCollections(responseArr[0]) + + if (headersArr[0].has('X-Total-Count')) { + setEndOfUserColl(headersArr[0].get('X-Total-Count')); + } + } + + function handleError(error) { + handleLoading(false) + setErrorInUserColl(true) + } + + const getInfo = () => { + const urls = [ + `/users/${props.id}/collections?offset=0&limit=4`, + ] + fetchAllRequest(urls, handleSuccess, handleError) + } + useEffect(() => { - setArr(props.collections) - setSlice(props.collections.slice(0, 4)) + handleLoading(true) + getInfo() }, []) - - const showMore = (quantity) => { - var sliceLength = colsSlice.length - handleSlice(arr.slice(0, sliceLength + quantity)) + + const showMoreUserCollections = (limite) => { + const limit = limite; + setLoadingMoreUserColl(true); + setCurrLimitUserColl(currLimitUserColl + limit) + const url = `/users/${props.id}/collections?offset=${currLimitUserColl}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingMoreUserColl(false); + setEndOfUserColl(true) + setErrorInUserColl(true) + } + else if (data.length >= 1) { + let currData = [...userCollections]; + currData = [...currData.concat(data)]; + setLoadingMoreUserColl(false); + setUserCollections(currData); + } + else { + setLoadingMoreUserColl(false); + setEndOfUserColl(true) + } + }, + (error) => { + setLoadingMoreUserColl(false); + setEndOfUserColl(true) + setErrorInUserColl(true) + } + ) } return ( - <ContainerStyled style={{ flexDirection: "column" }}> - - <HeaderGrid container> - <Grid item xs={12}> - <h3>Coleções públicas <b style={{ fontWeight: "500" }}>({props.count})</b></h3> - </Grid> - </HeaderGrid> - - <StyledGrid container spacing={1} style={{ paddingLeft: "30px", paddingRight: "15px" }}> - { - colsSlice.map((card) => - <Grid item xs={12} sm={6} md={'auto'} lg={3} key={card.id}> - <CollectionCardFunction - name={card.name} - tags={card.tags} - rating={card.review_average} - id={card.id} - author={card.owner.name} - description={card.description} - thumbnails={card.items_thumbnails} - avatar={card.owner.avatar} - likeCount={card.likes_count} - followed={card.followed} - liked={card.liked} - collections={card.collection_items} - authorID={card.owner.id} - /> - </Grid> - ) - } - </StyledGrid> - - <Carregados> - <p style={{ margin: "0 0 10px", fontSize: "14px" }}> - Carregados {colsSlice.length} de {arr.length} - </p> - - { - props.count > 5 && - <React.Fragment> - <ButtonMostrarMaisColecao onClick={() => { showMore(4) }}> - <span style={{ color: "#fff", fontSize: "14px", fontWeight: "500" }}>MOSTRAR MAIS 4</span> - </ButtonMostrarMaisColecao> - - <ButtonMostrarMaisColecao onClick={() => { showMore(20) }}> - <span style={{ color: "#fff", fontSize: "14px", fontWeight: "500" }}>MOSTRAR MAIS 20</span> - </ButtonMostrarMaisColecao> - </React.Fragment> - } - - </Carregados> - - </ContainerStyled> + <> + { + loading ? + ( + <LoadingSpinner text={'CARREGANDO COLEÇÕES'} /> + ) + : + ( + <PanelTemplateColecao + title={"Coleções Públicas"} + length={userCollections.length} + noContentText={props.username + " não possui nenhuma coleção."} + sliceArr={userCollections} + showMore={showMoreUserCollections} + loadingMore={loadingMoreUserColl} + end={endOfUserColl} + followed={false} + error={errorInUserColl} + /> + ) + } + </> ) } diff --git a/src/Components/TabPanels/PublicUserPageTabs/TabRede.js b/src/Components/TabPanels/PublicUserPageTabs/TabRede.js index a9350fd39b2524192edcce8d781f72e3d94c0bf5..6b8a8a8ee73eb0ede45b2b3ed40785697169cbac 100644 --- a/src/Components/TabPanels/PublicUserPageTabs/TabRede.js +++ b/src/Components/TabPanels/PublicUserPageTabs/TabRede.js @@ -18,35 +18,94 @@ along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/> import React, {useState, useEffect} from 'react' import PanelTemplateRede from '../PanelComponents/TemplateRede.js' -import {fetchAllRequest} from '../../HelperFunctions/getAxiosConfig' +import { fetchAllRequest, getRequest } from '../../HelperFunctions/getAxiosConfig' +import LoadingSpinner from '../../LoadingSpinner.js' export default function TabRede (props) { - const [followers, setFollowers] = useState([]) - const [followersSlice, setFollowersSlice] = useState([]) - + const [loading, handleLoading] = useState(true) + + const [errorInFollowing, setErrorInFollowing] = useState(false) + const [errorInFollowers, setErrorInFollowers] = useState(false) + + const [followingList, setFollowing] = useState([]) + const [currFollowingLimit, setCurrFollowingLimit] = useState(12) + const [loadingMoreFollowing, setLoadingFollowing] = useState(false) const [endOfFollowing, setEndOfFollowing] = useState(false) + + const [followersList, setFollowers] = useState([]) + const [currFollowerLimit, setFollowersLimit] = useState(12) + const [loadingMoreFollowers, setLoadingMoreFollowers] = useState(false) const [endOfFollowers, setEndOfFollowers] = useState(false) - const showMoreFollowers = () => { - let varSlice = followersSlice.length - setFollowersSlice(followers.slice(0, varSlice + 4)) - } - const showAllFollowers = () => {setFollowersSlice(followers)} - - const [following, setFollowing] = useState([]) - const [followingSlice, setFollowingSlice] = useState([]) - const showMoreFollowing = (num) => { - let varSlice = followingSlice.length - setFollowingSlice(following.slice(0, varSlice + num)) - } - const showAllFollowing = () => {setFollowingSlice(following)} - - function handleSuccess (responseArr, headersArr) { + const showMoreFollowing = (limite) => { + setLoadingFollowing(true); + const limit = limite; + setCurrFollowingLimit(currFollowingLimit + limit) + const url = `/users/${props.id}/following/User?offset=${currFollowingLimit}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingFollowing(false); + setEndOfFollowing(true); + setErrorInFollowing(true); + } + else if (data.length >= 1) { + let currData = [...followingList]; + currData = [...currData.concat(data)]; + setLoadingFollowing(false); + setFollowing(currData); + } + else { + setLoadingFollowing(false); + setEndOfFollowing(true); + } + }, + (error) => { + setLoadingFollowing(false); + setEndOfFollowing(true); + setErrorInFollowing(true); + } + ) + } + + const showMoreFollowers = (limite) => { + setLoadingMoreFollowers(true); + const limit = limite; + setFollowersLimit(currFollowerLimit + limit) + const url = `/users/${props.id}/followers?offset=${currFollowerLimit}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingMoreFollowers(false); + setEndOfFollowers(true); + setErrorInFollowers(true); + } + else { + if (data.length >= 1) { + let currData = [...followersList]; + currData = [...currData.concat(data)]; + setLoadingMoreFollowers(false); + setFollowers(currData); + } + else { + setLoadingMoreFollowers(false); + setEndOfFollowers(true) + } + } + }, + (error) => { + setLoadingMoreFollowers(false); + setEndOfFollowers(true); + setErrorInFollowers(true); + } + ) + } + + async function handleSuccess (responseArr, headersArr) { + setErrorInFollowing(responseArr[0].errors ? true : false) // prevent of crashing the portal, do not remove it + setErrorInFollowers(responseArr[1].errors ? true : false) // prevent of crashing the portal, do not remove it setFollowers(responseArr[0]) - setFollowersSlice(responseArr[0].slice(0,4)) - setFollowing(responseArr[1]) - setFollowingSlice(responseArr[1].slice(0,4)) if (headersArr[1].has('X-Total-Count')) { setEndOfFollowing(headersArr[1].get('X-Total-Count')); @@ -54,38 +113,63 @@ export default function TabRede (props) { if (headersArr[0].has('X-Total-Count')) { setEndOfFollowers(headersArr[0].get('X-Total-Count')); } + handleLoading(false) + } + + function handleErrors() { + setLoadingMoreFollowers(false); + setEndOfFollowers(true); + setErrorInFollowers(true); } useEffect( () => { + handleLoading(true) const urls = [`/users/${props.id}/followers`, `/users/${props.id}/following/User`] - fetchAllRequest(urls, handleSuccess, (error) => {console.log(error)}) + fetchAllRequest(urls, handleSuccess, handleErrors) }, []) return ( - <React.Fragment> - <PanelTemplateRede - title={"Seguidores"} - length={followers.length} - sliceArr={followersSlice} - showMore={showMoreFollowers} - showAll={showAllFollowers} - follower={true} - end={endOfFollowers} - noContentText={props.username + ' não possui nenhum seguidor'} - /> - - <PanelTemplateRede - title={"Seguindo"} - length={following.length} - sliceArr={followingSlice} - showMore={showMoreFollowing} - showAll={showAllFollowing} - follower={false} - end={endOfFollowing} - noContentText={props.username + ' não segue nenhum usuário'} - /> - </React.Fragment> + <> + { + loading ? + ( + [ + <LoadingSpinner text={'CARREGANDO...'} /> + ] + ) + : + ( + [ + <React.Fragment> + <PanelTemplateRede + title={"Seguidores"} + length={followersList.length} + sliceArr={followersList} + showMore={showMoreFollowers} + follower={true} + end={endOfFollowers} + loadingMore={loadingMoreFollowers} + error={errorInFollowers} + noContentText={props.username + ' não possui nenhum seguidor'} + /> + + <PanelTemplateRede + title={"Seguindo"} + length={followingList.length} + sliceArr={followingList} + showMore={showMoreFollowing} + follower={false} + end={endOfFollowing} + loadingMore={loadingMoreFollowing} + error={errorInFollowing} + noContentText={props.username + ' não segue nenhum usuário'} + /> + </React.Fragment> + ] + ) + } + </> ) } diff --git a/src/Components/TabPanels/UserPageTabs/PanelColecoes.js b/src/Components/TabPanels/UserPageTabs/PanelColecoes.js index 420071c2cf0b7ec4b7a4feb7a12826ad1041b063..eef4d1eaa7df0728081c75d13d87e15db0f199b7 100644 --- a/src/Components/TabPanels/UserPageTabs/PanelColecoes.js +++ b/src/Components/TabPanels/UserPageTabs/PanelColecoes.js @@ -50,6 +50,12 @@ export default function TabPanelColecoes(props) { const [endOfUserColl, setEndOfUserColl] = useState(false); const [endOfFollowedColl, setEndOfFollowedColl] = useState(false); + const removeColl = (itemId) => { + let newSlice = userCollections.filter(item => item.id !== itemId); + setUserCollections(newSlice); + setEndOfUserColl(String(endOfUserColl - 1)) + }; + function handleSuccess(responseArr, headersArr) { setErrorInUserColl(responseArr[0].errors ? true : false) setErrorInFollowedColl(responseArr[1].errors ? true : false) @@ -181,10 +187,11 @@ export default function TabPanelColecoes(props) { end={endOfUserColl} callback={getInfo} error={errorInUserColl} + removeColl={removeColl} /> <PanelTemplateColecao - title={"Coleções que eu sigo"} + title={"Coleções que você segue"} length={followedCollections.length} noContentText={"Você ainda não segue nenhuma coleção."} sliceArr={followedCollections} @@ -272,6 +279,7 @@ function Tentativa(props) { liked={card.liked} collections={card.collection_items} authorID={card.owner.id} + removeColl={props.removeColl} /> </Grid> ) diff --git a/src/Pages/PublicUserPage.js b/src/Pages/PublicUserPage.js index 2571305e25d7bd36fdbe233bc1dccb8132599b5b..070d3cb4f7e265299ddf3efe5dfbad3124f57cbe 100644 --- a/src/Pages/PublicUserPage.js +++ b/src/Pages/PublicUserPage.js @@ -42,7 +42,7 @@ function RenderFollowContainer(props) { const { state } = useContext(Store) const [followed, setFollowed] = useState(props.followed) const toggleFollowed = () => { setFollowed(!followed) } - console.log(followed); + return ( <FollowContainer> <> @@ -103,7 +103,7 @@ export default function PublicUserPage(props) { const { state } = useContext(Store) /*user info variables--------------------------------------*/ const WIDTH = window.innerWidth; - const id = props.match.params.userId + const [id, setId] = useState(props.match.params.userId) const [loading, setLoading] = useState(false); @@ -148,10 +148,12 @@ export default function PublicUserPage(props) { /*Component Will Mount*/ useEffect(() => { + const id = props.match.params.userId + setId(id) const urls = [`/users/${id}`, `/users/${id}/learning_objects`, `/users/${id}/collections`, `/users/${id}/following/User`] setLoading(true); fetchAllRequest(urls, handleSuccess, (error) => { console.log(error) }) - }, [state.currentUser.id]) + }, [state.currentUser.id, props.match.params.userId]) /*---------------------------------------------------------*/ return ( @@ -238,18 +240,19 @@ export default function PublicUserPage(props) { </div> </Grid> - <Grid item xs={12}> - {tabValue === 0 && - <TabInicio id={id} user={userData} learningObjs={learningObjArr} collections={collectionsArr} />} - {tabValue === 1 && - <TabRecursos count={userData.learning_objects_count} learningObjs={learningObjArr} id={id} />} - {tabValue === 2 && - <TabColecoes count={userData.collections_count} collections={collectionsArr} - />} - {tabValue === 3 && - <TabRede id={id} username={userData.name} />} - - </Grid> + { + !loading && + <Grid item xs={12}> + {tabValue === 0 && + <TabInicio id={id} user={userData} learningObjs={learningObjArr} collections={collectionsArr} />} + {tabValue === 1 && + <TabRecursos count={userData.learning_objects_count} learningObjs={learningObjArr} id={id} />} + {tabValue === 2 && + <TabColecoes id={id} username={userData.name} />} + {tabValue === 3 && + <TabRede id={id} username={userData.name} />} + </Grid> + } </Grid> </BackgroundDiv> </React.Fragment>