{"version":3,"sources":["assets/Ceapia-01.png","assets/Ceapia-02.png","services/api.ts","hooks/Auth.tsx","components/Input/styles.ts","components/Input/index.tsx","components/Button/styles.ts","components/Button/index.tsx","components/Alert/index.tsx","utils/getValidationErrors.ts","pages/Login/styles.ts","pages/Login/index.tsx","routes/Route.tsx","components/DialogForm/styles.ts","components/DialogForm/index.tsx","pages/Dashboard/styles.ts","pages/AnnualRegistation/styles.ts","pages/AnnualRegistation/index.tsx","pages/Preceptorships/styles.ts","pages/Preceptorships/index.tsx","pages/Dashboard/index.tsx","pages/NotFound/index.tsx","routes/index.tsx","hooks/index.tsx","styles/global.ts","App.tsx","index.tsx"],"names":["module","exports","api","axios","create","baseURL","process","AuthContext","createContext","AuthProvider","children","useState","token","localStorage","getItem","user","JSON","parse","data","setData","login","useCallback","a","email","password","post","response","student","name","firstName","lastName","groups","setItem","stringify","logout","removeItem","Provider","value","useAuth","context","useContext","Error","Container","styled","div","Input","label","rest","inputRef","useRef","useField","fieldName","defaultValue","error","registerField","useEffect","ref","current","path","TextField","helperText","inputProps","Button","button","Alert","type","onClose","React","open","setOpen","handleClose","event","reason","Snackbar","autoHideDuration","elevation","variant","severity","getValidationErrors","err","validationErrors","inner","forEach","message","Content","FormContainer","FormContent","Form","AlertContainer","Login","formRef","loading","setLoading","alert","setAlert","history","useHistory","handleAlertClose","handleSubmit","setErrors","schema","Yup","shape","required","validate","abortEarly","push","errors","src","Logo","alt","onSubmit","placeholder","color","CircularProgress","size","Route","isPrivate","Component","component","render","location","to","pathname","state","from","FormActions","useStyles","makeStyles","theme","createStyles","paper","minHeight","maxHeight","content","width","actions","margin","DialogForm","title","initialData","classes","Dialog","fullWidth","maxWidth","DialogTitle","DialogContent","className","Save","onClick","Header","Link","root","display","appBar","background","zIndex","drawer","transition","transitions","easing","sharp","duration","leavingScreen","appBarShift","marginLeft","enteringScreen","menuButton","marginRight","menuAccount","marginTop","hide","flexShrink","whiteSpace","drawerOpen","drawerClose","overflowX","spacing","breakpoints","up","toolbar","alignItems","justifyContent","padding","mixins","flexGrow","media","height","paddingTop","expand","transform","shortest","expandOpen","avatar","backgroundColor","backdrop","Admins","useRouteMatch","studentGroup","setStudentGroup","canSeePreceptorships","setCanSeePreceptorships","registration","setRegistration","isActive","Authorization","get","headers","registrationResponse","userAvailableSchedules","schedules","filter","schedule","includes","group","map","Date","startTime","now","nextSchedule","closestTo","selectedSchedule","find","isEqual","inSchedule","isAfter","finishedAllRounds","every","isBefore","endTime","length","getRegistration","handleAlert","Breadcrumbs","aria-label","href","Typography","Backdrop","Card","CardContent","key","_id","CardHeader","Avatar","year","subheader","moment","createdAt","format","align","studentSchedule","Chip","style","fontWeight","CardActions","disableSpacing","Tooltip","IconButton","disabled","socket","socketio","io","reconnection","reconnectionDelay","timeout","weekDays","1","2","3","4","5","6","0","PreceptorshipsList","useParams","id","groupId","preceptorships","setPreceptorships","signedIn","setSignedIn","handleVacancy","action","currentPreceptorships","findPrecepIdx","findGroupIdx","payload","findIndex","precep","preceptorship","vacancy","placesLeft","students","pop","date","order","init","preceptorshipsResponse","signedPreceptorshipsResponse","getPreceptorships","on","precepSocket","handleStudentSign","preceptorshipId","registrationId","newSignedPreceptorship","renderSubscribeButton","isSubscribed","isFull","totalStudents","isFilled","v","Check","weekday","Divider","coordinators","coord","room","hasProjector","DesktopMac","Dashboard","useTheme","formRefUpdate","myDataOpen","setMyDataOpen","anchorEl","setAnchorEl","openMenu","Boolean","handleMyDataOpen","handleMyDataClose","passwordConfirm","oneOf","put","window","reload","CssBaseline","AppBar","position","clsx","Toolbar","aria-controls","aria-haspopup","currentTarget","orientation","flexItem","opacity","boxShadow","split","Menu","keepMounted","MenuItem","exact","Registration","Preceptorships","NotFound","Routes","hooks","createGlobalStyle","App","ReactDOM","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.ebcd53a2.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","import axios from 'axios';\r\n\r\nconst api = axios.create({\r\n baseURL: process.env.REACT_APP_PRECEPTORIA_API,\r\n});\r\n\r\nexport default api;\r\n","import React, { createContext, useCallback, useState, useContext } from 'react';\r\n\r\nimport api from '../services/api';\r\n\r\ninterface User {\r\n name: string;\r\n email: string;\r\n groups: string[];\r\n}\r\n\r\ninterface AuthState {\r\n token: string;\r\n user: User;\r\n}\r\n\r\ninterface LoginCredentials {\r\n email: string;\r\n password: string;\r\n}\r\n\r\ninterface AuthContextData {\r\n token: string;\r\n user: User;\r\n login(credeitnals: LoginCredentials): Promise;\r\n logout(): void;\r\n}\r\n\r\nconst AuthContext = createContext({} as AuthContextData);\r\n\r\nconst AuthProvider: React.FC = ({ children }) => {\r\n const [data, setData] = useState(() => {\r\n const token = localStorage.getItem('@PRECEPTORIA:token');\r\n const user = localStorage.getItem('@PRECEPTORIA:user');\r\n\r\n if (token && user) {\r\n return { token, user: JSON.parse(user) };\r\n }\r\n\r\n return {} as AuthState;\r\n });\r\n\r\n const login = useCallback(async ({ email, password }) => {\r\n const response = await api.post('/login', {\r\n email,\r\n password,\r\n });\r\n\r\n const { token, student } = response.data;\r\n\r\n const user = {\r\n name: `${student.firstName} ${student.lastName}`,\r\n email: student.email,\r\n groups: student.groups,\r\n };\r\n\r\n localStorage.setItem('@PRECEPTORIA:token', token);\r\n localStorage.setItem('@PRECEPTORIA:user', JSON.stringify(user));\r\n\r\n setData({ token, user });\r\n }, []);\r\n\r\n const logout = useCallback(() => {\r\n localStorage.removeItem('@PRECEPTORIA:token');\r\n localStorage.removeItem('@PRECEPTORIA:user');\r\n\r\n setData({} as AuthState);\r\n }, []);\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nfunction useAuth(): AuthContextData {\r\n const context = useContext(AuthContext);\r\n\r\n if (!context) {\r\n throw new Error('useAuth must be used within an AuthProvider');\r\n }\r\n\r\n return context;\r\n}\r\n\r\nexport { useAuth, AuthProvider };\r\n","import styled from 'styled-components';\r\n\r\nexport const Container = styled.div`\r\n margin: 1%;\r\n width: 100%;\r\n\r\n * {\r\n width: 100%;\r\n }\r\n`;\r\n","import React, {\r\n InputHTMLAttributes,\r\n useEffect,\r\n useRef,\r\n} from 'react';\r\n\r\nimport { useField } from '@unform/core';\r\nimport TextField from '@material-ui/core/TextField';\r\n\r\nimport { Container } from './styles';\r\n\r\ninterface InputProps extends InputHTMLAttributes {\r\n name: string;\r\n label: string;\r\n}\r\n\r\nconst Input: React.FC = ({ name, label, ...rest }) => {\r\n const inputRef = useRef(null);\r\n\r\n const { fieldName, defaultValue, error, registerField } = useField(name);\r\n\r\n useEffect(() => {\r\n registerField({\r\n name: fieldName,\r\n ref: inputRef.current,\r\n path: 'value',\r\n });\r\n }, [fieldName, registerField]);\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Input;\r\n","import styled from 'styled-components';\r\nimport Button from '@material-ui/core/Button';\r\n\r\nexport const Container = styled(Button)`\r\n`;\r\n","import React from 'react';\r\nimport { ButtonProps } from '@material-ui/core/Button';\r\n\r\nimport { Container } from './styles';\r\n\r\nconst button: React.FC = ({ children, ...rest }) => (\r\n \r\n {children}\r\n \r\n);\r\n\r\nexport default button;\r\n","import React from 'react';\r\nimport Snackbar from '@material-ui/core/Snackbar';\r\nimport MuiAlert from '@material-ui/lab/Alert';\r\n\r\ninterface AlertComponentProps {\r\n type: 'success' | 'info' | 'warning' | 'error';\r\n onClose?(): void;\r\n}\r\n\r\nconst Alert: React.FC = ({ type, onClose, ...rest }) => {\r\n const [open, setOpen] = React.useState(true);\r\n\r\n const handleClose = (event?: React.SyntheticEvent, reason?: string) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n\r\n setOpen(false);\r\n\r\n if (onClose) onClose();\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Alert;\r\n","import { ValidationError } from 'yup';\r\n\r\ninterface Errors {\r\n [key: string]: string;\r\n}\r\n\r\nexport default function getValidationErrors(err: ValidationError): Errors {\r\n const validationErrors: Errors = {};\r\n\r\n err.inner.forEach((error) => {\r\n validationErrors[error.path] = error.message;\r\n });\r\n\r\n return validationErrors;\r\n}\r\n","import styled from 'styled-components';\r\nimport { Form } from '@unform/web';\r\n\r\nexport const Container = styled.div`\r\n width: 100%;\r\n height: 100vh;\r\n display: flex;\r\n padding: 2%;\r\n justify-content: center;\r\n`;\r\n\r\nexport const Content = styled.div`\r\n min-width: 30%;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n`;\r\n\r\nexport const FormContainer = styled.div`\r\n align-self: center;\r\n\r\n h2,\r\n h3 {\r\n text-align: center;\r\n font-weight: normal;\r\n }\r\n`;\r\n\r\nexport const FormContent = styled(Form)`\r\n * {\r\n width: 100%;\r\n padding: 2% 0;\r\n }\r\n`;\r\n\r\nexport const AlertContainer = styled.div`\r\n width: 100%;\r\n`;\r\n","import React, { useRef, useCallback, useState } from 'react';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport { FormHandles } from '@unform/core';\r\nimport { useHistory } from 'react-router-dom';\r\nimport * as Yup from 'yup';\r\n\r\nimport { useAuth } from '../../hooks/Auth';\r\nimport Logo from '../../assets/Ceapia-01.png';\r\n\r\nimport Input from '../../components/Input';\r\nimport Button from '../../components/Button';\r\nimport Alert from '../../components/Alert';\r\n\r\nimport getValidationErrors from '../../utils/getValidationErrors';\r\n\r\nimport {\r\n Container,\r\n Content,\r\n FormContainer,\r\n FormContent,\r\n AlertContainer,\r\n} from './styles';\r\n\r\ninterface LoginFormData {\r\n email: string;\r\n password: string;\r\n}\r\n\r\nconst Login: React.FC = () => {\r\n const formRef = useRef(null);\r\n const [loading, setLoading] = useState(false);\r\n const [alert, setAlert] = useState(false);\r\n\r\n const { login } = useAuth();\r\n const history = useHistory();\r\n\r\n const handleAlertClose = useCallback(() => {\r\n setAlert(false);\r\n }, []);\r\n\r\n const handleSubmit = useCallback(async (data: LoginFormData) => {\r\n setLoading(true);\r\n\r\n try {\r\n formRef.current?.setErrors({});\r\n\r\n const schema = Yup.object().shape({\r\n email: Yup.string()\r\n .email('Digite um e-mail válido.')\r\n .required('E-mail obrigatório.'),\r\n password: Yup.string().required('Senha obrigatória.'),\r\n });\r\n\r\n await schema.validate(data, { abortEarly: false });\r\n\r\n await login({\r\n email: data.email,\r\n password: data.password,\r\n });\r\n\r\n history.push('/dashboard');\r\n } catch (error) {\r\n if (error instanceof Yup.ValidationError) {\r\n const errors = getValidationErrors(error);\r\n\r\n formRef.current?.setErrors(errors);\r\n } else {\r\n return setAlert(true);\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n return (\r\n \r\n \r\n \r\n \"Logo\"\r\n\r\n

PRECEPTORIA

\r\n\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n
\r\n\r\n {alert && (\r\n \r\n \r\n Credenciais inválidas.\r\n \r\n \r\n )}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Login;\r\n","import React from 'react';\r\n\r\nimport {\r\n RouteProps as ReactDomRouterProps,\r\n Route as ReactDomRoute,\r\n Redirect,\r\n} from 'react-router-dom';\r\n\r\nimport { useAuth } from '../hooks/Auth';\r\n\r\ninterface RouterProps extends ReactDomRouterProps {\r\n isPrivate?: boolean;\r\n component: React.FC;\r\n}\r\n\r\nconst Route: React.FC = ({\r\n isPrivate = false,\r\n component: Component,\r\n ...rest\r\n}) => {\r\n const { token } = useAuth();\r\n\r\n return (\r\n {\r\n return isPrivate === !!token ? (\r\n \r\n ) : (\r\n \r\n );\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default Route;\r\n","import styled from 'styled-components';\r\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles';\r\nimport { Form } from '@unform/web';\r\n\r\nexport const Container = styled.div``;\r\n\r\nexport const FormContainer = styled(Form)`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n\r\n .row {\r\n width: 100%;\r\n display: flex;\r\n justify-content: space-around;\r\n align-items: center;\r\n margin: 1%;\r\n padding: 1%;\r\n }\r\n`;\r\n\r\nexport const FormActions = styled.div`\r\n display: flex;\r\n justify-content: center;\r\n\r\n * {\r\n margin: 2%;\r\n }\r\n`;\r\n\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n paper: {\r\n minHeight: 'fit-content',\r\n maxHeight: 'fit-content',\r\n },\r\n content: {\r\n width: '100%',\r\n },\r\n actions: {\r\n margin: '20px',\r\n },\r\n }),\r\n);\r\n","import React from 'react';\r\nimport { FormHandles } from '@unform/core';\r\n\r\nimport { Save } from '@material-ui/icons';\r\n\r\nimport { Button, DialogTitle, DialogContent, Dialog } from '@material-ui/core';\r\n\r\nimport { Container, FormContainer, FormActions, useStyles } from './styles';\r\n\r\ninterface DialogFormProps {\r\n open: boolean;\r\n handleClose(): void;\r\n handleSubmit(data: any): void;\r\n formRef: React.RefObject;\r\n title: string;\r\n initialData?: any;\r\n}\r\n\r\nconst DialogForm: React.FC = ({\r\n children,\r\n open,\r\n handleClose,\r\n handleSubmit,\r\n formRef,\r\n title,\r\n initialData,\r\n}) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n {title}\r\n \r\n \r\n
{children}
\r\n\r\n \r\n \r\n \r\n Cancelar\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default DialogForm;\r\n","import styled from 'styled-components';\r\n\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\nimport { Link } from 'react-router-dom';\r\n\r\nexport const Container = styled.div`\r\n width: 100%;\r\n`;\r\n\r\nexport const Header = styled.div`\r\n display: flex;\r\n min-height: 20vh;\r\n flex-direction: column;\r\n align-items: space-around;\r\n justify-content: center;\r\n color: #4f4f4f;\r\n\r\n * {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n }\r\n\r\n @media (max-height: 550px) {\r\n min-height: 30vh;\r\n }\r\n\r\n @media (max-height: 300px) {\r\n min-height: 40vh;\r\n }\r\n`;\r\n\r\nexport const StyledLink = styled(Link)`\r\n color: #4472ca;\r\n display: flex;\r\n text-decoration: none;\r\n color: #000000;\r\n`;\r\n\r\nconst drawerWidth = 240;\r\n\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n display: 'flex',\r\n },\r\n appBar: {\r\n background: '#fff',\r\n zIndex: theme.zIndex.drawer + 1,\r\n transition: theme.transitions.create(['width', 'margin'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n },\r\n appBarShift: {\r\n marginLeft: drawerWidth,\r\n width: `calc(100% - ${drawerWidth}px)`,\r\n transition: theme.transitions.create(['width', 'margin'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n menuButton: {\r\n marginRight: 36,\r\n },\r\n menuAccount: {\r\n marginTop: 36,\r\n },\r\n hide: {\r\n display: 'none',\r\n },\r\n drawer: {\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n whiteSpace: 'nowrap',\r\n },\r\n drawerOpen: {\r\n width: drawerWidth,\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n drawerClose: {\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n overflowX: 'hidden',\r\n width: theme.spacing(7) + 1,\r\n [theme.breakpoints.up('sm')]: {\r\n width: theme.spacing(9) + 1,\r\n },\r\n },\r\n toolbar: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: theme.spacing(0, 1),\r\n ...theme.mixins.toolbar,\r\n },\r\n content: {\r\n flexGrow: 1,\r\n padding: theme.spacing(3),\r\n },\r\n }),\r\n);\r\n","import styled from 'styled-components';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles';\r\n\r\nexport const Container = styled.div`\r\n display: flex;\r\n justify-content: center;\r\n flex-direction: column;\r\n\r\n .registration-card {\r\n display: flex;\r\n justify-content: center;\r\n\r\n @media (max-width: 650px) {\r\n width: 100%;\r\n }\r\n }\r\n\r\n .card-content {\r\n div {\r\n margin: 1%;\r\n }\r\n\r\n .schedules {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n margin-top: 10px;\r\n }\r\n }\r\n`;\r\n\r\nexport const StyledLink = styled(Link)`\r\n color: #4472ca;\r\n display: flex;\r\n text-decoration: none;\r\n color: #000000;\r\n`;\r\n\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {},\r\n media: {\r\n height: 0,\r\n paddingTop: '56.25%',\r\n },\r\n expand: {\r\n transform: 'rotate(0deg)',\r\n marginLeft: 'auto',\r\n transition: theme.transitions.create('transform', {\r\n duration: theme.transitions.duration.shortest,\r\n }),\r\n },\r\n expandOpen: {\r\n transform: 'rotate(180deg)',\r\n },\r\n avatar: {\r\n backgroundColor: '#4472CA',\r\n padding: 30,\r\n },\r\n backdrop: {\r\n zIndex: theme.zIndex.drawer + 1,\r\n color: '#fff',\r\n },\r\n }),\r\n);\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useRouteMatch } from 'react-router-dom';\r\n\r\nimport moment from 'moment';\r\nimport { closestTo, isAfter, isBefore, isEqual } from 'date-fns';\r\n\r\nimport {\r\n Button,\r\n Typography,\r\n Tooltip,\r\n Avatar,\r\n CardActions,\r\n CardContent,\r\n CardHeader,\r\n Card,\r\n Chip,\r\n IconButton,\r\n Breadcrumbs,\r\n Link,\r\n Backdrop,\r\n CircularProgress,\r\n} from '@material-ui/core';\r\n\r\nimport { Container, useStyles } from './styles';\r\n\r\nimport api from '../../services/api';\r\nimport Alert from '../../components/Alert';\r\nimport { useAuth } from '../../hooks/Auth';\r\n\r\nimport { AnnualRegistration, Schedule } from './dtos';\r\n\r\nimport { AlertProps } from '../../utils/dtos';\r\n\r\nconst Admins: React.FC = () => {\r\n const classes = useStyles();\r\n const history = useHistory();\r\n const { path } = useRouteMatch();\r\n const { token, user } = useAuth();\r\n const [studentGroup, setStudentGroup] = useState('');\r\n\r\n const [canSeePreceptorships, setCanSeePreceptorships] = useState(\r\n true,\r\n );\r\n\r\n const [registration, setRegistration] = useState(\r\n null,\r\n );\r\n\r\n const [alert, setAlert] = useState({\r\n isActive: false,\r\n });\r\n\r\n const [loading, setLoading] = useState(true);\r\n\r\n const Authorization = `Bearer ${token}`;\r\n\r\n useEffect(() => {\r\n async function getRegistration() {\r\n try {\r\n const registrationResponse = await api.get(\r\n '/students/annualRegistration',\r\n {\r\n headers: {\r\n Authorization,\r\n },\r\n },\r\n );\r\n\r\n setRegistration(registrationResponse.data);\r\n\r\n const userAvailableSchedules: Date[] = registrationResponse.data.schedules\r\n .filter((schedule: Schedule) => user.groups.includes(schedule.group))\r\n .map((schedule: Schedule) => new Date(schedule.startTime));\r\n\r\n const now = new Date();\r\n\r\n const nextSchedule = closestTo(now, userAvailableSchedules);\r\n\r\n const selectedSchedule: Schedule = registrationResponse.data.schedules.find(\r\n (schedule: Schedule) =>\r\n isEqual(new Date(schedule.startTime), nextSchedule),\r\n );\r\n\r\n setStudentGroup(selectedSchedule.group);\r\n\r\n const inSchedule = isAfter(now, nextSchedule);\r\n\r\n const finishedAllRounds = registrationResponse.data.schedules.every(\r\n (schedule: Schedule) => isBefore(new Date(schedule.endTime), now),\r\n );\r\n\r\n if (\r\n !userAvailableSchedules.length ||\r\n !inSchedule ||\r\n (isBefore(new Date(selectedSchedule.endTime), now) &&\r\n !finishedAllRounds)\r\n )\r\n setCanSeePreceptorships(false);\r\n\r\n setAlert({\r\n isActive: true,\r\n type: 'success',\r\n message: 'Inscrição anual encontrada com sucesso.',\r\n });\r\n } catch (error) {\r\n if (error.message.includes('401')) {\r\n setAlert({\r\n isActive: true,\r\n type: 'warning',\r\n message: 'Sessão expirada, faça o login novamente.',\r\n });\r\n } else {\r\n setAlert({\r\n isActive: true,\r\n type: 'error',\r\n message: 'Erro ao buscar inscrição anual.',\r\n });\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n getRegistration();\r\n }, []);\r\n\r\n const handleAlert = useCallback(() => {\r\n setAlert({ isActive: false });\r\n }, []);\r\n\r\n return (\r\n \r\n \r\n \r\n Dashboard\r\n \r\n Incrições anuais\r\n \r\n\r\n \r\n \r\n \r\n\r\n
\r\n {!loading && !registration && (\r\n \r\n \r\n \r\n Não existem inscrições ativas este ano.\r\n \r\n \r\n \r\n )}\r\n\r\n {registration && (\r\n \r\n {registration.year}\r\n }\r\n title={registration.name}\r\n subheader={`Inscrições abertas em ${moment(\r\n registration.createdAt,\r\n ).format('DD/MM/YYYY')}`}\r\n />\r\n\r\n \r\n \r\n Seus horários de inscrição:\r\n \r\n\r\n \r\n {registration.schedules\r\n .filter((schedule) => user.groups.includes(schedule.group))\r\n .map((studentSchedule) => (\r\n \r\n ))}\r\n \r\n \r\n\r\n \r\n \r\n {canSeePreceptorships\r\n ? 'Clique para ver as turmas!'\r\n : 'Fora de horário! Recarregue esta página nas datas e horários acima.'}\r\n \r\n )}\r\n >\r\n \r\n \r\n history.push(\r\n `${path}/registration/${registration._id}/student/${studentGroup}`,\r\n )\r\n }\r\n >\r\n Ver horários\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n\r\n {alert.isActive && (\r\n \r\n {alert.message}\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default Admins;\r\n","import styled from 'styled-components';\r\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles';\r\n\r\nexport const Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n\r\n .cards-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n justify-content: center;\r\n\r\n @media (max-width: 1170px) {\r\n flex-direction: column;\r\n align-items: center;\r\n }\r\n }\r\n\r\n .preceptorships-card {\r\n margin: 1%;\r\n width: 40%;\r\n\r\n @media (max-width: 1170px) {\r\n width: 100%;\r\n }\r\n }\r\n`;\r\n\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n maxWidth: 1000,\r\n },\r\n media: {\r\n height: 0,\r\n paddingTop: '56.25%',\r\n },\r\n expand: {\r\n transform: 'rotate(0deg)',\r\n marginLeft: 'auto',\r\n transition: theme.transitions.create('transform', {\r\n duration: theme.transitions.duration.shortest,\r\n }),\r\n },\r\n expandOpen: {\r\n transform: 'rotate(180deg)',\r\n },\r\n avatar: {\r\n backgroundColor: '#4472CA',\r\n },\r\n backdrop: {\r\n zIndex: theme.zIndex.drawer + 1,\r\n color: '#fff',\r\n },\r\n }),\r\n);\r\n","import React, { useState, useCallback, useEffect, useRef } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport moment from 'moment';\r\nimport socketio from 'socket.io-client';\r\n\r\nimport { Check, DesktopMac } from '@material-ui/icons';\r\n\r\nimport {\r\n Button,\r\n Typography,\r\n IconButton,\r\n CardActions,\r\n CardContent,\r\n CardHeader,\r\n Card,\r\n Tooltip,\r\n Backdrop,\r\n CircularProgress,\r\n Chip,\r\n Divider,\r\n Breadcrumbs,\r\n Link,\r\n} from '@material-ui/core';\r\n\r\nimport { Container, useStyles } from './styles';\r\n\r\nimport api from '../../services/api';\r\nimport Alert from '../../components/Alert';\r\n\r\nimport { useAuth } from '../../hooks/Auth';\r\nimport { AlertProps } from '../../utils/dtos';\r\n\r\nimport { Preceptorships } from './dtos';\r\n\r\nconst socket = socketio.io(process.env.REACT_APP_PRECEPTORIA_API, {\r\n reconnection: true,\r\n reconnectionDelay: 2000,\r\n timeout: 60000,\r\n});\r\n\r\ninterface PreceptorshipSocket {\r\n preceptorship: string;\r\n group: string;\r\n}\r\n\r\ninterface ActionReducer {\r\n type: string;\r\n payload?: PreceptorshipSocket;\r\n init?: Preceptorships[];\r\n}\r\n\r\ninterface Weekdays {\r\n [key: number]: string;\r\n}\r\n\r\nconst weekDays: Weekdays = {\r\n 1: 'Segunda',\r\n 2: 'Terça',\r\n 3: 'Quarta',\r\n 4: 'Quinta',\r\n 5: 'Sexta',\r\n 6: 'Sábado',\r\n 0: 'Domingo',\r\n};\r\n\r\nconst PreceptorshipsList: React.FC = () => {\r\n const classes = useStyles();\r\n const { token } = useAuth();\r\n const { id, groupId } = useParams();\r\n\r\n const [preceptorships, setPreceptorships] = useState([]);\r\n const ref = useRef(preceptorships);\r\n const [signedIn, setSignedIn] = useState(null);\r\n\r\n const [alert, setAlert] = useState({\r\n isActive: false,\r\n });\r\n\r\n const [loading, setLoading] = useState(true);\r\n\r\n const Authorization = `Bearer ${token}`;\r\n\r\n const handleVacancy = useCallback(\r\n (action: ActionReducer) => {\r\n const currentPreceptorships = ref.current;\r\n let findPrecepIdx = -1;\r\n let findGroupIdx = -1;\r\n\r\n if (action.payload) {\r\n findPrecepIdx = currentPreceptorships.findIndex(\r\n (precep) => precep._id === action.payload?.preceptorship,\r\n );\r\n\r\n findGroupIdx = currentPreceptorships[findPrecepIdx].vacancy.findIndex(\r\n (vacancy) => vacancy.group._id === action.payload?.group,\r\n );\r\n }\r\n\r\n switch (action.type) {\r\n case 'increment':\r\n if (action.payload && findPrecepIdx >= 0 && findGroupIdx >= 0) {\r\n currentPreceptorships[findPrecepIdx].vacancy[findGroupIdx]\r\n .placesLeft++;\r\n }\r\n\r\n currentPreceptorships[findPrecepIdx].students.pop();\r\n ref.current = currentPreceptorships;\r\n setPreceptorships([...currentPreceptorships]);\r\n break;\r\n case 'decrement':\r\n if (action.payload && findPrecepIdx >= 0 && findGroupIdx >= 0) {\r\n currentPreceptorships[findPrecepIdx].vacancy[findGroupIdx]\r\n .placesLeft--;\r\n }\r\n\r\n currentPreceptorships[findPrecepIdx].students.push({\r\n _id: 'fake id',\r\n date: new Date(),\r\n group: 'fake group',\r\n order: 1,\r\n student: 'fake student',\r\n });\r\n ref.current = currentPreceptorships;\r\n setPreceptorships([...currentPreceptorships]);\r\n break;\r\n case 'fetch':\r\n ref.current = action.init || [];\r\n setPreceptorships(action.init || []);\r\n break;\r\n default:\r\n break;\r\n }\r\n },\r\n [ref],\r\n );\r\n\r\n useEffect(() => {\r\n async function getPreceptorships() {\r\n try {\r\n const preceptorshipsResponse = await api.get(\r\n `/students/annualRegistration/${id}/preceptorships`,\r\n {\r\n headers: {\r\n Authorization,\r\n },\r\n },\r\n );\r\n\r\n const signedPreceptorshipsResponse = await api.get(\r\n `/students/annualRegistration/${id}/signedPreceptorships`,\r\n {\r\n headers: {\r\n Authorization,\r\n },\r\n },\r\n );\r\n\r\n if (signedPreceptorshipsResponse.data.length) {\r\n setSignedIn(signedPreceptorshipsResponse.data[0]);\r\n }\r\n\r\n handleVacancy({\r\n type: 'fetch',\r\n init: preceptorshipsResponse.data,\r\n });\r\n\r\n setAlert({\r\n isActive: true,\r\n type: 'success',\r\n message: 'Preceptorias listadas com sucesso.',\r\n });\r\n } catch (error) {\r\n setAlert({\r\n isActive: true,\r\n type: 'error',\r\n message: 'Erro ao listar preceptorias.',\r\n });\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n getPreceptorships();\r\n }, [handleVacancy]);\r\n\r\n useEffect(() => {\r\n socket.on('increment', (precepSocket: PreceptorshipSocket) => {\r\n handleVacancy({ type: 'increment', payload: precepSocket });\r\n });\r\n }, [handleVacancy]);\r\n\r\n useEffect(() => {\r\n socket.on('decrement', (precepSocket: PreceptorshipSocket) => {\r\n handleVacancy({ type: 'decrement', payload: precepSocket });\r\n });\r\n }, [handleVacancy]);\r\n\r\n const handleAlert = useCallback(() => {\r\n setAlert({ isActive: false });\r\n }, []);\r\n\r\n const handleStudentSign = useCallback(\r\n async (preceptorshipId) => {\r\n setLoading(true);\r\n\r\n try {\r\n // const signedPreceptorshipsResponse = await api.get(\r\n // `/students/annualRegistration/${id}/signedPreceptorships`,\r\n // {\r\n // headers: {\r\n // Authorization,\r\n // },\r\n // },\r\n // );\r\n\r\n // if (signedPreceptorshipsResponse.data.length) {\r\n // const preceptorshipToUnsignId =\r\n // signedPreceptorshipsResponse.data[0]._id;\r\n\r\n // await api.delete(\r\n // `/students/signPreceptorship/${preceptorshipToUnsignId}`,\r\n // {\r\n // headers: {\r\n // Authorization,\r\n // },\r\n // },\r\n // );\r\n // }\r\n\r\n const newSignedPreceptorship = await api.post(\r\n `/students/signPreceptorship`,\r\n {\r\n groupId,\r\n preceptorshipId,\r\n registrationId: id,\r\n },\r\n {\r\n headers: {\r\n Authorization,\r\n },\r\n },\r\n );\r\n\r\n setSignedIn(newSignedPreceptorship.data);\r\n\r\n setAlert({\r\n isActive: true,\r\n type: 'success',\r\n message: 'Incrição realizada com sucesso!',\r\n });\r\n } catch (error) {\r\n setAlert({\r\n isActive: true,\r\n type: 'error',\r\n message: 'Erro ao inscrever-se em uma preceptoria.',\r\n });\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n [id, groupId, Authorization],\r\n );\r\n\r\n const renderSubscribeButton = useCallback(\r\n (preceptorship: Preceptorships) => {\r\n const isSubscribed = signedIn?._id === preceptorship._id;\r\n const isFull =\r\n preceptorship.totalStudents === preceptorship.students.length;\r\n const isFilled =\r\n preceptorship.vacancy.find((v) => v.group._id === groupId)\r\n ?.placesLeft === 0;\r\n\r\n let label;\r\n\r\n if (isSubscribed) {\r\n label = 'Inscrito';\r\n } else if (isFilled || isFull) {\r\n label = 'Lotado';\r\n } else {\r\n label = 'Inscrever-se';\r\n }\r\n\r\n return (\r\n <>\r\n handleStudentSign(preceptorship._id)}\r\n >\r\n {label}\r\n \r\n\r\n {isSubscribed && }\r\n \r\n );\r\n },\r\n [signedIn, groupId, handleStudentSign],\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n Dashboard\r\n \r\n \r\n Incrições anuais\r\n \r\n Turmas Preceptorias\r\n \r\n\r\n
\r\n {!preceptorships.length && !loading && (\r\n \r\n \r\n \r\n Nenhuma turma cadastrada para esse ano.\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n\r\n {preceptorships?.map((preceptorship) => (\r\n
\r\n \r\n \r\n }\r\n subheader={`${moment(preceptorship.startTime).format(\r\n 'HH:mm',\r\n )} às ${moment(preceptorship.endTime).format('HH:mm')}`}\r\n />\r\n\r\n \r\n\r\n \r\n \r\n Coordenadores\r\n \r\n\r\n \r\n {preceptorship.coordinators.map((coord) => (\r\n \r\n ))}\r\n \r\n\r\n \r\n Distribuição das Vagas\r\n \r\n\r\n \r\n {preceptorship.vacancy.map((v) => (\r\n \r\n ))}\r\n \r\n \r\n\r\n \r\n \r\n {renderSubscribeButton(preceptorship)}\r\n \r\n\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n ))}\r\n
\r\n\r\n {alert.isActive && (\r\n \r\n {alert.message}\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default PreceptorshipsList;\r\n","import React, { useCallback, useState, useRef } from 'react';\r\nimport clsx from 'clsx';\r\nimport * as Yup from 'yup';\r\nimport { FormHandles } from '@unform/core';\r\n\r\nimport {\r\n AppBar,\r\n Toolbar,\r\n MenuItem,\r\n Menu,\r\n CssBaseline,\r\n IconButton,\r\n useTheme,\r\n Divider,\r\n Avatar,\r\n} from '@material-ui/core';\r\n\r\nimport { Switch, useRouteMatch } from 'react-router-dom';\r\n\r\nimport { useAuth } from '../../hooks/Auth';\r\nimport Logo from '../../assets/Ceapia-02.png';\r\nimport Route from '../../routes/Route';\r\n\r\nimport Input from '../../components/Input';\r\nimport Alert from '../../components/Alert';\r\nimport DialogForm from '../../components/DialogForm';\r\n\r\nimport { UpdateAdminData } from './dtos';\r\nimport { Container, Header, useStyles } from './styles';\r\n\r\nimport api from '../../services/api';\r\nimport Registration from '../AnnualRegistation';\r\nimport Preceptorships from '../Preceptorships';\r\n\r\nimport { AlertProps } from '../../utils/dtos';\r\nimport getValidationErrors from '../../utils/getValidationErrors';\r\n\r\nconst Dashboard: React.FC = () => {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const [open, setOpen] = useState(false);\r\n const formRefUpdate = useRef(null);\r\n const [myDataOpen, setMyDataOpen] = useState(false);\r\n // const [admin, setAdmin] = useState({} as Admin);\r\n const [alert, setAlert] = useState({\r\n isActive: false,\r\n });\r\n\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const openMenu = Boolean(anchorEl);\r\n\r\n const { logout, user, token } = useAuth();\r\n const { path } = useRouteMatch();\r\n\r\n const Authorization = `Bearer ${token}`;\r\n\r\n const handleMenu = (event: React.MouseEvent) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleAlert = useCallback(() => {\r\n setAlert({ isActive: false });\r\n }, []);\r\n\r\n const handleMyDataOpen = useCallback(async () => {\r\n try {\r\n const response = await api.get(`/admins/me`, {\r\n headers: {\r\n Authorization,\r\n },\r\n });\r\n\r\n // setAdmin(response.data);\r\n setMyDataOpen(true);\r\n } catch (error) {\r\n setAlert({\r\n isActive: true,\r\n type: 'error',\r\n message: 'Erro ao buscar dados do perfil.',\r\n });\r\n } finally {\r\n handleClose();\r\n }\r\n }, []);\r\n\r\n const handleMyDataClose = () => {\r\n setMyDataOpen(false);\r\n };\r\n\r\n const handleSubmit = useCallback(async (data: UpdateAdminData) => {\r\n try {\r\n formRefUpdate.current?.setErrors({});\r\n\r\n const schema = Yup.object().shape({\r\n name: Yup.string().required('Nome obrigatório'),\r\n email: Yup.string()\r\n .email('Digite um e-mail válido.')\r\n .required('E-mail obrigatório.'),\r\n password: Yup.string(),\r\n passwordConfirm: Yup.string().oneOf(\r\n [Yup.ref('password')],\r\n 'Senhas devem ser iguais.',\r\n ),\r\n });\r\n\r\n await schema.validate(data, { abortEarly: false });\r\n\r\n const { password } = data;\r\n\r\n if (!password) {\r\n delete data.password;\r\n delete data.passwordConfirm;\r\n }\r\n\r\n await api.put(`/admins`, data, {\r\n headers: {\r\n Authorization,\r\n },\r\n });\r\n\r\n setAlert({\r\n isActive: true,\r\n type: 'success',\r\n message: 'Perfil atualizado com sucesso.',\r\n });\r\n\r\n handleMyDataClose();\r\n window.location.reload(false);\r\n } catch (error) {\r\n if (error instanceof Yup.ValidationError) {\r\n const errors = getValidationErrors(error);\r\n\r\n formRefUpdate.current?.setErrors(errors);\r\n } else {\r\n setAlert({\r\n isActive: true,\r\n type: 'error',\r\n message: 'Erro ao atualizar perfil.',\r\n });\r\n }\r\n }\r\n }, []);\r\n\r\n return (\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n\r\n \r\n {`${user.name.split(' ')[0][0]}${user.name.split(' ')[1][0]}`}\r\n \r\n \r\n\r\n \r\n Meus dados\r\n Sair\r\n \r\n
\r\n
\r\n \r\n\r\n
\r\n
\r\n\r\n
\r\n
\r\n

{`Bem-vindo, ${user.name}`}

\r\n {user.email}\r\n
\r\n
\r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n {alert.isActive && (\r\n \r\n {alert.message}\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default Dashboard;\r\n","import React from 'react';\r\n\r\nconst NotFound: React.FC = () => {\r\n return

Not Found

;\r\n};\r\n\r\nexport default NotFound;\r\n","import React from 'react';\r\nimport { Switch } from 'react-router-dom';\r\n\r\nimport Login from '../pages/Login';\r\nimport Dashboard from '../pages/Dashboard';\r\nimport NotFound from '../pages/NotFound';\r\n\r\nimport Route from './Route';\r\n\r\nconst Routes: React.FC = () => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nexport default Routes;\r\n","import React from 'react';\r\n\r\nimport { AuthProvider } from './Auth';\r\n\r\nconst hooks: React.FC = ({ children }) => (\r\n \r\n {children}\r\n \r\n);\r\n\r\nexport default hooks;\r\n","import { createGlobalStyle } from 'styled-components';\r\n\r\nexport default createGlobalStyle`\r\n * {\r\n margin: 0;\r\n padding: 0;\r\n box-sizing: border-box;\r\n outline: 0;\r\n }\r\n\r\n body {\r\n background: #f4f4f4;\r\n -webkit-font-smoothing: antialiased;\r\n }\r\n\r\n body, input, button {\r\n font-family: 'Roboto', sans-serif;\r\n font-size: 16px;\r\n }\r\n\r\n h1, h2, h3, h4, h5, h6, strong {\r\n font-weight: 500;\r\n }\r\n\r\n button {\r\n cursor: pointer;\r\n }\r\n\r\n.student-card, .admin-card, .group-card, .coordinator-card, .room-card, .registration-card {\r\n * {\r\n max-width: 100%;\r\n }\r\n}\r\n`;\r\n\r\n// https://coolors.co/e63946-f1faee-a8dadc-457b9d-1d3557\r\n// https://coolors.co/c5d5ea-759eb8-7392b7-b3c5d7-d8e1e9\r\n// https://coolors.co/d64045-e9fff9-9ed8db-467599-1d3354\r\n// https://coolors.co/0a369d-4472ca-5e7ce2-92b4f4-cfdee7\r\n","import React from 'react';\r\nimport { BrowserRouter } from 'react-router-dom';\r\n\r\nimport Routes from './routes';\r\nimport Providers from './hooks';\r\n\r\nimport GlobalStyle from './styles/global';\r\n\r\nfunction App() {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default App;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\n\r\nimport App from './App';\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n"],"sourceRoot":""}