{"version":3,"sources":["config/index.ts","containers/AppDefault.tsx","helpers/auth.ts","helpers/util.ts","helpers/logging.tsx","helpers/axios.ts","helpers/errors.ts","types/auth.ts","actions/auth/Auth.ts","actions/auth/ActionTypes.ts","actions/lures/Lures.ts","actions/lures/ActionTypes.ts","actions/properties/Properties.ts","actions/properties/ActionTypes.ts","actions/runs/Runs.ts","actions/runs/ActionTypes.ts","reducers/QueueReducer/QueueReducer.ts","actions/traps/Traps.ts","actions/traps/ActionTypes.ts","contexts/theme.ts","hooks/useGetContext.ts","hooks/useLocalStorageState.ts","hooks/useOnlineStatus.ts","hooks/useSync.ts","components/common/InstallPWAButton.tsx","components/common/RunNumberSelect.tsx","components/common/SyncConflictModal.tsx","components/common/Header.tsx","containers/AppWithNavbar.tsx","components/common/LoadingPage.tsx","containers/RequireAuth.tsx","containers/RouteWithLayout.tsx","helpers/themes.ts","contexts/ContextProvider.tsx","reducers/AuthReducer/AuthReducer.ts","reducers/PropertyReducer/PropertyReducer.ts","reducers/RunReducer/RunReducer.ts","reducers/UIReducer/UIReducer.ts","reducers/index.ts","actions/ui/ActionTypes.ts","rum.ts","components/Apm.tsx","components/common/GoogleAnalytics.tsx","components/common/ToastButton.tsx","helpers/tenantInfo.ts","components/GrowerLogin/Footer.tsx","components/GrowerLogin/GrowerLoginLayout.tsx","components/GrowerLogin/InvalidTenantPage.tsx","components/GrowerLogin/GrowerLoginPage.tsx","components/InstallInstructions/typings/index.ts","components/InstallInstructions/InstallInstructions.tsx","components/Login/LoginPage.tsx","components/Logout/LogoutPage.tsx","components/common/EmptyState.tsx","helpers/status.ts","components/common/Triangle.tsx","components/ManagementAreasPage/CollapsibleList.tsx","components/ManagementAreasPage/ManagementAreasPage.tsx","actions/ui/UIEvents.ts","components/PropertyGroupPage/CollapsibleList.tsx","components/PropertyGroupPage/PropertyGroupPage.tsx","components/RunNumberPage/Footer.tsx","components/RunNumberPage/RunNumberPage.tsx","components/common/LimitedTextArea.tsx","components/TrapPage/TrapPage.tsx","components/App.tsx","serviceWorker.ts","components/UpdateAppPrompt.tsx","index.tsx"],"names":["AUTH_URL","process","BASE_URL","AppDefault","children","style","overflow","className","Row","Col","xs","position","autoClose","parseJwt","token","base64","split","replace","jsonPayload","decodeURIComponent","atob","map","c","charCodeAt","toString","slice","join","JSON","parse","getTenantLoginOptions","tenantName","options","service","seasonalDatabase","Error","sleep","ms","Promise","resolve","setTimeout","hardReload","reloadAfterClear","window","caches","keys","then","names","forEach","name","a","delete","location","reload","formatTenantName","toLocaleUpperCase","updateTenantTheme","themeContext","theme","Object","length","update","clear","kibanaUrlHost","substring","getElasticTrappingAppCreds","secretsManager","AWS","SecretsManager","secret_name","params","SecretId","getSecretValue","promise","secretResponse","SecretString","secret","logFailedRecords","properties","userId","records","traps","url","key","elasticUrl","elasticKey","apm","captureError","headers","Accept","Authorization","recordsArray","push","failedTraps","record","payload","axios","post","response","status","id","tz","trapping_zones","find","trap_id","trapping_zone_id","trapping_zone","trap","rpin","property_id","identifier","trapping_zone_name","trap_name_code","code","moth_count","amount","toast","info","error","ft","logTraplogApiError","isOnline","buildRequest","method","data","requestHeaders","config","responseType","localStorage","getItem","preSyncFetch","auth","queue","actions","CancelToken","source","GetAllTrapStatuses","activeProperty","pivot","property_group_id","GetPropertyGroup","GetAllLures","GetTrapInfo","activeTrap","UpdateTrapCache","LoginError","message","TraplogApiError","SyncError","postError","putError","LoginType","Logout","dispatch","type","loginType","Credentials","opts","result","group","SelectProperty","property","SelectTrap","FindRun","UpdateRunNumber","runNumber","INIT","loading","lastSync","postUpdates","putUpdates","syncRetryCounter","PushTrapMonitorRecords","Number","SyncOfflineUpdates","errors","postResult","isEmpty","each","index","updateId","putResult","AddTrapMonitorRecord","ClearSyncQueue","updates","propertyGroup","trapId","cancelToken","__CANCEL__","pendingUpdates","SyncRetry","trapIds","ThemeContext","createContext","useGetContext","useContext","useLocalStorageState","initialValue","useState","state","setInternalState","useEffect","value","setItem","stringify","useOnlineStatus","navigator","onLine","setIsOnline","updateNetwork","addEventListener","removeEventListener","useSync","handleSyncConflicts","postStatus","setSyncConflictModalState","open","conflictingRecords","remainingRecords","retry","toastId","errorMessage","handleSyncRetry","putStatus","catch","err","undefined","InstallPWAButton","onClick","history","useHistory","supportsPWA","setSupportsPWA","promptInstall","setPromptInstall","handler","e","preventDefault","onClickInstructions","Button","background","tenantDarkerColour","title","prompt","RunNumberSelect","pastRuns","styles","setPastRuns","onChange","onCreate","controlPressed","setControlPressed","pr","passcode","label","handleNumberOnlyInput","persist","nativeEvent","clipboard","readText","test","includes","newValue","placeholder","formatCreateLabel","inputValue","isValidNewOption","Grower","onCreateOption","noOptionsMessage","isDisabled","isClearable","onKeyDown","compose","connect","modalState","setState","setOpen","Modal","isOpen","centered","ModalHeader","ModalBody","color","cr","failingRecord","conflictingRecord","withRouter","run","props","hideBackButton","syncConflictModalState","formLoading","setFormLoading","syncing","setSyncing","clickCount","setClickCount","clickTimeout","setClickTimeout","syncOffline","toggleMenu","logout","updateRun","property_group","description","numberString","isRoot","pathname","onChangeSelect","trim","goBack","stopPropagation","syncOfflineUpdates","onTripleClick","fn","clearTimeout","render","online","onlineClass","onlineIcon","wifi","wifiOff","menuIcon","x","menu","Navbar","dark","sticky","NavbarBrand","href","NavbarText","outline","icon","arrowLeft","size","Nav","NavLink","Collapse","Label","Form","FormGroup","width","height","option","base","_theme","borderRadius","colors","neutral0","primary25","primary","tenantColour","neutral50","neutral80","neutral90","number","disabled","inline","Badge","moment","fromNow","refreshCcw","touchAction","packageJson","version","AppWithNavbar","LoadingPage","Spinner","GetUser","userOpts","userResult","user","isObjectLike","rest","isAuthenticated","isPopulated","domains","hostname","validTenants","intersec","intersection","growerLoginURI","layout","component","requiresAuth","React","createElement","nzapTheme","defaultTheme","emptyTheme","ContextProvider","themeLocalStorage","initalThemeValue","themeValue","setThemeValue","initialTheme","newTheme","Provider","generateInitialState","accessToken","access","refreshToken","created_at","updated_at","email","email_verified_at","remember_token","role_id","deleted_at","api_token","send_reports","role","lures","scrollTop","rootReducer","combineReducers","action","removeItem","newState","expires","keyBy","mappedLures","lure","insects","console","clearedTraps","update_pending","_updateId","updatedTraps","chain","updated","last_monitored_date","isAfter","today","updatedToday","isSame","due","done","existingTrap","compact","currentActiveTrap","trapInfo","last","LastMonitoringRecord","lastUpdate","LastMonitoredDate","pendingPostUpdates","pendingPutUpdates","hasPendingUpdates","operator","latitude","coordinates","longitude","charged_at","update_id","location_description","setup_at","trap_lure_id","format","visited_at","visited_date","lure_changed","base_changed","comments","cachedTraps","updatedTrap","last_base_changed_date","last_lure_changed_date","existing","trapsToSetAsDue","newTraps","Date","hasOwnProperty","ui","page","initApm","serviceName","serverUrl","distributedTracingOrigins","environment","setUserContext","setupApmUser","useLocation","path","search","ReactGA","send","hitType","ToastButton","noop","_renderIcon","nzap","support","phone","pages","supportAlert","text","getTenantInfo","Footer","tenantInfo","alt","src","GrowerLoginLayout","tenant","xmlns","viewBox","fillOpacity","fill","d","zIndex","InvalidTenantPage","GrowerLogin","FingerprintJS","load","agent","get","fingerprint","components","screenFrame","screenResolution","visitor_id","hashComponents","request","authResult","jwt","jwt_token","refresh_token","useParams","isValidTenant","isEqual","doLogin","loginOptions","closeButton","Device","InstallInstructionsPage","device","setDevice","check","Input","verticalAlign","Apple","Android","REACT_APP_DEBUG_USERNAME","REACT_APP_DEBUG_PASSWORD","Login","password","login","setLogin","setErrors","updateField","field","event","target","loginErrors","EmptyState","translateStatus","Triangle","stroke","strokeWidth","points","CollapsibleList","ListGroup","ListGroupItem","subTitle","collapse","chevronUp","chevronDown","items","item","display_color","ListGroupItemHeading","uploadCloud","ListGroupItemText","onItemClick","arrowRight","marginBottom","PersistScroll","scrollRef","setScrollRef","fetch","timer","selectedProperty","scrollTo","selectTrap","debouncedScroll","useCallback","debounce","scroll","onScroll","ref","overflowX","trappingZones","zone","trapsInZone","filter","orderedTrapsInZone","orderBy","insectGroup","insect_group","renderTrappingZones","inbox","renderStatus","setProperties","propertyFilter","setPropertyFilter","currentPropertyGroup","setCurrentPropertyGroup","FuzzySearch","caseSensitive","selectProperty","zones","some","i","every","renderProperties","Alert","fontSize","ResetRun","startRun","bottom","paddingInline","LimitedTextArea","rows","cols","limit","SelectTrapZone","setLure","setLoading","trapWasUpdatedToday","updateTrap","form","setForm","isMounted","cancel","prevState","selectedTrap","lureId","validateForm","idValid","isNumber","amountValid","isNaN","lureChangedValid","isBoolean","baseChangedValid","operatorValid","isString","commentsValid","trapIdValid","geoSuccess","f","location_accuracy","coords","accuracy","geoError","geolocation","getCurrentPosition","renderInstruction","date","instruction","changed","now","updateForm","submit","success","lure_change_due","base_change_due","row","for","inputMode","min","onBlur","checked","block","updatedAt","updatedBy","getUserUpdateString","persistConfig","storage","debug","persistedReducer","REACT_APP_DEBUG","persistReducer","reducers","middleware","ReduxPromise","thunk","composeEnhancers","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","store","createStore","applyMiddleware","persistor","persistStore","App","interceptors","use","ignore","pattern","reject","getState","originalRequest","_retry","res","defaults","common","TrapPage","ManagementAreasPage","PropertyGroupPage","LoginPage","GrowerLoginPage","LogoutPage","RunNumberPage","isLocalhost","Boolean","match","register","URL","origin","swUrl","contentType","indexOf","log","serviceWorker","ready","registration","unregister","registerValidSW","checkValidServiceWorker","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","onSuccess","UpdateAppPrompt","showReload","setShowReload","waitingWorker","setWaitingWorker","onSWUpdate","waiting","postMessage","initialize","region","apiVersion","credentials","accessKeyId","secretAccessKey","ReactDOM","document","getElementById"],"mappings":"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","file":"static/js/main.bf054cff.chunk.js","sourcesContent":["export const AUTH_URL =\n process.env.REACT_APP_TRAPLOG_AUTH_URL;\nexport const BASE_URL =\n process.env.REACT_APP_TRAPLOG_BASE_URL;\nexport const HEADER_SERVICE =\n process.env.REACT_APP_TRAPLOG_SERVICE;\nexport const SEASONAL_DB =\n process.env.REACT_APP_TRAPLOG_SEASONAL_DB;\nexport const NZAP_SERVICE =\n process.env.REACT_APP_NZAP_SERVICE;\nexport const NZAP_SEASONAL_DB =\n process.env.REACT_APP_NZAP_SEASONAL_DB;\n","import \"../styles/Wrapper.scss\";\nimport { Col, Row } from \"reactstrap\";\nimport { RouteComponentProps } from \"react-router-dom\";\nimport React from \"react\";\nimport { ToastContainer } from \"react-toastify\";\nimport \"react-toastify/dist/ReactToastify.css\";\n\nconst AppDefault: React.FC = ({ children }) => {\n return (\n
\n \n \n
\n
{children}
\n
\n \n
\n \n
\n );\n};\n\nexport default AppDefault;\n","import { NZAP_SEASONAL_DB, NZAP_SERVICE } from \"../config\";\n\nexport const parseJwt = (token: string): { [key: string]: unknown } => {\n var base64Url = token.split(\".\")[1];\n var base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n var jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map(function (c) {\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join(\"\")\n );\n\n return JSON.parse(jsonPayload);\n};\n\nexport const getTenantLoginOptions = (tenantName: string) => {\n const options = { tenantName };\n if (tenantName === 'nzap') {\n return {\n ...options,\n service: NZAP_SERVICE,\n seasonalDatabase: NZAP_SEASONAL_DB\n }\n } else {\n throw new Error(\"Invalid tenant name found.\");\n\n }\n}\n","import { IThemeContext, Theme } from \"../contexts/theme\";\n\nexport const sleep = (ms: number): Promise => {\n return new Promise((resolve) => setTimeout(resolve, ms));\n};\n\nexport const hardReload = (reloadAfterClear = true) => {\n if ('caches' in window) {\n caches.keys().then((names) => {\n names.forEach(async (name) => {\n await caches.delete(name);\n });\n });\n if (reloadAfterClear) window.location.reload();\n }\n}\n\nexport const formatTenantName = (name: string) => {\n if (name === 'nzap') {\n return name.toLocaleUpperCase();\n }\n\n return name;\n}\n\nexport const updateTenantTheme = (\n themeContext: IThemeContext | null,\n theme: Theme | {},\n tenantName: string\n) => {\n if (tenantName === 'nzap') {\n if (Object.keys(theme).length !== 0) {\n themeContext?.update(theme);\n }\n } else {\n themeContext?.clear();\n }\n}\n\nexport const kibanaUrlHost = (\n process.env.REACT_APP_KIBANA_URL as string\n).substring(8);\n\nexport const DEV_MODE = process.env.NODE_ENV === \"development\";\n","import { apm } from \"@elastic/apm-rum\";\nimport AWS from \"aws-sdk\";\nimport axios, { AxiosError, AxiosResponse } from \"axios\";\nimport React from \"react\";\nimport { toast } from \"react-toastify\";\nimport { SyncError } from \"./errors\";\nimport { DEV_MODE } from \"./util\";\n\ninterface Secret {\n url: string;\n key: string;\n}\n\n/**\n * Gets the Elastic credentials for sending indices from\n * AWS Secrets Manager.\n *\n * @returns The Elastic credentials for sending index.\n */\nconst getElasticTrappingAppCreds = async (): Promise => {\n const secretsManager = new AWS.SecretsManager();\n const secretEnvironment =\n process.env.REACT_APP_ENVIRONMENT === \"development\"\n ? \"staging\"\n : \"production\";\n const secret_name = `${secretEnvironment}_trapping_app_elastic_credentials`;\n try {\n const params = {\n SecretId: secret_name,\n };\n const secretResponse = await secretsManager\n .getSecretValue(params)\n .promise();\n // Parse and return the secret value\n if (secretResponse.SecretString) {\n const secret = JSON.parse(secretResponse.SecretString) as Secret;\n return secret;\n } else {\n throw new Error(\"No secret found.\");\n }\n } catch (error) {\n if (DEV_MODE) console.error(error);\n throw new Error(\"Could not fetch secret for logging failed records.\");\n }\n};\n\n/**\n * Logs the given records to Elastic.\n * If a record fails to send then get the trap name from traps.\n *\n * @param userId The current authenticated user.\n * @param records The failing records.\n * @param traps All traps that the user has access to. This is used as part of an error message.\n */\nexport const logFailedRecords = async (\n properties: IPropertyReducer,\n userId: number,\n records: { [key: string]: ITrapPost },\n traps: {\n [key: string]: ITrap;\n }\n) => {\n // Get the URL and key for sending log data.\n let elasticUrl;\n let elasticKey;\n try {\n const { url, key } = await getElasticTrappingAppCreds();\n elasticUrl = url;\n elasticKey = key;\n } catch (error) {\n if (DEV_MODE) console.error(error);\n else apm.captureError(error as Error);\n }\n // Create request.\n const url = `${elasticUrl}/trapping-app-logging/_doc`;\n const headers = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: `ApiKey ${elasticKey}`,\n };\n const recordsArray = [];\n for (const key of Object.keys(records)) {\n recordsArray.push(records[key]);\n }\n const failedTraps: {\n rpin: string;\n trapping_zone_name: string;\n trap_name_code: string;\n moth_count: number;\n }[] = [];\n recordsArray.forEach(async (record) => {\n const payload = {\n userId,\n record,\n };\n // Send request to store failed records in Elastic.\n try {\n const response: AxiosResponse = await axios.post(url, payload, {\n headers,\n });\n if (response.status >= 200 && response.status < 300) {\n }\n } catch (error) {\n if (record.id) {\n let trapping_zone: ITrappingZone | undefined;\n Object.keys(properties.properties).forEach((key) => {\n const trapping_zones = properties.properties[key].trapping_zones;\n const tz = trapping_zones.find(\n (tz) => tz.id === properties.traps[record.trap_id].trapping_zone_id\n );\n if (!trapping_zone && tz) trapping_zone = tz;\n });\n const trap = traps[record.trap_id];\n failedTraps.push({\n rpin: trapping_zone?.property_id\n ? properties.properties[trapping_zone?.property_id]?.identifier\n : \"-\",\n trapping_zone_name: trapping_zone?.name || \"-\",\n trap_name_code: `${trap.name} (${trap.code})`,\n moth_count: record.amount,\n });\n }\n if (DEV_MODE) console.error(error);\n else apm.captureError(error as Error);\n }\n });\n if (failedTraps.length === 0) {\n toast.info(\n \"Your data has not been lost. Contact support to resolve this.\",\n { autoClose: false }\n );\n } else if (failedTraps.length === recordsArray.length) {\n toast.error(\n <>\n

\n Failed to save your data for retrieval. Please take a screenshot.\n Re-enter data or contact support:\n

\n {failedTraps.map((ft) => {\n return (\n
\n

RPIN: {ft.rpin}

\n

Block: {ft.trapping_zone_name}

\n

Trap: {ft.trap_name_code}

\n

Moths: {ft.moth_count}

\n
\n );\n })}\n ,\n { autoClose: false }\n );\n } else {\n toast.error(\n <>\n

\n Could not save the following data for analysis. Please take a\n screenshot and re-enter:\n

\n {failedTraps.map((ft) => {\n return (\n
\n

RPIN: {ft.rpin}

\n

Block: {ft.trapping_zone_name}

\n

Trap: {ft.trap_name_code}

\n

Moths: {ft.moth_count}

\n
\n );\n })}\n ,\n { autoClose: false }\n );\n }\n};\n\n/**\n * Logs the given error to Elastic is online.\n *\n * @param error\n * @param isOnline\n */\nexport const logTraplogApiError = (\n error: Error | AxiosError | SyncError,\n isOnline?: boolean\n) => {\n if (isOnline && !DEV_MODE) {\n apm.captureError(error);\n }\n if (DEV_MODE) console.error(error, \"isOnline \" + isOnline);\n};\n","import axios, { AxiosRequestConfig, Method } from \"axios\";\nimport { toast } from \"react-toastify\";\nimport { ActionCreator } from \"redux\";\nimport { SEASONAL_DB } from \"../config\";\nimport { logTraplogApiError } from \"./logging\";\n\nexport const buildRequest = (\n method: Method,\n url: string,\n data?: unknown,\n headers?: { [key: string]: unknown }\n) => {\n const requestHeaders: { [key: string]: unknown } = {};\n if (!headers || !(\"seasonalDatabase\" in headers)) {\n requestHeaders.seasonalDatabase = SEASONAL_DB;\n }\n const config: AxiosRequestConfig = {\n method,\n url,\n responseType: \"json\",\n headers: requestHeaders,\n };\n if (data) {\n config.data = data;\n }\n // If accesstoken, include it\n const token = localStorage.getItem(\"accessToken\");\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n if (headers) {\n config.headers = { ...config.headers, ...headers };\n }\n return config;\n};\n\n/**\n * Fetches data intended before the sync begins. This\n * ensures the local state is up-to-date to avoid\n * conflicts.\n *\n * @param auth\n * @param queue\n * @param properties\n * @param actions\n * @param isOnline\n */\nexport const preSyncFetch = async (\n auth: IAuthReducer,\n queue: IQueueReducer,\n properties: IPropertyReducer,\n actions: {\n GetAllTrapStatuses: ActionCreator;\n GetPropertyGroup: ActionCreator;\n GetAllLures: ActionCreator;\n GetTrapInfo: ActionCreator;\n UpdateTrapCache: ActionCreator;\n },\n isOnline: boolean\n) => {\n // Get latest data before sync.\n const CancelToken = axios.CancelToken;\n const source = CancelToken.source();\n try {\n await actions.GetAllTrapStatuses(\n auth,\n properties.activeProperty?.pivot.property_group_id\n );\n await actions.GetPropertyGroup(\n auth,\n properties.activeProperty?.pivot.property_group_id\n );\n await actions.GetAllLures(auth);\n await actions.GetTrapInfo(\n auth,\n queue,\n properties.activeTrap?.id,\n source.token\n );\n } catch (err) {\n logTraplogApiError(err as Error, isOnline);\n toast.error(\"Unable to sync, failed to prepare sync. Please try again.\");\n } finally {\n await actions.UpdateTrapCache();\n }\n};\n","import { AxiosError } from \"axios\";\n\nexport class LoginError extends Error {\n name: string;\n message: string;\n data: unknown;\n constructor(message: string, data: unknown) {\n super(message);\n this.name = \"LoginError\";\n this.message = message;\n this.data = data;\n }\n}\n\nexport class TraplogApiError extends Error {\n url: string;\n data: AxiosError;\n constructor(url: string, message: string, data: AxiosError) {\n super(message);\n this.url = url;\n this.data = data;\n }\n}\n\nexport class SyncError extends Error {\n postError?: Error | TraplogApiError;\n putError?: Error | TraplogApiError;\n constructor(\n postError?: Error | TraplogApiError,\n putError?: Error | TraplogApiError\n ) {\n super(\"Sync error(s) occured.\");\n this.postError = postError;\n this.putError = putError;\n }\n}\n","\nexport enum LoginType {\n\tGrower = 'grower',\n\tCredentials = 'credentials'\n}\n\nexport type TenantInfo = {\n\tsupport: {\n\t\temail: string,\n\t\tphone: string\n\t},\n\tpages: {\n\t\trunNumber: {\n\t\t\tsupportAlert: {\n\t\t\t\ttext: string\n\t\t\t}\n\t\t}\n\t}\n}","import FingerprintJS from '@fingerprintjs/fingerprintjs';\nimport axios, { AxiosError, AxiosRequestConfig } from \"axios\";\nimport { isObjectLike } from \"lodash\";\nimport { Dispatch } from \"redux\";\nimport { AUTH_URL, HEADER_SERVICE } from \"../../config\";\nimport { parseJwt } from \"../../helpers/auth\";\nimport { buildRequest } from \"../../helpers/axios\";\nimport { LoginError } from \"../../helpers/errors\";\nimport { LoginType } from \"../../types/auth\";\nimport {\n AUTH_GET_USER_ERROR,\n AUTH_GET_USER_IN_PROGRESS,\n AUTH_GET_USER_SUCCESS,\n AUTH_LOGIN_ERROR,\n AUTH_LOGIN_IN_PROGRESS,\n AUTH_LOGIN_SUCCESS,\n AUTH_LOGOUT,\n} from \"./ActionTypes\";\n\nexport const Logout = () => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: AUTH_LOGOUT,\n });\n };\n};\n\nexport const GetUser = () => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: AUTH_GET_USER_IN_PROGRESS,\n });\n try {\n // additionally get user data, including token because\n // the state will not yet contain the token\n const userOpts = buildRequest(\"GET\", `${AUTH_URL}/user`);\n const userResult = await axios(userOpts);\n if (!userResult.data) throw new Error(\"Invalid response from server\");\n const user = userResult.data as IUser;\n dispatch({\n type: AUTH_GET_USER_SUCCESS,\n payload: user,\n });\n } catch (err) {\n const error = err as AxiosError;\n let payload = err;\n if (\n isObjectLike(error) &&\n isObjectLike(error.response) &&\n error.response?.data\n ) {\n payload = error.response.data;\n }\n dispatch({\n type: AUTH_GET_USER_ERROR,\n payload,\n });\n throw new LoginError(\"Login failed\", payload);\n }\n };\n};\n\nexport const Login = (email: string, password: string) => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: AUTH_LOGIN_IN_PROGRESS,\n });\n const payload = { email, password };\n const url = `${AUTH_URL}/token/jwt/generate`;\n const headers = {\n service: HEADER_SERVICE,\n };\n const request: AxiosRequestConfig = buildRequest(\n \"POST\",\n url,\n payload,\n headers\n );\n try {\n const authResult = await axios(request);\n if (!authResult.data) throw new Error(\"Invalid response from server\");\n const jwt = parseJwt(authResult.data.jwt_token);\n dispatch({\n type: AUTH_LOGIN_SUCCESS,\n payload: {\n loginType: LoginType.Credentials,\n access: jwt.access,\n accessToken: authResult.data.jwt_token,\n refreshToken: authResult.data.refresh_token,\n },\n });\n } catch (err) {\n const error = err as AxiosError;\n let payload = err;\n if (\n isObjectLike(error) &&\n isObjectLike(error.response) &&\n error.response?.data\n ) {\n payload = error.response.data;\n }\n dispatch({\n type: AUTH_LOGIN_ERROR,\n payload,\n });\n throw new LoginError(\"Login failed\", payload);\n }\n };\n};\n\nexport const GrowerLogin = (options: {\n tenantName: string;\n service: string;\n seasonalDatabase: string;\n}) => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: AUTH_LOGIN_IN_PROGRESS,\n });\n // Get the users' fingerprint.\n const agent = await FingerprintJS.load();\n const fingerprint = await agent.get();\n const { screenFrame, screenResolution, ...components } =\n fingerprint.components;\n const visitor_id = FingerprintJS.hashComponents(components as any);\n // Generate token using the fingerprint.\n const payload = { visitor_id };\n const url = `${AUTH_URL}/token/jwt/guest/generate`;\n const headers = {\n service: options.service,\n seasonalDatabase: options.seasonalDatabase,\n };\n const request: AxiosRequestConfig = buildRequest(\n \"POST\",\n url,\n payload,\n headers\n );\n try {\n const authResult = await axios(request);\n if (!authResult.data) throw new Error(\"Invalid response from server\");\n const jwt = parseJwt(authResult.data.jwt_token);\n dispatch({\n type: AUTH_LOGIN_SUCCESS,\n payload: {\n loginType: LoginType.Grower,\n tenantName: options.tenantName,\n service: options.service,\n seasonalDatabase: options.seasonalDatabase,\n access: jwt.access,\n accessToken: authResult.data.jwt_token,\n refreshToken: authResult.data.refresh_token,\n },\n });\n } catch (err) {\n const error = err as AxiosError;\n let payload = err;\n if (\n isObjectLike(error) &&\n isObjectLike(error.response) &&\n error.response?.data\n ) {\n payload = error.response.data;\n }\n dispatch({\n type: AUTH_LOGIN_ERROR,\n payload,\n });\n throw new LoginError(\"Grower Login failed\", payload);\n }\n };\n};\n","export const AUTH_LOGIN_IN_PROGRESS = \"AUTH_LOGIN_IN_PROGRESS\";\nexport const AUTH_LOGIN_SUCCESS = \"AUTH_LOGIN_SUCCESS\";\nexport const AUTH_LOGIN_ERROR = \"AUTH_LOGIN_ERROR\";\nexport const AUTH_LOGOUT = \"AUTH_LOGOUT\";\nexport const AUTH_GET_USER_IN_PROGRESS = \"AUTH_GET_USER_IN_PROGRESS\";\nexport const AUTH_GET_USER_SUCCESS = \"AUTH_GET_USER_SUCCESS\";\nexport const AUTH_GET_USER_ERROR = \"AUTH_GET_USER_ERROR\";\n","import axios, { AxiosError } from \"axios\";\nimport { Dispatch } from \"redux\";\nimport { BASE_URL, SEASONAL_DB } from \"../../config\";\nimport { buildRequest } from \"../../helpers/axios\";\nimport { TraplogApiError } from \"../../helpers/errors\";\nimport { LoginType } from \"../../types/auth\";\nimport {\n LURES_FETCH_ERROR,\n LURES_FETCH_IN_PROGRESS,\n LURES_FETCH_SUCCESS,\n} from \"./ActionTypes\";\n\nexport const GetAllLures = async (auth: IAuthReducer) => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: LURES_FETCH_IN_PROGRESS,\n });\n const url = `${BASE_URL}/trap-lures`;\n try {\n const headers =\n auth.loginType === LoginType.Credentials\n ? { seasonalDatabase: SEASONAL_DB }\n : { seasonalDatabase: auth.seasonalDatabase };\n const opts = buildRequest(\"GET\", url, null, headers);\n const result = await axios(opts);\n if (!result.data) throw new Error(\"Invalid response from server\");\n dispatch({\n type: LURES_FETCH_SUCCESS,\n payload: result.data as IProperty[],\n });\n } catch (err) {\n dispatch({\n type: LURES_FETCH_ERROR,\n payload: err,\n });\n throw new TraplogApiError(\n url,\n \"Failed to get trap lures\",\n err as AxiosError\n );\n }\n };\n};\n","export const LURES_FETCH_IN_PROGRESS = \"LURES_FETCH_IN_PROGRESS\";\nexport const LURES_FETCH_SUCCESS = \"LURES_FETCH_SUCCESS\";\nexport const LURES_FETCH_ERROR = \"LURES_FETCH_ERROR\";\n","import axios, { AxiosError } from \"axios\";\nimport { Dispatch } from \"redux\";\nimport { BASE_URL, SEASONAL_DB } from \"../../config\";\nimport { buildRequest } from \"../../helpers/axios\";\nimport { TraplogApiError } from \"../../helpers/errors\";\nimport { LoginType } from \"../../types/auth\";\nimport {\n PROPERTYGROUP_FETCH_ERROR,\n PROPERTYGROUP_FETCH_IN_PROGRESS,\n PROPERTYGROUP_FETCH_SUCCESS,\n SELECT_PROPERTY,\n SELECT_TRAP,\n SELECT_TRAP_ZONE,\n} from \"./ActionTypes\";\n\nexport const GetPropertyGroup = async (auth: IAuthReducer, group: string) => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: PROPERTYGROUP_FETCH_IN_PROGRESS,\n });\n const url = `${BASE_URL}/property-groups/${group}?with[]=properties.trappingZones.traps`;\n try {\n const headers =\n auth.loginType === LoginType.Credentials\n ? { seasonalDatabase: SEASONAL_DB }\n : { seasonalDatabase: auth.seasonalDatabase };\n const opts = buildRequest(\"GET\", url, null, headers);\n const result = await axios(opts);\n if (result instanceof Error) throw result;\n if (!result.data) throw new Error(\"Invalid response from server\");\n dispatch({\n type: PROPERTYGROUP_FETCH_SUCCESS,\n payload: result.data.properties as IProperty[],\n });\n } catch (err) {\n dispatch({\n type: PROPERTYGROUP_FETCH_ERROR,\n payload: err,\n });\n throw new TraplogApiError(\n url,\n \"Could not get property group\",\n err as AxiosError\n );\n }\n };\n};\n\nexport const SelectProperty = (property: IProperty) => {\n return (dispatch: Dispatch) => {\n dispatch({\n type: SELECT_PROPERTY,\n payload: property,\n });\n };\n};\n\nexport const SelectTrap = (trap: ITrap) => {\n return (dispatch: Dispatch) => {\n dispatch({\n type: SELECT_TRAP,\n payload: trap,\n });\n };\n};\n\nexport const SelectTrapZone = (zone: ITrappingZone) => {\n return (dispatch: Dispatch) => {\n dispatch({\n type: SELECT_TRAP_ZONE,\n payload: zone,\n });\n };\n};\n","export const PROPERTYGROUP_FETCH_IN_PROGRESS =\n \"PROPERTYGROUP_FETCH_IN_PROGRESS\";\nexport const PROPERTYGROUP_FETCH_SUCCESS = \"PROPERTYGROUP_FETCH_SUCCESS\";\nexport const PROPERTYGROUP_FETCH_ERROR = \"PROPERTYGROUP_FETCH_ERROR\";\nexport const SELECT_PROPERTY = \"SELECT_PROPERTY\";\nexport const SELECT_TRAP_ZONE = \"SELECT_TRAP_ZONE\";\nexport const SELECT_TRAP = \"SELECT_TRAP\";\n","import axios, { AxiosError } from \"axios\";\nimport { Dispatch } from \"redux\";\nimport { BASE_URL, SEASONAL_DB } from \"../../config\";\nimport { buildRequest } from \"../../helpers/axios\";\nimport { TraplogApiError } from \"../../helpers/errors\";\nimport { LoginType } from \"../../types/auth\";\nimport {\n RUN_FETCH_ERROR,\n RUN_FETCH_IN_PROGRESS,\n RUN_FETCH_SUCCESS,\n RUN_RESET,\n RUN_UPDATE_NUMBER,\n} from \"./ActionTypes\";\n\nexport const FindRun = async (auth: IAuthReducer, id: string) => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: RUN_FETCH_IN_PROGRESS,\n });\n const loginType = auth.loginType;\n const url =\n loginType === LoginType.Credentials\n ? `${BASE_URL}/trapping-runs/passcode/${id}`\n : `${BASE_URL}/trapping-runs/passcode-restricted/${id}`;\n const headers =\n loginType === LoginType.Credentials\n ? { seasonalDatabase: SEASONAL_DB }\n : { seasonalDatabase: auth.seasonalDatabase };\n const opts = buildRequest(\"GET\", url, null, headers);\n try {\n const result = await axios(opts);\n if (result instanceof Error) throw result;\n if (!result || !result.data)\n throw new Error(\"Invalid response from server\");\n dispatch({\n type: RUN_FETCH_SUCCESS,\n payload: result.data,\n });\n // Return property group ID\n return result?.data || null;\n } catch (err) {\n dispatch({\n type: RUN_FETCH_ERROR,\n payload: err,\n });\n throw new TraplogApiError(\n url,\n \"Failed to get trapping run\",\n err as AxiosError\n );\n }\n };\n};\n\nexport const UpdateRunNumber = (runNumber: string) => {\n return (dispatch: Dispatch) => {\n dispatch({\n type: RUN_UPDATE_NUMBER,\n payload: runNumber,\n });\n };\n};\n\nexport const ResetRun = () => {\n return (dispatch: Dispatch) => {\n dispatch({\n type: RUN_RESET,\n });\n };\n};\n","export const RUN_FETCH_IN_PROGRESS = \"RUN_FETCH_IN_PROGRESS\";\nexport const RUN_FETCH_SUCCESS = \"RUN_FETCH_SUCCESS\";\nexport const RUN_FETCH_ERROR = \"RUN_FETCH_ERROR\";\nexport const RUN_UPDATE_NUMBER = \"RUN_UPDATE_NUMBER\";\nexport const RUN_RESET = \"RUN_RESET\";\n","import {\n OFFLINE_SYNC_CANCEL,\n OFFLINE_SYNC_CLEAR,\n OFFLINE_SYNC_ERROR,\n OFFLINE_SYNC_IN_PROGRESS,\n OFFLINE_SYNC_REMOVE,\n OFFLINE_SYNC_RETRY_INCREMENT,\n OFFLINE_SYNC_SUCCESS,\n TRAP_UPDATE_ERROR,\n} from \"../../actions/traps/ActionTypes\";\n\nexport const MAX_SYNC_RETRY_ATTEMPTS = 3;\n\nconst generateInitialState = (): IQueueReducer => {\n const state: IQueueReducer = {\n loading: false,\n error: false,\n lastSync: null,\n postUpdates: {},\n putUpdates: {},\n syncRetryCounter: 0,\n };\n return state;\n};\n\nconst INIT = generateInitialState();\n\nexport default (state = INIT, action: any): IQueueReducer => {\n switch (action.type) {\n case TRAP_UPDATE_ERROR:\n const update = action.payload.update as ITrapPost;\n const key = update.method === \"POST\" ? \"postUpdates\" : \"putUpdates\";\n return {\n ...state,\n [key]: {\n ...state[key],\n [action.payload.update.trap_id]: {\n ...action.payload.update,\n },\n },\n };\n case OFFLINE_SYNC_IN_PROGRESS:\n return {\n ...state,\n loading: true,\n };\n case OFFLINE_SYNC_SUCCESS:\n return {\n ...INIT,\n loading: false,\n lastSync: new Date(),\n };\n case OFFLINE_SYNC_ERROR:\n return {\n ...state,\n loading: false,\n error: true,\n };\n case OFFLINE_SYNC_CANCEL:\n return {\n ...state,\n loading: false,\n error: false,\n };\n case OFFLINE_SYNC_CLEAR:\n return {\n ...INIT,\n };\n case OFFLINE_SYNC_REMOVE:\n const updateId = action.payload.updateId as number;\n const postUpdates = state.postUpdates;\n if (postUpdates.hasOwnProperty(updateId)) {\n delete postUpdates[updateId];\n }\n const putUpdates = state.putUpdates;\n if (putUpdates.hasOwnProperty(updateId)) {\n delete putUpdates[updateId];\n }\n return {\n ...state,\n postUpdates,\n putUpdates,\n };\n case OFFLINE_SYNC_RETRY_INCREMENT:\n let syncRetryCounter = state.syncRetryCounter;\n if (syncRetryCounter < MAX_SYNC_RETRY_ATTEMPTS) {\n syncRetryCounter++;\n }\n return {\n ...state,\n syncRetryCounter,\n };\n default:\n return state;\n }\n};\n","import axios, { AxiosError, AxiosResponse, CancelToken } from \"axios\";\nimport { each, forEach, isEmpty, map } from \"lodash\";\nimport { Dispatch } from \"redux\";\nimport { BASE_URL, SEASONAL_DB } from \"../../config\";\nimport { buildRequest } from \"../../helpers/axios\";\nimport { SyncError, TraplogApiError } from \"../../helpers/errors\";\nimport { sleep } from \"../../helpers/util\";\nimport { MAX_SYNC_RETRY_ATTEMPTS } from \"../../reducers/QueueReducer/QueueReducer\";\nimport { LoginType } from \"../../types/auth\";\nimport {\n OFFLINE_SYNC_CANCEL,\n OFFLINE_SYNC_CLEAR,\n OFFLINE_SYNC_ERROR,\n OFFLINE_SYNC_IN_PROGRESS,\n OFFLINE_SYNC_REMOVE,\n OFFLINE_SYNC_RETRY_FAILURE,\n OFFLINE_SYNC_RETRY_INCREMENT,\n OFFLINE_SYNC_SUCCESS,\n TRAPS_GET_STATUS_ERROR,\n TRAPS_GET_STATUS_IN_PROGRESS,\n TRAPS_GET_STATUS_SUCCESS,\n TRAP_GET_INFO_ERROR,\n TRAP_GET_INFO_IN_PROGRESS,\n TRAP_GET_INFO_SUCCESS,\n TRAP_UPDATE_ERROR,\n TRAP_UPDATE_IN_PROGRESS,\n TRAP_UPDATE_PENDING,\n TRAP_UPDATE_SUCCESS,\n} from \"./ActionTypes\";\n\nexport const PushTrapMonitorRecords = async (\n auth: IAuthReducer,\n traps: ITrapPost[],\n method: \"PUT\" | \"POST\"\n): Promise> => {\n const records = map(traps, (trap) => {\n trap.amount = Number(trap.amount) || 0;\n return trap;\n });\n const headers =\n auth.loginType === LoginType.Credentials\n ? { seasonalDatabase: SEASONAL_DB }\n : { seasonalDatabase: auth.seasonalDatabase };\n const opts = buildRequest(\n method,\n `${BASE_URL}/trap-monitoring-records`,\n { records },\n headers\n );\n const result = await axios(opts);\n return result;\n};\n\nexport const SyncOfflineUpdates = async (\n auth: IAuthReducer,\n queue: IQueueReducer,\n postUpdates: ITrapPost[],\n putUpdates: ITrapPost[]\n) => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: OFFLINE_SYNC_IN_PROGRESS,\n });\n if (queue.loading) {\n dispatch({\n type: OFFLINE_SYNC_CANCEL,\n });\n return;\n }\n const errors: {\n postError?: Error | TraplogApiError;\n putError?: Error | TraplogApiError;\n } = {};\n // Wait 1 seconds for network to come back online\n await sleep(1000);\n // POST updates.\n try {\n let postResult: any = null;\n if (!isEmpty(postUpdates)) {\n postResult = await PushTrapMonitorRecords(auth, postUpdates, \"POST\");\n if (postResult instanceof Error) throw postResult;\n if (!postResult || !postResult.data) {\n throw new Error(\"Invalid response from server\");\n }\n }\n each(postUpdates, (trap, index) => {\n const updateId = postResult.data[index]\n ? postResult.data[index].id\n : null;\n dispatch({\n type: TRAP_UPDATE_SUCCESS,\n payload: {\n trap,\n updateId,\n },\n });\n });\n } catch (err) {\n dispatch({\n type: OFFLINE_SYNC_ERROR,\n });\n errors.postError = new TraplogApiError(\n `${BASE_URL}/trap-monitoring-records`,\n \"Failed to sync\",\n err as AxiosError\n );\n }\n // PUT updates.\n try {\n let putResult: any = null;\n if (!isEmpty(putUpdates)) {\n putResult = await PushTrapMonitorRecords(auth, putUpdates, \"PUT\");\n if (putResult instanceof Error) throw putResult;\n if (!putResult || !putResult.data) {\n throw new Error(\"Invalid response from server\");\n }\n }\n each(putUpdates, (trap, index) => {\n const updateId = putResult.data[index]\n ? putResult.data[index].id\n : null;\n dispatch({\n type: TRAP_UPDATE_SUCCESS,\n payload: {\n trap,\n updateId,\n },\n });\n });\n } catch (err) {\n dispatch({\n type: OFFLINE_SYNC_ERROR,\n });\n errors.putError = new TraplogApiError(\n `${BASE_URL}/trap-monitoring-records`,\n \"Failed to sync\",\n err as AxiosError\n );\n }\n // No errors so success.\n if (!errors.postError && !errors.putError) {\n dispatch({\n type: OFFLINE_SYNC_SUCCESS,\n });\n }\n // Throw error(s) if there are errors to be thrown.\n if (errors.postError || errors.putError) {\n throw new SyncError(errors.postError, errors.putError);\n }\n };\n};\n\nexport const AddTrapMonitorRecord = async (\n auth: IAuthReducer,\n trap: ITrapPost\n) => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: TRAP_UPDATE_IN_PROGRESS,\n });\n try {\n if (trap.method === \"PUT\" && !trap.id) throw new Error(\"PUT_MISSING_ID\");\n const result = await PushTrapMonitorRecords(auth, [trap], trap.method);\n if (!result.data) throw new Error(\"Invalid response from server\");\n const updateId = result.data[0] ? result.data[0].id : null;\n dispatch({\n type: TRAP_UPDATE_SUCCESS,\n payload: {\n trap,\n updateId,\n },\n });\n } catch (err) {\n const error = err as AxiosError;\n if (\n error.message === \"PUT_MISSING_ID\" ||\n (error.response && error.response.status === 422)\n ) {\n throw new Error(\"Unable to update trap. Update ID is not present\");\n }\n dispatch({\n type: TRAP_UPDATE_ERROR,\n payload: {\n error: err,\n update: trap,\n },\n });\n throw new TraplogApiError(\n `${BASE_URL}/trap-monitoring-records`,\n \"Failed to update trap, data stored for later transmission\",\n err as AxiosError\n );\n }\n };\n};\n\nexport const AddManyTrapMonitorRecords = async (\n auth: IAuthReducer,\n traps: ITrapPost[]\n) => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: TRAP_UPDATE_IN_PROGRESS,\n });\n forEach(traps, async (trap) => {\n try {\n if (trap.method === \"PUT\" && !trap.id)\n throw new Error(\"PUT_MISSING_ID\");\n const result = await PushTrapMonitorRecords(auth, [trap], trap.method);\n if (!result.data) throw new Error(\"Invalid response from server\");\n const updateId = result.data[0] ? result.data[0].id : null;\n dispatch({\n type: TRAP_UPDATE_SUCCESS,\n payload: {\n trap,\n updateId,\n },\n });\n } catch (err) {\n const error = err as AxiosError;\n if (\n error.message === \"PUT_MISSING_ID\" ||\n (error.response && error.response.status === 422)\n ) {\n throw new Error(\"Unable to update trap. Update ID is not present\");\n }\n dispatch({\n type: TRAP_UPDATE_ERROR,\n payload: {\n error: err,\n update: trap,\n },\n });\n throw new TraplogApiError(\n `${BASE_URL}/trap-monitoring-records`,\n \"Failed to update trap, data stored for later transmission\",\n err as AxiosError\n );\n }\n });\n };\n};\n\nexport const ClearSyncQueue = () => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: OFFLINE_SYNC_CLEAR,\n });\n };\n};\n\nexport const UpdateTrapCache = (updates: { [key: number]: ITrapPost }) => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: TRAP_UPDATE_PENDING,\n payload: updates,\n });\n };\n};\n\nexport const GetAllTrapStatuses = async (\n auth: IAuthReducer,\n propertyGroup: string\n) => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: TRAPS_GET_STATUS_IN_PROGRESS,\n });\n const url = `${BASE_URL}/property-groups/${propertyGroup}/trap-statuses`;\n try {\n const headers =\n auth.loginType === LoginType.Credentials\n ? { seasonalDatabase: SEASONAL_DB }\n : { seasonalDatabase: auth.seasonalDatabase };\n const opts = buildRequest(\"GET\", url, null, headers);\n const result = await axios(opts);\n if (!result || !result.data)\n throw new Error(\"Invalid response from server\");\n dispatch({\n type: TRAPS_GET_STATUS_SUCCESS,\n payload: {\n data: result.data,\n propertyGroup,\n },\n });\n } catch (err) {\n dispatch({\n type: TRAPS_GET_STATUS_ERROR,\n payload: err,\n });\n throw new TraplogApiError(\n url,\n \"Failed to get trap statuses\",\n err as AxiosError\n );\n }\n };\n};\n\nexport const GetTrapInfo = async (\n auth: IAuthReducer,\n queue: IQueueReducer,\n trapId: string,\n cancelToken?: CancelToken\n) => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: TRAP_GET_INFO_IN_PROGRESS,\n });\n const url = `${BASE_URL}/traps/${trapId}?append[]=LastMonitoredDate&append[]=LastMonitoringRecord`;\n try {\n const headers =\n auth.loginType === LoginType.Credentials\n ? { seasonalDatabase: SEASONAL_DB }\n : { seasonalDatabase: auth.seasonalDatabase };\n const opts = buildRequest(\"GET\", url, null, headers);\n if (cancelToken) {\n opts.cancelToken = cancelToken;\n }\n const result: AxiosResponse = await axios(opts);\n if (result && (result as any).__CANCEL__ === true) return;\n if (!result || !result.data)\n throw new Error(\"Invalid response from server\");\n dispatch({\n type: TRAP_GET_INFO_SUCCESS,\n payload: {\n trap: result.data,\n pendingUpdates: {\n postUpdates: { ...queue.postUpdates },\n putUpdates: { ...queue.putUpdates },\n },\n },\n });\n } catch (err) {\n dispatch({\n type: TRAP_GET_INFO_ERROR,\n payload: err,\n });\n throw new TraplogApiError(\n url,\n \"Failed to get trap info\",\n err as AxiosError\n );\n }\n };\n};\n\nexport const RemoveUpdateFromQueue = (updateId: number) => {\n return async (dispatch: Dispatch) => {\n dispatch({\n type: OFFLINE_SYNC_REMOVE,\n payload: {\n updateId,\n },\n });\n dispatch({\n type: OFFLINE_SYNC_SUCCESS,\n });\n };\n};\n\n/**\n * Returns whether the sync retry limit has been reached.\n * If not, then the counter is incremented.\n *\n * @param queue Queue reducer.\n * @param updates: Object that maps traps IDs to a trap monitoring record for syncing.\n * @returns\n */\nexport const SyncRetry = (\n queue: IQueueReducer,\n updates: {\n [key: string]: ITrapPost;\n }\n) => {\n return async (dispatch: Dispatch) => {\n const syncRetryCount = queue.syncRetryCounter + 1;\n if (syncRetryCount === MAX_SYNC_RETRY_ATTEMPTS) {\n dispatch({\n type: OFFLINE_SYNC_RETRY_FAILURE,\n payload: {\n trapIds: Object.keys(updates),\n },\n });\n return true;\n }\n dispatch({\n type: OFFLINE_SYNC_RETRY_INCREMENT,\n });\n return false;\n };\n};\n","export const TRAP_UPDATE_IN_PROGRESS = \"TRAP_UPDATE_IN_PROGRESS\";\nexport const TRAP_UPDATE_SUCCESS = \"TRAP_UPDATE_SUCCESS\";\nexport const TRAP_UPDATE_ERROR = \"TRAP_UPDATE_ERROR\";\nexport const TRAP_UPDATE_PENDING = \"TRAP_UPDATE_PENDING\";\n\nexport const TRAPS_GET_STATUS_IN_PROGRESS = \"TRAPS_GET_STATUS_IN_PROGRESS\";\nexport const TRAPS_GET_STATUS_SUCCESS = \"TRAPS_GET_STATUS_SUCCESS\";\nexport const TRAPS_GET_STATUS_ERROR = \"TRAPS_GET_STATUS_ERROR\";\n\nexport const TRAP_GET_INFO_SUCCESS = \"TRAP_GET_INFO_SUCCESS\";\nexport const TRAP_GET_INFO_IN_PROGRESS = \"TRAP_GET_INFO_IN_PROGRESS\";\nexport const TRAP_GET_INFO_ERROR = \"TRAP_GET_INFO_ERROR\";\n\nexport const OFFLINE_SYNC_IN_PROGRESS = \"OFFLINE_SYNC_IN_PROGRESS\";\nexport const OFFLINE_SYNC_ERROR = \"OFFLINE_SYNC_ERROR\";\nexport const OFFLINE_SYNC_SUCCESS = \"OFFLINE_SYNC_SUCCESS\"\nexport const OFFLINE_SYNC_CANCEL = \"OFFLINE_SYNC_CANCEL\"\nexport const OFFLINE_SYNC_CLEAR = \"OFFLINE_SYNC_CLEAR\";\nexport const OFFLINE_SYNC_REMOVE = \"OFFLINE_SYNC_REMOVE\";\nexport const OFFLINE_SYNC_RETRY_INCREMENT = \"OFFLINE_SYNC_RETRY_INCREMENT\";\nexport const OFFLINE_SYNC_RETRY_FAILURE = \"OFFLINE_SYNC_RETRY_FAILURE\";\n","import { createContext } from \"react\";\n\nexport interface Theme {\n\ttenantColour: string;\n\ttenantDarkerColour: string;\n}\n\nexport interface IThemeContext {\n\ttheme: Theme;\n\tupdate: (theme: Partial) => void;\n\tclear: () => void;\n}\n\nexport const ThemeContext = createContext(null);","import { useContext } from \"react\";\nimport { IThemeContext, ThemeContext } from \"../contexts/theme\";\n\ninterface IUseGetContext {\n\ttheme: IThemeContext | null;\n}\n\nexport const useGetContext = (): IUseGetContext => {\n\tconst theme = useContext(ThemeContext);\n\n\treturn { theme };\n}","import { useEffect, useState } from \"react\";\n\nconst useLocalStorageState = (key: string, initialValue: T): [T, (value: T) => void] => {\n\tconst [state, setInternalState] = useState(initialValue);\n\n\tuseEffect(() => {\n\t\tconst value = localStorage.getItem(key);\n\n\t\tif (!value) return;\n\n\t\tsetInternalState(JSON.parse(value));\n\t}, [key]);\n\n\tconst setState = (value: T) => {\n\t\tlocalStorage.setItem(key, JSON.stringify(value));\n\t\tsetInternalState(value);\n\t};\n\n\treturn [state, setState];\n}\n\nexport default useLocalStorageState;\n","import { useEffect, useState } from \"react\"\n\nexport const useOnlineStatus = () => {\n const [isOnline, setIsOnline] = useState(window.navigator.onLine)\n const updateNetwork = () => {\n setIsOnline(window.navigator.onLine)\n }\n useEffect(() => {\n window.addEventListener(\"offline\", updateNetwork)\n window.addEventListener(\"online\", updateNetwork)\n return () => {\n window.removeEventListener(\"offline\", updateNetwork)\n window.removeEventListener(\"online\", updateNetwork)\n }\n })\n return isOnline\n}\n","import { isEmpty, map } from \"lodash\";\nimport { toast } from \"react-toastify\";\nimport { ActionCreator } from \"redux\";\nimport { ModalState } from \"../components/common/SyncConflictModal\";\nimport { preSyncFetch } from \"../helpers/axios\";\nimport { SyncError, TraplogApiError } from \"../helpers/errors\";\nimport { logFailedRecords, logTraplogApiError } from \"../helpers/logging\";\n\ninterface SyncOfflineParams {\n queue: IQueueReducer;\n auth: IAuthReducer;\n properties: IPropertyReducer;\n actions: {\n GetAllTrapStatuses: ActionCreator;\n GetPropertyGroup: ActionCreator;\n GetAllLures: ActionCreator;\n GetTrapInfo: ActionCreator;\n UpdateTrapCache: ActionCreator;\n SyncOfflineUpdates: ActionCreator;\n ClearSyncQueue: ActionCreator;\n SyncRetry: ActionCreator;\n };\n setSyncConflictModalState: React.Dispatch>;\n isOnline: boolean;\n}\n\nexport const useSync = () => {\n const handleSyncConflicts = (\n postUpdates: { [key: string]: ITrapPost },\n postError: TraplogApiError | Error | undefined,\n postStatus: number | undefined,\n setSyncConflictModalState: React.Dispatch>\n ) => {\n // Found POST conlifct how display sync conflict modal.\n // Only a POST update can have a conflict.\n if (postStatus === 409) {\n const conflictingRecords = [\n ...(postError as TraplogApiError).data.response?.data\n ?.conflictingRecords,\n ];\n setSyncConflictModalState({\n open: true,\n conflictingRecords,\n remainingRecords: { postUpdates, putUpdates: {} },\n });\n }\n };\n\n const retry = async (\n properties: IPropertyReducer,\n queue: IQueueReducer,\n actions: SyncOfflineParams[\"actions\"],\n updates: { [key: string]: ITrapPost },\n userId: number\n ) => {\n // Get retry state (limit reached or not).\n const retryLimitReached = await actions.SyncRetry(queue, {\n ...updates,\n });\n // Display appropriate error message depending on retry state.\n if (retryLimitReached) {\n await actions.ClearSyncQueue();\n toast.error(`The sync is continuing to fail.`, {\n toastId: 4,\n });\n await logFailedRecords(properties, userId, updates, properties.traps);\n } else {\n const errorMessage =\n queue.syncRetryCounter === 0\n ? \"Sync failed. Use the 'Sync Now' button from the drop-down menu.\"\n : \"Sync failed again. Try again or contact support.\";\n toast.error(errorMessage, {\n toastId: `${queue.syncRetryCounter}-4`,\n });\n }\n };\n\n const handleSyncRetry = async (\n properties: IPropertyReducer,\n queue: IQueueReducer,\n actions: SyncOfflineParams[\"actions\"],\n postUpdates: { [key: string]: ITrapPost },\n putUpdates: { [key: string]: ITrapPost },\n postStatus: number | undefined,\n putStatus: number | undefined,\n userId: number\n ) => {\n if (postStatus === 409 || putStatus === 409) {\n throw new Error(\"An unhandled conflict was found.\");\n }\n // Both POST and PUT updates require a retry.\n if (postStatus && postStatus >= 400 && putStatus && postStatus >= 400) {\n await retry(\n properties,\n queue,\n actions,\n { ...postUpdates, ...putUpdates },\n userId\n );\n } else if (postStatus && postStatus >= 400) {\n // POST updates require a retry.\n await retry(properties, queue, actions, { ...postUpdates }, userId);\n } else if (putStatus && putStatus >= 400) {\n // PUT updates require a retry.\n await retry(properties, queue, actions, { ...putUpdates }, userId);\n } else {\n toast.error(\"Unable to sync trap data, please try again later.\", {\n toastId: 5,\n });\n }\n };\n\n const syncOffline = async ({\n queue,\n auth,\n properties,\n actions,\n setSyncConflictModalState,\n isOnline,\n }: SyncOfflineParams) => {\n const { postUpdates, putUpdates } = queue;\n if (isOnline === true && (!isEmpty(postUpdates) || !isEmpty(putUpdates))) {\n // Get latest data before sync.\n await preSyncFetch(\n auth,\n queue,\n properties,\n {\n ...actions,\n },\n isOnline\n );\n actions\n .SyncOfflineUpdates(auth, queue, map(postUpdates), map(putUpdates))\n .catch(async (err: SyncError) => {\n logTraplogApiError(err as SyncError, isOnline);\n const postError = err.postError;\n const putError = err.putError;\n const postStatus =\n postError instanceof TraplogApiError\n ? postError?.data.response?.status || 400\n : undefined;\n const putStatus =\n putError instanceof TraplogApiError\n ? putError?.data.response?.status || 400\n : undefined;\n // Handle any sync conflicts.\n handleSyncConflicts(\n postUpdates,\n postError,\n postStatus,\n setSyncConflictModalState\n );\n // Handle sync retry for sync failures.\n await handleSyncRetry(\n properties,\n queue,\n actions,\n postUpdates,\n putUpdates,\n postStatus,\n putStatus,\n auth.id\n );\n });\n }\n };\n\n return syncOffline;\n};\n\n","import React, { useEffect, useState } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { Button } from \"reactstrap\";\nimport { useGetContext } from \"../../hooks/useGetContext\";\n\ninterface Props {\n\tonClick: () => void\n}\n\nconst InstallPWAButton = ({ onClick }: Props) => {\n\tconst { theme } = useGetContext();\n\tconst history = useHistory();\n\tconst [supportsPWA, setSupportsPWA] = useState(false);\n\tconst [promptInstall, setPromptInstall] = useState(null);\n\n\tuseEffect(() => {\n\t\tconst handler = (e: any) => {\n\t\t\te.preventDefault();\n\t\t\tsetSupportsPWA(true);\n\t\t\tsetPromptInstall(e);\n\t\t};\n\t\twindow.addEventListener(\"beforeinstallprompt\", handler);\n\n\t\treturn () => window.removeEventListener(\"transitionend\", handler);\n\t}, []);\n\n\tconst onClickInstall = (evt: any) => {\n\t\tevt.preventDefault();\n\t\tif (!promptInstall) {\n\t\t\treturn;\n\t\t}\n\t\tpromptInstall.prompt();\n\t};\n\n\tconst onClickInstructions = async () => {\n\t\thistory.push('/how-to-install');\n\t};\n\n\treturn (\n\t\t {\n\t\t\t\tif (supportsPWA) {\n\t\t\t\t\tonClickInstall(e);\n\t\t\t\t} else {\n\t\t\t\t\tonClickInstructions();\n\t\t\t\t}\n\t\t\t\tonClick();\n\t\t\t}}\n\t\t>\n\t\t\tInstall\n\t\t\n\t);\n};\n\nexport default InstallPWAButton;","import React, { KeyboardEvent, useState } from \"react\";\nimport { GroupBase, SingleValue, StylesConfig, ThemeConfig } from \"react-select\";\nimport CreateableSelect from \"react-select/creatable\";\nimport { LoginType } from \"../../types/auth\";\nimport { PastRuns } from \"../../types/run\";\n\ninterface Props {\n\tpastRuns: PastRuns;\n\tsetPastRuns: (value: PastRuns) => void\n\tstyles?: StylesConfig<{\n\t\tvalue: string;\n\t\tlabel: string;\n\t}, false, GroupBase<{\n\t\tvalue: string;\n\t\tlabel: string;\n\t}>> | undefined\n\ttheme?: ThemeConfig | undefined\n\tonChange: (newValue: SingleValue<{\n\t\tvalue: string;\n\t\tlabel: string;\n\t}>) => void;\n\tloginType: LoginType | null;\n\tloading: boolean;\n\tonCreate: Function;\n}\n\nconst RunNumberSelect = ({\n\tpastRuns,\n\tsetPastRuns,\n\tstyles,\n\ttheme,\n\tonChange,\n\tloginType,\n\tloading,\n\tonCreate\n}: Props) => {\n\tconst [controlPressed, setControlPressed] = useState(false);\n\n\tconst options = pastRuns.map(pr => ({\n\t\tvalue: pr.passcode, label: `${pr.passcode} - ${pr.name}`\n\t}));\n\n\tconst noOptionsMessage = (inputValue: string) => {\n\t\tif (loginType === LoginType.Grower) {\n\t\t\treturn inputValue.length > 0 && inputValue.length < 9 ? 'Too short...' :\n\t\t\t\tinputValue.length > 9 ? 'Too long...' :\n\t\t\t\t\t'No passcodes yet...';\n\t\t} else {\n\t\t\treturn 'No passcodes yet...';\n\t\t}\n\t}\n\n\tconst isValidNewOption = (inputValue: string) => {\n\t\t// Current value does not equal an existing previously inputted value.\n\t\tif (pastRuns.find(pr => pr.passcode === inputValue)) return false;\n\t\tif (loginType === LoginType.Grower) {\n\t\t\treturn inputValue.length === 9;\n\t\t}\n\t\treturn inputValue.length > 0;\n\t}\n\n\tconst handleNumberOnlyInput = async (e: KeyboardEvent) => {\n\t\te.persist();\n\t\tif (e.nativeEvent.code === 'ControlLeft' ||\n\t\t\te.nativeEvent.code === 'ControlRight') {\n\t\t\t// Prevent paste when clipboard isn't a number.\n\t\t\tconst clipboard = await navigator.clipboard.readText();\n\t\t\tif (!/^\\d+$/.test(clipboard)) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetControlPressed(true);\n\t\t\treturn;\n\t\t}\n\t\tif (controlPressed) {\n\t\t\tif (e.nativeEvent.code === 'KeyV') {\n\t\t\t\tsetControlPressed(false)\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (!e.nativeEvent.code.includes('Digit') &&\n\t\t\t!e.nativeEvent.code.includes('Numpad') &&\n\t\t\te.nativeEvent.code !== 'Backspace' &&\n\t\t\te.nativeEvent.code !== 'ArrowLeft' &&\n\t\t\te.nativeEvent.code !== 'ArrowRight') {\n\t\t\te.preventDefault();\n\t\t}\n\t};\n\n\treturn (\n {\n onChange(newValue);\n }}\n placeholder={\n loginType === LoginType.Credentials\n ? \"Enter run number to get started...\"\n : \"Enter a passcode to get started...\"\n }\n formatCreateLabel={(inputValue) => \"Start run with - \" + inputValue}\n isValidNewOption={isValidNewOption}\n onCreateOption={(value) => {\n return onCreate(value);\n }}\n noOptionsMessage={({ inputValue }) => noOptionsMessage(inputValue)}\n isDisabled={loading}\n isClearable\n onKeyDown={handleNumberOnlyInput}\n />\n );\n};\n\nexport default RunNumberSelect;","import { forEach } from \"lodash\";\nimport React from \"react\";\nimport { connect } from \"react-redux\";\nimport { toast } from \"react-toastify\";\nimport { Button, Col, Modal, ModalBody, ModalHeader, Row } from \"reactstrap\";\nimport { ActionCreator, compose } from \"redux\";\nimport {\n ClearSyncQueue,\n PushTrapMonitorRecords,\n} from \"../../actions/traps/Traps\";\nimport { logFailedRecords, logTraplogApiError } from \"../../helpers/logging\";\nimport { useOnlineStatus } from \"../../hooks/useOnlineStatus\";\nimport \"../../styles/SyncConflictModal.scss\";\n\nexport type ModalState = {\n open: boolean;\n conflictingRecords: { record: ITrapPost; conflictingRecord: ITrapPost[] }[];\n remainingRecords: {\n postUpdates: { [key: string]: ITrapPost };\n putUpdates: { [key: string]: ITrapPost };\n };\n};\n\ninterface Props {\n modalState: [ModalState, React.Dispatch>];\n auth: IAuthReducer;\n properties: IPropertyReducer;\n ClearSyncQueue: ActionCreator;\n}\n\nconst SyncConflictModal = ({\n modalState,\n auth,\n properties,\n ClearSyncQueue,\n}: Props) => {\n const isOnline = useOnlineStatus();\n const [state, setState] = modalState;\n const open = state.open;\n const conflictingRecords = state.conflictingRecords;\n const remainingRecords = state.remainingRecords;\n\n const setOpen = (open: boolean) => {\n setState({ ...state, open });\n };\n\n return (\n \n Resolve Conflict\n \n \n \n
Someone has already monitorered this trap today.
\n

Would you like to overwrite the existing monitoring data?

\n \n
\n \n \n {\n // Overwrite existing record using PUT request(s).\n const putUpdates: ITrapPost[] = [];\n forEach(conflictingRecords, async (cr) => {\n const failingRecord = cr.record;\n const conflictingRecord = {\n ...failingRecord,\n id: cr.conflictingRecord[0].id,\n };\n putUpdates.push(conflictingRecord);\n });\n // Add remaining records (non-conflicting records) to be updated.\n for (const trapId of Object.keys(remainingRecords.putUpdates)) {\n const update = remainingRecords.putUpdates[trapId];\n putUpdates.push(update);\n }\n // Send the update request.\n if (putUpdates.length > 0) {\n try {\n await PushTrapMonitorRecords(auth, putUpdates, \"PUT\");\n ClearSyncQueue();\n } catch (err) {\n logTraplogApiError(err as Error, isOnline);\n ClearSyncQueue();\n toast.error(\"Failed to overwrite record(s).\");\n const updates: { [key: string]: ITrapPost } = {};\n putUpdates.forEach((update) => {\n if (!update.id) return;\n updates[update.id] = update;\n });\n await logFailedRecords(properties, auth.id, updates, properties.traps);\n }\n }\n setOpen(false);\n }}\n >\n Yes\n \n \n \n {\n // No overwrite so clear queue.\n ClearSyncQueue();\n setOpen(false);\n }}\n >\n No\n \n \n \n
\n
\n );\n};\n\nconst mapStateToProps = ({\n auth,\n properties,\n}: {\n auth: IAuthReducer;\n properties: IPropertyReducer;\n}) => {\n return {\n auth,\n properties,\n };\n};\n\nexport default compose>>(\n connect(mapStateToProps, {\n ClearSyncQueue,\n })\n)(SyncConflictModal);\n","import { isEmpty, size } from \"lodash\";\nimport moment from \"moment\";\nimport React, { useEffect, useState } from \"react\";\nimport { Detector } from \"react-detect-offline\";\nimport Icon from \"react-icons-kit\";\nimport {\n arrowLeft,\n menu,\n refreshCcw,\n wifi,\n wifiOff,\n x,\n} from \"react-icons-kit/feather\";\nimport { connect } from \"react-redux\";\nimport { useHistory, withRouter } from \"react-router-dom\";\nimport { SingleValue } from \"react-select\";\nimport { toast } from \"react-toastify\";\nimport {\n Badge,\n Button,\n Col,\n Collapse,\n Form,\n FormGroup,\n Label,\n Nav,\n NavLink,\n Navbar,\n NavbarBrand,\n NavbarText,\n Row,\n} from \"reactstrap\";\nimport { compose } from \"redux\";\nimport packageJson from \"../../../package.json\";\nimport { Logout } from \"../../actions/auth/Auth\";\nimport { GetAllLures } from \"../../actions/lures/Lures\";\nimport { GetPropertyGroup } from \"../../actions/properties/Properties\";\nimport { FindRun, UpdateRunNumber } from \"../../actions/runs/Runs\";\nimport {\n ClearSyncQueue,\n GetAllTrapStatuses,\n GetTrapInfo,\n SyncOfflineUpdates,\n SyncRetry,\n UpdateTrapCache,\n} from \"../../actions/traps/Traps\";\nimport { TraplogApiError } from \"../../helpers/errors\";\nimport { logTraplogApiError } from \"../../helpers/logging\";\nimport { formatTenantName, hardReload } from \"../../helpers/util\";\nimport { useGetContext } from \"../../hooks/useGetContext\";\nimport useLocalStorageState from \"../../hooks/useLocalStorageState\";\nimport { useOnlineStatus } from \"../../hooks/useOnlineStatus\";\nimport { useSync } from \"../../hooks/useSync\";\nimport \"../../styles/Header.scss\";\nimport { LoginType } from \"../../types/auth\";\nimport { PastRuns } from \"../../types/run\";\nimport InstallPWAButton from \"./InstallPWAButton\";\nimport RunNumberSelect from \"./RunNumberSelect\";\nimport SyncConflictModal, { ModalState } from \"./SyncConflictModal\";\n\nconst Header: React.FC = (props: HeaderProps) => {\n const { hideBackButton } = props;\n const [open, setOpen] = useState(false);\n const [syncConflictModalState, setSyncConflictModalState] = useState({\n open: false,\n conflictingRecords: [],\n remainingRecords: { postUpdates: {}, putUpdates: {} },\n } as ModalState);\n const [formLoading, setFormLoading] = useState(false);\n const [syncing, setSyncing] = useState(false);\n const [clickCount, setClickCount] = useState(1);\n const [clickTimeout, setClickTimeout] = useState<\n NodeJS.Timeout | undefined\n >();\n const history = useHistory();\n const { theme } = useGetContext();\n const [pastRuns, setPastRuns] = useLocalStorageState(\n \"pastRuns\",\n JSON.parse(localStorage.getItem(\"pastRuns\") || \"[]\") as PastRuns\n );\n const isOnline = useOnlineStatus();\n const syncOffline = useSync();\n\n // Set state when header open to update runs selector.\n useEffect(() => {\n if (open) {\n setPastRuns(\n JSON.parse(localStorage.getItem(\"pastRuns\") || \"[]\") as PastRuns\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n const tenantName = props.auth.tenantName;\n const loginType = props.auth.loginType;\n\n const toggleMenu = () => {\n setOpen(!open);\n };\n\n const logout = () => {\n history.push(\"/logout\");\n };\n\n const updateRun = async (runNumber: string | null) => {\n setFormLoading(true);\n try {\n const data = await props.FindRun(props.auth, runNumber);\n const propertyGroup = data.property_group;\n const group = data?.property_group_id;\n if (!group) throw new Error(`Could not load run number ${runNumber}`);\n if (!pastRuns.find((pr) => pr.passcode === data.passcode)) {\n setPastRuns([\n ...pastRuns,\n {\n passcode: data.passcode,\n name: propertyGroup.name,\n description: propertyGroup.description,\n },\n ]);\n }\n props.UpdateRunNumber(runNumber);\n setFormLoading(false);\n history.push(`/property-group/${group}`);\n toggleMenu();\n } catch (err) {\n logTraplogApiError(err as Error, isOnline);\n if (err instanceof TraplogApiError) {\n const error = err.data;\n if (error.response && error.response.status) {\n const numberString =\n loginType === LoginType.Credentials ? \"run number\" : \"passcode\";\n switch (error.response.status) {\n case 403: {\n const errorMessage = `You don't have access to this ${numberString}`;\n toast.error(errorMessage, {\n toastId: 3,\n });\n break;\n }\n case 404: {\n const errorMessage =\n runNumber !== \"\"\n ? `Unable to find ${numberString} ${runNumber}.\\nPlease try again.`\n : `Please enter a ${numberString}.`;\n toast.error(errorMessage, {\n toastId: 3,\n });\n break;\n }\n case 429:\n toast.error(\n `Too many attempts. Please wait a while and try again.`,\n {\n toastId: 3,\n }\n );\n break;\n default:\n toast.error(\n

\n An unknown error has occurred. If this happens again please\n contact support. (Error code: TA1000)\n

,\n { autoClose: false }\n );\n break;\n }\n } else if (error) {\n toast.error(error.message);\n }\n } else {\n toast.error(\n

\n An unknown error has occurred. If this happens again please contact\n support. (Error code: TA1010)\n

,\n { autoClose: false }\n );\n }\n }\n setFormLoading(false);\n };\n\n const isRoot = window.location.pathname === \"/\";\n\n const onChangeSelect = (\n newValue: SingleValue<{ value: string; label: string }>\n ) => {\n const value = newValue?.value.trim();\n props.UpdateRunNumber(value || \"\");\n };\n\n const goBack = (e: React.MouseEvent) => {\n // stop event bubbling to parent.\n e.stopPropagation();\n e.preventDefault();\n // Typing is a bit broken for this lib, so have to cast as any.\n (history as any).goBack();\n };\n\n const renderBackButton = () => {\n return (\n \n \n \n );\n };\n\n const syncOfflineUpdates = async (isOnline: boolean) => {\n setSyncing(true);\n syncOffline({\n queue: props.queue,\n auth: props.auth,\n properties: props.properties,\n actions: {\n GetAllTrapStatuses: props.GetAllTrapStatuses,\n GetPropertyGroup: props.GetPropertyGroup,\n GetAllLures: props.GetAllLures,\n GetTrapInfo: props.GetTrapInfo,\n UpdateTrapCache: props.UpdateTrapCache,\n SyncOfflineUpdates: props.SyncOfflineUpdates,\n ClearSyncQueue: props.ClearSyncQueue,\n SyncRetry: props.SyncRetry,\n },\n setSyncConflictModalState,\n isOnline,\n });\n setSyncing(false);\n };\n\n const onTripleClick = (fn: (...args: any) => void) => {\n setClickCount(clickCount + 1);\n if (clickTimeout) clearTimeout(clickTimeout);\n setClickTimeout(\n setTimeout(() => {\n setClickCount(1);\n }, 2500)\n );\n if (clickCount === 3) {\n fn();\n localStorage.setItem(\"pastRuns\", JSON.stringify([]));\n setClickCount(1);\n if (clickTimeout) clearTimeout(clickTimeout);\n }\n };\n\n const loggedInUser = () => {\n return props.auth.loginType === LoginType.Credentials\n ? props.auth.name || \"Unknown user\"\n : props.auth.tenantName\n ? `${formatTenantName(props.auth.tenantName)} Grower`\n : \"Unknown Grower\";\n };\n\n return (\n
\n \n {\n const onlineClass = online ? \"online\" : \"offline\";\n const onlineIcon = online ? wifi : wifiOff;\n const menuIcon = open ? x : menu;\n return (\n <>\n \n
\n \n {!isRoot && !hideBackButton && renderBackButton()}\n \n
\n \n
\n
\n   Trappa\n
\n \n
\n \n \n \n \n \n
\n \n
\n ({\n ...base,\n color: \"white\",\n }),\n }}\n theme={(_theme) => ({\n ..._theme,\n borderRadius: 0,\n colors: {\n ..._theme.colors,\n neutral0:\n theme?.theme.tenantDarkerColour || \"#451408\",\n primary25:\n theme?.theme.tenantDarkerColour || \"#451408\",\n primary: theme?.theme.tenantColour || \"#222\",\n neutral50:\n tenantName === \"nzap\" ? \"white\" : \"#fcc6b8\",\n neutral80: \"white\",\n neutral90: \"white\",\n },\n })}\n onChange={onChangeSelect}\n loginType={loginType}\n loading={formLoading}\n onCreate={(value: string) => {\n return updateRun(value);\n }}\n />\n
\n
\n updateRun(props.run.number)}\n disabled={isEmpty(props.run.number) || formLoading}\n >\n Start\n \n \n \n
\n
\n \n \n
\n onTripleClick(props.ClearSyncQueue)}\n >\n {isEmpty(props.queue.postUpdates) &&\n isEmpty(props.queue.putUpdates) ? (\n
\n

Up to date

\n
\n ) : (\n
\n

\n {size(props.queue.postUpdates) +\n size(props.queue.putUpdates)}{\" \"}\n trap(s) to sync\n

\n
\n )}\n
\n

\n Last Sync:{\" \"}\n \n {props.queue.lastSync\n ? moment(props.queue.lastSync).fromNow()\n : \"Never\"}\n \n

\n
\n \n syncOfflineUpdates(online)}\n disabled={\n (isEmpty(props.queue.postUpdates) &&\n isEmpty(props.queue.putUpdates)) ||\n !online ||\n syncing\n }\n >\n {props.queue.loading ? (\n <>Syncing...\n ) : (\n <>\n Sync Now\n \n )}\n \n \n \n
\n \n \n {\n setOpen(false);\n }}\n />\n \n \n
\n
\n

\n You are logged in as:{\" \" + loggedInUser()}\n

\n \n Logout\n \n
\n onTripleClick(hardReload)}\n >\n Trappa v{packageJson.version}\n \n
\n \n \n );\n }}\n />\n
\n );\n};\n\nconst mapStateToProps = ({\n run,\n auth,\n queue,\n properties,\n}: {\n run: IRunReducer;\n auth: IAuthReducer;\n queue: IQueueReducer;\n properties: IPropertyReducer;\n}) => {\n return {\n run,\n auth,\n queue,\n properties,\n };\n};\n\nexport default compose>>(\n withRouter,\n connect(mapStateToProps, {\n FindRun,\n UpdateRunNumber,\n Logout,\n SyncOfflineUpdates,\n ClearSyncQueue,\n GetAllTrapStatuses,\n GetPropertyGroup,\n GetAllLures,\n GetTrapInfo,\n UpdateTrapCache,\n SyncRetry,\n })\n)(Header);\n","import '../styles/Wrapper.scss';\nimport { Col, Row } from 'reactstrap';\nimport { RouteComponentProps } from 'react-router-dom';\nimport React from 'react';\nimport { ToastContainer } from \"react-toastify\";\nimport \"react-toastify/dist/ReactToastify.css\";\nimport Header from '../components/common/Header';\n\nconst AppWithNavbar: React.FC = (props) => {\n const { children, hideBackButton } = props;\n return (\n
\n
\n \n \n
\n
{children}
\n
\n \n
\n \n
\n );\n}\n\nexport default AppWithNavbar","import React from 'react';\nimport { Spinner } from \"reactstrap\";\nimport '../../styles/LoadingPage.scss';\n\nconst LoadingPage: React.FC = () => {\n return (\n
\n
\n \n
\n
\n );\n};\n\nexport default LoadingPage;\n","import { intersection } from \"lodash\";\nimport React, { useEffect, useState } from \"react\";\nimport { connect } from \"react-redux\";\nimport { Route, useHistory } from \"react-router-dom\";\nimport { toast } from \"react-toastify\";\nimport { compose } from \"redux\";\nimport { GetUser } from \"../actions/auth/Auth\";\nimport { GetAllLures } from \"../actions/lures/Lures\";\nimport { GetPropertyGroup } from \"../actions/properties/Properties\";\nimport {\n ClearSyncQueue,\n GetAllTrapStatuses,\n GetTrapInfo,\n SyncOfflineUpdates,\n SyncRetry,\n UpdateTrapCache,\n} from \"../actions/traps/Traps\";\nimport LoadingPage from \"../components/common/LoadingPage\";\nimport SyncConflictModal, {\n ModalState,\n} from \"../components/common/SyncConflictModal\";\nimport { LoginError } from \"../helpers/errors\";\nimport { useOnlineStatus } from \"../hooks/useOnlineStatus\";\nimport { useSync } from \"../hooks/useSync\";\n\n// A wrapper for that redirects to the login\n// screen if you're not yet authenticated or if auth is not\n// yet loaded\nconst RequireAuth: React.FC = (props) => {\n const { children, auth, queue, ...rest } = props;\n const history = useHistory();\n const isOnline = useOnlineStatus();\n const [syncConflictModalState, setSyncConflictModalState] = useState({\n open: false,\n conflictingRecords: [],\n remainingRecords: { postUpdates: {}, putUpdates: {} },\n } as ModalState);\n const syncOffline = useSync();\n\n useEffect(() => {\n if (!auth.loading && auth.isAuthenticated && !auth.isPopulated) {\n props.GetUser().catch((error: Error | LoginError) => {\n toast.error(error.message);\n });\n }\n }, [auth, props]);\n\n useEffect(() => {\n syncOffline({\n queue: props.queue,\n auth: props.auth,\n properties: props.properties,\n actions: {\n GetAllTrapStatuses: props.GetAllTrapStatuses,\n GetPropertyGroup: props.GetPropertyGroup,\n GetAllLures: props.GetAllLures,\n GetTrapInfo: props.GetTrapInfo,\n UpdateTrapCache: props.UpdateTrapCache,\n SyncOfflineUpdates: props.SyncOfflineUpdates,\n ClearSyncQueue: props.ClearSyncQueue,\n SyncRetry: props.SyncRetry,\n },\n setSyncConflictModalState,\n isOnline,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOnline]);\n\n return (\n {\n if (!auth.isAuthenticated && auth.loading) {\n return (\n <>\n \n \n \n );\n }\n if (auth.isAuthenticated) {\n return (\n <>\n \n {children}\n \n );\n }\n // Redirect to the grower login page if the domain\n // contains a valid tenant.\n const domains = window.location.hostname.split(\".\");\n const validTenants = auth.validTenants;\n const intersec = intersection(domains, validTenants);\n if (intersec.length > 0) {\n const tenantName = intersec[0];\n const growerLoginURI = `/${tenantName}/grower-login`;\n if (history.location.pathname !== growerLoginURI)\n history.push(growerLoginURI);\n else history.push(\"/login\");\n } else {\n history.push(\"/login\");\n }\n }}\n />\n );\n};\n\nconst mapStateToProps = ({\n auth,\n queue,\n properties,\n}: {\n auth: IAuthReducer;\n queue: IQueueReducer;\n properties: IPropertyReducer;\n}) => {\n return { auth, queue, properties };\n};\n\nexport default compose>>(\n connect(mapStateToProps, {\n GetUser,\n SyncOfflineUpdates,\n GetAllTrapStatuses,\n GetPropertyGroup,\n GetAllLures,\n GetTrapInfo,\n UpdateTrapCache,\n ClearSyncQueue,\n SyncRetry,\n })\n)(RequireAuth);\n","import { Route } from \"react-router-dom\";\nimport React, { useEffect } from \"react\";\nimport RequireAuth from \"./RequireAuth\";\nimport { UpdateTrapCache } from \"../actions/traps/Traps\";\nimport { connect } from \"react-redux\";\n\nconst RouteWithLayout: React.FC = (props) => {\n const { layout, component, requiresAuth, ...rest } = props;\n useEffect(() => {\n const updates: { [key:number]: ITrapPost } = { ...props.queue.postUpdates, ...props.queue.putUpdates };\n props.UpdateTrapCache(updates);\n }, [props])\n return (\n {\n if (requiresAuth) {\n return (\n \n {React.createElement(\n layout,\n {...props, ...rest},\n React.createElement(component, props)\n )}\n \n );\n }\n return React.createElement(\n layout,\n {...props, ...rest},\n React.createElement(component, props)\n );\n }}\n />\n );\n};\n\nconst mapStateToProps = ({ queue }: { queue: IQueueReducer }) => {\n return { queue };\n}\n\nexport default connect(mapStateToProps, { UpdateTrapCache })(RouteWithLayout);\n","import { Theme } from \"../contexts/theme\";\n\nexport const nzapTheme: Theme = {\n\ttenantColour: '#4e5b6a',\n\ttenantDarkerColour: '#3a4e63',\n}\n\nexport const defaultTheme: Theme = {\n\ttenantColour: '',\n\ttenantDarkerColour: '',\n}\n\nexport const emptyTheme: Theme = {\n\ttenantColour: '',\n\ttenantDarkerColour: '',\n}","import React, { useState } from \"react\";\nimport { emptyTheme } from \"../helpers/themes\";\nimport { IThemeContext, Theme, ThemeContext } from \"./theme\";\n\ninterface Props {\n\tchildren: JSX.Element | JSX.Element[];\n}\n\nconst ContextProvider = ({ children }: Props) => {\n\tconst themeLocalStorage = localStorage.getItem('theme');\n\tconst initalThemeValue: Theme = themeLocalStorage ?\n\t\tJSON.parse(themeLocalStorage) : emptyTheme\n\tconst [themeValue, setThemeValue] = useState(initalThemeValue);\n\n\tconst initialTheme: IThemeContext = {\n\t\ttheme: themeValue,\n\t\tupdate(theme: Partial) {\n\t\t\tconst newTheme: Theme = { ...themeValue };\n\t\t\tif (theme.tenantColour) newTheme.tenantColour = theme.tenantColour;\n\t\t\tif (theme.tenantDarkerColour) newTheme.tenantDarkerColour = theme.tenantDarkerColour;\n\t\t\tsetThemeValue(newTheme);\n\t\t\tlocalStorage.setItem('theme', JSON.stringify(newTheme));\n\t\t},\n\t\tclear() {\n\t\t\tlocalStorage.setItem('theme', JSON.stringify(emptyTheme));\n\t\t\tsetThemeValue(emptyTheme)\n\t\t}\n\t}\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t)\n}\n\nexport default ContextProvider;","import {\n AUTH_GET_USER_ERROR,\n AUTH_GET_USER_IN_PROGRESS,\n AUTH_GET_USER_SUCCESS,\n AUTH_LOGIN_ERROR,\n AUTH_LOGIN_IN_PROGRESS,\n AUTH_LOGIN_SUCCESS,\n AUTH_LOGOUT\n} from \"../../actions/auth/ActionTypes\";\n\nconst generateInitialState = (): IAuthReducer => {\n // Let's try see if we can get a token from localStorage;\n const accessToken = localStorage.getItem('accessToken');\n const refreshToken = localStorage.getItem('refreshToken');\n const state: IAuthReducer = {\n loginType: null,\n validTenants: ['nzap'],\n tenantName: '',\n service: '',\n seasonalDatabase: '',\n loading: false,\n isAuthenticated: !!accessToken,\n isPopulated: false,\n error: null,\n access: null,\n accessToken: accessToken,\n refreshToken: refreshToken,\n id: 0,\n created_at: '',\n updated_at: '',\n name: '',\n email: '',\n email_verified_at: '',\n remember_token: null,\n role_id: 0,\n deleted_at: null,\n api_token: null,\n send_reports: 0,\n role: {\n id: 0,\n created_at: '',\n updated_at: '',\n name: '',\n description: '',\n }\n }\n return state;\n}\n\nconst INIT = generateInitialState();\n\nexport default (state = INIT, action: any): IAuthReducer => {\n switch (action.type) {\n case AUTH_LOGOUT:\n localStorage.removeItem(\"accessToken\");\n localStorage.removeItem(\"refreshToken\");\n const newState = generateInitialState();\n return { ...newState };\n case AUTH_GET_USER_IN_PROGRESS:\n return {\n ...state,\n loading: true,\n }\n case AUTH_LOGIN_IN_PROGRESS:\n return {\n ...INIT,\n loading: true,\n };\n case AUTH_LOGIN_SUCCESS:\n localStorage.setItem(\"accessToken\", action.payload.accessToken);\n localStorage.setItem(\"accessTokenExpires\", action.payload.expires);\n localStorage.setItem(\"refreshToken\", action.payload.refreshToken);\n return {\n ...state,\n loginType: action.payload.loginType,\n tenantName: action.payload.tenantName,\n service: action.payload.service,\n seasonalDatabase: action.payload.seasonalDatabase,\n loading: false,\n error: null,\n isAuthenticated: true,\n name: action.payload.name,\n access: action.payload.access,\n accessToken: action.payload.accessToken,\n refreshToken: action.payload.refreshToken,\n };\n case AUTH_GET_USER_SUCCESS:\n return {\n ...state,\n loading: false,\n error: null,\n isPopulated: true,\n ...action.payload\n };\n case AUTH_LOGIN_ERROR:\n case AUTH_GET_USER_ERROR:\n return {\n ...state,\n loading: false,\n error: action.payload,\n isAuthenticated: false,\n name: '',\n accessToken: null,\n refreshToken: null,\n };\n default:\n return state;\n }\n};\n","import { chain, each, find, keyBy, map } from \"lodash\";\nimport moment from \"moment\";\nimport {\n LURES_FETCH_ERROR,\n LURES_FETCH_IN_PROGRESS,\n LURES_FETCH_SUCCESS,\n} from \"../../actions/lures/ActionTypes\";\nimport {\n PROPERTYGROUP_FETCH_ERROR,\n PROPERTYGROUP_FETCH_IN_PROGRESS,\n PROPERTYGROUP_FETCH_SUCCESS,\n SELECT_PROPERTY,\n SELECT_TRAP,\n} from \"../../actions/properties/ActionTypes\";\nimport {\n OFFLINE_SYNC_CLEAR,\n OFFLINE_SYNC_REMOVE,\n OFFLINE_SYNC_RETRY_FAILURE,\n OFFLINE_SYNC_SUCCESS,\n TRAPS_GET_STATUS_ERROR,\n TRAPS_GET_STATUS_IN_PROGRESS,\n TRAPS_GET_STATUS_SUCCESS,\n TRAP_GET_INFO_SUCCESS,\n TRAP_UPDATE_ERROR,\n TRAP_UPDATE_PENDING,\n TRAP_UPDATE_SUCCESS,\n} from \"../../actions/traps/ActionTypes\";\n\nconst generateInitialState = (): IPropertyReducer => {\n const state: IPropertyReducer = {\n loading: false,\n error: null,\n properties: {},\n lures: {},\n traps: {},\n updates: {}, // track update id's against trap ids\n activeProperty: null,\n activeTrap: null,\n };\n return state;\n};\n\nconst INIT = generateInitialState();\n\nexport default (state = INIT, action: any): IPropertyReducer => {\n switch (action.type) {\n case PROPERTYGROUP_FETCH_IN_PROGRESS:\n case LURES_FETCH_IN_PROGRESS:\n case TRAPS_GET_STATUS_IN_PROGRESS:\n return {\n ...state,\n loading: true,\n };\n case PROPERTYGROUP_FETCH_SUCCESS:\n // We have to cast it to unknown to avoid assigning raw values twice\n // and avoid it giving us compiler errors for mapping arrays to objects\n const properties = keyBy(action.payload, \"id\") as unknown as {\n [key: string]: IProperty;\n };\n return {\n ...state,\n loading: true,\n properties,\n };\n case PROPERTYGROUP_FETCH_ERROR:\n case LURES_FETCH_ERROR:\n case TRAPS_GET_STATUS_ERROR:\n return {\n ...state,\n loading: false,\n error: action.payload,\n };\n case SELECT_PROPERTY:\n return {\n ...state,\n activeProperty: action.payload,\n };\n case SELECT_TRAP:\n if (action.payload.id === state.activeTrap?.id) return { ...state };\n return {\n ...state,\n activeTrap: action.payload,\n };\n case LURES_FETCH_SUCCESS:\n const mappedLures = map(action.payload, (lure: ILure) => {\n try {\n const insects = keyBy(lure.insects, \"pivot.trap_lure_id\");\n return {\n ...lure,\n insects,\n };\n } catch (err) {\n console.error(err);\n }\n });\n const lures = keyBy(mappedLures, \"id\") as unknown as {\n [key: string]: ILure;\n };\n return {\n ...state,\n loading: false,\n lures,\n };\n case OFFLINE_SYNC_CLEAR:\n case OFFLINE_SYNC_SUCCESS:\n const clearedTraps: { [key: string]: ITrap } = {};\n each(state.traps, (trap, id) => {\n clearedTraps[id] = { ...trap, update_pending: false };\n });\n return {\n ...state,\n traps: clearedTraps,\n };\n case OFFLINE_SYNC_REMOVE:\n const _updateId = action.payload.updateId;\n const updatedTraps: { [key: string]: ITrap } = {};\n each(state.traps, (trap, id) => {\n if (Number(id) === _updateId) {\n updatedTraps[id] = { ...trap, update_pending: false };\n } else {\n updatedTraps[id] = trap;\n }\n });\n return { ...state, traps: updatedTraps };\n case TRAPS_GET_STATUS_SUCCESS:\n const data = action.payload.data as ITrap[];\n const traps = chain(data)\n .map((trap) => {\n const updated = moment(trap?.last_monitored_date);\n // If our cached version is newer than the server, keep the cached version\n const cached = moment(state.traps[trap.id]?.last_monitored_date);\n\n if (cached.isAfter(updated) && state.traps[trap.id]) {\n return state.traps[trap.id];\n }\n const today = moment();\n const updatedToday = trap?.last_monitored_date\n ? updated.isSame(today, \"day\")\n : false;\n // Arguably updates cannot happen in the future, so\n // if an update is not today, it is yesterday or older,\n // and we can assume it is due.\n trap.status = {\n due: !updatedToday,\n done: updatedToday,\n };\n const existingTrap = state.traps[trap.id] || {};\n return { ...existingTrap, ...trap };\n })\n .compact()\n .keyBy(\"id\")\n .value();\n const currentActiveTrap = find(traps, (trap) => {\n return trap.id === state.activeTrap?.id;\n });\n return {\n ...state,\n loading: false,\n traps,\n activeTrap: {\n ...state.activeTrap,\n status: currentActiveTrap?.status || { due: true, done: false },\n } as IActiveTrap,\n };\n case TRAP_GET_INFO_SUCCESS:\n const trapInfo: IGetTrapPayload = action.payload.trap;\n const last: ITrapMonitorRecord = trapInfo.LastMonitoringRecord;\n const lastUpdate = moment(trapInfo.LastMonitoredDate, \"YYYY-MM-DD\");\n const today = moment();\n const pendingPostUpdates = action.payload.pendingUpdates.postUpdates;\n const pendingPutUpdates = action.payload.pendingUpdates.putUpdates;\n const hasPendingUpdates =\n pendingPostUpdates[trapInfo.id] || pendingPutUpdates[trapInfo.id];\n // If the last updated day is not today then reset form.\n if (!lastUpdate.isSame(today, \"day\") && !hasPendingUpdates) {\n const activeTrap: any = {\n ...state.traps[trapInfo.id],\n operator: last?.operator,\n location: {\n latitude: last?.location?.coordinates[0] || 0,\n longitude: last?.location?.coordinates[1] || 0,\n },\n code: trapInfo.code,\n charged_at: trapInfo.charged_at,\n created_at: trapInfo.created_at,\n deleted_at: trapInfo.deleted_at,\n id: trapInfo.id,\n update_id: last?.id,\n location_description: trapInfo.location_description,\n name: trapInfo.name,\n setup_at: trapInfo.setup_at,\n trap_lure_id: trapInfo.trap_lure_id,\n trapping_zone_id: trapInfo.trapping_zone_id,\n updated_at: last?.updated_at,\n last_monitored_date: lastUpdate.format(\"YYYY-MM-DD\"),\n update_pending: false,\n visited_at: last?.visited_at,\n visited_date: last?.visited_date,\n amount: 0,\n lure_changed: false,\n base_changed: false,\n comments: \"\",\n status: {\n due: true,\n done: false,\n },\n };\n return {\n ...state,\n activeTrap,\n traps: {\n ...state.traps,\n [Number(activeTrap.id)]: activeTrap,\n },\n };\n }\n if (!state.activeTrap || hasPendingUpdates) return { ...state };\n const activeTrap: IActiveTrap = {\n ...state.activeTrap,\n operator: last?.operator,\n location: {\n latitude: last?.location?.coordinates[0] || 0,\n longitude: last?.location?.coordinates[1] || 0,\n },\n charged_at: trapInfo.charged_at,\n created_at: trapInfo.created_at,\n deleted_at: trapInfo.deleted_at,\n id: trapInfo.id,\n update_id: last?.id,\n location_description: trapInfo.location_description,\n name: trapInfo.name,\n setup_at: trapInfo.setup_at,\n trap_lure_id: trapInfo.trap_lure_id,\n trapping_zone_id: trapInfo.trapping_zone_id,\n updated_at: last?.updated_at,\n amount: last?.amount,\n update_pending: state.activeTrap?.update_pending ? true : false,\n last_monitored_date: lastUpdate.format(\"YYYY-MM-DD\"),\n comments: last?.comments,\n base_changed: last?.base_changed > 0,\n lure_changed: last?.lure_changed > 0,\n visited_at: last?.visited_at,\n visited_date: last?.visited_date,\n };\n return {\n ...state,\n activeTrap: activeTrap,\n traps: {\n ...state.traps,\n [Number(activeTrap.id)]: activeTrap,\n },\n };\n case TRAP_UPDATE_PENDING:\n const updates = action.payload as { [key: number]: ITrapPost };\n const cachedTraps: { [key: number]: IActiveTrap } = {};\n each(updates, (update, id) => {\n const updatedTrap: IActiveTrap = {\n ...state.traps[update.trap_id],\n amount: update.amount,\n update_pending: true,\n update_id: Number(id),\n visited_date: update.visited_date,\n visited_at: update.visited_at,\n lure_changed: update.lure_changed,\n base_changed: update.base_changed,\n operator: update.operator,\n comments: update.comments || \"\",\n location: update.location,\n last_base_changed_date: moment().format(\"YYYY-MM-DD\"),\n last_lure_changed_date: moment().format(\"YYYY-MM-DD\"),\n last_monitored_date: moment().format(\"YYYY-MM-DD\"),\n status: {\n due: false,\n done: true,\n },\n };\n cachedTraps[Number(id)] = updatedTrap;\n });\n return {\n ...state,\n traps: {\n ...state.traps,\n ...cachedTraps,\n },\n };\n case TRAP_UPDATE_ERROR:\n case TRAP_UPDATE_SUCCESS:\n const update: ITrapPost = action.payload.error\n ? action.payload.update\n : action.payload.trap;\n const updateId: number | undefined = action.payload.updateId;\n const updatedTrap: IActiveTrap = {\n ...state.traps[update.trap_id],\n amount: update.amount,\n update_pending: action.payload.error ? true : false,\n update_id: Number(updateId),\n visited_date: update.visited_date,\n visited_at: update.visited_at,\n lure_changed: update.lure_changed,\n base_changed: update.base_changed,\n operator: update.operator,\n comments: update.comments || \"\",\n location: update.location,\n last_base_changed_date: moment().format(\"YYYY-MM-DD\"),\n last_lure_changed_date: moment().format(\"YYYY-MM-DD\"),\n last_monitored_date: moment().format(\"YYYY-MM-DD\"),\n status: {\n due: false,\n done: true,\n },\n };\n const existing =\n state.updates && state.updates[updatedTrap.last_monitored_date]\n ? state.updates[updatedTrap.last_monitored_date]\n : {};\n return {\n ...state,\n traps: {\n ...state.traps,\n [update.trap_id]: updatedTrap,\n },\n activeTrap: updatedTrap,\n updates: {\n [updatedTrap.last_monitored_date]: {\n ...existing,\n [updatedTrap.id]:\n updateId ||\n (state.updates[updatedTrap.last_monitored_date]\n ? state.updates[updatedTrap.last_monitored_date][updatedTrap.id]\n : undefined),\n },\n },\n };\n case OFFLINE_SYNC_RETRY_FAILURE:\n // Set 'status' of 'traps' specified in 'trapsIds' to due.\n const trapsToSetAsDue = action.payload.trapIds as Array;\n const newTraps = {} as { [key: string]: ITrap };\n for (const trapId of Object.keys(state.traps)) {\n const trap = state.traps[trapId];\n const status = trapsToSetAsDue.includes(trap.id.toString())\n ? {\n done: false,\n due: true,\n }\n : trap.status;\n newTraps[trapId] = { ...trap, status };\n }\n return {\n ...state,\n traps: newTraps,\n };\n default:\n return state;\n }\n};\n","import {\n RUN_FETCH_IN_PROGRESS,\n RUN_FETCH_SUCCESS,\n RUN_FETCH_ERROR,\n RUN_UPDATE_NUMBER,\n RUN_RESET,\n} from \"../../actions/runs/ActionTypes\";\n\nconst generateInitialState = (): IRunReducer => {\n const state: IRunReducer = {\n loading: false,\n error: null,\n run: null,\n number: '',\n };\n return state;\n};\n\nconst INIT = generateInitialState();\n\nexport default (state = INIT, action: any): IRunReducer => {\n switch (action.type) {\n case RUN_RESET:\n return {\n ...INIT,\n };\n case RUN_UPDATE_NUMBER:\n return {\n ...state,\n number: action.payload,\n };\n case RUN_FETCH_IN_PROGRESS:\n return {\n ...INIT,\n number: state.number,\n loading: true,\n };\n case RUN_FETCH_SUCCESS:\n return {\n ...state,\n loading: false,\n run: action.payload,\n };\n case RUN_FETCH_ERROR:\n return {\n ...state,\n loading: false,\n error: action.payload,\n };\n default:\n return state;\n }\n};\n","import { UI_LOG_SCROLL } from \"../../actions/ui/ActionTypes\";\n\nconst generateInitialState = (): IUIReducer => {\n const state: IUIReducer = {\n scrollTop: {},\n };\n return state;\n};\n\nconst INIT = generateInitialState();\n\nexport default (state = INIT, action: any): IUIReducer => {\n switch (action.type) {\n case UI_LOG_SCROLL:\n return {\n ...state,\n scrollTop: {\n ...state.scrollTop,\n [action.payload.page]: action.payload.scrollTop,\n },\n };\n\n default:\n return state;\n }\n};\n","import { combineReducers } from 'redux';\nimport AuthReducer from './AuthReducer/AuthReducer';\nimport PropertyReducer from \"./PropertyReducer/PropertyReducer\";\nimport QueueReducer from \"./QueueReducer/QueueReducer\";\nimport RunReducer from \"./RunReducer/RunReducer\";\nimport UIReducer from \"./UIReducer/UIReducer\";\nconst rootReducer = combineReducers({\n auth: AuthReducer,\n run: RunReducer,\n properties: PropertyReducer,\n queue: QueueReducer,\n ui: UIReducer,\n});\n\nexport default rootReducer;\n","export const UI_LOG_SCROLL = \"UI_LOG_SCROLL\";\n","import { ApmBase, init as initApm } from \"@elastic/apm-rum\"\n\n// Initialises the APM agent as soon as this module is imported.\nconst apm = initApm({\n serviceName: process.env.REACT_APP_APM_SERVICE_NAME,\n serverUrl: process.env.REACT_APP_APM_URL,\n distributedTracingOrigins: [\n // Remove '/api' from URLs.\n process.env.REACT_APP_TRAPLOG_AUTH_URL!.slice(0, -4),\n process.env.REACT_APP_TRAPLOG_BASE_URL!.slice(0, -4),\n process.env.REACT_APP_TRAPLOG_BASE_URL!.slice(0, -4),\n process.env.REACT_APP_PROPERTIES_BASE_URL!.slice(0, -4),\n ],\n environment: process.env.REACT_APP_ENVIRONMENT,\n});\n\n/**\n * Associates the current APM session with the currently authenticated user.\n *\n * @param apm Current APM object.\n * @param userId Current user ID.\n * @param tenantName Current user tenant name.\n * @param loginType Current user login type.\n */\nexport function setupApmUser(\n apm: ApmBase,\n userId: number | undefined,\n tenantName: string | null,\n loginType: LoginType | null\n) {\n apm.setUserContext({\n id: `${loginType}-${tenantName}-${userId}`,\n })\n}\n\nexport default apm\n","import React, { useEffect } from \"react\"\nimport { connect } from \"react-redux\"\nimport apm, { setupApmUser } from \"../rum\"\n\ninterface Props {\n auth: IAuthReducer\n}\n\nconst Apm = ({ auth }: Props) => {\n // Associate user ID with logs.\n useEffect(\n () =>\n setupApmUser(\n apm,\n auth.id,\n // If no loginType then null. If loginType is 'grower'\n // then 'auth.tenantName' otherwise 'fruition'.\n !auth.loginType\n ? null\n : auth.loginType === \"grower\"\n ? auth.tenantName\n : \"fruition\",\n auth.loginType\n ),\n [auth.id, auth.tenantName, auth.loginType]\n )\n\n return <>\n}\n\nconst mapStateToProps = ({ auth }: { auth: IAuthReducer }) => {\n return { auth }\n}\nexport default connect(mapStateToProps)(Apm)\n","import React from 'react';\nimport ReactGA from 'react-ga4';\nimport { useLocation, withRouter } from 'react-router-dom';\n\nconst GoogleAnalytics = () => {\n\tconst location = useLocation();\n\tconst path = location.pathname + location.search;\n\n\tif (\n\t\tprocess.env.NODE_ENV === 'production' ||\n\t\tprocess.env.REACT_APP_ENVIRONMENT === 'production'\n\t) {\n\t\tReactGA.send({ hitType: 'pageview', page: path });\n\t}\n\n\treturn <>;\n};\n\nexport default withRouter(GoogleAnalytics);","import { noop } from \"lodash\";\nimport React from \"react\";\nimport Icon, { IconProp } from \"react-icons-kit\";\nimport { Button } from \"reactstrap\";\n\nconst _renderIcon = (icon: IconProp) => {\n if (!icon) {\n return false;\n }\n return (\n
\n {\" \"}\n
\n );\n};\n\nconst ToastButton: React.FC = ({\n action,\n icon,\n label,\n}: ToastButtonProps) => {\n return (\n \n );\n};\n\nexport default ToastButton;\n","import { TenantInfo } from \"../types/auth\";\n\nconst nzap: TenantInfo = {\n\tsupport: {\n\t\temail: 'info@applesandpears.nz',\n\t\tphone: '06 8737080'\n\t},\n\tpages: {\n\t\trunNumber: {\n\t\t\tsupportAlert: {\n\t\t\t\ttext: 'Passcodes are created in the NZAP Weather & Disease Portal under Trapping > Mobile Monitoring App.'\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const getTenantInfo = (tenantName: string): TenantInfo | undefined => {\n\tswitch (tenantName) {\n\t\tcase 'nzap':\n\t\t\treturn nzap\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}","import React from \"react\";\nimport { Col, Row } from \"reactstrap\";\nimport { getTenantInfo } from \"../../helpers/tenantInfo\";\nimport { formatTenantName } from \"../../helpers/util\";\nimport { TenantInfo } from \"../../types/auth\";\n\ninterface Props {\n\ttenantName: string\n}\n\nconst Footer = ({ tenantName }: Props) => {\n\tconst tenantInfo: TenantInfo | undefined = getTenantInfo(tenantName);\n\n\treturn (\n\t\t<>\n\t\t\t{tenantInfo ? (\n\t\t\t\t<>\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{`For support contact ${formatTenantName(tenantName)}:`}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{tenantInfo?.support.phone}
\n\t\t\t\t\t\t\t
{tenantInfo?.support.email}
\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\n\t\t\t) : null}\n\t\t\n\t)\n}\n\nexport default Footer;","import React from \"react\";\nimport { useGetContext } from \"../../hooks/useGetContext\";\n\ninterface Props {\n\tchildren: JSX.Element | JSX.Element[];\n\ttenant?: string;\n}\n\nconst GrowerLoginLayout = ({ children, tenant }: Props) => {\n\tconst { theme } = useGetContext();\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t{children}\n\t\t\t\"\"\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\t)\n}\n\nexport default GrowerLoginLayout;","import React from \"react\";\nimport { Col, Row } from \"reactstrap\";\n\nconst InvalidTenantPage = () => {\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t

Invalid Grower

\n\t\t\t\t\n\t\t\t
\n\t\t\t\n\n\t\t\t\n\t\t\t\"\"\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\t)\n}\n\nexport default InvalidTenantPage;","import { isEqual } from \"lodash\";\nimport React, { useEffect } from \"react\";\nimport { connect } from \"react-redux\";\nimport { useHistory, useParams } from \"react-router-dom\";\nimport { toast } from \"react-toastify\";\nimport { Button, Col, Row } from \"reactstrap\";\nimport { compose } from \"redux\";\nimport { GrowerLogin } from \"../../actions/auth/Auth\";\nimport { getTenantLoginOptions } from \"../../helpers/auth\";\nimport { nzapTheme } from \"../../helpers/themes\";\nimport { updateTenantTheme } from \"../../helpers/util\";\nimport { useGetContext } from \"../../hooks/useGetContext\";\nimport \"../../styles/GrowerLoginPage.scss\";\nimport ToastButton from \"../common/ToastButton\";\nimport Footer from \"./Footer\";\nimport GrowerLoginLayout from \"./GrowerLoginLayout\";\nimport InvalidTenantPage from \"./InvalidTenantPage\";\n\nconst GrowerLoginPage: React.FC = (\n props: IGrowerLoginPageProps\n) => {\n const history = useHistory();\n const params = useParams();\n const { theme } = useGetContext();\n\n const tenantName = params.tenant;\n const validTenants = props.auth.validTenants;\n const isValidTenant = validTenants.includes(tenantName);\n\n useEffect(() => {\n // If the current theme is not equal to the theme to set.\n if (!isEqual(theme?.theme, nzapTheme)) {\n updateTenantTheme(theme, nzapTheme, tenantName);\n }\n }, [theme, tenantName]);\n\n useEffect(() => {\n if (props.auth.isAuthenticated && !props.auth.loading) {\n history.push(\"/\");\n }\n }, [history, props.auth]);\n\n const doLogin = async () => {\n try {\n const loginOptions = getTenantLoginOptions(tenantName);\n await props.GrowerLogin(loginOptions);\n } catch (err) {\n toast.error(\n (err as Error).message || (\n

\n An unknown error has occurred. If this happens again please contact\n support. (Error code: TA1030)\n

\n ),\n {\n toastId: 1,\n autoClose: false,\n closeButton: ,\n }\n );\n }\n };\n\n if (isValidTenant) {\n return (\n \n <>\n \n \n

Trappa

\n \n
\n \n \n
\n Codling Moth Sensitive Market Trap Monitoring App\n
\n \n
\n \n \n \n {props.auth.loading ? \"Authenticating...\" : \"Start Monitoring\"}\n \n \n \n