\r\n user.isAuthenticated ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n )\r\n }\r\n />\r\n );\r\n};\r\n\r\nAuthenticatedRoute.propTypes = {\r\n component: PropTypes.any.isRequired,\r\n layout: PropTypes.any.isRequired,\r\n path: PropTypes.string,\r\n};\r\n\r\nexport default AuthenticatedRoute;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport clsx from \"clsx\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport { Typography, Link } from \"@material-ui/core\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(4),\r\n background: theme.palette.background.default,\r\n },\r\n}));\r\n\r\nconst Footer = (props) => {\r\n const { className, ...rest } = props;\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n © 2021 \r\n \r\n NextDocSolutions.com\r\n \r\n \r\n \r\n The right appointment with the right provider.\r\n \r\n
\r\n );\r\n};\r\n\r\nFooter.propTypes = {\r\n className: PropTypes.string,\r\n};\r\n\r\nexport default Footer;\r\n","/* eslint-disable react/no-multi-comp */\r\n/* eslint-disable react/display-name */\r\nimport React, { forwardRef } from 'react';\r\nimport { NavLink as RouterLink } from 'react-router-dom';\r\nimport clsx from 'clsx';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles } from '@material-ui/styles';\r\nimport { List, ListItem, Button, colors } from '@material-ui/core';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n root: {},\r\n item: {\r\n display: 'flex',\r\n paddingTop: 0,\r\n paddingBottom: 0\r\n },\r\n button: {\r\n color: colors.blueGrey[800],\r\n padding: '10px 8px',\r\n justifyContent: 'flex-start',\r\n textTransform: 'none',\r\n letterSpacing: 0,\r\n width: '100%',\r\n fontWeight: theme.typography.fontWeightMedium\r\n },\r\n icon: {\r\n color: theme.palette.icon,\r\n width: 24,\r\n height: 24,\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginRight: theme.spacing(1)\r\n },\r\n active: {\r\n color: theme.palette.primary.main,\r\n fontWeight: theme.typography.fontWeightMedium,\r\n '& $icon': {\r\n color: theme.palette.primary.main\r\n }\r\n }\r\n}));\r\n\r\nconst CustomRouterLink = forwardRef((props, ref) => (\r\n \r\n \r\n
\r\n));\r\n\r\nconst SidebarNav = props => {\r\n const { pages, className, ...rest } = props;\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n {pages.map(page => (\r\n \r\n \r\n {page.icon}
\r\n {page.title}\r\n \r\n \r\n ))}\r\n
\r\n );\r\n};\r\n\r\nSidebarNav.propTypes = {\r\n className: PropTypes.string,\r\n pages: PropTypes.array.isRequired\r\n};\r\n\r\nexport default SidebarNav;\r\n","import React from \"react\";\r\nimport clsx from \"clsx\";\r\nimport PropTypes from \"prop-types\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport { Drawer } from \"@material-ui/core\";\r\n// import DashboardIcon from \"@material-ui/icons/Dashboard\";\r\nimport SettingsIcon from \"@material-ui/icons/Settings\";\r\n// import ContactSupportIcon from \"@material-ui/icons/ContactSupport\";\r\nimport TelegramIcon from \"@material-ui/icons/Telegram\";\r\n\r\nimport { SidebarNav } from \"./components\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n drawer: {\r\n width: 240,\r\n [theme.breakpoints.up(\"lg\")]: {\r\n marginTop: 64,\r\n height: \"calc(100% - 64px)\",\r\n },\r\n },\r\n root: {\r\n backgroundColor: theme.palette.white,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n height: \"100%\",\r\n padding: theme.spacing(2),\r\n },\r\n divider: {\r\n margin: theme.spacing(2, 0),\r\n },\r\n nav: {\r\n marginBottom: theme.spacing(2),\r\n },\r\n}));\r\n\r\nconst Sidebar = (props) => {\r\n const { open, variant, onClose, className, ...rest } = props;\r\n\r\n const classes = useStyles();\r\n\r\n const pages = [\r\n {\r\n title: \"Referrals\",\r\n href: \"/referral\",\r\n icon: ,\r\n },\r\n {\r\n title: \"Settings\",\r\n href: \"/settings\",\r\n icon: ,\r\n },\r\n ];\r\n\r\n // const pages = [\r\n // {\r\n // title: \"Dashboard\",\r\n // href: \"/dashboard\",\r\n // icon: ,\r\n // },\r\n // {\r\n // title: \"Referrals\",\r\n // href: \"/referral\",\r\n // icon: ,\r\n // },\r\n // {\r\n // title: \"Settings\",\r\n // href: \"/settings\",\r\n // icon: ,\r\n // },\r\n // {\r\n // title: \"Support\",\r\n // href: \"/support\",\r\n // icon: ,\r\n // },\r\n // ];\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nSidebar.propTypes = {\r\n className: PropTypes.string,\r\n onClose: PropTypes.func,\r\n open: PropTypes.bool.isRequired,\r\n variant: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default Sidebar;\r\n","import React, { useContext } from \"react\";\r\nimport { UserContext } from \"../../../../UserContext\";\r\nimport { Link as RouterLink, useHistory } from \"react-router-dom\";\r\nimport clsx from \"clsx\";\r\nimport PropTypes from \"prop-types\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport { AppBar, Toolbar, Hidden, IconButton } from \"@material-ui/core\";\r\nimport MenuIcon from \"@material-ui/icons/Menu\";\r\nimport InputIcon from \"@material-ui/icons/Input\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n boxShadow: \"none\",\r\n },\r\n flexGrow: {\r\n flexGrow: 1,\r\n },\r\n signOutButton: {\r\n marginLeft: theme.spacing(1),\r\n },\r\n signOutText: {\r\n color: theme.palette.white,\r\n padding: theme.spacing(1),\r\n },\r\n}));\r\n\r\nconst Topbar = (props) => {\r\n const { user, setUser } = useContext(UserContext);\r\n const history = useHistory();\r\n\r\n const currentUser = user.username;\r\n\r\n const { className, onSidebarOpen, ...rest } = props;\r\n\r\n const classes = useStyles();\r\n\r\n const handleSignOut = async (event) => {\r\n event.preventDefault();\r\n\r\n try {\r\n const API_URL =\r\n process.env.NODE_ENV === \"development\"\r\n ? \"http://localhost:4000\"\r\n : \"https://api.nextdrvisit.com\";\r\n\r\n const config = {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Cache: \"no-cache\",\r\n Authorization: `Bearer ${user.accessToken}`,\r\n },\r\n credentials: \"include\",\r\n };\r\n\r\n fetch(API_URL + \"/auth/logout\", config);\r\n setUser({\r\n username: \"\",\r\n isAuthenticated: false,\r\n accessToken: \"\",\r\n tokenExpiresOn: \"\",\r\n });\r\n history.push(\"/sign-in\");\r\n } catch (error) {\r\n history.push(\"/sign-in\");\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n Hi, {currentUser}\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\nTopbar.propTypes = {\r\n className: PropTypes.string,\r\n onSidebarOpen: PropTypes.func,\r\n};\r\n\r\nexport default Topbar;\r\n","import React, { useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport clsx from \"clsx\";\r\nimport { makeStyles, useTheme } from \"@material-ui/styles\";\r\nimport { useMediaQuery } from \"@material-ui/core\";\r\n\r\nimport { Sidebar, Topbar } from \"./components\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n paddingTop: 56,\r\n height: \"100%\",\r\n [theme.breakpoints.up(\"sm\")]: {\r\n paddingTop: 64,\r\n },\r\n },\r\n shiftContent: {\r\n paddingLeft: 240,\r\n },\r\n content: {\r\n height: \"100%\",\r\n },\r\n}));\r\n\r\nconst Main = (props) => {\r\n const { children } = props;\r\n\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const isDesktop = useMediaQuery(theme.breakpoints.up(\"lg\"), {\r\n defaultMatches: true,\r\n });\r\n\r\n const [openSidebar, setOpenSidebar] = useState(false);\r\n\r\n const handleSidebarOpen = () => {\r\n setOpenSidebar(true);\r\n };\r\n\r\n const handleSidebarClose = () => {\r\n setOpenSidebar(false);\r\n };\r\n\r\n const shouldOpenSidebar = isDesktop ? true : openSidebar;\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\n\r\nMain.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport default Main;\r\n","import React from \"react\";\r\nimport { Link as RouterLink } from \"react-router-dom\";\r\nimport clsx from \"clsx\";\r\nimport PropTypes from \"prop-types\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport { AppBar, Toolbar } from \"@material-ui/core\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n boxShadow: \"none\",\r\n },\r\n}));\r\n\r\nconst Topbar = (props) => {\r\n const { className, ...rest } = props;\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nTopbar.propTypes = {\r\n className: PropTypes.string,\r\n};\r\n\r\nexport default Topbar;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles } from '@material-ui/styles';\r\n\r\nimport { Topbar } from './components';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n paddingTop: 64,\r\n height: '100%'\r\n },\r\n content: {\r\n height: '100%'\r\n }\r\n}));\r\n\r\nconst Minimal = props => {\r\n const { children } = props;\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n {children} \r\n
\r\n );\r\n};\r\n\r\nMinimal.propTypes = {\r\n children: PropTypes.node,\r\n className: PropTypes.string\r\n};\r\n\r\nexport default Minimal;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n background: theme.palette.primary.main,\r\n minHeight: \"100vh\",\r\n paddingTop: \"5%\",\r\n height: \"100%\",\r\n },\r\n content: {\r\n height: \"100%\",\r\n },\r\n}));\r\n\r\nconst Login = (props) => {\r\n const { children } = props;\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n {children} \r\n
\r\n );\r\n};\r\n\r\nLogin.propTypes = {\r\n children: PropTypes.node,\r\n className: PropTypes.string,\r\n};\r\n\r\nexport default Login;\r\n","import React, { useContext } from \"react\";\r\nimport { UserContext } from \"../../../../UserContext\";\r\nimport { Link as RouterLink, useHistory } from \"react-router-dom\";\r\nimport clsx from \"clsx\";\r\nimport PropTypes from \"prop-types\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport { AppBar, Toolbar } from \"@material-ui/core\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n boxShadow: \"none\",\r\n },\r\n flexGrow: {\r\n flexGrow: 1,\r\n },\r\n signOutButton: {\r\n marginLeft: theme.spacing(1),\r\n },\r\n signOutText: {\r\n color: theme.palette.white,\r\n padding: theme.spacing(1),\r\n },\r\n}));\r\n\r\nconst Topbar = (props) => {\r\n const { user, setUser } = useContext(UserContext);\r\n const history = useHistory();\r\n\r\n\r\n const { className, onSidebarOpen, ...rest } = props;\r\n\r\n const classes = useStyles();\r\n\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nTopbar.propTypes = {\r\n className: PropTypes.string,\r\n onSidebarOpen: PropTypes.func,\r\n};\r\n\r\nexport default Topbar;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n background: theme.palette.primary.main,\r\n maxHeight: \"100vh\",\r\n height: \"100vh\",\r\n position: \"fixed\",\r\n },\r\n content: {\r\n height: \"100%\",\r\n },\r\n}));\r\n\r\nconst Login = (props) => {\r\n const { children } = props;\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n {children} \r\n
\r\n );\r\n};\r\n\r\nLogin.propTypes = {\r\n children: PropTypes.node,\r\n className: PropTypes.string,\r\n};\r\n\r\nexport default Login;\r\n","import React, { useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport clsx from \"clsx\";\r\nimport { makeStyles, useTheme } from \"@material-ui/styles\";\r\nimport { useMediaQuery } from \"@material-ui/core\";\r\n\r\nimport { Topbar } from \"./components\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n paddingTop: 56,\r\n height: \"100%\",\r\n [theme.breakpoints.up(\"sm\")]: {\r\n paddingTop: 64,\r\n },\r\n },\r\n shiftContent: {\r\n paddingLeft: 10,\r\n },\r\n content: {\r\n height: \"100%\",\r\n },\r\n}));\r\n\r\nconst Main = (props) => {\r\n const { children } = props;\r\n\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const isDesktop = useMediaQuery(theme.breakpoints.up(\"lg\"), {\r\n defaultMatches: true,\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n {children}\r\n {/* */}\r\n \r\n
\r\n );\r\n};\r\n\r\nMain.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport default Main;\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport { Grid, Typography } from \"@material-ui/core\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(4),\r\n },\r\n content: {\r\n paddingTop: 150,\r\n textAlign: \"center\",\r\n },\r\n image: {\r\n marginTop: 50,\r\n display: \"inline-block\",\r\n maxWidth: \"100%\",\r\n width: 560,\r\n },\r\n}));\r\n\r\nconst NotFound = () => {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n
\r\n 404: The page you are looking for isn’t here\r\n \r\n
\r\n You either tried some shady route, or you came here by mistake.\r\n Whichever it is, try using the navigation.\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default NotFound;\r\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport PropTypes from \"prop-types\";\nimport { Doughnut } from \"react-chartjs-2\";\nimport {\n Box,\n Card,\n CardContent,\n CardHeader,\n Divider,\n Typography,\n colors,\n makeStyles,\n useTheme,\n} from \"@material-ui/core\";\n\nimport PriorityHighIcon from \"@material-ui/icons/PriorityHigh\";\n\nimport SentimentSatisfiedAltIcon from \"@material-ui/icons/SentimentSatisfiedAlt\";\n\nimport SentimentSatisfiedIcon from \"@material-ui/icons/SentimentSatisfied\";\n\nimport LowPriorityIcon from \"@material-ui/icons/LowPriority\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n height: \"100%\",\n },\n}));\n\nconst TrafficByTier = ({ className, ...rest }) => {\n const classes = useStyles();\n const theme = useTheme();\n\n const data = {\n datasets: [\n {\n data: [25, 35, 30, 10],\n backgroundColor: [\n theme.palette.ndGreen.main,\n colors.orange[600],\n theme.palette.primary.main,\n colors.red[600],\n ],\n borderWidth: 8,\n borderColor: colors.common.white,\n hoverBorderColor: colors.common.white,\n },\n ],\n labels: [\"ASAP\", \"AM\", \"PM\", \"24hr\"],\n };\n\n const options = {\n animation: false,\n cutoutPercentage: 80,\n layout: { padding: 0 },\n legend: {\n display: false,\n },\n maintainAspectRatio: false,\n responsive: true,\n tooltips: {\n backgroundColor: theme.palette.background.default,\n bodyFontColor: theme.palette.text.secondary,\n borderColor: theme.palette.divider,\n borderWidth: 1,\n enabled: true,\n footerFontColor: theme.palette.text.secondary,\n intersect: false,\n mode: \"index\",\n titleFontColor: theme.palette.text.primary,\n },\n };\n\n const devices = [\n {\n title: \"ASAP\",\n value: 25,\n icon: PriorityHighIcon,\n color: theme.palette.ndGreen.main,\n },\n {\n title: \"AM\",\n value: 35,\n icon: SentimentSatisfiedAltIcon,\n color: colors.orange[600],\n },\n {\n title: \"PM\",\n value: 30,\n icon: SentimentSatisfiedIcon,\n color: theme.palette.primary.main,\n },\n {\n title: \"24hr\",\n value: 10,\n icon: LowPriorityIcon,\n color: colors.red[600],\n },\n ];\n\n return (\n \n \n \n \n \n \n \n \n {devices.map(({ color, icon: Icon, title, value }) => (\n \n \n \n {title}\n \n \n {value}%\n \n \n ))}\n \n \n \n );\n};\n\nTrafficByTier.propTypes = {\n className: PropTypes.string,\n};\n\nexport default TrafficByTier;\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport PropTypes from \"prop-types\";\nimport { Bar } from \"react-chartjs-2\";\nimport {\n Box,\n Button,\n Card,\n CardContent,\n CardHeader,\n Divider,\n useTheme,\n makeStyles,\n colors,\n} from \"@material-ui/core\";\nimport ArrowDropDownIcon from \"@material-ui/icons/ArrowDropDown\";\nimport ArrowRightIcon from \"@material-ui/icons/ArrowRight\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n}));\n\nconst AbandonRate = ({ className, ...rest }) => {\n const classes = useStyles();\n const theme = useTheme();\n\n const data = {\n datasets: [\n {\n backgroundColor: theme.palette.primary.main,\n data: [30, 35, 41, 32, 38, 41, 52],\n label: \"Appointments\",\n },\n {\n backgroundColor: colors.grey[200],\n data: [34, 61, 50, 41, 49, 55, 68],\n label: \"Requests\",\n },\n ],\n labels: [\n \"Jeff Ellis\",\n \"Jane Smith\",\n \"John Doe\",\n \"Curtis Jones\",\n \"Alvin Martinez\",\n \"Ted Lasso\",\n ],\n };\n\n const options = {\n animation: false,\n cornerRadius: 20,\n layout: { padding: 0 },\n legend: { display: false },\n maintainAspectRatio: false,\n responsive: true,\n scales: {\n xAxes: [\n {\n barThickness: 12,\n maxBarThickness: 10,\n barPercentage: 0.5,\n categoryPercentage: 0.5,\n ticks: {\n fontColor: theme.palette.text.secondary,\n },\n gridLines: {\n display: false,\n drawBorder: false,\n },\n },\n ],\n yAxes: [\n {\n ticks: {\n fontColor: theme.palette.text.secondary,\n beginAtZero: true,\n min: 0,\n },\n gridLines: {\n borderDash: [2],\n borderDashOffset: [2],\n color: theme.palette.divider,\n drawBorder: false,\n zeroLineBorderDash: [2],\n zeroLineBorderDashOffset: [2],\n zeroLineColor: theme.palette.divider,\n },\n },\n ],\n },\n tooltips: {\n backgroundColor: theme.palette.background.default,\n bodyFontColor: theme.palette.text.secondary,\n borderColor: theme.palette.divider,\n borderWidth: 1,\n enabled: true,\n footerFontColor: theme.palette.text.secondary,\n intersect: false,\n mode: \"index\",\n titleFontColor: theme.palette.text.primary,\n },\n };\n\n return (\n \n } size=\"small\" variant=\"text\">\n Today\n \n }\n title=\"Appointments Scheduled vs. Appointments Requested - by Agent\"\n />\n \n \n \n \n \n \n \n \n }\n size=\"small\"\n variant=\"text\"\n >\n Details\n \n \n \n );\n};\n\nAbandonRate.propTypes = {\n className: PropTypes.string,\n};\n\nexport default AbandonRate;\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport PropTypes from \"prop-types\";\nimport {\n Avatar,\n Box,\n Card,\n CardContent,\n Grid,\n Typography,\n colors,\n makeStyles,\n} from \"@material-ui/core\";\nimport ArrowDownwardIcon from \"@material-ui/icons/ArrowDownward\";\nimport MoneyIcon from \"@material-ui/icons/Money\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n height: \"100%\",\n },\n avatar: {\n backgroundColor: colors.red[600],\n height: 56,\n width: 56,\n },\n differenceIcon: {\n color: colors.red[900],\n },\n differenceValue: {\n color: colors.red[900],\n marginRight: theme.spacing(1),\n },\n}));\n\nconst AverageHoldTime = ({ className, ...rest }) => {\n const classes = useStyles();\n\n return (\n \n \n \n \n \n AVG HOLD TIME\n \n \n 3m 27s\n \n \n \n \n \n \n \n \n \n \n \n 12%\n \n \n Since last month\n \n \n \n \n );\n};\n\nAverageHoldTime.propTypes = {\n className: PropTypes.string,\n};\n\nexport default AverageHoldTime;\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport PropTypes from \"prop-types\";\nimport {\n Avatar,\n Box,\n Card,\n CardContent,\n Grid,\n Typography,\n makeStyles,\n} from \"@material-ui/core\";\nimport ArrowDownwardIcon from \"@material-ui/icons/ArrowDownward\";\nimport MoneyIcon from \"@material-ui/icons/Money\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n height: \"100%\",\n },\n avatar: {\n backgroundColor: theme.palette.ndGreen.main,\n height: 56,\n width: 56,\n },\n differenceIcon: {\n color: theme.palette.ndGreen.main,\n },\n differenceValue: {\n color: theme.palette.ndGreen.dark,\n marginRight: theme.spacing(1),\n },\n}));\n\nconst AbandonRateNew = ({ className, ...rest }) => {\n const classes = useStyles();\n\n return (\n \n \n \n \n \n ABANDON RATE\n \n \n 3%\n \n \n \n \n \n \n \n \n \n \n \n 14%\n \n \n Since last month\n \n \n \n \n );\n};\n\nAbandonRateNew.propTypes = {\n className: PropTypes.string,\n};\n\nexport default AbandonRateNew;\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport PropTypes from \"prop-types\";\nimport {\n Avatar,\n Box,\n Card,\n CardContent,\n Grid,\n Typography,\n makeStyles,\n colors,\n} from \"@material-ui/core\";\nimport ArrowUpwardIcon from \"@material-ui/icons/ArrowUpward\";\nimport PeopleIcon from \"@material-ui/icons/PeopleOutlined\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n height: \"100%\",\n },\n avatar: {\n backgroundColor: colors.orange[600],\n height: 56,\n width: 56,\n },\n differenceIcon: {\n color: colors.orange[600],\n },\n differenceValue: {\n color: colors.orange[600],\n marginRight: theme.spacing(1),\n },\n}));\n\nconst TotalCustomers = ({ className, ...rest }) => {\n const classes = useStyles();\n\n return (\n \n \n \n \n \n TOTAL PATIENTS\n \n \n 4,142\n \n \n \n \n \n \n \n \n \n \n \n 16%\n \n \n Since last month\n \n \n \n \n );\n};\n\nTotalCustomers.propTypes = {\n className: PropTypes.string,\n};\n\nexport default TotalCustomers;\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport PropTypes from \"prop-types\";\nimport {\n Avatar,\n Card,\n CardContent,\n Grid,\n Typography,\n makeStyles,\n} from \"@material-ui/core\";\nimport AttachMoneyIcon from \"@material-ui/icons/AttachMoney\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n height: \"100%\",\n },\n avatar: {\n backgroundColor: theme.palette.primary.main,\n height: 56,\n width: 56,\n },\n}));\n\nconst TotalProfit = ({ className, ...rest }) => {\n const classes = useStyles();\n\n return (\n \n \n \n \n \n TOTAL PROFIT\n \n \n $1,482,798\n \n \n \n \n \n \n \n \n \n \n );\n};\n\nTotalProfit.propTypes = {\n className: PropTypes.string,\n};\n\nexport default TotalProfit;\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport { Grid } from \"@material-ui/core\";\r\nimport {\r\n TrafficByTier,\r\n AbandonRate,\r\n AverageHoldTime,\r\n TotalCustomers,\r\n AbandonRateNew,\r\n TotalProfit,\r\n} from \"./components\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n backgroundColor: theme.palette.background.default,\r\n minHeight: \"100%\",\r\n padding: theme.spacing(4),\r\n },\r\n}));\r\n\r\nconst Dashboard = () => {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default Dashboard;\r\n","const apiUrl =\n process.env.NODE_ENV === \"development\"\n ? \"http://localhost:4000\"\n : \"https://api.nextdrvisit.com\";\n\nexport default apiUrl;\n","import React, { useState, useEffect, useContext } from \"react\";\r\nimport { Link as RouterLink, withRouter } from \"react-router-dom\";\r\nimport { UserContext } from \"../../UserContext\";\r\nimport apiUrl from \"../../common/apiUrl.js\";\r\nimport validate from \"validate.js\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport {\r\n Grid,\r\n Button,\r\n TextField,\r\n Link,\r\n Typography,\r\n Card,\r\n CardContent,\r\n} from \"@material-ui/core\";\r\nimport Alert from \"@material-ui/lab/Alert\";\r\n\r\nconst schema = {\r\n email: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n maximum: 64,\r\n },\r\n },\r\n password: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n maximum: 128,\r\n },\r\n },\r\n};\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n background: \"#4770b7\",\r\n height: \"100%\",\r\n width: \"100%\",\r\n },\r\n grid: {\r\n spacing: 0,\r\n display: \"flex\",\r\n direction: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n paddingTop: theme.spacing(7),\r\n },\r\n cardBg: {\r\n backgroundColor: theme.palette.background.default,\r\n borderWidth: \"2px\",\r\n },\r\n form: {\r\n paddingTop: 50,\r\n paddingLeft: 50,\r\n paddingRight: 50,\r\n paddingBottom: 50,\r\n flexBasis: 500,\r\n [theme.breakpoints.down(\"sm\")]: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n },\r\n },\r\n title: {\r\n marginBottom: theme.spacing(2),\r\n fontFamily: \"Source Sans Pro\",\r\n fontWeight: 900,\r\n },\r\n input: {\r\n background: \"white\",\r\n },\r\n textField: {\r\n marginTop: theme.spacing(2),\r\n },\r\n signInButton: {\r\n margin: theme.spacing(4, 0),\r\n },\r\n resMessage: {\r\n marginTop: theme.spacing(2),\r\n },\r\n logo: {\r\n marginTop: theme.spacing(5),\r\n marginBottom: theme.spacing(1),\r\n display: \"flex\",\r\n direction: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n}));\r\n\r\nconst SignIn = () => {\r\n const classes = useStyles();\r\n\r\n const [severity, setSeverity] = useState(\"\");\r\n const [message, setMessage] = useState(\"\");\r\n const [formState, setFormState] = useState({\r\n isValid: false,\r\n values: {},\r\n touched: {},\r\n errors: {},\r\n });\r\n\r\n useEffect(() => {\r\n const errors = validate(formState.values, schema);\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n isValid: errors ? false : true,\r\n errors: errors || {},\r\n }));\r\n }, [formState.values]);\r\n\r\n const handleChange = (event) => {\r\n event.persist();\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\"\r\n ? event.target.checked\r\n : event.target.value,\r\n },\r\n touched: {\r\n ...formState.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const { setUser } = useContext(UserContext);\r\n const handleSignIn = async (event) => {\r\n event.preventDefault();\r\n const email = formState.values.email;\r\n const password = formState.values.password;\r\n\r\n const config = {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Cache: \"no-cache\",\r\n },\r\n credentials: \"include\",\r\n body: JSON.stringify({\r\n username: email,\r\n password: password,\r\n }),\r\n };\r\n\r\n try {\r\n const response = await fetch(apiUrl + \"/auth/rlogin\", config);\r\n const data = await response.json();\r\n\r\n if (data) {\r\n setUser({\r\n username: data.username,\r\n isAuthenticated: data.isAuthenticated,\r\n customerStatus: data.customerStatus,\r\n accessToken: data.accessToken,\r\n tokenExpiresOn: data.tokenExpiresOn,\r\n });\r\n\r\n if (data.severity !== \"success\") {\r\n setSeverity(data.severity);\r\n setMessage(data.message);\r\n }\r\n }\r\n } catch (error) {\r\n setSeverity(\"error\");\r\n setMessage(error.message);\r\n return error;\r\n }\r\n };\r\n\r\n const hasError = (field) =>\r\n formState.touched[field] && formState.errors[field] ? true : false;\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default withRouter(SignIn);\r\n","import React, { useState, useEffect } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport validate from \"validate.js\";\nimport PropTypes from \"prop-types\";\nimport apiUrl from \"../../common/apiUrl.js\";\nimport { makeStyles } from \"@material-ui/styles\";\nimport {\n Card,\n CardContent,\n Button,\n TextField,\n Grid,\n Typography,\n} from \"@material-ui/core\";\nimport Alert from \"@material-ui/lab/Alert\";\n\nconst schema = {\n email: {\n presence: { allowEmpty: false, message: \"is required\" },\n email: true,\n length: {\n maximum: 64,\n },\n },\n};\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n height: \"100%\",\n },\n grid: {\n spacing: 0,\n display: \"flex\",\n direction: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingTop: theme.spacing(7),\n },\n cardBg: {\n backgroundColor: theme.palette.background.default,\n borderWidth: \"2px\",\n },\n form: {\n paddingTop: 50,\n paddingLeft: 50,\n paddingRight: 50,\n paddingBottom: 50,\n flexBasis: 500,\n [theme.breakpoints.down(\"sm\")]: {\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(2),\n },\n },\n title: {\n marginBottom: theme.spacing(2),\n fontFamily: \"Source Sans Pro\",\n fontWeight: 900,\n },\n input: {\n background: \"white\",\n },\n textField: {\n marginTop: theme.spacing(2),\n },\n submitButton: {\n margin: theme.spacing(4, 0),\n },\n resMessage: {\n marginTop: theme.spacing(2),\n },\n logo: {\n marginTop: theme.spacing(5),\n marginBottom: theme.spacing(1),\n display: \"flex\",\n direction: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n subTitle: {\n paddingLeft: \"2px\",\n paddingRight: \"2px\",\n color: \"rgba(0, 0, 0, 0.65)\",\n },\n}));\n\nconst ForgotPassword = () => {\n const classes = useStyles();\n\n const [severity, setSeverity] = useState(\"\");\n const [message, setMessage] = useState(\"\");\n const [formState, setFormState] = useState({\n isValid: false,\n values: {\n email: \"\",\n },\n touched: {},\n errors: {},\n isLoading: false,\n });\n\n useEffect(() => {\n const errors = validate(formState.values, schema);\n\n setFormState((formState) => ({\n ...formState,\n isValid: errors ? false : true,\n errors: errors || {},\n }));\n }, [formState.values]);\n\n const handleChange = (event) => {\n event.persist();\n\n setFormState((formState) => ({\n ...formState,\n values: {\n ...formState.values,\n [event.target.name]:\n event.target.type === \"checkbox\"\n ? event.target.checked\n : event.target.value,\n },\n touched: {\n ...formState.touched,\n [event.target.name]: true,\n },\n }));\n };\n\n const handleSubmit = async (e) => {\n e.preventDefault();\n\n setFormState((formState) => ({\n ...formState,\n isLoading: true,\n }));\n\n try {\n const response = await fetch(apiUrl + \"/auth/partner-forgot-password\", {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Cache: \"no-cache\",\n },\n credentials: \"include\",\n body: JSON.stringify({\n email: formState.values.email,\n }),\n });\n\n const data = await response.json();\n\n if (data) {\n setFormState((formState) => ({\n ...formState,\n isLoading: false,\n }));\n\n setSeverity(data.severity);\n setMessage(data.message);\n }\n } catch (e) {\n setFormState((formState) => ({\n ...formState,\n isLoading: false,\n }));\n\n setSeverity(\"error\");\n setMessage(\n \"There was a problem sending your reset email. Please try again.\"\n );\n return e;\n }\n };\n\n const hasError = (field) =>\n formState.touched[field] && formState.errors[field] ? true : false;\n\n return (\n \n
\n \n \n \n \n
\n
\n \n \n \n \n \n
\n );\n};\n\nForgotPassword.propTypes = {\n className: PropTypes.string,\n};\n\nexport default ForgotPassword;\n","import React, { useState, useEffect } from \"react\";\r\nimport { useParams, useHistory } from \"react-router-dom\";\r\nimport validate from \"validate.js\";\r\nimport PropTypes from \"prop-types\";\r\nimport apiUrl from \"../../common/apiUrl.js\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport {\r\n Card,\r\n CardContent,\r\n Button,\r\n TextField,\r\n Grid,\r\n Typography,\r\n} from \"@material-ui/core\";\r\nimport Alert from \"@material-ui/lab/Alert\";\r\n\r\nconst schema = {\r\n newPassword: {\r\n presence: true,\r\n format: {\r\n pattern:\r\n \"^(?=[ -~]*?[A-Z])(?=[ -~]*?[a-z])(?=[ -~]*?[0-9])(?=[ -~]*?[#?()_+=~`!@$%^&*-])[ -~]{8,72}$\",\r\n flags: \"i\",\r\n message:\r\n \"requires a minimum of eight characters, at least one uppercase letter, one lowercase letter, one number, and one special character\",\r\n },\r\n },\r\n confirm: {\r\n presence: true,\r\n equality: {\r\n attribute: \"newPassword\",\r\n message: \"^The passwords do not match\",\r\n },\r\n },\r\n};\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n height: \"100%\",\r\n },\r\n grid: {\r\n spacing: 0,\r\n display: \"flex\",\r\n direction: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n paddingTop: theme.spacing(7),\r\n },\r\n cardBg: {\r\n backgroundColor: theme.palette.background.default,\r\n borderWidth: \"2px\",\r\n },\r\n contentHeader: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n paddingTop: theme.spacing(5),\r\n paddingBottom: theme.spacing(2),\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n },\r\n contentBody: {\r\n flexGrow: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n form: {\r\n paddingTop: 50,\r\n paddingLeft: 50,\r\n paddingRight: 50,\r\n paddingBottom: 50,\r\n flexBasis: 500,\r\n [theme.breakpoints.down(\"sm\")]: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n },\r\n },\r\n title: {\r\n marginBottom: theme.spacing(2),\r\n fontFamily: \"Source Sans Pro\",\r\n fontWeight: 900,\r\n },\r\n input: {\r\n background: \"white\",\r\n },\r\n textField: {\r\n marginTop: theme.spacing(2),\r\n },\r\n submitButton: {\r\n margin: theme.spacing(4, 0),\r\n },\r\n resMessage: {\r\n marginTop: theme.spacing(2),\r\n },\r\n logo: {\r\n marginTop: theme.spacing(5),\r\n marginBottom: theme.spacing(5),\r\n display: \"flex\",\r\n direction: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n linkExpired: {\r\n paddingTop: theme.spacing(4),\r\n },\r\n}));\r\n\r\nconst ResetPassword = (props) => {\r\n const classes = useStyles();\r\n\r\n const [severity, setSeverity] = useState(\"\");\r\n const [message, setMessage] = useState(\"\");\r\n const [link, setLink] = useState(\"\");\r\n const [formState, setFormState] = useState({\r\n isValid: false,\r\n values: {\r\n newPassword: \"\",\r\n confirm: \"\",\r\n },\r\n touched: {},\r\n errors: {},\r\n isTokenValid: false,\r\n isLoading: false,\r\n });\r\n\r\n let history = useHistory();\r\n const { token } = useParams();\r\n\r\n const testAlphaNumeric = new RegExp(/^[a-z0-9]+$/i);\r\n const isAlpha = testAlphaNumeric.test(token);\r\n const tokenLength = token.length;\r\n\r\n if (!isAlpha || !tokenLength === 64) {\r\n history.push(\"/sign-in\");\r\n }\r\n\r\n useEffect(() => {\r\n const config = {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Cache: \"no-cache\",\r\n },\r\n credentials: \"include\",\r\n body: JSON.stringify({\r\n resetToken: token,\r\n }),\r\n };\r\n\r\n const fetchData = async () => {\r\n try {\r\n const response = await fetch(`${apiUrl}/auth/validate-token`, config);\r\n const tokenData = await response.json();\r\n\r\n if (tokenData.data === \"\") {\r\n setFormState((formState) => ({\r\n ...formState,\r\n isTokenValid: false,\r\n }));\r\n } else {\r\n setFormState((formState) => ({\r\n ...formState,\r\n isTokenValid: true,\r\n }));\r\n }\r\n } catch (error) {\r\n setFormState((formState) => ({\r\n ...formState,\r\n isTokenValid: false,\r\n }));\r\n }\r\n };\r\n fetchData();\r\n }, [token, history]);\r\n\r\n useEffect(() => {\r\n const errors = validate(formState.values, schema);\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n isValid: errors ? false : true,\r\n errors: errors || {},\r\n }));\r\n }, [formState.values]);\r\n\r\n const handleChange = (event) => {\r\n event.persist();\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\"\r\n ? event.target.checked\r\n : event.target.value,\r\n },\r\n touched: {\r\n ...formState.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const handleSubmit = async (e) => {\r\n e.preventDefault();\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n isLoading: true,\r\n }));\r\n\r\n try {\r\n const res = await fetch(apiUrl + \"/auth/reset-password\", {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Cache: \"no-cache\",\r\n },\r\n credentials: \"include\",\r\n body: JSON.stringify({\r\n resetToken: token,\r\n password: formState.values.newPassword,\r\n }),\r\n });\r\n\r\n const data = await res.json();\r\n\r\n if (data) {\r\n setFormState((formState) => ({\r\n ...formState,\r\n isLoading: false,\r\n }));\r\n setSeverity(data.severity);\r\n setMessage(data.message);\r\n if (data.link) {\r\n setLink(data.link);\r\n }\r\n }\r\n } catch (error) {\r\n setFormState((formState) => ({\r\n ...formState,\r\n isLoading: false,\r\n }));\r\n\r\n setSeverity(\"error\");\r\n setMessage(error.message);\r\n\r\n return error;\r\n }\r\n };\r\n\r\n const handleExpiredSubmit = async (e) => {\r\n e.preventDefault();\r\n history.push(\"/forgot-password\");\r\n };\r\n\r\n const hasError = (field) =>\r\n formState.touched[field] && formState.errors[field] ? true : false;\r\n\r\n return (\r\n \r\n {!formState.isTokenValid ? (\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n Your password reset link has expired. Please click the\r\n button below to send an updated reset link.\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n ) : (\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nResetPassword.propTypes = {\r\n className: PropTypes.string,\r\n};\r\n\r\nexport default ResetPassword;\r\n","import React, { useState, useContext, useEffect } from 'react';\r\nimport { useFetch } from '../../../../common/useFetch';\r\nimport { fetchData } from '../../../../common/fetchData';\r\nimport { UserContext } from '../../../../UserContext';\r\nimport validate from 'validate.js';\r\nimport clsx from 'clsx';\r\nimport Snackbar from '@material-ui/core/Snackbar';\r\nimport MuiAlert from '@material-ui/lab/Alert';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles } from '@material-ui/styles';\r\nimport jwt_decode from 'jwt-decode';\r\nimport {\r\n Card,\r\n CardHeader,\r\n CardContent,\r\n CardActions,\r\n Divider,\r\n Grid,\r\n Button,\r\n TextField\r\n} from '@material-ui/core';\r\n\r\nconst schema = {\r\n firstName: {\r\n presence: true,\r\n length: {\r\n minimum: 1,\r\n maximum: 20\r\n },\r\n format: {\r\n pattern: '[a-z0-9]+',\r\n flags: 'i',\r\n message: 'can only contain a-z and 0-9'\r\n }\r\n },\r\n lastName: {\r\n presence: true,\r\n length: {\r\n minimum: 1,\r\n maximum: 20\r\n },\r\n format: {\r\n pattern: '[a-z0-9]+',\r\n flags: 'i',\r\n message: 'can only contain a-z and 0-9'\r\n }\r\n },\r\n email: {\r\n presence: { allowEmpty: false, message: 'is required' },\r\n email: true,\r\n length: {\r\n maximum: 64\r\n }\r\n },\r\n phone: {\r\n presence: { allowEmpty: false, message: 'is required 123-456-7890' },\r\n length: {\r\n maximum: 12\r\n }\r\n }\r\n};\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {}\r\n}));\r\n\r\nfunction Alert(props) {\r\n return ;\r\n}\r\n\r\nconst AccountDetails = (props) => {\r\n const [formState, setFormState] = useState({\r\n isValid: false,\r\n values: {\r\n firstName: '',\r\n lastName: '',\r\n email: '',\r\n phone: '',\r\n role: '',\r\n coach: ''\r\n },\r\n touched: {},\r\n errors: {},\r\n isLoading: false\r\n });\r\n\r\n const [openSnack, setOpenSnack] = useState(false);\r\n const [openErrorSnack, setOpenErrorSnack] = useState(false);\r\n\r\n const handleClose = (event, reason) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n\r\n setOpenSnack(false);\r\n setOpenErrorSnack(false);\r\n };\r\n\r\n const { user, setUser } = useContext(UserContext);\r\n const { userId } = jwt_decode(user.accessToken);\r\n\r\n const config = {\r\n method: 'POST',\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n Cache: 'no-cache',\r\n Authorization: `Bearer ${user.accessToken}`\r\n },\r\n credentials: 'include',\r\n body: JSON.stringify({\r\n currentUserId: userId\r\n })\r\n };\r\n\r\n const { data } = useFetch('/user/me', config);\r\n\r\n useEffect(() => {\r\n if (data) {\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n firstName: data.user.first_name,\r\n lastName: data.user.last_name,\r\n email: data.user.email,\r\n phone: data.user.mobile_phone\r\n }\r\n }));\r\n }\r\n // eslint-disable-next-line\r\n }, [data]);\r\n\r\n useEffect(() => {\r\n const errors = validate(formState.values, schema);\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n isValid: errors ? false : true,\r\n errors: errors || {}\r\n }));\r\n }, [formState.values]);\r\n\r\n const handleChange = (event) => {\r\n event.persist();\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n [event.target.name]:\r\n event.target.type === 'checkbox'\r\n ? event.target.checked\r\n : event.target.value\r\n },\r\n touched: {\r\n ...formState.touched,\r\n [event.target.name]: true\r\n }\r\n }));\r\n };\r\n\r\n const handleSubmit = async (e) => {\r\n e.preventDefault();\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n isLoading: true\r\n }));\r\n\r\n try {\r\n const { data, newUser } = await fetchData(\r\n '/user',\r\n user.accessToken,\r\n 'PUT',\r\n {\r\n userId: userId,\r\n first_name: formState.values.firstName,\r\n last_name: formState.values.lastName,\r\n email: formState.values.email,\r\n mobile_phone: formState.values.phone\r\n }\r\n );\r\n\r\n if (data) {\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n firstName: data.user.first_name,\r\n lastName: data.user.last_name,\r\n email: data.user.email,\r\n phone: data.user.mobile_phone\r\n },\r\n isLoading: false\r\n }));\r\n }\r\n setOpenSnack(true);\r\n\r\n if (newUser) {\r\n setUser(newUser);\r\n }\r\n } catch (e) {\r\n setFormState((formState) => ({\r\n ...formState,\r\n isLoading: false\r\n }));\r\n setOpenErrorSnack(true);\r\n return e;\r\n }\r\n };\r\n\r\n const { className, ...rest } = props;\r\n\r\n const classes = useStyles();\r\n\r\n const hasError = (field) =>\r\n formState.touched[field] && formState.errors[field] ? true : false;\r\n\r\n return (\r\n \r\n
\r\n \r\n User updated successfully!\r\n \r\n \r\n
\r\n \r\n User update failed. Please try again.\r\n \r\n \r\n\r\n
\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nAccountDetails.propTypes = {\r\n className: PropTypes.string\r\n};\r\n\r\nexport default AccountDetails;\r\n","import React, { useState, useContext, useEffect } from 'react';\r\nimport validate from 'validate.js';\r\nimport PropTypes from 'prop-types';\r\nimport { fetchData } from '../../../../common/fetchData';\r\nimport clsx from 'clsx';\r\nimport Snackbar from '@material-ui/core/Snackbar';\r\nimport MuiAlert from '@material-ui/lab/Alert';\r\nimport { UserContext } from '../../../../UserContext';\r\nimport { makeStyles } from '@material-ui/styles';\r\nimport jwt_decode from 'jwt-decode';\r\nimport {\r\n Card,\r\n CardHeader,\r\n CardContent,\r\n CardActions,\r\n Divider,\r\n Button,\r\n TextField\r\n} from '@material-ui/core';\r\n\r\nconst schema = {\r\n currentPassword: {\r\n presence: true,\r\n length: {\r\n minimum: 8,\r\n maximum: 100\r\n }\r\n },\r\n newPassword: {\r\n presence: true,\r\n format: {\r\n pattern:\r\n '^(?=[ -~]*?[A-Z])(?=[ -~]*?[a-z])(?=[ -~]*?[0-9])(?=[ -~]*?[#?!@$%^&*-])[ -~]{8,72}$',\r\n flags: 'i',\r\n message:\r\n 'requires a minimum eight characters, at least one uppercase letter, one lowercase letter, one number, and one special character'\r\n }\r\n },\r\n confirm: {\r\n presence: true,\r\n equality: {\r\n attribute: 'newPassword',\r\n message: '^The passwords do not match'\r\n }\r\n }\r\n};\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {}\r\n}));\r\n\r\nfunction Alert(props) {\r\n return ;\r\n}\r\n\r\nconst AccountPassword = props => {\r\n const [openSnack, setOpenSnack] = useState(false);\r\n const [openErrorSnack, setOpenErrorSnack] = useState(false);\r\n\r\n const handleClose = (event, reason) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n\r\n setOpenSnack(false);\r\n setOpenErrorSnack(false);\r\n };\r\n\r\n const [formState, setFormState] = useState({\r\n isValid: false,\r\n values: {\r\n currentPassword: '',\r\n newPassword: '',\r\n confirm: ''\r\n },\r\n touched: {},\r\n errors: {},\r\n isLoading: false\r\n });\r\n\r\n useEffect(() => {\r\n const errors = validate(formState.values, schema);\r\n\r\n setFormState(formState => ({\r\n ...formState,\r\n isValid: errors ? false : true,\r\n errors: errors || {}\r\n }));\r\n }, [formState.values]);\r\n\r\n const handleChange = event => {\r\n event.persist();\r\n\r\n setFormState(formState => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n [event.target.name]:\r\n event.target.type === 'checkbox'\r\n ? event.target.checked\r\n : event.target.value\r\n },\r\n touched: {\r\n ...formState.touched,\r\n [event.target.name]: true\r\n }\r\n }));\r\n };\r\n\r\n const { user, setUser } = useContext(UserContext);\r\n const { userId } = jwt_decode(user.accessToken);\r\n\r\n const handleSubmit = async e => {\r\n e.preventDefault();\r\n\r\n setFormState(formState => ({\r\n ...formState,\r\n isLoading: true\r\n }));\r\n\r\n try {\r\n const { data, newUser } = await fetchData(\r\n '/user/pw',\r\n user.accessToken,\r\n 'PUT',\r\n {\r\n userId: userId,\r\n currentPassword: formState.values.currentPassword,\r\n newPassword: formState.values.newPassword\r\n }\r\n );\r\n\r\n if (data) {\r\n setFormState(formState => ({\r\n ...formState,\r\n isLoading: false\r\n }));\r\n }\r\n setOpenSnack(true);\r\n\r\n if (newUser) {\r\n setUser(newUser);\r\n }\r\n } catch (e) {\r\n setFormState(formState => ({\r\n ...formState,\r\n isLoading: false\r\n }));\r\n setOpenErrorSnack(true);\r\n return e;\r\n }\r\n };\r\n\r\n const { className, ...rest } = props;\r\n\r\n const classes = useStyles();\r\n\r\n const hasError = field =>\r\n formState.touched[field] && formState.errors[field] ? true : false;\r\n\r\n return (\r\n \r\n
\r\n \r\n Password updated successfully!\r\n \r\n \r\n
\r\n \r\n Password update failed. Please try again.\r\n \r\n \r\n\r\n
\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nAccountPassword.propTypes = {\r\n className: PropTypes.string\r\n};\r\n\r\nexport default AccountPassword;\r\n","import React from \"react\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Grid from \"@material-ui/core/Grid\";\nimport List from \"@material-ui/core/List\";\nimport Card from \"@material-ui/core/Card\";\nimport CardHeader from \"@material-ui/core/CardHeader\";\nimport ListItem from \"@material-ui/core/ListItem\";\nimport ListItemText from \"@material-ui/core/ListItemText\";\nimport ListItemIcon from \"@material-ui/core/ListItemIcon\";\nimport Checkbox from \"@material-ui/core/Checkbox\";\nimport Button from \"@material-ui/core/Button\";\nimport Divider from \"@material-ui/core/Divider\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n margin: \"auto\",\n },\n cardHeader: {\n padding: theme.spacing(1, 2),\n },\n list: {\n width: 200,\n height: 230,\n backgroundColor: theme.palette.background.paper,\n overflow: \"auto\",\n },\n button: {\n margin: theme.spacing(0.5, 0),\n },\n}));\n\nfunction not(a, b) {\n return a.filter((value) => b.indexOf(value) === -1);\n}\n\nfunction intersection(a, b) {\n return a.filter((value) => b.indexOf(value) !== -1);\n}\n\nfunction union(a, b) {\n return [...a, ...not(b, a)];\n}\n\nexport default function LocationList() {\n const classes = useStyles();\n const [checked, setChecked] = React.useState([]);\n const [left, setLeft] = React.useState([0, 1, 2, 3]);\n const [right, setRight] = React.useState([4, 5, 6, 7]);\n\n const leftChecked = intersection(checked, left);\n const rightChecked = intersection(checked, right);\n\n const handleToggle = (value) => () => {\n const currentIndex = checked.indexOf(value);\n const newChecked = [...checked];\n\n if (currentIndex === -1) {\n newChecked.push(value);\n } else {\n newChecked.splice(currentIndex, 1);\n }\n\n setChecked(newChecked);\n };\n\n const numberOfChecked = (items) => intersection(checked, items).length;\n\n const handleToggleAll = (items) => () => {\n if (numberOfChecked(items) === items.length) {\n setChecked(not(checked, items));\n } else {\n setChecked(union(checked, items));\n }\n };\n\n const handleCheckedRight = () => {\n setRight(right.concat(leftChecked));\n setLeft(not(left, leftChecked));\n setChecked(not(checked, leftChecked));\n };\n\n const handleCheckedLeft = () => {\n setLeft(left.concat(rightChecked));\n setRight(not(right, rightChecked));\n setChecked(not(checked, rightChecked));\n };\n\n const customList = (title, items) => (\n \n \n }\n title={title}\n subheader={`${numberOfChecked(items)}/${items.length} selected`}\n />\n \n \n {items.map((value) => {\n const labelId = `transfer-list-all-item-${value}-label`;\n\n return (\n \n \n \n \n \n \n );\n })}\n \n
\n \n );\n\n return (\n \n {customList(\"Locations Available\", left)} \n \n \n \n >\n \n \n <\n \n \n \n {customList(\"Locations Assigned\", right)} \n \n );\n}\n","import React, { useState, useEffect } from \"react\";\r\nimport {\r\n TextField,\r\n Grid,\r\n Button,\r\n Card,\r\n Divider,\r\n CardContent,\r\n CardActions,\r\n CardHeader,\r\n MenuItem,\r\n makeStyles,\r\n Typography,\r\n} from \"@material-ui/core\";\r\nimport validate from \"validate.js\";\r\nimport LocationList from \"./LocationList\";\r\n\r\nconst schema = {\r\n first_name: {\r\n presence: true,\r\n length: {\r\n minimum: 1,\r\n maximum: 20,\r\n },\r\n format: {\r\n pattern: \"[a-z0-9]+\",\r\n flags: \"i\",\r\n message: \"can only contain a-z and 0-9\",\r\n },\r\n },\r\n last_name: {\r\n presence: true,\r\n length: {\r\n minimum: 1,\r\n maximum: 20,\r\n },\r\n format: {\r\n pattern: \"[a-z0-9]+\",\r\n flags: \"i\",\r\n message: \"can only contain a-z and 0-9\",\r\n },\r\n },\r\n email: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n email: true,\r\n length: {\r\n maximum: 64,\r\n },\r\n },\r\n mobile_phone: {\r\n presence: {\r\n allowEmpty: false,\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n length: {\r\n minimum: 12,\r\n },\r\n format: {\r\n pattern: \"^(\\\\+0?1\\\\s)?\\\\(?\\\\d{3}\\\\)?[\\\\s.-]\\\\d{3}[\\\\s.-]\\\\d{4}$\",\r\n flags: \"i\",\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n },\r\n};\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n cardHeaderTitle: {\r\n color: \"#FFFFFF\",\r\n fontSize: \"1rem\",\r\n fontWeight: 600,\r\n },\r\n cardSubHeaderTitle: {\r\n color: \"#FFFFFF\",\r\n },\r\n cardHeaderBackground: {\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n}));\r\n\r\nconst AddUserForm = (props) => {\r\n const classes = useStyles();\r\n\r\n const initialFormState = {\r\n isValid: false,\r\n values: {\r\n first_name: \"\",\r\n last_name: \"\",\r\n mobile_phone: \"\",\r\n email: \"\",\r\n role: 3,\r\n isAgent: false,\r\n password: \"\",\r\n confirm: \"\",\r\n },\r\n touched: {},\r\n errors: {},\r\n isLoading: false,\r\n };\r\n\r\n const [user, setUser] = useState(initialFormState);\r\n const [roles] = useState([\r\n { id: 2, role: \"Admin\" },\r\n { id: 3, role: \"User\" },\r\n ]);\r\n\r\n useEffect(() => {\r\n const errors = validate(user.values, schema);\r\n\r\n setUser((user) => ({\r\n ...user,\r\n isValid: errors ? false : true,\r\n errors: errors || {},\r\n }));\r\n }, [user.values]);\r\n\r\n const handleInputChange = (event) => {\r\n event.persist();\r\n\r\n setUser((user) => ({\r\n ...user,\r\n values: {\r\n ...user.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\"\r\n ? event.target.checked\r\n : event.target.value,\r\n },\r\n touched: {\r\n ...user.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const handlePhoneChange = (event) => {\r\n event.persist();\r\n\r\n var x = event.target.value\r\n .replace(/\\D/g, \"\")\r\n .match(/(\\d{0,3})(\\d{0,3})(\\d{0,4})/);\r\n x = event.target.value = !x[2]\r\n ? x[1]\r\n : x[1] + \"-\" + x[2] + (x[3] ? \"-\" + x[3] : \"\");\r\n\r\n setUser((user) => ({\r\n ...user,\r\n values: {\r\n ...user.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\" ? event.target.checked : x,\r\n },\r\n touched: {\r\n ...user.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n\r\n props.addUser(user.values);\r\n setUser(initialFormState);\r\n };\r\n\r\n const hasError = (field) =>\r\n user.touched[field] && user.errors[field] ? true : false;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default AddUserForm;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport {\r\n TextField,\r\n Grid,\r\n Button,\r\n Card,\r\n Divider,\r\n CardContent,\r\n CardActions,\r\n CardHeader,\r\n MenuItem,\r\n} from \"@material-ui/core\";\r\nimport validate from \"validate.js\";\r\n\r\nconst schema = {\r\n first_name: {\r\n presence: true,\r\n length: {\r\n minimum: 1,\r\n maximum: 20,\r\n },\r\n format: {\r\n pattern: \"[a-z0-9]+\",\r\n flags: \"i\",\r\n message: \"can only contain a-z and 0-9\",\r\n },\r\n },\r\n last_name: {\r\n presence: true,\r\n length: {\r\n minimum: 1,\r\n maximum: 20,\r\n },\r\n format: {\r\n pattern: \"[a-z0-9]+\",\r\n flags: \"i\",\r\n message: \"can only contain a-z and 0-9\",\r\n },\r\n },\r\n email: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n email: true,\r\n length: {\r\n maximum: 64,\r\n },\r\n },\r\n mobile_phone: {\r\n presence: {\r\n allowEmpty: false,\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n length: {\r\n minimum: 12,\r\n },\r\n format: {\r\n pattern: \"^(\\\\+0?1\\\\s)?\\\\(?\\\\d{3}\\\\)?[\\\\s.-]\\\\d{3}[\\\\s.-]\\\\d{4}$\",\r\n flags: \"i\",\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n },\r\n};\r\n\r\nconst EditUserForm = (props) => {\r\n const [user, setUser] = useState(props.currentUser);\r\n const [roles] = useState([\r\n { id: 1, role: \"Admin\" },\r\n { id: 2, role: \"User\" },\r\n ]);\r\n\r\n useEffect(() => {\r\n setUser(props.currentUser);\r\n }, [props]);\r\n\r\n useEffect(() => {\r\n const errors = validate(user.values, schema);\r\n\r\n setUser((user) => ({\r\n ...user,\r\n isValid: errors ? false : true,\r\n errors: errors || {},\r\n }));\r\n }, [user.values]);\r\n\r\n const handleInputChange = (event) => {\r\n event.persist();\r\n\r\n setUser((user) => ({\r\n ...user,\r\n values: {\r\n ...user.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\"\r\n ? event.target.checked\r\n : event.target.value,\r\n },\r\n touched: {\r\n ...user.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const handlePhoneChange = (event) => {\r\n event.persist();\r\n\r\n var x = event.target.value\r\n .replace(/\\D/g, \"\")\r\n .match(/(\\d{0,3})(\\d{0,3})(\\d{0,4})/);\r\n x = event.target.value = !x[2]\r\n ? x[1]\r\n : x[1] + \"-\" + x[2] + (x[3] ? \"-\" + x[3] : \"\");\r\n\r\n setUser((user) => ({\r\n ...user,\r\n values: {\r\n ...user.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\" ? event.target.checked : x,\r\n },\r\n touched: {\r\n ...user.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n\r\n props.updateUser(user.values.id, user);\r\n };\r\n\r\n const hasError = (field) =>\r\n user.touched[field] && user.errors[field] ? true : false;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default EditUserForm;\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Paper,\r\n IconButton,\r\n} from \"@material-ui/core\";\r\nimport DeleteOutlineIcon from \"@material-ui/icons/DeleteOutline\";\r\nimport EditIcon from \"@material-ui/icons/Edit\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n table: {\r\n minWidth: 650,\r\n borderCollapse: \"collapse\",\r\n borderSpacing: 0,\r\n width: \"100%\",\r\n border: \"1px solid #ddd\",\r\n },\r\n header: {\r\n color: \"#FFFFFF\",\r\n textAlign: \"left\",\r\n padding: \"1rem\",\r\n fontSize: \"1rem\",\r\n fontWeight: 600,\r\n },\r\n tableHead: {\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n tableRow: {\r\n \"&:nth-of-type(even)\": {\r\n backgroundColor: theme.palette.action.hover,\r\n },\r\n },\r\n}));\r\n\r\nconst UserTable = (props) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default UserTable;\r\n","import React, { useState, useEffect, useContext, Fragment } from \"react\";\r\nimport { UserContext } from \"../../../../UserContext\";\r\nimport jwt_decode from \"jwt-decode\";\r\nimport AddUserForm from \"./AddUserForm\";\r\nimport EditUserForm from \"./EditUserForm\";\r\nimport UserTable from \"./UserTable\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport { Snackbar, AppBar, Toolbar, Button } from \"@material-ui/core\";\r\nimport MuiAlert from \"@material-ui/lab/Alert\";\r\nimport axios from \"axios\";\r\nimport apiUrl from \"../../../../common/apiUrl\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n userTable: {\r\n paddingTop: \"2rem\",\r\n },\r\n}));\r\n\r\nfunction Alert(props) {\r\n return ;\r\n}\r\n\r\nconst UserManager = () => {\r\n const classes = useStyles();\r\n\r\n const initialFormState = {\r\n id: null,\r\n first_name: \"\",\r\n last_name: \"\",\r\n mobile_phone: \"\",\r\n email: \"\",\r\n password: \"\",\r\n role: \"\",\r\n isAgent: \"\",\r\n };\r\n\r\n const [users, setUsers] = useState();\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [currentUser, setCurrentUser] = useState(initialFormState);\r\n const [editing, setEditing] = useState(false);\r\n const [openSnack, setOpenSnack] = useState(false);\r\n const [openErrorSnack, setOpenErrorSnack] = useState(false);\r\n const [showAddUser, setShowAddUser] = useState(false);\r\n\r\n const handleClose = (event, reason) => {\r\n if (reason === \"clickaway\") {\r\n return;\r\n }\r\n\r\n setOpenSnack(false);\r\n setOpenErrorSnack(false);\r\n };\r\n\r\n const { user } = useContext(UserContext);\r\n const { userId, partnerId, role } = jwt_decode(user.accessToken);\r\n\r\n useEffect(() => {\r\n let unmounted = false;\r\n const fetchData = async () => {\r\n try {\r\n const result = await axios.post(apiUrl + \"/referral/users\", {\r\n partnerId: partnerId,\r\n });\r\n setUsers(result.data.data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n };\r\n fetchData();\r\n return () => {\r\n // eslint-disable-next-line\r\n unmounted = true;\r\n };\r\n }, []);\r\n\r\n const addUser = async (nUser) => {\r\n //e.preventDefault();\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await axios.post(apiUrl + \"/referral/user\", {\r\n firstName: nUser.first_name,\r\n lastName: nUser.last_name,\r\n mobilePhone: nUser.mobile_phone,\r\n email: nUser.email,\r\n password: nUser.password,\r\n role: nUser.role,\r\n createdBy: userId,\r\n userLocationId: nUser.locationId,\r\n userCustomerId: nUser.customerId,\r\n organizationId: nUser.organizationId,\r\n partnerId: partnerId,\r\n });\r\n\r\n setUsers([...users, result.data]);\r\n\r\n setIsLoading(false);\r\n setOpenSnack(true);\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(false);\r\n setOpenErrorSnack(true);\r\n // return error\r\n }\r\n };\r\n\r\n const updateUser = async (id, uUser) => {\r\n setEditing(false);\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await axios.put(apiUrl + \"/user\", {\r\n first_name: uUser.first_name,\r\n last_name: uUser.last_name,\r\n mobile_phone: uUser.mobile_phone,\r\n email: uUser.email,\r\n password: uUser.password,\r\n role: uUser.role,\r\n createdBy: userId,\r\n userLocationId: uUser.locationId,\r\n userCustomerId: uUser.customerId,\r\n organizationId: uUser.organizationId,\r\n partnerId: partnerId,\r\n });\r\n\r\n if (result.data) {\r\n setUsers(users.map((user) => (user.id === id ? uUser.values : user)));\r\n }\r\n setIsLoading(false);\r\n setOpenSnack(true);\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(false);\r\n setOpenErrorSnack(true);\r\n // return error\r\n }\r\n };\r\n\r\n const deleteUser = async (id) => {\r\n setEditing(false);\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await axios.delete(apiUrl + \"/user\", {\r\n userId: id,\r\n });\r\n\r\n if (result.data) {\r\n setUsers(users.filter((user) => user.id !== id));\r\n }\r\n\r\n setIsLoading(false);\r\n setOpenSnack(true);\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(false);\r\n setOpenErrorSnack(true);\r\n // return error\r\n }\r\n };\r\n\r\n const formatPrimaryPhoneLocal = (phone) => {\r\n var shortPhone = phone.substring(2);\r\n\r\n var x = shortPhone.replace(/\\D/g, \"\").match(/(\\d{0,3})(\\d{0,3})(\\d{0,4})/);\r\n x = shortPhone = !x[2]\r\n ? x[1]\r\n : x[1] + \"-\" + x[2] + (x[3] ? \"-\" + x[3] : \"\");\r\n\r\n return x;\r\n };\r\n\r\n const editRow = (user) => {\r\n setEditing(true);\r\n\r\n setCurrentUser({\r\n isValid: true,\r\n values: {\r\n id: user.id,\r\n first_name: user.first_name,\r\n last_name: user.last_name,\r\n email: user.email,\r\n mobile_phone: formatPrimaryPhoneLocal(user.mobile_phone),\r\n role: user.role,\r\n },\r\n touched: {},\r\n errors: {},\r\n isLoading: false,\r\n });\r\n };\r\n\r\n const handleShowAddUser = () => {\r\n setShowAddUser((showAddUser) => !showAddUser);\r\n };\r\n\r\n return (\r\n <>\r\n {role && role <= 2 ? (\r\n \r\n \r\n \r\n Create User\r\n \r\n \r\n \r\n ) : (\r\n <>>\r\n )}\r\n \r\n
\r\n \r\n User updated successfully!\r\n \r\n \r\n
\r\n \r\n User update failed. Please try again.\r\n \r\n \r\n
\r\n
\r\n {editing ? (\r\n
\r\n \r\n \r\n ) : (\r\n
\r\n {showAddUser && (\r\n handleShowAddUser()}\r\n addUser={addUser}\r\n loading={isLoading}\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\nexport default UserManager;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport {\r\n TextField,\r\n Grid,\r\n Button,\r\n Card,\r\n Divider,\r\n CardContent,\r\n CardActions,\r\n CardHeader,\r\n MenuItem,\r\n makeStyles,\r\n Typography,\r\n} from \"@material-ui/core\";\r\nimport validate from \"validate.js\";\r\n\r\nconst schema = {\r\n first_name: {\r\n presence: true,\r\n length: {\r\n minimum: 1,\r\n maximum: 20,\r\n },\r\n format: {\r\n pattern: \"[a-z0-9]+\",\r\n flags: \"i\",\r\n message: \"can only contain a-z and 0-9\",\r\n },\r\n },\r\n last_name: {\r\n presence: true,\r\n length: {\r\n minimum: 1,\r\n maximum: 20,\r\n },\r\n format: {\r\n pattern: \"[a-z0-9]+\",\r\n flags: \"i\",\r\n message: \"can only contain a-z and 0-9\",\r\n },\r\n },\r\n email: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n email: true,\r\n length: {\r\n maximum: 64,\r\n },\r\n },\r\n mobile_phone: {\r\n presence: {\r\n allowEmpty: false,\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n length: {\r\n minimum: 12,\r\n },\r\n format: {\r\n pattern: \"^(\\\\+0?1\\\\s)?\\\\(?\\\\d{3}\\\\)?[\\\\s.-]\\\\d{3}[\\\\s.-]\\\\d{4}$\",\r\n flags: \"i\",\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n },\r\n password: {\r\n presence: true,\r\n format: {\r\n pattern:\r\n \"^(?=[ -~]*?[A-Z])(?=[ -~]*?[a-z])(?=[ -~]*?[0-9])(?=[ -~]*?[#?!@$%^&*-])[ -~]{8,72}$\",\r\n flags: \"i\",\r\n message:\r\n \"requires a minimum eight characters, at least one uppercase letter, one lowercase letter, one number, and one special character\",\r\n },\r\n },\r\n confirm: {\r\n presence: true,\r\n equality: {\r\n attribute: \"password\",\r\n message: \"<- The passwords do not match\",\r\n },\r\n },\r\n};\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n cardHeaderTitle: {\r\n color: \"#FFFFFF\",\r\n fontSize: \"1rem\",\r\n fontWeight: 600,\r\n },\r\n cardSubHeaderTitle: {\r\n color: \"#FFFFFF\",\r\n },\r\n cardHeaderBackground: {\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n}));\r\n\r\nconst AddLocationForm = (props) => {\r\n const classes = useStyles();\r\n\r\n const initialFormState = {\r\n isValid: false,\r\n values: {\r\n locationName: \"\",\r\n phone: \"\",\r\n city: \"\",\r\n state: \"\",\r\n zip: \"\",\r\n locationAbbr: \"\",\r\n locationUrl: \"\",\r\n },\r\n touched: {},\r\n errors: {},\r\n isLoading: false,\r\n };\r\n\r\n const [location, setLocation] = useState(initialFormState);\r\n\r\n useEffect(() => {\r\n const errors = validate(location.values, schema);\r\n\r\n setLocation((location) => ({\r\n ...location,\r\n isValid: errors ? false : true,\r\n errors: errors || {},\r\n }));\r\n }, [location.values]);\r\n\r\n const handleInputChange = (event) => {\r\n event.persist();\r\n\r\n setLocation((location) => ({\r\n ...location,\r\n values: {\r\n ...location.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\"\r\n ? event.target.checked\r\n : event.target.value,\r\n },\r\n touched: {\r\n ...location.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const handlePhoneChange = (event) => {\r\n event.persist();\r\n\r\n var x = event.target.value\r\n .replace(/\\D/g, \"\")\r\n .match(/(\\d{0,3})(\\d{0,3})(\\d{0,4})/);\r\n x = event.target.value = !x[2]\r\n ? x[1]\r\n : x[1] + \"-\" + x[2] + (x[3] ? \"-\" + x[3] : \"\");\r\n\r\n setLocation((location) => ({\r\n ...location,\r\n values: {\r\n ...location.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\" ? event.target.checked : x,\r\n },\r\n touched: {\r\n ...location.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n\r\n props.addUser(location.values);\r\n setLocation(initialFormState);\r\n };\r\n\r\n const hasError = (field) =>\r\n location.touched[field] && location.errors[field] ? true : false;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default AddLocationForm;\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Paper,\r\n IconButton,\r\n} from \"@material-ui/core\";\r\nimport DeleteOutlineIcon from \"@material-ui/icons/DeleteOutline\";\r\nimport EditIcon from \"@material-ui/icons/Edit\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n table: {\r\n minWidth: 650,\r\n borderCollapse: \"collapse\",\r\n borderSpacing: 0,\r\n width: \"100%\",\r\n border: \"1px solid #ddd\",\r\n },\r\n header: {\r\n color: \"#FFFFFF\",\r\n textAlign: \"left\",\r\n padding: \"1rem\",\r\n fontSize: \"1rem\",\r\n fontWeight: 600,\r\n },\r\n tableHead: {\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n tableRow: {\r\n \"&:nth-of-type(even)\": {\r\n backgroundColor: theme.palette.action.hover,\r\n },\r\n },\r\n}));\r\n\r\nconst LocationTable = (props) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default LocationTable;\r\n","import React, { useState, useEffect, useContext, Fragment } from \"react\";\r\nimport { UserContext } from \"../../../../UserContext\";\r\nimport jwt_decode from \"jwt-decode\";\r\nimport AddUserForm from \"./AddLocationForm\";\r\nimport EditUserForm from \"./EditLocationForm\";\r\nimport UserTable from \"./LocationTable\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport { Snackbar, AppBar, Toolbar, Button } from \"@material-ui/core\";\r\nimport MuiAlert from \"@material-ui/lab/Alert\";\r\nimport axios from \"axios\";\r\nimport apiUrl from \"../../../../common/apiUrl\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n userTable: {\r\n paddingTop: \"2rem\",\r\n },\r\n}));\r\n\r\nfunction Alert(props) {\r\n return ;\r\n}\r\n\r\nconst LocationManager = () => {\r\n const classes = useStyles();\r\n\r\n const initialFormState = {\r\n id: null,\r\n first_name: \"\",\r\n last_name: \"\",\r\n mobile_phone: \"\",\r\n email: \"\",\r\n password: \"\",\r\n role: \"\",\r\n isAgent: \"\",\r\n };\r\n\r\n const [users, setUsers] = useState();\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [currentUser, setCurrentUser] = useState(initialFormState);\r\n const [editing, setEditing] = useState(false);\r\n const [openSnack, setOpenSnack] = useState(false);\r\n const [openErrorSnack, setOpenErrorSnack] = useState(false);\r\n const [showAddUser, setShowAddUser] = useState(false);\r\n\r\n const handleClose = (event, reason) => {\r\n if (reason === \"clickaway\") {\r\n return;\r\n }\r\n\r\n setOpenSnack(false);\r\n setOpenErrorSnack(false);\r\n };\r\n\r\n const { user } = useContext(UserContext);\r\n const { userId } = jwt_decode(user.accessToken);\r\n\r\n useEffect(() => {\r\n let unmounted = false;\r\n const fetchData = async () => {\r\n try {\r\n const result = await axios.post(apiUrl + \"/user/list\", {\r\n organizationId: 2,\r\n });\r\n setUsers(result.data.data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n };\r\n fetchData();\r\n return () => {\r\n // eslint-disable-next-line\r\n unmounted = true;\r\n };\r\n }, []);\r\n\r\n const addUser = async (nUser) => {\r\n //e.preventDefault();\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await axios.post(apiUrl + \"/user\", {\r\n first_name: nUser.first_name,\r\n last_name: nUser.last_name,\r\n mobile_phone: nUser.mobile_phone,\r\n email: nUser.email,\r\n password: nUser.password,\r\n role: nUser.role,\r\n createdBy: nUser.createdBy,\r\n userLocationId: nUser.locationId,\r\n userCustomerId: nUser.customerId,\r\n organizationId: nUser.organizationId,\r\n });\r\n\r\n setUsers([...users, result.data]);\r\n\r\n setIsLoading(false);\r\n setOpenSnack(true);\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(false);\r\n setOpenErrorSnack(true);\r\n // return error\r\n }\r\n };\r\n\r\n const updateUser = async (id, uUser) => {\r\n setEditing(false);\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await axios.put(apiUrl + \"/user\", {\r\n first_name: uUser.first_name,\r\n last_name: uUser.last_name,\r\n mobile_phone: uUser.mobile_phone,\r\n email: uUser.email,\r\n password: uUser.password,\r\n role: uUser.role,\r\n createdBy: uUser.createdBy,\r\n userLocationId: uUser.locationId,\r\n userCustomerId: uUser.customerId,\r\n organizationId: uUser.organizationId,\r\n });\r\n\r\n if (result.data) {\r\n setUsers(users.map((user) => (user.id === id ? uUser.values : user)));\r\n }\r\n setIsLoading(false);\r\n setOpenSnack(true);\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(false);\r\n setOpenErrorSnack(true);\r\n // return error\r\n }\r\n };\r\n\r\n const deleteUser = async (id) => {\r\n setEditing(false);\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await axios.delete(apiUrl + \"/user\", {\r\n userId: id,\r\n });\r\n\r\n if (result.data) {\r\n setUsers(users.filter((user) => user.id !== id));\r\n }\r\n\r\n setIsLoading(false);\r\n setOpenSnack(true);\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(false);\r\n setOpenErrorSnack(true);\r\n // return error\r\n }\r\n };\r\n\r\n const editRow = (user) => {\r\n setEditing(true);\r\n\r\n setCurrentUser({\r\n isValid: true,\r\n values: {\r\n id: user.id,\r\n first_name: user.first_name,\r\n last_name: user.last_name,\r\n email: user.email,\r\n password: user.password,\r\n role: user.role,\r\n isAgent: user.is_agent,\r\n },\r\n touched: {},\r\n errors: {},\r\n isLoading: false,\r\n });\r\n };\r\n\r\n const handleShowAddLocation = () => {\r\n setShowAddUser((showAddUser) => !showAddUser);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n Create Location\r\n \r\n \r\n \r\n \r\n
\r\n \r\n User updated successfully!\r\n \r\n \r\n
\r\n \r\n User update failed. Please try again.\r\n \r\n \r\n
\r\n
\r\n {editing ? (\r\n
\r\n \r\n \r\n ) : (\r\n
\r\n {showAddUser && (\r\n handleShowAddLocation()}\r\n addUser={addUser}\r\n loading={isLoading}\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\nexport default LocationManager;\r\n","import React, { useState } from \"react\";\r\nimport { Grid, Tabs, Tab, makeStyles, AppBar } from \"@material-ui/core\";\r\n\r\n// import { UserManager, AccountDetails, AccountPassword } from \"./components\";\r\n\r\nimport { UserManager } from \"./components\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(4),\r\n },\r\n userMenuButton: {\r\n marginRight: theme.spacing(2),\r\n },\r\n}));\r\n\r\nconst Settings = () => {\r\n const classes = useStyles();\r\n\r\n // tabs\r\n const tabNameToIndex = {\r\n 0: \"Users\",\r\n };\r\n\r\n const indexToTabName = {\r\n users: 0,\r\n };\r\n\r\n const [selectedTab, setSelectedTab] = useState(indexToTabName[\"users\"]);\r\n const [selected, setSelected] = useState(null);\r\n\r\n const updateSelected = (event) => {\r\n setSelected(event);\r\n };\r\n\r\n const handleChange = (event, newValue) => {\r\n // history.push(`/home/${tabNameToIndex[newValue]}`);\r\n setSelectedTab(newValue);\r\n };\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n {selectedTab === 0 && (\r\n
\r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default Settings;\r\n","import React from \"react\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Grid from \"@material-ui/core/Grid\";\nimport List from \"@material-ui/core/List\";\nimport Card from \"@material-ui/core/Card\";\nimport CardHeader from \"@material-ui/core/CardHeader\";\nimport ListItem from \"@material-ui/core/ListItem\";\nimport ListItemText from \"@material-ui/core/ListItemText\";\nimport ListItemIcon from \"@material-ui/core/ListItemIcon\";\nimport Checkbox from \"@material-ui/core/Checkbox\";\nimport Button from \"@material-ui/core/Button\";\nimport Divider from \"@material-ui/core/Divider\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n margin: \"auto\",\n },\n cardHeader: {\n padding: theme.spacing(1, 2),\n },\n list: {\n width: 200,\n height: 230,\n backgroundColor: theme.palette.background.paper,\n overflow: \"auto\",\n },\n button: {\n margin: theme.spacing(0.5, 0),\n },\n}));\n\nfunction not(a, b) {\n return a.filter((value) => b.indexOf(value) === -1);\n}\n\nfunction intersection(a, b) {\n return a.filter((value) => b.indexOf(value) !== -1);\n}\n\nfunction union(a, b) {\n return [...a, ...not(b, a)];\n}\n\nexport default function LocationList() {\n const classes = useStyles();\n const [checked, setChecked] = React.useState([]);\n const [left, setLeft] = React.useState([0, 1, 2, 3]);\n const [right, setRight] = React.useState([4, 5, 6, 7]);\n\n const leftChecked = intersection(checked, left);\n const rightChecked = intersection(checked, right);\n\n const handleToggle = (value) => () => {\n const currentIndex = checked.indexOf(value);\n const newChecked = [...checked];\n\n if (currentIndex === -1) {\n newChecked.push(value);\n } else {\n newChecked.splice(currentIndex, 1);\n }\n\n setChecked(newChecked);\n };\n\n const numberOfChecked = (items) => intersection(checked, items).length;\n\n const handleToggleAll = (items) => () => {\n if (numberOfChecked(items) === items.length) {\n setChecked(not(checked, items));\n } else {\n setChecked(union(checked, items));\n }\n };\n\n const handleCheckedRight = () => {\n setRight(right.concat(leftChecked));\n setLeft(not(left, leftChecked));\n setChecked(not(checked, leftChecked));\n };\n\n const handleCheckedLeft = () => {\n setLeft(left.concat(rightChecked));\n setRight(not(right, rightChecked));\n setChecked(not(checked, rightChecked));\n };\n\n const customList = (title, items) => (\n \n \n }\n title={title}\n subheader={`${numberOfChecked(items)}/${items.length} selected`}\n />\n \n \n {items.map((value) => {\n const labelId = `transfer-list-all-item-${value}-label`;\n\n return (\n \n \n \n \n \n \n );\n })}\n \n
\n \n );\n\n return (\n \n {customList(\"Locations Available\", left)} \n \n \n \n >\n \n \n <\n \n \n \n {customList(\"Locations Assigned\", right)} \n \n );\n}\n","import React from \"react\";\r\nimport { Grid, Tabs, Tab, makeStyles } from \"@material-ui/core\";\r\n\r\n// import { UserManager } from \"./components\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(4),\r\n },\r\n}));\r\n\r\nconst Support = () => {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n Coming Soon\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default Support;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport {\r\n TextField,\r\n Grid,\r\n Button,\r\n Card,\r\n Divider,\r\n CardContent,\r\n CardActions,\r\n CardHeader,\r\n MenuItem,\r\n makeStyles,\r\n Typography,\r\n} from \"@material-ui/core\";\r\nimport validate from \"validate.js\";\r\nimport LocationList from \"./LocationList\";\r\n\r\nconst schema = {\r\n first_name: {\r\n presence: true,\r\n length: {\r\n minimum: 1,\r\n maximum: 20,\r\n },\r\n format: {\r\n pattern: \"[a-z0-9]+\",\r\n flags: \"i\",\r\n message: \"can only contain a-z and 0-9\",\r\n },\r\n },\r\n last_name: {\r\n presence: true,\r\n length: {\r\n minimum: 1,\r\n maximum: 20,\r\n },\r\n format: {\r\n pattern: \"[a-z0-9]+\",\r\n flags: \"i\",\r\n message: \"can only contain a-z and 0-9\",\r\n },\r\n },\r\n email: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n email: true,\r\n length: {\r\n maximum: 64,\r\n },\r\n },\r\n mobile_phone: {\r\n presence: {\r\n allowEmpty: false,\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n length: {\r\n minimum: 12,\r\n },\r\n format: {\r\n pattern: \"^(\\\\+0?1\\\\s)?\\\\(?\\\\d{3}\\\\)?[\\\\s.-]\\\\d{3}[\\\\s.-]\\\\d{4}$\",\r\n flags: \"i\",\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n },\r\n password: {\r\n presence: true,\r\n format: {\r\n pattern:\r\n \"^(?=[ -~]*?[A-Z])(?=[ -~]*?[a-z])(?=[ -~]*?[0-9])(?=[ -~]*?[#?!@$%^&*-])[ -~]{8,72}$\",\r\n flags: \"i\",\r\n message:\r\n \"requires a minimum eight characters, at least one uppercase letter, one lowercase letter, one number, and one special character\",\r\n },\r\n },\r\n confirm: {\r\n presence: true,\r\n equality: {\r\n attribute: \"password\",\r\n message: \"<- The passwords do not match\",\r\n },\r\n },\r\n};\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n cardHeaderTitle: {\r\n color: \"#FFFFFF\",\r\n fontSize: \"1rem\",\r\n fontWeight: 600,\r\n },\r\n cardSubHeaderTitle: {\r\n color: \"#FFFFFF\",\r\n },\r\n cardHeaderBackground: {\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n}));\r\n\r\nconst AddUserForm = (props) => {\r\n const classes = useStyles();\r\n\r\n const initialFormState = {\r\n isValid: false,\r\n values: {\r\n first_name: \"\",\r\n last_name: \"\",\r\n mobile_phone: \"\",\r\n email: \"\",\r\n role: 3,\r\n isAgent: false,\r\n password: \"\",\r\n confirm: \"\",\r\n },\r\n touched: {},\r\n errors: {},\r\n isLoading: false,\r\n };\r\n\r\n const [user, setUser] = useState(initialFormState);\r\n const [roles] = useState([\r\n { id: 2, role: \"Admin\" },\r\n { id: 3, role: \"User\" },\r\n ]);\r\n\r\n useEffect(() => {\r\n const errors = validate(user.values, schema);\r\n\r\n setUser((user) => ({\r\n ...user,\r\n isValid: errors ? false : true,\r\n errors: errors || {},\r\n }));\r\n }, [user.values]);\r\n\r\n const handleInputChange = (event) => {\r\n event.persist();\r\n\r\n setUser((user) => ({\r\n ...user,\r\n values: {\r\n ...user.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\"\r\n ? event.target.checked\r\n : event.target.value,\r\n },\r\n touched: {\r\n ...user.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const handlePhoneChange = (event) => {\r\n event.persist();\r\n\r\n var x = event.target.value\r\n .replace(/\\D/g, \"\")\r\n .match(/(\\d{0,3})(\\d{0,3})(\\d{0,4})/);\r\n x = event.target.value = !x[2]\r\n ? x[1]\r\n : x[1] + \"-\" + x[2] + (x[3] ? \"-\" + x[3] : \"\");\r\n\r\n setUser((user) => ({\r\n ...user,\r\n values: {\r\n ...user.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\" ? event.target.checked : x,\r\n },\r\n touched: {\r\n ...user.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n\r\n props.addUser(user.values);\r\n setUser(initialFormState);\r\n };\r\n\r\n const hasError = (field) =>\r\n user.touched[field] && user.errors[field] ? true : false;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default AddUserForm;\r\n","import React, { useState, useEffect, useContext } from \"react\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport {\r\n TextField,\r\n Grid,\r\n Button,\r\n Card,\r\n Divider,\r\n CardContent,\r\n CardActions,\r\n CardHeader,\r\n MenuItem,\r\n Typography,\r\n} from \"@material-ui/core\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n userTable: {\r\n paddingTop: \"2rem\",\r\n },\r\n input: {\r\n background: \"white\",\r\n },\r\n grid: {\r\n spacing: 0,\r\n display: \"flex\",\r\n direction: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n paddingTop: theme.spacing(7),\r\n },\r\n contentHeader: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n paddingTop: theme.spacing(5),\r\n paddingBottom: theme.spacing(2),\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n },\r\n contentBody: {\r\n flexGrow: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n logo: {\r\n marginTop: theme.spacing(5),\r\n marginBottom: theme.spacing(5),\r\n display: \"flex\",\r\n direction: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n linkExpired: {\r\n paddingTop: theme.spacing(4),\r\n },\r\n}));\r\n\r\nconst EditReferralForm = (props) => {\r\n const history = useHistory();\r\n const [referral, setReferral] = useState(props.currentReferral);\r\n const ddls = props.ddlData;\r\n\r\n // get dropdown values\r\n const currentDoc = ddls.docs.find(\r\n (doc) => doc.providerid === referral.values.physicianRequested\r\n );\r\n\r\n const currentLocation = ddls.sites.find(\r\n (site) => site.siteid === referral.values.preferredLocation\r\n );\r\n\r\n const currentInsurance = ddls.insurances.find(\r\n (insurance) => insurance.insuranceid === referral.values.insuranceId\r\n );\r\n\r\n const currentBodyPart = ddls.bodyparts.find(\r\n (bodypart) => bodypart.bodypartid === referral.values.bodyPartId\r\n );\r\n\r\n const currentComplaint = ddls.complaints.find(\r\n (bodypart) => bodypart.bodypartid === referral.values.complaintId\r\n );\r\n\r\n const currentAcuity = ddls.acuitys.find(\r\n (acuity) => acuity.acuityid === referral.values.acuityId\r\n );\r\n\r\n const currentReferredLocation = ddls.locations.find(\r\n (location) => location.locationid === referral.values.locationId\r\n );\r\n\r\n const classes = useStyles();\r\n\r\n useEffect(() => {\r\n setReferral(props.currentReferral);\r\n }, [props]);\r\n\r\n const handleClose = () => {\r\n props.setEditing(false);\r\n history.push(\"/referral\");\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Close\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default EditReferralForm;\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Paper,\r\n IconButton,\r\n} from \"@material-ui/core\";\r\nimport PageviewIcon from \"@material-ui/icons/Pageview\";\r\nimport EditIcon from \"@material-ui/icons/Edit\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n table: {\r\n minWidth: 650,\r\n borderCollapse: \"collapse\",\r\n borderSpacing: 0,\r\n width: \"100%\",\r\n border: \"1px solid #ddd\",\r\n },\r\n header: {\r\n color: \"#FFFFFF\",\r\n textAlign: \"left\",\r\n padding: \"1rem\",\r\n fontSize: \"1rem\",\r\n fontWeight: 600,\r\n },\r\n tableHead: {\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n tableRow: {\r\n \"&:nth-of-type(even)\": {\r\n backgroundColor: theme.palette.action.hover,\r\n },\r\n },\r\n}));\r\n\r\nconst UserTable = (props) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {/* Date */}\r\n Referral ID \r\n Patient First Name \r\n Patient Last Name \r\n \r\n Referring Physician\r\n \r\n Referring Contact \r\n Status \r\n \r\n \r\n \r\n {props.referrals && props.referrals.length > 0 ? (\r\n props.referrals.map((referral, index) => (\r\n \r\n \r\n {\r\n props.editRow(referral);\r\n }}\r\n type=\"submit\"\r\n >\r\n \r\n \r\n \r\n\r\n {/* {referral.dtcreated} */}\r\n {referral.apptrequestid} \r\n {referral.patientfirstname} \r\n {referral.lastname} \r\n {referral.referring_physician} \r\n {referral.referring_contact} \r\n \r\n {referral.apptReqState === 1\r\n ? \"Active\"\r\n : referral.apptReqState === 2\r\n ? \"Pending\"\r\n : \"Complete\"}\r\n \r\n \r\n ))\r\n ) : (\r\n \r\n Click above to send referrals! \r\n \r\n )}\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default UserTable;\r\n","import React, { useState, useEffect, useContext, Fragment } from \"react\";\r\nimport { UserContext } from \"../../../../UserContext\";\r\nimport jwt_decode from \"jwt-decode\";\r\nimport AddUserForm from \"./AddUserForm\";\r\nimport EditReferralForm from \"./EditReferralForm\";\r\nimport UserTable from \"./UserTable\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport { Snackbar, AppBar, Toolbar, Button } from \"@material-ui/core\";\r\nimport MuiAlert from \"@material-ui/lab/Alert\";\r\nimport axios from \"axios\";\r\nimport apiUrl from \"../../../../common/apiUrl\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n userTable: {\r\n paddingTop: \"2rem\",\r\n },\r\n}));\r\n\r\nfunction Alert(props) {\r\n return ;\r\n}\r\n\r\nconst UserManager = (props) => {\r\n const classes = useStyles();\r\n const [users, setUsers] = useState();\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [currentReferral, setCurrentReferral] = useState();\r\n const [editing, setEditing] = useState(false);\r\n const [openSnack, setOpenSnack] = useState(false);\r\n const [openErrorSnack, setOpenErrorSnack] = useState(false);\r\n const [showAddUser, setShowAddUser] = useState(false);\r\n const [ddls, setDdls] = useState({});\r\n\r\n const handleClose = (event, reason) => {\r\n if (reason === \"clickaway\") {\r\n return;\r\n }\r\n\r\n setOpenSnack(false);\r\n setOpenErrorSnack(false);\r\n };\r\n\r\n const { user } = useContext(UserContext);\r\n const { userId, partnerId } = jwt_decode(user.accessToken);\r\n\r\n const getDdls = async (locId) => {\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await axios.post(apiUrl + \"/referral/ddl\", {\r\n userId: userId,\r\n sendToLocationId: locId,\r\n });\r\n\r\n setDdls(() => result.data.data[0].spgetdropdowns.dropdowns[0]);\r\n\r\n setIsLoading(false);\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n let unmounted = false;\r\n const fetchData = async () => {\r\n try {\r\n const result = await axios.post(apiUrl + \"/referral/sent\", {\r\n partnerId: partnerId,\r\n });\r\n if (!unmounted) {\r\n if (props && props.referralId) {\r\n const paramReferral = result.data.data.find(\r\n (referral) => referral.apptrequestid === props.referralId\r\n );\r\n if (paramReferral) {\r\n editRow(paramReferral);\r\n setUsers(result.data.data);\r\n } else {\r\n setUsers(result.data.data);\r\n }\r\n } else {\r\n setUsers(result.data.data);\r\n }\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n };\r\n fetchData();\r\n return () => {\r\n // eslint-disable-next-line\r\n unmounted = true;\r\n };\r\n }, []);\r\n\r\n const editRow = async (referral) => {\r\n await getDdls(referral.locationid);\r\n\r\n setCurrentReferral({\r\n isValid: true,\r\n values: {\r\n apptrequestid: referral.apptrequestid,\r\n locationId: referral.locationid,\r\n partnerId: referral.partnerid,\r\n referringPhysician: referral.referring_physician,\r\n referringContact: referral.referring_contact,\r\n referringOfficePhone: referral.referring_office_phone,\r\n physicianRequested: referral.physician_requested,\r\n preferredLocation: referral.preferred_location,\r\n patientContactName: referral.patient_contact_name,\r\n patientFirstName: referral.patientfirstname,\r\n patientLastName: referral.lastname,\r\n gender: referral.gender,\r\n birthDate: `${referral.birthmonth}/${referral.birthdayofmo}/${referral.birthyear}`,\r\n ssn: referral.ssn,\r\n streetAddress: referral.street_address,\r\n zipCode: referral.zipcode,\r\n emailAddress: referral.emailaddress,\r\n primaryPhone: referral.primaryphone,\r\n referralSourceId: referral.referralsourceid,\r\n insuranceId: referral.insuranceid,\r\n insuranceNumber: referral.insnumber,\r\n bodyPartId: referral.bodypartid,\r\n complaintId: referral.complaintid,\r\n acuityId: referral.acuityid,\r\n previousSurgery: false,\r\n previousSurgerySide: referral.previous_surgery_side,\r\n otherInfo: referral.otherinfo,\r\n requestStatus: referral.requeststatus,\r\n apptReqState: referral.apptreqstate,\r\n apptReqStateReason: referral.appt_req_state_reason,\r\n },\r\n touched: {},\r\n errors: {},\r\n isLoading: false,\r\n });\r\n\r\n setEditing(true);\r\n };\r\n\r\n const handleShowAddUser = () => {\r\n setShowAddUser((showAddUser) => !showAddUser);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n Referral updated successfully!\r\n \r\n \r\n
\r\n \r\n Referral update failed. Please try again.\r\n \r\n \r\n
\r\n
\r\n {editing ? (\r\n
\r\n \r\n \r\n ) : (\r\n
\r\n {showAddUser && (\r\n handleShowAddUser()}\r\n loading={isLoading}\r\n />\r\n )}\r\n \r\n )}\r\n
\r\n {!editing && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n
\r\n >\r\n );\r\n};\r\n\r\nexport default UserManager;\r\n","import React from \"react\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: \"flex\",\n \"& > * + *\": {\n marginLeft: theme.spacing(2),\n },\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n}));\n\nexport default function CircularIndeterminate() {\n const classes = useStyles();\n\n return (\n \n \n
\n );\n}\n","import React, { useState } from \"react\";\nimport { DropzoneAreaBase } from \"material-ui-dropzone\";\nimport apiUrl from \"./apiUrl\";\n\nexport default function Dropzone(props) {\n const [files, setFiles] = useState([]);\n const [attachmentIds, setAttachmentIds] = useState([]);\n\n const dbS3Save = async (event) => {\n try {\n const file = event[0].file.path;\n const fileType = event[0].file.type;\n const apptId = props.apptId;\n const fileName = file;\n\n const config = {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Cache: \"no-cache\",\n },\n body: JSON.stringify({\n rky: props.rky,\n objectId: fileName,\n }),\n };\n\n // save locally\n const local = await (\n await fetch(`${apiUrl}/appt/attachment`, config)\n ).json();\n\n if (local && local.data !== \"-1\") {\n const attachId = local.data;\n\n setAttachmentIds((attachmentIds) => [\n ...attachmentIds,\n {\n attachmentId: attachId,\n fileName: fileName,\n },\n ]);\n\n const configSign = {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Cache: \"no-cache\",\n },\n body: JSON.stringify({\n apptId: apptId,\n objectId: fileName,\n attachId: attachId,\n }),\n };\n\n const data = await (\n await fetch(`${apiUrl}/appt/get-signed-url`, configSign)\n ).json();\n\n const formData = new FormData();\n\n formData.append(\"Content-Type\", fileType);\n Object.entries(data.fields).forEach(([k, v]) => {\n formData.append(k, v);\n });\n formData.append(\"file\", event[0].file);\n\n await fetch(data.url, {\n method: \"POST\",\n body: formData,\n });\n }\n } catch (error) {\n console.log(error);\n }\n };\n\n const handleAdd = (newFiles) => {\n newFiles = newFiles.filter(\n (file) => !files.find((f) => f.data === file.data)\n );\n setFiles(() => [...files, ...newFiles]);\n\n // save to db and s3\n dbS3Save(newFiles);\n };\n\n const handleDelete = (deleted) => {\n setFiles(() => files.filter((f) => f !== deleted));\n\n // remove from db and s3\n dbS3Delete(deleted);\n };\n\n const dbS3Delete = async (fileToDelete) => {\n try {\n const file = fileToDelete.file.path;\n\n const apptId = props.apptId;\n const fileName = file;\n\n const attachmentForRemoval = attachmentIds.filter(\n (attachmentId) => attachmentId.fileName === fileName\n );\n\n const updatedAttachmentIds = attachmentIds.filter(\n (attachmentId) => attachmentId.fileName !== fileName\n );\n\n setAttachmentIds(() => updatedAttachmentIds);\n\n const config = {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Cache: \"no-cache\",\n },\n body: JSON.stringify({\n rky: props.rky,\n objectId: fileName,\n apptId: apptId,\n attachmentId: attachmentForRemoval[0].attachmentId,\n }),\n };\n\n await (await fetch(`${apiUrl}/appt/rm`, config)).json();\n } catch (error) {\n console.log(error);\n }\n };\n\n return (\n \n );\n}\n","import React, { useState, useEffect, useContext } from \"react\";\r\nimport { UserContext } from \"../../../../UserContext\";\r\nimport jwt_decode from \"jwt-decode\";\r\nimport validate from \"validate.js\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport {\r\n Snackbar,\r\n Button,\r\n Typography,\r\n Grid,\r\n TextField,\r\n MenuItem,\r\n Card,\r\n CardContent,\r\n InputAdornment,\r\n} from \"@material-ui/core\";\r\nimport MuiAlert from \"@material-ui/lab/Alert\";\r\nimport DateFnsUtils from \"@date-io/date-fns\";\r\nimport { MuiPickersUtilsProvider, DatePicker } from \"@material-ui/pickers\";\r\nimport axios from \"axios\";\r\nimport apiUrl from \"../../../../common/apiUrl\";\r\nimport Loading from \"./Loading\";\r\nimport ThumbUpIcon from \"@material-ui/icons/ThumbUp\";\r\nimport DateRangeIcon from \"@material-ui/icons/DateRange\";\r\nimport Dropzone from \"../../../../common/Dropzone\";\r\n\r\nconst schema = {\r\n locationId: {\r\n presence: true,\r\n numericality: {\r\n onlyInteger: true,\r\n greaterThanOrEqualTo: 0,\r\n message: \"is required\",\r\n },\r\n },\r\n preferredLocation: {\r\n presence: true,\r\n numericality: {\r\n onlyInteger: true,\r\n greaterThanOrEqualTo: 0,\r\n message: \"is required\",\r\n },\r\n },\r\n insuranceId: {\r\n presence: true,\r\n numericality: {\r\n onlyInteger: true,\r\n greaterThanOrEqualTo: 0,\r\n message: \"is required\",\r\n },\r\n },\r\n bodyPartId: {\r\n presence: true,\r\n numericality: {\r\n onlyInteger: true,\r\n greaterThanOrEqualTo: 0,\r\n message: \"is required\",\r\n },\r\n },\r\n complaintId: {\r\n presence: true,\r\n numericality: {\r\n onlyInteger: true,\r\n greaterThanOrEqualTo: 0,\r\n message: \"is required\",\r\n },\r\n },\r\n acuityId: {\r\n presence: true,\r\n numericality: {\r\n onlyInteger: true,\r\n greaterThanOrEqualTo: 0,\r\n message: \"is required\",\r\n },\r\n },\r\n referringPhysician: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n maximum: 64,\r\n },\r\n },\r\n referringContact: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n maximum: 64,\r\n },\r\n },\r\n referringOfficePhone: {\r\n presence: {\r\n allowEmpty: false,\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n length: {\r\n minimum: 12,\r\n },\r\n format: {\r\n pattern: \"^(\\\\+0?1\\\\s)?\\\\(?\\\\d{3}\\\\)?[\\\\s.-]\\\\d{3}[\\\\s.-]\\\\d{4}$\",\r\n flags: \"i\",\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n },\r\n patientFirstName: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n maximum: 128,\r\n },\r\n },\r\n patientLastName: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n maximum: 128,\r\n },\r\n },\r\n streetAddress: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n minimum: 2,\r\n maximum: 150,\r\n },\r\n },\r\n zipCode: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n minimum: 5,\r\n maximum: 5,\r\n },\r\n format: {\r\n pattern: \"[0-9]+\",\r\n flags: \"i\",\r\n message: \"can only contain 0-9\",\r\n },\r\n },\r\n primaryPhone: {\r\n presence: {\r\n allowEmpty: false,\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n length: {\r\n minimum: 12,\r\n },\r\n format: {\r\n pattern: \"^(\\\\+0?1\\\\s)?\\\\(?\\\\d{3}\\\\)?[\\\\s.-]\\\\d{3}[\\\\s.-]\\\\d{4}$\",\r\n flags: \"i\",\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n },\r\n ssn: {\r\n length: {\r\n maximum: 11,\r\n },\r\n },\r\n birthDate: {\r\n presence: {\r\n allowEmpty: false,\r\n message: \"is required\",\r\n },\r\n },\r\n};\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n userTable: {\r\n paddingTop: \"2rem\",\r\n },\r\n input: {\r\n background: \"white\",\r\n },\r\n grid: {\r\n spacing: 0,\r\n display: \"flex\",\r\n direction: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n paddingTop: theme.spacing(7),\r\n },\r\n contentHeader: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n paddingTop: theme.spacing(5),\r\n paddingBottom: theme.spacing(2),\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n },\r\n contentBody: {\r\n flexGrow: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n logo: {\r\n marginTop: theme.spacing(5),\r\n marginBottom: theme.spacing(3),\r\n display: \"flex\",\r\n direction: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n linkExpired: {\r\n paddingTop: theme.spacing(4),\r\n textAlign: \"center\",\r\n marginBottom: \"6em\",\r\n },\r\n}));\r\n\r\nfunction Alert(props) {\r\n return ;\r\n}\r\n\r\nconst ReferralManager = () => {\r\n const classes = useStyles();\r\n\r\n const initialState = {\r\n isValid: false,\r\n values: {\r\n userId: \"\",\r\n locationId: \"\",\r\n partnerId: \"\",\r\n referringPhysician: \"\",\r\n referringContact: \"\",\r\n referringOfficePhone: \"\",\r\n physicianRequested: \"\",\r\n preferredLocation: \"\",\r\n preferredApptTime: \"\",\r\n patientContactName: \"\",\r\n patientFirstName: \"\",\r\n patientLastName: \"\",\r\n gender: \"\",\r\n birthDate: null,\r\n ssn: \"\",\r\n streetAddress: \"\",\r\n zipCode: \"\",\r\n emailAddress: \"\",\r\n primaryPhone: \"\",\r\n referralSourceId: \"\",\r\n insuranceId: \"\",\r\n insuranceNumber: \"\",\r\n bodyPartId: \"\",\r\n complaintId: \"\",\r\n acuityId: \"\",\r\n previousSurgery: false,\r\n previousSurgerySide: \"\",\r\n attachmentPath: \"\",\r\n attachmentFName: \"\",\r\n otherInfo: \"\",\r\n referralContactEmail: \"\",\r\n },\r\n touched: {},\r\n errors: {},\r\n isLoading: false,\r\n };\r\n\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [sent, setSent] = useState(false);\r\n const [severity] = useState(\"\");\r\n const [message] = useState(\"\");\r\n const [openSnack, setOpenSnack] = useState(false);\r\n const [openErrorSnack, setOpenErrorSnack] = useState(false);\r\n const [ddls, setDdls] = useState({});\r\n const [partnerLocations, setPartnerLocations] = useState();\r\n const [currentComplaint, setCurrentComplaint] = useState(1);\r\n const [apptId, setApptId] = useState();\r\n const [rky, setRky] = useState();\r\n const [locationAbbr, setLocationAbbr] = useState();\r\n const [formState, setFormState] = useState(initialState);\r\n\r\n const handleClose = (event, reason) => {\r\n if (reason === \"clickaway\") {\r\n return;\r\n }\r\n\r\n setOpenSnack(false);\r\n setOpenErrorSnack(false);\r\n };\r\n\r\n const { user } = useContext(UserContext);\r\n const { userId, partnerId } = jwt_decode(user.accessToken);\r\n\r\n useEffect(() => {\r\n const fetchPartnerLocations = async () => {\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await axios.post(\r\n apiUrl + \"/referral/partner-locations\",\r\n {\r\n partnerId: partnerId,\r\n }\r\n );\r\n\r\n setPartnerLocations(() => result.data.data);\r\n\r\n setIsLoading(false);\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n fetchPartnerLocations();\r\n }, [partnerId]);\r\n\r\n useEffect(() => {\r\n let unmounted = false;\r\n\r\n if (\r\n formState.values.locationId !== \"\" &&\r\n formState.values.locationId !== true\r\n ) {\r\n const getDdls = async () => {\r\n //e.preventDefault();\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await axios.post(apiUrl + \"/referral/ddl\", {\r\n userId: userId,\r\n sendToLocationId: formState.values.locationId,\r\n });\r\n\r\n if (result && !unmounted) {\r\n setDdls(() => result.data.data[0].spgetdropdowns.dropdowns[0]);\r\n }\r\n\r\n setIsLoading(false);\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n getDdls();\r\n }\r\n\r\n return () => {\r\n unmounted = true;\r\n };\r\n }, [formState.values.locationId, userId]);\r\n\r\n useEffect(() => {\r\n const errors = validate(formState.values, schema);\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n isValid: errors ? false : true,\r\n errors: errors || {},\r\n }));\r\n }, [formState.values]);\r\n\r\n useEffect(() => {\r\n let unmounted = false;\r\n\r\n const fetchUserDetails = async () => {\r\n try {\r\n const result = await axios.post(apiUrl + \"/user/detail\", {\r\n userId: userId,\r\n });\r\n\r\n if (result && !unmounted && formState.values.locationId !== \"\") {\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n referringContact:\r\n `${result.data.data[0].first_name} ${result.data.data[0].last_name}` ||\r\n \"\",\r\n referralContactEmail: result.data.data[0].email || \"\",\r\n },\r\n }));\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n };\r\n\r\n fetchUserDetails();\r\n\r\n return () => {\r\n unmounted = true;\r\n };\r\n }, [formState.values.locationId, userId]);\r\n\r\n const sendReferral = async () => {\r\n setIsLoading(true);\r\n\r\n let unmounted = false;\r\n\r\n try {\r\n const result = await axios.post(apiUrl + \"/referral/send\", {\r\n userId: userId,\r\n locationId: formState.values.locationId,\r\n partnerId: partnerId,\r\n referringPhysician: formState.values.referringPhysician,\r\n referringContact: formState.values.referringContact,\r\n referringOfficePhone: formState.values.referringOfficePhone,\r\n physicianRequested: formState.values.physicianRequested,\r\n preferredLocation: formState.values.preferredLocation,\r\n preferredApptTime: 1,\r\n patientContactName: formState.values.patientContactName,\r\n patientFirstName: formState.values.patientFirstName,\r\n patientLastName: formState.values.patientLastName,\r\n gender: formState.values.gender,\r\n birthDate: formState.values.birthDate,\r\n ssn: formState.values.ssn,\r\n streetAddress: formState.values.streetAddress,\r\n zipCode: formState.values.zipCode,\r\n emailAddress: formState.values.emailAddress,\r\n primaryPhone: formState.values.primaryPhone,\r\n // referralSourceId: formState.values.referralSourceId,\r\n referralSourceId: 12,\r\n insuranceId: formState.values.insuranceId,\r\n insuranceNumber: formState.values.insuranceNumber,\r\n bodyPartId: formState.values.bodyPartId,\r\n complaintId: formState.values.complaintId,\r\n acuityId: formState.values.acuityId,\r\n previousSurgery: formState.values.previousSurgery,\r\n previousSurgerySide: formState.values.previousSurgerySide,\r\n attachmentPath: formState.values.attachmentPath,\r\n attachmentFName: formState.values.attachmentFName,\r\n otherInfo: formState.values.otherInfo,\r\n referralContactEmail: formState.values.referralContactEmail,\r\n });\r\n\r\n if (result && !unmounted) {\r\n setApptId(() => result.data.data[0].rsapptrequestid);\r\n setRky(() => result.data.data[0].rky);\r\n setLocationAbbr(() => result.data.data[0].locationabbr);\r\n setIsLoading(false);\r\n }\r\n\r\n setOpenSnack(true);\r\n setSent(() => true);\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(false);\r\n setOpenErrorSnack(true);\r\n setSent(() => false);\r\n }\r\n return () => {\r\n unmounted = true;\r\n };\r\n };\r\n\r\n const resetReferralForm = () => {\r\n setFormState(() => initialState);\r\n setSent(() => false);\r\n };\r\n\r\n const handleChange = (event) => {\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\"\r\n ? event.target.checked\r\n : event.target.value,\r\n },\r\n touched: {\r\n ...formState.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n\r\n if (event.target.name === \"bodyPartId\") {\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n complaintId: \"\",\r\n },\r\n touched: {\r\n ...formState.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const handlePhoneChange = (event) => {\r\n event.persist();\r\n\r\n var x = event.target.value\r\n .replace(/\\D/g, \"\")\r\n .match(/(\\d{0,3})(\\d{0,3})(\\d{0,4})/);\r\n x = event.target.value = !x[2]\r\n ? x[1]\r\n : x[1] + \"-\" + x[2] + (x[3] ? \"-\" + x[3] : \"\");\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\" ? event.target.checked : x,\r\n },\r\n touched: {\r\n ...formState.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const handleSSNChange = (event) => {\r\n event.persist();\r\n\r\n var x = event.target.value\r\n .replace(/\\D/g, \"\")\r\n .match(/(\\d{0,3})(\\d{0,2})(\\d{0,4})/);\r\n x = event.target.value = !x[2]\r\n ? x[1]\r\n : x[1] + \"-\" + x[2] + (x[3] ? \"-\" + x[3] : \"\");\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\" ? event.target.checked : x,\r\n },\r\n touched: {\r\n ...formState.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const handleDateChange = (date) => {\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n birthDate: date,\r\n },\r\n }));\r\n };\r\n\r\n const hasError = (field) =>\r\n formState.touched[field] && formState.errors[field] ? true : false;\r\n\r\n return (\r\n <>\r\n {/* \r\n \r\n \r\n \r\n \r\n MSMOC\r\n \r\n \r\n \r\n \r\n \r\n */}\r\n {isLoading ? (\r\n \r\n ) : sent === false ? (\r\n \r\n
\r\n
\r\n \r\n Referral sent successfully!\r\n \r\n \r\n
\r\n \r\n Failed to send referral. Please try again.\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 Your referral was sent successfully!\r\n \r\n \r\n\r\n \r\n \r\n Attach Documents To The Referral\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n I'm Finished!\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\nexport default ReferralManager;\r\n","import React, { useState } from \"react\";\r\nimport { Grid, Tabs, Tab, makeStyles, AppBar } from \"@material-ui/core\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport { UserManager, ReferralManager } from \"./components\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(4),\r\n },\r\n userMenuButton: {\r\n marginRight: theme.spacing(2),\r\n },\r\n}));\r\n\r\nconst Referral = () => {\r\n const classes = useStyles();\r\n\r\n // tabs\r\n const tabNameToIndex = {\r\n 0: \"New Referral\",\r\n 1: \"Referral List\",\r\n };\r\n\r\n const indexToTabName = {\r\n newReferral: 0,\r\n referralList: 1,\r\n };\r\n\r\n /** get referralId if passed via URL and pass to UserManager */\r\n const { referralId } = useParams();\r\n const trimmedReferralId = referralId ? referralId.substring(0, 20) : null;\r\n\r\n const [selectedTab, setSelectedTab] = useState(\r\n indexToTabName[trimmedReferralId ? \"referralList\" : \"newReferral\"]\r\n );\r\n const [selected, setSelected] = useState(null);\r\n\r\n const updateSelected = (event) => {\r\n setSelected(event);\r\n };\r\n\r\n const handleChange = (event, newValue) => {\r\n // history.push(`/home/${tabNameToIndex[newValue]}`);\r\n setSelectedTab(newValue);\r\n };\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n {selectedTab === 0 && (\r\n
\r\n \r\n \r\n \r\n \r\n )}\r\n {selectedTab === 1 && (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default Referral;\r\n","import React from \"react\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: \"flex\",\n \"& > * + *\": {\n marginLeft: theme.spacing(2),\n },\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n}));\n\nexport default function CircularIndeterminate() {\n const classes = useStyles();\n\n return (\n \n \n
\n );\n}\n","import React from \"react\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: \"flex\",\n \"& > * + *\": {\n marginLeft: theme.spacing(2),\n },\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n}));\n\nexport default function CircularIndeterminate() {\n const classes = useStyles();\n\n return (\n \n \n
\n );\n}\n","import React, { useState, useEffect } from \"react\";\r\nimport validate from \"validate.js\";\r\nimport { makeStyles } from \"@material-ui/styles\";\r\nimport {\r\n Snackbar,\r\n Button,\r\n Typography,\r\n MenuItem,\r\n Grid,\r\n TextField,\r\n Card,\r\n CardContent,\r\n InputAdornment,\r\n} from \"@material-ui/core\";\r\nimport MuiAlert from \"@material-ui/lab/Alert\";\r\nimport DateFnsUtils from \"@date-io/date-fns\";\r\nimport { MuiPickersUtilsProvider, DatePicker } from \"@material-ui/pickers\";\r\nimport axios from \"axios\";\r\nimport apiUrl from \"../../../../common/apiUrl\";\r\nimport Loading from \"./Loading\";\r\nimport ThumbUpIcon from \"@material-ui/icons/ThumbUp\";\r\nimport DateRangeIcon from \"@material-ui/icons/DateRange\";\r\nimport Dropzone from \"../../../../common/Dropzone\";\r\n\r\nconst schema = {\r\n locationId: {\r\n presence: true,\r\n numericality: {\r\n onlyInteger: true,\r\n greaterThanOrEqualTo: 0,\r\n message: \"is required\",\r\n },\r\n },\r\n preferredLocation: {\r\n presence: true,\r\n numericality: {\r\n onlyInteger: true,\r\n greaterThanOrEqualTo: 0,\r\n message: \"is required\",\r\n },\r\n },\r\n insuranceId: {\r\n presence: true,\r\n numericality: {\r\n onlyInteger: true,\r\n greaterThanOrEqualTo: 0,\r\n message: \"is required\",\r\n },\r\n },\r\n bodyPartId: {\r\n presence: true,\r\n numericality: {\r\n onlyInteger: true,\r\n greaterThanOrEqualTo: 0,\r\n message: \"is required\",\r\n },\r\n },\r\n complaintId: {\r\n presence: true,\r\n numericality: {\r\n onlyInteger: true,\r\n greaterThanOrEqualTo: 0,\r\n message: \"is required\",\r\n },\r\n },\r\n acuityId: {\r\n presence: true,\r\n numericality: {\r\n onlyInteger: true,\r\n greaterThanOrEqualTo: 0,\r\n message: \"is required\",\r\n },\r\n },\r\n referringPhysician: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n maximum: 64,\r\n },\r\n },\r\n referringContact: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n maximum: 64,\r\n },\r\n },\r\n referringOfficePhone: {\r\n presence: {\r\n allowEmpty: false,\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n length: {\r\n minimum: 12,\r\n },\r\n format: {\r\n pattern: \"^(\\\\+0?1\\\\s)?\\\\(?\\\\d{3}\\\\)?[\\\\s.-]\\\\d{3}[\\\\s.-]\\\\d{4}$\",\r\n flags: \"i\",\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n },\r\n patientFirstName: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n maximum: 128,\r\n },\r\n },\r\n patientLastName: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n maximum: 128,\r\n },\r\n },\r\n streetAddress: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n minimum: 2,\r\n maximum: 150,\r\n },\r\n },\r\n zipCode: {\r\n presence: { allowEmpty: false, message: \"is required\" },\r\n length: {\r\n minimum: 5,\r\n maximum: 5,\r\n },\r\n format: {\r\n pattern: \"[0-9]+\",\r\n flags: \"i\",\r\n message: \"can only contain 0-9\",\r\n },\r\n },\r\n primaryPhone: {\r\n presence: {\r\n allowEmpty: false,\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n length: {\r\n minimum: 12,\r\n },\r\n format: {\r\n pattern: \"^(\\\\+0?1\\\\s)?\\\\(?\\\\d{3}\\\\)?[\\\\s.-]\\\\d{3}[\\\\s.-]\\\\d{4}$\",\r\n flags: \"i\",\r\n message: \"is required in the format 123-456-7890\",\r\n },\r\n },\r\n ssn: {\r\n length: {\r\n maximum: 11,\r\n },\r\n },\r\n birthDate: {\r\n presence: {\r\n allowEmpty: false,\r\n message: \"is required\",\r\n },\r\n },\r\n};\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n userTable: {\r\n paddingTop: \"2rem\",\r\n },\r\n input: {\r\n background: \"white\",\r\n },\r\n grid: {\r\n spacing: 0,\r\n display: \"flex\",\r\n direction: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n paddingTop: theme.spacing(7),\r\n },\r\n contentHeader: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n paddingTop: theme.spacing(5),\r\n paddingBottom: theme.spacing(2),\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n },\r\n contentBody: {\r\n flexGrow: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n logo: {\r\n marginTop: theme.spacing(5),\r\n marginBottom: theme.spacing(3),\r\n display: \"flex\",\r\n direction: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n linkExpired: {\r\n paddingTop: theme.spacing(4),\r\n textAlign: \"center\",\r\n marginBottom: \"6em\",\r\n },\r\n}));\r\n\r\nfunction Alert(props) {\r\n return ;\r\n}\r\n\r\nconst NoLoginReferralManager = (props) => {\r\n const classes = useStyles();\r\n\r\n const initialState = {\r\n isValid: false,\r\n values: {\r\n userId: \"\",\r\n locationId: props.locationId ? props.locationId : null,\r\n partnerId: props.referralPartnerId ? props.referralPartnerId : 11,\r\n referringPhysician: \"\",\r\n referringContact: \"\",\r\n referringOfficePhone: \"\",\r\n physicianRequested: \"\",\r\n preferredLocation: \"\",\r\n preferredApptTime: \"\",\r\n patientContactName: \"\",\r\n patientFirstName: \"\",\r\n patientLastName: \"\",\r\n gender: \"\",\r\n birthDate: null,\r\n ssn: \"\",\r\n streetAddress: \"\",\r\n zipCode: \"\",\r\n emailAddress: \"\",\r\n primaryPhone: \"\",\r\n referralSourceId: \"\",\r\n insuranceId: \"\",\r\n insuranceNumber: \"\",\r\n bodyPartId: \"\",\r\n complaintId: \"\",\r\n acuityId: \"\",\r\n previousSurgery: false,\r\n previousSurgerySide: \"\",\r\n attachmentPath: \"\",\r\n attachmentFName: \"\",\r\n otherInfo: \"\",\r\n referralContactEmail: \"\",\r\n },\r\n touched: {},\r\n errors: {},\r\n isLoading: false,\r\n };\r\n\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [sent, setSent] = useState(false);\r\n const [severity, setSeverity] = useState(\"\");\r\n const [message, setMessage] = useState(\"\");\r\n const [openSnack, setOpenSnack] = useState(false);\r\n const [openErrorSnack, setOpenErrorSnack] = useState(false);\r\n const [ddls, setDdls] = useState({});\r\n const [partnerLocations, setPartnerLocations] = useState();\r\n const [currentComplaint, setCurrentComplaint] = useState(1);\r\n const [apptId, setApptId] = useState();\r\n const [rky, setRky] = useState();\r\n const [locationAbbr, setLocationAbbr] = useState();\r\n const [formState, setFormState] = useState(initialState);\r\n\r\n const handleClose = (event, reason) => {\r\n if (reason === \"clickaway\") {\r\n return;\r\n }\r\n\r\n setOpenSnack(false);\r\n setOpenErrorSnack(false);\r\n };\r\n\r\n useEffect(() => {\r\n const errors = validate(formState.values, schema);\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n isValid: errors ? false : true,\r\n errors: errors || {},\r\n }));\r\n }, [formState.values]);\r\n\r\n useEffect(() => {\r\n const fetchPartnerLocations = async () => {\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await axios.post(\r\n apiUrl + \"/referral/partner-locations\",\r\n {\r\n partnerId: props.referralPartnerId ? props.referralPartnerId : 11,\r\n }\r\n );\r\n\r\n setPartnerLocations(() => result.data.data);\r\n\r\n setIsLoading(false);\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n fetchPartnerLocations();\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (\r\n formState.values.locationId !== \"\" &&\r\n formState.values.locationId !== true\r\n ) {\r\n const getDdls = async () => {\r\n //e.preventDefault();\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await axios.post(apiUrl + \"/referral/ddl\", {\r\n userId: \"9221794d-5b58-44cd-b092-825ffcd66b69\",\r\n sendToLocationId: props.locationId,\r\n });\r\n\r\n if (result !== null) {\r\n setDdls(() => result.data.data[0].spgetdropdowns.dropdowns[0]);\r\n setIsLoading(false);\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n getDdls();\r\n }\r\n }, [formState.values.locationId]);\r\n\r\n useEffect(() => {\r\n const errors = validate(formState.values, schema);\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n isValid: errors ? false : true,\r\n errors: errors || {},\r\n }));\r\n }, [formState.values]);\r\n\r\n const sendReferral = async () => {\r\n //e.preventDefault();\r\n\r\n setIsLoading(true);\r\n\r\n let unmounted = false;\r\n\r\n try {\r\n const result = await axios.post(apiUrl + \"/referral/send\", {\r\n userId: \"9221794d-5b58-44cd-b092-825ffcd66b69\",\r\n locationId: formState.values.locationId,\r\n partnerId: props.referralPartnerId ? props.referralPartnerId : 11,\r\n referringPhysician: formState.values.referringPhysician,\r\n referringContact: formState.values.referringContact,\r\n referringOfficePhone: formState.values.referringOfficePhone,\r\n physicianRequested: formState.values.physicianRequested,\r\n preferredLocation: formState.values.preferredLocation,\r\n preferredApptTime: 1,\r\n patientContactName: formState.values.patientContactName,\r\n patientFirstName: formState.values.patientFirstName,\r\n patientLastName: formState.values.patientLastName,\r\n gender: formState.values.gender,\r\n birthDate: formState.values.birthDate,\r\n ssn: formState.values.ssn,\r\n streetAddress: formState.values.streetAddress,\r\n zipCode: formState.values.zipCode,\r\n emailAddress: formState.values.emailAddress,\r\n primaryPhone: formState.values.primaryPhone,\r\n // referralSourceId: formState.values.referralSourceId,\r\n referralSourceId: 12,\r\n insuranceId: formState.values.insuranceId,\r\n insuranceNumber: formState.values.insuranceNumber,\r\n bodyPartId: formState.values.bodyPartId,\r\n complaintId: formState.values.complaintId,\r\n acuityId: formState.values.acuityId,\r\n previousSurgery: formState.values.previousSurgery,\r\n previousSurgerySide: formState.values.previousSurgerySide,\r\n attachmentPath: formState.values.attachmentPath,\r\n attachmentFName: formState.values.attachmentFName,\r\n otherInfo: formState.values.otherInfo,\r\n referralContactEmail: formState.values.referralContactEmail,\r\n });\r\n\r\n if (result && !unmounted) {\r\n setApptId(() => result.data.data[0].rsapptrequestid);\r\n setRky(() => result.data.data[0].rky);\r\n setLocationAbbr(() => result.data.data[0].locationabbr);\r\n setIsLoading(false);\r\n }\r\n\r\n setOpenSnack(true);\r\n setSent(() => true);\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(false);\r\n setOpenErrorSnack(true);\r\n setSent(() => false);\r\n }\r\n return () => {\r\n unmounted = true;\r\n };\r\n };\r\n\r\n const resetReferralForm = () => {\r\n setFormState(() => initialState);\r\n setSent(() => false);\r\n };\r\n\r\n const handleChange = (event) => {\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\"\r\n ? event.target.checked\r\n : event.target.value,\r\n },\r\n touched: {\r\n ...formState.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n\r\n if (event.target.name === \"bodyPartId\") {\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n complaintId: \"\",\r\n },\r\n touched: {\r\n ...formState.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const handlePhoneChange = (event) => {\r\n event.persist();\r\n\r\n var x = event.target.value\r\n .replace(/\\D/g, \"\")\r\n .match(/(\\d{0,3})(\\d{0,3})(\\d{0,4})/);\r\n x = event.target.value = !x[2]\r\n ? x[1]\r\n : x[1] + \"-\" + x[2] + (x[3] ? \"-\" + x[3] : \"\");\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\" ? event.target.checked : x,\r\n },\r\n touched: {\r\n ...formState.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const handleSSNChange = (event) => {\r\n event.persist();\r\n\r\n var x = event.target.value\r\n .replace(/\\D/g, \"\")\r\n .match(/(\\d{0,3})(\\d{0,2})(\\d{0,4})/);\r\n x = event.target.value = !x[2]\r\n ? x[1]\r\n : x[1] + \"-\" + x[2] + (x[3] ? \"-\" + x[3] : \"\");\r\n\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n [event.target.name]:\r\n event.target.type === \"checkbox\" ? event.target.checked : x,\r\n },\r\n touched: {\r\n ...formState.touched,\r\n [event.target.name]: true,\r\n },\r\n }));\r\n };\r\n\r\n const handleDateChange = (date) => {\r\n setFormState((formState) => ({\r\n ...formState,\r\n values: {\r\n ...formState.values,\r\n birthDate: date,\r\n },\r\n }));\r\n };\r\n\r\n const hasError = (field) =>\r\n formState.touched[field] && formState.errors[field] ? true : false;\r\n\r\n return (\r\n <>\r\n {/* \r\n \r\n \r\n \r\n \r\n MSMOC\r\n \r\n \r\n \r\n \r\n \r\n */}\r\n {isLoading ? (\r\n \r\n ) : sent === false ? (\r\n \r\n
\r\n
\r\n \r\n Referral sent successfully!\r\n \r\n \r\n
\r\n \r\n Failed to send referral. Please try again.\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 Your referral was sent successfully!\r\n \r\n \r\n\r\n \r\n \r\n Attach Documents To The Referral\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n I'm Finished!\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\nexport default NoLoginReferralManager;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { useParams, useHistory } from \"react-router-dom\";\r\nimport {\r\n Card,\r\n CardContent,\r\n Grid,\r\n Typography,\r\n makeStyles,\r\n} from \"@material-ui/core\";\r\nimport apiUrl from \"../../common/apiUrl\";\r\nimport Loading from \"./components/Loading\";\r\nimport { NoLoginReferralManager } from \"./components\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(4),\r\n },\r\n userMenuButton: {\r\n marginRight: theme.spacing(2),\r\n },\r\n}));\r\n\r\nconst ReferralNoLogin = () => {\r\n const classes = useStyles();\r\n\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [locationIsValid, setLocationIsValid] = useState(false);\r\n const [locationId, setLocationId] = useState(null);\r\n const [locationName, setLocationName] = useState(null);\r\n const [partnerIsValid, setPartnerIsValid] = useState(false);\r\n const [partnerId, setPartnerId] = useState(null);\r\n\r\n const { location, partner } = useParams();\r\n\r\n const trimmedPartner = partner ? partner.substring(0, 20) : null;\r\n\r\n /** check challenge status */\r\n useEffect(() => {\r\n setIsLoading(() => true);\r\n\r\n const config = {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Cache: \"no-cache\",\r\n },\r\n body: JSON.stringify({\r\n locationName: location,\r\n }),\r\n };\r\n\r\n const fetchData = async () => {\r\n try {\r\n const response = await fetch(`${apiUrl}/referral/location`, config);\r\n\r\n const json = await response.json();\r\n\r\n if (json) {\r\n if (json.message === true) {\r\n setLocationIsValid(() => true);\r\n setLocationId(() => json.data[0].locationid);\r\n setLocationName(() => json.data[0].locationname);\r\n setIsLoading(() => false);\r\n }\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(() => false);\r\n }\r\n };\r\n fetchData();\r\n\r\n if (trimmedPartner !== undefined) {\r\n const configPartnerFetch = {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Cache: \"no-cache\",\r\n },\r\n body: JSON.stringify({\r\n partnerAbbr: trimmedPartner,\r\n }),\r\n };\r\n const fetchPartnerId = async () => {\r\n try {\r\n const response = await fetch(\r\n `${apiUrl}/referral/partner`,\r\n configPartnerFetch\r\n );\r\n\r\n const json = await response.json();\r\n\r\n if (json) {\r\n if (json.message === true) {\r\n setPartnerIsValid(() => true);\r\n setPartnerId(() => json.data[0].partnerid);\r\n setIsLoading(() => false);\r\n }\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n setIsLoading(() => false);\r\n }\r\n };\r\n fetchPartnerId();\r\n }\r\n }, []);\r\n\r\n return (\r\n <>\r\n {isLoading ? (\r\n \r\n ) : locationIsValid === false ? (\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 This link is invalid. Please check the URL and try again.\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\nexport default ReferralNoLogin;\r\n","import React from \"react\";\r\nimport { Switch, Redirect } from \"react-router-dom\";\r\nimport { RouteWithLayout, AuthenticatedRoute } from \"./components\";\r\nimport {\r\n Main as MainLayout,\r\n Minimal as MinimalLayout,\r\n Login as LoginLayout,\r\n NoLoginReferralLayout as NoLoginLayout,\r\n} from \"./layouts\";\r\n\r\nimport {\r\n // Dashboard as DashboardView,\r\n Referral as ReferralView,\r\n ReferralNoLogin as ReferralNoLoginView,\r\n NotFound as NotFoundView,\r\n SignIn as SignInView,\r\n ForgotPassword as ForgotPasswordView,\r\n ResetPassword as ResetPasswordView,\r\n Settings as SettingsView,\r\n // Support as SupportView,\r\n} from \"./views\";\r\n\r\nconst Routes = () => {\r\n return (\r\n \r\n \r\n {/* */}\r\n \r\n \r\n \r\n {/* */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Routes;\r\n","import axios from \"axios\";\nimport apiUrl from \"./apiUrl.js\";\n\nconst accessTokenManager = () => {\n let accessToken = null;\n // let isRefreshing = null;\n // let refreshTimeOutId;\n\n const getRefreshedToken = async () => {\n try {\n const res = await fetch(apiUrl + \"/auth/refresh\", {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Cache: \"no-cache\",\n },\n credentials: \"include\",\n });\n\n const newAccessToken = await res.json();\n\n if (newAccessToken !== \"\") {\n setToken(newAccessToken.accessToken, newAccessToken.tokenExpiresOn);\n return newAccessToken;\n }\n } catch (error) {\n console.log(error);\n return null;\n }\n };\n\n const setToken = (token) => {\n accessToken = token;\n // refreshToken(delay);\n return true;\n };\n\n axios.interceptors.request.use(\n async (config) => {\n config.headers = {\n Authorization: `Bearer ${accessToken}`,\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n };\n return config;\n },\n (error) => {\n Promise.reject(error);\n }\n );\n\n axios.interceptors.response.use(\n (response) => {\n return response;\n },\n (error) => {\n if (error && error.response && error.response.status === 401) {\n // 401 error redirect to login\n return Promise.reject(error);\n }\n if (error.response.status !== 401) {\n return new Promise((resolve, reject) => {\n reject(error);\n });\n }\n }\n );\n\n // const refreshToken = (delay) => {\n // refreshTimeOutId = window.setTimeout(\n // getRefreshedToken,\n // delay * 1000 - 5000\n // ); // Validity period of the token in seconds, minus 5 seconds\n // };\n\n // const abortRefreshToken = () => {\n // if (refreshTimeOutId) {\n // window.clearTimeout(refreshTimeOutId);\n // }\n // };\n\n // const waitForTokenRefresh = () => {\n // if (!isRefreshing) {\n // return Promise.resolve();\n // }\n // return isRefreshing.then(() => {\n // isRefreshing = null;\n // return true;\n // });\n // };\n\n // const request = new Request(refreshEndpoint, {\n // method: \"POST\",\n // headers: new Headers({ \"Content-Type\": \"application/json\" }),\n // credentials: \"include\",\n // });\n\n // isRefreshing = fetch(request)\n // .then((response) => {\n // if (response.status !== 200) {\n // eraseToken();\n // global.console.log(\"Token renewal failure\");\n // return { token: null };\n // }\n // //console.log(response.json());\n // return response.json();\n // })\n // .then(({ token, tokenExpiry }) => {\n // if (token) {\n // console.log(`token: ${JSON.stringify(token)}`);\n // setToken(token, tokenExpiry);\n // return true;\n // }\n // eraseToken();\n // return false;\n // });\n\n // return isRefreshing;\n\n // const getToken = () => accessToken;\n\n // Response interceptor for API calls\n // axios.interceptors.response.use(\n // (response) => {\n // return response;\n // },\n // async function (error) {\n // const originalRequest = error.config;\n // if (error.response.status === 401 && !originalRequest._retry) {\n // originalRequest._retry = true;\n // const access_token = await getRefreshedToken();\n // axios.defaults.headers.common[\"Authorization\"] =\n // \"Bearer \" + access_token;\n // return axios(originalRequest);\n // }\n // return Promise.reject(error);\n // }\n // );\n\n // const eraseToken = () => {\n // accessToken = null;\n // abortRefreshToken();\n // return true;\n // };\n\n return {\n getRefreshedToken,\n setToken,\n apiUrl,\n };\n};\n\nexport default accessTokenManager();\n","const checked = (value, options) => {\r\n if (value !== true) {\r\n return options.message || 'must be checked';\r\n }\r\n};\r\n\r\nexport default {\r\n checked\r\n};\r\n","import { Chart } from 'react-chartjs-2';\n\n// ChartJS extension rounded bar chart\n// https://codepen.io/jedtrow/full/ygRYgo\nfunction draw() {\n const { ctx } = this._chart;\n const vm = this._view;\n let { borderWidth } = vm;\n\n let left;\n let right;\n let top;\n let bottom;\n let signX;\n let signY;\n let borderSkipped;\n let radius;\n\n // If radius is less than 0 or is large enough to cause drawing errors a max\n // radius is imposed. If cornerRadius is not defined set it to 0.\n let { cornerRadius } = this._chart.config.options;\n if (cornerRadius < 0) {\n cornerRadius = 0;\n }\n\n if (typeof cornerRadius === 'undefined') {\n cornerRadius = 0;\n }\n\n if (!vm.horizontal) {\n // bar\n left = vm.x - vm.width / 2;\n right = vm.x + vm.width / 2;\n top = vm.y;\n bottom = vm.base;\n signX = 1;\n signY = bottom > top ? 1 : -1;\n borderSkipped = vm.borderSkipped || 'bottom';\n } else {\n // horizontal bar\n left = vm.base;\n right = vm.x;\n top = vm.y - vm.height / 2;\n bottom = vm.y + vm.height / 2;\n signX = right > left ? 1 : -1;\n signY = 1;\n borderSkipped = vm.borderSkipped || 'left';\n }\n\n // Canvas doesn't allow us to stroke inside the width so we can\n // adjust the sizes to fit if we're setting a stroke on the line\n if (borderWidth) {\n // borderWidth shold be less than bar width and bar height.\n const barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom));\n borderWidth = borderWidth > barSize ? barSize : borderWidth;\n const halfStroke = borderWidth / 2;\n // Adjust borderWidth when bar top position is near vm.base(zero).\n const borderLeft = left + (borderSkipped !== 'left' ? halfStroke * signX : 0);\n const borderRight = right + (borderSkipped !== 'right' ? -halfStroke * signX : 0);\n const borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0);\n const borderBottom = bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0);\n // not become a vertical line?\n if (borderLeft !== borderRight) {\n top = borderTop;\n bottom = borderBottom;\n }\n // not become a horizontal line?\n if (borderTop !== borderBottom) {\n left = borderLeft;\n right = borderRight;\n }\n }\n\n ctx.beginPath();\n ctx.fillStyle = vm.backgroundColor;\n ctx.strokeStyle = vm.borderColor;\n ctx.lineWidth = borderWidth;\n\n // Corner points, from bottom-left to bottom-right clockwise\n // | 1 2 |\n // | 0 3 |\n const corners = [[left, bottom], [left, top], [right, top], [right, bottom]];\n\n // Find first (starting) corner with fallback to 'bottom'\n const borders = ['bottom', 'left', 'top', 'right'];\n let startCorner = borders.indexOf(borderSkipped, 0);\n if (startCorner === -1) {\n startCorner = 0;\n }\n\n function cornerAt(index) {\n return corners[(startCorner + index) % 4];\n }\n\n // Draw rectangle from 'startCorner'\n let corner = cornerAt(0);\n ctx.moveTo(corner[0], corner[1]);\n\n for (let i = 1; i < 4; i += 1) {\n corner = cornerAt(i);\n let nextCornerId = i + 1;\n if (nextCornerId === 4) {\n nextCornerId = 0;\n }\n\n const width = corners[2][0] - corners[1][0];\n const height = corners[0][1] - corners[1][1];\n const x = corners[1][0];\n const y = corners[1][1];\n\n radius = cornerRadius;\n // Fix radius being too large\n if (radius > Math.abs(height) / 2) {\n radius = Math.floor(Math.abs(height) / 2);\n }\n if (radius > Math.abs(width) / 2) {\n radius = Math.floor(Math.abs(width) / 2);\n }\n\n if (height < 0) {\n // Negative values in a standard bar chart\n const xTl = x;\n const xTr = x + width;\n const yTl = y + height;\n const yTr = y + height;\n\n const xBl = x;\n const xBr = x + width;\n const yBl = y;\n const yBr = y;\n\n // Draw\n ctx.moveTo(xBl + radius, yBl);\n ctx.lineTo(xBr - radius, yBr);\n ctx.quadraticCurveTo(xBr, yBr, xBr, yBr - radius);\n ctx.lineTo(xTr, yTr + radius);\n ctx.quadraticCurveTo(xTr, yTr, xTr - radius, yTr);\n ctx.lineTo(xTl + radius, yTl);\n ctx.quadraticCurveTo(xTl, yTl, xTl, yTl + radius);\n ctx.lineTo(xBl, yBl - radius);\n ctx.quadraticCurveTo(xBl, yBl, xBl + radius, yBl);\n } else if (width < 0) {\n // Negative values in a horizontal bar chart\n const xTl = x + width;\n const xTr = x;\n const yTl = y;\n const yTr = y;\n\n const xBl = x + width;\n const xBr = x;\n const yBl = y + height;\n const yBr = y + height;\n\n // Draw\n ctx.moveTo(xBl + radius, yBl);\n ctx.lineTo(xBr - radius, yBr);\n ctx.quadraticCurveTo(xBr, yBr, xBr, yBr - radius);\n ctx.lineTo(xTr, yTr + radius);\n ctx.quadraticCurveTo(xTr, yTr, xTr - radius, yTr);\n ctx.lineTo(xTl + radius, yTl);\n ctx.quadraticCurveTo(xTl, yTl, xTl, yTl + radius);\n ctx.lineTo(xBl, yBl - radius);\n ctx.quadraticCurveTo(xBl, yBl, xBl + radius, yBl);\n } else {\n // Positive Value\n ctx.moveTo(x + radius, y);\n ctx.lineTo(x + width - radius, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n ctx.lineTo(x + width, y + height - radius);\n ctx.quadraticCurveTo(\n x + width,\n y + height,\n x + width - radius,\n y + height\n );\n ctx.lineTo(x + radius, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n }\n }\n\n ctx.fill();\n if (borderWidth) {\n ctx.stroke();\n }\n}\n\nChart.helpers.extend(Chart.elements.Rectangle.prototype, {\n draw\n});\n","import React, { useState, useMemo, useEffect } from \"react\";\r\nimport { Router } from \"react-router-dom\";\r\nimport { createBrowserHistory } from \"history\";\r\nimport { UserContext } from \"./UserContext\";\r\nimport { ThemeProvider } from \"@material-ui/styles\";\r\nimport theme from \"./theme\";\r\nimport Routes from \"./Routes\";\r\nimport axios from \"axios\";\r\nimport createAuthRefreshInterceptor from \"axios-auth-refresh\";\r\nimport AccessTokenManager from \"./common/accessTokenManager.js\";\r\nimport validate from \"validate.js\";\r\nimport validators from \"./common/validators\";\r\nimport apiUrl from \"./common/apiUrl.js\";\r\nimport \"./mixins/chartjs.js\";\r\nimport \"./App.css\";\r\n\r\nconst browserHistory = createBrowserHistory();\r\n\r\nvalidate.validators = {\r\n ...validate.validators,\r\n ...validators,\r\n};\r\n\r\nconst App = () => {\r\n const [user, setUser] = useState({\r\n username: \"\",\r\n isAuthenticated: false,\r\n customerStatus: \"\",\r\n accessToken: \"\",\r\n tokenExpiresOn: \"\",\r\n });\r\n const value = useMemo(() => ({ user, setUser }), [user, setUser]);\r\n\r\n /** config axios */\r\n axios.create({\r\n baseURL: apiUrl,\r\n withCredentials: true,\r\n });\r\n\r\n const AxiosRefreshOptions = {\r\n pauseInstanceWhileRefreshing: true,\r\n statusCodes: [401],\r\n };\r\n\r\n // Function called to refresh authorization\r\n const refreshAuthLogic = (failedRequest) =>\r\n AccessTokenManager.getRefreshedToken().then((tokenRefreshResponse) => {\r\n setUser({\r\n username: tokenRefreshResponse.username,\r\n isAuthenticated: tokenRefreshResponse.isAuthenticated,\r\n customerStatus: tokenRefreshResponse.customerStatus,\r\n accessToken: tokenRefreshResponse.accessToken,\r\n tokenExpiresOn: tokenRefreshResponse.tokenExpiresOn,\r\n });\r\n failedRequest.response.config.headers[\"Authorization\"] =\r\n \"Bearer \" + unescape(tokenRefreshResponse.accessToken);\r\n return Promise.resolve();\r\n });\r\n\r\n // Instantiate interceptor\r\n createAuthRefreshInterceptor(axios, refreshAuthLogic, AxiosRefreshOptions);\r\n /** end config axios */\r\n\r\n useEffect(() => {\r\n let unmounted = false;\r\n const fetchData = async () => {\r\n try {\r\n const newAccessToken = await AccessTokenManager.getRefreshedToken();\r\n\r\n if (newAccessToken && newAccessToken !== null) {\r\n setUser({\r\n username: newAccessToken.username,\r\n isAuthenticated: newAccessToken.isAuthenticated,\r\n customerStatus: newAccessToken.customerStatus,\r\n accessToken: newAccessToken.accessToken,\r\n tokenExpiresOn: newAccessToken.tokenExpiresOn,\r\n });\r\n } else {\r\n browserHistory.push(\"/\");\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n };\r\n\r\n fetchData();\r\n\r\n return () => {\r\n // eslint-disable-next-line\r\n unmounted = true;\r\n };\r\n }, []);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default App;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\n\r\nimport * as serviceWorker from './serviceWorker';\r\nimport App from './App';\r\n\r\nReactDOM.render( , document.getElementById('root'));\r\n\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""}