('All');\r\n const { getUserInfo } = useAuthentication();\r\n const handleCloseSnackBar = (_: unknown, reason?: string) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n setOpenSnackBar(false);\r\n };\r\n useEffect(() => {\r\n const fetchOptions = async () => {\r\n const user = getUserInfo();\r\n const facilityIDs = user.facilities.map(\r\n ({\r\n facilityID,\r\n facilityName\r\n }: {\r\n facilityID: unknown;\r\n facilityName: unknown;\r\n }) => ({\r\n value: facilityID,\r\n label: facilityName\r\n })\r\n );\r\n const header = {\r\n headers: {\r\n Authorization: `Bearer ${sessionStorage.getItem('usertoken')}`\r\n }\r\n };\r\n const statusList = await axios.post(\r\n `${process.env.REACT_APP_URL}/?route=${ROUTES.PartnerGetStatusList}`,\r\n facilityIDs.map((x: { value: unknown }) => x.value),\r\n header\r\n );\r\n const voidReasons_IBIS = await axios.get(\r\n `${process.env.REACT_APP_URL}/4/?route=${ROUTES.PartnerGetEncounterHeaderVoidReasonList}`,\r\n header\r\n );\r\n const voidReasons_HRZN = await axios.get(\r\n `${process.env.REACT_APP_URL}/1/?route=${ROUTES.PartnerGetEncounterHeaderVoidReasonList}`,\r\n header\r\n );\r\n setVoidReasonsHRZN(voidReasons_HRZN.data);\r\n setVoidReasonsIBIS(voidReasons_IBIS.data);\r\n setStatusList(\r\n statusList.data.map((el: { description: string }) => el.description)\r\n );\r\n setFacilityOptions(facilityIDs);\r\n };\r\n fetchOptions();\r\n }, [getUserInfo]);\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n const payload = {\r\n facilityIds: facility.map((el: { value: unknown }) => el.value),\r\n statusFilter: mapStatusFilter(status),\r\n key: mapAdvancedFilter(advancedFilter),\r\n value1: value1\r\n ? advancedFilter === 'Date Of Service Range'\r\n ? moment(value1).format('MM-DD-YYYY')\r\n : value1\r\n : '',\r\n value2: value2\r\n ? advancedFilter === 'Date Of Service Range'\r\n ? moment(value2).format('MM-DD-YYYY')\r\n : value2\r\n : '',\r\n actionOwner: mapActionOwner(actionOwner)\r\n };\r\n const config = {\r\n headers: {\r\n Authorization: `Bearer ${sessionStorage.getItem('usertoken')}`\r\n }\r\n };\r\n const URL = `${process.env.REACT_APP_URL}/?route=PartnerGetMyEncounterMasterView`;\r\n const isFetching = search || refetch;\r\n let result = encounters;\r\n try {\r\n result = isFetching ? await axios.post(URL, payload, config) : result;\r\n if (isFetching) {\r\n setOpenSnackBar(false);\r\n setMessage('');\r\n }\r\n } catch (error) {\r\n const errorMsg = (error as ErrorResponse)?.response?.data?.Error;\r\n if (errorMsg) {\r\n setOpenSnackBar(true);\r\n }\r\n setMessage(errorMsg ? errorMsg : message);\r\n }\r\n\r\n setEncounters(isFetching ? result?.data || [] : result);\r\n setCurrentStatus(isFetching ? status : currentStatus);\r\n setNotSearched(isFetching ? false : notSearched);\r\n setSearch(false);\r\n };\r\n fetchData();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [search, refetch]);\r\n\r\n useEffect(() => {\r\n setIsLoading(false);\r\n }, [encounters]);\r\n\r\n useEffect(() => {\r\n const fetchComments = async (payload: any) => {\r\n const triggerFetch =\r\n (!!payload && refetch) ||\r\n (comments.length === 0 &&\r\n !!payload &&\r\n Object.keys(payload).length === 3);\r\n const result = triggerFetch\r\n ? await axios.post(\r\n `${process.env.REACT_APP_URL}/?route=${ROUTES.PartnerGetMyEncounterComments}`,\r\n payload,\r\n {\r\n headers: {\r\n Authorization: `Bearer ${sessionStorage.getItem('usertoken')}`\r\n }\r\n }\r\n )\r\n : comments;\r\n setComments(triggerFetch ? result.data : comments);\r\n setRefetch(false);\r\n };\r\n fetchComments(openComment);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [openComment, refetch]);\r\n\r\n useEffect(() => {\r\n const voidRecord = async () => {\r\n if (saveVoid) {\r\n const payload = {\r\n encounterHeaderIdentifier: openVoidDialog,\r\n encounterHeaderVoidReasonID: selectedVoidReason\r\n ? selectedVoidReason.encounterHeaderVoidReasonID\r\n : '',\r\n comment: optionalComment\r\n };\r\n try {\r\n await axios.post(\r\n `${process.env.REACT_APP_URL}/?route=${ROUTES.PartnerUpSertEncounterHeaderStatusVoidUpdate}`,\r\n payload,\r\n {\r\n headers: {\r\n Authorization: `Bearer ${sessionStorage.getItem('usertoken')}`\r\n }\r\n }\r\n );\r\n setIsSuccess(true);\r\n setMessage('Record voided.');\r\n setOptionalComment('');\r\n setSelectedVoidReason(null);\r\n setOpenVoidDialog(null);\r\n setRefetch(true);\r\n } catch (err: AxiosError | unknown) {\r\n const errMsg = axios.isAxiosError(err)\r\n ? err?.response?.data?.Error\r\n : 'There is an error.';\r\n setIsSuccess(false);\r\n setMessage(errMsg);\r\n } finally {\r\n setOpenSnackBar(true);\r\n setSaveVoid(false);\r\n }\r\n }\r\n };\r\n voidRecord();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [saveVoid]);\r\n\r\n useEffect(() => {\r\n const saveComments = async () => {\r\n const user = getUserInfo();\r\n const payload = {\r\n encounterHeaderIDList: [openComment],\r\n encounterHeaderCommentTypeID:\r\n selectedPreset.encounterHeaderCommentTypeID,\r\n externalUserID: user && user.externalUserID, // populate\r\n internalUserID: 0,\r\n isPrivate: false,\r\n internalUserName: '',\r\n externalUserName: user && user.externalUserName, // populate\r\n comment: (newComment || '').trim()\r\n ? `${\r\n selectedPreset?.encounterHeaderCommentType\r\n }: ${newComment.trim()}`\r\n : selectedPreset.encounterHeaderCommentType, // populate\r\n createdDateTime: new Date(),\r\n isInternalUser: false\r\n };\r\n let hasErr = true;\r\n let errRes: AxiosError | undefined;\r\n try {\r\n if (submitComment) {\r\n await axios.post(\r\n `${process.env.REACT_APP_URL}/?route=${ROUTES.PartnerUpSertEncounterComment}`,\r\n payload,\r\n {\r\n headers: {\r\n Authorization: `Bearer ${sessionStorage.getItem('usertoken')}`\r\n }\r\n }\r\n );\r\n }\r\n hasErr = false;\r\n // eslint-disable-next-line no-empty\r\n } catch (err: AxiosError | unknown) {\r\n if (axios.isAxiosError(err)) errRes = err;\r\n }\r\n setIsSuccess(submitComment ? !hasErr : isSuccess);\r\n setMessage(\r\n submitComment\r\n ? hasErr\r\n ? errRes\r\n ? (errRes.response?.data['Error'] as string)\r\n : 'There is an error.'\r\n : 'Comment saved.'\r\n : message\r\n );\r\n setOpenSnackBar(submitComment ? true : openSnackbar);\r\n setNewComment(submitComment ? '' : newComment);\r\n setRefetch(submitComment ? true : refetch);\r\n setSubmitComment(false);\r\n setSelectedPreset({});\r\n };\r\n saveComments();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [submitComment]);\r\n const user = getUserInfo();\r\n\r\n if (!user.showMyEncounters) {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n
My Encounters
\r\n
\r\n Please select Search Type criteria and click Search\r\n
\r\n
\r\n {/* eslint-disable-next-line react/jsx-no-target-blank */}\r\n
\r\n User Guide\r\n \r\n
\r\n \r\n \r\n \r\n \r\n {isLoading ? (\r\n \r\n \r\n
\r\n ) : (\r\n \r\n
\r\n {\r\n return {\r\n ...encounter,\r\n dateOfService: encounter.dateOfService\r\n ? moment(encounter.dateOfService).format('MM/DD/YY')\r\n : '',\r\n dateHeld: encounter.dateHeld\r\n ? moment(encounter.dateHeld).format('MM/DD/YY')\r\n : '',\r\n nextCheckDate: encounter.nextCheckDate\r\n ? moment(encounter.nextCheckDate).format('MM/DD/YY')\r\n : '',\r\n patientDOB: encounter.patientDOB\r\n ? moment(encounter.patientDOB).format('MM/DD/YYYY')\r\n : ''\r\n };\r\n }) || []\r\n }\r\n handleComments={(rowId: any, dateOfService: any) => {\r\n setOpenComment(rowId);\r\n setOpenCommentDOS(moment(dateOfService).format('MM/DD/YYYY'));\r\n }}\r\n handleVoid={(rowId: any) => {\r\n setOpenVoidDialog(rowId);\r\n }}\r\n handleOpenExceptions={(rowId: any) => setOpenExceptions(rowId)}\r\n openRecord={openComment || openVoidDialog || openExceptions}\r\n notSearched={notSearched}\r\n refetch={() => setRefetch(true)}\r\n />\r\n setSubmitComment(true)}\r\n newComment={newComment}\r\n onChange={(e: { target: { value: string } }) =>\r\n setNewComment(e.target.value)\r\n }\r\n onChangePreset={(value: any) => {\r\n if (value.encounterHeaderCommentTypeID) {\r\n setSelectedPreset(value);\r\n }\r\n }}\r\n onClose={() => {\r\n setOpenComment(null);\r\n setRefetch(false);\r\n setComments([]);\r\n }}\r\n />\r\n {!!openExceptions && (\r\n setOpenExceptions(null)}\r\n encounterHeaderId={openExceptions.encounterHeaderId}\r\n facilityId={openExceptions.facilityID}\r\n />\r\n )}\r\n \r\n setSelectedVoidReason(e.target.value)\r\n }\r\n optionalComment={optionalComment}\r\n handleOptionalCommentChange={(e: { target: { value: string } }) =>\r\n setOptionalComment(e.target.value)\r\n }\r\n onSave={() => setSaveVoid(true)}\r\n onClose={() => {\r\n setOpenVoidDialog(null);\r\n setOptionalComment('');\r\n setSelectedVoidReason(null);\r\n setRefetch(false);\r\n }}\r\n />\r\n \r\n {openSnackbar ? (\r\n \r\n {message}\r\n \r\n ) : undefined}\r\n \r\n \r\n
\r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nconst mapAdvancedFilter = (advancedFilter: string) => {\r\n switch (advancedFilter) {\r\n case 'Date Of Birth':\r\n return 'PatientDOB';\r\n case 'Patient Last Name':\r\n return 'LastName';\r\n case 'Account Number':\r\n return 'FacilityAccountNumber';\r\n case 'Date Of Service Range':\r\n return 'DateOfServiceRange';\r\n // case 'Responsible Provider':\r\n // return 'ResponsibleProvider'\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\nfunction Alert(props: AlertProps) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nconst Layout = styled.div`\r\n max-width: 2048px;\r\n margin: 0 auto;\r\n padding: 0 30px;\r\n`;\r\n\r\nconst mapActionOwner = (actionOwner: string): number => {\r\n actionOwner = actionOwner.toLowerCase();\r\n switch (actionOwner) {\r\n case 'all':\r\n return 0;\r\n case 'client':\r\n return 1;\r\n case 'ventra':\r\n return 2;\r\n default:\r\n return -1;\r\n }\r\n};\r\n\r\nconst mapStatusFilter = (statusFilter: string): string => {\r\n switch (statusFilter) {\r\n case 'On Hold':\r\n return 'OnHold';\r\n case 'Pre-Coding Authorization':\r\n return 'PreCodingAuthorization';\r\n default:\r\n return statusFilter;\r\n }\r\n};\r\n\r\nexport default MyEncounters;\r\n","import { createContext, useContext, useState } from 'react';\r\n\r\nconst MyTransactionsSummaryContext = createContext({});\r\n\r\nexport function useMyTransactionsSummaryContext() {\r\n return useContext(MyTransactionsSummaryContext);\r\n}\r\n\r\nfunction MyTransactionsSummaryContextProvider(props) {\r\n const [facilityOptions, setFacilityOptions] = useState([]);\r\n const [facility, setFacility] = useState([]);\r\n const [advancedFilter, setAdvancedFilter] = useState('-- Select --');\r\n const [value1, setValue1] = useState('');\r\n const [value2, setValue2] = useState('');\r\n const [search, setSearch] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [encounters, setEncounters] = useState([]);\r\n const [providerSearch, setProviderSearch] = useState(null);\r\n const [notSearched, setNotSearched] = useState(true);\r\n\r\n const providerValue = {\r\n facilityOptions,\r\n setFacilityOptions,\r\n facility,\r\n setFacility,\r\n advancedFilter,\r\n setAdvancedFilter,\r\n value1,\r\n setValue1,\r\n value2,\r\n setValue2,\r\n search,\r\n setSearch,\r\n isLoading,\r\n setIsLoading,\r\n encounters,\r\n setEncounters,\r\n providerSearch,\r\n setProviderSearch,\r\n notSearched,\r\n setNotSearched\r\n };\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}\r\n\r\nexport default MyTransactionsSummaryContextProvider;\r\n","import {\r\n FormControl,\r\n Select,\r\n OutlinedInput,\r\n MenuItem,\r\n InputLabel,\r\n CircularProgress,\r\n Box\r\n} from '@material-ui/core';\r\nimport styled from 'styled-components';\r\nimport { useMutation } from 'react-query';\r\nimport { ROUTES } from 'constants/routes';\r\nimport { useEffect } from 'react';\r\nimport { useAuthenticatedAxios } from 'hooks/useAuthenticatedAxios';\r\nimport { useMyTransactionsSummaryContext } from './MyTransactionsSummaryContext';\r\nimport _ from 'lodash';\r\n\r\nexport function ProviderAutoCompleteField() {\r\n const {\r\n data: providers,\r\n mutate: getProviders,\r\n isLoading\r\n } = useProviderSearch();\r\n const {\r\n facility: selectedFacilities,\r\n setProviderSearch,\r\n providerSearch,\r\n setValue1\r\n } = useMyTransactionsSummaryContext();\r\n\r\n useEffect(() => {\r\n if (!selectedFacilities) return;\r\n getProviders(selectedFacilities.map(facility => facility.value));\r\n }, [selectedFacilities, getProviders]);\r\n\r\n return (\r\n \r\n Provider\r\n }\r\n defaultValue={'default'}\r\n value={providerSearch?.providerAK}\r\n endAdornment={\r\n isLoading ? (\r\n \r\n \r\n \r\n ) : null\r\n }\r\n onChange={e => {\r\n setValue1('');\r\n setProviderSearch(\r\n _.pick(\r\n providers.find(item => item.providerAK === e.target.value),\r\n ['providerAK', 'srcSystemSK']\r\n )\r\n );\r\n }}\r\n >\r\n \r\n {providers\r\n ?.sort((a, b) => a.providerFormattedName - b.providerFormattedName)\r\n .map(option => {\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 \"facilityAK\": 20,\r\n \"providerFormattedName\": \"GARRISON MD, G\",\r\n \"providerAK\": 1,\r\n \"srcSystemSK\": 1\r\n}\r\n*/\r\n\r\nconst useProviderSearch = () => {\r\n const Axios = useAuthenticatedAxios();\r\n return useMutation(ROUTES.PartnerGetProviderList, async payload => {\r\n if (!payload) return [];\r\n let data = [];\r\n try {\r\n const result = (\r\n await Axios({\r\n method: 'post',\r\n data: {\r\n facilityIds: payload\r\n },\r\n url: `/?route=${ROUTES.PartnerGetProviderList}`\r\n })\r\n ).data;\r\n if (result && result?.length) data = result;\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n return data;\r\n });\r\n};\r\n\r\nconst StyledInputLabel = styled(InputLabel)`\r\n pointer-events: auto;\r\n &.MuiInputLabel-outlined {\r\n transform: translate(14px, 15px) scale(1);\r\n }\r\n &.MuiInputLabel-outlined.MuiInputLabel-shrink {\r\n background: linear-gradient(#f5f5f5 50%, white 50%);\r\n padding: 0 5px;\r\n display: flex;\r\n align-items: center;\r\n transform: translate(14px, -8px) scale(0.75);\r\n }\r\n`;\r\n","import styled from 'styled-components';\r\nimport moment from 'moment';\r\nimport OutlinedInput from '@material-ui/core/OutlinedInput';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport Select from '@material-ui/core/Select';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport { useMyTransactionsSummaryContext } from './MyTransactionsSummaryContext';\r\nimport { isFuture, parse } from 'date-fns';\r\nimport { BrandColor } from 'constants/brandColor';\r\nimport { SubmitButton } from 'components';\r\nimport { WarningButton } from 'components/Buttons';\r\nimport { Tooltip } from 'components/Tooltip';\r\nimport { Help } from '@material-ui/icons';\r\nimport { DateField } from 'components';\r\nimport ReactInputMask from 'react-input-mask';\r\nimport { ProviderAutoCompleteField } from './ProviderAutoCompleteField';\r\nimport { useAuthentication } from 'hooks/useAuthentication';\r\nimport { LOGINTYPES } from 'constants/login';\r\nimport { useEffect, useState } from 'react';\r\n\r\nfunction MyEncountersSearchForm() {\r\n const {\r\n facilityOptions,\r\n facility: selectedFacilities,\r\n setFacility,\r\n advancedFilter,\r\n setAdvancedFilter,\r\n value1,\r\n value2,\r\n setValue1,\r\n setValue2,\r\n setSearch,\r\n isLoading,\r\n setIsLoading,\r\n setNotSearched,\r\n providerSearch,\r\n setProviderSearch\r\n } = useMyTransactionsSummaryContext();\r\n const authContext = useAuthentication();\r\n\r\n const dobInFuture =\r\n advancedFilter === 'Date Of Birth' &&\r\n isFuture(parse(value1, 'MM/dd/yyyy', new Date()));\r\n\r\n const disabled =\r\n isLoading ||\r\n (selectedFacilities && selectedFacilities.length === 0) ||\r\n advancedFilter === '-- Select --' ||\r\n (advancedFilter !== FilterOptions.respProvider && value1 === '') ||\r\n (advancedFilter === 'Date Of Birth' &&\r\n moment(value1).format('MM/DD/yyyy') === 'Invalid date') ||\r\n (advancedFilter === FilterOptions.respProvider && !providerSearch) ||\r\n dobInFuture;\r\n const userTypeID = authContext.getUserInfo().externalUserTypeID;\r\n const [adjustedFilterOptions, setAdjustedFilterOptions] = useState(\r\n advancedFilterOptions\r\n );\r\n\r\n useEffect(() => {\r\n setAdjustedFilterOptions(prev => {\r\n if (prev.includes(FilterOptions.respProvider)) return prev;\r\n if (userTypeID === LOGINTYPES.CHART_COORDINATOR)\r\n return [...prev, FilterOptions.respProvider];\r\n return prev;\r\n });\r\n }, [userTypeID]);\r\n\r\n return (\r\n {\r\n if (!disabled && ev.key === 'Enter') {\r\n setIsLoading(true);\r\n setSearch(true);\r\n ev.preventDefault();\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 {!!advancedFilter &&\r\n advancedFilter !== '-- Select --' &&\r\n advancedFilter !== FilterOptions.dosRange &&\r\n advancedFilter !== FilterOptions.dob &&\r\n advancedFilter !== FilterOptions.respProvider && (\r\n
setValue1(e.target.value)}\r\n />\r\n )}\r\n\r\n {!!advancedFilter && advancedFilter === FilterOptions.dob && (\r\n setValue1(e.target.value)}\r\n >\r\n \r\n \r\n )}\r\n\r\n {/* DOS RANGE INPUTS________ */}\r\n {!!advancedFilter && advancedFilter === FilterOptions.dosRange && (\r\n <>\r\n \r\n \r\n >\r\n )}\r\n\r\n {!!advancedFilter &&\r\n advancedFilter === FilterOptions.respProvider && (\r\n \r\n )}\r\n \r\n\r\n
\r\n {\r\n setIsLoading(true);\r\n setSearch(true);\r\n }}\r\n >\r\n Search\r\n \r\n {\r\n setFacility([]);\r\n setAdvancedFilter('-- Select --');\r\n setValue1('');\r\n setValue2('');\r\n setNotSearched(true);\r\n setProviderSearch(null);\r\n }}\r\n >\r\n Clear\r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default MyEncountersSearchForm;\r\n\r\nconst StyledCheckbox = styled(Checkbox)`\r\n &.Mui-checked {\r\n color: ${BrandColor.ACCENT} !important;\r\n }\r\n`;\r\nconst StyledInputLabel = styled(InputLabel)`\r\n pointer-events: auto;\r\n &.MuiInputLabel-outlined {\r\n transform: translate(14px, 15px) scale(1);\r\n }\r\n &.MuiInputLabel-outlined.MuiInputLabel-shrink {\r\n background: linear-gradient(#f5f5f5 50%, white 50%);\r\n padding: 0 5px;\r\n display: flex;\r\n align-items: center;\r\n transform: translate(14px, -8px) scale(0.75);\r\n }\r\n`;\r\nconst LabelWithTooltip = ({ id, label, toolTipText }) => (\r\n \r\n {label}\r\n \r\n \r\n \r\n \r\n);\r\nconst FacilitiesField = styled(FormControl)`\r\n width: 285px;\r\n`;\r\n\r\nexport const FilterOptions = {\r\n dosRange: 'Date Of Service Range',\r\n accNumber: 'Account Number',\r\n patientLName: 'Patient Last Name',\r\n dob: 'Date Of Birth',\r\n invoiceNum: 'Invoice Number',\r\n statementAcc: 'Statement Account',\r\n respProvider: 'Provider'\r\n};\r\nconst advancedFilterOptions = [\r\n '-- Select --',\r\n FilterOptions.dosRange,\r\n FilterOptions.accNumber,\r\n FilterOptions.patientLName,\r\n FilterOptions.dob,\r\n FilterOptions.invoiceNum,\r\n FilterOptions.statementAcc\r\n];\r\n","import React from 'react';\r\n\r\nimport FirstPageIcon from '@material-ui/icons/FirstPage';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport KeyboardArrowLeft from '@material-ui/icons/KeyboardArrowLeft';\r\nimport KeyboardArrowRight from '@material-ui/icons/KeyboardArrowRight';\r\nimport LastPageIcon from '@material-ui/icons/LastPage';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n flexShrink: 0,\r\n marginLeft: theme.spacing(2.5)\r\n }\r\n}));\r\n\r\nconst TablePaginationActions = props => {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const { count, page, rowsPerPage, onChangePage } = props;\r\n\r\n const handleFirstPageButtonClick = event => {\r\n onChangePage(event, 0);\r\n };\r\n\r\n const handleBackButtonClick = event => {\r\n onChangePage(event, page - 1);\r\n };\r\n\r\n const handleNextButtonClick = event => {\r\n onChangePage(event, page + 1);\r\n };\r\n\r\n const handleLastPageButtonClick = event => {\r\n onChangePage(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1));\r\n };\r\n\r\n return (\r\n \r\n \r\n {theme.direction === 'rtl' ? : }\r\n \r\n \r\n {theme.direction === 'rtl' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n = Math.ceil(count / rowsPerPage) - 1}\r\n aria-label=\"next page\"\r\n >\r\n {theme.direction === 'rtl' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n = Math.ceil(count / rowsPerPage) - 1}\r\n aria-label=\"last page\"\r\n >\r\n {theme.direction === 'rtl' ? : }\r\n \r\n
\r\n );\r\n};\r\n\r\nTablePaginationActions.propTypes = {\r\n count: PropTypes.number.isRequired,\r\n onChangePage: PropTypes.func.isRequired,\r\n page: PropTypes.number.isRequired,\r\n rowsPerPage: PropTypes.number.isRequired\r\n};\r\n\r\nexport default TablePaginationActions;\r\n","import React from 'react';\r\n\r\nimport clsx from 'clsx';\r\nimport GlobalFilter from 'components/GlobalFilter';\r\nimport { lighten, makeStyles } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport styled from 'styled-components';\r\n\r\nconst useToolbarStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n fontSize: '14px',\r\n padding: '0'\r\n },\r\n // stylelint-disable-next-line property-no-unknown\r\n highlight:\r\n theme.palette.type === 'light'\r\n ? {\r\n color: theme.palette.secondary.main,\r\n backgroundColor: lighten(theme.palette.secondary.light, 0.85)\r\n }\r\n : {\r\n color: theme.palette.text.primary,\r\n backgroundColor: theme.palette.secondary.dark\r\n },\r\n title: {\r\n flex: '1',\r\n maxWidth: '515px',\r\n marginRight: '10px',\r\n fontSize: '14px'\r\n },\r\n filter: {\r\n height: '45px',\r\n fontSize: '14px'\r\n },\r\n // stylelint-disable-next-line selector-type-no-unknown\r\n actions: {\r\n height: '45px'\r\n }\r\n}));\r\n\r\nconst StyledToolbar = styled(Toolbar)`\r\n padding: 0;\r\n flex-wrap: wrap;\r\n justify-content: space-between;\r\n`;\r\n\r\nconst TableToolbar = props => {\r\n const classes = useToolbarStyles();\r\n const {\r\n numSelected,\r\n preGlobalFilteredRows,\r\n setGlobalFilter,\r\n globalFilter,\r\n total,\r\n SelectedActions,\r\n notSearched\r\n } = props;\r\n return (\r\n \r\n {notSearched ? (\r\n \r\n Enter your search parameters and click Search to return data by\r\n default.\r\n \r\n ) : numSelected > 0 ? (\r\n \r\n Selected {numSelected}\r\n \r\n ) : (\r\n \r\n {total} records found from your search criteria.\r\n \r\n )}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nTableToolbar.propTypes = {\r\n numSelected: PropTypes.number.isRequired,\r\n setGlobalFilter: PropTypes.func.isRequired,\r\n preGlobalFilteredRows: PropTypes.array.isRequired,\r\n globalFilter: PropTypes.string.isRequired\r\n};\r\n\r\nexport default TableToolbar;\r\n","import React, { useMemo } from 'react';\r\nimport styled from 'styled-components';\r\nimport MaUTable from '@material-ui/core/Table';\r\nimport PropTypes from 'prop-types';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableContainer from '@material-ui/core/TableContainer';\r\nimport TableFooter from '@material-ui/core/TableFooter';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TablePagination from '@material-ui/core/TablePagination';\r\nimport TablePaginationActions from './TablePaginationActions';\r\nimport TableRow from '@material-ui/core/TableRow';\r\nimport Button from '@material-ui/core/Button';\r\nimport TableToolbar from './TableToolbar';\r\nimport {\r\n useGlobalFilter,\r\n usePagination,\r\n useSortBy,\r\n useTable\r\n} from 'react-table';\r\nimport ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown';\r\nimport ArrowDropUpIcon from '@material-ui/icons/ArrowDropUp';\r\nimport is from 'is_js';\r\nimport { compareAsc, format } from 'date-fns';\r\nimport { exportToExcelSheet } from 'lib/excelExport';\r\nimport { theme } from 'lib/theme';\r\nimport { BrandColor } from 'constants/brandColor';\r\n\r\nconst EnhancedTable = ({\r\n columns,\r\n data,\r\n openRecord,\r\n openStatement,\r\n notSearched,\r\n openPatientInsurance\r\n}) => {\r\n const memoizedColumns = useMemo(() => {\r\n return columns.map(column => {\r\n return {\r\n ...column,\r\n sortType: column.sortType\r\n ? dateKeywordsRegex.test(column.accessor || column.id)\r\n ? sortDate\r\n : 'alphanumeric'\r\n : 'alphanumeric'\r\n };\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [columns, data]);\r\n\r\n const sortTypes = useMemo(() => createSortTypes(), []);\r\n const {\r\n getTableProps,\r\n headerGroups,\r\n prepareRow,\r\n page,\r\n gotoPage,\r\n setPageSize,\r\n preGlobalFilteredRows,\r\n setGlobalFilter,\r\n state: { pageIndex, pageSize, globalFilter }\r\n } = useTable(\r\n {\r\n columns: memoizedColumns,\r\n data,\r\n initialState: { pageSize: 25 },\r\n // updateMyData isn't part of the API, but\r\n // anything we put into these options will\r\n // automatically be available on the instance.\r\n // That way we can call this function from our\r\n // cell renderer!\r\n autoResetGlobalFilter: false,\r\n autoResetSortBy: false,\r\n sortTypes: sortTypes\r\n },\r\n useGlobalFilter,\r\n useSortBy,\r\n usePagination\r\n );\r\n\r\n const handleChangePage = (event, newPage) => {\r\n gotoPage(newPage);\r\n };\r\n\r\n const handleChangeRowsPerPage = event => {\r\n setPageSize(Number(event.target.value));\r\n };\r\n\r\n const SelectedActions = ({ disableExport }) => {\r\n return (\r\n \r\n \r\n
\r\n );\r\n };\r\n const user = JSON.parse(sessionStorage.getItem('user'));\r\n const isIE = is.ie('>=10');\r\n const checkSelected = row => {\r\n if (\r\n row.original.invoiceNo === (openRecord && openRecord.account) &&\r\n row.original.srcSystemKey === (openRecord && openRecord.srcSystemKey)\r\n )\r\n return true;\r\n if (\r\n row.original.invoiceNo === (openStatement && openStatement.account) &&\r\n row.original.srcSystemKey ===\r\n (openStatement && openStatement.srcSystemKey)\r\n )\r\n return true;\r\n if (row.original.invoiceNo === openPatientInsurance?.invoiceNo) return true;\r\n return false;\r\n };\r\n\r\n // Render the UI for your table\r\n return (\r\n \r\n \r\n SelectedActions({\r\n ...props,\r\n data\r\n })\r\n }\r\n />\r\n \r\n 5}\r\n style={\r\n user.showPatientStatement\r\n ? {}\r\n : {\r\n gridTemplateColumns:\r\n '60px 1fr 60px repeat(5, 1fr) 60px repeat(6, 1fr)'\r\n }\r\n }\r\n >\r\n \r\n {headerGroups.map(headerGroup => (\r\n \r\n {headerGroup.headers.map(column => (\r\n \r\n {column.id !== 'selection' && column.id !== 'ID' ? (\r\n // TODO: Extract to a new file\r\n \r\n
{column.render('Header')}\r\n
\r\n \r\n \r\n \r\n
\r\n ) : (\r\n column.render('Header')\r\n )}\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n \r\n {(data.length === 0 || page.length === 0) && (\r\n \r\n \r\n {data.length === 0\r\n ? 'Please Search for Records'\r\n : 'Please refine your filter'}\r\n | \r\n
\r\n )}\r\n {page.map(row => {\r\n prepareRow(row);\r\n return (\r\n // TODO: open details page onClick\r\n \r\n {row.cells.map(cell => {\r\n return (\r\n \r\n {cell.render('Cell')}\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\nEnhancedTable.propTypes = {\r\n columns: PropTypes.array.isRequired,\r\n data: PropTypes.array.isRequired\r\n};\r\n\r\nconst createSortTypes = () => ({\r\n dateString: (a, b, id) =>\r\n compareAsc(new Date(a.original[id]), new Date(b.original[id]))\r\n});\r\n\r\nexport default EnhancedTable;\r\n\r\nconst StyledTable = styled(MaUTable)`\r\n border-collapse: separate;\r\n\r\n th,\r\n td {\r\n border: 1px solid #0003;\r\n }\r\n\r\n .MuiTableCell-root {\r\n padding: 5px;\r\n }\r\n .MuiTableCell-head {\r\n line-height: 1rem;\r\n }\r\n th {\r\n background-color: ${theme.palette.primary.dark};\r\n color: white;\r\n font-weight: bold;\r\n font-size: 11px;\r\n position: sticky;\r\n top: 0;\r\n z-index: 3;\r\n }\r\n td {\r\n font-size: 11px;\r\n }\r\n tr:nth-child(odd) {\r\n td {\r\n background-color: #ddd;\r\n }\r\n }\r\n tr:nth-child(even) {\r\n td {\r\n background-color: #f5f5f5;\r\n }\r\n }\r\n`;\r\n\r\nconst TableWrapper = styled.div`\r\n border-radius: 5px;\r\n max-height: calc(100vh - 340px);\r\n overflow: auto;\r\n`;\r\n\r\nfunction sortDate(rowA, rowB, id) {\r\n if (!rowA?.original) return 0;\r\n return compareAsc(new Date(rowA.original[id]), new Date(rowB.original[id]));\r\n}\r\nconst dateKeywordsRegex = /(date|dos|dob|ados|expirationDate)/gi;\r\n","import IconButton from '@material-ui/core/IconButton';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport { Create } from '@material-ui/icons';\r\nimport FindInPageIcon from '@material-ui/icons/FindInPage';\r\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\r\nimport ReceiptIcon from '@material-ui/icons/Receipt';\r\nimport React from 'react';\r\nimport NumberFormat from 'react-number-format';\r\nimport EnhancedTable from './EnhancedTable';\r\nimport { theme } from 'lib/theme';\r\nimport { Column } from 'react-table';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n // stylelint-disable-next-line selector-type-no-unknown\r\n tooltip: {\r\n fontSize: '14px'\r\n }\r\n}));\r\n\r\nconst RowActions = ({\r\n rowId,\r\n invoiceNo,\r\n setOpenSummary,\r\n setOpenPatientStatement,\r\n showPatientStatement,\r\n setOpenPatientInsurance,\r\n hospitalAccountNumber,\r\n setOpenInvoice,\r\n setShowInvoice,\r\n showMyTransactionsX12DocumentLink\r\n}) => {\r\n const classes = useStyles();\r\n return (\r\n \r\n \r\n setOpenSummary(rowId)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n setOpenPatientInsurance({\r\n ...rowId,\r\n invoiceNo,\r\n hospitalAccountNumber\r\n })\r\n }\r\n >\r\n \r\n \r\n \r\n\r\n {showPatientStatement && (\r\n \r\n \r\n setOpenPatientStatement({ ...rowId, account: invoiceNo })\r\n }\r\n >\r\n \r\n \r\n \r\n )}\r\n {!!showMyTransactionsX12DocumentLink && (\r\n \r\n {\r\n setShowInvoice(invoiceNo);\r\n setOpenInvoice(true);\r\n }}\r\n >\r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nconst MuiEnhancedTable = ({\r\n initial,\r\n tableData,\r\n notSearched,\r\n openSummary,\r\n openPatientStatement,\r\n setOpenSummary,\r\n setOpenPatientStatement,\r\n openPatientInsurance,\r\n setOpenPatientInsurance,\r\n setOpenInvoice,\r\n setShowInvoice\r\n}) => {\r\n // Last Name, First Name - Label should be 'Patient'\r\n // DOS\r\n // DOB\r\n // Charges\r\n // Patient Payment\r\n // Insurance Co Payment\r\n // Adjustment\r\n // Balance\r\n // Collection Balance\r\n // PolicyID\r\n const user = JSON.parse(sessionStorage.getItem('user'));\r\n\r\n /**@type Column[]*/\r\n const COLUMNS = [\r\n {\r\n Header: () => ,\r\n id: 'ID',\r\n accessor: ({\r\n invoiceNo,\r\n srcSystemKey,\r\n facilityName,\r\n hospitalAccountNumber\r\n }) => (\r\n \r\n )\r\n },\r\n {\r\n Header: 'Facility',\r\n accessor: 'facilityName'\r\n },\r\n {\r\n Header: 'DOS',\r\n id: 'dos',\r\n accessor: 'dos',\r\n sortType: 'dateString'\r\n },\r\n {\r\n Header: 'Account',\r\n accessor: 'hospitalAccountNumber'\r\n },\r\n {\r\n Header: 'MRN',\r\n accessor: 'mrn'\r\n },\r\n {\r\n Header: 'Statement Account',\r\n accessor: 'statementAccount'\r\n },\r\n {\r\n Header: 'Invoice',\r\n accessor: 'invoiceNo'\r\n },\r\n {\r\n Header: 'Patient',\r\n accessor: 'name'\r\n },\r\n {\r\n Header: 'DOB',\r\n id: 'dob',\r\n accessor: 'dob',\r\n sortType: 'dateString'\r\n },\r\n {\r\n Header: 'Charges',\r\n id: 'charge',\r\n accessor: 'charge',\r\n Cell: ({\r\n row: {\r\n original: { charge }\r\n }\r\n }) => (\r\n \r\n \r\n
\r\n )\r\n },\r\n {\r\n Header: 'Adj',\r\n id: 'adj',\r\n accessor: 'adj',\r\n Cell: ({\r\n row: {\r\n original: { adj }\r\n }\r\n }) => (\r\n \r\n \r\n
\r\n )\r\n },\r\n {\r\n Header: 'Ins Pmt',\r\n id: 'pmtInsCo',\r\n accessor: 'pmtInsCo',\r\n Cell: ({\r\n row: {\r\n original: { pmtInsCo }\r\n }\r\n }) => (\r\n \r\n \r\n
\r\n )\r\n },\r\n {\r\n Header: 'Pat Pmt',\r\n id: 'pmtPat',\r\n accessor: 'pmtPat',\r\n Cell: ({\r\n row: {\r\n original: { pmtPat }\r\n }\r\n }) => (\r\n \r\n \r\n
\r\n )\r\n },\r\n {\r\n Header: 'Bal',\r\n id: 'balance',\r\n accessor: 'balance',\r\n Cell: ({\r\n row: {\r\n original: { balance }\r\n }\r\n }) => (\r\n \r\n \r\n
\r\n )\r\n },\r\n {\r\n Header: 'Coll Bal',\r\n id: 'colBal',\r\n accessor: 'colBal',\r\n Cell: ({\r\n row: {\r\n original: { colBal }\r\n }\r\n }) => (\r\n \r\n \r\n
\r\n )\r\n }\r\n ];\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const columns = React.useMemo(() => COLUMNS, []);\r\n const data = React.useMemo(() => tableData, [tableData]);\r\n // // We need to keep the table from resetting the pageIndex when we\r\n // // Update data. So we can keep track of that flag with a ref.\r\n\r\n // // When our cell renderer calls updateMyData, we'll use\r\n // // the rowIndex, columnId and new value to update the\r\n // // original data\r\n // const updateMyData = (rowIndex, columnId, value) => {\r\n // // We also turn on the flag to not reset the page\r\n // setSkipPageReset(true)\r\n // setData(old =>\r\n // old.map((row, index) => {\r\n // if (index === rowIndex) {\r\n // return {\r\n // ...old[rowIndex],\r\n // [columnId]: value,\r\n // }\r\n // }\r\n // return row\r\n // })\r\n // )\r\n // }\r\n\r\n return (\r\n {\r\n return {\r\n ...record,\r\n dos: record?.ados || '',\r\n name: `${record.lastName}, ${record.firstName}`\r\n };\r\n }) || []\r\n }\r\n initial={initial}\r\n openRecord={openSummary}\r\n openStatement={openPatientStatement}\r\n openPatientInsurance={openPatientInsurance}\r\n notSearched={notSearched}\r\n />\r\n );\r\n};\r\n\r\nexport default MuiEnhancedTable;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport CssBaseline from '@material-ui/core/CssBaseline';\r\nimport MaUTable from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TableRow from '@material-ui/core/TableRow';\r\n\r\nimport { useTable } from 'react-table';\r\nimport { theme } from 'lib/theme';\r\n\r\nconst StyledTable = styled(MaUTable)`\r\n .MuiTableCell-root {\r\n padding: 5px;\r\n }\r\n .MuiTableCell-head {\r\n line-height: 1rem;\r\n }\r\n tr:nth-child(odd) {\r\n .highlight {\r\n background-color: #95bcd7;\r\n }\r\n td {\r\n background-color: #ccc;\r\n }\r\n }\r\n tr:nth-child(even) {\r\n .highlight {\r\n background-color: #95bcd7;\r\n }\r\n td {\r\n background-color: #f5f5f5;\r\n }\r\n }\r\n thead {\r\n min-height: 35px;\r\n /* stylelint-disable-next-line no-descending-specificity */\r\n tr {\r\n th {\r\n background-color: ${theme.palette.secondary.dark};\r\n z-index: 3;\r\n color: white;\r\n padding: 5px;\r\n vertical-align: top;\r\n overflow-wrap: break-words;\r\n font-weight: bold;\r\n text-align: center;\r\n border: 1px solid black;\r\n .MuiButtonBase-root {\r\n color: white;\r\n }\r\n }\r\n }\r\n tr:nth-child(1) {\r\n th {\r\n text-align: left;\r\n padding-left: 15px;\r\n background-color: ${theme.palette.primary.dark};\r\n }\r\n }\r\n }\r\n tbody {\r\n /* stylelint-disable-next-line no-descending-specificity */\r\n tr {\r\n /* stylelint-disable-next-line no-descending-specificity */\r\n td {\r\n padding: 5px;\r\n border: 1px solid black;\r\n }\r\n }\r\n }\r\n`;\r\n\r\nfunction Table({ columns, data }) {\r\n // Use the state and functions returned from useTable to build your UI\r\n const { getTableProps, headerGroups, rows, prepareRow } = useTable({\r\n columns,\r\n data\r\n });\r\n\r\n // Render the UI for your table\r\n return (\r\n \r\n \r\n {headerGroups.map(headerGroup => (\r\n \r\n {headerGroup.headers.map(column => (\r\n \r\n {column.render('Header')}\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n \r\n {rows.length === 0 && (\r\n \r\n \r\n No Record\r\n \r\n \r\n )}\r\n {rows.map(row => {\r\n prepareRow(row);\r\n return (\r\n \r\n {row.cells.map(cell => {\r\n return (\r\n \r\n {cell.render('Cell')}\r\n \r\n );\r\n })}\r\n \r\n );\r\n })}\r\n \r\n \r\n );\r\n}\r\n\r\nfunction MuiTable({ style, columns, data }) {\r\n const tcolumns = React.useMemo(() => columns, [columns]);\r\n\r\n const tdata = React.useMemo(() => data, [data]);\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport default MuiTable;\r\n","import React, { useEffect, useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport PrintIcon from '@material-ui/icons/Print';\r\nimport moment from 'moment';\r\nimport axios from 'axios';\r\nimport NumberFormat from 'react-number-format';\r\nimport Table from './Table';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Draggable from 'react-draggable';\r\n\r\nfunction PaperComponent(props) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst StyledDialogTitle = styled(DialogTitle)`\r\n cursor: move;\r\n position: sticky;\r\n top: 0;\r\n background-color: #f5f5f5;\r\n`;\r\nconst TitleControl = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n`;\r\nconst StyledDialog = styled(Dialog)`\r\n .MuiPaper-root.MuiDialog-paper {\r\n background-color: #f5f5f5;\r\n border: 6px solid #95bcd7;\r\n }\r\n`;\r\n//backgroundColor: highlight ? '#95bcd7': 'inherit'\r\nconst currency = num => (\r\n \r\n \r\n \r\n);\r\n\r\nfunction MyTransactionSummaryDetails({ open, close, accountNumber, facility }) {\r\n // state for loading\r\n // get myTransactionSummyarDetails\r\n // accountNumber\r\n // 'esc' to close???\r\n const [loading, setLoading] = useState(true);\r\n const [summaryDetails, setSummaryDetails] = useState(null);\r\n useEffect(() => {\r\n const fetchMyTransactionSummaryDetails = async () => {\r\n const header = {\r\n headers: {\r\n Authorization: `Bearer ${sessionStorage.getItem('usertoken')}`\r\n }\r\n };\r\n let data;\r\n if (accountNumber) {\r\n let response;\r\n try {\r\n response = await axios.post(\r\n `${process.env.REACT_APP_URL}/?route=PartnerGetMyTransactionSummaryDetails`,\r\n {\r\n ...accountNumber\r\n },\r\n header\r\n );\r\n data = response.data;\r\n } catch (error) {\r\n alert(error);\r\n }\r\n } else {\r\n data = null;\r\n }\r\n setSummaryDetails(data);\r\n setLoading(!data);\r\n };\r\n fetchMyTransactionSummaryDetails();\r\n }, [accountNumber]);\r\n const info = summaryDetails ? summaryDetails.patientAccountInfo : {};\r\n const { dos, dob, account, lastName, firstName, sex, statementAccount } =\r\n info;\r\n const {\r\n employer,\r\n employerAddress,\r\n employerCity,\r\n employerState,\r\n employerZip\r\n } = info;\r\n const { charge, pmt, adj, balance, pmtIns, pmtPat, collectionBal } = info;\r\n return (\r\n \r\n \r\n \r\n \r\n Transaction Details\r\n close()}\r\n />\r\n window.print()}\r\n />\r\n \r\n \r\n {/* font-size: 0.7rem; */}\r\n \r\n {facility}\r\n \r\n \r\n {loading ? (\r\n 'loading...'\r\n ) : (\r\n \r\n {/* PATIENT INFO TABLE */}\r\n
dos && moment(dos).format('MM/DD/YY')\r\n },\r\n {\r\n Header: 'Statement Account',\r\n accessor: 'statementAccount'\r\n }, // TODO: ????\r\n {\r\n Header: 'Invoice',\r\n accessor: 'account'\r\n },\r\n {\r\n Header: 'Patient',\r\n id: 'firstName',\r\n accessor: ({ lastName, firstName }) =>\r\n `${lastName}, ${firstName}`\r\n },\r\n {\r\n Header: 'DOB',\r\n id: 'DOB',\r\n accessor: ({ dob }) => dob && moment(dob).format('MM/DD/YY')\r\n },\r\n {\r\n Header: 'Sex',\r\n accessor: 'sex'\r\n }\r\n ]\r\n }\r\n ]}\r\n data={[\r\n { dos, dob, account, lastName, firstName, sex, statementAccount }\r\n ]}\r\n />\r\n\r\n {/* EMPLOYMENT INFO TABLE */}\r\n \r\n\r\n {/* ACCOUNT INFO TABLE */}\r\n currency(charge)\r\n },\r\n {\r\n Header: 'Adjustment',\r\n id: 'adj',\r\n accessor: ({ adj }) => currency(adj)\r\n },\r\n {\r\n Header: 'Insurance Payments',\r\n id: 'pmtIns',\r\n accessor: ({ pmtIns }) => currency(pmtIns)\r\n },\r\n {\r\n Header: 'Patient Payments',\r\n id: 'pmtPat',\r\n accessor: ({ pmtPat }) => currency(pmtPat)\r\n },\r\n {\r\n Header: 'Balance',\r\n id: 'balance',\r\n accessor: ({ balance }) => currency(balance)\r\n },\r\n {\r\n Header: 'Collection Balance',\r\n id: 'collectionBal',\r\n accessor: ({ collectionBal }) => currency(collectionBal)\r\n }\r\n ]\r\n }\r\n ]}\r\n data={[\r\n { charge, pmt, adj, balance, pmtIns, pmtPat, collectionBal }\r\n ]}\r\n />\r\n\r\n {/* CHARGES INFO TABLE */}\r\n \r\n date && moment(date).format('MM/DD/YYYY')\r\n },\r\n {\r\n Header: 'Description',\r\n accessor: 'description'\r\n },\r\n {\r\n Header: 'CPT',\r\n accessor: 'cpt'\r\n },\r\n {\r\n Header: 'Charge',\r\n id: 'charges',\r\n accessor: ({ charges }) => currency(charges)\r\n },\r\n {\r\n Header: 'Ins. Payments',\r\n id: 'insPmt',\r\n accessor: ({ insPmt }) => currency(insPmt)\r\n },\r\n {\r\n Header: 'Adjustments',\r\n id: 'adj',\r\n accessor: ({ adj }) => currency(adj)\r\n },\r\n {\r\n Header: 'Pat. Payments',\r\n id: 'patPmt',\r\n accessor: ({ patPmt }) => currency(patPmt)\r\n },\r\n {\r\n Header: 'Balance',\r\n id: 'bal',\r\n accessor: ({ bal }) => currency(bal)\r\n }\r\n ]\r\n }\r\n ]}\r\n data={\r\n summaryDetails?.charges?.sort((chargeA, chargeB) => {\r\n return chargeA.no - chargeB.no;\r\n }) || []\r\n }\r\n />\r\n\r\n {/* PROVIDERS INFO TABLE */}\r\n \r\n `${docLName}, ${docFName}`\r\n },\r\n {\r\n Header: 'APP',\r\n id: 'appName',\r\n accessor: ({ appFName, appLName }) =>\r\n `${appLName}, ${appFName}`\r\n },\r\n {\r\n Header: 'Crediting Provider',\r\n id: 'provider',\r\n accessor: ({ creditProviderFName, creditProviderLName }) =>\r\n `${creditProviderLName}, ${creditProviderFName}`\r\n }\r\n ]\r\n }\r\n ]}\r\n data={summaryDetails.providers}\r\n />\r\n\r\n {/* TRANSACTIONS INFO TABLE */}\r\n \r\n date && moment(date).format('MM/DD/YYYY')\r\n },\r\n {\r\n Header: 'Post Date',\r\n id: 'postDt',\r\n accessor: ({ postDt }) =>\r\n postDt && moment(postDt).format('MM/DD/YYYY')\r\n },\r\n {\r\n Header: 'Transaction Amount',\r\n id: 'tranAmt',\r\n accessor: ({ tranAmt }) => currency(tranAmt)\r\n },\r\n {\r\n Header: 'Plan Name',\r\n accessor: 'planName'\r\n },\r\n {\r\n Header: 'Comments',\r\n accessor: 'comments'\r\n }\r\n ]\r\n }\r\n ]}\r\n data={summaryDetails.transactions}\r\n />\r\n\r\n {/* BILLING HISTORY INFO TABLE */}\r\n \r\n actionDate && moment(actionDate).format('MM/DD/YYYY')\r\n },\r\n {\r\n Header: 'Description',\r\n accessor: 'description'\r\n },\r\n {\r\n Header: 'Amount',\r\n id: 'amount',\r\n accessor: ({ amount }) => currency(amount)\r\n },\r\n {\r\n Header: 'Additional Info',\r\n accessor: 'planName'\r\n }\r\n ]\r\n }\r\n ]}\r\n data={summaryDetails.billingHistory}\r\n />\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nexport default MyTransactionSummaryDetails;\r\n","import { TableBorder } from './TableCell';\r\n\r\n/**\r\n * Return whether particular borders need to be included.\r\n * If the value is undefined then return true for that border.\r\n *\r\n * @param border the border item to parse.\r\n */\r\nexport function getDefaultBorderIncludes(border: TableBorder): TableBorder {\r\n return {\r\n includeBottomBorder:\r\n border.includeBottomBorder === undefined\r\n ? true\r\n : border.includeBottomBorder,\r\n includeTopBorder:\r\n border.includeTopBorder === undefined ? true : border.includeTopBorder,\r\n includeLeftBorder:\r\n border.includeLeftBorder === undefined ? true : border.includeLeftBorder,\r\n includeRightBorder:\r\n border.includeRightBorder === undefined ? true : border.includeRightBorder\r\n };\r\n}\r\n\r\n/**\r\n * Transform a single item to an array (with one element).\r\n * Or return the array.\r\n *\r\n * @param items the item or items to transform to an array.\r\n * @return an array of items or an empty array.\r\n */\r\nexport function transformToArray(items?: T | T[]): T[] {\r\n if (items === undefined) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(items)) {\r\n return items;\r\n }\r\n\r\n return [items];\r\n}\r\n","import * as React from 'react';\r\nimport { Text, View } from '@react-pdf/renderer';\r\nimport { Style } from '@react-pdf/types';\r\nimport { getDefaultBorderIncludes, transformToArray } from './Utils';\r\nimport { theme } from 'lib/theme';\r\n\r\n/**\r\n * Whether to include borders or not.\r\n * Depending on the context some toggles will not have any effect.\r\n */\r\nexport interface TableBorder {\r\n /**\r\n * Include the top border. Default true.\r\n */\r\n includeTopBorder?: boolean;\r\n\r\n /**\r\n * Include the right border. Default true.\r\n */\r\n includeRightBorder?: boolean;\r\n\r\n /**\r\n * Include the bottom border. Default true.\r\n */\r\n includeBottomBorder?: boolean;\r\n\r\n /**\r\n * Include the left border. Default true.\r\n */\r\n includeLeftBorder?: boolean;\r\n}\r\n\r\nexport interface TableCellProps extends TableBorder {\r\n /**\r\n * The weighting of a cell based on the flex layout style.\r\n * This value is between 0..1, if not specified 1 is assumed, this will take up the remaining available space.\r\n */\r\n weighting?: number;\r\n\r\n width?: number;\r\n\r\n /**\r\n * Extra styling to apply. These will override existing style with the same key.\r\n */\r\n style?: Style | Style[];\r\n\r\n /**\r\n * How to align the text\r\n */\r\n textAlign?: 'left' | 'center' | 'right';\r\n\r\n /**\r\n * Whether this is a header cell or not. If not defined it will be false.\r\n */\r\n isHeader?: boolean;\r\n\r\n /**\r\n * The font-size to apply to the cell.\r\n */\r\n fontSize?: number | string;\r\n\r\n greyBackground: boolean;\r\n justifyEnd?: boolean;\r\n}\r\n\r\n/**\r\n * This component displays the associated content of it's children.\r\n */\r\nexport class TableCell extends React.PureComponent {\r\n render() {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n let content: any;\r\n\r\n if (typeof this.props.children === 'string') {\r\n content = {this.props.children};\r\n } else if (typeof this.props.children === 'number') {\r\n content = {this.props.children.toString()};\r\n } else {\r\n content = this.props.children;\r\n }\r\n\r\n const { includeRightBorder } = getDefaultBorderIncludes(this.props);\r\n const widthStyle: Style =\r\n this.props.width && this.props.width > 0\r\n ? {\r\n width: this.props.width\r\n }\r\n : {\r\n flex: this.props.weighting ?? 1\r\n };\r\n const defaultStyle: Style = {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: this.props.isHeader\r\n ? 'center'\r\n : this.props.justifyEnd\r\n ? 'flex-end'\r\n : 'flex-start',\r\n fontSize: this.props.fontSize ?? 6,\r\n borderRight: includeRightBorder ? '1pt solid black' : '0',\r\n fontFamily: this.props.isHeader ? 'Helvetica-Bold' : 'Helvetica',\r\n padding: 5,\r\n backgroundColor: this.props.isHeader\r\n ? theme.palette.primary.dark\r\n : this.props.greyBackground\r\n ? '#CCCCCC'\r\n : '#f5f5f5',\r\n color: this.props.isHeader ? 'white' : 'black',\r\n ...widthStyle\r\n };\r\n\r\n const mergedStyles: Style[] = [\r\n defaultStyle,\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n ...transformToArray(this.props.style)\r\n ];\r\n\r\n return (\r\n \r\n {content}\r\n \r\n );\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { TableCell, TableCellProps } from './TableCell';\r\n\r\ninterface DataTableCellProps extends TableCellProps {\r\n /**\r\n * The data associated with the cell.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n data?: any;\r\n\r\n /**\r\n * The content to display for this cell.\r\n * @param data the data passed in.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n getContent: (data: any) => React.ReactNode | JSX.Element | string | number;\r\n\r\n justifyEnd?: boolean;\r\n}\r\n\r\n/**\r\n * This component is used to display data in the the {@see TableRow} component.\r\n */\r\nexport class DataTableCell extends React.PureComponent {\r\n render() {\r\n return (\r\n \r\n {this.props.getContent(this.props.data)}\r\n \r\n );\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { TableBorder, TableCell } from './TableCell';\r\nimport { DataTableCell } from './DataTableCell';\r\nimport { View } from '@react-pdf/renderer';\r\nimport { getDefaultBorderIncludes } from './Utils';\r\nimport { TableBodyProps } from './TableBody';\r\n\r\nexport interface TableRowProps extends TableBorder {\r\n /**\r\n * The font size as a valid unit defined in react-pdf.\r\n */\r\n fontSize?: number | string;\r\n\r\n /**\r\n * Whether to align the text. Defaults to left.\r\n */\r\n textAlign?: 'left' | 'center' | 'right';\r\n\r\n /**\r\n * Any data associated, relevant if the parent is a {@see DataTableCell}.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n data?: any;\r\n\r\n greyBackground: boolean;\r\n}\r\n\r\n/**\r\n * This component describes how to display a row.\r\n */\r\nexport class TableRow extends React.PureComponent> {\r\n render() {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const rowCells: any[] = React.Children.toArray(this.props.children);\r\n const {\r\n includeLeftBorder,\r\n includeBottomBorder,\r\n includeRightBorder,\r\n includeTopBorder\r\n } = getDefaultBorderIncludes(this.props);\r\n\r\n let remainingWeighting = 1;\r\n let numberOfWeightingsDefined = 0;\r\n rowCells.forEach((i: TableCell | DataTableCell) => {\r\n if (i.props.weighting !== undefined) {\r\n remainingWeighting -= i.props.weighting;\r\n numberOfWeightingsDefined++;\r\n }\r\n });\r\n\r\n const weightingsPerNotSpecified = Math.ceil(\r\n remainingWeighting / (rowCells.length - numberOfWeightingsDefined)\r\n );\r\n\r\n return (\r\n \r\n {rowCells.map((rc, columnIndex) =>\r\n React.cloneElement(rc, {\r\n weighting: rc.props.weighting ?? weightingsPerNotSpecified,\r\n data: this.props.data,\r\n key: columnIndex,\r\n fontSize: this.props.fontSize,\r\n textAlign: this.props.textAlign,\r\n includeLeftBorder: columnIndex === 0,\r\n includeRightBorder: columnIndex !== rowCells.length - 1,\r\n greyBackground: this.props.greyBackground\r\n })\r\n )}\r\n \r\n );\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { getDefaultBorderIncludes } from './Utils';\r\nimport { TableRow, TableRowProps } from './TableRow';\r\n\r\ntype TableHeaderProps = TableRowProps;\r\n\r\n/**\r\n * This component displays the titles for the rows.\r\n */\r\nexport class TableHeader extends React.PureComponent {\r\n render() {\r\n const {\r\n includeLeftBorder,\r\n includeBottomBorder,\r\n includeRightBorder,\r\n includeTopBorder\r\n } = getDefaultBorderIncludes(this.props);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const rowCells: any[] = React.Children.toArray(this.props.children);\r\n\r\n return (\r\n \r\n {rowCells.map((rc, columnIndex) =>\r\n React.cloneElement(rc, {\r\n key: columnIndex,\r\n isHeader: true,\r\n fontSize: this.props.fontSize,\r\n textAlign: this.props.textAlign,\r\n includeLeftBorder: columnIndex === 0,\r\n includeRightBorder: columnIndex !== rowCells.length - 1\r\n })\r\n )}\r\n \r\n );\r\n }\r\n}\r\n","import { TableRow, TableRowProps } from './TableRow';\r\nimport * as React from 'react';\r\nimport { getDefaultBorderIncludes } from './Utils';\r\n\r\nexport interface TableBodyProps extends TableRowProps {\r\n /**\r\n * The data associated with the table.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n data?: any[];\r\n}\r\n\r\n/**\r\n * This component displays the data as {@see TableRow}s.\r\n */\r\nexport class TableBody extends React.PureComponent {\r\n render() {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const rowCells: any[] = React.Children.toArray(this.props.children);\r\n const { includeLeftBorder, includeBottomBorder, includeRightBorder } =\r\n getDefaultBorderIncludes(this.props);\r\n const dataRows = this.props.data ?? [];\r\n\r\n return dataRows.map((data, rowIndex) => (\r\n \r\n {rowCells}\r\n \r\n ));\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { TableHeader } from './TableHeader';\r\nimport { TableBody } from './TableBody';\r\nimport { View } from '@react-pdf/renderer';\r\n\r\ninterface TableProps {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n data?: any[];\r\n}\r\n\r\nexport class Table extends React.PureComponent {\r\n render() {\r\n let tableHeader = null;\r\n let tableBody = null;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n React.Children.forEach(this.props.children, (c: any) => {\r\n if (c.type === TableHeader) {\r\n tableHeader = c;\r\n } else if (c.type === TableBody) {\r\n tableBody = React.cloneElement(c, {\r\n data: c.props.data ?? this.props.data ?? []\r\n });\r\n }\r\n });\r\n\r\n return (\r\n \r\n {tableHeader}\r\n {tableBody}\r\n \r\n );\r\n }\r\n}\r\n","/* eslint-disable eqeqeq */\r\nexport function formatDollar(num) {\r\n if (!num) return '$0.00';\r\n var p = num.toFixed(2).split('.');\r\n const formattedNum =\r\n '$' +\r\n p[0]\r\n .split('')\r\n .reverse()\r\n .reduce(function (acc, num, i) {\r\n return num == '-' ? acc : num + (i && !(i % 3) ? ',' : '') + acc;\r\n }, '') +\r\n '.' +\r\n p[1];\r\n return num < 0 ? '-' + formattedNum : formattedNum;\r\n}\r\n","import React from 'react';\r\nimport moment from 'moment';\r\nimport { View } from '@react-pdf/renderer';\r\nimport {\r\n Table,\r\n TableHeader,\r\n TableCell,\r\n TableBody,\r\n DataTableCell\r\n} from '../../../components/PdfTable';\r\nimport { formatDollar } from './util';\r\n\r\nfunction DetailTableV1({ details }) {\r\n return (\r\n \r\n \r\n \r\n Invoice #\r\n Physician\r\n Facility Where Services Rendered\r\n FAC Acct #\r\n Patient\r\n DOS\r\n Service Description\r\n CPT\r\n Chrg\r\n Pmt\r\n Adj\r\n Balance\r\n \r\n \r\n r.invoiceNo} />\r\n r.physician} />\r\n r.facility} />\r\n r.facilityAccountNo} />\r\n r.patient} />\r\n moment(r.dos).format('MM/DD/YY')}\r\n />\r\n r.serviceDescription} />\r\n r.cpt} />\r\n formatDollar(r.charge)}\r\n />\r\n formatDollar(r.payment)}\r\n />\r\n formatDollar(r.adjustment)}\r\n />\r\n formatDollar(r.patientResponsibility)}\r\n />\r\n \r\n
\r\n \r\n );\r\n}\r\n\r\nexport default DetailTableV1;\r\n","import { StyleSheet } from '@react-pdf/renderer';\r\n\r\nexport const boldFont = 'Helvetica-Bold';\r\n\r\nexport const styles = StyleSheet.create({\r\n text: {\r\n fontSize: '10px',\r\n /* stylelint-disable */\r\n fontFamily: 'Helvetica',\r\n marginBottom: '0px',\r\n marginLeft: '0px',\r\n marginTop: '0px',\r\n marginRight: '0px'\r\n },\r\n section: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n flexWrap: 'wrap',\r\n margin: '10px',\r\n padding: '5px'\r\n },\r\n view: {\r\n flex: 1\r\n }\r\n});\r\n","import React from 'react';\r\nimport moment from 'moment';\r\nimport { Page, Font, Text, View } from '@react-pdf/renderer';\r\nimport DetailTable from './DetailTable';\r\nimport { formatDollar } from './util';\r\nimport { styles, boldFont } from './styled';\r\nimport { theme } from 'lib/theme';\r\n\r\nconst hyphenationCallback = word => {\r\n const middle = 10;\r\n const parts =\r\n word.length < 12 ? [word] : [word.substr(0, middle), word.substr(middle)];\r\n return parts;\r\n};\r\n\r\nFont.registerHyphenationCallback(hyphenationCallback);\r\n\r\nfunction PatientStatment({ data }) {\r\n return (\r\n \r\n \r\n \r\n {data.billingProvider}\r\n {data.billingAddress1}\r\n {`${data.billingCity}, ${data.billingState}`}\r\n {data.billingZipCode}\r\n \r\n \r\n \r\n Tax ID\r\n \r\n {data.taxID}\r\n \r\n \r\n \r\n Account Number\r\n \r\n {data.accountNumber}\r\n \r\n \r\n \r\n Printed Date\r\n \r\n {moment().format('MM/DD/YYYY')}\r\n \r\n \r\n \r\n Guarantor Name\r\n \r\n {data.guarantorName}\r\n \r\n \r\n \r\n Service Details\r\n \r\n {data.serviceDetails.length && (\r\n \r\n )}\r\n \r\n \r\n Total Balance Due:\r\n \r\n \r\n {formatDollar(data.amountDue)}\r\n \r\n \r\n \r\n \r\n Disclaimer: Pending insurance payments may adjust the patient\r\n responsibility and the Total Balance Due.\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default PatientStatment;\r\n","import React from 'react';\r\nimport { Page, Image, View, Text } from '@react-pdf/renderer';\r\nimport { formatDollar } from './util';\r\nimport { styles, boldFont } from './styled';\r\nimport visa from 'assets/visa.png';\r\nimport mastercard from 'assets/mastercard.png';\r\nimport amex from 'assets/amex.png';\r\nimport discover from 'assets/discover.png';\r\nimport { theme } from 'lib/theme';\r\n\r\n/* stylelint-disable font-family-no-missing-generic-family-keyword */\r\n\r\nfunction MailingInfo({ data }) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n Payment Options\r\n \r\n Mail:\r\n \r\n Make Checks Payable To:\r\n \r\n {data.billingProvider}\r\n {data.billingAddress1}\r\n {`${data.billingCity}, ${data.billingState}`}\r\n \r\n {data.billingZipCode}\r\n \r\n \r\n Online:\r\n \r\n \r\n {data.paymentUri}\r\n \r\n \r\n Customer Service:\r\n \r\n {data.paymentPhone}\r\n \r\n \r\n \r\n \r\n \r\n PAY BY CREDIT CARD:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Credit Card Number ________________________________ CVV\r\n _________\r\n \r\n \r\n Cardholder Name _______________________________________________\r\n \r\n \r\n {' '}\r\n Exp. Date ___________ Signature\r\n __________________________________\r\n \r\n \r\n \r\n \r\n \r\n Due Date\r\n \r\n \r\n Upon Receipt\r\n \r\n \r\n \r\n \r\n Account Number\r\n \r\n \r\n {data.accountNumber}\r\n \r\n \r\n \r\n \r\n Amount Due\r\n \r\n \r\n {formatDollar(data.amountDue)}\r\n \r\n \r\n \r\n \r\n Amount Paid\r\n \r\n \r\n ___________\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {data.billingProvider}\r\n {data.billingAddress1}\r\n {data.billingAddress2}\r\n {`${data.billingCity}, ${data.billingState} ${data.billingZipCode}`}\r\n \r\n \r\n {data.guarantorName}\r\n {data.guarantorAddress1}\r\n {data.guarantorAddress2}\r\n {`${data.guarantorCity}, ${data.guarantorState} ${data.guarantorZipCode}`}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default MailingInfo;\r\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import React from 'react';\r\nimport { Document } from '@react-pdf/renderer';\r\nimport PatientStatement from './PatientStatement';\r\nimport MailingInfo from './MailingInfo';\r\n\r\nfunction PDF({ data }) {\r\n if (!data || !data.serviceDetails.length) return 'No Data';\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default PDF;\r\n","import React, { useEffect, useState } from 'react';\r\nimport axios from 'axios';\r\nimport { PDFDownloadLink, PDFViewer } from '@react-pdf/renderer';\r\nimport PDF from './PdfDocument';\r\n\r\nimport styled from 'styled-components';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Draggable from 'react-draggable';\r\nimport CloudDownloadIcon from '@material-ui/icons/CloudDownload';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nfunction PaperComponent(props) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n // stylelint-disable-next-line selector-type-no-unknown\r\n tooltip: {\r\n fontSize: '14px'\r\n }\r\n}));\r\n\r\nconst StyledDialogTitle = styled(DialogTitle)`\r\n cursor: move;\r\n position: sticky;\r\n top: 0;\r\n background-color: #f5f5f5;\r\n`;\r\nconst TitleControl = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n`;\r\nconst StyledDialog = styled(Dialog)`\r\n .MuiPaper-root.MuiDialog-paper {\r\n background-color: #f5f5f5;\r\n border: 6px solid #95bcd7;\r\n }\r\n`;\r\n\r\nfunction PatientStatement({ accountNumber, open, close }) {\r\n const [loading, setLoading] = useState(true);\r\n const [data, setData] = useState(null);\r\n useEffect(() => {\r\n const fetchPatientStatement = async () => {\r\n const header = {\r\n headers: {\r\n Authorization: `Bearer ${sessionStorage.getItem('usertoken')}`\r\n }\r\n };\r\n let data;\r\n const currentData = data;\r\n if (accountNumber) {\r\n let response;\r\n try {\r\n response = await axios.post(\r\n `${process.env.REACT_APP_URL}/?route=PartnerGetMyTransactionSummaryPatientStatement`,\r\n {\r\n ...accountNumber\r\n },\r\n header\r\n );\r\n data = response.data;\r\n } catch (error) {\r\n alert(error);\r\n }\r\n } else {\r\n data = currentData;\r\n }\r\n setData(data);\r\n setLoading(!accountNumber);\r\n };\r\n fetchPatientStatement();\r\n }, [accountNumber]);\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n Patient Statement\r\n close()} />\r\n \r\n {/* {data.???} */}\r\n \r\n {loading ? (\r\n 'Loading ...'\r\n ) : (\r\n \r\n
\r\n
}\r\n fileName={'patient-statement.pdf'}\r\n style={{\r\n color: '#4a4a4a'\r\n }}\r\n >\r\n {({ loading }) =>\r\n loading ? (\r\n 'Loading document...'\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 PatientStatement;\r\n","import { ROUTES } from 'constants/routes';\r\nimport { useAuthenticatedAxios } from 'hooks/useAuthenticatedAxios';\r\nimport { useQuery } from 'react-query';\r\nimport { ErrorResponse } from 'types/network';\r\nimport { DocumentHeader } from './useGetDocumentHeaders';\r\n\r\nexport interface DocumentEdm {\r\n byteArray: string;\r\n mimeType: string;\r\n}\r\n\r\nexport const useGetDocumentEdmById = (\r\n documentEdmId?: DocumentHeader['documentHeaderId']\r\n) => {\r\n const Axios = useAuthenticatedAxios();\r\n return useQuery(\r\n [ROUTES.GetDocumentEdmById, documentEdmId],\r\n async () => {\r\n const { data } = await Axios({\r\n method: 'post',\r\n url: `${process.env.REACT_APP_URL}?route=${ROUTES.GetDocumentEdmById}`,\r\n data: {\r\n documentEdmId\r\n }\r\n });\r\n return data;\r\n },\r\n {\r\n refetchOnWindowFocus: false,\r\n refetchOnReconnect: false,\r\n enabled: !!documentEdmId\r\n }\r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { CircularProgress } from '@material-ui/core';\r\nimport styled from 'styled-components';\r\nimport { DocumentHeader } from './lib/useGetDocumentHeaders';\r\nimport { useGetDocumentEdmById } from './lib/useGetDocumentEdmById';\r\nimport { BaseAlert } from 'components/BaseAlert/BaseAlert';\r\n\r\nconst StyledIframe = styled.iframe`\r\n width: 100%;\r\n min-height: 80vh;\r\n`;\r\n\r\nexport interface DocumentEdmPdfViewerProps {\r\n documentHeader?: DocumentHeader;\r\n}\r\n\r\nexport const DocumentEdmPdfViewer: React.FC = ({\r\n documentHeader\r\n}) => {\r\n const {\r\n data: document,\r\n isFetching,\r\n error\r\n } = useGetDocumentEdmById(documentHeader?.documentHeaderId);\r\n const [link, setLink] = useState('');\r\n\r\n useEffect(() => {\r\n if (document?.byteArray) {\r\n const byteCharacters = atob(document.byteArray);\r\n\r\n const byteNumbers = new Array(byteCharacters.length);\r\n for (let i = 0; i < byteCharacters.length; i++) {\r\n byteNumbers[i] = byteCharacters.charCodeAt(i);\r\n }\r\n const byteArray = new Uint8Array(byteNumbers);\r\n const blob = new Blob([byteArray], {\r\n type: document.mimeType\r\n });\r\n setLink(URL.createObjectURL(blob));\r\n }\r\n }, [document]);\r\n\r\n return isFetching ? (\r\n \r\n ) : error ? (\r\n {error.response?.data.Error}\r\n ) : (\r\n \r\n );\r\n};\r\n","import { theme } from 'lib/theme';\r\nimport styled from 'styled-components';\r\n\r\nexport const BaseTable = styled.table`\r\n table-layout: fixed;\r\n width: 100%;\r\n border-collapse: collapse;\r\n border: 2px solid #0003;\r\n th {\r\n text-align: left;\r\n background-color: ${theme.palette.primary.dark};\r\n color: white;\r\n padding: 8px 5px;\r\n line-height: 1rem;\r\n border: 1px solid #0003;\r\n }\r\n tr {\r\n background-color: #fff;\r\n &.active-row {\r\n background-color: rgb(232, 240, 254) !important;\r\n font-weight: bold;\r\n }\r\n }\r\n &.alt-bg {\r\n tbody tr:nth-child(odd) {\r\n background-color: #eee;\r\n }\r\n\r\n tbody tr:nth-child(even) {\r\n background-color: #fff;\r\n }\r\n }\r\n\r\n tbody td {\r\n line-height: 1.4;\r\n padding: 8px 5px;\r\n border: 1px solid #0003;\r\n }\r\n`;\r\n","import React from 'react';\r\nimport { CircularProgress } from '@material-ui/core';\r\nimport { BaseTable } from 'components/BaseTable/BaseTable';\r\nimport { DocumentHeader } from './lib/useGetDocumentHeaders';\r\nimport { useGetDocumentDetails } from './lib/useGetDocumentDetails';\r\nimport { BaseAlert } from 'components/BaseAlert/BaseAlert';\r\n\r\nexport interface RawDocumentDetailsTableProps {\r\n documentHeader?: DocumentHeader;\r\n}\r\n\r\nexport const RawDocumentDetailsTable: React.FC =\r\n ({ documentHeader }) => {\r\n const {\r\n data: documentDetails,\r\n isFetching,\r\n error\r\n } = useGetDocumentDetails(documentHeader?.documentHeaderId);\r\n\r\n return isFetching ? (\r\n \r\n ) : error ? (\r\n {error.response?.data.Error}\r\n ) : documentDetails?.length ? (\r\n \r\n \r\n \r\n Segment Name | \r\n Segment Data | \r\n
\r\n \r\n \r\n {documentDetails.map((doc, idx) => (\r\n \r\n {doc.segmentKey} | \r\n {doc.segmentValue} | \r\n
\r\n ))}\r\n \r\n \r\n ) : (\r\n <>No document found>\r\n );\r\n };\r\n","import { ROUTES } from 'constants/routes';\r\nimport { useAuthenticatedAxios } from 'hooks/useAuthenticatedAxios';\r\nimport { useQuery } from 'react-query';\r\nimport { ErrorResponse } from 'types/network';\r\nimport { DocumentHeader } from './useGetDocumentHeaders';\r\n\r\nexport interface DocumentDetail {\r\n segmentKey: string;\r\n segmentValue: string;\r\n}\r\n\r\nexport const useGetDocumentDetails = (\r\n documentHeaderId?: DocumentHeader['documentHeaderId']\r\n) => {\r\n const Axios = useAuthenticatedAxios();\r\n return useQuery(\r\n [ROUTES.GetDocumentDetails, documentHeaderId],\r\n async () => {\r\n const { data } = await Axios({\r\n method: 'post',\r\n url: `${process.env.REACT_APP_URL}?route=${ROUTES.GetDocumentDetails}`,\r\n data: {\r\n documentHeaderId\r\n }\r\n });\r\n\r\n return data;\r\n },\r\n {\r\n enabled: !!documentHeaderId\r\n }\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport PrintIcon from '@material-ui/icons/Print';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport { format, parseISO } from 'date-fns';\r\n\r\nimport { DraggableDialog } from 'components/DraggableDialog/DraggableDialog';\r\nimport { DocumentEdmPdfViewer } from './DocumentEdmPdfViewer';\r\nimport { RawDocumentDetailsTable } from './RawDocumentDetailsTable';\r\nimport { CircularProgress } from '@material-ui/core';\r\nimport {\r\n DocumentHeader,\r\n useGetDocumentHeaders\r\n} from './lib/useGetDocumentHeaders';\r\nimport { BaseAlert } from 'components/BaseAlert/BaseAlert';\r\n\r\nconst StyledDialogContent = styled(DialogContent)`\r\n padding-bottom: 24px;\r\n`;\r\n\r\nconst DocumentGrid = styled.div`\r\n display: grid;\r\n align-items: start;\r\n grid-template-columns: 400px auto;\r\n gap: 24px;\r\n`;\r\n\r\nexport interface InvoiceDocumentsDialogProps {\r\n open: boolean;\r\n onClose: () => void;\r\n invoiceNo: number;\r\n}\r\n\r\nexport const InvoiceDocumentsDialog: React.FC = ({\r\n open,\r\n onClose,\r\n invoiceNo\r\n}) => {\r\n const [selectedDocument, setSelectedDocument] = useState<\r\n DocumentHeader | undefined\r\n >();\r\n\r\n const {\r\n data: documentsList,\r\n isFetching,\r\n error\r\n } = useGetDocumentHeaders(invoiceNo, {\r\n onSuccess(data) {\r\n setSelectedDocument(data[0]);\r\n }\r\n });\r\n\r\n return (\r\n \r\n window.print()} />\r\n onClose()} />\r\n >\r\n }\r\n >\r\n \r\n {isFetching ? (\r\n \r\n ) : error ? (\r\n {error.response?.data.Error}\r\n ) : (\r\n \r\n {documentsList?.length ? (\r\n <>\r\n \r\n {documentsList.map(doc => (\r\n setSelectedDocument(doc)}\r\n >\r\n \r\n \r\n ))}\r\n
\r\n {selectedDocument?.showDataInRawFormat ? (\r\n \r\n ) : (\r\n \r\n )}\r\n >\r\n ) : (\r\n 'No documents found'\r\n )}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import { ROUTES } from 'constants/routes';\r\nimport { useAuthenticatedAxios } from 'hooks/useAuthenticatedAxios';\r\nimport { useQuery } from 'react-query';\r\nimport { ErrorResponse, UseQueryFnOptions } from 'types/network';\r\n\r\nexport interface DocumentHeader {\r\n documentHeaderId: string;\r\n documentTypeId: number;\r\n documentAliasName: string;\r\n showDataInRawFormat: boolean;\r\n createdDateTime: string;\r\n}\r\n\r\nexport const useGetDocumentHeaders = (\r\n invoiceId: number,\r\n options?: UseQueryFnOptions\r\n) => {\r\n const Axios = useAuthenticatedAxios();\r\n return useQuery(\r\n [ROUTES.GetDocumentHeaders, invoiceId],\r\n async () => {\r\n const { data } = await Axios({\r\n method: 'post',\r\n url: `${process.env.REACT_APP_URL}?route=${ROUTES.GetDocumentHeaders}`,\r\n data: {\r\n invoiceId\r\n }\r\n });\r\n\r\n return data;\r\n },\r\n {\r\n refetchOnWindowFocus: false,\r\n refetchOnReconnect: false,\r\n ...options\r\n }\r\n );\r\n};\r\n","import { FormControl, Select, OutlinedInput } from '@material-ui/core';\r\nimport React from 'react';\r\n\r\nexport const FormSelector = ({ value, children, style, ...props }) => {\r\n return (\r\n \r\n }\r\n {...props}\r\n >\r\n {children}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useField } from 'formik';\r\nimport { composeValidators, requiredValidator } from 'sd-formik-validators';\r\nimport { StyledTextField } from './StyledTextField';\r\nconst validateZip = () => {\r\n return undefined;\r\n};\r\nexport const ZipCodeField = ({\r\n isRequired = false,\r\n name,\r\n label,\r\n validate = [],\r\n helperText = '',\r\n error = '',\r\n onFieldValueChange = () => {},\r\n ...props\r\n}) => {\r\n const [field, meta] = useField({\r\n name,\r\n validate: isRequired\r\n ? composeValidators(requiredValidator, validateZip, ...validate)\r\n : composeValidators(validateZip, ...validate)\r\n });\r\n\r\n return (\r\n {\r\n const value = e.target.value.trim();\r\n if (value.length > 9) {\r\n return;\r\n }\r\n field.onChange(e);\r\n onFieldValueChange(value);\r\n }}\r\n label={isRequired && label ? `*${label}` : label}\r\n error={!!(meta.touched && meta.error) || error}\r\n helperText={!!(meta.touched && meta.error) ? meta.error : helperText}\r\n style={{\r\n ...props.style,\r\n marginBottom: !!(meta.touched && meta.error)\r\n ? '4px'\r\n : (!!props && !!props.style && props.style.marginBottom) || ''\r\n }}\r\n {...props}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport {\r\n FormControl,\r\n Select,\r\n OutlinedInput,\r\n MenuItem,\r\n InputLabel\r\n} from '@material-ui/core';\r\nimport { useField } from 'formik';\r\nimport { ArrowDropDown } from '@material-ui/icons';\r\n\r\nconst options = [\r\n {\r\n id: 'AL',\r\n value: 'Alabama'\r\n },\r\n {\r\n id: 'AK',\r\n value: 'Alaska'\r\n },\r\n {\r\n id: 'AS',\r\n value: 'American Samoa'\r\n },\r\n {\r\n id: 'AZ',\r\n value: 'Arizona'\r\n },\r\n {\r\n id: 'AR',\r\n value: 'Arkansas'\r\n },\r\n {\r\n id: 'CA',\r\n value: 'California'\r\n },\r\n {\r\n id: 'CO',\r\n value: 'Colorado'\r\n },\r\n {\r\n id: 'CT',\r\n value: 'Connecticut'\r\n },\r\n {\r\n id: 'DE',\r\n value: 'Delaware'\r\n },\r\n {\r\n id: 'DC',\r\n value: 'District Of Columbia'\r\n },\r\n {\r\n id: 'FM',\r\n value: 'Federated States Of Micronesia'\r\n },\r\n {\r\n id: 'FL',\r\n value: 'Florida'\r\n },\r\n {\r\n id: 'GA',\r\n value: 'Georgia'\r\n },\r\n {\r\n id: 'GU',\r\n value: 'Guam'\r\n },\r\n {\r\n id: 'HI',\r\n value: 'Hawaii'\r\n },\r\n {\r\n id: 'ID',\r\n value: 'Idaho'\r\n },\r\n {\r\n id: 'IL',\r\n value: 'Illinois'\r\n },\r\n {\r\n id: 'IN',\r\n value: 'Indiana'\r\n },\r\n {\r\n id: 'IA',\r\n value: 'Iowa'\r\n },\r\n {\r\n id: 'KS',\r\n value: 'Kansas'\r\n },\r\n {\r\n id: 'KY',\r\n value: 'Kentucky'\r\n },\r\n {\r\n id: 'LA',\r\n value: 'Louisiana'\r\n },\r\n {\r\n id: 'ME',\r\n value: 'Maine'\r\n },\r\n {\r\n id: 'MH',\r\n value: 'Marshall Islands'\r\n },\r\n {\r\n id: 'MD',\r\n value: 'Maryland'\r\n },\r\n {\r\n id: 'MA',\r\n value: 'Massachusetts'\r\n },\r\n {\r\n id: 'MI',\r\n value: 'Michigan'\r\n },\r\n {\r\n id: 'MN',\r\n value: 'Minnesota'\r\n },\r\n {\r\n id: 'MS',\r\n value: 'Mississippi'\r\n },\r\n {\r\n id: 'MO',\r\n value: 'Missouri'\r\n },\r\n {\r\n id: 'MT',\r\n value: 'Montana'\r\n },\r\n {\r\n id: 'NE',\r\n value: 'Nebraska'\r\n },\r\n {\r\n id: 'NV',\r\n value: 'Nevada'\r\n },\r\n {\r\n id: 'NH',\r\n value: 'New Hampshire'\r\n },\r\n {\r\n id: 'NJ',\r\n value: 'New Jersey'\r\n },\r\n {\r\n id: 'NM',\r\n value: 'New Mexico'\r\n },\r\n {\r\n id: 'NY',\r\n value: 'New York'\r\n },\r\n {\r\n id: 'NC',\r\n value: 'North Carolina'\r\n },\r\n {\r\n id: 'ND',\r\n value: 'North Dakota'\r\n },\r\n {\r\n id: 'MP',\r\n value: 'Northern Mariana Islands'\r\n },\r\n {\r\n id: 'OH',\r\n value: 'Ohio'\r\n },\r\n {\r\n id: 'OK',\r\n value: 'Oklahoma'\r\n },\r\n {\r\n id: 'OR',\r\n value: 'Oregon'\r\n },\r\n {\r\n id: 'PW',\r\n value: 'Palau'\r\n },\r\n {\r\n id: 'PA',\r\n value: 'Pennsylvania'\r\n },\r\n {\r\n id: 'PR',\r\n value: 'Puerto Rico'\r\n },\r\n {\r\n id: 'RI',\r\n value: 'Rhode Island'\r\n },\r\n {\r\n id: 'SC',\r\n value: 'South Carolina'\r\n },\r\n {\r\n id: 'SD',\r\n value: 'South Dakota'\r\n },\r\n {\r\n id: 'TN',\r\n value: 'Tennessee'\r\n },\r\n {\r\n id: 'TX',\r\n value: 'Texas'\r\n },\r\n {\r\n id: 'UT',\r\n value: 'Utah'\r\n },\r\n {\r\n id: 'VT',\r\n value: 'Vermont'\r\n },\r\n {\r\n id: 'VI',\r\n value: 'Virgin Islands'\r\n },\r\n {\r\n id: 'VA',\r\n value: 'Virginia'\r\n },\r\n {\r\n id: 'WA',\r\n value: 'Washington'\r\n },\r\n {\r\n id: 'WV',\r\n value: 'West Virginia'\r\n },\r\n {\r\n id: 'WI',\r\n value: 'Wisconsin'\r\n },\r\n {\r\n id: 'WY',\r\n value: 'Wyoming'\r\n }\r\n];\r\n\r\nconst DropdownIcon = props => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const StateSelect = ({ style, name, label, ...props }) => {\r\n const [field] = useField({\r\n name\r\n });\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useField } from 'formik';\r\nimport { composeValidators, requiredValidator } from 'sd-formik-validators';\r\nimport { StyledTextField } from './StyledTextField';\r\nconst validateSex = () => {\r\n return undefined;\r\n};\r\nexport const SexField = ({\r\n isRequired = false,\r\n name,\r\n label,\r\n validate = [],\r\n helperText = '',\r\n error = '',\r\n onFieldValueChange = () => {},\r\n ...props\r\n}) => {\r\n const [field, meta] = useField({\r\n name,\r\n validate: isRequired\r\n ? composeValidators(requiredValidator, validateSex, ...validate)\r\n : composeValidators(validateSex, ...validate)\r\n });\r\n\r\n return (\r\n {\r\n field.onChange(e);\r\n onFieldValueChange(e);\r\n }}\r\n label={isRequired && label ? `*${label}` : label}\r\n error={!!(meta.touched && meta.error) || error}\r\n helperText={!!(meta.touched && meta.error) ? meta.error : helperText}\r\n style={{\r\n ...props.style,\r\n marginBottom: !!(meta.touched && meta.error)\r\n ? '4px'\r\n : (!!props && !!props.style && props.style.marginBottom) || ''\r\n }}\r\n {...props}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { useField } from 'formik';\r\nimport InputMask from 'react-input-mask';\r\nimport { composeValidators, requiredValidator } from 'sd-formik-validators';\r\nimport { StyledTextField } from '../StyledTextField';\r\nimport { isExists, isFuture } from 'date-fns';\r\n\r\nconst validateDOB = (value: string) => {\r\n const validDOBRegex = /\\d{2}\\/\\d{2}\\/\\d{4}/;\r\n const [dobMonth, dobDay, dobYear] = value.split('/');\r\n const dobDate: Date = new Date(\r\n Number(dobYear),\r\n Number(dobMonth) - 1,\r\n Number(dobDay)\r\n );\r\n const nowDate: Date = new Date();\r\n const failed = 'Invalid DOB';\r\n const goodValue = undefined;\r\n\r\n // date should not return an error if not filled out\r\n if (['', '__/__/____'].includes(value.trim())) return goodValue;\r\n // date should pass regex test to be valid date format\r\n if (!validDOBRegex.test(value)) return failed;\r\n // date should return error if is future\r\n if (isFuture(dobDate)) return 'Date of birth cannot be in future';\r\n // date should exist in our reality\r\n if (!isExists(Number(dobYear), Number(dobMonth) - 1, Number(dobDay)))\r\n return failed;\r\n // date should be less than 126 into the past - people arent that old\r\n if (Math.abs(nowDate.getFullYear() - Number(dobYear)) >= 126) return failed;\r\n // default return undefined if date is good\r\n return goodValue;\r\n};\r\n\r\nexport type DOBFieldProps = {\r\n isRequired?: boolean;\r\n name: string;\r\n label: string;\r\n validate?: Array;\r\n helperText?: string;\r\n error?: string;\r\n onFieldValueChange?: (e: React.ChangeEvent) => void;\r\n style?: React.CSSProperties;\r\n};\r\n\r\nexport const DOBField: React.FC = ({\r\n isRequired = false,\r\n name,\r\n label,\r\n validate = [],\r\n helperText = '',\r\n error = '',\r\n onFieldValueChange = () => {},\r\n ...props\r\n}) => {\r\n const [field, meta] = useField({\r\n name,\r\n validate: isRequired\r\n ? composeValidators(requiredValidator, validateDOB, ...validate)\r\n : composeValidators(validateDOB, ...validate)\r\n });\r\n\r\n return (\r\n {\r\n field.onChange(e);\r\n onFieldValueChange(e);\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport {\r\n FormControl,\r\n Select,\r\n OutlinedInput,\r\n MenuItem,\r\n InputLabel\r\n} from '@material-ui/core';\r\nimport { useField } from 'formik';\r\nimport { ArrowDropDown } from '@material-ui/icons';\r\n\r\n// Self = 1,\r\n// Spouse = 2,\r\n// Child = 3,\r\n// Other = 4\r\nconst options = [\r\n {\r\n id: 1,\r\n value: 'Self'\r\n },\r\n {\r\n id: 2,\r\n value: 'Spouse'\r\n },\r\n {\r\n id: 3,\r\n value: 'Child'\r\n },\r\n {\r\n id: 4,\r\n value: 'Other'\r\n }\r\n];\r\nconst DropdownIcon = props => {\r\n return (\r\n \r\n );\r\n};\r\nexport const InsuredRelationshipToPatientField = ({\r\n style,\r\n name,\r\n ...props\r\n}) => {\r\n const [field] = useField({\r\n name\r\n });\r\n\r\n return (\r\n \r\n \r\n Insured Relation to Patient\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Form, Formik } from 'formik';\r\nimport { FormTextField, SubmitButton } from 'components';\r\nimport { ZipCodeField } from 'components/ZipCodeField';\r\nimport { usePartnerUpdateRequestInsuranceInsert } from 'hooks/requests';\r\nimport { StateSelect } from 'components/StateSelect';\r\nimport { SexField } from 'components/SexField';\r\nimport { DOBField } from 'components/DOBField';\r\nimport { InsuredRelationshipToPatientField } from 'components/InsuredRelationshipToPatientField';\r\nimport { format } from 'date-fns/esm';\r\nimport { InsuranceInfo, PatientInsuranceInfo } from 'types/patientInsurance';\r\nimport { Color } from '@material-ui/lab/Alert';\r\nimport { useAuthentication } from '../../../hooks/useAuthentication';\r\n\r\nexport interface InsuranceFormProps {\r\n ordinal?: string;\r\n data?: PatientInsuranceInfo;\r\n initialValues?: Partial;\r\n setSnackbarState: (state: {\r\n message?: string;\r\n open?: boolean;\r\n severity?: Color;\r\n }) => void;\r\n}\r\n\r\nexport const InsuranceForm: React.FC = ({\r\n ordinal = 'primary',\r\n data = {},\r\n initialValues = {},\r\n setSnackbarState\r\n}) => {\r\n const ids = {\r\n primary: 4,\r\n secondary: 5,\r\n tertiary: 6\r\n };\r\n const id = ids[ordinal as keyof typeof ids];\r\n const { mutateAsync: updateMutation } =\r\n usePartnerUpdateRequestInsuranceInsert();\r\n const { isLoggedInSSO } = useAuthentication();\r\n\r\n return (\r\n {\r\n try {\r\n await updateMutation({\r\n ...data,\r\n reqAction: id,\r\n [`${ordinal}Insurance`]: {\r\n ...values,\r\n insuredDOB: values?.insuredDOB ? new Date(values.insuredDOB) : ''\r\n }\r\n } as unknown as PatientInsuranceInfo);\r\n\r\n setSnackbarState({\r\n message: 'Update request saved successfully',\r\n severity: 'success',\r\n open: true\r\n });\r\n } catch (err) {\r\n setSnackbarState({\r\n message:\r\n (err as { Error: string }).Error || 'An Error has occured.',\r\n severity: 'error',\r\n open: true\r\n });\r\n }\r\n actions.setSubmitting(false);\r\n }}\r\n render={({ isSubmitting, isValidating }) => {\r\n const isFormSubmitting = isSubmitting || isValidating;\r\n\r\n return (\r\n \r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { useField } from 'formik';\r\nimport { composeValidators, requiredValidator } from 'sd-formik-validators';\r\nimport { StyledTextField } from './StyledTextField';\r\nconst validateEmail = value => {\r\n const validEmailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (value.trim() === '' || validEmailRegex.test(value)) {\r\n return undefined;\r\n } else {\r\n return 'Invalid Email';\r\n }\r\n};\r\nexport const EmailField = ({\r\n isRequired = false,\r\n name,\r\n label,\r\n validate = [],\r\n helperText = '',\r\n error = '',\r\n ...props\r\n}) => {\r\n const [field, meta] = useField({\r\n name,\r\n validate: isRequired\r\n ? composeValidators(requiredValidator, validateEmail, ...validate)\r\n : composeValidators(validateEmail, ...validate)\r\n });\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Form, Formik, FormikHelpers } from 'formik';\r\nimport { FormTextField, SubmitButton } from 'components';\r\nimport { Tooltip } from 'components/Tooltip';\r\nimport { EmailField } from 'components/EmailField';\r\nimport { PhoneTextField } from 'components/PhoneTextField';\r\nimport { ZipCodeField } from 'components/ZipCodeField';\r\nimport { StateSelect } from 'components/StateSelect';\r\nimport { SexField } from 'components/SexField';\r\nimport { usePartnerUpdateRequestInsuranceInsert } from 'hooks/requests';\r\nimport { DOBField } from 'components/DOBField';\r\nimport { format } from 'date-fns';\r\nimport { PatientInfo, PatientInsuranceInfo } from 'types/patientInsurance';\r\nimport { Color } from '@material-ui/lab/Alert';\r\nimport { useAuthentication } from '../../../hooks/useAuthentication';\r\n\r\nconst ReadOnlyTooltip = ({ ...props }) => {\r\n return ;\r\n};\r\n\r\nexport interface PatientFormProps {\r\n data?: PatientInsuranceInfo;\r\n initialValues?: Partial;\r\n setSnackbarState: (state: {\r\n message?: string;\r\n open?: boolean;\r\n severity?: Color;\r\n }) => void;\r\n}\r\n\r\nexport const PatientForm: React.FC = ({\r\n initialValues = {},\r\n data = {},\r\n setSnackbarState\r\n}) => {\r\n const { mutateAsync: updateMutation } =\r\n usePartnerUpdateRequestInsuranceInsert();\r\n const { isLoggedInSSO } = useAuthentication();\r\n\r\n const handleSubmit = async (\r\n values: PatientInfo,\r\n actions: FormikHelpers\r\n ) => {\r\n try {\r\n await updateMutation({\r\n ...data,\r\n patientInformation: {\r\n ...values,\r\n patientHomePhone: values?.patientHomePhone.replaceAll('-', '') || '',\r\n patientDOB: values?.patientDOB ? new Date(values.patientDOB) : '',\r\n patientCellPhone: values?.patientCellPhone.replaceAll('-', '') || ''\r\n }\r\n } as unknown as PatientInsuranceInfo);\r\n setSnackbarState({\r\n message: 'Update request saved successfully',\r\n severity: 'success',\r\n open: true\r\n });\r\n } catch (err) {\r\n console.dir(err);\r\n setSnackbarState({\r\n message: (err as { Error: string }).Error || 'An Error has occured.',\r\n severity: 'error',\r\n open: true\r\n });\r\n }\r\n actions.setSubmitting(false);\r\n };\r\n\r\n return (\r\n {\r\n const isFormSubmitting = isSubmitting || isValidating;\r\n\r\n return (\r\n \r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { FormSelector } from './FormSelector';\r\nimport styled from 'styled-components';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport Paper, { PaperProps } from '@material-ui/core/Paper';\r\nimport Draggable from 'react-draggable';\r\nimport { InsuranceForm } from '../InsuranceForm/InsuranceForm';\r\nimport { PatientForm } from '../PatientForm/PatientForm';\r\nimport { usePartnerGetPatientInsurance } from 'hooks/requests';\r\nimport { MenuItem, Snackbar } from '@material-ui/core';\r\nimport Alert, { Color } from '@material-ui/lab/Alert';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport { PatientInsuranceInfo } from 'types/patientInsurance';\r\n\r\nexport interface PatientInsuranceDialogProps {\r\n invoiceNo?: number;\r\n srcSystemKey?: number;\r\n open?: boolean;\r\n close: () => void;\r\n}\r\n\r\nexport const PatientInsuranceDialog: React.FC = ({\r\n invoiceNo,\r\n srcSystemKey,\r\n open = true,\r\n close = () => {}\r\n}) => {\r\n const {\r\n mutate: getPatientInformationMutation,\r\n data = {} as unknown as PatientInsuranceInfo\r\n } = usePartnerGetPatientInsurance();\r\n\r\n const [form, setForm] = useState(FORM_SELECTION.PATIENT);\r\n const [snackbarState, setSnackbarState] = useState<{\r\n message?: string;\r\n open?: boolean;\r\n severity?: Color;\r\n }>({});\r\n\r\n const handleCloseSnackBar = (_: unknown, reason?: string) => {\r\n reason !== 'clickaway' && setSnackbarState({});\r\n };\r\n\r\n const handleError = () =>\r\n setSnackbarState({\r\n open: true,\r\n severity: 'error',\r\n message: 'An Error has occurred to load up the data.'\r\n });\r\n\r\n useEffect(() => {\r\n if (!(invoiceNo && srcSystemKey)) return;\r\n getPatientInformationMutation(\r\n {\r\n account: invoiceNo,\r\n srcSystemKey\r\n },\r\n { onError: handleError }\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [invoiceNo, srcSystemKey]);\r\n\r\n useEffect(() => {\r\n if (open) return;\r\n setForm(FORM_SELECTION.PATIENT);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [open]);\r\n\r\n return (\r\n <>\r\n {snackbarState.message ? (\r\n \r\n \r\n {snackbarState.message}\r\n \r\n \r\n ) : null}\r\n \r\n \r\n \r\n {`Information Update Request for Invoice: ${invoiceNo}`}\r\n close()} />\r\n \r\n \r\n \r\n Please submit your requested changes in the sections below. NOTE: Data\r\n displayed could be up to 5 business days old.\r\n
\r\n \r\n
\r\n Select Update Request Type:\r\n
\r\n \r\n setForm(e.target.value)\r\n }\r\n style={{\r\n margin: '6px 24px 12px 24px',\r\n maxWidth: '300px',\r\n width: '100%'\r\n }}\r\n >\r\n {Object.keys(FORM_SELECTION).map(formKey => {\r\n const formValue =\r\n FORM_SELECTION[formKey as keyof typeof FORM_SELECTION];\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n {FORM_SELECTION.PATIENT === form ? (\r\n
\r\n ) : null}\r\n {FORM_SELECTION.PRIMARY === form ? (\r\n
\r\n ) : null}\r\n {FORM_SELECTION.SECONDARY === form ? (\r\n
\r\n ) : null}\r\n
\r\n \r\n >\r\n );\r\n};\r\n\r\nfunction PaperComponent(props: PaperProps) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst StyledDialogTitle = styled(DialogTitle)`\r\n cursor: move;\r\n position: sticky;\r\n top: 0;\r\n background-color: #f5f5f5;\r\n`;\r\nconst TitleControl = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n`;\r\nconst StyledDialog = styled(Dialog)`\r\n .MuiPaper-root.MuiDialog-paper {\r\n background-color: #f5f5f5;\r\n border: 6px solid #95bcd7;\r\n }\r\n`;\r\n\r\nconst FORM_SELECTION = {\r\n PATIENT: 'PATIENT',\r\n PRIMARY: 'PRIMARY INSURANCE',\r\n SECONDARY: 'SECONDARY INSURANCE'\r\n};\r\n","import { useMutation } from 'react-query';\r\nimport { useAuthenticatedAxios } from 'hooks/useAuthenticatedAxios';\r\nimport { ROUTES } from 'constants/routes';\r\nimport { ErrorResponse } from 'types/network';\r\nimport { PatientInsuranceInfo } from 'types/patientInsurance';\r\n\r\nexport const usePartnerGetPatientInsurance = () => {\r\n const Axios = useAuthenticatedAxios();\r\n return useMutation<\r\n PatientInsuranceInfo,\r\n ErrorResponse,\r\n { account: number; srcSystemKey: number }\r\n >(async ({ account, srcSystemKey }) => {\r\n const { data } = await Axios({\r\n method: 'post',\r\n url: `/?route=${ROUTES.PartnerGetPatientInsurance}`,\r\n data: {\r\n account,\r\n srcSystemKey\r\n }\r\n });\r\n return data;\r\n });\r\n};\r\n","import { useState, useEffect } from 'react';\r\nimport styled from 'styled-components';\r\nimport axios from 'axios';\r\nimport moment from 'moment';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport { useMyTransactionsSummaryContext } from './MyTransactionsSummaryContext';\r\nimport MyTransactionsSummaryForm, {\r\n FilterOptions\r\n} from './MyTransactionsSummaryForm';\r\nimport MyTransactionsSummaryTable from './MuiEnhancedTable';\r\nimport MyTransactionSummaryDetails from './MyTransactionSummaryDetails';\r\nimport PatientStatement from './PatientStatement';\r\nimport { InvoiceDocumentsDialog } from 'components/InvoiceDocumentsDialog/InvoiceDocumentsDialog';\r\nimport { PartnerGetMyTransactionSummary } from './constants';\r\nimport SessionTimeout from 'components/SessionTimeout';\r\nimport { PatientInsuranceDialog } from './PatientInsuranceDialog/PatientInsuranceDialog';\r\nimport { Snackbar, Divider } from '@material-ui/core';\r\nimport Alert from '@material-ui/lab/Alert';\r\nimport { theme } from 'lib/theme';\r\n\r\nconst Layout = styled.div`\r\n max-width: 2048px;\r\n margin: 0 auto;\r\n padding: 0 30px;\r\n`;\r\n\r\nfunction MyTransactionsSummary() {\r\n const {\r\n encounters,\r\n setEncounters,\r\n setFacilityOptions,\r\n facility,\r\n advancedFilter,\r\n value1,\r\n value2,\r\n search,\r\n setSearch,\r\n isLoading,\r\n setIsLoading,\r\n providerSearch,\r\n notSearched,\r\n setNotSearched\r\n } = useMyTransactionsSummaryContext();\r\n const [\r\n showMyTransactionsX12DocumentLink,\r\n setShowMyTransactionsX12DocumentLink\r\n ] = useState(false);\r\n const [openSummary, setOpenSummary] = useState(null);\r\n const [openPatientStatement, setOpenPatientStatement] = useState(null);\r\n const [showInvoice, setShowInvoice] = useState(false);\r\n const [openInvoice, setOpenInvoice] = useState(false);\r\n const [openPatientInsurance, setOpenPatientInsurance] = useState({});\r\n const [message, setMessage] = useState('');\r\n const [openSnackBar, setOpenSnackBar] = useState(false);\r\n\r\n useEffect(() => {\r\n const fetchOptions = async () => {\r\n const user = JSON.parse(await sessionStorage.getItem('user'));\r\n const facilityIDs = user.facilities.map(\r\n ({ facilityID, facilityName }) => ({\r\n value: facilityID,\r\n label: facilityName\r\n })\r\n );\r\n setFacilityOptions(facilityIDs);\r\n\r\n user.showMyTransactionsX12DocumentLink = true;\r\n\r\n setShowMyTransactionsX12DocumentLink(\r\n user.showMyTransactionsX12DocumentLink\r\n );\r\n };\r\n fetchOptions();\r\n }, []);\r\n\r\n const formatValue1 = (value, filterValue) => {\r\n if (!value || !filterValue) return '';\r\n if (filterValue === FilterOptions.dob)\r\n return moment(value).format('MM-DD-YYYY');\r\n if (filterValue === FilterOptions.dosRange) {\r\n return moment(value).format('MM-DD-YYYY');\r\n }\r\n return value;\r\n };\r\n\r\n const formatValue2 = (value, filterValue) => {\r\n if (!value || !filterValue) return '';\r\n if (filterValue === FilterOptions.dosRange) {\r\n return moment(value).format('MM-DD-YYYY');\r\n }\r\n return value;\r\n };\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n const payload = {\r\n facilityIds: facility.map(el => el.value),\r\n key: mapAdvancedFilter(advancedFilter),\r\n value1: formatValue1(value1, advancedFilter),\r\n value2: formatValue2(value2, advancedFilter),\r\n providerList: providerSearch ? [providerSearch] : []\r\n };\r\n const config = {\r\n headers: {\r\n Authorization: `Bearer ${sessionStorage.getItem('usertoken')}`\r\n }\r\n };\r\n const URL = `${process.env.REACT_APP_URL}/?route=${PartnerGetMyTransactionSummary}`;\r\n const isFetching = search;\r\n try {\r\n const result = isFetching\r\n ? await axios.post(URL, payload, config)\r\n : encounters;\r\n setEncounters(isFetching ? result.data : result);\r\n setNotSearched(isFetching ? false : notSearched);\r\n setSearch(false);\r\n } catch (err) {\r\n setMessage(err ? err?.response?.data.Error : message);\r\n if (err?.response?.data?.Error) {\r\n setOpenSnackBar(true);\r\n }\r\n setIsLoading(false);\r\n setSearch(false);\r\n setNotSearched(false);\r\n setEncounters([]);\r\n }\r\n };\r\n fetchData();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [search]);\r\n\r\n useEffect(() => {\r\n setIsLoading(false);\r\n }, [encounters]);\r\n\r\n const handleCloseSnackBar = (_, reason) => {\r\n if (reason === 'clickaway') return;\r\n setOpenSnackBar(false);\r\n };\r\n\r\n return (\r\n \r\n \r\n {openSnackBar && (\r\n \r\n {message}\r\n \r\n )}\r\n \r\n \r\n
\r\n
My Transactions
\r\n
\r\n Please select Search Type criteria and click Search\r\n
\r\n
\r\n {/* eslint-disable-next-line react/jsx-no-target-blank */}\r\n
\r\n User Guide\r\n \r\n
\r\n <>\r\n \r\n\r\n \r\n >\r\n {isLoading ? (\r\n \r\n \r\n
\r\n ) : (\r\n \r\n {\r\n return {\r\n ...encounter,\r\n ados: encounter.ados\r\n ? moment(encounter.ados).format('MM/DD/YY')\r\n : '',\r\n dob: encounter.dob\r\n ? moment(encounter.dob).format('MM/DD/YY')\r\n : ''\r\n };\r\n }) || []\r\n }\r\n openPatientInsurance={openPatientInsurance}\r\n setOpenPatientInsurance={setOpenPatientInsurance}\r\n notSearched={notSearched}\r\n openSummary={openSummary}\r\n openPatientStatement={openPatientStatement}\r\n showMyTransactionsX12DocumentLink={\r\n showMyTransactionsX12DocumentLink\r\n }\r\n openInvoice={openInvoice}\r\n showInvoice={showInvoice}\r\n setOpenSummary={setOpenSummary}\r\n setOpenPatientStatement={setOpenPatientStatement}\r\n setOpenInvoice={setOpenInvoice}\r\n setShowInvoice={setShowInvoice}\r\n setShowMyTransactionsX12DocumentLink={\r\n setShowMyTransactionsX12DocumentLink\r\n }\r\n />\r\n
\r\n )}\r\n\r\n {!!showMyTransactionsX12DocumentLink && !!showInvoice ? (\r\n setOpenInvoice(false)}\r\n >\r\n ) : null}\r\n\r\n setOpenSummary(null)}\r\n />\r\n setOpenPatientStatement(null)}\r\n />\r\n setOpenPatientInsurance({})}\r\n />\r\n \r\n \r\n );\r\n}\r\n\r\nexport default MyTransactionsSummary;\r\n\r\nconst mapAdvancedFilter = advancedFilter => {\r\n switch (advancedFilter) {\r\n case 'Date Of Birth':\r\n return 'PatientDOB';\r\n case 'Patient Last Name':\r\n return 'LastName';\r\n case 'Account Number':\r\n return 'FacilityAccountNumber';\r\n case 'Statement Account':\r\n return 'statementAccount';\r\n case 'Invoice Number':\r\n return 'invoiceNumber';\r\n case 'Provider':\r\n return 'Provider';\r\n case 'Date Of Service Range':\r\n return 'DateOfService';\r\n default:\r\n return '';\r\n }\r\n};\r\n","import styled from 'styled-components';\r\n\r\nexport const LoginContainer = styled.div<{ src: string }>`\r\n display: flex;\r\n justify-content: center;\r\n height: 100%;\r\n min-height: 100vh;\r\n width: 100%;\r\n @media screen and (min-width: 960px) {\r\n background: url(${props => props.src}) no-repeat center center fixed;\r\n /* stylelint-disable-next-line property-no-vendor-prefix */\r\n -webkit-background-size: cover;\r\n /* stylelint-disable-next-line property-no-vendor-prefix */\r\n -moz-background-size: cover;\r\n /* stylelint-disable-next-line property-no-vendor-prefix */\r\n -o-background-size: cover;\r\n background-size: cover;\r\n }\r\n .working,\r\n .working::before,\r\n .working::after {\r\n position: absolute;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n }\r\n\r\n .working {\r\n width: 500px;\r\n height: 500px;\r\n margin: auto 0 auto 350px;\r\n border-radius: 10px;\r\n }\r\n\r\n .working::before,\r\n .working::after {\r\n color: rgb(80, 104, 120);\r\n opacity: 75%;\r\n content: '';\r\n z-index: 2;\r\n margin: -1%;\r\n border-radius: 1000px;\r\n box-shadow: inset 0 0 0 4px;\r\n animation: clipMe 20s linear infinite;\r\n }\r\n\r\n .working::before {\r\n animation-delay: -10s;\r\n }\r\n\r\n @keyframes clipMe {\r\n 0%,\r\n 100% {\r\n clip: rect(0px, 510px, 6px, 0px);\r\n }\r\n\r\n 25% {\r\n clip: rect(0px, 6px, 510px, 0px);\r\n }\r\n\r\n 50% {\r\n clip: rect(506px, 510px, 510px, 0px);\r\n }\r\n\r\n 75% {\r\n clip: rect(0px, 510px, 510px, 506px);\r\n }\r\n }\r\n\r\n .ReverseWorking,\r\n .ReverseWorking::before,\r\n .ReverseWorking::after {\r\n position: absolute;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n }\r\n\r\n .ReverseWorking {\r\n width: 600px;\r\n height: 600px;\r\n margin: auto 0 auto 300px;\r\n }\r\n\r\n .ReverseWorking::before,\r\n .ReverseWorking::after {\r\n color: #3f51b5;\r\n opacity: 75%;\r\n content: '';\r\n z-index: 2;\r\n margin: -1%;\r\n border-radius: 1000px;\r\n box-shadow: inset 0 0 0 4px;\r\n animation: clipMe2 50s linear infinite;\r\n }\r\n\r\n .ReverseWorking::before {\r\n animation-delay: -25s;\r\n }\r\n\r\n @keyframes clipMe2 {\r\n 0%,\r\n 100% {\r\n clip: rect(0px, 4px, 720px, 0px);\r\n }\r\n\r\n 25% {\r\n clip: rect(0px, 720px, 4px, 0px);\r\n }\r\n\r\n 50% {\r\n clip: rect(0px, 720px, 720px, 506px);\r\n }\r\n\r\n 75% {\r\n clip: rect(506px, 720px, 720px, 0px);\r\n }\r\n }\r\n`;\r\n\r\nexport const LoginPanel = styled.div`\r\n z-index: 10;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n margin: auto 0 auto 375px;\r\n position: fixed;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n width: 450px;\r\n height: 450px;\r\n max-width: 500px;\r\n max-height: 500px;\r\n border-radius: 1000px;\r\n background: white;\r\n opacity: 95%;\r\n`;\r\n","export default __webpack_public_path__ + \"static/media/background.6ca924eb.jpeg\";","export default __webpack_public_path__ + \"static/media/ventra-logo.133ddcb9.png\";","import React, { useState } from 'react';\r\nimport { usePartnerUpSertMfaPhoneNumber } from 'hooks/requests';\r\nimport { Form, Formik } from 'formik';\r\nimport { PhoneTextField } from 'components/PhoneTextField';\r\nimport { SubmitButton } from 'components/Buttons';\r\nimport SecureTrustCertificate from 'components/SecureTrustCertificate';\r\nimport { useAuthentication } from 'hooks/useAuthentication';\r\n\r\nexport interface MFAPhoneProps {\r\n gotoMFA: () => void;\r\n}\r\n\r\nexport const MFAPhone: React.FC = ({ gotoMFA }) => {\r\n const { mutateAsync: upsertPhoneMutation } = usePartnerUpSertMfaPhoneNumber();\r\n const [errorMsg, setErrorMsg] = useState('');\r\n const { setToken } = useAuthentication();\r\n return (\r\n {\r\n setErrorMsg('');\r\n const cleanPhoneNumber = values.phoneNumber.replace(/-/g, '');\r\n try {\r\n const data = await upsertPhoneMutation({\r\n phoneNumber: cleanPhoneNumber\r\n });\r\n sessionStorage.setItem(\r\n 'user',\r\n JSON.stringify({\r\n ...JSON.parse(sessionStorage.getItem('user') || '{}'),\r\n phoneNumber: cleanPhoneNumber\r\n })\r\n );\r\n setToken(data);\r\n gotoMFA();\r\n } catch (err) {\r\n setErrorMsg(\r\n `Failed to update phone number. ${\r\n (err as { message: string }).message\r\n }`\r\n );\r\n } finally {\r\n actions.setSubmitting(false);\r\n }\r\n }}\r\n >\r\n {({ isSubmitting, isValidating }) => {\r\n return (\r\n \r\n );\r\n }}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useField } from 'formik';\r\nimport { composeValidators, requiredValidator } from 'sd-formik-validators';\r\nimport { StyledTextField } from './StyledTextField';\r\nconst DigitsField = ({\r\n isRequired = false,\r\n name,\r\n label,\r\n validate = [],\r\n helperText = '',\r\n error = false,\r\n onFieldValueChange,\r\n ...props\r\n}) => {\r\n const [field, meta] = useField({\r\n name,\r\n validate: isRequired\r\n ? composeValidators(requiredValidator, ...validate)\r\n : composeValidators(...validate)\r\n });\r\n return (\r\n {\r\n if (/^[0-9]*$/.test(e.target.value)) {\r\n field.onChange(e);\r\n if (onFieldValueChange) {\r\n onFieldValueChange(e);\r\n }\r\n }\r\n }}\r\n label={isRequired && label ? `*${label}` : label}\r\n error={!!(meta.touched && meta.error) || error}\r\n helperText={!!(meta.touched && meta.error) ? meta.error : helperText}\r\n {...props}\r\n style={{\r\n ...props.style,\r\n marginBottom: !!(meta.touched && meta.error)\r\n ? '4px'\r\n : (!!props && !!props.style && props.style.marginBottom) || ''\r\n }}\r\n />\r\n );\r\n};\r\nexport default DigitsField;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport { Tooltip } from 'components/Tooltip';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport { theme } from 'lib/theme';\r\nconst useStyles = makeStyles(() => ({\r\n tooltip: {\r\n maxWidth: 600,\r\n backgroundColor: theme.palette.primary.main\r\n }\r\n}));\r\nconst HelpLink = styled.div`\r\n color: ${theme.palette.secondary.main};\r\n cursor: default;\r\n font-weight: 400;\r\n &:hover {\r\n font-weight: 800;\r\n }\r\n`;\r\n\r\nexport const FindHelp = props => {\r\n const classes = useStyles();\r\n return (\r\n \r\n Need Help?\r\n \r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { Form, Formik } from 'formik';\r\nimport DigitsField from 'components/DigitsField';\r\nimport { SubmitButton } from 'components/Buttons';\r\nimport { useNavigate } from 'react-router';\r\nimport { usePartnerGetMfaAuthentication } from 'hooks/requests/usePartnerGetMfaAuthentication';\r\nimport { usePartnerSendMfaTextToPhoneNumber } from 'hooks/requests/usePartnerSendMfaTextToPhoneNumber';\r\nimport { Button } from '@material-ui/core';\r\nimport SecureTrustCertificate from 'components/SecureTrustCertificate';\r\nimport { useAuthentication } from 'hooks/useAuthentication';\r\nimport { FindHelp } from '../FindHelp';\r\nimport { useSendMfaTextToEmail } from 'hooks/requests';\r\nimport { User } from 'types/user';\r\n\r\nexport interface MFAProps {\r\n user: User;\r\n setErrorMessage: (msg: string) => void;\r\n setOpenSnackBar: (open: boolean) => void;\r\n}\r\n\r\nexport const MFA: React.FC = ({\r\n user,\r\n setErrorMessage,\r\n setOpenSnackBar\r\n}) => {\r\n const { setToken } = useAuthentication();\r\n const { mutateAsync: mfaAuthenticationMutation } =\r\n usePartnerGetMfaAuthentication();\r\n const { mutate: sendMfaTextToEmail } = useSendMfaTextToEmail();\r\n const { mutate: sendMFATextMutation } = usePartnerSendMfaTextToPhoneNumber();\r\n const [refetchTimeout, setRefetchTimeout] = useState(user.resendTime || 10);\r\n const [refetchErrorMsg, setRefetchErrorMsg] = useState('');\r\n const [invalidCodeErrorMsg, setInvalidCodeErrorMsg] = useState('');\r\n const navigate = useNavigate();\r\n useEffect(() => {\r\n if (user.isEmailMFA) {\r\n sendMfaTextToEmail(undefined, {\r\n onError: err => {\r\n setOpenSnackBar(true);\r\n setErrorMessage(\r\n err?.response?.data?.Error\r\n ? err?.response?.data?.Error\r\n : 'Failed to send code to email.'\r\n );\r\n }\r\n });\r\n } else if (user.requireMFA) {\r\n sendMFATextMutation(undefined, {\r\n onError: err => {\r\n setOpenSnackBar(true);\r\n setErrorMessage(\r\n err?.response?.data?.Error\r\n ? err?.response?.data?.Error\r\n : 'Failed to send code to phone.'\r\n );\r\n }\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [user]);\r\n useEffect(() => {\r\n if (refetchTimeout <= 0) return;\r\n const countdown = setInterval(() => {\r\n setRefetchTimeout(prevState => prevState - 1);\r\n }, 1000);\r\n return () => {\r\n clearInterval(countdown);\r\n };\r\n }, [refetchTimeout]);\r\n return (\r\n {\r\n setInvalidCodeErrorMsg('');\r\n try {\r\n const data = await mfaAuthenticationMutation(\r\n {\r\n mfaToken: values.mfaToken.trim()\r\n },\r\n {\r\n onError: err => {\r\n setInvalidCodeErrorMsg(\r\n err?.response?.data?.Error\r\n ? err?.response?.data?.Error\r\n : 'Code Invalid'\r\n );\r\n }\r\n }\r\n );\r\n setToken(data || '');\r\n if (!user.showMyEncounters && user.showMyTransactions) {\r\n navigate('/MyTransactionsSummary');\r\n } else if (user.showMyEncounters) {\r\n navigate('/MyEncounters');\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (err) {\r\n } finally {\r\n actions.setSubmitting(false);\r\n }\r\n }}\r\n >\r\n {({ isSubmitting, isValidating }) => {\r\n return (\r\n \r\n );\r\n }}\r\n \r\n );\r\n};\r\n","import { useMutation } from 'react-query';\r\nimport { useAuthenticatedAxios } from 'hooks/useAuthenticatedAxios';\r\nimport { ROUTES } from 'constants/routes';\r\nimport { ErrorResponse } from 'types/network';\r\n\r\nexport const useSendMfaTextToEmail = () => {\r\n const Axios = useAuthenticatedAxios();\r\n return useMutation(async () => {\r\n const { data } = await Axios({\r\n method: 'post',\r\n url: `/?route=${ROUTES.SendMfaTextToEmail}`\r\n });\r\n return data;\r\n });\r\n};\r\n","import { useMutation } from 'react-query';\r\nimport { useAuthenticatedAxios } from 'hooks/useAuthenticatedAxios';\r\nimport { ROUTES } from 'constants/routes';\r\nimport { ErrorResponse } from 'types/network';\r\n\r\nexport const usePartnerSendMfaTextToPhoneNumber = () => {\r\n const Axios = useAuthenticatedAxios();\r\n return useMutation(async () => {\r\n const { data } = await Axios({\r\n method: 'post',\r\n url: `/?route=${ROUTES.PartnerSendMfaTextToPhoneNumber}`\r\n });\r\n return data;\r\n });\r\n};\r\n","import React, { useReducer, useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport axios from 'axios';\r\nimport { Formik, Form } from 'formik';\r\nimport { LoginContainer, LoginPanel } from './styled';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n FormTextField,\r\n SubmitButton,\r\n SecureTrustCertificate\r\n} from 'components';\r\nimport { useAuthentication } from '../../hooks/useAuthentication';\r\nimport backgroundImage from '../../assets/background.jpeg';\r\nimport ventraLogo from '../../assets/ventra-logo.png';\r\nimport Snackbar from '@material-ui/core/Snackbar';\r\nimport MuiAlert, { AlertProps } from '@material-ui/lab/Alert';\r\nimport { MFAPhone } from './MFAPhone/MFAPhone';\r\nimport { MFA } from './MFA/MFA';\r\nimport { FindHelp } from './FindHelp';\r\nimport { usePartnerGetMaintenanceMode } from 'hooks/requests';\r\nimport { ROUTES } from 'constants/routes';\r\nimport { ErrorResponse } from 'types/network';\r\nimport { User } from 'types/user';\r\nimport { theme } from 'lib/theme';\r\n\r\nfunction Alert(props: AlertProps) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nconst Img = styled.img`\r\n width: 275px;\r\n margin-bottom: 12px;\r\n`;\r\n\r\nconst URL = `${process.env.REACT_APP_URL}/?route=PartnerGetExternalUser`;\r\nenum StepTypes {\r\n LOGIN = 'LOGIN',\r\n MFA_PHONE = 'MFA_PHONE',\r\n MFA = 'MFA'\r\n}\r\ninterface LoginState {\r\n step: StepTypes;\r\n}\r\nconst loginReducer = (state: LoginState, action: { type: StepTypes }) => {\r\n switch (action.type) {\r\n case StepTypes.LOGIN:\r\n return {\r\n ...state,\r\n step: StepTypes.LOGIN\r\n };\r\n case StepTypes.MFA_PHONE:\r\n return {\r\n ...state,\r\n step: StepTypes.MFA_PHONE\r\n };\r\n case StepTypes.MFA:\r\n return {\r\n ...state,\r\n step: StepTypes.MFA\r\n };\r\n default:\r\n throw new Error(`${action.type} is not a valid action for loginReducer.`);\r\n }\r\n};\r\n//\r\nfunction Login() {\r\n const navigate = useNavigate();\r\n const { setToken, setUserInfo } = useAuthentication();\r\n const [openSnackbar, setOpenSnackBar] = React.useState(false);\r\n const [errorMessage, setErrorMessage] = React.useState('');\r\n const [user, setUser] = useState({} as unknown as User);\r\n const { data: inMaintenance = false, refetch } = usePartnerGetMaintenanceMode(\r\n {\r\n onError: err => {\r\n setOpenSnackBar(true);\r\n setErrorMessage(\r\n err.response?.data?.Error || ROUTES.PartnerGetMaintenanceMode\r\n );\r\n }\r\n }\r\n );\r\n const handleCloseSnackBar = (_: unknown, reason?: string) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n setOpenSnackBar(false);\r\n };\r\n const [state, dispatch] = useReducer(loginReducer, {\r\n step: StepTypes.LOGIN\r\n });\r\n const gotoMFAPhone = () => dispatch({ type: StepTypes.MFA_PHONE });\r\n const gotoMFA = () => dispatch({ type: StepTypes.MFA });\r\n return (\r\n \r\n \r\n \r\n {errorMessage}\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n {inMaintenance ? (\r\n \r\n The Partner Portal is undergoing routine maintenance. Please try\r\n again later.\r\n
\r\n ) : null}\r\n {state.step === StepTypes.LOGIN && !inMaintenance ? (\r\n {\r\n const { username, password } = values;\r\n try {\r\n const userInfo = await axios.post(URL, {\r\n userName: username,\r\n password\r\n });\r\n const user =\r\n !!userInfo && !!userInfo.data ? userInfo.data : '';\r\n setUser(user);\r\n setToken(userInfo.data.token);\r\n setUserInfo(JSON.stringify(user));\r\n const validPhoneRegex = /^(\\d{10})$/;\r\n if (user.requireMFA && user.isEmailMFA) {\r\n gotoMFA();\r\n } else if (\r\n user.requireMFA &&\r\n !validPhoneRegex.test(user.phoneNumber)\r\n ) {\r\n gotoMFAPhone();\r\n } else if (user.requireMFA) {\r\n gotoMFA();\r\n } else if (\r\n !user.showMyEncounters &&\r\n user.showMyTransactions\r\n ) {\r\n navigate('/MyTransactionsSummary');\r\n } else {\r\n navigate('/MyEncounters');\r\n }\r\n } catch (err) {\r\n setErrorMessage(\r\n (err as ErrorResponse).response?.data.Error ||\r\n 'oops! an error occurred'\r\n );\r\n setOpenSnackBar(true);\r\n refetch();\r\n }\r\n actions.setSubmitting(false);\r\n }}\r\n initialValues={{\r\n username: '',\r\n password: ''\r\n }}\r\n render={({ isValidating, isSubmitting }) => {\r\n return (\r\n \r\n );\r\n }}\r\n />\r\n ) : null}\r\n {state.step === StepTypes.MFA_PHONE ? (\r\n \r\n ) : null}\r\n {state.step === StepTypes.MFA ? (\r\n \r\n ) : null}\r\n \r\n
\r\n \r\n );\r\n}\r\n\r\nexport default Login;\r\n","import { useQuery } from 'react-query';\r\nimport { useAuthenticatedAxios } from 'hooks/useAuthenticatedAxios';\r\nimport { ErrorResponse, UseQueryFnOptions } from 'types/network';\r\nimport { ROUTES } from 'constants/routes';\r\n\r\nexport const usePartnerGetMaintenanceMode = (\r\n options?: UseQueryFnOptions\r\n) => {\r\n const Axios = useAuthenticatedAxios();\r\n return useQuery(\r\n ROUTES.PartnerGetMaintenanceMode,\r\n async () => {\r\n const { data } = await Axios({\r\n method: 'get',\r\n url: `?route=${ROUTES.PartnerGetMaintenanceMode}`\r\n });\r\n return data;\r\n },\r\n options\r\n );\r\n};\r\n","import { useEffect } from 'react';\r\nimport styled from 'styled-components';\r\nimport axios from 'axios';\r\nimport { useLocation, useNavigate } from 'react-router-dom';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport { useAuthentication } from '../../hooks/useAuthentication';\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n width: 100vw;\r\n height: 100vh;\r\n justify-content: center;\r\n align-items: center;\r\n`;\r\n\r\nfunction useQuery() {\r\n return new URLSearchParams(useLocation().search);\r\n}\r\n\r\nfunction SSOLogin() {\r\n const query = useQuery();\r\n const navigate = useNavigate();\r\n const { setToken, setUserInfo } = useAuthentication();\r\n const ssoToken = query.get('token');\r\n const header = { headers: { Authorization: `Bearer ${ssoToken}` } };\r\n useEffect(() => {\r\n const getSSOExternalUser = async () => {\r\n try {\r\n const userInfo = await axios.get(\r\n `${process.env.REACT_APP_URL}/?route=SSOLogin`,\r\n header\r\n );\r\n const user = !!userInfo && !!userInfo.data ? userInfo.data : '';\r\n setToken(userInfo.data.token);\r\n setUserInfo(JSON.stringify(user));\r\n navigate('/MyEncounters');\r\n } catch (err) {\r\n navigate('/NoAccess');\r\n }\r\n };\r\n getSSOExternalUser();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default SSOLogin;\r\n","import { useEffect, useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport { useLocation, useNavigate } from 'react-router-dom';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Tabs from '@material-ui/core/Tabs';\r\nimport Tab from '@material-ui/core/Tab';\r\nimport Button from '@material-ui/core/Button';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ventraLogo from '../assets/ventra-logo-light.png';\r\nimport { theme } from 'lib/theme';\r\nimport { useAuthentication } from 'hooks/useAuthentication';\r\nimport { CSSProperties } from '@material-ui/core/styles/withStyles';\r\nimport { BrandColor } from 'constants/brandColor';\r\nimport { Box } from '@material-ui/core';\r\n\r\nconst StyledTabs = styled(Tabs)`\r\n .MuiTabs-indicator {\r\n background-color: ${BrandColor.ACCENT}; /* ventra orange */\r\n }\r\n margin-left: 25px;\r\n margin-right: 25px;\r\n flex: 1 0 auto;\r\n`;\r\n\r\nconst Img = styled.img`\r\n width: 250px;\r\n`;\r\nexport interface AppbarProps {\r\n style?: CSSProperties; // Need to be able to override the display:none when there are no routes\r\n}\r\n\r\nfunction Appbar(props: AppbarProps) {\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n const { getUserInfo, logoutNavigate, isLoggedIn } = useAuthentication();\r\n const user = getUserInfo();\r\n const [routes, setRoutes] = useState([]);\r\n\r\n useEffect(() => {\r\n const routes = [];\r\n if (user?.token) {\r\n if (user.showMyEncounters) {\r\n routes.push('/MyEncounters');\r\n }\r\n if (user.showMyTransactions) {\r\n routes.push('/MyTransactionsSummary');\r\n }\r\n if (user.showMyAccount) {\r\n routes.push('/MyAccount');\r\n }\r\n setRoutes(routes);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [user?.token]);\r\n const value = routes.indexOf(location.pathname);\r\n\r\n const showAppBar =\r\n value >= 0 ||\r\n location.pathname === '/ForgotPassword' ||\r\n location.pathname === '/ResetPassword';\r\n\r\n const displayTabs = !(\r\n location.pathname === '/ForgotPassword' ||\r\n location.pathname === '/ResetPassword'\r\n ); // Don't display tabs when on the forgot password page\r\n const loginButtonOverride =\r\n location.pathname === '/ForgotPassword' ||\r\n location.pathname === '/ResetPassword'; // Force displaying login rather than logout, even if user has valid token\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n Partner Portal\r\n \r\n {displayTabs && (\r\n \r\n {/* */}\r\n {user && user.showMyEncounters && (\r\n navigate('/MyEncounters')}\r\n />\r\n )}\r\n {user && user.showMyTransactions && (\r\n navigate('/MyTransactionsSummary')}\r\n />\r\n )}\r\n {user && user.showMyAccount && (\r\n navigate('/MyAccount')} />\r\n )}\r\n {/* */}\r\n \r\n )}\r\n \r\n \r\n {isLoggedIn() && !loginButtonOverride ? (\r\n \r\n \r\n {!!user &&\r\n !!user.externalUsersName &&\r\n `Logged in as: ${user.externalUsersName}`}\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 Appbar;\r\n","export default \"data:image/png;base64,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\"","import React from 'react';\r\nimport axios from 'axios';\r\nimport styled from 'styled-components';\r\nimport { Formik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport Snackbar from '@material-ui/core/Snackbar';\r\nimport MuiAlert, { AlertProps } from '@material-ui/lab/Alert';\r\nimport { FormTextField, SubmitButton } from '../../components';\r\nimport { ErrorResponse } from 'types/network';\r\nimport { Paper, Typography } from '@material-ui/core';\r\n\r\nconst Layout = styled.div`\r\n max-width: 2048px;\r\n margin: 0 auto;\r\n padding: 0 30px;\r\n`;\r\n\r\nfunction Alert(props: AlertProps) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nconst URL = `${process.env.REACT_APP_URL}/?route=PartnerUpSertExternalUserPasswordResetRequest`;\r\n\r\nfunction ForgotPassword() {\r\n const [isSuccessful, setIsSuccessful] = React.useState(false);\r\n const [openSnackbar, setOpenSnackBar] = React.useState(false);\r\n const [statusMessage, setStatusMessage] = React.useState('');\r\n const handleCloseSnackBar = (_: unknown, reason?: string) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n setOpenSnackBar(false);\r\n setIsSuccessful(false);\r\n setStatusMessage('');\r\n };\r\n const ForgotPasswordSchema = Yup.object().shape({\r\n email: Yup.string().email().required('Required'),\r\n lastName: Yup.string().required('Required')\r\n });\r\n return (\r\n \r\n \r\n {openSnackbar ? (\r\n \r\n {statusMessage}\r\n \r\n ) : undefined}\r\n \r\n \r\n \r\n Partner Portal
Password Recovery\r\n \r\n
\r\n \r\n Please enter your email and last name. An email will be sent to you to\r\n reset your password.\r\n \r\n {\r\n const { email, lastName } = values;\r\n try {\r\n await axios.post(URL, { email: email, lastName: lastName });\r\n setIsSuccessful(true);\r\n setStatusMessage('Check your inbox for a password reset email.');\r\n setOpenSnackBar(true);\r\n resetForm();\r\n } catch (err) {\r\n setIsSuccessful(false);\r\n setStatusMessage(\r\n (err as ErrorResponse).response?.data?.Error || ''\r\n );\r\n setOpenSnackBar(true);\r\n resetForm();\r\n }\r\n }}\r\n initialValues={{\r\n email: '',\r\n lastName: ''\r\n }}\r\n validationSchema={ForgotPasswordSchema}\r\n render={({ isValidating, isSubmitting }) => {\r\n return (\r\n \r\n );\r\n }}\r\n />\r\n \r\n \r\n );\r\n}\r\n\r\nexport default ForgotPassword;\r\n","import React from 'react';\r\nimport axios from 'axios';\r\nimport styled from 'styled-components';\r\nimport { Navigate, useLocation } from 'react-router-dom';\r\nimport { Formik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport Snackbar from '@material-ui/core/Snackbar';\r\nimport MuiAlert, { AlertProps } from '@material-ui/lab/Alert';\r\nimport { FormTextField, SubmitButton } from '../../components';\r\nimport { ErrorResponse } from 'types/network';\r\nimport { Paper, Typography } from '@material-ui/core';\r\n\r\nconst Layout = styled.div`\r\n max-width: 2048px;\r\n margin: 0 auto;\r\n padding: 0 30px;\r\n`;\r\n\r\nfunction Alert(props: AlertProps) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction useQuery() {\r\n return new URLSearchParams(useLocation().search);\r\n}\r\n\r\nconst URL = `${process.env.REACT_APP_URL}/?route=PartnerUpSertExternalUserPasswordResetRequestFulfillment`;\r\n\r\nfunction ResetPassword() {\r\n const query = useQuery();\r\n const [isSuccessful, setIsSuccessful] = React.useState(false);\r\n const [openSnackbar, setOpenSnackBar] = React.useState(false);\r\n const [statusMessage, setStatusMessage] = React.useState('');\r\n const handleCloseSnackBar = (_: unknown, reason?: string) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n setOpenSnackBar(false);\r\n setIsSuccessful(false);\r\n setStatusMessage('');\r\n };\r\n const MyAccountSchema = Yup.object().shape({\r\n email: Yup.string().email().required('Required'),\r\n newPassword: Yup.string()\r\n .matches(\r\n // eslint-disable-next-line no-useless-escape\r\n /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\\$%\\^&\\*])(?=.{8,})/,\r\n 'Password must contain more than 8 characters including: one uppercase, one lowercase, one number and one special case character.'\r\n )\r\n .required('Required'),\r\n confirmPassword: Yup.string()\r\n .oneOf([Yup.ref('newPassword'), null], 'Passwords must match')\r\n .required('Required')\r\n });\r\n\r\n function _checkIfNeedRedirect() {\r\n const redirectURL = query.get('forwardUrl');\r\n if (!redirectURL) return;\r\n window.location.href = redirectURL;\r\n }\r\n\r\n const token = query.get('token');\r\n if (!token) {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n \r\n {openSnackbar ? (\r\n \r\n {statusMessage}\r\n \r\n ) : undefined}\r\n \r\n \r\n Password Reset\r\n
\r\n \r\n Please enter your email and new password.\r\n \r\n {\r\n const { email, newPassword } = values;\r\n try {\r\n await axios.post(URL, {\r\n email: email,\r\n uniqueIdentifier: token,\r\n password: newPassword\r\n });\r\n setIsSuccessful(true);\r\n setStatusMessage('Password has been updated.');\r\n setOpenSnackBar(true);\r\n resetForm();\r\n _checkIfNeedRedirect();\r\n } catch (err) {\r\n setIsSuccessful(false);\r\n setStatusMessage(\r\n (err as ErrorResponse).response?.data?.Error || ''\r\n );\r\n setOpenSnackBar(true);\r\n resetForm();\r\n }\r\n }}\r\n initialValues={{\r\n email: '',\r\n newPassword: '',\r\n confirmPassword: ''\r\n }}\r\n validationSchema={MyAccountSchema}\r\n render={({ isValidating, isSubmitting }) => {\r\n return (\r\n \r\n );\r\n }}\r\n />\r\n \r\n \r\n );\r\n}\r\n\r\nexport default ResetPassword;\r\n","import React from 'react';\r\nimport { BrowserRouter as Router, Routes, Route } from 'react-router-dom';\r\nimport { QueryClient, QueryClientProvider } from 'react-query';\r\nimport { ReactQueryDevtools } from 'react-query/devtools';\r\n\r\nimport MyAccount from './views/MyAccount';\r\nimport MyEncounters from './views/MyEncounters';\r\nimport MyTransactionsSummary from './views/MyTransactionsSummary';\r\nimport Login from './views/Login';\r\nimport SSOLogin from './views/SSOLogin';\r\nimport { PrivateOutlet } from './components';\r\nimport Appbar from './views/Appbar';\r\nimport ForgotPassword from './views/Recover/ForgotPassword';\r\nimport ResetPassword from './views/Recover/ResetPassword';\r\nimport MyTransactionsSummaryContextProvider from 'views/MyTransactionsSummary/MyTransactionsSummaryContext';\r\n\r\nconst queryClient = new QueryClient();\r\n\r\nconst App: React.FC = () => (\r\n \r\n \r\n \r\n \r\n } />\r\n } />\r\n } />\r\n } />\r\n \r\n \r\n Sorry, you have not yet been granted access. Please contact your\r\n user administrator to have your account set-up.\r\n \r\n \r\n }\r\n />\r\n 404 Not Found} />\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 App;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' }\r\n })\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready\r\n .then(registration => {\r\n registration.unregister();\r\n })\r\n .catch(error => {\r\n console.error(error.message);\r\n });\r\n }\r\n}\r\n","import 'react-app-polyfill/stable';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport App from './App';\r\nimport * as serviceWorker from './serviceWorker';\r\nimport '@fontsource/roboto';\r\nimport './style.css';\r\nimport Axios from 'axios';\r\n\r\nimport { styled } from '@material-ui/core';\r\nimport { ThemeProvider } from '@material-ui/core';\r\nimport { theme } from 'lib/theme';\r\n\r\nAxios.defaults.baseURL = process.env.REACT_APP_URL;\r\nAxios.interceptors.response.use(\r\n function (response) {\r\n return response;\r\n },\r\n function (error) {\r\n if (error?.response?.status === 401) {\r\n document.location.href = '/';\r\n }\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nconst AppContainer = styled('div')({\r\n outline: `4px solid ${process.env.REACT_APP_ENV_COLOR}`,\r\n outlineOffset: '-4px',\r\n height: '100%',\r\n minHeight: '100vh'\r\n});\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""}