{"version":3,"sources":["tag.js","components/NavMenu.js","components/Layout.js","components/Home.js","components/Field.js","components/api.js","constants.js","components/LoaderButton.js","components/usb.js","components/port.js","components/Counter.js","App.js","index.js"],"names":["data","a","load","fetch","response","json","get","Tag","React","useState","tag","setTag","useEffect","title","document","env","then","e","NavMenu","props","toggleNavbar","bind","state","collapsed","this","setState","Navbar","className","light","Container","NavbarBrand","Link","to","NavbarToggler","onClick","Collapse","isOpen","navbar","NavItem","NavLink","Component","displayName","name","Layout","children","Home","query","URLSearchParams","useLocation","search","hist","useHistory","id","push","useFormFields","initialState","fields","setValues","event","control","target","type","getFieldKey","value","key","console","log","url","labCode","validate","locationCode","ok","Error","code","getResult","found","ready","result","error","postFile","file","field","toString","formData","FormData","append","method","body","mode","cache","credentials","headers","JSON","stringify","detail","statusText","redirect","referrerPolicy","location","date","cairnAPI","CairnAPI","appointmentDate","StatusCode","Message","Payers","post","put","getLocation","validateLabCode","retest","getAppointments","getConsent","getPayers","Insurance","otherInsurance","noInsurance","Constants","maxFileSize","usStates","insurers","areyou","races","relToInsured","LoaderButton","isLoading","disabled","Button","sleep","ms","Promise","resolve","setTimeout","claim","device","showBytes","length","len","index","getUint8","listen","transferIn","status","clearHalt","byteLength","string","TextDecoder","decode","buffer","opened","productName","open","configuration","selectConfiguration","claimInterface","command","TextEncoder","encode","transferOut","got","vendorId","filter","filters","productId","navigator","usb","requestDevice","undefined","add","del","gotData","getDevices","forEach","serialNumber","addEventListener","port","readable","reader","getReader","decoder","scanned","read","done","releaseLock","decoded","unwrapped","slice","pair","usbVendorId","serial","requestPort","baudRate","getPorts","getLocal","savedState","sessionStorage","getItem","parse","setLocal","setItem","getLocalPatient","isValidAptDate","x","dateParts","parseISODateParts","year","month","Date","now","isValidDOB","currentYear","test","parts","split","validator","email","digits","replace","isValidPhone","Edit","monthId","dateId","yearId","setDate","onChange","newDate","setValue","htmlFor","required","makeOptions","months","dates","allowPastYears","allowFutureYears","past","future","factor","startYear","years","range","map","i","unshift","yearsPastToFuture","placeholder","Checkbox","SelectImage","text","setText","labelId","files","accept","Select","defaultValue","Prompt","setError","loading","setLoading","setResult","preventDefault","isAlphaNum","message","role","str","charCodeAt","Complete","confirmation","history","confirmationCode","clear","confirmationSent","format","Insured","pat","insRelationship","insFirstName","firstName","insLastName","lastName","insAddress1","address1","insCity","city","insState","insZip","zip","insDOB","DOB","insGender","sex","cardInputs","reqInsuranceCardImage","fileInputs","reqDriversLicenseImage","setFiles","onFile","size","consentPage","consentDate","card","reqInsPolicyNumber","reqInsFirstName","reqInsLastName","reqInsRelationship","reqInsDOB","reqInsGender","reqInsAddress1","reqInsCity","reqInsState","reqInsZip","validateFile","questions","q","parseInt","symptomIds","api","filesToUpload","all","uploadSignature","uploadFile","reqInsName","reqInsOther","insName","reqInsGroupNumber","rel","stateOptions","sexOptions","dataurl","res","mime","blob","File","fileInput","payers","setPayers","list","toPascal","s","toUpperCase","Consent","inputs","consent","setConsent","html","dangerouslySetInnerHTML","__html","Form","formId","next","symptoms","toId","replaceAll","Symptoms","options","signature","saveText","save","isEmpty","reqSymptomSignatureImage","toDataURL","ref","signed","fromDataURL","canvasProps","height","Patient","raceOptions","ethnicityOptions","vaccinated","onSave","SSN","isValidSsn","Symptomatic","useMedicalHistory","onRadio","input","data-toggle","checked","Start","useParams","practice","locations","customerId","selfServe","requireAppointment","validateBarcode","validateSpecimenId","Retest","Appointment","aptDateInput","loadApt","setInputs","apts","Appointments","aptTimeInput","visitDate","Specimen","submit","inputHandler","n","Array","fill","padLeadingZeros","getFullYear","num","listHeader","listItem","manufacturerName","Usb","setDevices","devices","find","d","setScanned","App","exact","path","component","baseUrl","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","render","basename"],"mappings":"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","file":"static/js/main.53e0ea2b.chunk.js","sourcesContent":["let data = null\r\nasync function get() {\r\n// console.log('get', data);\r\n return data || await load();\r\n}\r\nasync function load() {\r\n const response = await fetch('/tag.json');\r\n data = await response.json();\r\n// console.log('loaded', data);\r\n return data;\r\n}\r\n\r\nexport default { get };","import React, { Component } from 'react';\r\nimport { Collapse, Container, Navbar, NavbarBrand, NavbarToggler, NavItem, NavLink } from 'reactstrap';\r\nimport { Link } from 'react-router-dom';\r\nimport './NavMenu.css';\r\nimport env from '../tag';\r\n\r\nfunction Tag() {\r\n const [tag, setTag] = React.useState('');\r\n React.useEffect(() => {\r\n const title = document.title;\r\n document.title = `${tag} ${title}`;\r\n\r\n // async sample \r\n //async function setTitle() {\r\n // document.title = `${(await env.get()).Tag} lab-fast`;\r\n //}\r\n //setTitle();\r\n return () => { document.title = title; };\r\n }, [tag]);\r\n\r\n env.get().then(e => setTag(e.Tag));\r\n return <>{tag}\r\n}\r\nexport class NavMenu extends Component {\r\n static displayName = NavMenu.name;\r\n\r\n constructor (props) {\r\n super(props);\r\n\r\n this.toggleNavbar = this.toggleNavbar.bind(this);\r\n this.state = {\r\n collapsed: true\r\n };\r\n }\r\n\r\n toggleNavbar () {\r\n this.setState({\r\n collapsed: !this.state.collapsed\r\n });\r\n }\r\n\r\n render () {\r\n return (\r\n
\r\n \r\n \r\n lab-fast\r\n \r\n \r\n
    \r\n \r\n Home\r\n \r\n \r\n Registration\r\n \r\n \r\n Results\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { Container } from 'reactstrap';\r\nimport { NavMenu } from './NavMenu';\r\n\r\nexport class Layout extends Component {\r\n static displayName = Layout.name;\r\n\r\n render () {\r\n return (\r\n
\r\n \r\n \r\n {this.props.children}\r\n \r\n
\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport { Link, useLocation, useHistory } from 'react-router-dom';\r\n\r\nexport function Home() {\r\n const query = new URLSearchParams(useLocation().search);\r\n const hist = useHistory();\r\n\r\n if (query) {\r\n const id = query.get('ID');// case-sensitive\r\n if(id)\r\n hist.push(`/register/${id}`);\r\n }\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n

Registration

\r\n
\r\n
\r\n

\r\n
    \r\n
  • Register for test
  • \r\n
  • Enter your information
  • \r\n
  • Get the Confirmation code
  • \r\n
\r\n Register\r\n
\r\n
\r\n
\r\n
\r\n

Results

\r\n
\r\n
\r\n

\r\n
    \r\n
  • Get tested
  • \r\n
  • Enter the Confirmation code
  • \r\n
  • View your result
  • \r\n
\r\n Get Results\r\n
\r\n
\r\n
\r\n
\r\n

Retest

\r\n
\r\n
\r\n

\r\n
    \r\n
  • Enter the Confirmation code
  • \r\n
  • Add Specimen Code
  • \r\n
  • Click Retest below
  • \r\n
\r\n Retest\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n","import { useState } from \"react\";\r\n\r\nexport function useFormFields(initialState) {\r\n const [fields, setValues] = useState(initialState);\r\n\r\n // for radio buttons name is the field\r\n function getFieldKey(event) {\r\n const control = event.target;\r\n if (!control) return '';// hope this never hapens \r\n return (control.type === 'radio') ? control.name : control.id;\r\n }\r\n return [\r\n fields,\r\n function (event) {\r\n // console.log('change to', event.target.value)\r\n setValues({\r\n ...fields,\r\n [getFieldKey(event)]: event.target.value\r\n });\r\n },\r\n function (key, value) {\r\n console.log(key, ' = ', value)\r\n setValues({\r\n ...fields,\r\n [key]: value\r\n });\r\n }\r\n ];\r\n}\r\n","import env from '../tag';\r\nfunction getHeaders() {\r\n\treturn {\r\n\t\t'Content-Type': 'application/json',\r\n\t\t'apikey': 'Bq5UXwkPGxhZWXIXWWYHru0Upe2SiPMY',\r\n\t}\r\n}\r\nconst url = '/api/labq';// todo: add environment config?\r\n//function sleep(ms) {\r\n//\treturn new Promise(resolve => setTimeout(resolve, ms));\r\n//}\r\n\r\nasync function validateLabCode(labCode, validate, locationCode) {\r\n\tconst target = `${url}/lab/${labCode}/${validate||false}/${locationCode||''}`;\r\n\tconsole.log('get', target);\r\n\tconst response = await fetch(target);\r\n\tconsole.log('response:', response);\r\n\tif (!response.ok) throw new Error('Failed to validate barcode/specimen ID');\r\n\tconst json = await response.json();\r\n\tconsole.log('json:', json);\r\n\treturn json;\r\n}\r\nasync function getLocation(code) {\r\n\tconst target = `${url}/${code}`;\r\n\tconsole.log('get', target);\r\n\tconst response = await fetch(target);\r\n\tconsole.log('response:', response);\r\n\tif (!response.ok) throw new Error(`The location code is not valid: ${code}`);\r\n\tconst json = await response.json();\r\n\tconsole.log('json:', json);\r\n\treturn json;\r\n}\r\nexport async function getResult(code) {\r\n\tconsole.log(\"getResult\", code);\r\n\tconst target = `${url}/result/${code}`;\r\n\tconsole.log('get', target);\r\n\r\n//\tawait sleep(1000);\r\n\r\n\tif (code === \"TESTXXX1\")\r\n\t\treturn { found: true, ready: false };\r\n\tif (code === \"TESTXXXN\")\r\n\t\treturn { found: true, ready: true, result: 'Negative' };\r\n\tif (code === \"TESTXXXP\")\r\n\t\treturn { found: true, ready: true, result: 'Positive' };\r\n\tif (code === \"TESTXXXI\")\r\n\t\treturn { found: true, ready: true, result: 'Inconclusive' };\r\n\tif (code === \"TESTXXX4\")\r\n\t\treturn { found: false };\r\n\tif (code === \"TESTXXXE\")\r\n\t\tthrow new Error(\"simulated error message\");\r\n\r\n\ttry {\r\n\t\tconst response = await fetch(target);\r\n\t\tconst result = await response.json();\r\n\t\tconsole.log('result', result);\r\n\t\treturn result;\r\n }\r\n\tcatch (error)\r\n\t{\r\n\t\tconsole.error('getResult Error:', error);\r\n\t\tthrow error;\r\n\t}\r\n}\r\nexport async function postFile(file, field, id) {\r\n//\tconsole.log(\"postFile\", field, file.type, id);\r\n\tconst target = `${url}/${id.toString()}/${field}`;\r\n//\tconsole.log('Upload to', target);\r\n\tconst formData = new FormData();\r\n\tformData.append('file', file);\r\n\tconst result = await fetch(target, {\r\n\t\tmethod: 'POST',\r\n\t\tbody: formData\r\n\t});\r\n\treturn result;\r\n}\r\nasync function post(data = {}) {\r\n\tconsole.log(\"POST\", data);\r\n\tconst response = await fetch(url, {\r\n\t\tmethod: 'POST', // *GET, POST, PUT, DELETE, etc.\r\n\t\tmode: 'cors', // no-cors, *cors, same-origin\r\n\t\tcache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\r\n\t\tcredentials: 'same-origin', // include, *same-origin, omit\r\n\t\theaders: {\r\n\t\t\t'Content-Type': 'application/json'\r\n\t\t\t// 'Content-Type': 'application/x-www-form-urlencoded',\r\n\t\t},\r\n\t\tbody: JSON.stringify(data) // body data type must match \"Content-Type\" header\r\n\t});\r\n//\tconsole.log(response);\r\n\tvar json = await response.json(); \r\n\tif (response.ok) {\r\n\t\treturn json;\r\n\t}\r\n\tconsole.log(json);\r\n//\tthrow new Error(`Failed to register. ${response.statusText}`); // generic statusText BadRequest or Internal Server Error\r\n\tthrow new Error(`Failed to register. ${json.detail || response.statusText || ''}`);\r\n//\tthrow new Error((json.title || '') + ' ' + (json.detail || ''));\r\n}\r\nasync function retest(data = {}) {\r\n\tconsole.log(\"retest POST\", data);\r\n\tconst response = await fetch(`${url}/retest`, {\r\n\t\tmethod: 'POST', // *GET, POST, PUT, DELETE, etc.\r\n\t\tcache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\r\n\t\theaders: {\r\n\t\t\t'Content-Type': 'application/json'\r\n\t\t},\r\n\t\tbody: JSON.stringify(data) // body data type must match \"Content-Type\" header\r\n\t});\r\n\tconsole.log(response);\r\n\tvar json = await response.json(); // parses JSON response into native JavaScript objects\r\n\tif (response.ok) {\r\n\t\treturn json;\r\n\t}\r\n\tconsole.log(json);\r\n\tthrow new Error((json.title || '') + ' ' + (json.detail || ''));\r\n\t//\treturn null;\r\n}\r\n\r\n async function put(url = '', data = {}) {\r\n\tconsole.log(data);\r\n\t// Default options are marked with *\r\n\tconst response = await fetch(url, {\r\n\t method: 'PUT', // *GET, POST, PUT, DELETE, etc.\r\n\t mode: 'cors', // no-cors, *cors, same-origin\r\n\t cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\r\n\t credentials: 'same-origin', // include, *same-origin, omit\r\n\t headers: {\r\n\t\t'Content-Type': 'application/json'\r\n\t\t// 'Content-Type': 'application/x-www-form-urlencoded',\r\n\t },\r\n\t redirect: 'follow', // manual, *follow, error\r\n\t referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url\r\n\t body: JSON.stringify(data) // body data type must match \"Content-Type\" header\r\n\t});\r\n\tconsole.log(response);\r\n\treturn response.json(); // parses JSON response into native JavaScript objects\r\n}\r\n\r\nasync function getAppointments(location, date) {\r\n\tconst cairnAPI = (await env.get()).CairnAPI;\r\n//\tconsole.log('cairnAPI :', cairnAPI);\r\n\tconst target = `${cairnAPI}/api/Lab/getAppointments`;\r\n\t//\tconst target = `${url}/appointments`;\r\n//\tconsole.log('getAppointments:', target, location, date);\r\n\tconst response = await fetch(target, {\r\n\t\theaders: getHeaders(),\r\n\t\tmethod: 'POST',\r\n\t\tbody: JSON.stringify({ location: location, appointmentDate: date })\r\n\t});\r\n//\tconsole.log('response:', response);\r\n\tif (!response.ok) {// this API returns status 200 and uses StatusCode to indicate errors\r\n\t\tthrow new Error(`Failed to get appointments for the location: ${location}.`);\r\n\t}\r\n\tconst json = await response.json();\r\n//\tconsole.log('json:', json);\r\n\tif (json.StatusCode > 299) {// this API returns status 200 and uses StatusCode to indicate errors\r\n\t\tthrow new Error(`Please, check the location and date you entered. ${json.Message}`);\r\n\t}\r\n\treturn json;\r\n}\r\n\r\nasync function getConsent(location) {\r\n\tconst target = `${(await env.get()).CairnAPI}/api/Lab/GetLocationConsent/${location}`;\r\n\tconsole.log('getConsent:', target);\r\n\tconst response = await fetch(target, {\r\n\t\theaders: getHeaders(),\r\n\t});\r\n\tconsole.log('response:', response);\r\n\tif (!response.ok) {// this API returns status 200 and uses StatusCode to indicate errors\r\n\t\tthrow new Error(`Failed to get appointments for the location: ${location}.`);\r\n\t}\r\n\tconst json = await response.json();\r\n\tconsole.log('json:', json);\r\n\tif (json.StatusCode > 299) {// this API returns status 200 and uses StatusCode to indicate errors\r\n\t\tthrow new Error(`Please, check the location you entered.`);\r\n\t}\r\n\treturn json;\r\n}\r\n\r\nasync function getPayers(location) {\r\n\tif (!location) {\r\n\t\tconsole.log('getPayers', 'the location is required');\r\n\t\treturn [];\r\n\t}\r\n\tconst target = `${(await env.get()).CairnAPI}/api/Lab/getPayers/${location}`;\r\n\tconsole.log(target);\r\n\tconst response = await fetch(target, {\r\n\t\theaders: getHeaders(),\r\n\t});\r\n\tconsole.log('response:', response);\r\n\tif (!response.ok) {// this API returns status 200 and uses StatusCode to indicate errors\r\n\t\tthrow new Error(`Failed to get Payers for: ${location}.`);\r\n\t}\r\n\tconst json = await response.json();\r\n\tconsole.log('json:', json);\r\n\tif (json.StatusCode > 299) {// this API returns status 200 and uses StatusCode to indicate errors\r\n\t\tconsole.log(json.Message);\r\n\t\tthrow new Error(`Please, check the location you entered: ${location}`);\r\n\t}\r\n\treturn json.Payers;\r\n}\r\n\r\nexport default { post, put, getLocation, validateLabCode, retest, getAppointments, getConsent, getPayers};\r\n","const Insurance = {\r\n otherInsurance: 'OTHER INSURANCE',\r\n noInsurance: 'NO HEALTH INSURANCE',\r\n}\r\nconst Constants = \r\n{\r\n ...Insurance,\r\n\tmaxFileSize: 6000000,\r\n\tusStates: ['AL', 'AK', 'AS', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE',\r\n\t\t'DC', 'FM', 'FL', 'GA', 'GU', 'HI', 'ID', 'IL', 'IN', 'IA',\r\n\t\t'KS', 'KY', 'LA', 'ME', 'MH', 'MD', 'MA', 'MI', 'MN', 'MS',\r\n\t\t'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND',\r\n\t\t'MP', 'OH', 'OK', 'OR', 'PW', 'PA', 'PR', 'RI', 'SC', 'SD',\r\n\t\t'TN', 'TX', 'UT', 'VT', 'VI', 'VA', 'WA', 'WV', 'WI', 'WY'],\r\n insurers: ['AETNA', 'AMBETTER', 'ANTHEM / BCBS', 'BCBS FEDERAL', 'CIGNA',\r\n 'CORE ADMIN SERV', 'GEHA', 'GOLDEN RULE', 'GREAT WEST',\r\n 'HUMANA', 'MEDICARE', 'MERITAIN HEALTH', 'RAILROAD MEDICARE', 'SECURE HEALTH',\r\n 'TRICARE', 'UNITED HEALTHCARE', 'WELLCARE', 'MEDICAID', 'SELF PAY',\r\n Insurance.otherInsurance, Insurance.noInsurance\r\n ],\r\n areyou: ['Student/Faculty', 'Public'],\r\n races: [\r\n { id: 'U', name: 'Unknown' },\r\n {id: 'B', name: 'African American'},\r\n {id: 'A', name: 'Asian'},\r\n {id: 'C', name: 'Caucasian'},\r\n {id: 'H', name: 'Hispanic'},\r\n {id: 'I', name: 'Native American'},\r\n ],\r\n\r\n relToInsured: [\r\n { code: 'I', name: 'Self' },\r\n { code: 'S', name: 'Spouse' },\r\n { code: 'C', name: 'Child' },\r\n { code: 'D', name: 'Daughter' },\r\n { code: 'F', name: 'Father' },\r\n { code: 'R', name: 'Friend' },\r\n { code: 'G', name: 'Grandparent' },\r\n { code: 'M', name: 'Mother' },\r\n { code: 'B', name: 'Sibling' },\r\n { code: 'N', name: 'Son' },\r\n { code: 'O', name: 'Other' },\r\n ],\r\n}\r\n\r\nexport default Constants;","import React from \"react\";\r\nimport Button from \"react-bootstrap/Button\";\r\nimport { BsArrowRepeat } from \"react-icons/bs\";\r\nimport \"./LoaderButton.css\";\r\n\r\nexport default function LoaderButton({\r\n isLoading,\r\n className = \"\",\r\n disabled = false,\r\n ...props\r\n}) {\r\n return (\r\n \r\n {isLoading && }\r\n {props.children}\r\n \r\n );\r\n}","function sleep(ms) {\r\n\treturn new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\nasync function claim(device) {\r\n try {\r\n console.log('using device...');\r\n if (device.opened) {\r\n console.log('device', device.productName, 'is already open');\r\n return;\r\n }\r\n console.log('open device...');\r\n await device.open();\r\n console.log('device is open...', device);\r\n if (device.configuration === null) {\r\n console.log('selectConfiguration...');\r\n await device.selectConfiguration(1);\r\n }\r\n else {\r\n// console.log('device.configuration', device.configuration);\r\n }\r\n console.log('claimInterface...');\r\n await device.claimInterface(0);\r\n// const result = await device.controlTransferOut({\r\n// requestType: 'vendor', recipient: 'device',\r\n// request: 0xE1,// init camera\r\n// value: 0x00, index: 0x00\r\n// }, (new TextEncoder()).encode('\\x01\\x04'));\r\n//// (new TextEncoder()).encode(String.fromCharCode(1) + '' + String.fromCharCode(4)))\r\n// console.log('transferOut: get serial...');\r\n// const command = (new TextEncoder()).encode('\\x01\\x04');\r\n const command = (new TextEncoder()).encode('\\x01\\x04');\r\n// console.log(command);\r\n console.log((new TextDecoder()).decode(command));\r\n //showBytes(command);\r\n console.log('transferOut... ep2');\r\n const result = await device.transferOut(2, command);\r\n console.log('transferOut result', result);\r\n\r\n function showBytes(data, length) {\r\n if (!data) {\r\n console.log('empty');\r\n return;\r\n } \r\n const len = length || data.length;\r\n console.log(\"length\", len);\r\n let index = 0;\r\n while (index < len)\r\n console.log(\"byte\", index,\r\n data.getUint8(index++));\r\n }\r\n\r\n async function listen() {\r\n console.log('device.transferIn(1...');\r\n let result = await device.transferIn(1, 64);\r\n if (result.status === 'stall') {\r\n console.log(\"clearHalt due to transfer status\", result.status);\r\n device.clearHalt(1);\r\n }\r\n if (result.status === 'ok') {\r\n const length = result.data.byteLength;\r\n if (length === 2) {\r\n// console.log(i, \"raw data\", result.data.getUint8(0));\r\n// console.log(i, \"raw data\", result.data.getUint8(1));\r\n //// report waiting for scan to have page prompt user to scan\r\n }\r\n showBytes(result.data, length)\r\n var string = new TextDecoder().decode(result.data.buffer);\r\n console.log(\"utf-8 decoded data\", string);\r\n await sleep(1000);\r\n // listen();\r\n }\r\n }\r\n// console.log(\"finished reading\");\r\n listen();\r\n }\r\n catch (e) {\r\n console.log(e)\r\n }\r\n}\r\nlet usb = {\r\n pair: async function (got) {\r\n let device;\r\n try {\r\n console.log('get acces to the Reader Device...');\r\n const dlScanner = {\r\n vendorId: 0x0403,// FTD\r\n productId: 0x6001, //PID\r\n };\r\n const eSeek = {\r\n vendorId: 0x28A6\r\n };\r\n const filter = { filters: [dlScanner] };\r\n device = await navigator.usb.requestDevice(filter);\r\n } catch (err) {\r\n console.log('getDevices error', err);\r\n // No device was selected.\r\n }\r\n\r\n if (device !== undefined) {\r\n // Add |device| to the UI.\r\n console.log(device);\r\n got(device);\r\n// claim(device);\r\n }\r\n },\r\n //https://wicg.github.io/webusb/#enumeration\r\n getDevices: async function (got, add, del, gotData) {\r\n console.log('getDevices...');\r\n let devices = await navigator.usb.getDevices();\r\n devices.forEach(async device => {\r\n console.log('found usb device', device.serialNumber, device.productName);\r\n console.log(device);\r\n got(device);\r\n await claim(device);\r\n });\r\n\r\n console.log('addEventListener connect...');\r\n navigator.usb.addEventListener('connect', event => {\r\n const device = event.device\r\n console.log(device.serialNumber, 'is connected');\r\n add(device);\r\n });\r\n console.log('addEventListener disconnect...');\r\n navigator.usb.addEventListener('disconnect', event => {\r\n const device = event.device\r\n console.log(device.serialNumber, 'was disconnected');\r\n del(device);\r\n });\r\n }\r\n}\r\n\r\nexport default usb;","function sleep(ms) {\r\n\treturn new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nasync function listen(port, gotData) {\r\n console.log('listening on port...');\r\n while (port.readable) {\r\n const reader = port.readable.getReader();\r\n const decoder = new TextDecoder();\r\n\r\n let scanned = '';\r\n try {\r\n while (true) {\r\n const { value, done } = await reader.read();\r\n if (done) {\r\n // Allow the serial port to be closed later.\r\n reader.releaseLock();\r\n console.log(scanned);\r\n if (gotData) gotData(scanned);\r\n else console.log('no gotData passed to listen. Ignoring the scanned value.');\r\n break;\r\n }\r\n if (value) {\r\n// console.log('value', value);\r\n const decoded = decoder.decode(value)\r\n// console.log('decoded', decoded);\r\n scanned += decoded;\r\n \r\n const len = scanned.length;\r\n if (len > 4 && scanned[len - 2] === '\\x03' && scanned[len - 1] === '\\x04') {\r\n console.log('scanned', scanned);\r\n const unwrapped = scanned.slice(2, len - 3);\r\n if (gotData) gotData(unwrapped);\r\n else console.log('no gotData was passed to listen. Ignoring the scanned value.');\r\n console.log('unwrapped', unwrapped);\r\n reader.releaseLock();\r\n break;\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n console.log(error, 'scanned so far', scanned);\r\n }\r\n }\r\n}\r\nconst port = {\r\n pair: async function (got, gotData) {\r\n let device;\r\n try {\r\n console.log('get acces to the Reader Device...');\r\n const dlScanner = {\r\n usbVendorId: 0x0403,// FTD\r\n };\r\n const filter = { filters: [dlScanner] };\r\n device = await navigator.serial.requestPort(filter);\r\n if (device) {\r\n var opened = await device.open({ baudRate: 9600 });\r\n console.log('opened', opened);\r\n got(device);\r\n listen(device, gotData);\r\n// device.onconnect = got;\r\n // device.ondisconnect = got;\r\n\r\n\r\n }\r\n } catch (err) {\r\n console.log('getDevices error', err);\r\n // No device was selected.\r\n }\r\n\r\n if (device !== undefined) {\r\n // Add |device| to the UI.\r\n console.log(device);\r\n// claim(device);\r\n }\r\n },\r\n getPorts: async function (got, add, del, gotData) {\r\n console.log('getPorts...');\r\n let ports = await navigator.serial.getPorts();\r\n ports.forEach(async device => {\r\n console.log(device);\r\n// console.log('found usb device', device.serialNumber, device.productName);\r\n got(device);\r\n listen(device);\r\n// await claim(device);\r\n });\r\n\r\n console.log('addEventListener connect...');\r\n navigator.serial.addEventListener('connect', event => {\r\n const device = event.target;\r\n console.log(device, 'is connected');\r\n add(device);\r\n listen(device);\r\n });\r\n console.log('addEventListener disconnect...');\r\n navigator.serial.addEventListener('disconnect', event => {\r\n const device = event.target;\r\n console.log(device, 'was disconnected');\r\n del(device);\r\n });\r\n }\r\n}\r\n\r\nexport default port;\r\n\r\n","import React, { useState } from 'react';\r\nimport { useHistory, useParams } from \"react-router-dom\";\r\nimport Barcode from \"react-barcode\";\r\nimport SignatureCanvas from 'react-signature-canvas'\r\n\r\nimport { useFormFields } from './Field';\r\nimport api, { postFile, getResult } from './api';\r\nimport Constants from '../constants';\r\nimport LoaderButton from './LoaderButton';\r\nimport usb from './usb';\r\nimport serial from './port';\r\n\r\nfunction getLocal(type) {\r\n const savedState = sessionStorage.getItem(type);\r\n let state = {};\r\n try {\r\n if (savedState)\r\n state = JSON.parse(savedState) || {};\r\n }\r\n catch{\r\n console.log('failed to parse JSON', type)\r\n }\r\n return state;\r\n}\r\nfunction setLocal(type, state) {\r\n const savedState = getLocal(type);\r\n return sessionStorage.setItem(type, JSON.stringify({ ...savedState, ...state }));\r\n}\r\nfunction getLocalPatient() {\r\n return getLocal(\"Patient\");\r\n}\r\nfunction getLocalInsured() {\r\n return getLocal(\"Insured\");\r\n}\r\n\r\n// validators\r\nfunction isValidEmail(email) {\r\n var re = /\\S+@\\S+\\.\\S+/;\r\n return re.test(email);\r\n}\r\n\r\nfunction isValidAptDate(x) {\r\n const dateParts = parseISODateParts(x);\r\n if (!dateParts) return false;\r\n const [year, month, date] = dateParts;\r\n console.log(year, month, date);\r\n return new Date(year, month, date) > Date.now();\r\n}\r\n\r\nfunction isValidDOB(x) {\r\n const dateParts = parseISODateParts(x);\r\n if (!dateParts) return false;\r\n const [year, month, date] = dateParts;\r\n return year > currentYear - 120 && new Date(year, month, date) < Date.now();\r\n}\r\n\r\nfunction parseISODateParts(x) {\r\n console.log('parseISODate', x);\r\n var re = /^\\d{4}-\\d{2}-\\d{2}$/;\r\n if (!re.test(x)) {\r\n console.log(`it must be YYYY-MM-DD`);\r\n return false;\r\n }\r\n const parts = x.split('-');\r\n console.log(parts);\r\n var year = +parts[0];\r\n const month = +parts[1];\r\n var date = +parts[2];\r\n if (month === 2 && date > 29) {\r\n console.log(`there's max of 29 days in February`);\r\n return false;\r\n }\r\n if (month === 2 && date > 28 && year % 4) {\r\n console.log(`there's only 28 days in February on a non-leap year`);\r\n return false;\r\n }\r\n if (month === 4 || month === 6 || month === 9 || month === 11) {\r\n if (date > 30) {\r\n console.log(`there's only 30 days in this month`);\r\n return false;\r\n }\r\n }\r\n return [year, month, date];\r\n}\r\n\r\nfunction isValidSsn(x) {\r\n var digits = x.replace(/-/g, '');\r\n console.log('SSN', digits);\r\n return /^\\d{9,10}$/.test(digits);\r\n}\r\n\r\nfunction isValidPhone(x) {\r\n var digits = x.replace(/[-+() .]/g, '');\r\n console.log('phone', digits);\r\n return /^\\d{10}$/.test(digits);\r\n}\r\n\r\nfunction validate(data, field, name, type, validator) {\r\n console.log('validate:', field, name, type, validator?'with validator':'required');\r\n\r\n if (validator && !validator(data[field]))\r\n throw new Error(`Please enter a valid ${name || field}`);\r\n\r\n if (!data[field])\r\n throw new Error(`Please enter ${name || field}`);\r\n\r\n if (type === 'email') {\r\n if (!isValidEmail(data[field]))\r\n throw new Error(`Please enter a valid ${name || field}`);\r\n }\r\n if (type === 'phone') {\r\n if (!isValidPhone(data[field]))\r\n throw new Error(`Please enter a valid ${name || field}`);\r\n }\r\n}\r\n\r\nexport function Edit(props) {\r\n const type = props.type || \"text\";\r\n // date support\r\n const monthId = props.id + 'month';\r\n const dateId = props.id + 'date';\r\n const yearId = props.id + 'year';\r\n\r\n const dateString = props.fields[props.id] || '';\r\n const dateParts = dateString.split('-');\r\n const [date, setDate] = useState({\r\n [yearId]: dateParts[0],\r\n [monthId]: dateParts[1],\r\n [dateId]: dateParts[2],\r\n });\r\n\r\n //useEffect(() => {\r\n // // console.log('useEffect', type);\r\n // if (type === 'date') {\r\n // console.log('useEffect', type);\r\n // // console.log(date);\r\n // }\r\n // props.setValue({ target: { id: props.id, value: `${date[yearId]}-${date[monthId]}-${date[dateId]}` } });\r\n //}, [date, type, monthId, dateId, yearId, props]);\r\n\r\n function onChange(e) {\r\n console.log(e.target.id, e.target.value);\r\n const newDate = { ...date, [e.target.id]: e.target.value };\r\n// console.log(newDate);\r\n setDate(newDate);\r\n props.setValue({ target: { id: props.id, value: `${newDate[yearId]}-${newDate[monthId]}-${newDate[dateId]}` } });\r\n }\r\n// const minmax = type === 'date' ? { min: '1900-01-01', max: new Date().toISOString().split('T')[0] } : null;\r\n return (\r\n
\r\n \r\n
\r\n { type === \"email\" &&
\r\n @\r\n
\r\n }\r\n {type === \"date\" && <>\r\n \r\n \r\n \r\n }\r\n {type !== \"date\" && \r\n }\r\n
\r\n
\r\n );\r\n}\r\nexport function Checkbox(props) {\r\n return <>\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n}\r\nexport function SelectImage(props) {\r\n function onChange(event) {\r\n const files = event.target.files;\r\n if (!files || !files.length) return;\r\n console.log(\"got\", files.length, \"files\");\r\n const file = files[0];\r\n// if (!file) setError('No file selected');\r\n setText(`${props.name}: ${file.name}`);\r\n props.onChange(props.id, file);\r\n }\r\n const [text, setText] = useState(`Select ${props.name}`);\r\n const labelId = `${props.id}Label`\r\n return (
\r\n \r\n \r\n
);\r\n}\r\nexport function Select(props) {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport function Prompt(props) {\r\n const [fields, setValue] = useFormFields({});\r\n const [error, setError] = useState(\"\");\r\n const [loading, setLoading] = useState(false);\r\n const [result, setResult] = useState(null);\r\n\r\n async function onSave(event) {\r\n event.preventDefault();\r\n const code = fields[\"confirmationCode\"];\r\n if (!code) {\r\n setError(\"Confirmation Code is required.\");\r\n return;\r\n }\r\n\r\n if (code.length !== 8 || !isAlphaNum(code)) {\r\n setError(\"Confirmation Code is 8 letters or numbers\");\r\n return;\r\n }\r\n\r\n try {\r\n setLoading(true);\r\n setResult(null);\r\n setError('');\r\n const response = await getResult(code);\r\n console.log(\"setResult\", response);\r\n setResult(response);\r\n }\r\n catch (e) {\r\n// console.log(e);\r\n setError(e.message);\r\n }\r\n finally {\r\n setLoading(false);\r\n }\r\n }\r\n return (\r\n
\r\n

Please, enter your confirmation code

\r\n \r\n View Test Results\r\n {error &&
\r\n {error}\r\n
}\r\n {result && !result.found &&
\r\n Your confirmation code is not valid.\r\n
\r\n Please enter a valid confirmation code.\r\n
}\r\n {result && result.found && !result.ready &&
\r\n Your confirmation code is valid, but your COVID-19 test result is not ready yet. \r\n
\r\n Please try again later.\r\n
}\r\n {result && result.found && result.ready &&
\r\n Your COVID-19 test\r\n result is {result.result}.\r\n
}\r\n {result && result.date &&
\r\n {result.ready ? \"Tested\" : \"Registered\"} on {result.date}.\r\n
}\r\n
\r\n );\r\n}\r\n\r\nfunction isAlphaNum(str) {\r\n var code, i, len;\r\n\r\n for (i = 0, len = str.length; i < len; i++) {\r\n code = str.charCodeAt(i);\r\n if (!(code > 47 && code < 58) && // numeric (0-9)\r\n !(code > 64 && code < 91) && // upper alpha (A-Z)\r\n !(code > 96 && code < 123)) { // lower alpha (a-z)\r\n return false;\r\n }\r\n }\r\n return true;\r\n};\r\n\r\nexport function Complete(props) {\r\n const confirmation = getLocal('confirmation');\r\n\r\n const history = useHistory();\r\n if (!confirmation.confirmationCode)\r\n history.push('/');\r\n\r\n const location = getLocal('locationOptions');\r\n if (location.code !== 'MINI') {\r\n sessionStorage.clear();\r\n setLocal('confirmation', confirmation);\r\n }\r\n\r\n const { labCode, confirmationCode, confirmationSent } = confirmation;\r\n\r\n return (\r\n
\r\n

Complete

\r\n

Your confirmation code is: {confirmationCode}

\r\n \r\n {labCode && <>\r\n

Your specimen ID / barcode is: {labCode}

\r\n \r\n }\r\n {confirmationSent &&\r\n

We have emailed it to you.

\r\n }\r\n
\r\n );\r\n}\r\n\r\nexport function Insured() {\r\n const history = useHistory();\r\n const location = getLocal('locationOptions');\r\n if (!location.code) history.push('/register');\r\n\r\n let state = getLocalInsured();\r\n if (!state[\"insRelationship\"] && !state[\"insAddress1\"] \r\n\t&& !state[\"insCity\"] && !state[\"insState\"] && !state[\"insZip\"] && !state[\"insDOB\"]) {\r\n const pat = getLocalPatient();\r\n state = {\r\n ...state, insRelationship: \"I\", insFirstName: pat.firstName, insLastName: pat.lastName,\r\n insAddress1: pat.address1, //insAddress2: pat.address2,\r\n insCity: pat.city, insState: pat.state, insZip: pat.zip, \r\n insDOB: pat.DOB, insGender: pat.sex\r\n };\r\n }\r\n const [fields, setValue] = useFormFields(state);\r\n const [error, setError] = useState('');\r\n const [loading, setLoading] = useState(false);\r\n\r\n var cardInputs = [\r\n { id: \"insuranceFront\", name: \"Insurance Card Front\", required: location.reqInsuranceCardImage },\r\n { id: \"insuranceBack\", name: \"Insurance Card Back\", required: location.reqInsuranceCardImage },\r\n ];\r\n var fileInputs = [...cardInputs,\r\n { id: \"license\", name: \"Driver's License / Other ID\", required: location.reqDriversLicenseImage },\r\n ];\r\n const [files, setFiles] = useState({});\r\n\r\n function onFile(id, file) {\r\n setError('');\r\n\r\n console.log(\"got\", id);\r\n if (file.size > Constants.maxFileSize)\r\n setError(`Please pick a file smaller than ${Constants.maxFileSize / 1000000} MB`);\r\n setFiles({ ...files, [id]: file });\r\n }\r\n async function onSave(e) {\r\n e.preventDefault();\r\n setError('');\r\n sessionStorage.setItem(\"Insured\", JSON.stringify(fields));\r\n\r\n // merge into one object\r\n const data = {\r\n ...getLocal('location'), ...getLocal('appointment'), ...getLocal('specimen'),\r\n ...getLocalPatient(), ...getLocal('symptoms'), ...fields,\r\n location: location.code, // last validated location code \r\n };\r\n if (location.consentPage) {\r\n data.consentDate = new Date();\r\n }\r\n try {\r\n setLocal('confirmation', {});\r\n\r\n // validate form data\r\n let card = files[\"insuranceFront\"] && files[\"insuranceBack\"]\r\n // require either entered fields or ins card image\r\n if (!card) {\r\n validate(data, 'insName', 'Insurance');\r\n }\r\n if (!card && fields['insName'] === Constants.otherInsurance) {\r\n validate(data, 'insOther', 'Insurance Carrier Name');\r\n }\r\n // if the patient has insurance...\r\n if (fields['insName'] !== Constants.noInsurance) {\r\n if (!card) {\r\n if (location.reqInsPolicyNumber) validate(data, 'insPolicyNumber', 'Policy Number');\r\n }\r\n if (location.reqInsFirstName) validate(data, 'insFirstName', 'Insured First Name');\r\n if (location.reqInsLastName) validate(data, 'insLastName', 'Insured Last Name');\r\n if (location.reqInsRelationship) validate(data, 'insRelationship', 'Patient Relationship to Insured');\r\n if (location.reqInsDOB) validate(data, 'insDOB', \"Insured Date of Birth\", 'date', isValidDOB);\r\n if (location.reqInsGender) validate(data, 'insGender', \"Insured Gender\");\r\n if (location.reqInsAddress1) validate(data, 'insAddress1', \"Insured Address\");\r\n if (location.reqInsCity) validate(data, 'insCity', \"Insured City\");\r\n if (location.reqInsState) validate(data, 'insState', \"Insured State\");\r\n if (location.reqInsZip) validate(data, 'insZip', \"Insured Zip\");\r\n }\r\n\r\n fileInputs.forEach(i => validateFile(i));\r\n\r\n setLoading(true);\r\n // convert questions to int\r\n questions.filter(q => data[q.id]).forEach(q => { data[q.id] = parseInt(data[q.id]); })\r\n symptomIds.filter(x => location[`req${x}`] !== null).forEach(x => { data[x] = data[x] === 'x' ? 3 : 2;})\r\n\r\n if (data['vaccinated']) data['vaccinated'] = parseInt(data['vaccinated']);\r\n if (data['SymptomDays']) data['SymptomDays'] = parseInt(data['SymptomDays']);\r\n\r\n // post data to the server\r\n const confirmation = await api.post(data);\r\n if (!confirmation)\r\n return;\r\n\r\n // console.log(fileInputs);\r\n const filesToUpload = fileInputs.filter(i => files[i.id]);\r\n\r\n// console.log(filesToUpload.length, 'file(s) and a signature to upload...')\r\n await Promise.all([uploadSignature(confirmation.id),\r\n ...filesToUpload.map(async i => uploadFile(i, confirmation.id))]);\r\n console.log('uploaded.');\r\n\r\n confirmation.labCode = data.labCode;\r\n setLocal('confirmation', confirmation);\r\n history.push('complete');\r\n }\r\n catch (e) {\r\n// console.log(e);\r\n setLoading(false);\r\n setError(e.message);\r\n }\r\n }\r\n\r\n return (\r\n
\r\n

Insurance

\r\n

Upload front/back images of insurance card or select insurance name and enter policy number.\r\n

\r\n\r\n {location.reqInsuranceCardImage !== null &&
\r\n \r\n \r\n
}\r\n
\r\n
\r\n {location.reqInsName !== null &&\r\n \r\n }\r\n {location.reqInsOther !== null && fields.insName === Constants.otherInsurance && \r\n }\r\n {location.reqInsPolicyNumber !== null && }\r\n\r\n {location.reqInsGroupNumber !== null && }\r\n {location.reqInsRelationship !== null && }\r\n\r\n {fields.insRelationship !== 'I' &&
\r\n Please update Insured information to reflect the Policy holder/Subscriber.\r\n
}\r\n\r\n {location.reqInsFirstName !== null && }\r\n {location.reqInsLastName !== null && }\r\n\r\n {location.reqInsAddress1 !== null && }\r\n\r\n {location.reqInsCity !== null && }\r\n {location.reqInsState !== null && }\r\n\r\n {location.reqInsZip !== null && }\r\n\r\n {location.reqInsDOB !== null && }\r\n {location.reqInsGender !== null && }\r\n
\r\n {location.reqDriversLicenseImage !== null &&
\r\n \r\n
}\r\n
\r\n {error &&
\r\n {error}\r\n
}\r\n Continue\r\n
\r\n
\r\n
\r\n );\r\n async function uploadSignature(id) {\r\n const dataurl = sessionStorage.getItem('symptomSignature');\r\n if (!dataurl) {\r\n console.log('no signature');\r\n return;\r\n }\r\n try {\r\n const res = await fetch(dataurl);\r\n const mime = res.headers.get(\"Content-Type\");\r\n //console.log(mime);\r\n const blob = await res.blob();\r\n //console.log('create file from a blob...');\r\n const file = new File([blob], 'name', { type: mime });\r\n // using arrayBuffer() works too\r\n //const buffer = await res.arrayBuffer();\r\n //console.log('create file from a bytes...');\r\n //const file = new File([buffer], 'required-for-post', { type: mime });\r\n const response = await postFile(file, 'symptomSignature', id);\r\n console.log('sig is done.', response);\r\n return response;\r\n }\r\n catch (error) {\r\n console.error('failed to read or upload the signature');\r\n }\r\n }\r\n async function uploadFile(fileInput, id) {\r\n console.log('check file', fileInput.id);\r\n const file = files[fileInput.id];\r\n if (!file) {\r\n console.log('no file for', fileInput.id);\r\n return;\r\n }\r\n console.log('upload file', fileInput.id);\r\n await postFile(file, fileInput.id, id);\r\n }\r\n function validateFile(fileInput) {\r\n// console.log('validateFile', fileInput.id);\r\n\r\n const file = files[fileInput.id];\r\n if (!file) {\r\n if (fileInput.required)\r\n throw new Error(`Please select a file for ${fileInput.name}.`);\r\n // file is optional\r\n return;\r\n }\r\n if (file.size > Constants.maxFileSize)\r\n throw new Error(`Please select a smaller file for ${fileInput.name}.`);\r\n }\r\n}\r\nfunction Payers({ id, name, required, fields, setValue, locationCode }) {\r\n const [payers, setPayers] = useState(Constants.insurers);\r\n React.useEffect(() => {\r\n console.log('first effect: get payers for location', locationCode);\r\n api.getPayers(locationCode).then(list => {\r\n //console.log(list);\r\n if (!list || !list.length) return;\r\n setPayers(list);\r\n //move to a separate effect to avoid dependency on id and fields here\r\n //if (list.length === 1) fields[id] = list[0];\r\n });\r\n }, [locationCode]);\r\n React.useEffect(() => {\r\n console.log('second effect');\r\n if (payers.length === 1) {\r\n console.log(`set ${id} to ${payers[0]}`);\r\n fields[id] = payers[0];\r\n }\r\n }, [payers, id, fields]);\r\n return <>\r\n \r\n \r\n}\r\n\r\nfunction toPascal(s) {\r\n if (!s) return '';\r\n let pascal = s[0].toUpperCase() + s.slice(1);\r\n// console.log('pascal', s, pascal);\r\n return pascal;\r\n}\r\nfunction Consent({ locationCode }) {\r\n const inputs = [\r\n {\r\n id: \"accept\", type: 'checkbox',\r\n name: \"By checking this box, I agree to the terms and conditions listed above.\",\r\n validator: function (x) { if (x === 'x') return true; throw new Error('Please, review and accept the terms and conditions') },\r\n },\r\n ];\r\n\r\n const [consent, setConsent] = useState('Please carefully read the following information... Loading information...');\r\n React.useEffect(() => {\r\n api.getConsent(locationCode).then(html => setConsent(html));\r\n }, [locationCode]);\r\n return <>\r\n
\r\n
\r\n \r\n}\r\nconst symptoms = ['Fever', 'Cough', 'Runny Nose', 'Eye Redness', 'Body Aches', 'Fatigue', 'Headache', 'Vomiting', 'Nausea', 'Diarrhea', 'Sore Throat'];\r\nfunction toId(name) {\r\n return name.replaceAll(' ', '');\r\n}\r\nconst symptomIds = [...symptoms.map(x => toId(x)), \"TasteSmell\"];\r\n\r\nexport function Symptoms() {\r\n const location = getLocal('locationOptions');\r\n const history = useHistory();\r\n if (!location.code) history.push('/register');\r\n const inputs = [\r\n ...symptoms.map(x => ({\r\n id: toId(x), type: 'checkbox', name: x,\r\n })),\r\n {\r\n id: \"TasteSmell\", type: 'checkbox', name: \"Loss of Taste or Smell\",\r\n },\r\n {\r\n id: \"SymptomDays\", name: \"How many days have you experienced symptoms?\",\r\n options: makeOptions(range(31))\r\n },\r\n {\r\n id: \"MedicalHistory\", name: \"Past Chronic Medical Problems (ex. Hypertension, COPD, Diabetes)\",\r\n },\r\n ].filter(x => location[`req${x}`] !== null);\r\n let signature = null;\r\n function saveSignature() {\r\n if (!signature) return;\r\n if (signature.isEmpty()) {\r\n if (location.reqSymptomSignatureImage) throw new Error('Please, sign in the box to continue');\r\n }\r\n else {\r\n sessionStorage.setItem('symptomSignature', signature.toDataURL());\r\n }\r\n }\r\n return <>\r\n
\r\n {location.reqSymptomSignatureImage !== null &&
\r\n Please, sign in the box below using your finger or mouse
\r\n {\r\n signature = ref; if (!signature) return;\r\n console.log('signature')\r\n const signed = sessionStorage.getItem('signature');\r\n if (signed && signature.isEmpty()) signature.fromDataURL(signed);\r\n }} \r\n canvasProps={{ height: 200, className: 'sigCanvas w-100 border border-primary' }} />\r\n
\r\n \r\n
\r\n }\r\n
\r\n \r\n}\r\nexport default function Patient() {\r\n const savedState = sessionStorage.getItem(\"Patient\");\r\n const state = JSON.parse(savedState) || {};\r\n const [fields, setValue] = useFormFields(state);\r\n const [error, setError] = useState('');\r\n const history = useHistory();\r\n\r\n //React.useEffect(() => {\r\n // async function setUsb() {\r\n // await usb.getDevices(setError);\r\n // }\r\n // setUsb();\r\n //}, []);\r\n\r\n const location = getLocal('locationOptions');\r\n if (!location.code) history.push('/register');\r\n const consent = location.consentPage ? getLocal('consent') : null;\r\n\r\n const inputs = [\r\n { id: \"firstName\", name: \"Patient First Name\", required: true },\r\n { id: \"lastName\", name: \"Patient Last Name\", required: true },\r\n { id: \"email\", name: \"Email\", type: \"email\", required: true, },\r\n { id: \"cellPhone\", name: \"Cell Phone\", required: true, type: 'phone' },\r\n { id: \"sex\", name: \"Gender\", options: sexOptions, required: true },\r\n { id: \"DOB\", name: \"Date of Birth\", type: \"date\", required: true, validator: isValidDOB, allowPastYears: 120, allowFutureYears: 0},\r\n { id: \"address1\", name: \"Patient Address\", required: true },\r\n { id: \"city\", name: \"Patient City\", required: true },\r\n { id: \"state\", name: \"State\", required: true, options: stateOptions },\r\n { id: \"zip\", name: \"Zip\", required: true },\r\n { id: \"county\", name: \"County\", required: false},\r\n { id: \"race\", name: \"Race\", options: raceOptions },\r\n { id: \"ethnicity\", name: \"Ethnicity\", options: ethnicityOptions },\r\n { id: \"driversLicense\", name: \"Driver's License/Other ID\", required: false },\r\n { id: \"SSN\", name: \"SSN\", required: false },\r\n { id: \"employeeID\", name: \"Employee ID\", required: false },\r\n { id: \"affiliation\", name: \"Are you a\", required: true, options: makeOptions(Constants.areyou) },\r\n { id: \"vaccinated\", name: \"Are you vaccinated\", required: true, options: makeOptions(vaccinated) },\r\n //{ id: \"\", name: \"\", required: true, type: \"\", options: makeOptions()},\r\n ]\r\n .filter(i => (i.id !== 'vaccinated' && i.id !== 'affiliation') || location[`use${toPascal(i.id)}`] !== null)\r\n .filter(i => (i.id === 'vaccinated' || i.id === 'affiliation') || location[`req${toPascal(i.id)}`] !== null)\r\n .map(i => ({ ...i, required: location[`req${toPascal(i.id)}`] || location[`use${toPascal(i.id)}`] }));\r\n\r\n function onSave() {\r\n setError('');\r\n console.log(fields);\r\n\r\n try {\r\n inputs.filter(i => i.required).forEach(i => { validate(fields, i.id, i.name, i.type, i.validator); });\r\n questions.filter(i => location[`use${toPascal(i.id)}`]).forEach(i => { validate(fields, i.id, i.name); });\r\n\r\n if (fields.SSN) {\r\n if (!isValidSsn(fields.SSN))\r\n throw new Error(`Please enter a valid SSN`);\r\n }\r\n if (fields.DOB) {\r\n if (!isValidDOB(fields.DOB))\r\n throw new Error(`Please enter a valid patient Date of Birth`);\r\n }\r\n\r\n // save data to the session storage\r\n sessionStorage.setItem(\"Patient\", JSON.stringify(fields));\r\n const symptoms = fields.Symptomatic === '3'\r\n || location.useMedicalHistory !== null || location.reqSymptomSignatureImage;\r\n \r\n history.push(symptoms ? \"symptoms\" : \"insured\");\r\n }\r\n catch (e) {\r\n// console.log(e);\r\n setError(e.message);\r\n }\r\n }\r\n\r\n function onRadio(e) {\r\n setValue(e);\r\n }\r\n return (\r\n
\r\n {location.consentPage && (!consent || !consent.accept) && }\r\n {(!location.consentPage || (consent && consent.accept)) && <>\r\n

Please tell us about the patient.

\r\n
\r\n {inputs.map((input, i) => \r\n input.options ?\r\n \r\n :\r\n \r\n )}\r\n
\r\n

Please answer to the best of your knowledge

\r\n {questions.filter(i => location[`use${toPascal(i.id)}`] !== null).map(q => (\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n ))}\r\n {error &&
\r\n {error}\r\n
}\r\n \r\n }\r\n
\r\n );\r\n}\r\n\r\nexport function Start() {\r\n const hist = useHistory();\r\n let initialState = useParams();\r\n console.log(initialState);\r\n const location = initialState.location;\r\n let practice = location === 'at' ? 'ccg' : sessionStorage.getItem('practice');\r\n if (location === 'at') {\r\n sessionStorage.setItem('practice', practice);\r\n initialState = null;\r\n }\r\n if (!location) {\r\n if (practice === 'ccg') {\r\n hist.push('/register/at');\r\n return null;\r\n }\r\n initialState = null;\r\n }\r\n\r\n const inputs = [\r\n {\r\n id: \"location\", name: \"Location Code\", required: true,\r\n options: practice === 'ccg' ? makeOptions(locations) : null\r\n },\r\n ];\r\n\r\n async function onNext(data) {\r\n const location = await api.getLocation(data.location);\r\n setLocal('locationOptions', location);\r\n setLocal('location', { customerId: location.customerId });\r\n if (!location.selfServe) {\r\n setLocal('specimen', null);\r\n }\r\n hist.push(location.requireAppointment ? '/appointment'\r\n : location.selfServe ? '/specimen' : \"/patient\");\r\n }\r\n\r\n return
\r\n
Location code is provided by testing site.\r\n
\r\n
\r\n}\r\n\r\nasync function validateBarcode(code) {\r\n const location = getLocal('locationOptions');\r\n console.log('validateBarcode', code, location);\r\n //const maxCode = location.validateSpecimenId ? 6 : 20;\r\n const maxCode = 20;\r\n if (code.length > maxCode || !isAlphaNum(code)) {\r\n throw new Error(`Lab barcode/specimen ID is up to ${maxCode} letters or numbers`);\r\n }\r\n const lab = await api.validateLabCode(code, location.validateSpecimenId, location.code);\r\n if (!lab.ok) throw new Error('Please see lab technician - you may have to obtain a new barcode/specimen ID');\r\n}\r\nexport function Retest() {\r\n const inputs = [//{ id: \"\", name: \"\", required: true, type: \"\", options: },\r\n { id: \"confirmationCode\", name: \"Confirmation Code\", required: true },\r\n { id: \"labCode\", name: \"Specimen ID (under the barcode)\", required: true },\r\n ];\r\n\r\n async function onNext(data) {\r\n const code = data.confirmationCode;\r\n if (code.length !== 8 || !isAlphaNum(code)) {\r\n throw new Error('Confirmation Code is 8 letters or numbers');\r\n }\r\n var confirmation = await api.retest(data);\r\n if (!confirmation)\r\n return;\r\n confirmation.labCode = data.labCode;\r\n setLocal('confirmation', confirmation);\r\n }\r\n\r\n return
\r\n}\r\n\r\nexport function Appointment() {\r\n const history = useHistory();\r\n const location = getLocal('locationOptions');\r\n if (!location.code) history.push('/register');\r\n const aptDateInput = {\r\n id: \"appointmentDate\", name: \"Desired Appointment Date (today or later)\",\r\n type: 'date', required: true, validator: isValidAptDate, onChange:loadApt,\r\n allowPastYears: 0, allowFutureYears: 1\r\n };\r\n\r\n const [inputs, setInputs] = useState([aptDateInput]);\r\n\r\n async function loadApt(appointmentDate) {\r\n if (!isValidAptDate(appointmentDate))\r\n throw new Error(\"Please submit a valid appointment date to see the available time\");\r\n const apts = await api.getAppointments(location.code, appointmentDate);\r\n if (!apts.Appointments.length) {\r\n throw new Error('No appointments are available on this date. Please, select another date.'\r\n );\r\n }\r\n console.log(apts);\r\n const aptTimeInput = {\r\n id: \"visitDate\", name: \"Available Appointment Time\",\r\n options: makeOptions(apts.Appointments),\r\n required: true, //validator: isValidAptDate,\r\n };\r\n setInputs([aptDateInput, aptTimeInput]);\r\n }\r\n async function onNext(data) {\r\n const appointmentDate = data.appointmentDate;\r\n if (!data.visitDate) \r\n loadApt(appointmentDate);\r\n else \r\n history.push('/patient');\r\n //next=\"/patient\"\r\n }\r\n\r\n return
\r\n}\r\n\r\n\r\nexport function Specimen() {\r\n const inputs = [\r\n { id: \"labCode\", name: \"Specimen ID (the characters under the barcode)\", required: true },\r\n ];\r\n\r\n async function onNext(data) {\r\n const code = data.labCode;\r\n await validateBarcode(code);\r\n }\r\n\r\n return
\r\n}\r\n\r\nexport function Form({ formId, title, saveText, inputs, save, next, initialState, children }) {\r\n const savedState = sessionStorage.getItem(formId);\r\n const state = initialState || JSON.parse(savedState) || {};\r\n const [fields, setValue] = useFormFields(state);\r\n const history = useHistory();\r\n const [error, setError] = useState('');\r\n\r\n if (initialState) {\r\n submit();\r\n return null;\r\n }\r\n\r\n function onChange(inputHandler) {\r\n// console.log('return onChange');\r\n return async (e) => {\r\n// console.log('onChange');\r\n setValue(e);\r\n setError('');\r\n if (inputHandler) {\r\n// console.log('onChange', e.target.id);\r\n try {\r\n await inputHandler(e.target.value);\r\n }\r\n catch (e) {\r\n setError(e.message);\r\n }\r\n }\r\n }\r\n }\r\n\r\n async function onSave(e) {\r\n e.preventDefault();\r\n setError('');\r\n await submit();\r\n }\r\n\r\n async function submit() {\r\n try {\r\n inputs.filter(i => i.required || i.validator)\r\n .forEach(i => { validate(fields, i.id, i.name, i.type, i.validator); });\r\n // save data to the session storage\r\n setLocal(formId, fields);\r\n if (save) await save(fields);\r\n if (next) history.push(next);\r\n }\r\n catch (e) {\r\n // console.log(e);\r\n setError(e.message);\r\n }\r\n }\r\n\r\n return (\r\n
\r\n

{title}

\r\n
\r\n {inputs.map((input, i) =>\r\n input.options ?\r\n \r\n : input.type === 'checkbox' ?\r\n \r\n : \r\n )}\r\n
\r\n {children}\r\n {error &&
\r\n {error}\r\n
}\r\n \r\n
\r\n );\r\n}\r\n\r\nconst raceOptions = makeOptions(Constants.races);\r\n\r\nconst sex = [{ id: \"F\", name: \"Female\" }, { id: \"M\", name: \"Male\" }, { id: \"U\", name: \"Unknown\" },];\r\nconst sexOptions = makeOptions(sex);\r\n\r\nconst ethnicity = [{ id: \"H\", name: \"Hispanic or Latino\" },\r\n { id: \"N\", name: \"Not Hispanic or Latino\" }, { id: \"U\", name: \"Unknown\" },];\r\nconst ethnicityOptions = makeOptions(ethnicity);\r\n\r\nconst vaccinated = [{\r\n id: 1, name: 'Unknown'\r\n}, {\r\n id: 7, name: 'None'\r\n }, {\r\n id: 2, name: 'Johnson & Johnson Single Shot'}, {\r\n id: 3, name: 'Moderna First Shot'}, {\r\n id: 4, name: 'Moderna Two Shots'\r\n }, {\r\n id: 8, name: 'Moderna Three Shots'\r\n }, {\r\n id: 5, name: 'Pfizer First Shot'\r\n }, {\r\n id: 6, name: 'Pfizer Two Shots'\r\n }, {\r\n id: 9, name: 'Pfizer Three Shots'\r\n },];\r\n\r\nfunction makeOptions(list) {\r\n return list.map((x, i) =>\r\n (x.id && )\r\n || \r\n );\r\n}\r\nconst stateOptions = makeOptions(Constants.usStates);\r\n\r\nconst questions = [//{ id: \"\", name: \"\" },\r\n { id: \"FirstTest\", name: \"First Test?\" },\r\n { id: \"EmployedHealthcare\", name: \"Employed in healthcare?\" },\r\n { id: \"Pregnant\", name: \"\" },\r\n { id: \"Congregated\", name: \"Resident in a congregated care setting (nursing homes, rehabilitation facilities, etc..)?\" },\r\n { id: \"Symptomatic\", name: \"Are you experiencing any symptoms of COVID-19?\" },\r\n { id: \"Hospitalized\", name: \"\" },\r\n { id: \"ICU\", name: \"\" },\r\n { id: \"WearMask\", name: \"If you traveled, did you wear a mask over your nose and mouth?\" },\r\n { id: \"AvoidCrowds\", name: \"If you traveled, did you avoid crowds and stay at least 6 feet/2 meters from anyone who is not traveling with you?\" },\r\n { id: \"WashHands\", name: \"If you traveled, did you wash your hands often or use hand sanitizer (with at least 60% alcohol)?\" }, \r\n];\r\n\r\nfunction range(n) {\r\n// console.log('range', n);\r\n return new Array(n).fill().map((x, i) => i);\r\n} \r\nconst dates = range(31).map(i => padLeadingZeros(i + 1, 2));dates.unshift('Date')\r\n//var monthName = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\r\nconst months = range(12).map(i => padLeadingZeros(i + 1, 2)); months.unshift('Month');\r\nconst currentYear = new Date().getFullYear();\r\nfunction yearsPastToFuture(allowPastYears, allowFutureYears) {\r\n const past = +allowPastYears || 0;\r\n const future = +allowFutureYears || 0;\r\n\r\n const factor = future > 0 ? 1 : -1; // reverse order for past only years\r\n const startYear = future > 0 ? currentYear - past : currentYear\r\n const years = range(past + future + 1)\r\n .map(i => `${startYear + factor * i}`);\r\n years.unshift('Year');\r\n return years;\r\n}\r\nfunction padLeadingZeros(num, size) {\r\n var s = num + \"\";\r\n while (s.length < size) s = \"0\" + s;\r\n return s;\r\n}\r\nconst locations = [\r\n { id: 'BROOK', name: 'BROOKHAVEN' },\r\n { id: 'CHOAD', name: 'CHOA DULUTH' },\r\n { id: 'DULUT', name: 'DULUTH (Santa Fe)' },\r\n { id: 'GAINE', name: 'GAINESVILLE' },\r\n { id: 'LILBURN', name: 'LILBURN (Plaza)' },\r\n { id: 'PEACH', name: 'PEACHFORD' },\r\n { id: 'PEACHTREECORNERS', name: 'PEACHTREE CORNERS(NITROZONE)' },\r\n];\r\n//function listHeader({ columns }) {\r\nfunction listHeader() {\r\n return
\r\n
Vendor
\r\n
Device
\r\n
Model
\r\n
Open
\r\n
ID
\r\n
\r\n}\r\nfunction listItem({ key, device }) {\r\n return
\r\n
{device.manufacturerName}
\r\n
{device.productName}
\r\n
{device.serialNumber}
\r\n
{device.opened}
\r\n
{device.id}
\r\n
\r\n}\r\nexport function WebUsb() {\r\n //React.useEffect(() => {\r\n // const title = document.title;\r\n // document.title = `${title} | USB Setup`;\r\n // return () => { document.title = title; };\r\n //}, []);\r\n function got(device) {\r\n setDevices(devices =>\r\n (devices.find(d => d.serialNumber === device.serialNumber) ?\r\n devices : [device, ...devices]))\r\n // .map(d => d.serialNumber === device.serialNumber ? device : d);\r\n }\r\n function del(device) {\r\n setDevices(devices =>\r\n devices.filter(d => d.serialNumber !== device.serialNumber));\r\n }\r\n async function pairUsb() {\r\n setLoading(true);\r\n await usb.pair(got);\r\n setLoading(false);\r\n }\r\n async function connectUsb() {\r\n setLoading(true);\r\n await usb.getDevices(got, got, del);\r\n setLoading(false);\r\n }\r\n const [loading, setLoading] = useState(false);\r\n const [devices, setDevices] = useState([]);\r\n\r\n return <>\r\n

USB Scanner Setup

\r\n {devices.length > 0 && listHeader()}\r\n {devices.length > 0 && devices.map((x, i) => listItem({ key: i, device: x }))}\r\n {!devices.length &&

Plug the Card Scanner to the computer USB port,\r\n then click bellow to connect.

}\r\n {devices.length > 0 &&

The Card Scanner is connected.

}\r\n Pair Devices\r\n Use Paired Devices\r\n \r\n}\r\n\r\n// SerialPort\r\nexport function Usb() {\r\n function got(device) {\r\n if (!device) return;\r\n setDevices(devices =>\r\n (devices.find(d => d.serialNumber === device.serialNumber) ?\r\n devices : [device, ...devices]));\r\n }\r\n function del(device) {\r\n if (!device) return;\r\n setDevices(devices =>\r\n devices.filter(d => d.serialNumber !== device.serialNumber));\r\n }\r\n function gotData(text) {\r\n if (!text) return;\r\n setScanned(text);\r\n }\r\n async function pairSerial() {\r\n setLoading(true);\r\n await serial.pair(got, gotData);\r\n setLoading(false);\r\n }\r\n async function connectUsb() {\r\n setLoading(true);\r\n await serial.getPorts(got, got, del, gotData);\r\n setLoading(false);\r\n }\r\n const [loading, setLoading] = useState(false);\r\n const [devices, setDevices] = useState([]);\r\n const [scanned, setScanned] = useState('');\r\n\r\n return <>\r\n

USB Serial Port Scanner Setup

\r\n {devices.length > 0 && listHeader()}\r\n {devices.length > 0 && devices.map((x, i) => listItem({ key: i, device: x }))}\r\n {!devices.length &&

Plug the Card Scanner to the computer,\r\n then click bellow to connect.

}\r\n {devices.length > 0 &&

The device is connected.

}\r\n Pair Devices\r\n Use Paired Devices\r\n {scanned &&
Scanned: {scanned}\r\n
}\r\n \r\n}\r\n\r\n","import React, { Component } from 'react';\r\nimport { Route, Switch } from 'react-router';\r\nimport { Layout } from './components/Layout';\r\nimport { Home } from './components/Home';\r\n//import { FetchData } from './components/FetchData';\r\nimport Patient, { Start, Appointment, Symptoms, Insured, Complete, Prompt, Retest, Specimen, Usb } from './components/Counter';\r\n\r\nimport './custom.css'\r\n\r\nexport default class App extends Component {\r\n static displayName = App.name;\r\n\r\n render () {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n","import 'bootstrap/dist/css/bootstrap.css';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport App from './App';\r\n//import registerServiceWorker from './registerServiceWorker';\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n rootElement);\r\n\r\n//registerServiceWorker();\r\n\r\n"],"sourceRoot":""}