Add PeopleTab with loading Skeleton
This commit is contained in:
parent
76e1c09632
commit
d2feb08881
6 changed files with 276 additions and 2 deletions
|
@ -8,6 +8,7 @@ import {
|
||||||
getClassroomById,
|
getClassroomById,
|
||||||
getClassrooms,
|
getClassrooms,
|
||||||
getFaq,
|
getFaq,
|
||||||
|
getPeopleByClassId,
|
||||||
getUpcomingAssignmentsByClassId,
|
getUpcomingAssignmentsByClassId,
|
||||||
} from '../services/user-service';
|
} from '../services/user-service';
|
||||||
|
|
||||||
|
@ -42,6 +43,8 @@ function UserProvider(props) {
|
||||||
const fetchUpcomingAssignmentsByClassId = classId =>
|
const fetchUpcomingAssignmentsByClassId = classId =>
|
||||||
getUpcomingAssignmentsByClassId(classId);
|
getUpcomingAssignmentsByClassId(classId);
|
||||||
|
|
||||||
|
const fetchPeopleByClassId = classId => getPeopleByClassId(classId);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<UserContext.Provider
|
<UserContext.Provider
|
||||||
value={{
|
value={{
|
||||||
|
@ -53,6 +56,7 @@ function UserProvider(props) {
|
||||||
fetchFAQ,
|
fetchFAQ,
|
||||||
fetchClassroomAnnouncements,
|
fetchClassroomAnnouncements,
|
||||||
fetchUpcomingAssignmentsByClassId,
|
fetchUpcomingAssignmentsByClassId,
|
||||||
|
fetchPeopleByClassId,
|
||||||
}}
|
}}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
|
@ -69,6 +73,7 @@ function useUser() {
|
||||||
fetchFAQ,
|
fetchFAQ,
|
||||||
fetchClassroomAnnouncements,
|
fetchClassroomAnnouncements,
|
||||||
fetchUpcomingAssignmentsByClassId,
|
fetchUpcomingAssignmentsByClassId,
|
||||||
|
fetchPeopleByClassId,
|
||||||
} = useContext(UserContext);
|
} = useContext(UserContext);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -80,6 +85,7 @@ function useUser() {
|
||||||
fetchFAQ,
|
fetchFAQ,
|
||||||
fetchClassroomAnnouncements,
|
fetchClassroomAnnouncements,
|
||||||
fetchUpcomingAssignmentsByClassId,
|
fetchUpcomingAssignmentsByClassId,
|
||||||
|
fetchPeopleByClassId,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
90
src/screens/Classroom/PeopleTab/index.js
Normal file
90
src/screens/Classroom/PeopleTab/index.js
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
import { Container, Skeleton, Stack } from '@mui/material';
|
||||||
|
import { createArrayFrom1ToN } from '../../../utils/createArrayFrom1ToN';
|
||||||
|
|
||||||
|
function PeopleTab({ layoutType, peopleTabData }) {
|
||||||
|
const layoutResolver = (state, people, layoutType) => {
|
||||||
|
if (layoutType === 'desktop') {
|
||||||
|
switch (state) {
|
||||||
|
case 'loading':
|
||||||
|
return (
|
||||||
|
<Container
|
||||||
|
sx={{ marginTop: '50px', height: '100vh' }}
|
||||||
|
disableGutters
|
||||||
|
>
|
||||||
|
<Stack alignItems="center">
|
||||||
|
<Skeleton
|
||||||
|
variant="rectangular"
|
||||||
|
width="90%"
|
||||||
|
height={70}
|
||||||
|
sx={{ marginBottom: '30px' }}
|
||||||
|
/>
|
||||||
|
<Stack
|
||||||
|
flexDirection="row"
|
||||||
|
alignItems="center"
|
||||||
|
sx={{ width: '90%', marginLeft: '20px' }}
|
||||||
|
>
|
||||||
|
<Skeleton variant="circular" width={60} height={60} />
|
||||||
|
<Skeleton
|
||||||
|
variant="rectangular"
|
||||||
|
width="70%"
|
||||||
|
height={40}
|
||||||
|
sx={{ marginLeft: '15px' }}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Stack>
|
||||||
|
|
||||||
|
<Stack alignItems="center">
|
||||||
|
<Skeleton
|
||||||
|
variant="rectangular"
|
||||||
|
width="90%"
|
||||||
|
height={70}
|
||||||
|
sx={{ marginBottom: '30px', marginTop: '50px' }}
|
||||||
|
/>
|
||||||
|
{createArrayFrom1ToN(5).map(i => (
|
||||||
|
<Stack
|
||||||
|
key={i}
|
||||||
|
flexDirection="row"
|
||||||
|
alignItems="center"
|
||||||
|
sx={{ width: '90%', marginLeft: '20px', marginTop: '25px' }}
|
||||||
|
>
|
||||||
|
<Skeleton variant="circular" width={60} height={60} />
|
||||||
|
<Skeleton
|
||||||
|
variant="rectangular"
|
||||||
|
width="70%"
|
||||||
|
height={40}
|
||||||
|
sx={{ marginLeft: '15px' }}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
))}
|
||||||
|
</Stack>
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
case 'idle':
|
||||||
|
return people.map(p => <p key={p.id}>{p.name}</p>);
|
||||||
|
case 'gone':
|
||||||
|
return null;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} else if (layoutType === 'mobile') {
|
||||||
|
switch (state) {
|
||||||
|
case 'loading':
|
||||||
|
return <h1>Loading...</h1>;
|
||||||
|
case 'idle':
|
||||||
|
return <h1>People Tab</h1>;
|
||||||
|
case 'gone':
|
||||||
|
return null;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return layoutResolver(
|
||||||
|
peopleTabData && peopleTabData.state,
|
||||||
|
peopleTabData && peopleTabData.people,
|
||||||
|
layoutType
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PeopleTab;
|
|
@ -3,6 +3,7 @@ import { Container } from '@mui/material';
|
||||||
import Header from './Header';
|
import Header from './Header';
|
||||||
import AnnouncementsTab from './AnnouncementsTab';
|
import AnnouncementsTab from './AnnouncementsTab';
|
||||||
import AssignmentsTab from './AssignmentsTab';
|
import AssignmentsTab from './AssignmentsTab';
|
||||||
|
import PeopleTab from './PeopleTab';
|
||||||
|
|
||||||
import styles from './styles';
|
import styles from './styles';
|
||||||
|
|
||||||
|
@ -13,6 +14,7 @@ function View({
|
||||||
onSelectTabOption,
|
onSelectTabOption,
|
||||||
announcementsTabData,
|
announcementsTabData,
|
||||||
assignmentsTabData,
|
assignmentsTabData,
|
||||||
|
peopleTabData,
|
||||||
}) {
|
}) {
|
||||||
const { container } = styles[layoutType];
|
const { container } = styles[layoutType];
|
||||||
return (
|
return (
|
||||||
|
@ -32,6 +34,7 @@ function View({
|
||||||
layoutType={layoutType}
|
layoutType={layoutType}
|
||||||
assignmentsTabData={assignmentsTabData}
|
assignmentsTabData={assignmentsTabData}
|
||||||
/>
|
/>
|
||||||
|
<PeopleTab layoutType={layoutType} peopleTabData={peopleTabData} />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ function Classroom() {
|
||||||
fetchClassroomAnnouncements,
|
fetchClassroomAnnouncements,
|
||||||
fetchUpcomingAssignmentsByClassId,
|
fetchUpcomingAssignmentsByClassId,
|
||||||
fetchAssignmentsByClassId,
|
fetchAssignmentsByClassId,
|
||||||
|
fetchPeopleByClassId,
|
||||||
} = useUser();
|
} = useUser();
|
||||||
const [classroom, setClassroom] = useState(null);
|
const [classroom, setClassroom] = useState(null);
|
||||||
const [tabData, setTabData] = useState(null);
|
const [tabData, setTabData] = useState(null);
|
||||||
|
@ -51,8 +52,15 @@ function Classroom() {
|
||||||
}, [fetchAssignmentsByClassId, params.id]);
|
}, [fetchAssignmentsByClassId, params.id]);
|
||||||
|
|
||||||
const fetchAndPopulatePoepleTabData = useCallback(async () => {
|
const fetchAndPopulatePoepleTabData = useCallback(async () => {
|
||||||
console.log('Fetch assignments');
|
setTabData({ tab: 'people', state: 'loading' });
|
||||||
}, []);
|
const people = await fetchPeopleByClassId(params.id);
|
||||||
|
|
||||||
|
setTabData({
|
||||||
|
tab: 'people',
|
||||||
|
state: 'idle',
|
||||||
|
people: [...people.data],
|
||||||
|
});
|
||||||
|
}, [fetchPeopleByClassId, params.id]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
async function getSelectedTabData() {
|
async function getSelectedTabData() {
|
||||||
|
@ -108,6 +116,9 @@ function Classroom() {
|
||||||
assignmentsTabData={
|
assignmentsTabData={
|
||||||
tabData && tabData.tab === 'assignments' ? tabData : { state: 'gone' }
|
tabData && tabData.tab === 'assignments' ? tabData : { state: 'gone' }
|
||||||
}
|
}
|
||||||
|
peopleTabData={
|
||||||
|
tabData && tabData.tab === 'people' ? tabData : { state: 'gone' }
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -369,6 +369,159 @@ const faq = [
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const allPeople = [
|
||||||
|
{
|
||||||
|
id: '1234',
|
||||||
|
name: 'Míriam Lúcia Barbosa',
|
||||||
|
avatar:
|
||||||
|
'https://images.unsplash.com/photo-1580489944761-15a19d654956?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=50&q=80',
|
||||||
|
role: 'PROFESSOR',
|
||||||
|
classes: [
|
||||||
|
{
|
||||||
|
id: '123',
|
||||||
|
name: 'Gestão de Projetos',
|
||||||
|
abbreviation: 'GP',
|
||||||
|
color: '#7900F2',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '4321',
|
||||||
|
name: 'Alexandre Couto Cardoso',
|
||||||
|
avatar: '/assets/alex.jpg',
|
||||||
|
role: 'PROFESSOR',
|
||||||
|
classes: [
|
||||||
|
{
|
||||||
|
id: '123',
|
||||||
|
name: 'Gestão de Projetos',
|
||||||
|
abbreviation: 'GP',
|
||||||
|
color: '#7900F2',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '765',
|
||||||
|
name: 'Contabilidade Básica',
|
||||||
|
abbreviation: 'CB',
|
||||||
|
color: '#BB0000',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '2342',
|
||||||
|
name: 'Carlos Alexandre Silva',
|
||||||
|
avatar:
|
||||||
|
'https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=50&q=80',
|
||||||
|
role: 'PROFESSOR',
|
||||||
|
classes: [
|
||||||
|
{
|
||||||
|
id: '321',
|
||||||
|
name: 'Introdução à Ciência de Dados',
|
||||||
|
abbreviation: 'ICD',
|
||||||
|
color: '#006FF2',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '6781',
|
||||||
|
name: 'Cristiane Norbiato Targa',
|
||||||
|
avatar:
|
||||||
|
'https://lh3.googleusercontent.com/a-/AOh14GhwNeQ0h2eKl2WXGuwyDzvLWtrvyrG2kJtZ7A1EBw=s75-c',
|
||||||
|
role: 'PROFESSOR',
|
||||||
|
classes: [
|
||||||
|
{
|
||||||
|
id: '666',
|
||||||
|
name: 'Banco de Dados II',
|
||||||
|
abbreviation: 'BDII',
|
||||||
|
color: '#FF7A00',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '9999',
|
||||||
|
name: 'Gabriel Felipe Cândido Novy',
|
||||||
|
avatar:
|
||||||
|
'https://lh3.googleusercontent.com/a-/AOh14GgvfrD--cl25V_3UOAR93sN_jKdYNJ9PXhUH2zXhQ=s75-c',
|
||||||
|
role: 'PROFESSOR',
|
||||||
|
classes: [
|
||||||
|
{
|
||||||
|
id: '333',
|
||||||
|
name: 'Linguagens de Programação',
|
||||||
|
abbreviation: 'LP',
|
||||||
|
color: '#039200',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '193458673',
|
||||||
|
name: 'Gabriel West',
|
||||||
|
avatar: 'https://i.pravatar.cc/400?img=57',
|
||||||
|
role: 'STUDENT',
|
||||||
|
classes: [
|
||||||
|
{
|
||||||
|
id: '321',
|
||||||
|
name: 'Introdução à Ciência de Dados',
|
||||||
|
abbreviation: 'ICD',
|
||||||
|
color: '#006FF2',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '365967145',
|
||||||
|
name: 'John Pager',
|
||||||
|
avatar: 'https://i.pravatar.cc/400?img=52',
|
||||||
|
role: 'STUDENT',
|
||||||
|
classes: [
|
||||||
|
{
|
||||||
|
id: '321',
|
||||||
|
name: 'Introdução à Ciência de Dados',
|
||||||
|
abbreviation: 'ICD',
|
||||||
|
color: '#006FF2',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '92346574',
|
||||||
|
name: 'Lauren Comber',
|
||||||
|
avatar: 'https://i.pravatar.cc/400?img=44',
|
||||||
|
role: 'STUDENT',
|
||||||
|
classes: [
|
||||||
|
{
|
||||||
|
id: '321',
|
||||||
|
name: 'Introdução à Ciência de Dados',
|
||||||
|
abbreviation: 'ICD',
|
||||||
|
color: '#006FF2',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '239462345',
|
||||||
|
name: 'Marina dos Santos',
|
||||||
|
avatar: 'https://i.pravatar.cc/400?img=41',
|
||||||
|
role: 'STUDENT',
|
||||||
|
classes: [
|
||||||
|
{
|
||||||
|
id: '321',
|
||||||
|
name: 'Introdução à Ciência de Dados',
|
||||||
|
abbreviation: 'ICD',
|
||||||
|
color: '#006FF2',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '3454956749',
|
||||||
|
name: 'Lee Wong',
|
||||||
|
avatar: 'https://i.pravatar.cc/400?img=33',
|
||||||
|
role: 'STUDENT',
|
||||||
|
classes: [
|
||||||
|
{
|
||||||
|
id: '321',
|
||||||
|
name: 'Introdução à Ciência de Dados',
|
||||||
|
abbreviation: 'ICD',
|
||||||
|
color: '#006FF2',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
const user = {
|
const user = {
|
||||||
id: '0021564',
|
id: '0021564',
|
||||||
username: 'leonardomurca',
|
username: 'leonardomurca',
|
||||||
|
@ -385,6 +538,7 @@ export {
|
||||||
allClassrooms,
|
allClassrooms,
|
||||||
allAssignments,
|
allAssignments,
|
||||||
allClassroomAnnouncements,
|
allClassroomAnnouncements,
|
||||||
|
allPeople,
|
||||||
faq,
|
faq,
|
||||||
user,
|
user,
|
||||||
authFailure,
|
authFailure,
|
||||||
|
|
|
@ -7,6 +7,7 @@ import {
|
||||||
authFailure,
|
authFailure,
|
||||||
allClassroomAnnouncements,
|
allClassroomAnnouncements,
|
||||||
allUpcomingAssignments,
|
allUpcomingAssignments,
|
||||||
|
allPeople,
|
||||||
} from './mocks';
|
} from './mocks';
|
||||||
|
|
||||||
const getClassrooms = userId =>
|
const getClassrooms = userId =>
|
||||||
|
@ -59,6 +60,14 @@ const getAssignmentsByClassId = classId =>
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const getPeopleByClassId = classId =>
|
||||||
|
sleep(4000).then(() => {
|
||||||
|
console.log('Getting people by class id ' + classId);
|
||||||
|
return {
|
||||||
|
data: allPeople.filter(p => p.classes[0].id === classId),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
const getFaq = () =>
|
const getFaq = () =>
|
||||||
sleep(2000).then(() => {
|
sleep(2000).then(() => {
|
||||||
console.log('Fetching FAQ...');
|
console.log('Fetching FAQ...');
|
||||||
|
@ -84,6 +93,7 @@ export {
|
||||||
getAssignmentsByClassId,
|
getAssignmentsByClassId,
|
||||||
getClassroomAnnouncementsById,
|
getClassroomAnnouncementsById,
|
||||||
getUpcomingAssignmentsByClassId,
|
getUpcomingAssignmentsByClassId,
|
||||||
|
getPeopleByClassId,
|
||||||
getFaq,
|
getFaq,
|
||||||
getUser,
|
getUser,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue