{"version":3,"sources":["utilities/parseISODuration.js","utilities/convertMicrosecondTimestampToDate.js","utilities/convertOfferCriteriaIntoRuleCriteria.js","utilities/convertISODuration.js","utilities/convertDateToMicrosecondTimestamp.js","utilities/convertRuleCriteriaIntoOfferCriteria.js","utilities/calculateTag.js","utilities/convertMoney.js","utilities/convertSubscriptionType.js","utilities/formatAddress.js","utilities/convertToStartCase.js","utilities/formatBreadcrumb.js","utilities/formatCardScheme.js","utilities/formatPaymentMethod.js","utilities/getRetailers.js","utilities/removeObjFalseyValues.js","utilities/capitalize.js","utilities/transformName.js","utilities/convertDateToAtomFormat.js","utilities/convertAtomDateToMomentFormat.js","utilities/convertStampTargetsAmounts.js","utilities/base64Encode.js","utilities/base64Decode.js","data/missingTransactionTags.js","constants.js","ducks/logout.js","ducks/retailGroups.js","components/ARSpinner/ARSpinner.js","components/LoginForm/LoginForm.js","services/zorro/auth.js","services/tokenRefresh.js","images/logo-ar.svg","pages/Login.js","router/routes.js","App.js","registerServiceWorker.js","index.js","ducks/brands.js","ducks/rootReducer.js","store.js","ducks/auth.js","services/api.js"],"names":["ISODuration","allTimeUnits","parse","Object","entries","find","timeUnit","timestamp","dateFormat","date","toDate","Number","moment","criteria","map","criterion","criterion_type","value","brand_id","days","retailGroupID","retail_group_id","start","index_start","end","index_end","criterion_subtype","unit","parseISODuration","transacted_within","amount","not_transacted_within","start_date","end_date","convertMicrosecondTimestampToDate","threshold","currency","startTime","start_time","endTime","end_time","minBoostLevel","minimum_boost_level","maxBoostLevel","maximum_boost_level","registered_within","channel","network_id","maxSpendAmount","max_spend","minSpendAmount","min_spend","spendAmountCurrency","time_window","timeValue","betweenDates","time","formatISODuration","getTime","Date","toFixed","toString","__version","convertToISODuration","convertDateToMicrosecondTimestamp","filter","item","tag","missingTransactionTags","currencySymbol","subscription","address","keys","key","n","join","text","startCase","match","convertToStartCase","scheme","paymentMethod","retailers","retailer","title","id","obj","objCopy","undefined","length","charAt","toUpperCase","slice","toLowerCase","firstName","lastName","capitalize","format","targets","type","Array","isArray","target","payout_value","string","TypeError","window","btoa","encodedString","atob","color","userLogout","localStorage","clear","INITIAL_STATE","retailGroups","retailGroupsLoading","reducer","state","action","payload","setRetailGroups","setRetailGroupsLoading","loading","antIcon","LoadingOutlined","style","fontSize","spin","ARSpinner","classNames","full","push","indicator","className","FormItem","Item","LoginForm","props","hasApiError","authLoading","handleInputFocus","apiErrorMessage","handleSubmit","onFinish","name","rules","required","message","onFocus","prefix","UserOutlined","placeholder","LockOutlined","htmlType","refreshAuthToken","postNoBrand","setAuthToStore","auth","store","dispatch","setAuth","refreshTokenTimer","refreshToken","token","tokenRefreshTime","jwt_decode","exp","Math","floor","now","setTimeout","max","a","refreshedToken","refreshedAuth","data","response","status","initRefreshToken","Login","useState","isAuthLoading","setIsAuthLoading","setHasApiError","setApiErrorMessage","useDispatch","search","useLocation","useEffect","includes","error","values","destroy","postNoAuth","res","brands","setBrands","setCurrentBrand","align","justify","height","span","src","ARLogo","alt","display","margin","width","maxWidth","Dashboard","lazy","Routes","currentBrand","useSelector","getNextRedirect","searchParams","URLSearchParams","location","decodedNextQuery","get","base64Decode","pathname","query","to","fallback","exact","path","render","base64Encode","App","setLoading","getItem","JSON","Boolean","hostname","ReactDOM","document","getElementById","navigator","serviceWorker","ready","then","registration","unregister","setItem","stringify","appReducer","combineReducers","rootReducer","createStore","endpoint","process","getHeaders","Authorization","getState","axios","defaults","headers","post","indexOf","interceptors","use","request","Promise","reject","getBrand","currentState","defaultBrand","localCurrentBrand","url","config","getNoBrand","args","patchNoBrand","patch","deleteNoBrand","delete","put","putNoBrand"],"mappings":"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","file":"static/js/main.6d55a27a.chunk.js","sourcesContent":["import { parse } from 'iso8601-duration';\n\nexport default (ISODuration) => {\n const allTimeUnits = parse(ISODuration);\n const arrayOfAllTimeUnits = Object.entries(allTimeUnits);\n\n return arrayOfAllTimeUnits.find((timeUnit) => timeUnit[1] > 0);\n};\n","import { toDate } from 'date-fns';\nimport moment from 'moment';\n\nexport default (timestamp, dateFormat = 'DD/MM/YYYY') => {\n const date = toDate(Number(timestamp * 1000));\n\n return moment(date, dateFormat);\n};\n","import parseISODuration from './parseISODuration';\nimport convertMicrosecondTimestampToDate from './convertMicrosecondTimestampToDate';\n\nexport default (criteria) =>\n criteria.map((criterion) => {\n switch (criterion.criterion_type) {\n case 'member_brand':\n return {\n criterion_type: 'member_brand',\n value: criterion.brand_id,\n };\n case 'day_of_the_week':\n return {\n criterion_type: 'day_of_the_week',\n value: criterion.days,\n };\n case 'member_retail_group_index':\n return {\n criterion_type: 'member_retail_group_index',\n value: {\n retailGroupID: criterion.retail_group_id,\n start: criterion.index_start,\n end: criterion.index_end,\n },\n };\n case 'member_not_transacted_at_retail_group_recently':\n return {\n criterion_type: 'member_not_transacted',\n criterion_subtype: 'member_not_transacted_at_retail_group_recently',\n value: {\n retailGroupID: criterion.retail_group_id,\n unit: parseISODuration(criterion.transacted_within)[0],\n amount: parseISODuration(criterion.transacted_within)[1],\n },\n };\n case 'member_not_transacted_recently':\n return {\n criterion_type: 'member_not_transacted',\n criterion_subtype: 'member_not_transacted_recently',\n value: {\n unit: parseISODuration(criterion.not_transacted_within)[0],\n amount: parseISODuration(criterion.not_transacted_within)[1],\n },\n };\n case 'member_transacted_at_retail_group_recently':\n return {\n criterion_type: 'member_transacted_at_retail_group_recently',\n value: {\n retailGroupID: criterion.retail_group_id,\n unit: parseISODuration(criterion.transacted_within)[0],\n amount: parseISODuration(criterion.transacted_within)[1],\n },\n };\n case 'period_of_time':\n return {\n criterion_type: 'period_of_time',\n value: [criterion.start_date, criterion.end_date].map((date) =>\n convertMicrosecondTimestampToDate(date)\n ),\n };\n case 'member_offer_visibility_period':\n return {\n criterion_type: 'member_offer_visibility_period',\n value: [criterion.start_date, criterion.end_date].map((date) =>\n convertMicrosecondTimestampToDate(date)\n ),\n };\n case 'minimum_spend_criterion':\n return {\n criterion_type: 'minimum_spend_criterion',\n value: {\n amount: criterion.threshold.amount / 100,\n currency: criterion.threshold.currency,\n },\n };\n case 'time_of_day':\n return {\n criterion_type: 'time_of_day',\n value: {\n startTime: criterion.start_time,\n endTime: criterion.end_time,\n },\n };\n case 'member_minimum_boost_level':\n return {\n criterion_type: 'member_minimum_boost_level',\n value: {\n minBoostLevel: criterion.minimum_boost_level,\n },\n };\n case 'member_maximum_boost_level':\n return {\n criterion_type: 'member_maximum_boost_level',\n value: {\n maxBoostLevel: criterion.maximum_boost_level,\n },\n };\n case 'member_registered_recently':\n return {\n criterion_type: 'member_registered',\n criterion_subtype: 'member_registered_recently',\n value: {\n unit: parseISODuration(criterion.registered_within)[0],\n amount: parseISODuration(criterion.registered_within)[1],\n },\n };\n case 'channel':\n return {\n criterion_type: 'channel',\n value: criterion.channel,\n };\n case 'member_network':\n return {\n criterion_type: 'member_network',\n value: criterion.network_id,\n };\n case 'member_retail_group_average_spend_value':\n return {\n criterion_type: 'member_retail_group_average_spend_value',\n value: {\n maxSpendAmount: criterion.max_spend.amount / 100,\n minSpendAmount: criterion.min_spend.amount / 100,\n spendAmountCurrency: criterion.max_spend.currency,\n retailGroupID: criterion.retail_group_id,\n timeUnit: parseISODuration(criterion.time_window)[0],\n timeValue: parseISODuration(criterion.time_window)[1],\n },\n };\n case 'member_registration_date':\n return {\n criterion_type: 'member_registered',\n criterion_subtype: 'member_registration_date',\n value: {\n betweenDates: [\n convertMicrosecondTimestampToDate(criterion.start_date),\n convertMicrosecondTimestampToDate(criterion.end_date),\n ],\n },\n };\n default:\n return null;\n }\n });\n","import { formatISODuration } from 'date-fns';\n\nexport default (unit, time) => formatISODuration({ [unit]: time });\n","import { getTime } from 'date-fns';\n\nexport default (date) => {\n const timestamp = getTime(new Date(date));\n\n return (timestamp / 1000).toFixed(6).toString();\n};\n","import convertToISODuration from './convertISODuration';\nimport convertDateToMicrosecondTimestamp from './convertDateToMicrosecondTimestamp';\n\nexport default (criteria) =>\n criteria\n .map((criterion) => {\n switch (criterion.criterion_type) {\n case 'member_brand':\n return {\n criterion_type: 'member_brand',\n __version: 1,\n brand_id: criterion.value,\n };\n case 'day_of_the_week':\n return {\n criterion_type: 'day_of_the_week',\n __version: 1,\n days: criterion.value,\n };\n case 'member_retail_group_index':\n return {\n criterion_type: 'member_retail_group_index',\n __version: 1,\n retail_group_id: criterion.value.retailGroupID,\n index_start: criterion.value.start,\n index_end: criterion.value.end,\n };\n\n case 'member_not_transacted':\n if (\n criterion.criterion_subtype ===\n 'member_not_transacted_at_retail_group_recently'\n ) {\n return {\n criterion_type: 'member_not_transacted_at_retail_group_recently',\n __version: 1,\n retail_group_id: criterion.value.retailGroupID,\n transacted_within: convertToISODuration(\n criterion.value.unit,\n criterion.value.amount\n ),\n };\n }\n\n if (\n criterion.criterion_subtype === 'member_not_transacted_recently'\n ) {\n return {\n criterion_type: 'member_not_transacted_recently',\n __version: 1,\n not_transacted_within: convertToISODuration(\n criterion.value.unit,\n criterion.value.amount\n ),\n };\n }\n\n return null;\n case 'member_transacted_at_retail_group_recently':\n return {\n criterion_type: 'member_transacted_at_retail_group_recently',\n __version: 1,\n retail_group_id: criterion.value.retailGroupID,\n transacted_within: convertToISODuration(\n criterion.value.unit,\n criterion.value.amount\n ),\n };\n case 'minimum_spend_criterion':\n return {\n criterion_type: 'minimum_spend_criterion',\n __version: 1,\n threshold: {\n amount: criterion.value.amount * 100,\n currency: criterion.value.currency,\n },\n };\n case 'period_of_time':\n return {\n criterion_type: 'period_of_time',\n __version: 1,\n start_date: convertDateToMicrosecondTimestamp(criterion.value[0]),\n end_date: convertDateToMicrosecondTimestamp(criterion.value[1]),\n };\n case 'member_offer_visibility_period':\n return {\n criterion_type: 'member_offer_visibility_period',\n __version: 1,\n start_date: convertDateToMicrosecondTimestamp(criterion.value[0]),\n end_date: convertDateToMicrosecondTimestamp(criterion.value[1]),\n };\n case 'time_of_day':\n return {\n criterion_type: 'time_of_day',\n __version: 1,\n start_time: criterion.value.startTime,\n end_time: criterion.value.endTime,\n };\n case 'member_minimum_boost_level':\n return {\n criterion_type: 'member_minimum_boost_level',\n __version: 1,\n minimum_boost_level: criterion.value.minBoostLevel,\n };\n case 'member_maximum_boost_level':\n return {\n criterion_type: 'member_maximum_boost_level',\n __version: 1,\n maximum_boost_level: criterion.value.maxBoostLevel,\n };\n\n case 'member_registered':\n if (criterion.criterion_subtype === 'member_registration_date') {\n return {\n criterion_type: 'member_registration_date',\n __version: 1,\n start_date: convertDateToMicrosecondTimestamp(\n criterion.value.betweenDates[0]\n ),\n end_date: convertDateToMicrosecondTimestamp(\n criterion.value.betweenDates[1]\n ),\n };\n }\n\n if (criterion.criterion_subtype === 'member_registered_recently') {\n return {\n criterion_type: 'member_registered_recently',\n __version: 1,\n registered_within: convertToISODuration(\n criterion.value.unit,\n criterion.value.amount\n ),\n };\n }\n\n return null;\n case 'channel':\n return {\n criterion_type: 'channel',\n __version: 1,\n channel: criterion.value,\n };\n case 'member_network':\n return {\n criterion_type: 'member_network',\n __version: 1,\n network_id: criterion.value,\n };\n case 'member_retail_group_average_spend_value':\n return {\n criterion_type: 'member_retail_group_average_spend_value',\n __version: 1,\n retail_group_id: criterion.value.retailGroupID,\n min_spend: {\n amount: criterion.value.minSpendAmount * 100,\n currency: criterion.value.spendAmountCurrency,\n },\n max_spend: {\n amount: criterion.value.maxSpendAmount * 100,\n currency: criterion.value.spendAmountCurrency,\n },\n time_window: convertToISODuration(\n criterion.value.timeUnit,\n criterion.value.timeValue\n ),\n };\n default:\n return null;\n }\n })\n .filter((item) => item !== null);\n","import { find } from 'lodash';\nimport missingTransactionTags from '../data/missingTransactionTags';\n\nexport default (tag) => find(missingTransactionTags, { value: tag });\n","export default (amount, currency = 'GBP') => {\n let currencySymbol = '£';\n\n if (currency === 'EUR') currencySymbol = '€';\n\n return `${currencySymbol}${(amount / 100).toFixed(2)}`;\n};\n","export default (subscription) => {\n if (subscription === 'POSTPAID') return 'Pay Monthly';\n if (subscription === 'PREPAID') return 'Pay As You Go';\n\n return null;\n};\n","export default (address) =>\n Object.keys(address)\n .map((key) => address[key])\n .filter((n) => n)\n .join(', ');\n","import { startCase } from 'lodash';\n\nexport default (text) => startCase(text);\n","import convertToStartCase from './convertToStartCase';\n\nexport default (text) => {\n const breadcrumbIsUuid = text.match(\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n );\n\n if (breadcrumbIsUuid) return text;\n\n return convertToStartCase(text);\n};\n","export default (scheme) => {\n if (scheme === 'MASTERCARD') return 'Mastercard';\n if (scheme === 'VISA') return 'Visa';\n if (scheme === 'AMEX') return 'American Express';\n\n return scheme;\n};\n","export default (paymentMethod) => {\n if (paymentMethod === 'GOOGLE_PAY') return 'google pay';\n if (paymentMethod === 'APPLE_PAY') return 'apple pay';\n if (paymentMethod === 'CARD') return 'card';\n\n return paymentMethod;\n};\n","export default (retailers) =>\n retailers.map((retailer) => ({\n text: retailer.title,\n value: retailer.id,\n }));\n","export default (obj) => {\n const objCopy = { ...obj };\n\n // remove null values\n /* eslint-disable */\n for (let key in objCopy) {\n if (\n objCopy[key] === null ||\n objCopy[key] === undefined ||\n objCopy[key].length === 0\n ) {\n delete objCopy[key];\n }\n }\n\n /* eslint-enable */\n return objCopy;\n};\n","export default (text) =>\n text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();\n","import capitalize from './capitalize';\n\nexport default (firstName, lastName) => {\n if (!firstName && !lastName) return null;\n\n if (firstName && lastName) {\n return `${capitalize(firstName)} ${capitalize(lastName)}`;\n }\n\n return firstName ? capitalize(firstName) : capitalize(lastName);\n};\n","import { format } from 'date-fns';\n\nexport default (date) => format(new Date(date), \"yyyy-MM-dd'T'HH:mm:ssxxx\");\n","import moment from 'moment';\n\nexport default (date, dateFormat = 'DD/MM/YYYY') =>\n moment(new Date(date), dateFormat);\n","/**\n * A function that converts the payout_value amounts in\n * an array of reward target objects.\n *\n * @param {array} targets - An array of reward target objects\n * @param {string} type - Must be 'pounds' or 'pence'.\n *\n * @return {array} - A new array with the payout_value amounts\n * converted to the relevant type.\n */\nexport default (targets, type) => {\n if (!Array.isArray(targets)) return [];\n\n return targets.map((target) => {\n let { amount } = target.payout_value;\n\n if (type === 'pounds') amount /= 100;\n if (type === 'pence') amount *= 100;\n\n return {\n ...target,\n payout_value: {\n ...target.payout_value,\n amount,\n },\n };\n });\n};\n","/**\n * Encodes a string to base64.\n *\n * @param {string} - A string to be encoded to base64\n * @return {string} - A base64 encoded string\n */\nexport default (string) => {\n if (typeof string !== 'string') {\n throw new TypeError('Parameter is not a string');\n }\n\n return window.btoa(string);\n};\n","/**\n * Decodes a base64 encoded string.\n *\n * @param {string} - A base64 string to be decoded\n * @return {string} - A decoded string\n */\nexport default (encodedString) => {\n if (typeof encodedString !== 'string') {\n throw new TypeError('Parameter is not a string');\n }\n\n return window.atob(encodedString);\n};\n","import * as constants from '../constants';\n\nexport default [\n {\n text: 'MID not provisioned',\n value: constants.API_RESPONSE_MID_NOT_PROVISIONED,\n color: 'red',\n },\n {\n text: 'Outlet information unknown',\n value: constants.API_RESPONSE_OUTLET_INFORMATION_UNKNOWN,\n color: 'cyan',\n },\n {\n text: 'Query Transaction',\n value: constants.API_RESPONSE_QUERY_TRANSACTION,\n color: 'purple',\n },\n {\n text: 'Aged - write off',\n value: constants.API_RESPONSE_AGED_WRITE_OFF,\n color: 'blue',\n },\n {\n text: 'Admin error - write off',\n value: constants.API_RESPONSE_ADMIN_ERROR_WRITE_OFF,\n color: 'green',\n },\n {\n text: 'MID not tracking',\n value: constants.API_RESPONSE_MID_NOT_TRACKING,\n color: 'gold',\n },\n {\n text: 'Queried with user',\n value: constants.API_RESPONSE_QUERIED_WITH_USER,\n color: 'magenta',\n },\n {\n text: 'MID previously tracked',\n value: constants.API_RESPONSE_MID_PREVIOUSLY_TRACKED,\n color: 'lime',\n },\n];\n","export const API_RESPONSE_MID_NOT_PROVISIONED = 'MID_NOT_PROVISIONED';\nexport const API_RESPONSE_OUTLET_INFORMATION_UNKNOWN =\n 'OUTLET_INFORMATION_UNKNOWN';\nexport const API_RESPONSE_QUERY_TRANSACTION = 'QUERY_TRANSACTION';\nexport const API_RESPONSE_AGED_WRITE_OFF = 'AGED_WRITE_OFF';\nexport const API_RESPONSE_ADMIN_ERROR_WRITE_OFF = 'ADMIN_ERROR_WRITE_OFF';\nexport const API_RESPONSE_MID_NOT_TRACKING = 'MID_NOT_TRACKING';\nexport const API_RESPONSE_QUERIED_WITH_USER = 'QUERIED_WITH_USER';\nexport const API_RESPONSE_MID_PREVIOUSLY_TRACKED = 'MID_PREVIOUSLY_TRACKED';\n","const USER_LOGOUT = 'USER_LOGOUT';\n\nexport default function userLogout() {\n localStorage.clear();\n\n return { type: USER_LOGOUT };\n}\n","const SET_RETAIL_GROUPS = 'SET_RETAIL_GROUPS';\nconst SET_RETAIL_GROUPS_LOADING = 'SET_RETAIL_GROUPS_LOADING';\nconst INITIAL_STATE = {\n retailGroups: [],\n retailGroupsLoading: true,\n};\n\nexport default function reducer(state = INITIAL_STATE, action) {\n switch (action.type) {\n case 'SET_RETAIL_GROUPS':\n return { ...state, retailGroups: action.payload };\n case 'SET_RETAIL_GROUPS_LOADING':\n return { ...state, retailGroupsLoading: action.payload };\n default:\n return state;\n }\n}\n\nexport const setRetailGroups = (retailGroups) => {\n return { type: SET_RETAIL_GROUPS, payload: retailGroups };\n};\n\nexport const setRetailGroupsLoading = (loading) => {\n return { type: SET_RETAIL_GROUPS_LOADING, payload: loading };\n};\n","import React from 'react';\nimport { Spin } from 'antd';\nimport { LoadingOutlined } from '@ant-design/icons';\n\nimport './ARSpinner.scss';\n\nconst antIcon = ;\n\nconst ARSpinner = ({ full }) => {\n const classNames = ['ar-spinner'];\n\n if (full) classNames.push('ar-spinner--full');\n\n return ;\n};\n\nexport default ARSpinner;\n","import React from 'react';\nimport { Input, Button, Form } from 'antd';\nimport { LockOutlined, UserOutlined } from '@ant-design/icons';\nimport ARSpinner from '../ARSpinner/ARSpinner';\nimport './LoginForm.scss';\n\nconst FormItem = Form.Item;\n\nconst LoginForm = (props) => {\n const {\n hasApiError,\n authLoading,\n handleInputFocus,\n apiErrorMessage,\n handleSubmit,\n } = props;\n\n return (\n
\n \n }\n placeholder=\"Email Address\"\n />\n \n \n }\n type=\"password\"\n placeholder=\"Password\"\n />\n \n \n {hasApiError === true && (\n {apiErrorMessage}\n )}\n\n \n \n {authLoading && }\n \n );\n};\n\nexport default LoginForm;\n","import { postNoBrand } from '../api';\n\nconst authRefreshTokenEndpoint = '/partner/auth/refresh-token';\n\nexport const refreshAuthToken = () => postNoBrand(authRefreshTokenEndpoint);\n\nexport default refreshAuthToken;\n","import jwt_decode from 'jwt-decode';\nimport { setAuth } from '../ducks/auth';\nimport { refreshAuthToken } from './zorro/auth';\nimport store from '../store';\n\nconst setAuthToStore = (auth) => store.dispatch(setAuth(auth));\n\nconst timeTillTokenExpires = (token) => {\n const tokenExpiry = jwt_decode(token).exp;\n const dateNow = Math.floor(Date.now() / 1000);\n\n return (tokenExpiry - dateNow) * 1000;\n};\n\nconst refreshTokenTimer = (auth, refreshToken) => {\n const tokenRefreshTime = timeTillTokenExpires(auth.token);\n const tokenRefreshTimeBuffer = 120000;\n\n setTimeout(() => {\n refreshToken(auth);\n }, Math.max(tokenRefreshTime - tokenRefreshTimeBuffer, 0));\n};\n\nconst refreshToken = async (auth) => {\n try {\n const refreshedToken = await refreshAuthToken();\n const refreshedAuth = {\n ...auth,\n token: refreshedToken.data.token,\n };\n\n setAuthToStore(refreshedAuth);\n refreshTokenTimer(refreshedAuth, refreshToken);\n } catch (error) {\n if (error.response?.status >= 500) {\n setTimeout(() => refreshToken(), 30000);\n }\n }\n};\n\nexport const initRefreshToken = (auth) => refreshTokenTimer(auth, refreshToken);\n\nexport default initRefreshToken;\n","export default __webpack_public_path__ + \"static/media/logo-ar.204dec30.svg\";","import React, { useState, useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { Row, Col, Card, message } from 'antd';\nimport { useLocation } from 'react-router-dom';\n\nimport { setAuth } from '../ducks/auth';\nimport { setBrands, setCurrentBrand } from '../ducks/brands';\nimport LoginForm from '../components/LoginForm/LoginForm';\nimport { postNoAuth } from '../services/api';\nimport { initRefreshToken } from '../services/tokenRefresh';\nimport ARLogo from '../images/logo-ar.svg';\n\nconst Login = () => {\n const [isAuthLoading, setIsAuthLoading] = useState(false);\n const [hasApiError, setHasApiError] = useState(false);\n const [apiErrorMessage, setApiErrorMessage] = useState(\n 'Sorry, something went wrong. Please try again later.'\n );\n const dispatch = useDispatch();\n const { search } = useLocation();\n\n useEffect(() => {\n // check to see if the user is trying to access a route that needs them to be authorized\n if (search.includes('?next=')) {\n message.error(\n 'You must be logged in to view this page. Please login to continue.',\n 0\n );\n }\n }, [search]);\n\n const handleSubmit = async (values) => {\n setIsAuthLoading(true);\n message.destroy();\n\n try {\n const res = await postNoAuth('/partner/auth/login', values);\n\n if (!res.data.brands) {\n setHasApiError(true);\n setApiErrorMessage(\n 'Woops an error has occurred. Please contact Airtime Rewards quoting error code 1101.'\n );\n } else {\n dispatch(setAuth(res.data));\n initRefreshToken(res.data);\n dispatch(setBrands(res.data.brands));\n dispatch(setCurrentBrand(res.data.brands[0].id));\n }\n } catch (error) {\n setHasApiError(true);\n\n if (error?.response?.status === 401) {\n // user is unauthorized\n setApiErrorMessage('Invalid email/password combination');\n }\n }\n\n setIsAuthLoading(false);\n };\n\n const handleInputFocus = () => {\n setHasApiError(false);\n };\n\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default Login;\n","import React, { lazy, Suspense } from 'react';\nimport {\n BrowserRouter as Router,\n Route,\n Switch,\n Redirect,\n} from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport ARSpinner from '../components/ARSpinner/ARSpinner';\nimport Login from '../pages/Login';\nimport { base64Decode, base64Encode } from '../utilities';\n\nconst Dashboard = lazy(() => import('../pages/Dashboard'));\n\nconst Routes = () => {\n const { currentBrand } = useSelector((state) => state.brands);\n const { token } = useSelector((state) => state.auth);\n\n const getNextRedirect = (props) => {\n const searchParams = new URLSearchParams(props.location.search);\n const decodedNextQuery = searchParams.get('next')\n ? base64Decode(searchParams.get('next'))\n : '';\n const pathname = decodedNextQuery.match(/^([^?]*)(\\?.*)?/)[1];\n const query = decodedNextQuery.match(/^([^?]*)(\\?.*)?/)[2];\n\n return decodedNextQuery ? (\n \n ) : (\n \n );\n };\n\n return (\n \n }>\n \n (token ? getNextRedirect(props) : )}\n />\n \n token ? (\n \n ) : (\n \n )\n }\n />\n \n token ? getNextRedirect(props) : \n }\n />\n \n \n \n );\n};\n\nexport default Routes;\n","import React, { useEffect, useState } from 'react';\nimport './styles/global-styles.scss';\nimport { useDispatch } from 'react-redux';\nimport Routes from './router/routes';\nimport { setAuth } from './ducks/auth';\nimport { setBrands, setCurrentBrand } from './ducks/brands';\nimport { initRefreshToken } from './services/tokenRefresh';\n\nconst App = () => {\n const dispatch = useDispatch();\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const token = localStorage.getItem('v1_token');\n const brands = localStorage.getItem('v1_brands');\n const currentBrand = localStorage.getItem('v1_current-brand');\n\n if (token && brands) {\n dispatch(setAuth({ token }));\n dispatch(setBrands(JSON.parse(brands)));\n if (currentBrand) dispatch(setCurrentBrand(currentBrand));\n initRefreshToken({ token });\n }\n\n setLoading(false);\n }, [dispatch]);\n\n if (loading) return null;\n\n return ;\n};\n\nexport default App;\n","// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nfunction registerValidSW(swUrl) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n /* eslint-disable-next-line */\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a \"New content is\n // available; please refresh.\" message in your web app.\n // console.log('New content is available; please refresh.');\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n // console.log('Content is cached for offline use.');\n }\n }\n };\n };\n })\n .catch(() => {\n // console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n if (\n response.status === 404 ||\n response.headers.get('content-type').indexOf('javascript') === -1\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl);\n }\n })\n .catch(() => {\n // console.log(\n // 'No internet connection found. App is running in offline mode.'\n // );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n\nexport default function register() {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Lets check if a service worker still exists or not.\n checkValidServiceWorker(swUrl);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n // console.log(\n // 'This web app is being served cache-first by a service ' +\n // 'worker. To learn more, visit https://goo.gl/SC7cgQ'\n // );\n });\n } else {\n // Is not local host. Just register service worker\n registerValidSW(swUrl);\n }\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport { Provider } from 'react-redux';\nimport App from './App';\nimport { unregister } from './registerServiceWorker';\nimport store from './store';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\nunregister();\n","const SET_BRANDS = 'SET_BRANDS';\nconst SET_CURRENT_BRAND = 'SET_CURRENT_BRAND';\nconst INITIAL_STATE = {\n brands: [],\n currentBrand: '',\n};\n\nexport default function reducer(state = INITIAL_STATE, action) {\n switch (action.type) {\n case 'SET_BRANDS':\n return { ...state, brands: action.payload };\n case 'SET_CURRENT_BRAND':\n return { ...state, currentBrand: action.payload };\n default:\n return state;\n }\n}\n\nexport const setBrands = (brands) => {\n localStorage.setItem('v1_brands', JSON.stringify(brands));\n\n return { type: SET_BRANDS, payload: brands };\n};\n\nexport const setCurrentBrand = (currentBrand) => {\n localStorage.setItem('v1_current-brand', currentBrand);\n\n return { type: SET_CURRENT_BRAND, payload: currentBrand };\n};\n","import { combineReducers } from 'redux';\nimport auth from './auth';\nimport brands from './brands';\nimport retailGroups from './retailGroups';\n\nconst appReducer = combineReducers({\n auth,\n brands,\n retailGroups,\n});\n\nconst rootReducer = (state, action) =>\n appReducer(action.type === 'USER_LOGOUT' ? undefined : state, action);\n\nexport default rootReducer;\n","import { createStore } from 'redux';\nimport reducer from './ducks/rootReducer';\n\nconst store = createStore(reducer);\n\nexport default store;\n","const SET_AUTH = 'SET_AUTH';\nconst INITIAL_STATE = {\n token: '',\n};\n\nexport default function reducer(state = INITIAL_STATE, action) {\n switch (action.type) {\n case 'SET_AUTH':\n return { token: action.payload.token };\n default:\n return state;\n }\n}\n\nexport function setAuth(auth) {\n localStorage.setItem('v1_token', auth.token);\n\n return { type: SET_AUTH, payload: auth };\n}\n","import axios from 'axios';\nimport { message } from 'antd';\nimport userLogout from '../ducks/logout';\nimport { setCurrentBrand } from '../ducks/brands';\nimport store from '../store';\n\nconst endpoint = process.env.REACT_APP_API_URL;\n\nconst getHeaders = () => ({\n Authorization: `Bearer ${store.getState().auth?.token}`,\n});\n\naxios.defaults.headers.post['Content-Type'] = 'application/json';\n\n// Add a response interceptor\nif (window.location.pathname.indexOf('/login') === -1) {\n axios.interceptors.response.use(\n (response) => response,\n (error) => {\n // The request was made and the server responded with a status code\n if (error.response) {\n // 400 Bad Request - The request was unacceptable, usually due to a missing or malformed parameter.\n if (error.response.status === 400) {\n message.error(`Bad request.`);\n }\n\n // 401 Unauthorized -\tThe API token was incorrect or missing.\n if (error.response.status === 401) {\n store.dispatch(userLogout());\n }\n\n // 403 Forbidden - The user doesn’t have permission to make this request.\n if (error.response.status === 403) {\n message.error(`You don't have access to this page.`);\n }\n\n // 429 Too Many Requests - Too many requests have been made in a given time period. This only applies to unauthenticated requests.\n if (error.response.status === 429) {\n message.error('Too many requests. Please try again later.');\n }\n\n // 404 Not Found - The resource requested doesn’t exist.\n if (error.response.status === 404) {\n message.error('Page not found.');\n }\n\n // 405 Method Not Allowed\n if (error.response.status === 405) {\n message.error('Method Not Allowed.');\n }\n\n // 500 Internal Server Error\tSomething went wrong on the Zorro API side.\n if (error.response.status >= 500 && error.response.status < 600) {\n message.error('Woops, Something went wrong, please try again later.');\n }\n } else if (error.request) {\n // The request was made but no response was received\n // `error.request` is an instance of XMLHttpRequest in the browser and an instance of\n // http.ClientRequest in node.js\n message.error('Network error, please try again later.');\n } else {\n // Something happened in setting up the request that triggered an Error\n message.error('An unknown error occured, please try again later.');\n }\n\n return Promise.reject(error);\n }\n );\n}\n\nconst getBrand = () => {\n const currentState = store.getState();\n const { currentBrand } = currentState.brands;\n const defaultBrand = currentState.brands.brands[0];\n const localCurrentBrand = localStorage.getItem('v1_current-brand');\n\n if (!currentBrand) {\n store.dispatch(setCurrentBrand(localCurrentBrand || defaultBrand));\n\n return localCurrentBrand || defaultBrand;\n }\n\n return currentBrand;\n};\n\nexport const get = async (url, config) =>\n axios.get(`${endpoint}/partner/brand/${getBrand()}${url}`, {\n headers: getHeaders(),\n ...config,\n });\n\nexport const getNoBrand = (url, config) =>\n axios.get(`${endpoint}${url}`, {\n headers: getHeaders(),\n ...config,\n });\n\nexport const post = (url, data, config) =>\n axios.post(`${endpoint}/partner/brand/${getBrand()}${url}`, data, {\n headers: getHeaders(),\n ...config,\n });\n\nexport const postNoBrand = (url, args) =>\n axios.post(`${endpoint}${url}`, args, {\n headers: getHeaders(),\n });\n\nexport const postNoAuth = (url, args) => axios.post(`${endpoint}${url}`, args);\n\nexport const patchNoBrand = (url, args) =>\n axios.patch(`${endpoint}${url}`, args, {\n headers: getHeaders(),\n });\n\nexport const deleteNoBrand = (url) =>\n axios.delete(`${endpoint}${url}`, {\n headers: getHeaders(),\n });\n\nexport const put = (url, data, config) =>\n axios.put(`${endpoint}/partner/brand/${getBrand()}${url}`, data, {\n headers: getHeaders(),\n ...config,\n });\n\nexport const putNoBrand = (url, args) =>\n axios.put(`${endpoint}${url}`, args, {\n headers: getHeaders(),\n });\n\nexport const patch = (url, data, config) =>\n axios.patch(`${endpoint}/partner/brand/${getBrand()}${url}`, data, {\n headers: getHeaders(),\n ...config,\n });\n"],"sourceRoot":""}