diff options
author | Leonardo Murça <106257713+leomurca@users.noreply.github.com> | 2023-02-07 20:40:41 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-07 20:40:41 -0300 |
commit | 8eca8b79ce4bfc40f8416309cbcfe397ed935ec4 (patch) | |
tree | ca4152122b67605e76f7a53ed1a14402255b23aa /src/screens/student/Classroom/AnnouncementsTab | |
parent | e3de3c8e5fe06f7d14b2dc99a8b6aadc3b9bf18a (diff) | |
parent | c1f1286c86a47b87abcca55cbd0177d2a9c92fcd (diff) |
Feature/professor classroom
Diffstat (limited to 'src/screens/student/Classroom/AnnouncementsTab')
-rw-r--r-- | src/screens/student/Classroom/AnnouncementsTab/index.js | 300 | ||||
-rw-r--r-- | src/screens/student/Classroom/AnnouncementsTab/styles.js | 48 |
2 files changed, 348 insertions, 0 deletions
diff --git a/src/screens/student/Classroom/AnnouncementsTab/index.js b/src/screens/student/Classroom/AnnouncementsTab/index.js new file mode 100644 index 0000000..cded9cc --- /dev/null +++ b/src/screens/student/Classroom/AnnouncementsTab/index.js @@ -0,0 +1,300 @@ +import { + Button, + Card, + Container, + Grid, + Link, + Skeleton, + Stack, + Typography, +} from '@mui/material'; +import AnnouncementCard from '../../../../components/AnnouncementCard'; +import { createArrayFrom1ToN } from '../../../../utils/createArrayFrom1ToN'; + +import styles from './styles'; +import jitsiLogo from '../../../../assets/jitsi.svg'; + +function AnnouncementsTab({ layoutType, announcementsTabData, classroom }) { + const { container, emptyStateContainer } = styles[layoutType]; + + const layoutResolver = (state, layoutType) => { + if (layoutType === 'desktop') { + switch (state) { + case 'loading': + return ( + <Grid sx={container} container spacing={2}> + <Grid sx={{ padding: '0 !important' }} item xs={4}> + {createArrayFrom1ToN(3).map(i => ( + <Skeleton + key={i} + variant="rectangular" + width="100%" + height={200} + sx={{ marginBottom: '30px' }} + /> + ))} + </Grid> + <Grid sx={{ paddingTop: '0 !important' }} item xs={8}> + {createArrayFrom1ToN(4).map(i => ( + <Skeleton + key={i} + variant="rectangular" + width="100%" + height={250} + sx={{ marginBottom: '30px' }} + /> + ))} + </Grid> + </Grid> + ); + + case 'idle': + return ( + <Grid sx={container} container spacing={2}> + <Grid sx={{ padding: '0 !important' }} item xs={4}> + <Stack gap="30px"> + <Card + sx={{ width: '100%', padding: '20px' }} + elevation={4} + variant="elevation" + > + <Stack justifyContent="flex-start" spacing={1}> + <Container + disableGutters + sx={{ display: 'flex', justifyContent: 'row' }} + > + <img src={jitsiLogo} alt="Jitsi Meet" /> + <h3 style={{ fontWeight: 500 }}> + Sala de aula virtual + </h3> + </Container> + + <Button + variant="contained" + href="https://google.com" + target="__blank" + > + Entrar + </Button> + </Stack> + </Card> + <Card + sx={{ width: '100%', padding: '20px' }} + elevation={4} + variant="elevation" + > + <Stack justifyContent="flex-start" spacing={1}> + <h3 style={{ fontWeight: 500 }}>Próximas Atividades</h3> + {announcementsTabData.upcomingAssignments.length !== 0 ? ( + announcementsTabData.upcomingAssignments.map(ua => ( + <Link + href={`/assignment/${ua.id}`} + sx={{ fontSize: '15px' }} + key={ua.id} + > + {ua.title} + </Link> + )) + ) : ( + <Container disableGutters> + <p>Nenhuma atividade encontrada!</p> + </Container> + )} + </Stack> + </Card> + <Card + sx={{ width: '100%', padding: '20px' }} + elevation={4} + variant="elevation" + > + <Stack justifyContent="flex-start" spacing={1}> + <h3 style={{ fontWeight: 500 }}> + Horários de Atendimento + </h3> + {classroom.appointmentSlots.map((appts, index) => ( + <Typography key={index} variant="body1"> + {appts.weekDay}, {appts.start}h - {appts.end}h + </Typography> + ))} + </Stack> + </Card> + </Stack> + </Grid> + <Grid sx={{ paddingTop: '0 !important' }} item xs={8}> + <Stack + sx={{ width: '100%', paddingTop: 0 }} + alignItems="center" + justifyContent="center" + flexWrap="wrap" + direction="row" + gap="30px" + > + {announcementsTabData.announcements.length !== 0 ? ( + announcementsTabData.announcements.map(announcement => ( + <AnnouncementCard + key={announcement.id} + announcement={announcement} + /> + )) + ) : ( + <Container sx={emptyStateContainer} disableGutters> + <p>Nenhum comunicado encontrado!</p> + </Container> + )} + </Stack> + </Grid> + </Grid> + ); + + case 'gone': + return null; + + default: + return null; + } + } else if (layoutType === 'mobile') { + switch (state) { + case 'loading': + return ( + <Stack + alignItems="center" + justifyContent="center" + flexWrap="wrap" + direction="row" + gap="30px" + sx={{ marginTop: '30px' }} + > + {createArrayFrom1ToN(3).map(i => ( + <Skeleton + key={i} + variant="rectangular" + width="100%" + height={200} + sx={{ marginBottom: '30px' }} + /> + ))} + {createArrayFrom1ToN(4).map(i => ( + <Skeleton + key={i} + variant="rectangular" + width="100%" + height={250} + sx={{ marginBottom: '30px' }} + /> + ))} + </Stack> + ); + + case 'idle': + return ( + <Stack + alignItems="center" + justifyContent="center" + flexWrap="wrap" + direction="row" + gap="30px" + sx={{ marginTop: '30px' }} + > + <Stack gap="30px" sx={{ width: '100%' }}> + <Card + sx={{ width: '100%', padding: '20px' }} + elevation={4} + variant="elevation" + > + <Stack justifyContent="flex-start" spacing={1}> + <Container + disableGutters + sx={{ display: 'flex', justifyContent: 'row' }} + > + <img src={jitsiLogo} alt="Jitsi Meet" /> + <h3 style={{ fontWeight: 500 }}>Sala de aula virtual</h3> + </Container> + + <Button + variant="contained" + href="https://google.com" + target="__blank" + > + Entrar + </Button> + </Stack> + </Card> + <Card + sx={{ width: '100%', padding: '20px' }} + elevation={4} + variant="elevation" + > + <Stack justifyContent="flex-start" spacing={1}> + <h3 style={{ fontWeight: 500 }}>Próximas Atividades</h3> + {announcementsTabData.upcomingAssignments.length !== 0 ? ( + announcementsTabData.upcomingAssignments.map(ua => ( + <Link + href={`/assignment/${ua.id}`} + sx={{ fontSize: '15px' }} + key={ua.id} + > + {ua.title} + </Link> + )) + ) : ( + <Container disableGutters> + <p>Nenhuma atividade encontrada!</p> + </Container> + )} + </Stack> + </Card> + <Card + sx={{ width: '100%', padding: '20px' }} + elevation={4} + variant="elevation" + > + <Stack justifyContent="flex-start" spacing={1}> + <h3 style={{ fontWeight: 500 }}>Horários de Atendimento</h3> + {classroom.appointmentSlots.map((appts, index) => ( + <Typography key={index} variant="body1"> + {appts.weekDay}, {appts.start}h - {appts.end}h + </Typography> + ))} + </Stack> + </Card> + </Stack> + <Stack + sx={{ width: '100%' }} + alignItems="center" + justifyContent="center" + flexWrap="wrap" + direction="row" + gap="30px" + > + {announcementsTabData.announcements.length !== 0 ? ( + announcementsTabData.announcements.map(announcement => ( + <AnnouncementCard + key={announcement.id} + announcement={announcement} + /> + )) + ) : ( + <Container sx={emptyStateContainer} disableGutters> + <p>Nenhum comunicado encontrado!</p> + </Container> + )} + </Stack> + </Stack> + ); + + case 'gone': + return null; + + default: + return null; + } + } + }; + + return layoutResolver( + announcementsTabData && announcementsTabData.state, + layoutType + ); +} + +export default AnnouncementsTab; diff --git a/src/screens/student/Classroom/AnnouncementsTab/styles.js b/src/screens/student/Classroom/AnnouncementsTab/styles.js new file mode 100644 index 0000000..d7d218a --- /dev/null +++ b/src/screens/student/Classroom/AnnouncementsTab/styles.js @@ -0,0 +1,48 @@ +// ========== Desktop ========== +const desktopContainer = { + width: '100%', + height: '100vh', + backgroundColor: '#red', + padding: 0, + margin: 0, + marginTop: '50px', +}; + +const desktopEmptyStateContainer = { + display: 'flex', + justifyContent: 'center', + marginTop: '30px', +}; + +const desktop = { + container: desktopContainer, + emptyStateContainer: desktopEmptyStateContainer, +}; + +// ========== Mobile ========== +const mobileContainer = { + width: '90%', + backgroundColor: '#red', + padding: 0, + marginTop: '30px', + paddingBottom: '100px', +}; + +const mobileEmptyStateContainer = { + display: 'flex', + justifyContent: 'center', + marginTop: '30px', +}; + +const mobile = { + container: mobileContainer, + emptyStateContainer: mobileEmptyStateContainer, +}; + +// ========== Unset ========== +const unset = { + container: null, +}; + +const styles = { desktop, mobile, unset }; +export default styles; |