`rgba(${hexToRgb(theme.palette.background.default)}, 0.5)`,\r\n zIndex: (theme) => theme.zIndex.drawer + 1,\r\n }}\r\n />\r\n {open && (\r\n <>\r\n \r\n \r\n {renderContent ? {renderContent()} : null}\r\n \r\n {renderPopover({\r\n handleClose,\r\n nextStep,\r\n onChangeStepIndex,\r\n open,\r\n prevStep,\r\n reset,\r\n scrolling,\r\n size,\r\n step: safeStep?.step,\r\n stepIndex,\r\n stepOptions: safeStep?.stepOptions,\r\n stepRef: anchorEl?.current,\r\n })}\r\n >\r\n )}\r\n >\r\n );\r\n};\r\n\r\nTutorial.defaultProps = {\r\n offsetTop: 78,\r\n renderPopover: TutorialPopover,\r\n tutorialBoxPadding: 8,\r\n};\r\n\r\nexport default Tutorial;\r\n","import { useTheme } from '@material-ui/core';\r\nimport config from 'config';\r\nimport React from 'react';\r\nimport { Helmet } from 'react-helmet-async';\r\n\r\nconst ConfigProvider = () => {\r\n const theme = useTheme();\r\n\r\n if (!config?.public) return null;\r\n\r\n const { appleIconURL, faviconURL, manifestURL, title } = config.public;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n {title}\r\n \r\n >\r\n );\r\n};\r\n\r\nexport default ConfigProvider;\r\n","import { Box } from '@material-ui/core';\r\n// material\r\nimport { alpha, makeStyles, experimentalStyled as styled } from '@material-ui/core/styles';\r\nimport { motion } from 'framer-motion';\r\nimport NProgress from 'nprogress';\r\nimport React, { useEffect, useMemo } from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst nprogressStyle = makeStyles((theme) => ({\r\n '@global': {\r\n '#nprogress': {\r\n '& .bar': {\r\n backgroundColor: theme.palette.primary.main,\r\n boxShadow: `0 0 2px ${theme.palette.primary.main}`,\r\n height: 2,\r\n left: 0,\r\n position: 'fixed',\r\n top: 0,\r\n width: '100%',\r\n zIndex: theme.zIndex.snackbar,\r\n },\r\n '& .peg': {\r\n boxShadow: `0 0 10px ${theme.palette.primary.main}, 0 0 5px ${theme.palette.primary.main}`,\r\n display: 'block',\r\n height: '100%',\r\n opacity: 1,\r\n position: 'absolute',\r\n right: 0,\r\n transform: 'rotate(3deg) translate(0px, -4px)',\r\n width: 100,\r\n },\r\n pointerEvents: 'none',\r\n },\r\n },\r\n}));\r\n\r\nconst RootStyle = styled('div')(({ theme }) => ({\r\n alignItems: 'center',\r\n backgroundColor: theme.palette.background.default,\r\n display: 'flex',\r\n height: '100%',\r\n justifyContent: 'center',\r\n}));\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function LoadingScreen({ ...other }) {\r\n nprogressStyle();\r\n\r\n useMemo(() => {\r\n NProgress.start();\r\n }, []);\r\n\r\n useEffect(() => {\r\n NProgress.done();\r\n }, []);\r\n\r\n return (\r\n \r\n `solid 3px ${alpha(theme.palette.primary.dark, 0.24)}`,\r\n borderRadius: '25%',\r\n height: 100,\r\n position: 'absolute',\r\n width: 100,\r\n }}\r\n transition={{ duration: 3.2, ease: 'linear', repeat: Infinity }}\r\n />\r\n\r\n `solid 8px ${alpha(theme.palette.primary.dark, 0.24)}`,\r\n borderRadius: '25%',\r\n height: 120,\r\n position: 'absolute',\r\n width: 120,\r\n }}\r\n transition={{\r\n duration: 3.2,\r\n ease: 'linear',\r\n repeat: Infinity,\r\n }}\r\n />\r\n \r\n );\r\n}\r\n","// emotion\r\nimport createCache from '@emotion/cache';\r\nimport { CacheProvider } from '@emotion/react';\r\nimport { useTheme } from '@material-ui/core/styles';\r\n// material\r\nimport { StylesProvider, jssPreset } from '@material-ui/styles';\r\nimport { create } from 'jss';\r\n// rtl\r\nimport rtl from 'jss-rtl';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useEffect } from 'react';\r\nimport rtlPlugin from 'stylis-plugin-rtl';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst RtlLayout = ({ children }) => {\r\n const theme = useTheme();\r\n\r\n const jss = create({\r\n plugins: [...jssPreset().plugins, rtl()],\r\n });\r\n\r\n useEffect(() => {\r\n document.dir = theme.direction;\r\n }, [theme.direction]);\r\n\r\n const cache = createCache({\r\n key: theme.direction === 'rtl' ? 'rtl' : 'css',\r\n prepend: true,\r\n stylisPlugins: theme.direction === 'rtl' ? [rtlPlugin] : [],\r\n });\r\n\r\n cache.compat = true;\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nRtlLayout.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport default RtlLayout;\r\n","import { useEffect } from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function ScrollToTop() {\r\n const { pathname } = useLocation();\r\n\r\n useEffect(() => {\r\n window.scrollTo(0, 0);\r\n }, [pathname]);\r\n\r\n return null;\r\n}\r\n","import { RecordsProvider } from 'contexts/RecordsContext';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useState } from 'react';\r\nimport { Navigate, useLocation } from 'react-router-dom';\r\n\r\n// hooks\r\nimport useAuth from '../hooks/useAuth';\r\n// pages\r\nimport Login from '../pages/authentication/Login';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst AuthGuard = ({ children }) => {\r\n const { isAuthenticated } = useAuth();\r\n const { pathname } = useLocation();\r\n const [requestedLocation, setRequestedLocation] = useState(null);\r\n\r\n if (!isAuthenticated) {\r\n if (pathname !== requestedLocation) {\r\n setRequestedLocation(pathname);\r\n }\r\n return ;\r\n }\r\n\r\n if (requestedLocation && pathname !== requestedLocation) {\r\n setRequestedLocation(null);\r\n return ;\r\n }\r\n\r\n return {children};\r\n};\r\n\r\nAuthGuard.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport default AuthGuard;\r\n","import PropTypes from 'prop-types';\r\n// hooks\r\nimport React from 'react';\r\nimport { Navigate } from 'react-router-dom';\r\n\r\nimport useAuth from '../hooks/useAuth';\r\n// routes\r\nimport { PATH_DASHBOARD } from '../routes/paths';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst GuestGuard = ({ children }) => {\r\n const { isAuthenticated } = useAuth();\r\n\r\n if (isAuthenticated) {\r\n return ;\r\n }\r\n\r\n return <>{children}>;\r\n};\r\n\r\nGuestGuard.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport default GuestGuard;\r\n","import { capitalize } from 'lodash';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst PRIMARY_NAME = ['A', 'N', 'H', 'L', 'Q', '9', '8'];\r\nconst INFO_NAME = ['F', 'G', 'T', 'I', 'J', '1', '2', '3'];\r\nconst SUCCESS_NAME = ['K', 'D', 'Y', 'B', 'O', '4', '5'];\r\nconst WARNING_NAME = ['P', 'E', 'R', 'S', 'C', 'U', '6', '7'];\r\nconst ERROR_NAME = ['V', 'W', 'X', 'M', 'Z'];\r\n\r\nfunction getFirstCharacter(name) {\r\n return capitalize(name && name.charAt(0));\r\n}\r\n\r\nfunction getAvatarColor(name) {\r\n if (PRIMARY_NAME.includes(getFirstCharacter(name))) return 'primary';\r\n if (INFO_NAME.includes(getFirstCharacter(name))) return 'info';\r\n if (SUCCESS_NAME.includes(getFirstCharacter(name))) return 'success';\r\n if (WARNING_NAME.includes(getFirstCharacter(name))) return 'warning';\r\n if (ERROR_NAME.includes(getFirstCharacter(name))) return 'warning';\r\n return 'default';\r\n}\r\n\r\nexport default function createAvatar(name) {\r\n return {\r\n color: getAvatarColor(name),\r\n name: getFirstCharacter(name),\r\n };\r\n}\r\n","// hooks\r\nimport React from 'react';\r\n\r\nimport useAuth from '../hooks/useAuth';\r\nimport createAvatar from '../utils/createAvatar';\r\n//\r\nimport { MAvatar } from './@material-extend';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function MyAvatar({ ...other }) {\r\n const { user } = useAuth();\r\n\r\n return (\r\n \r\n {createAvatar(user.displayName).name}\r\n \r\n );\r\n}\r\n","import { Box, Button, Divider, Typography } from '@material-ui/core';\r\n// material\r\nimport { alpha } from '@material-ui/core/styles';\r\nimport { useSnackbar } from 'notistack';\r\nimport React, { useRef, useState } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\n// components\r\nimport { MIconButton } from '../../components/@material-extend';\r\nimport MenuPopover from '../../components/MenuPopover';\r\nimport MyAvatar from '../../components/MyAvatar';\r\n// hooks\r\nimport useAuth from '../../hooks/useAuth';\r\nimport useIsMountedRef from '../../hooks/useIsMountedRef';\r\n\r\nexport default function AccountPopover() {\r\n const anchorRef = useRef(null);\r\n const navigate = useNavigate();\r\n const { enqueueSnackbar } = useSnackbar();\r\n const isMountedRef = useIsMountedRef();\r\n const { logout, user } = useAuth();\r\n const [open, setOpen] = useState(false);\r\n\r\n const handleOpen = () => {\r\n setOpen(true);\r\n };\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n const handleLogout = async () => {\r\n try {\r\n await logout();\r\n navigate('/');\r\n if (isMountedRef.current) {\r\n handleClose();\r\n }\r\n } catch (error) {\r\n enqueueSnackbar('Unable to logout', { variant: 'error' });\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n alpha(theme.palette.grey[900], 0.72),\r\n borderRadius: '50%',\r\n content: \"''\",\r\n height: '100%',\r\n position: 'absolute',\r\n width: '100%',\r\n zIndex: 1,\r\n },\r\n }),\r\n }}\r\n >\r\n \r\n \r\n\r\n \r\n \r\n \r\n {user.displayName}\r\n \r\n \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","import {\r\n Button,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle,\r\n IconButton,\r\n} from '@material-ui/core';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useState } from 'react';\r\nimport stopPropagation from 'utils/stopPropagation';\r\n\r\nconst IconButtonWithConfirm = ({ children, confirmationProps, onClick, ...props }) => {\r\n const { cancelText, confirmText, content, title } = confirmationProps;\r\n const [confirmOpen, setConfirmOpen] = useState(false);\r\n\r\n const handleOpenConfirmation = () => {\r\n setConfirmOpen(true);\r\n };\r\n const handleCloseConfirmation = () => {\r\n setConfirmOpen(false);\r\n };\r\n\r\n const handleConfirm = () => {\r\n if (onClick) onClick();\r\n handleCloseConfirmation();\r\n };\r\n\r\n const handleCancel = () => {\r\n handleCloseConfirmation();\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {children}\r\n \r\n \r\n >\r\n );\r\n};\r\n\r\nIconButtonWithConfirm.defaultProps = {\r\n confirmationProps: {\r\n cancelText: 'Annuler',\r\n confirmText: 'Ok',\r\n content: 'Cette action est irréversible. Êtes-vous certain de vouloir poursuivre ?',\r\n title: 'Attention',\r\n },\r\n};\r\n\r\nIconButtonWithConfirm.propTypes = {\r\n confirmationProps: PropTypes.shape({\r\n cancelText: PropTypes.string,\r\n confirmText: PropTypes.string,\r\n content: PropTypes.string,\r\n onCancel: PropTypes.func,\r\n onConfirm: PropTypes.func,\r\n title: PropTypes.string,\r\n }),\r\n};\r\n\r\nexport default IconButtonWithConfirm;\r\n","import {\r\n Alert,\r\n Button,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogTitle,\r\n Stack,\r\n TextField,\r\n Typography,\r\n} from '@material-ui/core';\r\nimport { LoadingButton } from '@material-ui/lab';\r\nimport { Form, FormikProvider, useFormik } from 'formik';\r\nimport useContacts from 'hooks/useContacts';\r\n// import useContacts from 'hooks/useContacts';\r\nimport useIsMountedRef from 'hooks/useIsMountedRef';\r\nimport React from 'react';\r\nimport { fDate } from 'utils/formatTime';\r\nimport * as Yup from 'yup';\r\n\r\nconst ContactForm = ({ contact, onClose }) => {\r\n const creating = !contact;\r\n const isMountedRef = useIsMountedRef();\r\n const { createContact, updateContact } = useContacts();\r\n\r\n const ContactSchema = Yup.object().shape({\r\n FCT: Yup.string().max(100, 'Max. 100 caractères.'),\r\n MAIL: Yup.string()\r\n .email(\"L'email doit être une adresse valide\")\r\n .required(\"L'email est requis.\")\r\n .max(100, 'Max. 100 caractères.'),\r\n NOM: Yup.string().required('Le nom est requis.').max(100, 'Max. 100 caractères.'),\r\n PRENOM: Yup.string().required('Le prénom est requis.').max(100, 'Max. 100 caractères.'),\r\n });\r\n\r\n const formik = useFormik({\r\n initialValues: !creating\r\n ? contact\r\n : {\r\n FCT: '',\r\n MAIL: '',\r\n NOM: '',\r\n PRENOM: '',\r\n },\r\n onSubmit: async (contactData, { resetForm, setErrors, setSubmitting }) => {\r\n try {\r\n if (creating) {\r\n await createContact(contactData);\r\n } else {\r\n await updateContact(contact.ID_CONTACT, contactData);\r\n }\r\n if (isMountedRef.current) {\r\n setSubmitting(false);\r\n }\r\n if (onClose) onClose();\r\n } catch (error) {\r\n resetForm();\r\n if (isMountedRef.current) {\r\n setSubmitting(false);\r\n setErrors({ afterSubmit: 'Erreur lors de la création du contact' });\r\n }\r\n }\r\n },\r\n validationSchema: ContactSchema,\r\n });\r\n\r\n const { errors, getFieldProps, handleSubmit, isSubmitting, touched, values } = formik;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ContactForm;\r\n","import { Box } from '@material-ui/core';\r\n// material\r\nimport { alpha, experimentalStyled as styled } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport SimpleBarReact from 'simplebar-react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst RootStyle = styled('div')({\r\n flexGrow: 1,\r\n height: '100%',\r\n overflow: 'hidden',\r\n});\r\n\r\nconst SimpleBarStyle = styled(SimpleBarReact)(({ theme }) => ({\r\n // cspell-checker: disable-next-line\r\n '& .simplebar-mask': {\r\n zIndex: 'inherit',\r\n },\r\n // cspell-checker: disable-next-line\r\n '& .simplebar-scrollbar': {\r\n // cspell-checker: disable-next-line\r\n '&.simplebar-visible:before': {\r\n opacity: 1,\r\n },\r\n '&:before': {\r\n backgroundColor: alpha(theme.palette.grey[600], 0.48),\r\n },\r\n },\r\n // cspell-checker: disable-next-line\r\n '& .simplebar-track.simplebar-horizontal .simplebar-scrollbar': {\r\n height: 6,\r\n },\r\n // cspell-checker: disable-next-line\r\n '& .simplebar-track.simplebar-vertical': {\r\n width: 10,\r\n },\r\n maxHeight: '100%',\r\n}));\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst Scrollbar = ({ children, sx, ...other }) => {\r\n const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\r\n\r\n if (isMobile) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n};\r\n\r\nScrollbar.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n // eslint-disable-next-line react/forbid-prop-types\r\n sx: PropTypes.object,\r\n};\r\n\r\nexport default Scrollbar;\r\n","import peopleFill from '@iconify/icons-eva/people-fill';\r\nimport { Icon } from '@iconify/react';\r\nimport {\r\n Avatar,\r\n Box,\r\n Divider,\r\n List,\r\n ListItem,\r\n ListItemAvatar,\r\n ListItemSecondaryAction,\r\n ListItemText,\r\n Tooltip,\r\n Typography,\r\n} from '@material-ui/core';\r\n// material\r\nimport { alpha } from '@material-ui/core/styles';\r\nimport { Delete as DeleteIcon } from '@material-ui/icons';\r\nimport IconButtonWithConfirm from 'components/buttons/IconButtonWithConfirm';\r\nimport ContactForm from 'components/contacts/ContactForm';\r\nimport TutorialElement from 'components/tutorial/TutorialElement';\r\nimport useContacts from 'hooks/useContacts';\r\nimport React, { useEffect, useRef, useState } from 'react';\r\n\r\nimport { MButton, MIconButton } from '../../components/@material-extend';\r\nimport MenuPopover from '../../components/MenuPopover';\r\n// components\r\nimport Scrollbar from '../../components/Scrollbar';\r\n\r\n// hooks\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst ITEM_HEIGHT = 64;\r\nconst PADDING_ITEM = 2.5;\r\n\r\nconst ContactListItem = ({ contact, onDeleteContact, onSelectContact }) => {\r\n const { FCT, ID_CONTACT, MAIL, NOM, PRENOM } = contact;\r\n return (\r\n onSelectContact(contact)}\r\n sx={{\r\n height: ITEM_HEIGHT,\r\n px: PADDING_ITEM,\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n onDeleteContact(ID_CONTACT)}>\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst ContactsPopover = () => {\r\n const anchorRef = useRef(null);\r\n const [open, setOpen] = useState(false);\r\n const [formOpen, setFormOpen] = useState();\r\n const [selectedContact, setSelectedContact] = useState();\r\n\r\n const { contacts, deleteContact, getContacts } = useContacts();\r\n\r\n useEffect(() => {\r\n getContacts();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const handleOpen = () => {\r\n setOpen(true);\r\n };\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n const handleAddContact = () => {\r\n setFormOpen(true);\r\n };\r\n\r\n const handleCloseContactForm = () => {\r\n setSelectedContact(null);\r\n setFormOpen(false);\r\n };\r\n\r\n const stepOptions = {\r\n body: 'Administrez vos contacts facilement et en quelques clics!',\r\n renderContent: () => (\r\n \r\n \r\n \r\n ),\r\n step: 2,\r\n title: 'Gérez vos Contacts',\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n alpha(theme.palette.primary.main, theme.palette.action.focusOpacity),\r\n }),\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n Contacts ({contacts.length})\r\n \r\n\r\n \r\n \r\n {contacts.map((contact) => (\r\n deleteContact(contact.ID_CONTACT)}\r\n onSelectContact={() => setSelectedContact(contact)}\r\n />\r\n ))}\r\n
\r\n \r\n \r\n \r\n Nouveau contact\r\n \r\n \r\n \r\n {(selectedContact || formOpen) && (\r\n \r\n )}\r\n \r\n >\r\n );\r\n};\r\n\r\nexport default ContactsPopover;\r\n","import bellFill from '@iconify/icons-eva/bell-fill';\r\nimport clockFill from '@iconify/icons-eva/clock-fill';\r\nimport { Icon } from '@iconify/react';\r\nimport { Badge, Box, Divider, List, ListItem, ListItemText, Stack, Typography } from '@material-ui/core';\r\n// material\r\nimport { alpha } from '@material-ui/core/styles';\r\nimport { LoadingButton } from '@material-ui/lab';\r\nimport TypeLabel from 'components/dashboard/records/labels/TypeLabel';\r\nimport TutorialElement from 'components/tutorial/TutorialElement';\r\nimport useNotifications from 'hooks/useNotifications';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Link as RouterLink } from 'react-router-dom';\r\nimport { fDate } from 'utils/formatTime';\r\n\r\nimport { MIconButton } from '../../components/@material-extend';\r\nimport MenuPopover from '../../components/MenuPopover';\r\n// components\r\nimport Scrollbar from '../../components/Scrollbar';\r\n\r\n// utils\r\n// ----------------------------------------------------------------------\r\n\r\nfunction NotificationItem({ notification, onClose }) {\r\n return (\r\n \r\n \r\n \r\n \r\n {`Le ${fDate(new Date(notification.DTEDERMOD))}`}\r\n \r\n \r\n \r\n }\r\n />\r\n \r\n );\r\n}\r\n\r\nNotificationItem.propTypes = {\r\n // eslint-disable-next-line react/forbid-prop-types\r\n notification: PropTypes.object.isRequired,\r\n};\r\n\r\nconst NotificationsPopover = () => {\r\n const anchorRef = useRef(null);\r\n const [open, setOpen] = useState(false);\r\n const [refreshing, setRefreshing] = useState(false);\r\n const { getNotifications, notifications } = useNotifications();\r\n\r\n const totalUnRead = notifications.length;\r\n\r\n const handleOpen = () => {\r\n setOpen(true);\r\n };\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n useEffect(() => {\r\n let interval = null;\r\n (async () => {\r\n await getNotifications();\r\n interval = setInterval(getNotifications, 30000);\r\n })();\r\n\r\n return () => interval && clearInterval(interval);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const handleRefreshNotifications = async () => {\r\n setRefreshing(true);\r\n await getNotifications();\r\n setRefreshing(false);\r\n };\r\n\r\n const stepOptions = {\r\n body: 'Recevez des notifications au sujet des dossiers en cours et ouvert ! Si vous êtes connecté depuis longtemps, pensez à rafraîchir.',\r\n renderContent: () => (\r\n \r\n \r\n \r\n ),\r\n step: 1,\r\n title: 'Notifications',\r\n };\r\n\r\n return (\r\n <>\r\n \r\n alpha(theme.palette.primary.main, theme.palette.action.focusOpacity),\r\n }),\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Notifications\r\n \r\n {totalUnRead > 0 ? `Vous avez ${totalUnRead} dossiers non lus` : 'Vous êtes à jour'}\r\n \r\n \r\n \r\n\r\n \r\n\r\n {totalUnRead > 0 && (\r\n \r\n \r\n {notifications.map((notification) => (\r\n \r\n ))}\r\n
\r\n \r\n )}\r\n \r\n \r\n \r\n Rafraîchir\r\n \r\n \r\n \r\n >\r\n );\r\n};\r\n\r\nexport default NotificationsPopover;\r\n","import menu2Fill from '@iconify/icons-eva/menu-2-fill';\r\nimport { Icon } from '@iconify/react';\r\nimport { AppBar, Box, IconButton, Stack, Toolbar } from '@material-ui/core';\r\n// material\r\nimport { alpha, experimentalStyled as styled } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\n// components\r\nimport React from 'react';\r\n\r\nimport { MHidden } from '../../components/@material-extend';\r\nimport AccountPopover from './AccountPopover';\r\nimport ContactsPopover from './ContactsPopover';\r\nimport NotificationsPopover from './NotificationsPopover';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst DRAWER_WIDTH = 280;\r\nconst APP_BAR_MOBILE = 64;\r\nconst APP_BAR_DESKTOP = 92;\r\n\r\nconst RootStyle = styled(AppBar)(({ theme }) => ({\r\n WebkitBackdropFilter: 'blur(6px)',\r\n backdropFilter: 'blur(6px)',\r\n // Fix on Mobile\r\n backgroundColor: alpha(theme.palette.background.default, 0.72),\r\n boxShadow: 'none',\r\n [theme.breakpoints.up('lg')]: {\r\n width: `calc(100% - ${DRAWER_WIDTH + 1}px)`,\r\n },\r\n}));\r\n\r\nconst ToolbarStyle = styled(Toolbar)(({ theme }) => ({\r\n minHeight: APP_BAR_MOBILE,\r\n [theme.breakpoints.up('lg')]: {\r\n minHeight: APP_BAR_DESKTOP,\r\n padding: theme.spacing(0, 5),\r\n },\r\n}));\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst DashboardNavbar = ({ onOpenSidebar }) => (\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\nDashboardNavbar.propTypes = {\r\n onOpenSidebar: PropTypes.func,\r\n};\r\n\r\nexport default DashboardNavbar;\r\n","import { Box } from '@material-ui/core';\r\n// material\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport React from 'react';\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function PWAIcon({ ...other }) {\r\n const theme = useTheme();\r\n const PRIMARY = theme.palette.primary.main;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","import {\r\n Box,\r\n Button,\r\n Stack,\r\n Typography,\r\n experimentalStyled as styled,\r\n useMediaQuery,\r\n useTheme,\r\n} from '@material-ui/core';\r\nimport PWAIcon from 'assets/pwa';\r\nimport { useSnackbar } from 'notistack';\r\nimport React, { useCallback, useEffect, useState } from 'react';\r\n\r\nconst InstallAppStyle = styled('div')(({ theme }) => ({\r\n backgroundColor: theme.palette.grey[500_11],\r\n borderRadius: theme.shape.borderRadiusSm,\r\n padding: theme.spacing(2, 2.5),\r\n}));\r\n\r\nconst InstallApp = () => {\r\n const [canAdd, setCanAdd] = useState(false);\r\n const [deferredPrompt, setDeferredPrompt] = useState(null);\r\n const theme = useTheme();\r\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\r\n const { enqueueSnackbar } = useSnackbar();\r\n\r\n const handleInstall = useCallback(\r\n (e) => {\r\n e.preventDefault();\r\n deferredPrompt.prompt();\r\n deferredPrompt.userChoice.then(() => {\r\n setCanAdd(false);\r\n setDeferredPrompt(false);\r\n });\r\n },\r\n [deferredPrompt]\r\n );\r\n\r\n useEffect(() => {\r\n window.addEventListener('beforeinstallprompt', (e) => {\r\n // Prevent Chrome 67 and earlier from automatically showing the prompt\r\n e.preventDefault();\r\n // Stash the event so it can be triggered later.\r\n setDeferredPrompt(e);\r\n setCanAdd(true);\r\n if (isMobile)\r\n enqueueSnackbar(`Vous pouvez installer l'application sur votre téléphone`, {\r\n action: () => (\r\n \r\n ),\r\n variant: 'success',\r\n });\r\n });\r\n }, [enqueueSnackbar, handleInstall, isMobile]);\r\n\r\n if (!canAdd) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n Installez l'application pour téléphone / desktop\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default InstallApp;\r\n","import { Box } from '@material-ui/core';\r\nimport config from 'config';\r\nimport PropTypes from 'prop-types';\r\nimport React from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\nconst { logoURL } = config.public;\r\n\r\nconst Logo = ({ sx }) => (\r\n \r\n
\r\n \r\n);\r\n\r\nLogo.propTypes = {\r\n // eslint-disable-next-line react/forbid-prop-types\r\n sx: PropTypes.object,\r\n};\r\n\r\nexport default Logo;\r\n","import arrowIosDownwardFill from '@iconify/icons-eva/arrow-ios-downward-fill'; // cspell-checker: disable-line\r\nimport arrowIosForwardFill from '@iconify/icons-eva/arrow-ios-forward-fill'; // cspell-checker: disable-line\r\nimport { Icon } from '@iconify/react'; // cspell-checker: disable-line\r\nimport { Box, Collapse, List, ListItem, ListItemIcon, ListItemText, ListSubheader } from '@material-ui/core';\r\n// material\r\nimport { alpha, experimentalStyled as styled, useTheme } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useState } from 'react';\r\nimport { NavLink as RouterLink, matchPath, useLocation } from 'react-router-dom';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst ListSubheaderStyle = styled((props) => )(\r\n ({ theme }) => ({\r\n ...theme.typography.overline,\r\n color: theme.palette.text.primary,\r\n marginBottom: theme.spacing(2),\r\n marginTop: theme.spacing(3),\r\n paddingLeft: theme.spacing(5),\r\n })\r\n);\r\n\r\nconst ListItemStyle = styled((props) => )(({ theme }) => ({\r\n ...theme.typography.body2,\r\n '&:before': {\r\n backgroundColor: theme.palette.primary.main,\r\n borderBottomLeftRadius: 4,\r\n borderTopLeftRadius: 4,\r\n bottom: 0,\r\n content: \"''\",\r\n display: 'none',\r\n position: 'absolute',\r\n right: 0,\r\n top: 0,\r\n width: 3,\r\n },\r\n color: theme.palette.text.secondary,\r\n height: 48,\r\n paddingLeft: theme.spacing(5),\r\n paddingRight: theme.spacing(2.5),\r\n position: 'relative',\r\n textTransform: 'capitalize',\r\n}));\r\n\r\nconst ListItemIconStyle = styled(ListItemIcon)({\r\n alignItems: 'center',\r\n display: 'flex',\r\n height: 22,\r\n justifyContent: 'center',\r\n width: 22,\r\n});\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst NavItem = ({ active, item }) => {\r\n const theme = useTheme();\r\n const isActiveRoot = active(item.path);\r\n const { children, icon, info, path, title } = item;\r\n const [open, setOpen] = useState(isActiveRoot);\r\n\r\n const handleOpen = () => {\r\n setOpen((prev) => !prev);\r\n };\r\n\r\n const activeRootStyle = {\r\n '&:before': { display: 'block' },\r\n bgcolor: alpha(theme.palette.primary.main, theme.palette.action.selectedOpacity),\r\n color: 'primary.main',\r\n fontWeight: 'fontWeightMedium',\r\n };\r\n\r\n const activeSubStyle = {\r\n color: 'text.primary',\r\n fontWeight: 'fontWeightMedium',\r\n };\r\n\r\n if (children) {\r\n return (\r\n <>\r\n \r\n \r\n {icon || (\r\n th.transitions.create('transform'),\r\n width: 4,\r\n ...(isActiveRoot && {\r\n bgcolor: 'primary.main', // cspell-checker: disable-line\r\n transform: 'scale(2)',\r\n }),\r\n }}\r\n />\r\n )}\r\n \r\n \r\n {info && info}\r\n \r\n \r\n\r\n \r\n \r\n {children.map((navItem) => {\r\n const { path: itemPath, title: itemTitle } = navItem;\r\n const isActiveSub = active(itemPath);\r\n\r\n return (\r\n \r\n \r\n th.transitions.create('transform'),\r\n width: 4,\r\n ...(isActiveSub && {\r\n bgcolor: 'primary.main', // cspell-checker: disable-line\r\n transform: 'scale(2)',\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 return (\r\n \r\n \r\n {icon || (\r\n th.transitions.create('transform'),\r\n width: 4,\r\n ...(isActiveRoot && {\r\n bgcolor: 'primary.main', // cspell-checker: disable-line\r\n transform: 'scale(2)',\r\n }),\r\n }}\r\n />\r\n )}\r\n \r\n \r\n {info && info}\r\n \r\n );\r\n};\r\n\r\nNavItem.propTypes = {\r\n active: PropTypes.func,\r\n // eslint-disable-next-line react/forbid-prop-types\r\n item: PropTypes.object,\r\n};\r\n\r\nconst NavSection = ({ navConfig, ...other }) => {\r\n const { pathname } = useLocation();\r\n const match = (path) => (path ? !!matchPath({ end: false, path }, pathname) : false);\r\n\r\n return (\r\n \r\n {navConfig.map((list) => {\r\n const { items, subheader } = list;\r\n return (\r\n \r\n {subheader}\r\n {items.map((item) => (\r\n \r\n ))}\r\n
\r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nNavSection.propTypes = {\r\n // eslint-disable-next-line react/forbid-prop-types\r\n navConfig: PropTypes.array,\r\n};\r\n\r\nexport default NavSection;\r\n","import { Dashboard as DashboardIcon, Description as DescriptionIcon } from '@material-ui/icons';\r\nimport React from 'react';\r\n// routes\r\nimport { PATH_DASHBOARD } from 'routes/paths';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst ICONS = {\r\n dashboard: ,\r\n documents: ,\r\n};\r\n\r\nconst sidebarConfig = [\r\n {\r\n items: [\r\n {\r\n icon: ICONS.dashboard,\r\n path: PATH_DASHBOARD.overview,\r\n title: 'Accueil',\r\n },\r\n {\r\n icon: ICONS.documents,\r\n path: PATH_DASHBOARD.documents,\r\n title: 'Documents',\r\n },\r\n ],\r\n },\r\n {\r\n items: [\r\n {\r\n path: PATH_DASHBOARD.pieces,\r\n title: 'Pièces',\r\n },\r\n {\r\n path: PATH_DASHBOARD.piecesReturn,\r\n title: 'Retour de pièces',\r\n },\r\n {\r\n path: PATH_DASHBOARD.technical,\r\n title: 'Techniques',\r\n },\r\n ],\r\n subheader: 'Mes dossiers',\r\n },\r\n];\r\n\r\nexport default sidebarConfig;\r\n","import { Box, Button, Drawer, Link, Typography, useMediaQuery, useTheme } from '@material-ui/core';\r\nimport { alpha, experimentalStyled as styled } from '@material-ui/core/styles';\r\nimport InstallApp from 'components/InstallApp';\r\nimport useTutorial from 'hooks/useTutorial';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useEffect } from 'react';\r\nimport { Link as RouterLink, useLocation } from 'react-router-dom';\r\n\r\nimport { DocIcon } from '../../assets';\r\nimport { MHidden } from '../../components/@material-extend';\r\nimport Logo from '../../components/Logo';\r\nimport MyAvatar from '../../components/MyAvatar';\r\nimport NavSection from '../../components/NavSection';\r\nimport Scrollbar from '../../components/Scrollbar';\r\nimport useAuth from '../../hooks/useAuth';\r\nimport sidebarConfig from './SidebarConfig';\r\n\r\nconst DRAWER_WIDTH = 280;\r\n\r\nconst RootStyle = styled('div')(({ theme }) => ({\r\n [theme.breakpoints.up('lg')]: {\r\n flexShrink: 0,\r\n width: DRAWER_WIDTH,\r\n },\r\n}));\r\n\r\nconst AccountStyle = styled('div')(({ theme }) => ({\r\n alignItems: 'center',\r\n backgroundColor: theme.palette.grey[500_12],\r\n borderRadius: theme.shape.borderRadiusSm,\r\n display: 'flex',\r\n padding: theme.spacing(2, 2.5),\r\n}));\r\n\r\nconst DocStyle = styled('div')(({ theme }) => ({\r\n backgroundColor:\r\n theme.palette.mode === 'light' ? alpha(theme.palette.primary.main, 0.08) : theme.palette.primary.lighter,\r\n borderRadius: theme.shape.borderRadiusMd,\r\n padding: theme.spacing(2.5),\r\n}));\r\n\r\nconst DashboardSidebar = ({ isOpenSidebar, onCloseSidebar }) => {\r\n const { pathname } = useLocation();\r\n const { user } = useAuth();\r\n const theme = useTheme();\r\n const { handleOpen, size } = useTutorial();\r\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\r\n\r\n useEffect(() => {\r\n if (isOpenSidebar) {\r\n onCloseSidebar();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [pathname]);\r\n\r\n const renderContent = (\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.displayName}\r\n \r\n \r\n {user.email}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n {Boolean(size) && !isMobile && (\r\n \r\n \r\n \r\n \r\n Besoin d'aide ?\r\n \r\n \r\n Il y a {size} conseils à voir sur cette page !\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n {renderContent}\r\n \r\n \r\n\r\n \r\n \r\n {renderContent}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nDashboardSidebar.propTypes = {\r\n isOpenSidebar: PropTypes.bool,\r\n onCloseSidebar: PropTypes.func,\r\n};\r\n\r\nexport default DashboardSidebar;\r\n","// material\r\nimport { experimentalStyled as styled } from '@material-ui/core/styles';\r\nimport { ContactsProvider } from 'contexts/ContactsContext';\r\nimport { NotificationsProvider } from 'contexts/NotificationsContext';\r\nimport React, { useState } from 'react';\r\nimport { Outlet } from 'react-router-dom';\r\n\r\n//\r\nimport DashboardNavbar from './DashboardNavbar';\r\nimport DashboardSidebar from './DashboardSidebar';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst APP_BAR_MOBILE = 64;\r\nconst APP_BAR_DESKTOP = 92;\r\n\r\nconst RootStyle = styled('div')({\r\n display: 'flex',\r\n minHeight: '100%',\r\n overflow: 'hidden',\r\n});\r\n\r\nconst MainStyle = styled('div')(({ theme }) => ({\r\n flexGrow: 1,\r\n minHeight: '100%',\r\n overflow: 'auto',\r\n paddingBottom: theme.spacing(10),\r\n paddingTop: APP_BAR_MOBILE + 24,\r\n [theme.breakpoints.up('lg')]: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n paddingTop: APP_BAR_DESKTOP + 24,\r\n },\r\n}));\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function DashboardLayout() {\r\n const [open, setOpen] = useState(false);\r\n\r\n return (\r\n \r\n \r\n \r\n setOpen(true)} />\r\n setOpen(false)} />\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","// material\r\nimport { experimentalStyled as styled } from '@material-ui/core/styles';\r\n// components\r\nimport React from 'react';\r\nimport { Outlet, Link as RouterLink } from 'react-router-dom';\r\n\r\nimport Logo from '../components/Logo';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst HeaderStyle = styled('header')(({ theme }) => ({\r\n left: 0,\r\n lineHeight: 0,\r\n padding: theme.spacing(3, 3, 0),\r\n position: 'absolute',\r\n top: 0,\r\n width: '100%',\r\n [theme.breakpoints.up('sm')]: {\r\n padding: theme.spacing(5, 5, 0),\r\n },\r\n}));\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst LogoOnlyLayout = () => (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n >\r\n);\r\n\r\nexport default LogoOnlyLayout;\r\n","import React, { Suspense, lazy } from 'react';\r\nimport { Navigate, useLocation, useRoutes } from 'react-router-dom';\r\n\r\n// components\r\nimport LoadingScreen from '../components/LoadingScreen';\r\nimport AuthGuard from '../guards/AuthGuard';\r\n// guards\r\nimport GuestGuard from '../guards/GuestGuard';\r\nimport DashboardLayout from '../layouts/dashboard';\r\nimport LogoOnlyLayout from '../layouts/LogoOnlyLayout';\r\nimport { PATH_DASHBOARD } from './paths';\r\n\r\nconst Loadable = (Component) => (props) => {\r\n // eslint-disable-next-line react-hooks/rules-of-hooks\r\n const { pathname } = useLocation();\r\n const isDashboard = pathname.includes(PATH_DASHBOARD.root);\r\n\r\n return (\r\n \r\n }\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nexport default function Router() {\r\n return useRoutes([\r\n // Dashboard Routes\r\n {\r\n children: [\r\n { element: , path: '/' },\r\n { element: , path: '/documents' },\r\n { element: , path: '/overview' },\r\n { element: , path: '/pieces' },\r\n {\r\n element: ,\r\n path: '/retour-de-pieces',\r\n },\r\n { element: , path: '/techniques' },\r\n { element: , path: '/dossiers/:id' },\r\n ],\r\n element: (\r\n \r\n \r\n \r\n ),\r\n path: 'dashboard',\r\n },\r\n // Main Routes\r\n {\r\n children: [\r\n { element: , path: '/' },\r\n {\r\n element: (\r\n \r\n \r\n \r\n ),\r\n path: 'login',\r\n },\r\n ],\r\n path: '*',\r\n },\r\n // Errors route\r\n {\r\n children: [\r\n { element: , path: '404' },\r\n { element: , path: '*' },\r\n ],\r\n element: ,\r\n path: '*',\r\n },\r\n ]);\r\n}\r\n\r\n// IMPORT COMPONENTS\r\n\r\n// Authentication\r\nconst Login = Loadable(lazy(() => import('../pages/authentication/Login')));\r\n// Dashboard\r\nconst OverviewPage = Loadable(lazy(() => import('../pages/dashboard/Overview')));\r\nconst DocumentsPage = Loadable(lazy(() => import('../pages/dashboard/Documents')));\r\nconst RecordsPage = Loadable(lazy(() => import('../pages/dashboard/Records')));\r\nconst RecordDetailsPage = Loadable(lazy(() => import('../pages/dashboard/RecordDetails')));\r\n// Main\r\nconst NotFound = Loadable(lazy(() => import('../pages/Page404')));\r\n","// routes\r\nimport { useMediaQuery, useTheme } from '@material-ui/core';\r\nimport Tutorial from 'components/tutorial/Tutorial';\r\nimport ConfigProvider from 'config/ConfigProvider';\r\nimport { TutorialProvider } from 'contexts/TutorialContext';\r\nimport React from 'react';\r\n\r\nimport LoadingScreen from './components/LoadingScreen';\r\nimport NotistackProvider from './components/NotistackProvider'; // cspell-checker: disable-line\r\nimport RtlLayout from './components/RtlLayout';\r\nimport ScrollToTop from './components/ScrollToTop';\r\n// components\r\nimport ThemePrimaryColor from './components/ThemePrimaryColor';\r\n// hooks\r\nimport useAuth from './hooks/useAuth';\r\nimport Router from './routes';\r\n// theme\r\nimport ThemeConfig from './theme';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function App() {\r\n const { isInitialized } = useAuth();\r\n const theme = useTheme();\r\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {isInitialized ? : }\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","const reportWebVitals = (onPerfEntry) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFCP, getFID, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://cra.link/PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\r\n);\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then((registration) => {\r\n // eslint-disable-next-line no-param-reassign\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n //\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n // eslint-disable-next-line no-console\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch((error) => {\r\n // eslint-disable-next-line no-console\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' },\r\n })\r\n .then((response) => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then((registration) => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n // eslint-disable-next-line no-console\r\n console.log('No internet connection found. App is running in offline mode.');\r\n });\r\n}\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n // eslint-disable-next-line no-console\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://cra.link/PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready\r\n .then((registration) => {\r\n registration.unregister();\r\n })\r\n .catch((error) => {\r\n // eslint-disable-next-line no-console\r\n console.error(error.message);\r\n });\r\n }\r\n}\r\n","// cspell-checker: disable\r\n// scroll bar\r\nimport 'simplebar/src/simplebar.css';\r\n// map\r\nimport 'mapbox-gl/dist/mapbox-gl.css';\r\n// lightbox\r\nimport 'react-image-lightbox/style.css';\r\n// editor\r\nimport 'react-quill/dist/quill.snow.css';\r\nimport 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css';\r\n// slick-carousel\r\nimport 'slick-carousel/slick/slick.css';\r\nimport 'slick-carousel/slick/slick-theme.css';\r\n// lazy image\r\n// cspell-checker: disable\r\nimport 'lazysizes';\r\nimport 'lazysizes/plugins/attrchange/ls.attrchange';\r\nimport 'lazysizes/plugins/object-fit/ls.object-fit';\r\nimport 'lazysizes/plugins/parent-fit/ls.parent-fit';\r\n\r\n// cspell-checker: enable\r\n// i18n\r\nimport './locales/i18n';\r\n// highlight\r\nimport './utils/highlight';\r\n\r\nimport { LoadingButton } from '@material-ui/lab';\r\n// material\r\nimport AdapterDateFns from '@material-ui/lab/AdapterDateFns';\r\nimport LocalizationProvider from '@material-ui/lab/LocalizationProvider';\r\n// redux\r\nimport React, { useState } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { HelmetProvider } from 'react-helmet-async';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport snackbar from 'utils/snackbar';\r\n\r\n//\r\nimport App from './App';\r\nimport { AuthProvider } from './contexts/JWTContext';\r\n// contexts\r\nimport { SettingsProvider } from './contexts/SettingsContext';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport * as serviceWorker from './serviceWorkerRegistration';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want to enable client cache, register instead.\r\nserviceWorker.register({\r\n onUpdate: (registration) => {\r\n const registrationWaiting = registration.waiting;\r\n if (registrationWaiting) {\r\n snackbar.enqueue('Votre application a été mise à jour', {\r\n action: () => {\r\n // eslint-disable-next-line react-hooks/rules-of-hooks\r\n const [loading, setLoading] = useState(false);\r\n\r\n return (\r\n {\r\n setLoading(true);\r\n registrationWaiting.postMessage({ type: 'SKIP_WAITING' });\r\n registrationWaiting.addEventListener('statechange', (e) => {\r\n if (e.target.state === 'activated') {\r\n window.location.href = `${window.location.pathname}${window.location.search}`;\r\n }\r\n });\r\n }}\r\n variant=\"outlined\"\r\n >\r\n Rafraîchir\r\n \r\n );\r\n },\r\n persist: true,\r\n variant: 'warning',\r\n });\r\n }\r\n },\r\n});\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n","import { sign, verify } from 'jsonwebtoken';\r\nimport jwtDecode from 'jwt-decode';\r\n\r\n//\r\n// eslint-disable-next-line import/no-cycle\r\nimport axios from './axios';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst isValidToken = (token) => {\r\n if (!token) {\r\n return false;\r\n }\r\n\r\n const decoded = jwtDecode(token);\r\n const currentTime = Date.now() / 1000;\r\n\r\n return decoded.exp > currentTime;\r\n};\r\n\r\nconst handleTokenExpired = (exp) => {\r\n let expiredTimer;\r\n\r\n window.clearTimeout(expiredTimer);\r\n const currentTime = Date.now();\r\n const timeLeft = exp * 1000 - currentTime;\r\n expiredTimer = window.setTimeout(() => {\r\n localStorage.removeItem('token');\r\n window.location.href = '/login';\r\n }, timeLeft);\r\n};\r\n\r\nconst setSession = (token) => {\r\n if (token) {\r\n localStorage.setItem('token', token);\r\n // Unless until we add interceptor in apis.js\r\n axios.defaults.headers.common.Authorization = `Bearer ${token}`;\r\n // This function below will handle when token is expired\r\n const { exp } = jwtDecode(token);\r\n handleTokenExpired(exp);\r\n } else {\r\n localStorage.removeItem('token');\r\n delete axios.defaults.headers.common.Authorization;\r\n }\r\n};\r\n\r\nexport { isValidToken, setSession, verify, sign };\r\n","// ----------------------------------------------------------------------\r\n\r\nexport const varWrapEnter = {\r\n animate: {\r\n transition: { staggerChildren: 0.1 },\r\n },\r\n};\r\n\r\nexport const varWrapExit = {\r\n exit: {\r\n transition: { staggerChildren: 0.1 },\r\n },\r\n};\r\n\r\nexport const varWrapBoth = {\r\n animate: {\r\n transition: { delayChildren: 0.1, staggerChildren: 0.07 },\r\n },\r\n exit: {\r\n transition: { staggerChildren: 0.05, staggerDirection: -1 },\r\n },\r\n};\r\n","// ----------------------------------------------------------------------\r\n\r\nexport const varHover = {\r\n hover: { scale: 1.1 },\r\n};\r\n\r\nexport const varSmallClick = {\r\n hover: { scale: 1.04 },\r\n tap: { scale: 0.96 },\r\n};\r\n\r\nexport const varMediumClick = {\r\n hover: { scale: 1.1 },\r\n tap: { scale: 0.9 },\r\n};\r\n","// ----------------------------------------------------------------------\r\n\r\nconst TRANSITION = {\r\n duration: 4,\r\n ease: 'linear',\r\n};\r\n\r\nconst gradient = (deg) => `linear-gradient(${deg}deg, #ee7752, #e73c7e, #23a6d5, #23d5ab)`;\r\n\r\nexport const varPanTop = {\r\n animate: {\r\n backgroundImage: [gradient(0), gradient(0)],\r\n backgroundPosition: ['center 99%', 'center 1%'],\r\n backgroundSize: ['100% 600%', '100% 600%'],\r\n transition: TRANSITION,\r\n },\r\n};\r\n\r\nexport const varPanBottom = {\r\n animate: {\r\n backgroundImage: [gradient(0), gradient(0)],\r\n backgroundPosition: ['center 1%', 'center 99%'],\r\n backgroundSize: ['100% 600%', '100% 600%'],\r\n transition: TRANSITION,\r\n },\r\n};\r\n\r\nexport const varPanLeft = {\r\n animate: {\r\n backgroundImage: [gradient(270), gradient(270)],\r\n backgroundPosition: ['99% center', '1% center'],\r\n backgroundSize: ['600% 100%', '600% 100%'],\r\n transition: TRANSITION,\r\n },\r\n};\r\n\r\nexport const varPanRight = {\r\n animate: {\r\n backgroundImage: [gradient(270), gradient(270)],\r\n backgroundPosition: ['1% center', '99% center'],\r\n backgroundSize: ['600% 100%', '600% 100%'],\r\n transition: TRANSITION,\r\n },\r\n};\r\n","// ----------------------------------------------------------------------\r\n\r\nconst DISTANCE = 120;\r\n\r\nconst TRANSITION_ENTER = {\r\n duration: 0.64,\r\n ease: [0.43, 0.13, 0.23, 0.96],\r\n};\r\nconst TRANSITION_EXIT = {\r\n duration: 0.48,\r\n ease: [0.43, 0.13, 0.23, 0.96],\r\n};\r\n\r\nexport const varFadeIn = {\r\n animate: { opacity: 1, transition: TRANSITION_ENTER },\r\n exit: { opacity: 0, transition: TRANSITION_EXIT },\r\n initial: { opacity: 0 },\r\n};\r\n\r\nexport const varFadeInUp = {\r\n animate: { opacity: 1, transition: TRANSITION_ENTER, y: 0 },\r\n exit: { opacity: 0, transition: TRANSITION_EXIT, y: DISTANCE },\r\n initial: { opacity: 0, y: DISTANCE },\r\n};\r\n\r\nexport const varFadeInLeft = {\r\n animate: { opacity: 1, transition: TRANSITION_ENTER, x: 0 },\r\n exit: { opacity: 0, transition: TRANSITION_EXIT, x: -DISTANCE },\r\n initial: { opacity: 0, x: -DISTANCE },\r\n};\r\n\r\nexport const varFadeInDown = {\r\n animate: { opacity: 1, transition: TRANSITION_ENTER, y: 0 },\r\n exit: { opacity: 0, transition: TRANSITION_EXIT, y: -DISTANCE },\r\n initial: { opacity: 0, y: -DISTANCE },\r\n};\r\n\r\nexport const varFadeInRight = {\r\n animate: { opacity: 1, transition: TRANSITION_ENTER, x: 0 },\r\n exit: { opacity: 0, transition: TRANSITION_EXIT, x: DISTANCE },\r\n initial: { opacity: 0, x: DISTANCE },\r\n};\r\n","// ----------------------------------------------------------------------\r\n\r\nconst DISTANCE = 720;\r\nconst IN = { opacity: 1, scale: 1 };\r\nconst OUT = { opacity: 0, scale: 0 };\r\n\r\nconst TRANSITION_ENTER = {\r\n duration: 0.64,\r\n ease: [0.43, 0.13, 0.23, 0.96],\r\n};\r\n\r\nconst TRANSITION_EXIT = {\r\n duration: 0.48,\r\n ease: [0.43, 0.13, 0.23, 0.96],\r\n};\r\n\r\nexport const varZoomIn = {\r\n animate: { ...IN, transition: TRANSITION_ENTER },\r\n exit: { ...OUT, transition: TRANSITION_EXIT },\r\n initial: OUT,\r\n};\r\n\r\nexport const varZoomInUp = {\r\n animate: { ...IN, transition: TRANSITION_ENTER, translateY: 0 },\r\n exit: { ...OUT, transition: TRANSITION_EXIT, translateY: DISTANCE },\r\n initial: { ...OUT, translateY: DISTANCE },\r\n};\r\n\r\nexport const varZoomInDown = {\r\n animate: { ...IN, transition: TRANSITION_ENTER, translateY: 0 },\r\n exit: { ...OUT, transition: TRANSITION_EXIT, translateY: -DISTANCE },\r\n initial: { ...OUT, translateY: -DISTANCE },\r\n};\r\n\r\nexport const varZoomInLeft = {\r\n animate: { ...IN, transition: TRANSITION_ENTER, translateX: 0 },\r\n exit: { ...OUT, transition: TRANSITION_EXIT, translateX: -DISTANCE },\r\n initial: { ...OUT, translateX: -DISTANCE },\r\n};\r\n\r\nexport const varZoomInRight = {\r\n animate: { ...IN, transition: TRANSITION_ENTER, translateX: 0 },\r\n exit: { ...OUT, transition: TRANSITION_EXIT, translateX: DISTANCE },\r\n initial: { ...OUT, translateX: DISTANCE },\r\n};\r\n","// ----------------------------------------------------------------------\r\n\r\nconst DISTANCE = 720;\r\nconst IN = { opacity: 1, scale: 1 };\r\nconst OUT = { opacity: 0, scale: 0 };\r\n\r\nconst TRANSITION_ENTER = {\r\n duration: 0.64,\r\n ease: [0.43, 0.13, 0.23, 0.96],\r\n};\r\n\r\nexport const varZoomOut = {\r\n animate: { scale: 0, transition: TRANSITION_ENTER },\r\n initial: { scale: 1 },\r\n};\r\n\r\nexport const varZoomOutUp = {\r\n animate: { ...OUT, transition: TRANSITION_ENTER, translateY: -DISTANCE },\r\n initial: IN,\r\n};\r\n\r\nexport const varZoomOutDown = {\r\n animate: { ...OUT, transition: TRANSITION_ENTER, translateY: DISTANCE },\r\n initial: IN,\r\n};\r\n\r\nexport const varZoomOutLeft = {\r\n animate: { ...OUT, transition: TRANSITION_ENTER, translateX: -DISTANCE },\r\n initial: IN,\r\n};\r\n\r\nexport const varZoomOutRight = {\r\n animate: { ...OUT, transition: TRANSITION_ENTER, translateX: DISTANCE },\r\n initial: IN,\r\n};\r\n","import { varBounceOut, varBounceOutDown, varBounceOutLeft, varBounceOutRight, varBounceOutUp } from './BounceOut';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst TRANSITION_ENTER = {\r\n duration: 0.72,\r\n ease: [0.43, 0.13, 0.23, 0.96],\r\n};\r\n\r\nconst TRANSITION_EXIT = {\r\n duration: 0.48,\r\n ease: [0.43, 0.13, 0.23, 0.96],\r\n};\r\n\r\nexport const varBounceIn = {\r\n animate: {\r\n opacity: [0, 1, 1, 1, 1, 1],\r\n scale: [0.3, 1.1, 0.9, 1.03, 0.97, 1],\r\n transition: TRANSITION_ENTER,\r\n },\r\n exit: varBounceOut.animate,\r\n};\r\n\r\nexport const varBounceInUp = {\r\n animate: {\r\n opacity: [0, 1, 1, 1, 1],\r\n scaleY: [4, 0.9, 0.95, 0.985, 1],\r\n transition: { ...TRANSITION_ENTER },\r\n y: [720, -24, 12, -4, 0],\r\n },\r\n exit: { ...varBounceOutDown.animate, transition: TRANSITION_EXIT },\r\n};\r\n\r\nexport const varBounceInDown = {\r\n animate: {\r\n opacity: [0, 1, 1, 1, 1],\r\n scaleY: [4, 0.9, 0.95, 0.985, 1],\r\n transition: TRANSITION_ENTER,\r\n y: [-720, 24, -12, 4, 0],\r\n },\r\n exit: { ...varBounceOutUp.animate, transition: TRANSITION_EXIT },\r\n};\r\n\r\nexport const varBounceInLeft = {\r\n animate: {\r\n opacity: [0, 1, 1, 1, 1],\r\n scaleX: [3, 1, 0.98, 0.995, 1],\r\n transition: TRANSITION_ENTER,\r\n x: [-720, 24, -12, 4, 0],\r\n },\r\n exit: { ...varBounceOutLeft.animate, transition: TRANSITION_EXIT },\r\n};\r\n\r\nexport const varBounceInRight = {\r\n animate: {\r\n opacity: [0, 1, 1, 1, 1],\r\n scaleX: [3, 1, 0.98, 0.995, 1],\r\n transition: TRANSITION_ENTER,\r\n x: [720, -24, 12, -4, 0],\r\n },\r\n exit: { ...varBounceOutRight.animate, transition: TRANSITION_EXIT },\r\n};\r\n","// ----------------------------------------------------------------------\r\n\r\nexport const varBounceOut = {\r\n animate: {\r\n opacity: [1, 1, 0],\r\n scale: [0.9, 1.1, 0.3],\r\n },\r\n};\r\n\r\nexport const varBounceOutUp = {\r\n animate: {\r\n opacity: [1, 1, 0],\r\n scaleY: [0.985, 0.9, 3],\r\n y: [-12, 24, -720],\r\n },\r\n};\r\n\r\nexport const varBounceOutDown = {\r\n animate: {\r\n opacity: [1, 1, 0],\r\n scaleY: [0.985, 0.9, 3],\r\n y: [12, -24, 720],\r\n },\r\n};\r\n\r\nexport const varBounceOutLeft = {\r\n animate: {\r\n opacity: [1, 1, 0],\r\n scaleX: [1, 0.9, 2],\r\n x: [0, 24, -720],\r\n },\r\n};\r\n\r\nexport const varBounceOutRight = {\r\n animate: {\r\n opacity: [1, 1, 0],\r\n scaleX: [1, 0.9, 2],\r\n x: [0, -24, 720],\r\n },\r\n};\r\n","// material\r\nimport { Box } from '@material-ui/core';\r\nimport { motion } from 'framer-motion';\r\nimport PropTypes from 'prop-types';\r\n//\r\nimport React from 'react';\r\n\r\nimport { varWrapEnter } from './variants';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst MotionContainer = ({ children, open, ...other }) => (\r\n \r\n {children}\r\n \r\n);\r\n\r\nMotionContainer.propTypes = {\r\n children: PropTypes.node,\r\n open: PropTypes.bool.isRequired,\r\n};\r\n\r\nexport default MotionContainer;\r\n","// material\r\nimport { Box } from '@material-ui/core';\r\nimport { motion } from 'framer-motion';\r\nimport PropTypes from 'prop-types';\r\n//\r\nimport React from 'react';\r\n\r\nimport { varMediumClick, varSmallClick } from './variants';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst ButtonAnimate = ({ children, mediumClick = false, sx, ...other }) => (\r\n \r\n {children}\r\n \r\n);\r\n\r\nButtonAnimate.propTypes = {\r\n children: PropTypes.node,\r\n mediumClick: PropTypes.bool,\r\n // eslint-disable-next-line react/forbid-prop-types\r\n sx: PropTypes.object,\r\n};\r\n\r\nexport default ButtonAnimate;\r\n","import { useContext } from 'react';\r\n\r\nimport { TutorialContext } from '../contexts/TutorialContext';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst useTutorial = () => useContext(TutorialContext);\r\n\r\nexport default useTutorial;\r\n","import { useEffect, useRef } from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function useIsMountedRef() {\r\n const isMounted = useRef(true);\r\n\r\n useEffect(\r\n () => () => {\r\n isMounted.current = false;\r\n },\r\n []\r\n );\r\n\r\n return isMounted;\r\n}\r\n","import config from 'config';\r\nimport PropTypes from 'prop-types';\r\nimport React, { createContext } from 'react';\r\n\r\n// hooks\r\nimport useLocalStorage from '../hooks/useLocalStorage';\r\n// theme\r\nimport palette from '../theme/palette';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst PRIMARY_COLOR = [\r\n // DEFAULT\r\n {\r\n name: 'default',\r\n ...palette.light.primary,\r\n },\r\n // PURPLE\r\n {\r\n contrastText: '#fff',\r\n dark: '#431A9E',\r\n darker: '#200A69',\r\n light: '#B985F4',\r\n lighter: '#EBD6FD',\r\n main: '#7635dc',\r\n name: 'purple',\r\n },\r\n // CYAN\r\n {\r\n contrastText: palette.light.grey[800],\r\n dark: '#0E77B7',\r\n darker: '#053D7A',\r\n light: '#76F2FF',\r\n lighter: '#D1FFFC',\r\n main: '#1CCAFF',\r\n name: 'cyan',\r\n },\r\n // BLUE\r\n {\r\n contrastText: '#fff',\r\n dark: '#0027B7',\r\n darker: '#00137A',\r\n light: '#6697FF',\r\n lighter: '#CCDFFF',\r\n main: '#0045FF',\r\n name: 'blue',\r\n },\r\n // ORANGE\r\n {\r\n contrastText: palette.light.grey[800],\r\n dark: '#B66816',\r\n darker: '#793908',\r\n light: '#FED680',\r\n lighter: '#FEF4D4',\r\n main: '#fda92d',\r\n name: 'orange',\r\n },\r\n // RED\r\n {\r\n contrastText: '#fff',\r\n dark: '#B71833',\r\n darker: '#7A0930',\r\n light: '#FFC1AC',\r\n lighter: '#FFE3D5',\r\n main: '#FF3030',\r\n name: 'red',\r\n },\r\n];\r\n\r\nfunction SetColor(themeColor) {\r\n let color;\r\n const DEFAULT = PRIMARY_COLOR[0];\r\n const PURPLE = PRIMARY_COLOR[1];\r\n const CYAN = PRIMARY_COLOR[2];\r\n const BLUE = PRIMARY_COLOR[3];\r\n const ORANGE = PRIMARY_COLOR[4];\r\n const RED = PRIMARY_COLOR[5];\r\n\r\n switch (themeColor) {\r\n case 'purple':\r\n color = PURPLE;\r\n break;\r\n case 'cyan':\r\n color = CYAN;\r\n break;\r\n case 'blue':\r\n color = BLUE;\r\n break;\r\n case 'orange':\r\n color = ORANGE;\r\n break;\r\n case 'red':\r\n color = RED;\r\n break;\r\n default:\r\n color = DEFAULT;\r\n }\r\n return color;\r\n}\r\n\r\nconst { themeColor, themeMode } = config;\r\n\r\nconst initialState = {\r\n colorOption: [],\r\n onChangeColor: () => {},\r\n onChangeDirection: () => {},\r\n onChangeMode: () => {},\r\n setColor: SetColor(themeColor),\r\n themeColor,\r\n themeDirection: 'ltr',\r\n themeMode,\r\n};\r\n\r\nconst SettingsContext = createContext(initialState);\r\n\r\nfunction SettingsProvider({ children }) {\r\n const [settings, setSettings] = useLocalStorage('settings', {\r\n themeColor,\r\n themeDirection: 'ltr',\r\n themeMode,\r\n });\r\n\r\n const onChangeMode = (event) => {\r\n setSettings({\r\n ...settings,\r\n themeMode: event.target.value,\r\n });\r\n };\r\n\r\n const onChangeDirection = (event) => {\r\n setSettings({\r\n ...settings,\r\n themeDirection: event.target.value,\r\n });\r\n };\r\n\r\n const onChangeColor = (event) => {\r\n setSettings({\r\n ...settings,\r\n themeColor: event.target.value,\r\n });\r\n };\r\n\r\n return (\r\n ({\r\n name: color.name,\r\n value: color.main,\r\n })),\r\n\r\n // Color\r\n onChangeColor,\r\n\r\n // Direction\r\n onChangeDirection,\r\n // Mode\r\n onChangeMode,\r\n setColor: SetColor(settings.themeColor),\r\n }}\r\n >\r\n {children}\r\n \r\n );\r\n}\r\n\r\nSettingsProvider.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport { SettingsProvider, SettingsContext };\r\n","import { useEffect, useState } from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function useLocalStorage(key, defaultValue) {\r\n const [value, setValue] = useState(() => {\r\n const storedValue = localStorage.getItem(key);\r\n return storedValue === null ? defaultValue : JSON.parse(storedValue);\r\n });\r\n\r\n useEffect(() => {\r\n const listener = (e) => {\r\n if (e.storageArea === localStorage && e.key === key) {\r\n setValue(JSON.parse(e.newValue));\r\n }\r\n };\r\n window.addEventListener('storage', listener);\r\n\r\n return () => {\r\n window.removeEventListener('storage', listener);\r\n };\r\n }, [key, defaultValue]);\r\n\r\n const setValueInLocalStorage = (newValue) => {\r\n setValue((currentValue) => {\r\n const result = typeof newValue === 'function' ? newValue(currentValue) : newValue;\r\n localStorage.setItem(key, JSON.stringify(result));\r\n return result;\r\n });\r\n };\r\n\r\n return [value, setValueInLocalStorage];\r\n}\r\n","const stopPropagation = (callback) => (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n callback(e);\r\n};\r\n\r\nexport default stopPropagation;\r\n","import { formatDistanceToNow } from 'date-fns';\r\nimport { format } from 'date-fns-tz';\r\nimport { fr } from 'date-fns/locale';\r\n\r\nconst locale = fr;\r\nconst timeZone = 'Europe/Paris';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport function fDate(date) {\r\n return format(new Date(date), 'dd MMMM yyyy', { locale, timeZone });\r\n}\r\n\r\nexport function fDateTime(date) {\r\n return format(new Date(date), 'dd MMM yyyy HH:mm', { locale, timeZone });\r\n}\r\n\r\nexport function fDateTimeSuffix(date) {\r\n return format(new Date(date), 'dd/MM/yyyy hh:mm p', { locale, timeZone });\r\n}\r\n\r\nexport function fToNow(date) {\r\n return formatDistanceToNow(new Date(date), {\r\n addSuffix: true,\r\n locale,\r\n });\r\n}\r\n","import { Box, useTheme } from '@material-ui/core';\r\nimport useTutorial from 'hooks/useTutorial';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useEffect, useRef } from 'react';\r\nimport { useLocation } from 'react-router';\r\n\r\nconst TutorialElement = ({ children, disableActions, fixed, step: stepProp, stepOptions, withoutContainer }) => {\r\n const elementRef = useRef();\r\n const childRef = useRef();\r\n const theme = useTheme();\r\n const { addElement, currentStep, open, scrolling } = useTutorial();\r\n const { pathname } = useLocation();\r\n const { body, bodyComponent, renderContent, step: stepOption, title } = stepOptions;\r\n const step = stepProp || stepOption;\r\n\r\n useEffect(() => {\r\n addElement({\r\n disableActions,\r\n fixed,\r\n on: pathname,\r\n ref: childRef,\r\n step,\r\n stepOptions: { body, bodyComponent, renderContent, title },\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [pathname, childRef, elementRef]);\r\n\r\n return (\r\n \r\n {withoutContainer\r\n ? React.cloneElement(children, { ref: childRef })\r\n : React.createElement('div', { ref: childRef }, children)}\r\n \r\n );\r\n};\r\n\r\nTutorialElement.defaultProps = {\r\n disableActions: false,\r\n fixed: false,\r\n step: undefined,\r\n stepOptions: {},\r\n withoutContainer: false,\r\n};\r\n\r\nTutorialElement.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n disableActions: PropTypes.bool,\r\n fixed: PropTypes.bool,\r\n step: PropTypes.number,\r\n stepOptions: PropTypes.shape({\r\n body: PropTypes.string,\r\n bodyComponent: PropTypes.func,\r\n renderContent: PropTypes.func,\r\n title: PropTypes.string,\r\n }),\r\n withoutContainer: PropTypes.bool,\r\n};\r\n\r\nexport default TutorialElement;\r\n","import { ContactsContext } from 'contexts/ContactsContext';\r\nimport { useContext } from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst useContacts = () => useContext(ContactsContext);\r\n\r\nexport default useContacts;\r\n","import { useContext } from 'react';\r\n\r\nimport { SettingsContext } from '../contexts/SettingsContext';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst useSettings = () => useContext(SettingsContext);\r\n\r\nexport default useSettings;\r\n","import NotistackProvider from 'components/NotistackProvider';\r\nimport ThemePrimaryColor from 'components/ThemePrimaryColor';\r\nimport { SettingsProvider } from 'contexts/SettingsContext';\r\nimport { useSnackbar } from 'notistack';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport ThemeConfig from 'theme';\r\n\r\nexport default {\r\n enqueue(message, options) {\r\n const Display = () => {\r\n const { enqueueSnackbar } = useSnackbar();\r\n enqueueSnackbar(message, options);\r\n return null;\r\n };\r\n\r\n const mountPoint = document.getElementById('snackbar-helper');\r\n\r\n ReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n mountPoint\r\n );\r\n },\r\n};\r\n","import alertCircleFill from '@iconify/icons-eva/alert-circle-fill';\r\nimport alertTriangleFill from '@iconify/icons-eva/alert-triangle-fill';\r\nimport checkmarkCircle2Fill from '@iconify/icons-eva/checkmark-circle-2-fill';\r\nimport infoFill from '@iconify/icons-eva/info-fill';\r\nimport { Icon } from '@iconify/react';\r\nimport { Box } from '@material-ui/core';\r\n// material\r\nimport { alpha, makeStyles } from '@material-ui/core/styles';\r\nimport { SnackbarProvider } from 'notistack';\r\nimport PropTypes from 'prop-types';\r\nimport React from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst useStyles = makeStyles((theme) => {\r\n const isLight = theme.palette.mode === 'light';\r\n\r\n const createStyle = {\r\n backgroundColor: `${theme.palette.background.paper} !important`,\r\n color: `${theme.palette.text.primary} !important`,\r\n };\r\n\r\n return {\r\n action: {\r\n '& svg': {\r\n '&:hover': { opacity: 1 },\r\n height: 20,\r\n opacity: 0.48,\r\n width: 20,\r\n },\r\n marginRight: -4,\r\n },\r\n containerRoot: {\r\n '& .MuiCollapse-wrapperInner': {\r\n width: '100%',\r\n },\r\n pointerEvents: 'unset',\r\n },\r\n contentRoot: {\r\n backgroundColor: theme.palette.grey[isLight ? 900 : 0],\r\n borderRadius: theme.shape.borderRadius,\r\n boxShadow: theme.customShadows.z8,\r\n color: theme.palette.grey[isLight ? 0 : 800],\r\n margin: theme.spacing(0.25, 0),\r\n padding: theme.spacing(1.5),\r\n width: '100%',\r\n },\r\n error: { ...createStyle },\r\n info: { ...createStyle },\r\n message: {\r\n fontWeight: theme.typography.fontWeightMedium,\r\n padding: 0,\r\n },\r\n success: { ...createStyle },\r\n warning: { ...createStyle },\r\n };\r\n});\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst SnackbarIcon = ({ color, icon }) => (\r\n alpha(theme.palette[color].main, 0.16),\r\n borderRadius: 1.5,\r\n color: `${color}.main`,\r\n display: 'flex',\r\n height: 40,\r\n justifyContent: 'center',\r\n mr: 1.5,\r\n width: 40,\r\n }}\r\n >\r\n \r\n \r\n);\r\n\r\nSnackbarIcon.propTypes = {\r\n color: PropTypes.string,\r\n // eslint-disable-next-line react/forbid-prop-types\r\n icon: PropTypes.object,\r\n};\r\n\r\nconst NotistackProvider = ({ children }) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n ,\r\n info: ,\r\n success: ,\r\n warning: ,\r\n }}\r\n maxSnack={5}\r\n >\r\n {children}\r\n \r\n );\r\n};\r\n\r\nNotistackProvider.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport default NotistackProvider;\r\n","// material\r\nimport { ThemeProvider, alpha, createTheme, useTheme } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useMemo } from 'react';\r\n\r\n// hooks\r\nimport useSettings from '../hooks/useSettings';\r\n//\r\nimport componentsOverride from '../theme/overrides';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst ThemePrimaryColor = ({ children }) => {\r\n const outerTheme = useTheme();\r\n const { setColor } = useSettings();\r\n\r\n const themeOptions = useMemo(\r\n () => ({\r\n ...outerTheme,\r\n customShadows: {\r\n ...outerTheme.customShadows,\r\n primary: `0 8px 16px 0 ${alpha(setColor.main, 0.24)}`,\r\n },\r\n palette: {\r\n ...outerTheme.palette,\r\n primary: setColor,\r\n },\r\n }),\r\n [setColor, outerTheme]\r\n );\r\n\r\n const theme = createTheme(themeOptions);\r\n theme.components = componentsOverride(theme);\r\n\r\n return {children};\r\n};\r\n\r\nThemePrimaryColor.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport default ThemePrimaryColor;\r\n","import PropTypes from 'prop-types';\r\nimport React, { createContext, useEffect, useMemo, useReducer, useState } from 'react';\r\nimport { useLocation } from 'react-router';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst initialState = {\r\n steps: [],\r\n};\r\n\r\nconst handlers = {\r\n ADD_ELEMENT: (state, { disableActions, fixed, on, ref, step, stepOptions }) => ({\r\n ...state,\r\n steps: [...state.steps.filter((s) => s.step !== step), { disableActions, fixed, on, ref, step, stepOptions }],\r\n }),\r\n};\r\n\r\nconst reducer = (state, { payload, type }) => (handlers[type] ? handlers[type](state, payload) : state);\r\n\r\nconst TutorialContext = createContext({\r\n ...initialState,\r\n nextStep: () => Promise.resolve(),\r\n prevStep: () => Promise.resolve(),\r\n});\r\n\r\nfunction TutorialProvider({ children }) {\r\n const [state, dispatch] = useReducer(reducer, initialState);\r\n const [open, setOpen] = useState(false);\r\n const [stepIndex, setStepIndex] = useState(0);\r\n const [scrolling, setScrolling] = useState(false);\r\n const { pathname } = useLocation();\r\n\r\n const filteredSteps = useMemo(() => state.steps.filter((step) => step.on === pathname), [state.steps, pathname]);\r\n const orderedSteps = useMemo(\r\n () =>\r\n filteredSteps.sort((a, b) => {\r\n if (a.step < b.step) return -1;\r\n return 1;\r\n }),\r\n [filteredSteps]\r\n );\r\n\r\n const nextStep = () => setStepIndex((i) => (i < orderedSteps.length - 1 ? i + 1 : 0));\r\n const prevStep = () => setStepIndex((i) => (i <= 0 ? orderedSteps.length - 1 : i - 1));\r\n\r\n const reset = () => setStepIndex(0);\r\n\r\n const addElement = ({ disableActions, fixed, on, ref, step, stepOptions }) => {\r\n //\r\n dispatch({\r\n payload: {\r\n disableActions,\r\n fixed,\r\n on,\r\n ref,\r\n step,\r\n stepOptions,\r\n },\r\n type: 'ADD_ELEMENT',\r\n });\r\n };\r\n\r\n const onChangeStepIndex = (index) => setStepIndex(index);\r\n\r\n const handleOpen = () => setOpen(true);\r\n const handleClose = () => setOpen(false);\r\n\r\n useEffect(() => {\r\n setStepIndex(0);\r\n }, [pathname]);\r\n\r\n const safeStep = useMemo(() => orderedSteps?.[stepIndex] || orderedSteps?.[0], [stepIndex, orderedSteps]);\r\n\r\n return (\r\n setScrolling(true),\r\n handleScrollStop: () => setScrolling(false),\r\n nextStep,\r\n onChangeStepIndex,\r\n open,\r\n orderedSteps,\r\n prevStep,\r\n reset,\r\n safeStep,\r\n scrolling,\r\n size: orderedSteps.length,\r\n stepIndex,\r\n stepRef: safeStep?.ref,\r\n }}\r\n >\r\n {children}\r\n \r\n );\r\n}\r\n\r\nTutorialProvider.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport { TutorialContext, TutorialProvider };\r\n","import PropTypes from 'prop-types';\r\nimport React, { createContext, useEffect, useReducer } from 'react';\r\n\r\nimport apis from '../apis';\r\n// utils\r\nimport { isValidToken, setSession } from '../utils/jwt';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst initialState = {\r\n isAuthenticated: false,\r\n isInitialized: false,\r\n user: null,\r\n};\r\n\r\nconst handlers = {\r\n INITIALIZE: (state, action) => {\r\n const { isAuthenticated, user } = action.payload;\r\n return {\r\n ...state,\r\n isAuthenticated,\r\n isInitialized: true,\r\n user,\r\n };\r\n },\r\n LOGIN: (state, action) => {\r\n const { user } = action.payload;\r\n\r\n return {\r\n ...state,\r\n isAuthenticated: true,\r\n user,\r\n };\r\n },\r\n LOGOUT: (state) => ({\r\n ...state,\r\n isAuthenticated: false,\r\n user: null,\r\n }),\r\n};\r\n\r\nconst reducer = (state, action) => (handlers[action.type] ? handlers[action.type](state, action) : state);\r\n\r\nconst AuthContext = createContext({\r\n ...initialState,\r\n login: () => Promise.resolve(),\r\n logout: () => Promise.resolve(),\r\n method: 'jwt',\r\n});\r\n\r\nfunction AuthProvider({ children }) {\r\n const [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n useEffect(() => {\r\n const initialize = async () => {\r\n try {\r\n const token = window.localStorage.getItem('token');\r\n\r\n if (token && isValidToken(token)) {\r\n setSession(token);\r\n\r\n const response = await apis.me();\r\n const user = response.data?.data;\r\n\r\n dispatch({\r\n payload: {\r\n isAuthenticated: true,\r\n user,\r\n },\r\n type: 'INITIALIZE',\r\n });\r\n } else {\r\n dispatch({\r\n payload: {\r\n isAuthenticated: false,\r\n user: null,\r\n },\r\n type: 'INITIALIZE',\r\n });\r\n }\r\n } catch (err) {\r\n dispatch({\r\n payload: {\r\n isAuthenticated: false,\r\n user: null,\r\n },\r\n type: 'INITIALIZE',\r\n });\r\n }\r\n };\r\n\r\n initialize();\r\n }, []);\r\n\r\n const login = async (credentials) => {\r\n const response = await apis.login(credentials);\r\n const { token, user } = response.data?.data;\r\n\r\n setSession(token);\r\n dispatch({\r\n payload: {\r\n user,\r\n },\r\n type: 'LOGIN',\r\n });\r\n };\r\n\r\n const logout = async () => {\r\n setSession(null);\r\n dispatch({ type: 'LOGOUT' });\r\n };\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nAuthProvider.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport { AuthContext, AuthProvider };\r\n","import PropTypes from 'prop-types';\r\nimport React, { createContext, useReducer } from 'react';\r\n\r\nimport apis from '../apis';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst initialState = {\r\n contacts: [],\r\n};\r\n\r\nconst handlers = {\r\n CONTACT_CREATED: (state, payload) => ({ ...state, contacts: [...state.contacts, payload] }),\r\n CONTACT_DELETED: (state, payload) => ({\r\n ...state,\r\n contacts: state.contacts.filter((c) => c.ID_CONTACT !== payload.ID_CONTACT),\r\n }),\r\n CONTACT_UPDATED: (state, payload) => ({\r\n ...state,\r\n contacts: state.contacts.map((c) => (c.ID_CONTACT === payload.ID_CONTACT ? payload : c)),\r\n }),\r\n GET_CONTACTS: (state, payload) => ({ ...state, contacts: payload }),\r\n};\r\n\r\nconst reducer = (state, { payload, type }) => (handlers[type] ? handlers[type](state, payload) : state);\r\n\r\nconst ContactsContext = createContext({\r\n ...initialState,\r\n getContacts: () => Promise.resolve(),\r\n});\r\n\r\nfunction ContactsProvider({ children }) {\r\n const [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n const getContacts = async () => {\r\n const { data } = await apis.getContacts();\r\n const contacts = data?.data;\r\n\r\n dispatch({ payload: contacts, type: 'GET_CONTACTS' });\r\n };\r\n\r\n const createContact = async (contactData) => {\r\n const { data } = await apis.createContact(contactData);\r\n const contact = data?.data;\r\n\r\n dispatch({ payload: contact, type: 'CONTACT_CREATED' });\r\n };\r\n\r\n const updateContact = async (contactId, contactData) => {\r\n const { data } = await apis.updateContact(contactId, contactData);\r\n const contact = data?.data;\r\n\r\n dispatch({ payload: contact, type: 'CONTACT_UPDATED' });\r\n };\r\n\r\n const deleteContact = async (contactId) => {\r\n const { data } = await apis.deleteContact(contactId);\r\n const contact = data?.data;\r\n\r\n dispatch({ payload: contact, type: 'CONTACT_DELETED' });\r\n };\r\n\r\n const getContactInfo = (id) => state.contacts.find((contact) => contact.ID_CONTACT === id);\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nContactsProvider.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport { ContactsContext, ContactsProvider };\r\n","import PropTypes from 'prop-types';\r\nimport React, { createContext, useReducer } from 'react';\r\n\r\nimport apis from '../apis';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst initialState = {\r\n notifications: [],\r\n};\r\n\r\nconst handlers = {\r\n GET_NOTIFICATIONS: (state, notifications) => ({\r\n ...state,\r\n notifications,\r\n }),\r\n REMOVE_NOTIFICATION: (state, recordId) => ({\r\n ...state,\r\n notifications: state.notifications.filter((n) => n.NUMDOS !== Number(recordId)),\r\n }),\r\n};\r\n\r\nconst reducer = (state, { payload, type }) => (handlers[type] ? handlers[type](state, payload) : state);\r\n\r\nconst NotificationsContext = createContext({\r\n ...initialState,\r\n getNotifications: () => Promise.resolve(),\r\n});\r\n\r\nfunction NotificationsProvider({ children }) {\r\n const [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n const getNotifications = async () => {\r\n const { data } = await apis.getNotifications();\r\n const notifications = data?.data;\r\n\r\n dispatch({ payload: notifications, type: 'GET_NOTIFICATIONS' });\r\n };\r\n\r\n const removeNotification = async (recordId) => {\r\n dispatch({ payload: recordId, type: 'REMOVE_NOTIFICATION' });\r\n };\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nNotificationsProvider.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport { NotificationsContext, NotificationsProvider };\r\n","import SvgIcon from '@material-ui/core/SvgIcon';\r\nimport React from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nfunction Icon(props) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nfunction CheckedIcon(props) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nfunction IndeterminateIcon(props) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default function Checkbox(theme) {\r\n return {\r\n MuiCheckbox: {\r\n defaultProps: {\r\n checkedIcon: ,\r\n icon: ,\r\n indeterminateIcon: ,\r\n },\r\n\r\n styleOverrides: {\r\n root: {\r\n '& .MuiSvgIcon-fontSizeMedium': {\r\n height: 24,\r\n width: 24,\r\n },\r\n '& .MuiSvgIcon-fontSizeSmall': {\r\n height: 20,\r\n width: 20,\r\n },\r\n '&.Mui-checked.Mui-disabled, &.Mui-disabled': {\r\n color: theme.palette.action.disabled,\r\n },\r\n padding: theme.spacing(1),\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","import starFill from '@iconify/icons-eva/star-fill';\r\nimport { Icon } from '@iconify/react';\r\nimport { SvgIcon } from '@material-ui/core';\r\nimport React from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst ICON_SMALL = { height: 20, width: 20 };\r\nconst ICON_LARGE = { height: 28, width: 28 };\r\n\r\nconst ICON = (\r\n \r\n \r\n \r\n);\r\n\r\nexport default function Rating(theme) {\r\n return {\r\n MuiRating: {\r\n defaultProps: {\r\n emptyIcon: ICON,\r\n icon: ICON,\r\n },\r\n\r\n styleOverrides: {\r\n iconEmpty: { color: theme.palette.grey[500_48] },\r\n root: {\r\n '&.Mui-disabled': {\r\n opacity: 0.48,\r\n },\r\n },\r\n sizeLarge: { '& svg': { ...ICON_LARGE } },\r\n sizeSmall: { '& svg': { ...ICON_SMALL } },\r\n },\r\n },\r\n };\r\n}\r\n","import closeSquareOutline from '@iconify/icons-eva/close-square-outline';\r\nimport minusSquareOutline from '@iconify/icons-eva/minus-square-outline';\r\nimport plusSquareOutline from '@iconify/icons-eva/plus-square-outline';\r\nimport { Icon } from '@iconify/react';\r\nimport { Box } from '@material-ui/core';\r\nimport React from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst ICON_SIZE = { height: 20, width: 20 };\r\n\r\nexport default function TreeView(theme) {\r\n return {\r\n MuiTreeItem: {\r\n styleOverrides: {\r\n iconContainer: { width: 'auto' },\r\n label: { ...theme.typography.body2 },\r\n },\r\n },\r\n MuiTreeView: {\r\n defaultProps: {\r\n defaultCollapseIcon: ,\r\n defaultEndIcon: (\r\n \r\n ),\r\n defaultExpandIcon: ,\r\n },\r\n },\r\n };\r\n}\r\n","import { merge } from 'lodash';\r\n\r\nimport Accordion from './Accordion';\r\nimport Alert from './Alert';\r\nimport Autocomplete from './Autocomplete';\r\nimport Avatar from './Avatar';\r\nimport Backdrop from './Backdrop';\r\nimport Badge from './Badge';\r\nimport Breadcrumbs from './Breadcrumbs';\r\nimport Button from './Button';\r\nimport ButtonGroup from './ButtonGroup';\r\nimport Card from './Card';\r\nimport Checkbox from './Checkbox';\r\nimport Chip from './Chip';\r\nimport Container from './Container';\r\nimport ControlLabel from './ControlLabel';\r\nimport Dialog from './Dialog';\r\nimport Drawer from './Drawer';\r\nimport Fab from './Fab';\r\nimport Grid from './Grid';\r\nimport IconButton from './IconButton';\r\nimport Input from './Input';\r\nimport Lists from './Lists';\r\nimport LoadingButton from './LoadingButton';\r\nimport Menu from './Menu';\r\nimport Pagination from './Pagination';\r\nimport Paper from './Paper';\r\nimport Pickers from './Pickers';\r\nimport Popover from './Popover';\r\nimport Progress from './Progress';\r\nimport Radio from './Radio';\r\nimport Rating from './Rating';\r\nimport Select from './Select';\r\nimport Skeleton from './Skeleton';\r\nimport Slider from './Slider';\r\nimport Snackbar from './Snackbar';\r\nimport Stepper from './Stepper';\r\nimport SvgIcon from './SvgIcon';\r\nimport Switch from './Switch';\r\nimport Table from './Table';\r\nimport Tabs from './Tabs';\r\nimport Timeline from './Timeline';\r\nimport ToggleButton from './ToggleButton';\r\nimport Tooltip from './Tooltip';\r\nimport TreeView from './TreeView';\r\nimport Typography from './Typography';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function ComponentsOverrides(theme) {\r\n return merge(\r\n Fab(theme),\r\n Tabs(theme),\r\n Chip(theme),\r\n Card(theme),\r\n Menu(theme),\r\n Grid(theme),\r\n Badge(theme),\r\n Lists(theme),\r\n Table(theme),\r\n Paper(theme),\r\n Alert(theme),\r\n Input(theme),\r\n Radio(theme),\r\n Rating(theme),\r\n Dialog(theme),\r\n Drawer(theme),\r\n Avatar(theme),\r\n Slider(theme),\r\n Button(theme),\r\n Switch(theme),\r\n Select(theme),\r\n Pickers(theme),\r\n Stepper(theme),\r\n Tooltip(theme),\r\n Popover(theme),\r\n SvgIcon(theme),\r\n Skeleton(theme),\r\n Timeline(theme),\r\n TreeView(theme),\r\n Backdrop(theme),\r\n Snackbar(theme),\r\n Progress(theme),\r\n Checkbox(theme),\r\n Container(theme),\r\n Accordion(theme),\r\n Typography(theme),\r\n Pagination(theme),\r\n IconButton(theme),\r\n Breadcrumbs(theme),\r\n ButtonGroup(theme),\r\n ControlLabel(theme),\r\n Autocomplete(theme),\r\n ToggleButton(theme),\r\n LoadingButton(theme)\r\n );\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Fab(theme) {\r\n return {\r\n MuiFab: {\r\n defaultProps: {\r\n color: 'primary',\r\n },\r\n\r\n styleOverrides: {\r\n extended: {\r\n '& svg': {\r\n marginRight: theme.spacing(1),\r\n },\r\n },\r\n primary: {},\r\n root: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.grey[400],\r\n boxShadow: 'none',\r\n },\r\n boxShadow: theme.customShadows.z8,\r\n },\r\n },\r\n\r\n variants: [\r\n {\r\n props: { color: 'primary' },\r\n style: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.dark,\r\n },\r\n boxShadow: theme.customShadows.primary,\r\n },\r\n },\r\n ],\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Tabs(theme) {\r\n return {\r\n MuiTab: {\r\n styleOverrides: {\r\n labelIcon: {\r\n '& > .MuiTab-wrapper > *:first-of-type': {\r\n marginBottom: 0,\r\n marginRight: theme.spacing(1),\r\n },\r\n minHeight: 48,\r\n paddingTop: 0,\r\n },\r\n root: {\r\n '&.Mui-selected': {\r\n color: theme.palette.text.primary,\r\n },\r\n '&:not(:last-child)': {\r\n marginRight: theme.spacing(5),\r\n },\r\n '@media (min-width: 600px)': {\r\n minWidth: 48,\r\n },\r\n borderTopLeftRadius: theme.shape.borderRadius,\r\n borderTopRightRadius: theme.shape.borderRadius,\r\n fontWeight: theme.typography.fontWeightMedium,\r\n padding: 0,\r\n },\r\n textColorInherit: {\r\n color: theme.palette.text.secondary,\r\n opacity: 1,\r\n },\r\n wrapper: {\r\n flexDirection: 'row',\r\n whiteSpace: 'nowrap',\r\n },\r\n },\r\n },\r\n MuiTabPanel: {\r\n styleOverrides: {\r\n root: {\r\n padding: 0,\r\n },\r\n },\r\n },\r\n MuiTabScrollButton: {\r\n styleOverrides: {\r\n root: {\r\n borderRadius: '50%',\r\n width: 48,\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","import closeCircleFill from '@iconify/icons-eva/close-circle-fill';\r\nimport { Icon } from '@iconify/react';\r\nimport React from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function Chip(theme) {\r\n return {\r\n MuiChip: {\r\n defaultProps: {\r\n deleteIcon: ,\r\n },\r\n\r\n styleOverrides: {\r\n colorDefault: {\r\n '& .MuiChip-avatarMedium, .MuiChip-avatarSmall': {\r\n color: theme.palette.text.secondary,\r\n },\r\n },\r\n outlined: {\r\n '&.MuiChip-colorPrimary': {\r\n borderColor: theme.palette.primary.main,\r\n },\r\n '&.MuiChip-colorSecondary': {\r\n borderColor: theme.palette.secondary.main,\r\n },\r\n borderColor: theme.palette.grey[500_32],\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Card(theme) {\r\n return {\r\n MuiCard: {\r\n styleOverrides: {\r\n root: {\r\n borderRadius: theme.shape.borderRadiusMd,\r\n boxShadow: theme.customShadows.z16,\r\n position: 'relative',\r\n zIndex: 0, // Fix Safari overflow: hidden with border radius\r\n },\r\n },\r\n },\r\n MuiCardContent: {\r\n styleOverrides: {\r\n root: {\r\n padding: theme.spacing(3),\r\n },\r\n },\r\n },\r\n MuiCardHeader: {\r\n defaultProps: {\r\n subheaderTypographyProps: { variant: 'body2' },\r\n titleTypographyProps: { variant: 'h6' },\r\n },\r\n styleOverrides: {\r\n root: {\r\n padding: theme.spacing(3, 3, 0),\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Menu(theme) {\r\n return {\r\n MuiMenuItem: {\r\n styleOverrides: {\r\n root: {\r\n '&.Mui-selected': {\r\n '&:hover': {\r\n backgroundColor: theme.palette.action.hover,\r\n },\r\n backgroundColor: theme.palette.action.selected,\r\n },\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Grid() {\r\n return {\r\n MuiGrid: {\r\n styleOverrides: {},\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Badge() {\r\n return {\r\n MuiBadge: {\r\n styleOverrides: {\r\n dot: {\r\n borderRadius: '50%',\r\n height: 10,\r\n width: 10,\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Lists(theme) {\r\n return {\r\n MuiListItemAvatar: {\r\n styleOverrides: {\r\n root: {\r\n marginRight: theme.spacing(2),\r\n minWidth: 'auto',\r\n },\r\n },\r\n },\r\n MuiListItemIcon: {\r\n styleOverrides: {\r\n root: {\r\n color: 'inherit',\r\n marginRight: theme.spacing(2),\r\n minWidth: 'auto',\r\n },\r\n },\r\n },\r\n MuiListItemText: {\r\n styleOverrides: {\r\n multiline: {\r\n marginBottom: 0,\r\n marginTop: 0,\r\n },\r\n root: {\r\n marginBottom: 0,\r\n marginTop: 0,\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Table(theme) {\r\n return {\r\n MuiTableCell: {\r\n styleOverrides: {\r\n body: {\r\n '&:first-of-type': {\r\n paddingLeft: theme.spacing(3),\r\n },\r\n '&:last-of-type': {\r\n paddingRight: theme.spacing(3),\r\n },\r\n },\r\n head: {\r\n '&:first-of-type': {\r\n borderBottomLeftRadius: theme.shape.borderRadius,\r\n borderTopLeftRadius: theme.shape.borderRadius,\r\n boxShadow: `inset 8px 0 0 ${theme.palette.background.paper}`,\r\n paddingLeft: theme.spacing(3),\r\n },\r\n '&:last-of-type': {\r\n borderBottomRightRadius: theme.shape.borderRadius,\r\n borderTopRightRadius: theme.shape.borderRadius,\r\n boxShadow: `inset -8px 0 0 ${theme.palette.background.paper}`,\r\n paddingRight: theme.spacing(3),\r\n },\r\n backgroundColor: theme.palette.background.neutral,\r\n color: theme.palette.text.secondary,\r\n },\r\n root: {\r\n borderBottom: 'none',\r\n },\r\n stickyHeader: {\r\n backgroundColor: theme.palette.background.paper,\r\n backgroundImage: `linear-gradient(to bottom, ${theme.palette.background.neutral} 0%, ${theme.palette.background.neutral} 100%)`,\r\n },\r\n },\r\n },\r\n MuiTablePagination: {\r\n styleOverrides: {\r\n root: {\r\n borderTop: `solid 1px ${theme.palette.divider}`,\r\n },\r\n select: {\r\n '&:focus': {\r\n borderRadius: theme.shape.borderRadius,\r\n },\r\n },\r\n selectIcon: {\r\n height: 20,\r\n marginTop: 2,\r\n width: 20,\r\n },\r\n toolbar: {\r\n height: 64,\r\n },\r\n },\r\n },\r\n MuiTableRow: {\r\n styleOverrides: {\r\n root: {\r\n '&.Mui-selected': {\r\n '&:hover': {\r\n backgroundColor: theme.palette.action.hover,\r\n },\r\n backgroundColor: theme.palette.action.selected,\r\n },\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Paper() {\r\n return {\r\n MuiPaper: {\r\n defaultProps: {\r\n elevation: 0,\r\n },\r\n\r\n styleOverrides: {\r\n root: {\r\n backgroundImage: 'none',\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","import alertCircleFill from '@iconify/icons-eva/alert-circle-fill';\r\nimport alertTriangleFill from '@iconify/icons-eva/alert-triangle-fill';\r\nimport checkmarkCircle2Fill from '@iconify/icons-eva/checkmark-circle-2-fill';\r\nimport infoFill from '@iconify/icons-eva/info-fill';\r\nimport { Icon } from '@iconify/react';\r\nimport React from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function Alert(theme) {\r\n const isLight = theme.palette.mode === 'light';\r\n\r\n const standardStyle = (color) => ({\r\n backgroundColor: theme.palette[color][isLight ? 'lighter' : 'darker'],\r\n color: theme.palette[color][isLight ? 'darker' : 'lighter'],\r\n });\r\n\r\n const filledStyle = (color) => ({\r\n color: theme.palette[color].contrastText,\r\n });\r\n\r\n const outlinedStyle = (color) => ({\r\n backgroundColor: theme.palette[color][isLight ? 'lighter' : 'darker'],\r\n border: `solid 1px ${theme.palette[color][isLight ? 'light' : 'dark']}`,\r\n color: theme.palette[color][isLight ? 'darker' : 'lighter'],\r\n });\r\n\r\n return {\r\n MuiAlert: {\r\n defaultProps: {\r\n iconMapping: {\r\n error: ,\r\n info: ,\r\n success: ,\r\n warning: ,\r\n },\r\n },\r\n\r\n styleOverrides: {\r\n action: {\r\n '& button:not(:first-of-type)': {\r\n marginLeft: theme.spacing(1),\r\n },\r\n },\r\n filledError: filledStyle('error'),\r\n\r\n filledInfo: filledStyle('info'),\r\n filledSuccess: filledStyle('success'),\r\n filledWarning: filledStyle('warning'),\r\n message: {\r\n '& .MuiAlertTitle-root': {\r\n marginBottom: theme.spacing(0.5),\r\n },\r\n },\r\n\r\n outlinedError: outlinedStyle('error'),\r\n outlinedInfo: outlinedStyle('info'),\r\n outlinedSuccess: outlinedStyle('success'),\r\n outlinedWarning: outlinedStyle('warning'),\r\n\r\n standardError: standardStyle('error'),\r\n standardInfo: standardStyle('info'),\r\n standardSuccess: standardStyle('success'),\r\n standardWarning: standardStyle('warning'),\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Input(theme) {\r\n return {\r\n MuiFilledInput: {\r\n styleOverrides: {\r\n root: {\r\n '&.Mui-disabled': {\r\n backgroundColor: theme.palette.action.disabledBackground,\r\n },\r\n '&.Mui-focused': {\r\n backgroundColor: theme.palette.action.focus,\r\n },\r\n '&:hover': {\r\n backgroundColor: theme.palette.grey[500_16],\r\n },\r\n backgroundColor: theme.palette.grey[500_12],\r\n },\r\n underline: {\r\n '&:before': {\r\n borderBottomColor: theme.palette.grey[500_56],\r\n },\r\n },\r\n },\r\n },\r\n MuiInput: {\r\n styleOverrides: {\r\n underline: {\r\n '&:before': {\r\n borderBottomColor: theme.palette.grey[500_56],\r\n },\r\n },\r\n },\r\n },\r\n MuiInputBase: {\r\n styleOverrides: {\r\n input: {\r\n '&::placeholder': {\r\n color: theme.palette.text.disabled,\r\n opacity: 1,\r\n },\r\n },\r\n root: {\r\n '&.Mui-disabled': {\r\n '& svg': { color: theme.palette.text.disabled },\r\n },\r\n },\r\n },\r\n },\r\n MuiOutlinedInput: {\r\n styleOverrides: {\r\n root: {\r\n '& .MuiOutlinedInput-notchedOutline': {\r\n borderColor: theme.palette.grey[500_32],\r\n },\r\n '&.Mui-disabled': {\r\n '& .MuiOutlinedInput-notchedOutline': {\r\n borderColor: theme.palette.action.disabledBackground,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Radio(theme) {\r\n return {\r\n MuiRadio: {\r\n styleOverrides: {\r\n root: {\r\n padding: theme.spacing(1),\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Dialog(theme) {\r\n return {\r\n MuiDialog: {\r\n styleOverrides: {\r\n paper: {\r\n '&.MuiDialog-paper .MuiDialogActions-root': {\r\n padding: theme.spacing(3),\r\n },\r\n '&.MuiDialog-paperFullScreen': {\r\n borderRadius: 0,\r\n },\r\n '&.MuiPaper-rounded': {\r\n borderRadius: theme.shape.borderRadiusMd,\r\n },\r\n '@media (max-width: 600px)': {\r\n margin: theme.spacing(2),\r\n },\r\n '@media (max-width: 663.95px)': {\r\n '&.MuiDialog-paperWidthSm.MuiDialog-paperScrollBody': {\r\n maxWidth: '100%',\r\n },\r\n },\r\n boxShadow: theme.customShadows.z24,\r\n },\r\n paperFullWidth: {\r\n width: '100%',\r\n },\r\n },\r\n },\r\n MuiDialogActions: {\r\n styleOverrides: {\r\n root: {\r\n '& > :not(:first-of-type)': {\r\n marginLeft: theme.spacing(1.5),\r\n },\r\n },\r\n },\r\n },\r\n MuiDialogContent: {\r\n styleOverrides: {\r\n root: {\r\n borderBottom: 0,\r\n borderTop: 0,\r\n padding: theme.spacing(3),\r\n },\r\n },\r\n },\r\n MuiDialogTitle: {\r\n styleOverrides: {\r\n root: {\r\n padding: theme.spacing(3, 3, 0),\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","import { alpha } from '@material-ui/core';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function Drawer(theme) {\r\n const isLight = theme.palette.mode === 'light';\r\n\r\n return {\r\n MuiDrawer: {\r\n styleOverrides: {\r\n modal: {\r\n '&[role=\"presentation\"]': {\r\n '& .MuiDrawer-paperAnchorLeft': {\r\n boxShadow: `8px 24px 24px 12px ${alpha(theme.palette.grey[900], isLight ? 0.16 : 0.48)}`,\r\n },\r\n '& .MuiDrawer-paperAnchorRight': {\r\n boxShadow: `-8px 24px 24px 12px ${alpha(theme.palette.grey[900], isLight ? 0.16 : 0.48)}`,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Avatar(theme) {\r\n return {\r\n MuiAvatar: {\r\n styleOverrides: {\r\n colorDefault: {\r\n backgroundColor: theme.palette.grey[400],\r\n color: theme.palette.text.secondary,\r\n },\r\n },\r\n },\r\n MuiAvatarGroup: {\r\n styleOverrides: {\r\n avatar: {\r\n '&:first-of-type': {\r\n backgroundColor: theme.palette.primary.lighter,\r\n color: theme.palette.primary.main,\r\n fontSize: 14,\r\n },\r\n fontSize: 16,\r\n fontWeight: theme.typography.fontWeightMedium,\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Slider(theme) {\r\n return {\r\n MuiSlider: {\r\n styleOverrides: {\r\n markLabel: {\r\n color: theme.palette.text.disabled,\r\n fontSize: 13,\r\n },\r\n root: {\r\n '&.Mui-disabled': {\r\n color: theme.palette.action.disabled,\r\n },\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Button(theme) {\r\n return {\r\n MuiButton: {\r\n styleOverrides: {\r\n containedInherit: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.grey[400],\r\n },\r\n boxShadow: theme.customShadows.z8,\r\n color: theme.palette.grey[800],\r\n },\r\n containedPrimary: {\r\n boxShadow: theme.customShadows.primary,\r\n },\r\n containedSecondary: {\r\n boxShadow: theme.customShadows.secondary,\r\n },\r\n outlinedInherit: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.action.hover,\r\n },\r\n border: `1px solid ${theme.palette.grey[500_32]}`,\r\n },\r\n root: {\r\n '&:hover': {\r\n boxShadow: 'none',\r\n },\r\n },\r\n sizeLarge: {\r\n height: 48,\r\n },\r\n textInherit: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.action.hover,\r\n },\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Switch(theme) {\r\n const isLight = theme.palette.mode === 'light';\r\n\r\n return {\r\n MuiSwitch: {\r\n styleOverrides: {\r\n switchBase: {\r\n '&.Mui-checked.Mui-disabled, &.Mui-disabled': {\r\n color: theme.palette.grey[isLight ? 400 : 600],\r\n },\r\n '&.Mui-disabled+.MuiSwitch-track': {\r\n backgroundColor: `${theme.palette.action.disabledBackground} !important`,\r\n opacity: 1,\r\n },\r\n '&:not(:.Mui-checked)': {\r\n color: theme.palette.grey[isLight ? 100 : 300],\r\n },\r\n left: 0,\r\n right: 'auto',\r\n },\r\n thumb: {\r\n boxShadow: theme.customShadows.z1,\r\n },\r\n track: {\r\n backgroundColor: theme.palette.grey[500],\r\n opacity: 1,\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","import ExpandMoreRoundedIcon from '@material-ui/icons/ExpandMoreRounded';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function Select() {\r\n return {\r\n MuiSelect: {\r\n defaultProps: {\r\n IconComponent: ExpandMoreRoundedIcon,\r\n },\r\n\r\n styleOverrides: {\r\n root: {},\r\n },\r\n },\r\n };\r\n}\r\n","import { alpha } from '@material-ui/core/styles';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function Pickers(theme) {\r\n return {\r\n MuiDateRangePickerViewDesktop: {\r\n styleOverrides: {\r\n root: {\r\n border: `solid 1px ${theme.palette.divider}`,\r\n borderRadius: theme.shape.borderRadiusMd,\r\n },\r\n },\r\n },\r\n\r\n PrivatePicker: {\r\n styleOverrides: {\r\n landscape: {\r\n border: `solid 1px ${theme.palette.divider}`,\r\n },\r\n root: {\r\n '& .MuiTab-root': {\r\n '&.Mui-selected': {\r\n color: theme.palette.common.white,\r\n },\r\n color: alpha(theme.palette.common.white, 0.72),\r\n margin: 0,\r\n },\r\n '& .MuiTabs-indicator': {\r\n backgroundColor: theme.palette.primary.dark,\r\n width: '160px !important',\r\n },\r\n '& .PrivatePickersToolbar-root': {\r\n '& .MuiTypography-root': {\r\n '&.Mui-selected': {\r\n color: theme.palette.common.white,\r\n },\r\n color: alpha(theme.palette.common.white, 0.72),\r\n },\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.common.white,\r\n },\r\n borderRadius: theme.shape.borderRadiusMd,\r\n overflow: 'hidden',\r\n },\r\n },\r\n },\r\n\r\n PrivatePickersPopper: {\r\n styleOverrides: {\r\n paper: {\r\n borderRadius: theme.shape.borderRadiusMd,\r\n boxShadow: theme.customShadows.z24,\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Stepper(theme) {\r\n return {\r\n MuiStepConnector: {\r\n styleOverrides: {\r\n line: {\r\n borderColor: theme.palette.divider,\r\n },\r\n },\r\n },\r\n MuiStepContent: {\r\n styleOverrides: {\r\n root: {\r\n borderColor: theme.palette.divider,\r\n },\r\n },\r\n },\r\n MuiStepLabel: {\r\n styleOverrides: {\r\n iconContainer: {\r\n '& .MuiStepIcon-root:not(.Mui-active)': {\r\n fill: theme.palette.text.disabled,\r\n },\r\n '& .MuiStepIcon-text': {\r\n fill: theme.palette.common.white,\r\n },\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Tooltip(theme) {\r\n const isLight = theme.palette.mode === 'light';\r\n\r\n return {\r\n MuiTooltip: {\r\n styleOverrides: {\r\n arrow: {\r\n color: theme.palette.grey[isLight ? 800 : 700],\r\n },\r\n tooltip: {\r\n backgroundColor: theme.palette.grey[isLight ? 800 : 700],\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Popover(theme) {\r\n return {\r\n MuiPopover: {\r\n styleOverrides: {\r\n paper: {\r\n boxShadow: theme.customShadows.z12,\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function SvgIcon() {\r\n return {\r\n MuiSvgIcon: {\r\n styleOverrides: {\r\n fontSizeLarge: {\r\n fontSize: 'inherit',\r\n height: 32,\r\n width: 32,\r\n },\r\n fontSizeSmall: {\r\n fontSize: 'inherit',\r\n height: 20,\r\n width: 20,\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Skeleton(theme) {\r\n return {\r\n MuiSkeleton: {\r\n defaultProps: {\r\n animation: 'wave',\r\n },\r\n\r\n styleOverrides: {\r\n root: {\r\n backgroundColor: theme.palette.background.neutral,\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Timeline(theme) {\r\n return {\r\n MuiTimelineConnector: {\r\n styleOverrides: {\r\n root: {\r\n backgroundColor: theme.palette.divider,\r\n },\r\n },\r\n },\r\n\r\n MuiTimelineDot: {\r\n styleOverrides: {\r\n root: {\r\n boxShadow: 'none',\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","import { alpha } from '@material-ui/core/styles';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function Backdrop(theme) {\r\n const varLow = alpha(theme.palette.grey[900], 0.48);\r\n const varHigh = alpha(theme.palette.grey[900], 1);\r\n\r\n return {\r\n MuiBackdrop: {\r\n styleOverrides: {\r\n root: {\r\n '&.MuiBackdrop-invisible': {\r\n background: 'transparent',\r\n },\r\n background: [\r\n `rgb(22,28,36)`,\r\n `-moz-linear-gradient(75deg, ${varLow} 0%, ${varHigh} 100%)`,\r\n `-webkit-linear-gradient(75deg, ${varLow} 0%, ${varHigh} 100%)`,\r\n `linear-gradient(75deg, ${varLow} 0%, ${varHigh} 100%)`,\r\n ],\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Snackbar() {\r\n return {\r\n MuiSnackbarContent: {\r\n styleOverrides: {\r\n root: {},\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Progress(theme) {\r\n const isLight = theme.palette.mode === 'light';\r\n\r\n return {\r\n MuiLinearProgress: {\r\n styleOverrides: {\r\n bar: {\r\n borderRadius: 4,\r\n },\r\n buffer: {\r\n backgroundColor: 'transparent',\r\n },\r\n colorPrimary: {\r\n backgroundColor: theme.palette.primary[isLight ? 'lighter' : 'darker'],\r\n },\r\n root: {\r\n borderRadius: 4,\r\n overflow: 'hidden',\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Container() {\r\n return {\r\n MuiContainer: {\r\n styleOverrides: {\r\n root: {},\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Accordion(theme) {\r\n return {\r\n MuiAccordion: {\r\n styleOverrides: {\r\n root: {\r\n '&.Mui-disabled': {\r\n backgroundColor: 'transparent',\r\n },\r\n '&.Mui-expanded': {\r\n borderRadius: theme.shape.borderRadius,\r\n boxShadow: theme.customShadows.z8,\r\n },\r\n },\r\n },\r\n },\r\n MuiAccordionSummary: {\r\n styleOverrides: {\r\n expandIconWrapper: {\r\n color: 'inherit',\r\n },\r\n root: {\r\n '&.Mui-disabled': {\r\n '& .MuiTypography-root': {\r\n color: 'inherit',\r\n },\r\n color: theme.palette.action.disabled,\r\n opacity: 1,\r\n },\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(1),\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Typography(theme) {\r\n return {\r\n MuiTypography: {\r\n styleOverrides: {\r\n gutterBottom: {\r\n marginBottom: theme.spacing(1),\r\n },\r\n paragraph: {\r\n marginBottom: theme.spacing(2),\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","import { alpha } from '@material-ui/core/styles';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function Pagination(theme) {\r\n return {\r\n MuiPaginationItem: {\r\n styleOverrides: {\r\n outlined: {\r\n border: `1px solid ${theme.palette.grey[500_32]}`,\r\n },\r\n outlinedPrimary: {\r\n '&.Mui-selected': {\r\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\r\n border: `1px solid ${alpha(theme.palette.primary.main, 0.24)}`,\r\n },\r\n },\r\n root: {\r\n '&.Mui-selected': {\r\n fontWeight: theme.typography.fontWeightBold,\r\n },\r\n },\r\n textPrimary: {\r\n '&.Mui-selected': {\r\n '&:hover, &.Mui-focusVisible': {\r\n backgroundColor: `${alpha(theme.palette.primary.main, 0.24)} !important`,\r\n },\r\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\r\n color: theme.palette.primary.main,\r\n },\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function IconButton(theme) {\r\n return {\r\n MuiIconButton: {\r\n styleOverrides: {\r\n root: {},\r\n },\r\n\r\n variants: [\r\n {\r\n props: { color: 'default' },\r\n style: {\r\n '&:hover': { backgroundColor: theme.palette.action.hover },\r\n },\r\n },\r\n {\r\n props: { color: 'inherit' },\r\n style: {\r\n '&:hover': { backgroundColor: theme.palette.action.hover },\r\n },\r\n },\r\n ],\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Breadcrumbs(theme) {\r\n return {\r\n MuiBreadcrumbs: {\r\n styleOverrides: {\r\n separator: {\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2),\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","import { alpha } from '@material-ui/core/styles';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function ButtonGroup(theme) {\r\n return {\r\n MuiButtonGroup: {\r\n styleOverrides: {\r\n grouped: {\r\n borderColor: `${theme.palette.grey[500_32]} !important`,\r\n },\r\n groupedContained: {\r\n color: theme.palette.grey[800],\r\n },\r\n groupedContainedPrimary: {\r\n borderColor: `${theme.palette.primary.dark} !important`,\r\n color: theme.palette.primary.contrastText,\r\n },\r\n groupedContainedSecondary: {\r\n borderColor: `${theme.palette.secondary.dark} !important`,\r\n color: theme.palette.secondary.contrastText,\r\n },\r\n groupedOutlinedPrimary: {\r\n borderColor: `${alpha(theme.palette.primary.main, 0.48)} !important`,\r\n },\r\n groupedOutlinedSecondary: {\r\n borderColor: `${alpha(theme.palette.secondary.main, 0.48)} !important`,\r\n },\r\n groupedTextPrimary: {\r\n borderColor: `${theme.palette.primary.main} !important`,\r\n },\r\n groupedTextSecondary: {\r\n borderColor: `${theme.palette.secondary.main} !important`,\r\n },\r\n root: {\r\n '&:hover': {\r\n boxShadow: 'none',\r\n },\r\n },\r\n },\r\n\r\n variants: [\r\n {\r\n props: { color: 'inherit', variant: 'contained' },\r\n style: { boxShadow: theme.customShadows.z8 },\r\n },\r\n {\r\n props: { color: 'primary', variant: 'contained' },\r\n style: { boxShadow: theme.customShadows.primary },\r\n },\r\n {\r\n props: { color: 'secondary', variant: 'contained' },\r\n style: { boxShadow: theme.customShadows.secondary },\r\n },\r\n {\r\n props: { disabled: true },\r\n style: {\r\n '& .MuiButtonGroup-grouped.Mui-disabled': {\r\n '&.MuiButton-contained': {\r\n backgroundColor: theme.palette.action.disabledBackground,\r\n },\r\n borderColor: `${theme.palette.action.disabledBackground} !important`,\r\n color: `${theme.palette.action.disabled} !important`,\r\n },\r\n boxShadow: 'none !important',\r\n },\r\n },\r\n ],\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function ControlLabel(theme) {\r\n return {\r\n MuiFormControlLabel: {\r\n styleOverrides: {\r\n label: {\r\n ...theme.typography.body2,\r\n },\r\n },\r\n },\r\n MuiFormHelperText: {\r\n styleOverrides: {\r\n root: {\r\n marginTop: theme.spacing(1),\r\n },\r\n },\r\n },\r\n MuiFormLabel: {\r\n styleOverrides: {\r\n root: {\r\n color: theme.palette.text.disabled,\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function Autocomplete(theme) {\r\n return {\r\n MuiAutocomplete: {\r\n styleOverrides: {\r\n paper: {\r\n boxShadow: theme.customShadows.z20,\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function ToggleButton(theme) {\r\n const isLight = theme.palette.mode === 'light';\r\n\r\n return {\r\n MuiToggleButton: {\r\n styleOverrides: {\r\n root: {\r\n '&.Mui-disabled': {\r\n color: theme.palette.grey[500_48],\r\n },\r\n '&.Mui-selected': {\r\n backgroundColor: theme.palette.action.selected,\r\n color: theme.palette.grey[isLight ? 600 : 0],\r\n },\r\n border: `solid 1px ${theme.palette.grey[500_32]}`,\r\n color: theme.palette.grey[500],\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// ----------------------------------------------------------------------\r\n\r\nexport default function LoadingButton() {\r\n return {\r\n MuiLoadingButton: {\r\n styleOverrides: {\r\n root: {\r\n '&.MuiButton-text': {\r\n '& .MuiLoadingButton-endIconPendingEnd': {\r\n marginRight: 0,\r\n },\r\n '& .MuiLoadingButton-startIconPendingStart': {\r\n marginLeft: 0,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n };\r\n}\r\n","// THIS IS THE DEFAULT VALUE YOU CAN CHANGE IF YOU WANT\r\n\r\nconst breakpoints = {\r\n values: {\r\n lg: 1280,\r\n md: 960,\r\n sm: 600,\r\n xl: 1920,\r\n xs: 0,\r\n },\r\n};\r\n\r\nexport default breakpoints;\r\n","import { withStyles } from '@material-ui/core/styles';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst GlobalStyles = withStyles((theme) => ({\r\n '@global': {\r\n '#root': {\r\n height: '100%',\r\n width: '100%',\r\n },\r\n '*': {\r\n boxSizing: 'border-box',\r\n margin: 0,\r\n padding: 0,\r\n },\r\n // Lazy Load Img\r\n '.blur-up': {\r\n WebkitFilter: 'blur(5px)',\r\n filter: 'blur(5px)',\r\n transition: 'filter 400ms, -webkit-filter 400ms',\r\n },\r\n\r\n '.blur-up.lazyloaded ': {\r\n WebkitFilter: 'blur(0)',\r\n filter: 'blur(0)',\r\n },\r\n\r\n a: { color: theme.palette.primary.main },\r\n\r\n body: {\r\n height: '100%',\r\n width: '100%',\r\n },\r\n\r\n html: {\r\n '-ms-text-size-adjust': '100%',\r\n '-webkit-overflow-scrolling': 'touch',\r\n height: '100%',\r\n width: '100%',\r\n },\r\n\r\n img: { display: 'block', maxWidth: '100%' },\r\n\r\n input: {\r\n '&[type=number]': {\r\n '&::-webkit-inner-spin-button': { WebkitAppearance: 'none', margin: 0 },\r\n '&::-webkit-outer-spin-button': { WebkitAppearance: 'none', margin: 0 },\r\n MozAppearance: 'textfield',\r\n },\r\n },\r\n textarea: {\r\n '&:-ms-input-placeholder': { color: theme.palette.text.disabled },\r\n '&::-moz-placeholder': { color: theme.palette.text.disabled, opacity: 1 },\r\n '&::-webkit-input-placeholder': { color: theme.palette.text.disabled },\r\n '&::placeholder': { color: theme.palette.text.disabled },\r\n },\r\n },\r\n}))(() => null);\r\n\r\nexport default GlobalStyles;\r\n","// material\r\nimport { alpha } from '@material-ui/core/styles';\r\n\r\nimport palette from './palette';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst LIGHT_MODE = palette.light.grey[500];\r\nconst DARK_MODE = '#000000';\r\n\r\nconst createShadow = (color) => {\r\n const transparent1 = alpha(color, 0.2);\r\n const transparent2 = alpha(color, 0.14);\r\n const transparent3 = alpha(color, 0.12);\r\n return [\r\n 'none',\r\n `0px 2px 1px -1px ${transparent1},0px 1px 1px 0px ${transparent2},0px 1px 3px 0px ${transparent3}`,\r\n `0px 3px 1px -2px ${transparent1},0px 2px 2px 0px ${transparent2},0px 1px 5px 0px ${transparent3}`,\r\n `0px 3px 3px -2px ${transparent1},0px 3px 4px 0px ${transparent2},0px 1px 8px 0px ${transparent3}`,\r\n `0px 2px 4px -1px ${transparent1},0px 4px 5px 0px ${transparent2},0px 1px 10px 0px ${transparent3}`,\r\n `0px 3px 5px -1px ${transparent1},0px 5px 8px 0px ${transparent2},0px 1px 14px 0px ${transparent3}`,\r\n `0px 3px 5px -1px ${transparent1},0px 6px 10px 0px ${transparent2},0px 1px 18px 0px ${transparent3}`,\r\n `0px 4px 5px -2px ${transparent1},0px 7px 10px 1px ${transparent2},0px 2px 16px 1px ${transparent3}`,\r\n `0px 5px 5px -3px ${transparent1},0px 8px 10px 1px ${transparent2},0px 3px 14px 2px ${transparent3}`,\r\n `0px 5px 6px -3px ${transparent1},0px 9px 12px 1px ${transparent2},0px 3px 16px 2px ${transparent3}`,\r\n `0px 6px 6px -3px ${transparent1},0px 10px 14px 1px ${transparent2},0px 4px 18px 3px ${transparent3}`,\r\n `0px 6px 7px -4px ${transparent1},0px 11px 15px 1px ${transparent2},0px 4px 20px 3px ${transparent3}`,\r\n `0px 7px 8px -4px ${transparent1},0px 12px 17px 2px ${transparent2},0px 5px 22px 4px ${transparent3}`,\r\n `0px 7px 8px -4px ${transparent1},0px 13px 19px 2px ${transparent2},0px 5px 24px 4px ${transparent3}`,\r\n `0px 7px 9px -4px ${transparent1},0px 14px 21px 2px ${transparent2},0px 5px 26px 4px ${transparent3}`,\r\n `0px 8px 9px -5px ${transparent1},0px 15px 22px 2px ${transparent2},0px 6px 28px 5px ${transparent3}`,\r\n `0px 8px 10px -5px ${transparent1},0px 16px 24px 2px ${transparent2},0px 6px 30px 5px ${transparent3}`,\r\n `0px 8px 11px -5px ${transparent1},0px 17px 26px 2px ${transparent2},0px 6px 32px 5px ${transparent3}`,\r\n `0px 9px 11px -5px ${transparent1},0px 18px 28px 2px ${transparent2},0px 7px 34px 6px ${transparent3}`,\r\n `0px 9px 12px -6px ${transparent1},0px 19px 29px 2px ${transparent2},0px 7px 36px 6px ${transparent3}`,\r\n `0px 10px 13px -6px ${transparent1},0px 20px 31px 3px ${transparent2},0px 8px 38px 7px ${transparent3}`,\r\n `0px 10px 13px -6px ${transparent1},0px 21px 33px 3px ${transparent2},0px 8px 40px 7px ${transparent3}`,\r\n `0px 10px 14px -6px ${transparent1},0px 22px 35px 3px ${transparent2},0px 8px 42px 7px ${transparent3}`,\r\n `0px 11px 14px -7px ${transparent1},0px 23px 36px 3px ${transparent2},0px 9px 44px 8px ${transparent3}`,\r\n `0px 11px 15px -7px ${transparent1},0px 24px 38px 3px ${transparent2},0px 9px 46px 8px ${transparent3}`,\r\n ];\r\n};\r\n\r\nconst createCustomShadow = (color) => {\r\n const transparent = alpha(color, 0.24);\r\n\r\n return {\r\n error: `0 8px 16px 0 ${alpha(palette.light.error.main, 0.24)}`,\r\n info: `0 8px 16px 0 ${alpha(palette.light.info.main, 0.24)}`,\r\n primary: `0 8px 16px 0 ${alpha(palette.light.primary.main, 0.24)}`,\r\n secondary: `0 8px 16px 0 ${alpha(palette.light.secondary.main, 0.24)}`,\r\n success: `0 8px 16px 0 ${alpha(palette.light.success.main, 0.24)}`,\r\n warning: `0 8px 16px 0 ${alpha(palette.light.warning.main, 0.24)}`,\r\n z1: `0 1px 2px 0 ${transparent}`,\r\n z12: `0 0 2px 0 ${transparent}, 0 12px 24px 0 ${transparent}`,\r\n z16: `0 0 2px 0 ${transparent}, 0 16px 32px -4px ${transparent}`,\r\n z20: `0 0 2px 0 ${transparent}, 0 20px 40px -4px ${transparent}`,\r\n z24: `0 0 4px 0 ${transparent}, 0 24px 48px 0 ${transparent}`,\r\n z8: `0 8px 16px 0 ${transparent}`,\r\n };\r\n};\r\n\r\nexport const customShadows = {\r\n dark: createCustomShadow(DARK_MODE),\r\n light: createCustomShadow(LIGHT_MODE),\r\n};\r\n\r\nconst shadows = {\r\n dark: createShadow(DARK_MODE),\r\n light: createShadow(LIGHT_MODE),\r\n};\r\n\r\nexport default shadows;\r\n","// ----------------------------------------------------------------------\r\n\r\nconst shape = {\r\n borderRadius: 8,\r\n borderRadiusMd: 16,\r\n borderRadiusSm: 12,\r\n};\r\n\r\nexport default shape;\r\n","// ----------------------------------------------------------------------\r\n\r\nfunction pxToRem(value) {\r\n return `${value / 16}rem`;\r\n}\r\n\r\nfunction responsiveFontSizes({ lg, md, sm }) {\r\n return {\r\n '@media (min-width:1280px)': {\r\n fontSize: pxToRem(lg),\r\n },\r\n '@media (min-width:600px)': {\r\n fontSize: pxToRem(sm),\r\n },\r\n '@media (min-width:960px)': {\r\n fontSize: pxToRem(md),\r\n },\r\n };\r\n}\r\n\r\nconst FONT_PRIMARY = 'Public Sans, sans-serif'; // Google Font\r\n// const FONT_SECONDARY = 'CircularStd, sans-serif'; // Local Font\r\n\r\nconst typography = {\r\n body1: {\r\n fontSize: pxToRem(16),\r\n lineHeight: 1.5,\r\n },\r\n body2: {\r\n fontSize: pxToRem(14),\r\n lineHeight: 22 / 14,\r\n },\r\n button: {\r\n fontSize: pxToRem(14),\r\n fontWeight: 700,\r\n lineHeight: 24 / 14,\r\n textTransform: 'capitalize',\r\n },\r\n caption: {\r\n fontSize: pxToRem(12),\r\n lineHeight: 1.5,\r\n },\r\n fontFamily: FONT_PRIMARY,\r\n fontWeightBold: 700,\r\n fontWeightMedium: 600,\r\n fontWeightRegular: 400,\r\n h1: {\r\n fontSize: pxToRem(40),\r\n fontWeight: 700,\r\n lineHeight: 80 / 64,\r\n ...responsiveFontSizes({ lg: 64, md: 58, sm: 52 }),\r\n },\r\n h2: {\r\n fontSize: pxToRem(32),\r\n fontWeight: 700,\r\n lineHeight: 64 / 48,\r\n ...responsiveFontSizes({ lg: 48, md: 44, sm: 40 }),\r\n },\r\n h3: {\r\n fontSize: pxToRem(24),\r\n fontWeight: 700,\r\n lineHeight: 1.5,\r\n ...responsiveFontSizes({ lg: 32, md: 30, sm: 26 }),\r\n },\r\n h4: {\r\n fontSize: pxToRem(20),\r\n fontWeight: 700,\r\n lineHeight: 1.5,\r\n ...responsiveFontSizes({ lg: 24, md: 24, sm: 20 }),\r\n },\r\n h5: {\r\n fontSize: pxToRem(18),\r\n fontWeight: 700,\r\n lineHeight: 1.5,\r\n ...responsiveFontSizes({ lg: 20, md: 20, sm: 19 }),\r\n },\r\n h6: {\r\n fontSize: pxToRem(17),\r\n fontWeight: 700,\r\n lineHeight: 28 / 18,\r\n ...responsiveFontSizes({ lg: 18, md: 18, sm: 18 }),\r\n },\r\n overline: {\r\n fontSize: pxToRem(12),\r\n fontWeight: 700,\r\n letterSpacing: 1.1,\r\n lineHeight: 1.5,\r\n textTransform: 'uppercase',\r\n },\r\n subtitle1: {\r\n fontSize: pxToRem(16),\r\n fontWeight: 600,\r\n lineHeight: 1.5,\r\n },\r\n subtitle2: {\r\n fontSize: pxToRem(14),\r\n fontWeight: 600,\r\n lineHeight: 22 / 14,\r\n },\r\n};\r\n\r\nexport default typography;\r\n","const zIndex = {\r\n tutorialBox: 10000,\r\n};\r\n\r\nexport default zIndex;\r\n","// material\r\nimport { CssBaseline } from '@material-ui/core';\r\nimport { StyledEngineProvider, ThemeProvider, createTheme } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useMemo } from 'react';\r\n\r\n// hooks\r\nimport useSettings from '../hooks/useSettings';\r\nimport breakpoints from './breakpoints';\r\nimport GlobalStyles from './globalStyles';\r\nimport componentsOverride from './overrides';\r\nimport palette from './palette';\r\nimport shadows, { customShadows } from './shadows';\r\n//\r\nimport shape from './shape';\r\nimport typography from './typography';\r\nimport zIndex from './zIndex';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst ThemeConfig = ({ children }) => {\r\n const { themeDirection, themeMode } = useSettings();\r\n const isLight = themeMode === 'light';\r\n\r\n const themeOptions = useMemo(\r\n () => ({\r\n breakpoints,\r\n customShadows: isLight ? customShadows.light : customShadows.dark,\r\n direction: themeDirection,\r\n palette: isLight ? { ...palette.light, mode: 'light' } : { ...palette.dark, mode: 'dark' },\r\n shadows: isLight ? shadows.light : shadows.dark,\r\n shape,\r\n typography,\r\n zIndex,\r\n }),\r\n [isLight, themeDirection]\r\n );\r\n\r\n const theme = createTheme(themeOptions);\r\n theme.components = componentsOverride(theme);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n};\r\n\r\nThemeConfig.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport default ThemeConfig;\r\n","// material\r\nimport { alpha, experimentalStyled as styled } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport React from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst RootStyle = styled('span')(({ styleProps, theme }) => {\r\n const isLight = theme.palette.mode === 'light';\r\n const { color, variant } = styleProps;\r\n\r\n const styleFilled = (c) => ({\r\n backgroundColor: theme.palette[c].main,\r\n color: theme.palette[c].contrastText,\r\n });\r\n\r\n const styleOutlined = (c) => ({\r\n backgroundColor: 'transparent',\r\n border: `1px solid ${theme.palette[c].main}`,\r\n color: theme.palette[c].main,\r\n });\r\n\r\n const styleGhost = (c) => ({\r\n backgroundColor: alpha(theme.palette[c].main, 0.16),\r\n color: theme.palette[c][isLight ? 'dark' : 'light'],\r\n });\r\n\r\n return {\r\n alignItems: 'center',\r\n backgroundColor: theme.palette.grey[300],\r\n borderRadius: 8,\r\n color: theme.palette.grey[800],\r\n cursor: 'default',\r\n display: 'inline-flex',\r\n fontFamily: theme.typography.fontFamily,\r\n fontSize: theme.typography.pxToRem(12),\r\n fontWeight: theme.typography.fontWeightBold,\r\n height: 22,\r\n justifyContent: 'center',\r\n lineHeight: 0,\r\n minWidth: 22,\r\n padding: theme.spacing(0, 1),\r\n whiteSpace: 'nowrap',\r\n\r\n ...(color !== 'default'\r\n ? {\r\n ...(variant === 'filled' && { ...styleFilled(color) }),\r\n ...(variant === 'outlined' && { ...styleOutlined(color) }),\r\n ...(variant === 'ghost' && { ...styleGhost(color) }),\r\n }\r\n : {\r\n ...(variant === 'outlined' && {\r\n backgroundColor: 'transparent',\r\n border: `1px solid ${theme.palette.grey[500_32]}`,\r\n color: theme.palette.text.primary,\r\n }),\r\n ...(variant === 'ghost' && {\r\n backgroundColor: theme.palette.grey[500_16],\r\n color: isLight ? theme.palette.text.secondary : theme.palette.common.white,\r\n }),\r\n }),\r\n };\r\n});\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function Label({ children, color = 'default', variant = 'ghost', ...other }) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nLabel.propTypes = {\r\n children: PropTypes.node,\r\n color: PropTypes.oneOf(['default', 'primary', 'secondary', 'info', 'success', 'warning', 'error']),\r\n variant: PropTypes.oneOf(['filled', 'outlined', 'ghost']),\r\n};\r\n","// material\r\nimport { Box } from '@material-ui/core';\r\nimport config from 'config';\r\nimport PropTypes from 'prop-types';\r\nimport React, { forwardRef } from 'react';\r\nimport { Helmet } from 'react-helmet-async';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst { siteName } = config;\r\n\r\nconst Page = forwardRef(({ children, title, ...other }, ref) => (\r\n \r\n \r\n {`${siteName} | ${title}`}\r\n \r\n {children}\r\n \r\n));\r\n\r\nPage.defaultProps = {\r\n title: 'Votre SAV en ligne',\r\n};\r\n\r\nPage.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n title: PropTypes.string,\r\n};\r\n\r\nexport default Page;\r\n","import { Box } from '@material-ui/core';\r\n// material\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport React from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function UploadIllustration({ ...other }) {\r\n const theme = useTheme();\r\n const PRIMARY_MAIN = theme.palette.primary.main;\r\n const PRIMARY_DARK = theme.palette.primary.dark;\r\n const PRIMARY_DARKER = theme.palette.primary.darker;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","import { Box } from '@material-ui/core';\r\n// material\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport React from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function PageNotFoundIllustration({ ...other }) {\r\n const theme = useTheme();\r\n const PRIMARY_MAIN = theme.palette.primary.main;\r\n const PRIMARY_DARKER = theme.palette.primary.darker;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","import { Box } from '@material-ui/core';\r\n// material\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport React from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function DocIcon({ ...other }) {\r\n const theme = useTheme();\r\n const PRIMARY_LIGHTER = theme.palette.primary.lighter;\r\n const PRIMARY_LIGHT = theme.palette.primary.light;\r\n const PRIMARY_MAIN = theme.palette.primary.main;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","import PropTypes from 'prop-types';\r\nimport React, { createContext, useReducer } from 'react';\r\n\r\nimport apis from '../apis';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst initialState = {\r\n P: {\r\n '-1': [],\r\n 0: [],\r\n 1: [],\r\n },\r\n RP: {\r\n '-1': [],\r\n 0: [],\r\n 1: [],\r\n },\r\n T: {\r\n '-1': [],\r\n 0: [],\r\n 1: [],\r\n },\r\n shouldBeClosedRecords: [],\r\n};\r\n\r\nconst handlers = {\r\n ADD_RECORD: (state, { record, status, type }) => ({\r\n ...state,\r\n [type]: {\r\n ...state[type],\r\n [status]: [record, ...state[type][status]],\r\n },\r\n }),\r\n CLOSE_RECORD: (state, record) => ({\r\n ...state,\r\n shouldBeClosedRecords: state.shouldBeClosedRecords.filter((r) => r.ROW_ID !== record.ROW_ID),\r\n }),\r\n GET_RECORDS: (state, { records, status, type }) => ({ ...state, [type]: { ...state[type], [status]: records } }),\r\n GET_SHOULD_BE_CLOSED_RECORDS: (state, shouldBeClosedRecords) => ({\r\n ...state,\r\n shouldBeClosedRecords,\r\n }),\r\n};\r\n\r\nconst reducer = (state, { payload, type }) => (handlers[type] ? handlers[type](state, payload) : state);\r\n\r\nconst RecordsContext = createContext({\r\n ...initialState,\r\n getRecords: () => Promise.resolve(),\r\n getShouldBeClosedRecords: () => Promise.resolve(),\r\n});\r\n\r\nfunction RecordsProvider({ children }) {\r\n const [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n const getRecords = async ({ status, type }) => {\r\n const { data } = await apis.getRecords({ status, type });\r\n const records = data?.data;\r\n\r\n dispatch({ payload: { records, status, type }, type: 'GET_RECORDS' });\r\n };\r\n\r\n const getShouldBeClosedRecords = async () => {\r\n const { data } = await apis.getRecordsShouldBeClosed();\r\n const shouldBeClosedRecords = data?.data;\r\n\r\n dispatch({ payload: shouldBeClosedRecords, type: 'GET_SHOULD_BE_CLOSED_RECORDS' });\r\n };\r\n\r\n const addRecord = async (recordData) => {\r\n const { data } = await apis.addRecord(recordData);\r\n const record = data?.data;\r\n\r\n dispatch({ payload: { record, status: '0', type: recordData.type }, type: 'ADD_RECORD' });\r\n return record;\r\n };\r\n\r\n const closeRecord = async (recordId) => {\r\n const { data } = await apis.closeRecord(recordId);\r\n const record = data?.data;\r\n\r\n dispatch({ payload: record, type: 'CLOSE_RECORD' });\r\n };\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nRecordsProvider.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport { RecordsContext, RecordsProvider };\r\n","import Label from 'components/Label';\r\nimport React from 'react';\r\n\r\nconst TypeLabel = ({ type }) => (\r\n \r\n);\r\n\r\nexport default TypeLabel;\r\n","import { Button } from '@material-ui/core';\r\nimport axios from 'axios';\r\nimport React from 'react';\r\n\r\n// eslint-disable-next-line import/no-cycle\r\nimport { setSession } from './jwt';\r\nimport snackbar from './snackbar';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst axiosInstance = axios.create();\r\naxiosInstance.defaults.headers.common['content-type'] = 'application/json';\r\n\r\naxiosInstance.interceptors.response.use(\r\n (response) => response,\r\n (error) => {\r\n if (error?.response?.status === 401 && error?.response?.data?.error === 'UNAUTHORIZED') {\r\n setSession(null);\r\n const root = document.getElementById('root');\r\n root.style.transition = 'all 0.5s ease';\r\n root.style.filter = 'blur(5px)';\r\n root.style.pointerEvents = 'none';\r\n root.style.overflow = 'hidden';\r\n snackbar.enqueue(\"Votre session s'est terminée\", {\r\n action: () => (\r\n \r\n ),\r\n persist: true,\r\n variant: 'error',\r\n });\r\n }\r\n return Promise.reject((error.response && error.response.data) || 'Something went wrong');\r\n }\r\n);\r\n\r\nexport default axiosInstance;\r\n","import { Checkbox } from '@material-ui/core';\r\n// material\r\nimport { alpha, useTheme } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport React, { forwardRef } from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst MCheckbox = forwardRef(({ color = 'primary', sx, ...other }, ref) => {\r\n const theme = useTheme();\r\n\r\n if (color === 'default' || color === 'primary' || color === 'secondary') {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n );\r\n});\r\n\r\nMCheckbox.defaultProps = {\r\n color: 'default',\r\n sx: undefined,\r\n};\r\n\r\nMCheckbox.propTypes = {\r\n color: PropTypes.oneOf(['default', 'primary', 'secondary', 'info', 'success', 'warning', 'error']),\r\n // eslint-disable-next-line react/forbid-prop-types\r\n sx: PropTypes.object,\r\n};\r\n\r\nexport default MCheckbox;\r\n","import { Chip } from '@material-ui/core';\r\n// material\r\nimport { alpha, emphasize, experimentalStyled as styled } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport React, { forwardRef } from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst ChipStyle = styled(Chip)(({ styleProps, theme }) => {\r\n const { clickable, color, onDelete, variant } = styleProps;\r\n\r\n // Filled\r\n const styleFilled = (c) => ({\r\n '& .MuiChip-avatar': {\r\n backgroundColor: theme.palette[c].dark,\r\n c: theme.palette[c].lighter,\r\n },\r\n '& .MuiChip-deleteIcon': {\r\n '&:hover, &:active': { c: theme.palette[c].contrastText },\r\n c: alpha(theme.palette[c].contrastText, 0.7),\r\n },\r\n '& .MuiChip-icon': { c: 'inherit' },\r\n backgroundColor: theme.palette[c].main,\r\n c: theme.palette[c].contrastText,\r\n });\r\n\r\n const styleFilledClickable = (c) => ({\r\n '&:hover, &:focus': {\r\n backgroundColor: emphasize(theme.palette[c].main, theme.palette.action.hoverOpacity),\r\n },\r\n });\r\n\r\n const styleFilledDeletable = (c) => ({\r\n '&:focus': {\r\n backgroundColor: emphasize(theme.palette[c].main, theme.palette.action.focusOpacity),\r\n },\r\n });\r\n\r\n // Outlined\r\n const styleOutlined = (c) => ({\r\n '& .MuiChip-avatar': {\r\n backgroundColor: theme.palette[c].dark,\r\n color: theme.palette[c].lighter,\r\n },\r\n '& .MuiChip-deleteIcon': {\r\n '&:hover, &:active': { color: theme.palette[c].main },\r\n color: alpha(theme.palette[c].main, 0.7),\r\n },\r\n '& .MuiChip-icon': { color: 'currentColor' },\r\n '&:focus, &.MuiChip-clickable:hover': {\r\n backgroundColor: alpha(theme.palette[c].main, theme.palette.action.hoverOpacity),\r\n },\r\n border: `1px solid ${theme.palette[c].main}`,\r\n color: theme.palette[c].main,\r\n });\r\n\r\n return {\r\n ...(variant === 'filled'\r\n ? {\r\n ...styleFilled(color),\r\n ...(clickable && { ...styleFilledClickable(color) }),\r\n ...(onDelete && { ...styleFilledDeletable(color) }),\r\n }\r\n : {\r\n ...styleOutlined(color),\r\n }),\r\n };\r\n});\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst Mchip = forwardRef(\r\n ({ clickable: clickableProp, color = 'default', onDelete: onDeleteProp, variant = 'filled', ...other }, ref) => {\r\n if (color === 'default' || color === 'primary' || color === 'secondary') {\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n);\r\n\r\nMchip.propTypes = {\r\n clickable: PropTypes.bool,\r\n color: PropTypes.oneOf(['default', 'primary', 'secondary', 'info', 'success', 'warning', 'error']),\r\n onDelete: PropTypes.func,\r\n variant: PropTypes.oneOfType([PropTypes.oneOf(['filled', 'outlined']), PropTypes.string]),\r\n};\r\n\r\nexport default Mchip;\r\n","// material\r\nimport { Avatar, useTheme } from '@material-ui/core';\r\nimport PropTypes from 'prop-types';\r\nimport React, { forwardRef } from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst MAvatar = forwardRef(({ children, color = 'default', sx, ...other }, ref) => {\r\n const theme = useTheme();\r\n\r\n if (color === 'default') {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n});\r\n\r\nMAvatar.propTypes = {\r\n children: PropTypes.node,\r\n color: PropTypes.oneOf(['default', 'primary', 'secondary', 'info', 'success', 'warning', 'error']),\r\n // eslint-disable-next-line react/forbid-prop-types\r\n sx: PropTypes.object,\r\n};\r\n\r\nexport default MAvatar;\r\n","import { Box, Breadcrumbs, Link, Typography } from '@material-ui/core';\r\nimport { last } from 'lodash';\r\nimport PropTypes from 'prop-types';\r\nimport React from 'react';\r\n// material\r\nimport { Link as RouterLink } from 'react-router-dom';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst Separator = ;\r\n\r\nconst LinkItem = ({ link }) => {\r\n const { href, icon, name } = link;\r\n return (\r\n div': { display: 'inherit' },\r\n alignItems: 'center',\r\n color: 'text.primary',\r\n display: 'flex',\r\n lineHeight: 2,\r\n }}\r\n to={href}\r\n variant=\"body2\"\r\n >\r\n {icon && (\r\n \r\n {icon}\r\n \r\n )}\r\n {name}\r\n \r\n );\r\n};\r\n\r\nLinkItem.defaultProps = {\r\n link: undefined,\r\n};\r\n\r\nLinkItem.propTypes = {\r\n // eslint-disable-next-line react/forbid-prop-types\r\n link: PropTypes.object,\r\n};\r\n\r\nconst MBreadcrumbs = ({ activeLast = false, links, ...other }) => {\r\n const currentLink = last(links).name;\r\n\r\n const listDefault = links.map((link) => );\r\n const listActiveLast = links.map((link) => (\r\n \r\n {link.name !== currentLink ? (\r\n \r\n ) : (\r\n \r\n {currentLink}\r\n \r\n )}\r\n
\r\n ));\r\n\r\n return (\r\n \r\n {activeLast ? listDefault : listActiveLast}\r\n \r\n );\r\n};\r\n\r\nMBreadcrumbs.defaultProps = {\r\n activeLast: false,\r\n};\r\n\r\nMBreadcrumbs.propTypes = {\r\n activeLast: PropTypes.bool,\r\n // eslint-disable-next-line react/forbid-prop-types\r\n links: PropTypes.array.isRequired,\r\n};\r\n\r\nexport default MBreadcrumbs;\r\n","import { Fab } from '@material-ui/core';\r\n// material\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport React, { forwardRef } from 'react';\r\n\r\n//\r\nimport { ButtonAnimate } from '../animate';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst MFab = forwardRef(({ children, color = 'primary', sx, ...other }, ref) => {\r\n const theme = useTheme();\r\n\r\n if (color === 'default' || color === 'inherit' || color === 'primary' || color === 'secondary') {\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n});\r\n\r\nMFab.defaultProps = {\r\n children: undefined,\r\n color: 'inherit',\r\n sx: undefined,\r\n};\r\n\r\nMFab.propTypes = {\r\n children: PropTypes.node,\r\n color: PropTypes.oneOf(['default', 'inherit', 'primary', 'secondary', 'info', 'success', 'warning', 'error']),\r\n // eslint-disable-next-line react/forbid-prop-types\r\n sx: PropTypes.object,\r\n};\r\n\r\nexport default MFab;\r\n","import { Button } from '@material-ui/core';\r\n// material\r\nimport { alpha, experimentalStyled as styled } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport React, { forwardRef } from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst ButtonStyle = styled(Button)(({ styleProps, theme }) => {\r\n const { color, variant } = styleProps;\r\n\r\n const styleContained = (c) => ({\r\n '&:hover': {\r\n backgroundColor: theme.palette[c].dark,\r\n },\r\n backgroundColor: theme.palette[c].main,\r\n boxShadow: theme.customShadows[c],\r\n color: theme.palette[c].contrastText,\r\n });\r\n\r\n const styleOutlined = (c) => ({\r\n '&:hover': {\r\n backgroundColor: alpha(theme.palette[c].main, theme.palette.action.hoverOpacity),\r\n border: `1px solid ${theme.palette[c].main}`,\r\n },\r\n border: `1px solid ${alpha(theme.palette[c].main, 0.48)}`,\r\n color: theme.palette[c].main,\r\n });\r\n\r\n const styleText = (c) => ({\r\n '&:hover': {\r\n backgroundColor: alpha(theme.palette[c].main, theme.palette.action.hoverOpacity),\r\n },\r\n color: theme.palette[c].main,\r\n });\r\n return {\r\n ...(variant === 'contained' && { ...styleContained(color) }),\r\n ...(variant === 'outlined' && { ...styleOutlined(color) }),\r\n ...(variant === 'text' && { ...styleText(color) }),\r\n };\r\n});\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst MButton = forwardRef(({ children, color = 'primary', variant = 'text', ...other }, ref) => {\r\n if (color === 'inherit' || color === 'primary' || color === 'secondary') {\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n});\r\n\r\nMButton.defaultProps = {\r\n children: undefined,\r\n color: 'inherit',\r\n variant: 'text',\r\n};\r\n\r\nMButton.propTypes = {\r\n children: PropTypes.node,\r\n color: PropTypes.oneOf(['inherit', 'primary', 'secondary', 'info', 'success', 'warning', 'error']),\r\n variant: PropTypes.oneOfType([PropTypes.oneOf(['contained', 'outlined', 'text']), PropTypes.string]),\r\n};\r\n\r\nexport default MButton;\r\n","import { IconButton } from '@material-ui/core';\r\n// material\r\nimport { alpha, useTheme } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport React, { forwardRef } from 'react';\r\n\r\n//\r\nimport { ButtonAnimate } from '../animate';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst MIconButton = forwardRef(({ children, color = 'default', sx, ...other }, ref) => {\r\n const theme = useTheme();\r\n\r\n if (color === 'default' || color === 'inherit' || color === 'primary' || color === 'secondary') {\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n});\r\n\r\nMIconButton.propTypes = {\r\n children: PropTypes.node,\r\n color: PropTypes.oneOf(['default', 'inherit', 'primary', 'secondary', 'info', 'success', 'warning', 'error']),\r\n // eslint-disable-next-line react/forbid-prop-types\r\n sx: PropTypes.object,\r\n};\r\n\r\nexport default MIconButton;\r\n","import { ButtonGroup } from '@material-ui/core';\r\n// material\r\nimport { alpha, experimentalStyled as styled } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport React from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst ButtonGroupStyle = styled(ButtonGroup)(({ styleProps, theme }) => {\r\n const { color, variant } = styleProps;\r\n\r\n const styleContained = (c) => ({\r\n '& .MuiButtonGroup-grouped': {\r\n '&:hover': {\r\n backgroundColor: theme.palette[c].dark,\r\n },\r\n backgroundColor: theme.palette[c].main,\r\n borderColor: `${theme.palette[c].dark} !important`,\r\n color: theme.palette[c].contrastText,\r\n },\r\n boxShadow: theme.customShadows[c],\r\n });\r\n\r\n const styleOutlined = (c) => ({\r\n '& .MuiButtonGroup-grouped': {\r\n '&:hover': {\r\n backgroundColor: alpha(theme.palette[c].main, theme.palette.action.hoverOpacity),\r\n borderColor: `${theme.palette[c].main} !important`,\r\n },\r\n borderColor: `${alpha(theme.palette[c].main, 0.48)} !important`,\r\n color: theme.palette[c].main,\r\n },\r\n });\r\n\r\n const styleText = (c) => ({\r\n '& .MuiButtonGroup-grouped': {\r\n '&:hover': {\r\n backgroundColor: alpha(theme.palette[c].main, theme.palette.action.hoverOpacity),\r\n },\r\n borderColor: `${theme.palette[c].main} !important`,\r\n color: theme.palette[c].main,\r\n },\r\n });\r\n return {\r\n ...(variant === 'contained' && { ...styleContained(color) }),\r\n ...(variant === 'outlined' && { ...styleOutlined(color) }),\r\n ...(variant === 'text' && { ...styleText(color) }),\r\n };\r\n});\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nfunction MButtonGroup({ children, color = 'primary', variant = 'outlined', ...other }) {\r\n if (color === 'inherit' || color === 'primary' || color === 'secondary') {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nMButtonGroup.defaultProps = {\r\n children: PropTypes.node,\r\n color: 'inherit',\r\n variant: 'text',\r\n};\r\n\r\nMButtonGroup.propTypes = {\r\n children: PropTypes.node,\r\n color: PropTypes.oneOf(['inherit', 'primary', 'secondary', 'info', 'success', 'warning', 'error']),\r\n variant: PropTypes.oneOfType([PropTypes.oneOf(['contained', 'outlined', 'text']), PropTypes.string]),\r\n};\r\n\r\nexport default MButtonGroup;\r\n","// material\r\nimport { useMediaQuery } from '@material-ui/core';\r\nimport PropTypes from 'prop-types';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst MHidden = ({ children, width }) => {\r\n const breakpoint = width.substring(0, 2);\r\n\r\n const hiddenUp = useMediaQuery((theme) => theme.breakpoints.up(breakpoint));\r\n const hiddenDown = useMediaQuery((theme) => theme.breakpoints.down(breakpoint));\r\n\r\n if (width.includes('Down')) {\r\n return hiddenDown ? null : children;\r\n }\r\n\r\n if (width.includes('Up')) {\r\n return hiddenUp ? null : children;\r\n }\r\n\r\n return null;\r\n};\r\n\r\nMHidden.defaultProps = {\r\n children: undefined,\r\n width: undefined,\r\n};\r\n\r\nMHidden.propTypes = {\r\n children: PropTypes.node,\r\n width: PropTypes.oneOf(['xsDown', 'smDown', 'mdDown', 'lgDown', 'xlDown', 'xsUp', 'smUp', 'mdUp', 'lgUp', 'xlUp'])\r\n .isRequired,\r\n};\r\n\r\nexport default MHidden;\r\n","import { NotificationsContext } from 'contexts/NotificationsContext';\r\nimport { useContext } from 'react';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst useNotifications = () => useContext(NotificationsContext);\r\n\r\nexport default useNotifications;\r\n","import { Box } from '@material-ui/core';\r\n// material\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport React from 'react';\r\n// ----------------------------------------------------------------------\r\n\r\nexport default function CaravanIcon({ ...other }) {\r\n const theme = useTheme();\r\n const PRIMARY_LIGHTER = theme.palette.primary.lighter;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import eyeFill from '@iconify/icons-eva/eye-fill';\r\nimport eyeOffFill from '@iconify/icons-eva/eye-off-fill';\r\nimport { Icon } from '@iconify/react';\r\n// material\r\nimport {\r\n Alert,\r\n Checkbox,\r\n FormControlLabel,\r\n IconButton,\r\n InputAdornment,\r\n Link,\r\n Stack,\r\n TextField,\r\n} from '@material-ui/core';\r\nimport { LoadingButton } from '@material-ui/lab';\r\nimport { Form, FormikProvider, useFormik } from 'formik';\r\nimport React, { useState } from 'react';\r\nimport { Link as RouterLink } from 'react-router-dom';\r\nimport * as Yup from 'yup';\r\n\r\n// hooks\r\nimport useAuth from '../../../hooks/useAuth';\r\nimport useIsMountedRef from '../../../hooks/useIsMountedRef';\r\n// routes\r\nimport { PATH_AUTH } from '../../../routes/paths';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst LoginForm = () => {\r\n const { login } = useAuth();\r\n const isMountedRef = useIsMountedRef();\r\n const [showPassword, setShowPassword] = useState(false);\r\n\r\n const LoginSchema = Yup.object().shape({\r\n password: Yup.string().required('Le mot de passe est obligatoire.'),\r\n username: Yup.string().required('Le code est obligatoire.'),\r\n });\r\n\r\n const formik = useFormik({\r\n initialValues: {\r\n password: '',\r\n remember: true,\r\n username: '',\r\n },\r\n onSubmit: async ({ password, username }, { resetForm, setErrors, setSubmitting }) => {\r\n try {\r\n await login({ password, username });\r\n if (isMountedRef.current) {\r\n setSubmitting(false);\r\n }\r\n } catch (error) {\r\n resetForm();\r\n if (isMountedRef.current) {\r\n setSubmitting(false);\r\n setErrors({ afterSubmit: 'Erreur: Identifiants invalides' });\r\n }\r\n }\r\n },\r\n validationSchema: LoginSchema,\r\n });\r\n\r\n const { errors, getFieldProps, handleSubmit, isSubmitting, touched, values } = formik;\r\n\r\n const handleShowPassword = () => {\r\n setShowPassword((show) => !show);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default LoginForm;\r\n","import { Box, Card, Container, Stack, Typography } from '@material-ui/core';\r\n// material\r\nimport { experimentalStyled as styled } from '@material-ui/core/styles';\r\nimport CaravanIcon from 'assets/caravan';\r\nimport config from 'config';\r\n// routes\r\nimport React from 'react';\r\n\r\nimport { MHidden } from '../../components/@material-extend';\r\nimport { LoginForm } from '../../components/authentication/login';\r\n// components\r\nimport Page from '../../components/Page';\r\n\r\n// hooks\r\n// ----------------------------------------------------------------------\r\n\r\nconst RootStyle = styled(Page)(({ theme }) => ({\r\n [theme.breakpoints.up('md')]: {\r\n display: 'flex',\r\n },\r\n}));\r\n\r\nconst SectionStyle = styled(Card)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n margin: theme.spacing(2, 0, 2, 2),\r\n maxWidth: 464,\r\n width: '100%',\r\n}));\r\n\r\nconst ContentStyle = styled('div')(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n margin: 'auto',\r\n maxWidth: 480,\r\n minHeight: '100vh',\r\n padding: theme.spacing(12, 0),\r\n}));\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst { siteName } = config;\r\n\r\nconst Login = () => (\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 {siteName}\r\n \r\n Utilisez vos identifiants pour vous connecter.\r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nexport default Login;\r\n","import JSONConfig from './config.json';\r\n\r\nconst env = process.env.NODE_ENV;\r\n\r\nconst config = JSONConfig[env]?.hostname ? JSONConfig[env]?.hostname[window.location.hostname] : JSONConfig[env];\r\n\r\nexport default config;\r\n","import qs from 'querystring';\r\n\r\nimport config from 'config';\r\nimport axios from 'utils/axios';\r\n\r\nconst ROOT_URL = config.apiUrl;\r\n\r\nconst createURL = (urlPath) => `${ROOT_URL}${urlPath}`;\r\n\r\nconst apis = {\r\n addRecord: (record) => axios.post(createURL(`/me/dossiers`), record),\r\n addRow: (numdos, row) => axios.post(createURL(`/me/dossiers/${numdos}`), row),\r\n closeRecord: (recordId) => axios.post(createURL(`/me/dossiers/${recordId}/close`)),\r\n createContact: (contact) => axios.post(createURL(`/me/contacts`), contact),\r\n deleteContact: (contactId) => axios.delete(createURL(`/me/contacts/${contactId}`)),\r\n getContacts: () => axios.get(createURL(`/me/contacts`)),\r\n getDocuments: () => axios.get(createURL(`/documents`)),\r\n getMiniDashboardInfo: () => axios.get(createURL(`/me/mini-dashboard/info`)),\r\n getNotifications: () => axios.get(createURL(`/me/notifications`)),\r\n getRecordDetails: (recordId) => axios.get(createURL(`/me/dossiers/${recordId}`)),\r\n getRecords: ({ status, type }) => axios.get(createURL(`/me/dossiers?status=${status}&type=${type}`)),\r\n getRecordsShouldBeClosed: () => axios.get(createURL(`/me/dossiers/should-be-closed`)),\r\n getStats: () => axios.get(createURL(`/me/stats`)),\r\n login: (credentials) => axios.post(createURL(`/concessionnaires/auth`), credentials),\r\n markRecordDetailsAsSeen: (recordId) => axios.post(createURL(`/me/dossiers/${recordId}/seen`)),\r\n me: () => axios.get(createURL(`/me`)),\r\n searchRecords: ({ fromDate, search, toDate, type }) =>\r\n axios.get(createURL(`/dossiers/search?${qs.stringify({ from_date: fromDate, search, to_date: toDate, type })}`)),\r\n updateContact: (contactId, contactData) => axios.put(createURL(`/me/contacts/${contactId}`), contactData),\r\n};\r\n\r\nexport default apis;\r\n","import { alpha } from '@material-ui/core/styles';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nfunction createGradient(color1, color2) {\r\n return `linear-gradient(to bottom, ${color1}, ${color2})`;\r\n}\r\n\r\n// SETUP COLORS\r\nconst GREY = {\r\n 0: '#FFFFFF',\r\n 100: '#F9FAFB',\r\n 200: '#F4F6F8',\r\n 300: '#DFE3E8',\r\n 400: '#C4CDD5',\r\n 500: '#919EAB',\r\n 500_12: alpha('#919EAB', 0.12),\r\n 500_16: alpha('#919EAB', 0.16),\r\n 500_24: alpha('#919EAB', 0.24),\r\n 500_32: alpha('#919EAB', 0.32),\r\n 500_48: alpha('#919EAB', 0.48),\r\n 500_56: alpha('#919EAB', 0.56),\r\n 500_8: alpha('#919EAB', 0.08),\r\n 500_80: alpha('#919EAB', 0.8),\r\n 600: '#637381',\r\n 700: '#454F5B',\r\n 800: '#212B36',\r\n 900: '#161C24',\r\n};\r\n\r\nconst PRIMARY = {\r\n contrastText: '#fff',\r\n dark: '#007B55',\r\n darker: '#005249',\r\n light: '#5BE584',\r\n lighter: '#C8FACD',\r\n main: '#00AB55',\r\n};\r\nconst SECONDARY = {\r\n contrastText: '#fff',\r\n dark: '#1939B7',\r\n darker: '#091A7A',\r\n light: '#84A9FF',\r\n lighter: '#D6E4FF',\r\n main: '#3366FF',\r\n};\r\nconst INFO = {\r\n contrastText: '#fff',\r\n dark: '#0C53B7',\r\n darker: '#04297A',\r\n light: '#74CAFF',\r\n lighter: '#D0F2FF',\r\n main: '#1890FF',\r\n};\r\nconst SUCCESS = {\r\n contrastText: GREY[800],\r\n dark: '#229A16',\r\n darker: '#08660D',\r\n light: '#AAF27F',\r\n lighter: '#E9FCD4',\r\n main: '#54D62C',\r\n};\r\nconst WARNING = {\r\n contrastText: GREY[800],\r\n dark: '#B78103',\r\n darker: '#7A4F01',\r\n light: '#FFE16A',\r\n lighter: '#FFF7CD',\r\n main: '#FFC107',\r\n};\r\nconst ERROR = {\r\n contrastText: '#fff',\r\n dark: '#B72136',\r\n darker: '#7A0C2E',\r\n light: '#FFA48D',\r\n lighter: '#FFE7D9',\r\n main: '#FF4842',\r\n};\r\n\r\nconst GRADIENTS = {\r\n error: createGradient(ERROR.light, ERROR.main),\r\n info: createGradient(INFO.light, INFO.main),\r\n primary: createGradient(PRIMARY.light, PRIMARY.main),\r\n success: createGradient(SUCCESS.light, SUCCESS.main),\r\n warning: createGradient(WARNING.light, WARNING.main),\r\n};\r\n\r\nconst COMMON = {\r\n action: {\r\n disabled: GREY[500_80],\r\n disabledBackground: GREY[500_24],\r\n disabledOpacity: 0.48,\r\n focus: GREY[500_24],\r\n hover: GREY[500_8],\r\n hoverOpacity: 0.08,\r\n selected: GREY[500_16],\r\n },\r\n common: { black: '#000', white: '#fff' },\r\n divider: GREY[500_24],\r\n error: { ...ERROR },\r\n gradients: GRADIENTS,\r\n grey: GREY,\r\n info: { ...INFO },\r\n primary: { ...PRIMARY },\r\n secondary: { ...SECONDARY },\r\n success: { ...SUCCESS },\r\n warning: { ...WARNING },\r\n};\r\n\r\nconst palette = {\r\n dark: {\r\n ...COMMON,\r\n action: { active: GREY[500], ...COMMON.action },\r\n background: { default: GREY[900], neutral: GREY[500_16], paper: GREY[800] },\r\n text: { disabled: GREY[600], primary: '#fff', secondary: GREY[500] },\r\n },\r\n light: {\r\n ...COMMON,\r\n action: { active: GREY[600], ...COMMON.action },\r\n background: { default: '#fff', neutral: GREY[200], paper: '#fff' },\r\n text: { disabled: GREY[500], primary: GREY[800], secondary: GREY[600] },\r\n },\r\n};\r\n\r\nexport default palette;\r\n","import { useContext } from 'react';\r\n\r\nimport { AuthContext } from '../contexts/JWTContext';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nconst useAuth = () => useContext(AuthContext);\r\n\r\nexport default useAuth;\r\n","// ----------------------------------------------------------------------\r\n\r\nfunction path(root, subLink) {\r\n return `${root}${subLink}`;\r\n}\r\n\r\nconst ROOTS_DASHBOARD = '/dashboard';\r\n\r\n// ----------------------------------------------------------------------\r\n\r\nexport const PATH_AUTH = {\r\n login: path('/login'),\r\n};\r\n\r\nexport const PATH_PAGE = {\r\n maintenance: '/maintenance',\r\n page404: '/404',\r\n page500: '/500',\r\n};\r\n\r\nexport const PATH_DASHBOARD = {\r\n documents: path(ROOTS_DASHBOARD, '/documents'),\r\n overview: path(ROOTS_DASHBOARD, '/overview'),\r\n pieces: path(ROOTS_DASHBOARD, '/pieces'),\r\n piecesReturn: path(ROOTS_DASHBOARD, '/retour-de-pieces'),\r\n recordDetails: path(ROOTS_DASHBOARD, '/dossiers/:id'),\r\n root: ROOTS_DASHBOARD,\r\n technical: path(ROOTS_DASHBOARD, '/techniques'),\r\n};\r\n"],"sourceRoot":""}