diff --git a/jam-ui/cypress/integration/friends/friends-list.spec.js b/jam-ui/cypress/integration/friends/friends-list.spec.js index a2d97166a..64757135e 100644 --- a/jam-ui/cypress/integration/friends/friends-list.spec.js +++ b/jam-ui/cypress/integration/friends/friends-list.spec.js @@ -1,6 +1,23 @@ /// -describe('Friends page', () => { +describe('Friends page without data', () => { + beforeEach(() => { + cy.stubAuthenticate(); + cy.intercept('POST', /\S+\/filter/, + { + "musicians": [] + } + ); + }) + + it('shows no records alert', () => { + cy.visit('/friends'); + cy.contains('No Records!') + }) +}) + + +describe('Friends page with data', () => { beforeEach(() => { cy.stubAuthenticate({ id: '2'}); //currentUser id is 2 - people.yaml fixture cy.intercept('POST', /\S+\/filter/, { fixture: 'people' }); diff --git a/jam-ui/src/components/page/JKPeople.js b/jam-ui/src/components/page/JKPeople.js index e6d92141d..af9b795f8 100644 --- a/jam-ui/src/components/page/JKPeople.js +++ b/jam-ui/src/components/page/JKPeople.js @@ -1,63 +1,103 @@ -import React, { useState, useEffect, Fragment } from 'react'; +import React, { useState, useEffect, useRef, Fragment } from 'react'; import PropTypes from 'prop-types'; import { Alert, Card, CardBody, Col, Row, Button, Pagination, PaginationItem, PaginationLink, Form } from 'reactstrap'; import Loader from '../common/Loader'; import FalconCardHeader from '../common/FalconCardHeader'; import { isIterableArray } from '../../helpers/utils'; -// import useFakeFetch from '../../hooks/useFakeFetch'; -// import rawPeople from '../../data/people/people'; -// import peopleCategories from '../../data/people/peopleCategories'; -// import apiFetch from '../../helpers/apiFetch'; + +import { useDispatch, useSelector } from 'react-redux'; +import { fetchPeople } from '../../store/features/peopleSlice'; + import JKPeopleSearch from './JKPeopleSearch'; import JKPeopleList from './JKPeopleList'; -import { getMusicians, getPeople } from '../../helpers/rest'; +// import { getPeople } from '../../helpers/rest'; import JKPeopleSwiper from './JKPeopleSwiper'; const JKPeople = ({ className }) => { - //const { loading, data: people, setData: setPeople } = useFakeFetch(rawPeople); - - const [people, setPeople] = useState([]); - const [loading, setLoading] = useState(true); + + //const [people, setPeople] = useState([]); + //const [loading, setLoading] = useState(true); const [showSearch, setShowSearch] = useState(false); const [page, setPage] = useState(1); - const [totalPages, setTotalPages] = useState(0); + //const [totalPages, setTotalPages] = useState(0); - const fetchPeople = React.useCallback(page => { - //getMusicians(page) - console.log("PAGE", page); - getPeople({ page: page }) - .then(response => { - if (!response.ok) { - //TODO: handle failure - //console.log(response); - throw new Error('Network response was not ok'); - } - return response.json(); - }) - .then(data => { - console.log('PEOPLE', data.musicians); - //const users = new Set([...people, ...data.musicians]); - //console.log("new users", users); - //setPeople(Array.from(users)); + const peopleListRef = useRef(); - setPeople(prev => Array.from(new Set([...prev, ...data.musicians]))) + const dispatch = useDispatch() - setTotalPages(data.page_count); - }) - .catch(error => { - //TODO: handle error - console.log(error); - }) - .finally(() => { - setLoading(false); - }); - }, []); + const people = useSelector(state => state.people.people) + const totalPages = useSelector(state => state.people.totalPages) + const loadingStatus = useSelector(state => state.people.status) - useEffect(() => { - fetchPeople(page); + // const fetchPeople = React.useCallback(page => { + // //getMusicians(page) + // console.log("PAGE", page); + // getPeople({ page: page }) + // .then(response => { + // if (!response.ok) { + // //TODO: handle failure + // //console.log(response); + // throw new Error('Network response was not ok'); + // } + // return response.json(); + // }) + // .then(data => { + // console.log('PEOPLE', data.musicians); + // //const users = new Set([...people, ...data.musicians]); + // //console.log("new users", users); + // //setPeople(Array.from(users)); + + // setPeople(prev => Array.from(new Set([...prev, ...data.musicians]))) + + // setTotalPages(data.page_count); + // }) + // .catch(error => { + // //TODO: handle error + // console.log(error); + // }) + // .finally(() => { + // setLoading(false); + // }); + // }, []); + + + + const loadPeople = React.useCallback(page => { + try { + dispatch(fetchPeople({page})) + } catch (error) { + console.log('Error fetching people', error); + } + }, [page]); - const goNextPage = () => { + // const loadPeople = (page) => { + // try { + // dispatch(fetchPeople({page})) + // } catch (error) { + // console.log('Error fetching people', error); + // } + // }; + + useEffect(() => { + loadPeople(page); + }, [page]); + + useEffect(() => { + if(loadingStatus === 'succeeded' && peopleListRef.current && page !== 1){ + // peopleListRef.current.scrollIntoView( + // { + // behavior: 'smooth', + // block: 'end', + // inline: 'nearest' + // }) + + } + + }, [loadingStatus]) + + const goNextPage = (event) => { + event.preventDefault() if (page < totalPages) { setPage(val => ++val); } @@ -69,18 +109,9 @@ const JKPeople = ({ className }) => { } }; - // const searchPeople = ({ target }) => { - // const keyword = target.value.toLowerCase(); - // const filteredResult = people.filter( - // person => person.name.toLowerCase().includes(keyword) || person.institution.toLowerCase().includes(keyword) - // ); - - // setPeople(keyword.length ? filteredResult : people); - // }; - return ( - +