{"version":3,"sources":["utilities/validate.js","ToyotaLexus.png","classes/apiUtils.js","classes/address.js","classes/tooManyResultsError.js","classes/customer.js","utilities/format.js","classes/searchResultRow.js","classes/user.js","resources/content.js","Components/Waiting/index.js","classes/centre.js","AppInsights.js","Components/Popup/index.js","Components/CentreSelection/index.js","Components/AddressLookup/index.js","Components/CustomerInput/index.js","Components/SearchResultsProfiling/index.js","Components/SearchResults/index.js","Components/ConsentCaptureProfiling/index.js","Components/ConsentCapture/index.js","Components/ReasonForVisit/index.js","classes/consentCapturedEvent.js","Components/TermsAndConditions/index.js","Pages/Consent/index.js","classes/cookieStore.js","classes/userFriendlyErrorHandler.js","Components/Login/index.js","App.js","serviceWorker.js","index.js"],"names":["blackListedUserNames","blackListedDomains","blacklistedEmailAddresses","validTLDsAndCountryCodes","validateAddress","address","standardized","addressLine","trim","removalRegex","RegExp","join","replace","standardizeAddress","validateFirstName","firstName","NIEL","KIETH","toUpperCase","wordsToRemove","Set","Array","from","standardizeFirstName","validateSurname","surname","standardizeSurname","errorMsgs","field","key","value","length","regex","test","email","includes","toLowerCase","some","blackListEntry","endsWith","startsWith","atIndex","lastIndexOf","domain","slice","i","code","validateEmailDomain","module","exports","fields","obj","testObj","telephone","apiUtils","err","contextString","timeout","console","log","status","str","isURL","process","user","valid","userNameValid","brandValid","authValid","brand","getBrandQueryValue","authToken","centreCode","selectedCentreCode","error","brandVal","message","bearerToken","sessionId","username","substring","line1","line2","locality","region","postalCode","this","qaMeta","addrObj","JSON","stringify","TypeError","house","Promise","resolve","reject","origHouse","origPostalCode","Error","settingsValid","userProfileValid","request","get","set","getBearerToken","getSessionId","query","response","deadline","then","res","addressFromResponse","isArray","body","hasOwnProperty","addressObj","addressLine1","addressLine2","addressLocality","addressRegion","_logResponseError","catch","addressNotFound","logResponseError","TooManyResultsError","name","customer","title","phone","consent","consentDate","crmId","profilingConsent","profilingConsentDate","undefined","hasConsent","crmid","hasFirstName","hasSurname","hasPhone","hasAddress","hasEmail","customerObj","isValid","stripLeadingAndTrailingWhitespace","franchise","maxResults","item","customerStructureOk","addressStructureOk","consentStructureOk","searchResults","offersAndEvents","offersAndEventsLastUpdated","profiling","profilingLastUpdated","a","c","push","format","values","delimiter","limit","formatted","assignedCount","formatName","formatConsent","formatConsentDate","formattedDate","dateObj","Date","dd","getDate","mmm","getMonth","yyyy","getFullYear","searchResultRow","formattedPart1","formattedPart2","formatAddress","validate","formatTelephone","User","openId","profile","FirstName","LastName","setBrand","String","loggedInCentreCode","getCenterCodeFromUsername","selectedCentreName","loggedInCentreName","id_token","multiCentreRole","isMultiCentreRole","Roles","started","getTime","uuidv4","rtn","role","displayBrand","charAt","context","singleton","Object","defineProperty","freeze","userData","path","split","active","forEach","ApplicationContent","className","backButtonText","clearButtonText","searchButtonText","cancelSearchButtonText","newCustomerButtonText","submitButtonTextExistingConsent","submitButtonTextNewOrChangedConsent","id","CentreSelectionContent","welcomeMessage","centreLoadFailMessage","CustomerInputContent","communicationMethods","SearchResultsContent","instruction","noMatchMessage","tooManyMatchesMessage","selectCustomerButtonText","TermsAndConditionsContent","toyota","href","target","rel","lexus","ReasonForVisitContent","aftersalesLabel","salesLabel","ConsentPageContent","eventSavedUnmodifiedConsentConfirmationText","eventSavedModifiedProfileConsentConfirmationText","eventSavedNewCustomerConfirmationText","eventSavedModifiedConsentConfirmationText","ConsentCaptureContent","optInLabel","outOutLabel","offerHeader","personalisedCommHeader","profilingOptInLabel","profilingOptOutLabel","AddressLookUpContent","labelAddress1","labelAddress2","labelTown","labelCounty","labelHouse","labelPostcode","addressLineError","postcodeError","sericeError","notFound","TimeZoneErrorMessageContent","keyword","headline","description","Waiting","render","props","show","style","position","top","left","margin","Modal","Component","centre","isValidCentreCode","url","centreStructureOk","groupStructureOk","group","dealers","dealerStructureOk","dealer","groupDealers","browserHistory","createBrowserHistory","basename","reactPlugin","ReactPlugin","ai","ApplicationInsights","config","instrumentationKey","extensions","extensionConfig","identifier","history","loadAppInsights","appInsights","Popup","onHide","close","dialogClassName","Header","Body","primary","secondary","Footer","type","button","onClick","CentreSelection","clearFilter","filterCentres","handleKeyDown","e","index","state","filteredCentres","findIndex","setSelectedCentre","selectedCentre","handleNextClick","handleSelectionChange","_targetInst","showModal","message1","message2","setState","waiting","modalMessageMain","modalMessageSecondary","handleModalClose","handleCentreSearch","filterText","searchText","centres","filter","indexOf","onChanged","Resources","onChange","placeholder","map","el","onDoubleClick","noFn","onMounted","activeListItem","bind","document","addEventListener","getGroupCentres","groupCentres","sort","b","trackEvent","properties","finally","AddressLookup","fullScreen","colStyle","btnColStyle","houseVal","postcodeVal","postcode","line1Val","line2Val","townVal","countyVal","lookupReturned","houseIsValid","postcodeIsValid","line1IsValid","errorMessage","line2IsValid","townIsValid","countyIsValid","findButtonDisabled","showLookupError","showNotFound","_onFindAddressClick","_onFieldChange","reset","_refreshFieldsValidity","_raiseAddressChangeEvent","addressFields","htmlFor","display","visibility","disabled","onAddressChange","preventDefault","lookup","trackTrace","severityLevel","targetId","targetValue","resetLookUp","resetNonSearchFields","_getBindingPathForControlById","ctrlId","bindingPath","houseIsEmpty","postcodeIsEmpty","line1IsEmpty","line2IsEmpty","townIsEmpty","countyIsEmpty","postcodeHasData","line1HasData","townHasData","React","CustomerInput","titleValid","firstNameValid","surnameValid","emailValid","telephoneValid","addressValid","validForm","refs","addressLookupComponent","firstNameFailsValidation","surnameFailsValidation","emailFailsValidation","telephoneFailsValidation","addressFailsValidation","handleFieldChange","handleAddressChange","getAttribute","validateFieldChange","force","isEmpty","mandatoryFieldsHaveData","isValidField","validationKey","validationFailsKey","validatedValue","validationErrorKey","errorMsg","validatedCustomer","validationState","anyFieldIsInvalid","isValidForm","data-key","required","firstNameValidationError","surnameValidationError","emailValidationError","ref","CustomerSelection","handleSelection","selectedCustomer","selectedId","results","onCustomerSelected","hasResults","SearchResultsGrid","getId","element","content","row","data-tip","data-for","place","effect","color","alt","data","__constentStatus","ConsentCapture","componentDidUpdate","prevProps","prevState","snapshot","consentForOffersAndEvents","consentForProfiling","handleCheckChange","optInValue","Boolean","consentForProfilingDisabled","handleProfilingCheckChange","handleExpand","isFormValid","isConsentChanged","getCustomer","Customer","evaluateConsentStatus","currentStatus","getConsentName","capitalizeFirstLetter","string","getConsentStatus","getConsentHeader","paddingTop","expandEmail","expandTelephone","expandAddress","marginTop","checked","width","consentForOffersAndEventsValid","consentForProfilingValid","__rns","ReasonForVisit","reasonForVisit","consentCapturedEvent","previousConsent","previousProfilingConsent","transactionType","numberOfRetriesOnError","retryCount","_toJSON","post","retry","send","u","hasUsername","hasCustomer","hasTansactionType","existingConsentObj","existingConsentAttributesObj","consentFlag","existingProfilingConsentAttributesObj","consentAttributes","currentConsentObj","currentConsentAttributesObj","currentProfilingConsentAttributesObj","customerAttributesObj","givenName","familyName","honorificPrefix","emailObj","phoneObj","telephoneNumber","contactPointsObj","addresses","emails","telephones","isNewCustomer","toString","attributes","contactPoints","subscriptions","userObj","userAttributes","centreObj","eventObj","existingSubscriptions","TermsAndConditions","expanded","backgroundColor","Consent","renderRedirect","redirect","to","redirectRoute","clearForm","customerInputCustomer","selectedCrmCustomer","initialConsentStatus","selectedCustomerConsent","selectedCustomerProfilingConsent","centreSelectionShow","searchInputShow","searchResultsShow","searchResultRows","confirmConsentShow","footerConsentStatus","customerInputComponent","handleNextFromCentreSelect","isPilotProfilingCentre","centreSelectionComponent","onUpdated","handleClear","handleBack","handleSearch","inputCustomer","createCustomerFromInput","search","result","rows","searchInputCustomer","resultsCount","searchFailureText","handleSearchCancel","confirmActionShow","confirmActionMessageTitle","confirmActionMessageMain","confirmActionMessageSecondary","handleCustomerSelected","isConsentValid","submitButtonText","evaluateFooterConsentStatus","handleNewCustomer","handleCentreSelectionChanged","centreSelectionForm","centreSelectionNextButtonDisabled","handleCentreSelectionMounted","sender","handleCustomerInputMounted","handleCustomerInputChanged","customerInputForm","handleDealerSelectionVisibility","removeEventListener","disableKeyDownEvents","event","stopPropagation","handleCentreSelectionDoubleClick","renderCentreSelection","renderCustomerDetails","marginRight","renderSearchResults","customerSelection","handleConsentCaptureChanged","handleConsentCaptureSubmit","cust","originalConsent","originalProfilingConsent","aiEventProperties","newConsent","newProfilingConsent","saveFailureText","save","confirmationText","updateEventKey","handleConsentCaptureCancel","handleReasonForVisitChanged","reason","renderConsentCapture","consentCapture","ConsentCaptureProfiling","borderTop","consentIsValid","onUpdate","findCookie","decodeURIComponent","cookie","setCookie","substr","deleteCookie","secs","match","sec","CookieStore","_name","_store","parse","getCookie","keys","UserFriendlyErrorHandler","stack","getUrlParameter","exec","window","location","Authenticate","signin","signinResponse","signout","onUserLoaded","onUserUnloaded","urlState","urlIdToken","firstLoad","isAuthenticated","expired","expiring","countDown","userManager","UserManager","authority","client_id","redirect_uri","response_type","scope","post_logout_redirect_uri","userStore","WebStorageStateStore","store","stateStore","events","addUserLoaded","addUserUnloaded","addAccessTokenExpiring","addAccessTokenExpired","interval","setInterval","clearInterval","getUser","signinRedirectCallback","first","method","jwt","token","base64","atob","charCodeAt","parseJwt","_stateStore","created","auth_time","request_type","nonce","_settings","_redirect_uri","_authority","_client_id","response_mode","_scope","extraTokenParams","replaceState","userLoaded","setAuthenticatedUserContext","userUnLoaded","clearAuthenticatedUserContext","signinRedirect","errorStack","removeUser","overrideError","children","setTimeout","App","onConsentPageUpdated","endsession","forceUpdate","src","jointLogo","marginBottom","cursor","withAppInsights","withAITracking","hostname","ReactDOM","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.85863617.chunk.js","sourcesContent":["\nconst blackListedUserNames = [\n \"noreply\", \"no-reply\", \"noemail@\", \"no@\"\n]; \n\nconst blackListedDomains = [\n \"@test.com\", \"@tes.co.uk\", \"@noemail.com\", \"@none.com\", \"@no.com\", \"@na.com\",\n]; \n\nconst blacklistedEmailAddresses = [\n \"withheld@contract.com\",\n \"m_purchasing@lexautolease.co.uk\",\n \"customerdeclined@fish-bros.co.uk\",\n \"customerdeciled@fish-bros.co.uk\",\n \"n@n.com\",\n \"modvsm@lexautolease.co.uk\",\n \"customernoemailaddress@gmail.com\",\n \"test@test.com\",\n \"purchasingavailabilities@lexautolease.co.uk\",\n \"purchasing@lexautolease.co.uk\",\n \"fmhelpdesk@ifs.inchcape.co.uk\",\n \"a@a.com\",\n \"company30service@motorline.co.uk\",\n \"noaddress@parks.uk.com\",\n \"d@d.com\",\n \"purchasing@leasedrive.co.uk\",\n \"sharon.trueman@lexautolease.co.uk\",\n \"staff@staff.com\",\n \"customerservices@bca.com\",\n \"purchasing@leasedrive.com\",\n \"stopemail@stop.com\",\n \"me@me.com\",\n \"a@b.com\",\n]; \n\nconst validTLDsAndCountryCodes = [\n \"aaa\",\"aarp\",\"abb\",\"abbott\",\"abbvie\",\"abc\",\"able\",\"abogado\",\"abudhabi\",\"ac\",\"academy\",\"accenture\",\"accountant\",\"accountants\",\"aco\",\"actor\",\"ad\",\"ads\",\"adult\",\"ae\",\"ac.ae\",\"co.ae\",\"net.ae\",\"org.ae\",\"sch.ae\",\"aeg\",\"aero\",\"cargo.aero\",\"charter.aero\",\"aetna\",\"af\",\"com.af\",\"edu.af\",\"gov.af\",\"net.af\",\"org.af\",\"afl\",\"africa\",\"ag\",\"co.ag\",\"com.ag\",\"net.ag\",\"nom.ag\",\"org.ag\",\"agakhan\",\"agency\",\"ai\",\"com.ai\",\"net.ai\",\"off.ai\",\"org.ai\",\"aig\",\"airbus\",\"airforce\",\"airtel\",\"akdn\",\"al\",\"com.al\",\"edu.al\",\"net.al\",\"org.al\",\"alibaba\",\"alipay\",\"allfinanz\",\"allstate\",\"ally\",\"alsace\",\"alstom\",\"am\",\"co.am\",\"com.am\",\"net.am\",\"north.am\",\"org.am\",\"radio.am\",\"south.am\",\"amazon\",\"americanexpress\",\"americanfamily\",\"amex\",\"amfam\",\"amica\",\"amsterdam\",\"analytics\",\"android\",\"anquan\",\"anz\",\"ao\",\"co.ao\",\"it.ao\",\"og.ao\",\"pb.ao\",\"aol\",\"apartments\",\"app\",\"apple\",\"aq\",\"aquarelle\",\"ar\",\"com.ar\",\"int.ar\",\"net.ar\",\"org.ar\",\"arab\",\"aramco\",\"archi\",\"army\",\"arpa\",\"art\",\"arte\",\"as\",\"asda\",\"asia\",\"associates\",\"at\",\"co.at\",\"or.at\",\"athleta\",\"attorney\",\"au\",\"asn.au\",\"com.au\",\"id.au\",\"info.au\",\"net.au\",\"org.au\",\"auction\",\"audi\",\"audible\",\"audio\",\"auspost\",\"author\",\"auto\",\"autos\",\"avianca\",\"aw\",\"com.aw\",\"aws\",\"ax\",\"axa\",\"az\",\"biz.az\",\"co.az\",\"com.az\",\"edu.az\",\"gov.az\",\"info.az\",\"int.az\",\"mil.az\",\"name.az\",\"net.az\",\"org.az\",\"pp.az\",\"pro.az\",\"azure\",\"ba\",\"co.ba\",\"com.ba\",\"baby\",\"baidu\",\"banamex\",\"band\",\"bank\",\"bar\",\"barcelona\",\"barclaycard\",\"barclays\",\"barefoot\",\"bargains\",\"baseball\",\"basketball\",\"bauhaus\",\"bayern\",\"bb\",\"co.bb\",\"com.bb\",\"net.bb\",\"org.bb\",\"bbc\",\"bbt\",\"bbva\",\"bcg\",\"bcn\",\"bd\",\"ac.bd\",\"com.bd\",\"net.bd\",\"org.bd\",\"be\",\"beats\",\"beauty\",\"beer\",\"bentley\",\"berlin\",\"best\",\"bestbuy\",\"bet\",\"bf\",\"bg\",\"bh\",\"biz.bh\",\"cc.bh\",\"com.bh\",\"edu.bh\",\"me.bh\",\"name.bh\",\"net.bh\",\"org.bh\",\"bharti\",\"bi\",\"co.bi\",\"com.bi\",\"edu.bi\",\"info.bi\",\"mo.bi\",\"net.bi\",\"or.bi\",\"org.bi\",\"bible\",\"bid\",\"bike\",\"bing\",\"bingo\",\"bio\",\"biz\",\"auz.biz\",\"bj\",\"com.bj\",\"edu.bj\",\"black\",\"blackfriday\",\"blockbuster\",\"blog\",\"bloomberg\",\"blue\",\"bm\",\"com.bm\",\"net.bm\",\"org.bm\",\"bms\",\"bmw\",\"bn\",\"com.bn\",\"net.bn\",\"org.bn\",\"bnpparibas\",\"bo\",\"com.bo\",\"net.bo\",\"org.bo\",\"tv.bo\",\"boats\",\"boehringer\",\"bofa\",\"bom\",\"bond\",\"boo\",\"book\",\"booking\",\"bosch\",\"bostik\",\"boston\",\"bot\",\"boutique\",\"box\",\"br\",\"abc.br\",\"adm.br\",\"adv.br\",\"agr.br\",\"am.br\",\"aparecida.br\",\"app.br\",\"arq.br\",\"art.br\",\"ato.br\",\"belem.br\",\"bhz.br\",\"bib.br\",\"bio.br\",\"blog.br\",\"bmd.br\",\"boavista.br\",\"bsb.br\",\"campinas.br\",\"caxias.br\",\"cim.br\",\"cng.br\",\"cnt.br\",\"com.br\",\"coop.br\",\"curitiba.br\",\"des.br\",\"det.br\",\"dev.br\",\"ecn.br\",\"eco.br\",\"edu.br\",\"emp.br\",\"enf.br\",\"eng.br\",\"esp.br\",\"etc.br\",\"eti.br\",\"far.br\",\"flog.br\",\"floripa.br\",\"fm.br\",\"fnd.br\",\"fortal.br\",\"fot.br\",\"foz.br\",\"fst.br\",\"g12.br\",\"geo.br\",\"ggf.br\",\"gov.br\",\"gru.br\",\"imb.br\",\"ind.br\",\"inf.br\",\"jampa.br\",\"jor.br\",\"lel.br\",\"log.br\",\"macapa.br\",\"maceio.br\",\"manaus.br\",\"mat.br\",\"med.br\",\"mil.br\",\"mus.br\",\"natal.br\",\"net.br\",\"nom.br\",\"not.br\",\"ntr.br\",\"odo.br\",\"org.br\",\"palmas.br\",\"poa.br\",\"ppg.br\",\"pro.br\",\"psc.br\",\"psi.br\",\"qsl.br\",\"radio.br\",\"rec.br\",\"recife.br\",\"rep.br\",\"rio.br\",\"salvador.br\",\"seg.br\",\"sjc.br\",\"slg.br\",\"srv.br\",\"taxi.br\",\"tec.br\",\"teo.br\",\"tmp.br\",\"trd.br\",\"tur.br\",\"tv.br\",\"vet.br\",\"vix.br\",\"vlog.br\",\"wiki.br\",\"zlg.br\",\"bradesco\",\"bridgestone\",\"broadway\",\"broker\",\"brother\",\"brussels\",\"bs\",\"com.bs\",\"net.bs\",\"org.bs\",\"bt\",\"com.bt\",\"org.bt\",\"build\",\"builders\",\"business\",\"buy\",\"buzz\",\"bv\",\"bw\",\"ac.bw\",\"co.bw\",\"net.bw\",\"org.bw\",\"by\",\"com.by\",\"minsk.by\",\"net.by\",\"bz\",\"co.bz\",\"com.bz\",\"net.bz\",\"org.bz\",\"za.bz\",\"bzh\",\"ca\",\"cab\",\"cafe\",\"cal\",\"call\",\"calvinklein\",\"cam\",\"camera\",\"camp\",\"canon\",\"capetown\",\"capital\",\"capitalone\",\"car\",\"caravan\",\"cards\",\"care\",\"career\",\"careers\",\"cars\",\"casa\",\"case\",\"cash\",\"casino\",\"cat\",\"catering\",\"catholic\",\"cba\",\"cbn\",\"cbre\",\"cc\",\"cd\",\"com.cd\",\"net.cd\",\"org.cd\",\"center\",\"ceo\",\"cern\",\"cf\",\"cfa\",\"cfd\",\"cg\",\"ch\",\"chanel\",\"channel\",\"charity\",\"chase\",\"chat\",\"cheap\",\"chintai\",\"christmas\",\"chrome\",\"church\",\"ci\",\"ac.ci\",\"co.ci\",\"com.ci\",\"ed.ci\",\"edu.ci\",\"go.ci\",\"in.ci\",\"int.ci\",\"net.ci\",\"nom.ci\",\"or.ci\",\"org.ci\",\"cipriani\",\"circle\",\"cisco\",\"citadel\",\"citi\",\"citic\",\"city\",\"ck\",\"biz.ck\",\"co.ck\",\"edu.ck\",\"gen.ck\",\"gov.ck\",\"info.ck\",\"net.ck\",\"org.ck\",\"cl\",\"claims\",\"cleaning\",\"click\",\"clinic\",\"clinique\",\"clothing\",\"cloud\",\"club\",\"clubmed\",\"cm\",\"co.cm\",\"com.cm\",\"net.cm\",\"cn\",\"ac.cn\",\"ah.cn\",\"bj.cn\",\"com.cn\",\"cq.cn\",\"fj.cn\",\"gd.cn\",\"gs.cn\",\"gx.cn\",\"gz.cn\",\"ha.cn\",\"hb.cn\",\"he.cn\",\"hi.cn\",\"hk.cn\",\"hl.cn\",\"hn.cn\",\"jl.cn\",\"js.cn\",\"jx.cn\",\"ln.cn\",\"mo.cn\",\"net.cn\",\"nm.cn\",\"nx.cn\",\"org.cn\",\"qh.cn\",\"sc.cn\",\"sd.cn\",\"sh.cn\",\"sn.cn\",\"sx.cn\",\"tj.cn\",\"tw.cn\",\"xj.cn\",\"xz.cn\",\"yn.cn\",\"zj.cn\",\"co\",\"com.co\",\"net.co\",\"nom.co\",\"coach\",\"codes\",\"coffee\",\"college\",\"cologne\",\"com\",\"ae.com\",\"africa.com\",\"br.com\",\"cn.com\",\"co.com\",\"de.com\",\"eu.com\",\"gr.com\",\"hk.com\",\"hu.com\",\"it.com\",\"jpn.com\",\"kr.com\",\"mex.com\",\"no.com\",\"nv.com\",\"pty-ltd.com\",\"qc.com\",\"ru.com\",\"sa.com\",\"se.com\",\"uk.com\",\"us.com\",\"za.com\",\"commbank\",\"community\",\"company\",\"compare\",\"computer\",\"comsec\",\"condos\",\"construction\",\"consulting\",\"contact\",\"contractors\",\"cooking\",\"cool\",\"coop\",\"corsica\",\"country\",\"coupon\",\"coupons\",\"courses\",\"cpa\",\"cr\",\"co.cr\",\"ed.cr\",\"fi.cr\",\"go.cr\",\"or.cr\",\"sa.cr\",\"credit\",\"creditcard\",\"creditunion\",\"cricket\",\"crown\",\"crs\",\"cruise\",\"cruises\",\"cu\",\"com.cu\",\"cuisinella\",\"cv\",\"com.cv\",\"edu.cv\",\"int.cv\",\"net.cv\",\"nome.cv\",\"org.cv\",\"publ.cv\",\"cw\",\"com.cw\",\"net.cw\",\"cx\",\"cy\",\"ac.cy\",\"biz.cy\",\"com.cy\",\"ekloges.cy\",\"ltd.cy\",\"name.cy\",\"net.cy\",\"org.cy\",\"parliament.cy\",\"press.cy\",\"pro.cy\",\"tm.cy\",\"cymru\",\"cyou\",\"cz\",\"co.cz\",\"dabur\",\"dad\",\"dance\",\"data\",\"date\",\"dating\",\"datsun\",\"day\",\"dclk\",\"dds\",\"de\",\"co.de\",\"com.de\",\"deal\",\"dealer\",\"deals\",\"degree\",\"delivery\",\"dell\",\"deloitte\",\"delta\",\"democrat\",\"dental\",\"dentist\",\"desi\",\"design\",\"dev\",\"dhl\",\"diamonds\",\"diet\",\"digital\",\"direct\",\"directory\",\"discount\",\"discover\",\"dish\",\"diy\",\"dj\",\"dk\",\"biz.dk\",\"co.dk\",\"dm\",\"co.dm\",\"com.dm\",\"net.dm\",\"org.dm\",\"dnp\",\"do\",\"art.do\",\"com.do\",\"net.do\",\"org.do\",\"sld.do\",\"web.do\",\"docs\",\"doctor\",\"dog\",\"domains\",\"dot\",\"download\",\"drive\",\"dtv\",\"dubai\",\"dunlop\",\"dupont\",\"durban\",\"dvag\",\"dvr\",\"dz\",\"com.dz\",\"earth\",\"eat\",\"ec\",\"com.ec\",\"fin.ec\",\"info.ec\",\"med.ec\",\"net.ec\",\"org.ec\",\"pro.ec\",\"eco\",\"edeka\",\"edu\",\"education\",\"ee\",\"co.ee\",\"com.ee\",\"fie.ee\",\"med.ee\",\"pri.ee\",\"eg\",\"com.eg\",\"edu.eg\",\"eun.eg\",\"gov.eg\",\"info.eg\",\"name.eg\",\"net.eg\",\"org.eg\",\"tv.eg\",\"email\",\"emerck\",\"energy\",\"engineer\",\"engineering\",\"enterprises\",\"epson\",\"equipment\",\"er\",\"ericsson\",\"erni\",\"es\",\"com.es\",\"edu.es\",\"gob.es\",\"nom.es\",\"org.es\",\"esq\",\"estate\",\"et\",\"biz.et\",\"com.et\",\"info.et\",\"name.et\",\"net.et\",\"org.et\",\"eu\",\"eurovision\",\"eus\",\"events\",\"exchange\",\"expert\",\"exposed\",\"express\",\"extraspace\",\"fage\",\"fail\",\"fairwinds\",\"faith\",\"family\",\"fan\",\"fans\",\"farm\",\"farmers\",\"fashion\",\"fast\",\"fedex\",\"feedback\",\"ferrari\",\"ferrero\",\"fi\",\"fidelity\",\"fido\",\"film\",\"final\",\"finance\",\"financial\",\"fire\",\"firestone\",\"firmdale\",\"fish\",\"fishing\",\"fit\",\"fitness\",\"fj\",\"ac.fj\",\"biz.fj\",\"com.fj\",\"info.fj\",\"name.fj\",\"net.fj\",\"org.fj\",\"pro.fj\",\"fk\",\"co.fk\",\"flickr\",\"flights\",\"flir\",\"florist\",\"flowers\",\"fly\",\"fm\",\"radio.fm\",\"fo\",\"foo\",\"food\",\"football\",\"ford\",\"forex\",\"forsale\",\"forum\",\"foundation\",\"fox\",\"fr\",\"aeroport.fr\",\"asso.fr\",\"avocat.fr\",\"chambagri.fr\",\"chirurgiens-dentistes.fr\",\"com.fr\",\"experts-comptables.fr\",\"geometre-expert.fr\",\"gouv.fr\",\"medecin.fr\",\"nom.fr\",\"notaires.fr\",\"pharmacien.fr\",\"port.fr\",\"prd.fr\",\"presse.fr\",\"tm.fr\",\"veterinaire.fr\",\"free\",\"fresenius\",\"frl\",\"frogans\",\"frontier\",\"ftr\",\"fujitsu\",\"fun\",\"fund\",\"furniture\",\"futbol\",\"fyi\",\"ga\",\"gal\",\"gallery\",\"gallo\",\"gallup\",\"game\",\"games\",\"gap\",\"garden\",\"gay\",\"gb\",\"gbiz\",\"gd\",\"gdn\",\"ge\",\"com.ge\",\"edu.ge\",\"gov.ge\",\"mil.ge\",\"net.ge\",\"org.ge\",\"pvt.ge\",\"gea\",\"gent\",\"genting\",\"george\",\"gf\",\"gg\",\"co.gg\",\"net.gg\",\"org.gg\",\"ggee\",\"gh\",\"com.gh\",\"edu.gh\",\"gov.gh\",\"org.gh\",\"gi\",\"com.gi\",\"gov.gi\",\"ltd.gi\",\"org.gi\",\"gift\",\"gifts\",\"gives\",\"giving\",\"gl\",\"co.gl\",\"com.gl\",\"edu.gl\",\"net.gl\",\"org.gl\",\"glass\",\"gle\",\"global\",\"globo\",\"gm\",\"gmail\",\"gmbh\",\"gmo\",\"gmx\",\"gn\",\"com.gn\",\"gov.gn\",\"net.gn\",\"org.gn\",\"godaddy\",\"gold\",\"goldpoint\",\"golf\",\"goo\",\"goodyear\",\"goog\",\"google\",\"gop\",\"got\",\"gov\",\"gp\",\"com.gp\",\"mobi.gp\",\"net.gp\",\"org.gp\",\"gq\",\"gr\",\"com.gr\",\"edu.gr\",\"net.gr\",\"org.gr\",\"grainger\",\"graphics\",\"gratis\",\"green\",\"gripe\",\"grocery\",\"group\",\"gs\",\"gt\",\"com.gt\",\"ind.gt\",\"net.gt\",\"org.gt\",\"gu\",\"com.gu\",\"gucci\",\"guge\",\"guide\",\"guitars\",\"guru\",\"gw\",\"gy\",\"co.gy\",\"com.gy\",\"net.gy\",\"hair\",\"hamburg\",\"hangout\",\"haus\",\"hbo\",\"hdfc\",\"hdfcbank\",\"health\",\"healthcare\",\"help\",\"helsinki\",\"here\",\"hermes\",\"hiphop\",\"hisamitsu\",\"hitachi\",\"hiv\",\"hk\",\"com.hk\",\"edu.hk\",\"gov.hk\",\"idv.hk\",\"inc.hk\",\"ltd.hk\",\"net.hk\",\"org.hk\",\"公司.hk\",\"hkt\",\"hm\",\"hn\",\"com.hn\",\"edu.hn\",\"net.hn\",\"org.hn\",\"hockey\",\"holdings\",\"holiday\",\"homedepot\",\"homegoods\",\"homes\",\"homesense\",\"honda\",\"horse\",\"hospital\",\"host\",\"hosting\",\"hot\",\"hotels\",\"hotmail\",\"house\",\"how\",\"hr\",\"com.hr\",\"hsbc\",\"ht\",\"adult.ht\",\"art.ht\",\"asso.ht\",\"com.ht\",\"edu.ht\",\"firm.ht\",\"info.ht\",\"net.ht\",\"org.ht\",\"perso.ht\",\"pol.ht\",\"pro.ht\",\"rel.ht\",\"shop.ht\",\"hu\",\"2000.hu\",\"agrar.hu\",\"bolt.hu\",\"casino.hu\",\"city.hu\",\"co.hu\",\"erotica.hu\",\"erotika.hu\",\"film.hu\",\"forum.hu\",\"games.hu\",\"hotel.hu\",\"info.hu\",\"ingatlan.hu\",\"jogasz.hu\",\"konyvelo.hu\",\"lakas.hu\",\"media.hu\",\"news.hu\",\"org.hu\",\"priv.hu\",\"reklam.hu\",\"sex.hu\",\"shop.hu\",\"sport.hu\",\"suli.hu\",\"szex.hu\",\"tm.hu\",\"tozsde.hu\",\"utazas.hu\",\"video.hu\",\"hughes\",\"hyatt\",\"hyundai\",\"ibm\",\"icbc\",\"ice\",\"icu\",\"id\",\"biz.id\",\"co.id\",\"my.id\",\"or.id\",\"web.id\",\"ie\",\"ieee\",\"ifm\",\"ikano\",\"il\",\"ac.il\",\"co.il\",\"muni.il\",\"net.il\",\"org.il\",\"im\",\"ac.im\",\"co.im\",\"com.im\",\"ltd.co.im\",\"net.im\",\"org.im\",\"plc.co.im\",\"imamat\",\"imdb\",\"immo\",\"immobilien\",\"in\",\"5g.in\",\"6g.in\",\"ahmdabad.in\",\"ai.in\",\"am.in\",\"bihar.in\",\"biz.in\",\"business.in\",\"ca.in\",\"cn.in\",\"co.in\",\"com.in\",\"coop.in\",\"cs.in\",\"delhi.in\",\"dr.in\",\"er.in\",\"firm.in\",\"gen.in\",\"gujarat.in\",\"ind.in\",\"info.in\",\"int.in\",\"internet.in\",\"io.in\",\"me.in\",\"net.in\",\"org.in\",\"pg.in\",\"post.in\",\"pro.in\",\"travel.in\",\"tv.in\",\"uk.in\",\"up.in\",\"us.in\",\"inc\",\"industries\",\"infiniti\",\"info\",\"auz.info\",\"ing\",\"ink\",\"institute\",\"insurance\",\"insure\",\"int\",\"international\",\"intuit\",\"investments\",\"io\",\"ipiranga\",\"iq\",\"com.iq\",\"ir\",\"co.ir\",\"irish\",\"is\",\"ismaili\",\"ist\",\"istanbul\",\"it\",\"abr.it\",\"abruzzo.it\",\"ag.it\",\"agrigento.it\",\"al.it\",\"alessandria.it\",\"alto-adige.it\",\"altoadige.it\",\"an.it\",\"ancona.it\",\"andria-barletta-trani.it\",\"andria-trani-barletta.it\",\"andriabarlettatrani.it\",\"andriatranibarletta.it\",\"ao.it\",\"aosta.it\",\"aoste.it\",\"ap.it\",\"aq.it\",\"aquila.it\",\"ar.it\",\"arezzo.it\",\"ascoli-piceno.it\",\"ascolipiceno.it\",\"asti.it\",\"at.it\",\"av.it\",\"avellino.it\",\"ba.it\",\"balsan.it\",\"bari.it\",\"barletta-trani-andria.it\",\"barlettatraniandria.it\",\"bas.it\",\"basilicata.it\",\"belluno.it\",\"benevento.it\",\"bergamo.it\",\"bg.it\",\"bi.it\",\"biella.it\",\"bl.it\",\"bn.it\",\"bo.it\",\"bologna.it\",\"bolzano.it\",\"bozen.it\",\"br.it\",\"brescia.it\",\"brindisi.it\",\"bs.it\",\"bt.it\",\"bz.it\",\"ca.it\",\"cagliari.it\",\"cal.it\",\"calabria.it\",\"caltanissetta.it\",\"cam.it\",\"campania.it\",\"campidano-medio.it\",\"campidanomedio.it\",\"campobasso.it\",\"carbonia-iglesias.it\",\"carboniaiglesias.it\",\"carrara-massa.it\",\"carraramassa.it\",\"caserta.it\",\"catania.it\",\"catanzaro.it\",\"cb.it\",\"ce.it\",\"cesena-forli.it\",\"cesenaforli.it\",\"ch.it\",\"chieti.it\",\"ci.it\",\"cl.it\",\"cn.it\",\"co.it\",\"como.it\",\"cosenza.it\",\"cr.it\",\"cremona.it\",\"crotone.it\",\"cs.it\",\"ct.it\",\"cuneo.it\",\"cz.it\",\"dell-ogliastra.it\",\"dellogliastra.it\",\"emilia-romagna.it\",\"emiliaromagna.it\",\"emr.it\",\"en.it\",\"enna.it\",\"fc.it\",\"fe.it\",\"fermo.it\",\"ferrara.it\",\"fg.it\",\"fi.it\",\"firenze.it\",\"florence.it\",\"fm.it\",\"foggia.it\",\"forli-cesena.it\",\"forlicesena.it\",\"fr.it\",\"friuli-v-giulia.it\",\"friuli-ve-giulia.it\",\"friuli-vegiulia.it\",\"friuli-venezia-giulia.it\",\"friuli-veneziagiulia.it\",\"friuli-vgiulia.it\",\"friuliv-giulia.it\",\"friulive-giulia.it\",\"friulivegiulia.it\",\"friulivenezia-giulia.it\",\"friuliveneziagiulia.it\",\"friulivgiulia.it\",\"frosinone.it\",\"fvg.it\",\"ge.it\",\"genoa.it\",\"genova.it\",\"go.it\",\"gorizia.it\",\"gr.it\",\"grosseto.it\",\"iglesias-carbonia.it\",\"iglesiascarbonia.it\",\"im.it\",\"imperia.it\",\"is.it\",\"isernia.it\",\"kr.it\",\"la-spezia.it\",\"laquila.it\",\"laspezia.it\",\"latina.it\",\"laz.it\",\"lazio.it\",\"lc.it\",\"le.it\",\"lecce.it\",\"lecco.it\",\"li.it\",\"lig.it\",\"liguria.it\",\"livorno.it\",\"lo.it\",\"lodi.it\",\"lom.it\",\"lombardia.it\",\"lombardy.it\",\"lt.it\",\"lu.it\",\"lucania.it\",\"lucca.it\",\"macerata.it\",\"mantova.it\",\"mar.it\",\"marche.it\",\"massa-carrara.it\",\"massacarrara.it\",\"matera.it\",\"mb.it\",\"mc.it\",\"me.it\",\"medio-campidano.it\",\"mediocampidano.it\",\"messina.it\",\"mi.it\",\"milan.it\",\"milano.it\",\"mn.it\",\"mo.it\",\"modena.it\",\"mol.it\",\"molise.it\",\"monza-brianza.it\",\"monza-e-della-brianza.it\",\"monza.it\",\"monzabrianza.it\",\"monzaebrianza.it\",\"monzaedellabrianza.it\",\"ms.it\",\"mt.it\",\"na.it\",\"naples.it\",\"napoli.it\",\"no.it\",\"novara.it\",\"nu.it\",\"nuoro.it\",\"og.it\",\"ogliastra.it\",\"olbia-tempio.it\",\"olbiatempio.it\",\"or.it\",\"oristano.it\",\"ot.it\",\"pa.it\",\"padova.it\",\"padua.it\",\"palermo.it\",\"parma.it\",\"pavia.it\",\"pc.it\",\"pd.it\",\"pe.it\",\"perugia.it\",\"pesaro-urbino.it\",\"pesarourbino.it\",\"pescara.it\",\"pg.it\",\"pi.it\",\"piacenza.it\",\"piedmont.it\",\"piemonte.it\",\"pisa.it\",\"pistoia.it\",\"pmn.it\",\"pn.it\",\"po.it\",\"pordenone.it\",\"potenza.it\",\"pr.it\",\"prato.it\",\"pt.it\",\"pu.it\",\"pug.it\",\"puglia.it\",\"pv.it\",\"pz.it\",\"ra.it\",\"ragusa.it\",\"ravenna.it\",\"rc.it\",\"re.it\",\"reggio-calabria.it\",\"reggio-emilia.it\",\"reggiocalabria.it\",\"reggioemilia.it\",\"rg.it\",\"ri.it\",\"rieti.it\",\"rimini.it\",\"rm.it\",\"rn.it\",\"ro.it\",\"roma.it\",\"rome.it\",\"rovigo.it\",\"sa.it\",\"salerno.it\",\"sar.it\",\"sardegna.it\",\"sardinia.it\",\"sassari.it\",\"savona.it\",\"si.it\",\"sic.it\",\"sicilia.it\",\"sicily.it\",\"siena.it\",\"siracusa.it\",\"so.it\",\"sondrio.it\",\"sp.it\",\"sr.it\",\"ss.it\",\"suedtirol.it\",\"sv.it\",\"ta.it\",\"taa.it\",\"taranto.it\",\"te.it\",\"tempio-olbia.it\",\"tempioolbia.it\",\"teramo.it\",\"terni.it\",\"tn.it\",\"to.it\",\"torino.it\",\"tos.it\",\"toscana.it\",\"tp.it\",\"tr.it\",\"trani-andria-barletta.it\",\"trani-barletta-andria.it\",\"traniandriabarletta.it\",\"tranibarlettaandria.it\",\"trapani.it\",\"trentino-a-adige.it\",\"trentino-aadige.it\",\"trentino-alto-adige.it\",\"trentino-altoadige.it\",\"trentino-s-tirol.it\",\"trentino-stirol.it\",\"trentino-sud-tirol.it\",\"trentino-sudtirol.it\",\"trentino-sued-tirol.it\",\"trentino-suedtirol.it\",\"trentino.it\",\"trentinoa-adige.it\",\"trentinoaadige.it\",\"trentinoalto-adige.it\",\"trentinoaltoadige.it\",\"trentinos-tirol.it\",\"trentinosud-tirol.it\",\"trentinosudtirol.it\",\"trentinosued-tirol.it\",\"trentinosuedtirol.it\",\"trento.it\",\"treviso.it\",\"trieste.it\",\"ts.it\",\"turin.it\",\"tuscany.it\",\"tv.it\",\"ud.it\",\"udine.it\",\"umb.it\",\"umbria.it\",\"urbino-pesaro.it\",\"urbinopesaro.it\",\"va.it\",\"val-d-aosta.it\",\"val-daosta.it\",\"vald-aosta.it\",\"valdaosta.it\",\"valle-d-aosta.it\",\"valle-daosta.it\",\"valled-aosta.it\",\"valledaosta.it\",\"vao.it\",\"varese.it\",\"vb.it\",\"vc.it\",\"vda.it\",\"ve.it\",\"ven.it\",\"veneto.it\",\"venezia.it\",\"venice.it\",\"verbania.it\",\"vercelli.it\",\"verona.it\",\"vi.it\",\"vibo-valentia.it\",\"vibovalentia.it\",\"vicenza.it\",\"viterbo.it\",\"vr.it\",\"vs.it\",\"vt.it\",\"vv.it\",\"itau\",\"itv\",\"jaguar\",\"java\",\"jcb\",\"je\",\"co.je\",\"net.je\",\"org.je\",\"jeep\",\"jetzt\",\"jewelry\",\"jio\",\"jll\",\"jm\",\"com.jm\",\"net.jm\",\"org.jm\",\"jmp\",\"jnj\",\"jo\",\"com.jo\",\"name.jo\",\"net.jo\",\"org.jo\",\"sch.jo\",\"jobs\",\"joburg\",\"jot\",\"joy\",\"jp\",\"akita.jp\",\"co.jp\",\"gr.jp\",\"kyoto.jp\",\"ne.jp\",\"or.jp\",\"osaka.jp\",\"saga.jp\",\"tokyo.jp\",\"jpmorgan\",\"jprs\",\"juegos\",\"juniper\",\"kaufen\",\"kddi\",\"ke\",\"ac.ke\",\"co.ke\",\"go.ke\",\"info.ke\",\"me.ke\",\"mobi.ke\",\"ne.ke\",\"or.ke\",\"sc.ke\",\"kerryhotels\",\"kerrylogistics\",\"kerryproperties\",\"kfh\",\"kg\",\"com.kg\",\"net.kg\",\"org.kg\",\"kh\",\"com.kh\",\"edu.kh\",\"net.kh\",\"org.kh\",\"ki\",\"biz.ki\",\"com.ki\",\"edu.ki\",\"gov.ki\",\"info.ki\",\"mobi.ki\",\"net.ki\",\"org.ki\",\"phone.ki\",\"tel.ki\",\"kia\",\"kids\",\"kim\",\"kindle\",\"kitchen\",\"kiwi\",\"km\",\"com.km\",\"nom.km\",\"org.km\",\"tm.km\",\"kn\",\"com.kn\",\"edu.kn\",\"gov.kn\",\"koeln\",\"komatsu\",\"kosher\",\"kp\",\"kpmg\",\"kpn\",\"kr\",\"co.kr\",\"go.kr\",\"ms.kr\",\"ne.kr\",\"or.kr\",\"pe.kr\",\"re.kr\",\"seoul.kr\",\"krd\",\"kred\",\"kuokgroup\",\"kw\",\"com.kw\",\"edu.kw\",\"net.kw\",\"org.kw\",\"ky\",\"com.ky\",\"net.ky\",\"org.ky\",\"kyoto\",\"kz\",\"com.kz\",\"org.kz\",\"\",\"la\",\"lacaixa\",\"lamborghini\",\"lamer\",\"lancaster\",\"land\",\"landrover\",\"lanxess\",\"lasalle\",\"lat\",\"latino\",\"latrobe\",\"law\",\"lawyer\",\"lb\",\"com.lb\",\"edu.lb\",\"net.lb\",\"org.lb\",\"lc\",\"co.lc\",\"com.lc\",\"l.lc\",\"net.lc\",\"org.lc\",\"p.lc\",\"lds\",\"lease\",\"leclerc\",\"lefrak\",\"legal\",\"lego\",\"lexus\",\"lgbt\",\"li\",\"lidl\",\"life\",\"lifeinsurance\",\"lifestyle\",\"lighting\",\"like\",\"lilly\",\"limited\",\"limo\",\"lincoln\",\"link\",\"lipsy\",\"live\",\"living\",\"lk\",\"assn.lk\",\"com.lk\",\"edu.lk\",\"grp.lk\",\"hotel.lk\",\"ltd.lk\",\"ngo.lk\",\"org.lk\",\"soc.lk\",\"web.lk\",\"llc\",\"llp\",\"loan\",\"loans\",\"locker\",\"locus\",\"lol\",\"london\",\"lotte\",\"lotto\",\"love\",\"lpl\",\"lplfinancial\",\"lr\",\"com.lr\",\"org.lr\",\"ls\",\"co.ls\",\"net.ls\",\"org.ls\",\"lt\",\"ltd\",\"ltda\",\"lu\",\"lundbeck\",\"luxe\",\"luxury\",\"lv\",\"asn.lv\",\"com.lv\",\"conf.lv\",\"edu.lv\",\"id.lv\",\"mil.lv\",\"net.lv\",\"org.lv\",\"ly\",\"com.ly\",\"id.ly\",\"med.ly\",\"net.ly\",\"org.ly\",\"plc.ly\",\"sch.ly\",\"ma\",\"ac.ma\",\"co.ma\",\"net.ma\",\"org.ma\",\"press.ma\",\"madrid\",\"maif\",\"maison\",\"makeup\",\"man\",\"management\",\"mango\",\"map\",\"market\",\"marketing\",\"markets\",\"marriott\",\"marshalls\",\"mattel\",\"mba\",\"mc\",\"asso.mc\",\"tm.mc\",\"mckinsey\",\"md\",\"me\",\"med\",\"media\",\"meet\",\"melbourne\",\"meme\",\"memorial\",\"men\",\"menu\",\"merckmsd\",\"mg\",\"co.mg\",\"com.mg\",\"mil.mg\",\"net.mg\",\"nom.mg\",\"org.mg\",\"prd.mg\",\"tm.mg\",\"mh\",\"miami\",\"microsoft\",\"mil\",\"mini\",\"mint\",\"mit\",\"mitsubishi\",\"mk\",\"com.mk\",\"edu.mk\",\"inf.mk\",\"net.mk\",\"org.mk\",\"ml\",\"com.ml\",\"info.ml\",\"net.ml\",\"org.ml\",\"mlb\",\"mls\",\"mm\",\"biz.mm\",\"com.mm\",\"net.mm\",\"org.mm\",\"per.mm\",\"mma\",\"mn\",\"mo\",\"com.mo\",\"net.mo\",\"org.mo\",\"mobi\",\"mobile\",\"moda\",\"moe\",\"moi\",\"mom\",\"monash\",\"money\",\"monster\",\"mormon\",\"mortgage\",\"moscow\",\"moto\",\"motorcycles\",\"mov\",\"movie\",\"mp\",\"mq\",\"mr\",\"edu.mr\",\"org.mr\",\"perso.mr\",\"ms\",\"co.ms\",\"com.ms\",\"org.ms\",\"msd\",\"mt\",\"com.mt\",\"edu.mt\",\"net.mt\",\"org.mt\",\"mtn\",\"mtr\",\"mu\",\"ac.mu\",\"co.mu\",\"com.mu\",\"net.mu\",\"nom.mu\",\"or.mu\",\"org.mu\",\"museum\",\"music\",\"mv\",\"com.mv\",\"mw\",\"ac.mw\",\"co.mw\",\"com.mw\",\"coop.mw\",\"edu.mw\",\"int.mw\",\"net.mw\",\"org.mw\",\"mx\",\"com.mx\",\"edu.mx\",\"gob.mx\",\"net.mx\",\"org.mx\",\"my\",\"com.my\",\"mil.my\",\"name.my\",\"net.my\",\"org.my\",\"mz\",\"co.mz\",\"edu.mz\",\"net.mz\",\"org.mz\",\"na\",\"alt.na\",\"cc.na\",\"co.na\",\"com.na\",\"edu.na\",\"info.na\",\"net.na\",\"org.na\",\"school.na\",\"nab\",\"nagoya\",\"name\",\"natura\",\"navy\",\"nba\",\"nc\",\"ne\",\"com.ne\",\"info.ne\",\"int.ne\",\"org.ne\",\"perso.ne\",\"nec\",\"net\",\"auz.net\",\"gb.net\",\"hu.net\",\"in.net\",\"jp.net\",\"ru.net\",\"se.net\",\"uk.net\",\"netbank\",\"netflix\",\"network\",\"neustar\",\"new\",\"news\",\"next\",\"nextdirect\",\"nexus\",\"nf\",\"arts.nf\",\"com.nf\",\"firm.nf\",\"info.nf\",\"net.nf\",\"org.nf\",\"other.nf\",\"per.nf\",\"rec.nf\",\"store.nf\",\"web.nf\",\"nfl\",\"ng\",\"com.ng\",\"edu.ng\",\"gov.ng\",\"i.ng\",\"lg.gov.ng\",\"mobi.ng\",\"name.ng\",\"net.ng\",\"org.ng\",\"sch.ng\",\"ngo\",\"nhk\",\"ni\",\"ac.ni\",\"biz.ni\",\"co.ni\",\"com.ni\",\"edu.ni\",\"gob.ni\",\"in.ni\",\"info.ni\",\"int.ni\",\"mil.ni\",\"net.ni\",\"nom.ni\",\"org.ni\",\"web.ni\",\"nico\",\"nike\",\"nikon\",\"ninja\",\"nissan\",\"nissay\",\"nl\",\"co.nl\",\"com.nl\",\"net.nl\",\"no\",\"co.no\",\"fhs.no\",\"folkebibl.no\",\"fylkesbibl.no\",\"gs.no\",\"idrett.no\",\"museum.no\",\"priv.no\",\"uenorge.no\",\"vgs.no\",\"nokia\",\"norton\",\"now\",\"nowruz\",\"nowtv\",\"np\",\"aero.np\",\"asia.np\",\"biz.np\",\"com.np\",\"coop.np\",\"info.np\",\"mil.np\",\"mobi.np\",\"museum.np\",\"name.np\",\"net.np\",\"org.np\",\"pro.np\",\"travel.np\",\"nr\",\"biz.nr\",\"com.nr\",\"info.nr\",\"net.nr\",\"org.nr\",\"nra\",\"nrw\",\"ntt\",\"nu\",\"co.nu\",\"nyc\",\"nz\",\"ac.nz\",\"co.net.nz\",\"co.nz\",\"geek.nz\",\"gen.nz\",\"iwi.nz\",\"kiwi.nz\",\"maori.nz\",\"net.nz\",\"org.nz\",\"school.nz\",\"obi\",\"observer\",\"office\",\"okinawa\",\"olayan\",\"olayangroup\",\"ollo\",\"om\",\"biz.om\",\"co.om\",\"com.om\",\"edu.om\",\"gov.om\",\"med.om\",\"mil.om\",\"museum.om\",\"net.om\",\"org.om\",\"pro.om\",\"sch.om\",\"omega\",\"one\",\"ong\",\"onl\",\"online\",\"ooo\",\"open\",\"oracle\",\"orange\",\"org\",\"ae.org\",\"hk.org\",\"us.org\",\"organic\",\"origins\",\"osaka\",\"otsuka\",\"ott\",\"ovh\",\"pa\",\"abo.pa\",\"com.pa\",\"edu.pa\",\"gob.pa\",\"ing.pa\",\"med.pa\",\"net.pa\",\"nom.pa\",\"org.pa\",\"sld.pa\",\"page\",\"panasonic\",\"paris\",\"pars\",\"partners\",\"parts\",\"party\",\"pay\",\"pccw\",\"pe\",\"com.pe\",\"edu.pe\",\"gob.pe\",\"mil.pe\",\"net.pe\",\"nom.pe\",\"org.pe\",\"pet\",\"pf\",\"asso.pf\",\"com.pf\",\"edu.pf\",\"gov.pf\",\"org.pf\",\"pfizer\",\"pg\",\"com.pg\",\"net.pg\",\"org.pg\",\"ph\",\"com.ph\",\"net.ph\",\"org.ph\",\"pharmacy\",\"phd\",\"philips\",\"phone\",\"photo\",\"photography\",\"photos\",\"physio\",\"pics\",\"pictet\",\"pictures\",\"pid\",\"pin\",\"ping\",\"pink\",\"pioneer\",\"pizza\",\"pk\",\"biz.pk\",\"com.pk\",\"net.pk\",\"org.pk\",\"web.pk\",\"pl\",\"agro.pl\",\"aid.pl\",\"atm.pl\",\"augustow.pl\",\"auto.pl\",\"babia-gora.pl\",\"bedzin.pl\",\"beskidy.pl\",\"bialowieza.pl\",\"bialystok.pl\",\"bielawa.pl\",\"bieszczady.pl\",\"biz.pl\",\"boleslawiec.pl\",\"bydgoszcz.pl\",\"bytom.pl\",\"cieszyn.pl\",\"com.pl\",\"czeladz.pl\",\"czest.pl\",\"dlugoleka.pl\",\"edu.pl\",\"elblag.pl\",\"elk.pl\",\"glogow.pl\",\"gmina.pl\",\"gniezno.pl\",\"gorlice.pl\",\"grajewo.pl\",\"gsm.pl\",\"ilawa.pl\",\"info.pl\",\"jaworzno.pl\",\"jelenia-gora.pl\",\"jgora.pl\",\"kalisz.pl\",\"karpacz.pl\",\"kartuzy.pl\",\"kaszuby.pl\",\"katowice.pl\",\"kazimierz-dolny.pl\",\"kepno.pl\",\"ketrzyn.pl\",\"klodzko.pl\",\"kobierzyce.pl\",\"kolobrzeg.pl\",\"konin.pl\",\"konskowola.pl\",\"kutno.pl\",\"lapy.pl\",\"lebork.pl\",\"legnica.pl\",\"lezajsk.pl\",\"limanowa.pl\",\"lomza.pl\",\"lowicz.pl\",\"lubin.pl\",\"lukow.pl\",\"mail.pl\",\"malbork.pl\",\"malopolska.pl\",\"mazowsze.pl\",\"mazury.pl\",\"media.pl\",\"miasta.pl\",\"mielec.pl\",\"mielno.pl\",\"mil.pl\",\"mragowo.pl\",\"naklo.pl\",\"net.pl\",\"nieruchomosci.pl\",\"nom.pl\",\"nowaruda.pl\",\"nysa.pl\",\"olawa.pl\",\"olecko.pl\",\"olkusz.pl\",\"olsztyn.pl\",\"opoczno.pl\",\"opole.pl\",\"org.pl\",\"ostroda.pl\",\"ostroleka.pl\",\"ostrowiec.pl\",\"ostrowwlkp.pl\",\"pc.pl\",\"pila.pl\",\"pisz.pl\",\"podhale.pl\",\"podlasie.pl\",\"polkowice.pl\",\"pomorskie.pl\",\"pomorze.pl\",\"powiat.pl\",\"priv.pl\",\"prochowice.pl\",\"pruszkow.pl\",\"przeworsk.pl\",\"pulawy.pl\",\"radom.pl\",\"rawa-maz.pl\",\"realestate.pl\",\"rel.pl\",\"rybnik.pl\",\"rzeszow.pl\",\"sanok.pl\",\"sejny.pl\",\"sex.pl\",\"shop.pl\",\"sklep.pl\",\"skoczow.pl\",\"slask.pl\",\"slupsk.pl\",\"sos.pl\",\"sosnowiec.pl\",\"stalowa-wola.pl\",\"starachowice.pl\",\"stargard.pl\",\"suwalki.pl\",\"swidnica.pl\",\"swiebodzin.pl\",\"swinoujscie.pl\",\"szczecin.pl\",\"szczytno.pl\",\"szkola.pl\",\"targi.pl\",\"tarnobrzeg.pl\",\"tgory.pl\",\"tm.pl\",\"tourism.pl\",\"travel.pl\",\"turek.pl\",\"turystyka.pl\",\"tychy.pl\",\"ustka.pl\",\"walbrzych.pl\",\"warmia.pl\",\"warszawa.pl\",\"waw.pl\",\"wegrow.pl\",\"wielun.pl\",\"wlocl.pl\",\"wloclawek.pl\",\"wodzislaw.pl\",\"wolomin.pl\",\"wroclaw.pl\",\"zachpomor.pl\",\"zagan.pl\",\"zarow.pl\",\"zgora.pl\",\"zgorzelec.pl\",\"place\",\"play\",\"playstation\",\"plumbing\",\"plus\",\"pm\",\"pn\",\"co.pn\",\"net.pn\",\"org.pn\",\"pnc\",\"pohl\",\"poker\",\"politie\",\"porn\",\"post\",\"pr\",\"at.pr\",\"biz.pr\",\"ch.pr\",\"com.pr\",\"de.pr\",\"eu.pr\",\"fr.pr\",\"info.pr\",\"isla.pr\",\"it.pr\",\"name.pr\",\"net.pr\",\"nl.pr\",\"org.pr\",\"pro.pr\",\"uk.pr\",\"pramerica\",\"praxi\",\"press\",\"prime\",\"pro\",\"aaa.pro\",\"aca.pro\",\"acct.pro\",\"arc.pro\",\"avocat.pro\",\"bar.pro\",\"bus.pro\",\"chi.pro\",\"chiro.pro\",\"cpa.pro\",\"den.pro\",\"dent.pro\",\"eng.pro\",\"jur.pro\",\"law.pro\",\"med.pro\",\"min.pro\",\"nur.pro\",\"nurse.pro\",\"pharma.pro\",\"prof.pro\",\"prx.pro\",\"recht.pro\",\"rel.pro\",\"teach.pro\",\"vet.pro\",\"prod\",\"productions\",\"prof\",\"progressive\",\"promo\",\"properties\",\"property\",\"protection\",\"pru\",\"prudential\",\"ps\",\"com.ps\",\"net.ps\",\"org.ps\",\"pt\",\"co.pt\",\"com.pt\",\"org.pt\",\"pub\",\"pw\",\"pwc\",\"py\",\"com.py\",\"coop.py\",\"edu.py\",\"net.py\",\"org.py\",\"qa\",\"com.qa\",\"edu.qa\",\"mil.qa\",\"name.qa\",\"net.qa\",\"org.qa\",\"sch.qa\",\"qpon\",\"quebec\",\"quest\",\"racing\",\"radio\",\"re\",\"read\",\"realestate\",\"realtor\",\"realty\",\"recipes\",\"red\",\"redstone\",\"redumbrella\",\"rehab\",\"reise\",\"reisen\",\"reit\",\"reliance\",\"ren\",\"rent\",\"rentals\",\"repair\",\"report\",\"republican\",\"rest\",\"restaurant\",\"review\",\"reviews\",\"rexroth\",\"rich\",\"richardli\",\"ricoh\",\"ril\",\"rio\",\"rip\",\"ro\",\"arts.ro\",\"co.ro\",\"com.ro\",\"firm.ro\",\"info.ro\",\"ne.ro\",\"nom.ro\",\"nt.ro\",\"or.ro\",\"org.ro\",\"rec.ro\",\"sa.ro\",\"srl.ro\",\"store.ro\",\"tm.ro\",\"www.ro\",\"rocks\",\"rodeo\",\"rogers\",\"room\",\"rs\",\"co.rs\",\"edu.rs\",\"in.rs\",\"org.rs\",\"rsvp\",\"ru\",\"adygeya.ru\",\"bashkiria.ru\",\"bir.ru\",\"cbg.ru\",\"com.ru\",\"dagestan.ru\",\"grozny.ru\",\"kalmykia.ru\",\"kustanai.ru\",\"marine.ru\",\"mordovia.ru\",\"msk.ru\",\"mytis.ru\",\"nalchik.ru\",\"net.ru\",\"nov.ru\",\"org.ru\",\"pp.ru\",\"pyatigorsk.ru\",\"spb.ru\",\"vladikavkaz.ru\",\"vladimir.ru\",\"rugby\",\"ruhr\",\"run\",\"rw\",\"ac.rw\",\"co.rw\",\"net.rw\",\"org.rw\",\"rwe\",\"ryukyu\",\"sa\",\"com.sa\",\"edu.sa\",\"med.sa\",\"net.sa\",\"org.sa\",\"pub.sa\",\"sch.sa\",\"saarland\",\"safe\",\"safety\",\"sakura\",\"sale\",\"salon\",\"samsclub\",\"samsung\",\"sandvik\",\"sandvikcoromant\",\"sanofi\",\"sap\",\"sarl\",\"sas\",\"save\",\"saxo\",\"sb\",\"com.sb\",\"net.sb\",\"org.sb\",\"sbi\",\"sbs\",\"sc\",\"com.sc\",\"net.sc\",\"org.sc\",\"scb\",\"schaeffler\",\"schmidt\",\"scholarships\",\"school\",\"schule\",\"schwarz\",\"science\",\"scot\",\"sd\",\"com.sd\",\"info.sd\",\"net.sd\",\"se\",\"com.se\",\"search\",\"seat\",\"secure\",\"security\",\"seek\",\"select\",\"sener\",\"services\",\"seven\",\"sew\",\"sex\",\"sexy\",\"sfr\",\"sg\",\"com.sg\",\"edu.sg\",\"net.sg\",\"org.sg\",\"sh\",\"shangrila\",\"sharp\",\"shaw\",\"shell\",\"shia\",\"shiksha\",\"shoes\",\"shop\",\"shopping\",\"shouji\",\"show\",\"si\",\"ae.si\",\"at.si\",\"cn.si\",\"co.si\",\"de.si\",\"uk.si\",\"us.si\",\"silk\",\"sina\",\"singles\",\"site\",\"sj\",\"sk\",\"org.sk\",\"ski\",\"skin\",\"sky\",\"skype\",\"sl\",\"com.sl\",\"edu.sl\",\"net.sl\",\"org.sl\",\"sling\",\"sm\",\"smart\",\"smile\",\"sn\",\"art.sn\",\"com.sn\",\"edu.sn\",\"org.sn\",\"perso.sn\",\"univ.sn\",\"sncf\",\"so\",\"com.so\",\"net.so\",\"org.so\",\"soccer\",\"social\",\"softbank\",\"software\",\"sohu\",\"solar\",\"solutions\",\"song\",\"sony\",\"soy\",\"spa\",\"space\",\"sport\",\"spot\",\"sr\",\"srl\",\"ss\",\"biz.ss\",\"com.ss\",\"me.ss\",\"net.ss\",\"st\",\"stada\",\"staples\",\"star\",\"statebank\",\"statefarm\",\"stc\",\"stcgroup\",\"stockholm\",\"storage\",\"store\",\"stream\",\"studio\",\"study\",\"style\",\"su\",\"abkhazia.su\",\"adygeya.su\",\"aktyubinsk.su\",\"arkhangelsk.su\",\"armenia.su\",\"ashgabad.su\",\"azerbaijan.su\",\"balashov.su\",\"bashkiria.su\",\"bryansk.su\",\"bukhara.su\",\"chimkent.su\",\"dagestan.su\",\"east-kazakhstan.su\",\"exnet.su\",\"georgia.su\",\"grozny.su\",\"ivanovo.su\",\"jambyl.su\",\"kalmykia.su\",\"kaluga.su\",\"karacol.su\",\"karaganda.su\",\"karelia.su\",\"khakassia.su\",\"krasnodar.su\",\"kurgan.su\",\"kustanai.su\",\"lenug.su\",\"mangyshlak.su\",\"mordovia.su\",\"msk.su\",\"murmansk.su\",\"nalchik.su\",\"navoi.su\",\"north-kazakhstan.su\",\"nov.su\",\"obninsk.su\",\"penza.su\",\"pokrovsk.su\",\"sochi.su\",\"spb.su\",\"tashkent.su\",\"termez.su\",\"togliatti.su\",\"troitsk.su\",\"tselinograd.su\",\"tula.su\",\"tuva.su\",\"vladikavkaz.su\",\"vladimir.su\",\"vologda.su\",\"sucks\",\"supplies\",\"supply\",\"support\",\"surf\",\"surgery\",\"suzuki\",\"sv\",\"com.sv\",\"edu.sv\",\"gob.sv\",\"org.sv\",\"swatch\",\"swiss\",\"sx\",\"sy\",\"com.sy\",\"sydney\",\"systems\",\"sz\",\"co.sz\",\"org.sz\",\"tab\",\"taipei\",\"talk\",\"taobao\",\"target\",\"tatamotors\",\"tatar\",\"tattoo\",\"tax\",\"taxi\",\"tc\",\"com.tc\",\"net.tc\",\"org.tc\",\"pro.tc\",\"tci\",\"td\",\"com.td\",\"net.td\",\"org.td\",\"tourism.td\",\"tdk\",\"team\",\"tech\",\"technology\",\"tel\",\"temasek\",\"tennis\",\"teva\",\"tf\",\"tg\",\"th\",\"ac.th\",\"co.th\",\"in.th\",\"or.th\",\"thd\",\"theater\",\"theatre\",\"tiaa\",\"tickets\",\"tienda\",\"tips\",\"tires\",\"tirol\",\"tj\",\"ac.tj\",\"aero.tj\",\"biz.tj\",\"co.tj\",\"com.tj\",\"coop.tj\",\"dyn.tj\",\"go.tj\",\"info.tj\",\"int.tj\",\"mil.tj\",\"museum.tj\",\"my.tj\",\"name.tj\",\"net.tj\",\"org.tj\",\"per.tj\",\"pro.tj\",\"web.tj\",\"tjmaxx\",\"tjx\",\"tk\",\"tkmaxx\",\"tl\",\"com.tl\",\"net.tl\",\"org.tl\",\"tm\",\"tmall\",\"tn\",\"agrinet.tn\",\"com.tn\",\"defense.tn\",\"edunet.tn\",\"ens.tn\",\"fin.tn\",\"ind.tn\",\"info.tn\",\"intl.tn\",\"nat.tn\",\"net.tn\",\"org.tn\",\"perso.tn\",\"rnrt.tn\",\"rns.tn\",\"rnu.tn\",\"tourism.tn\",\"to\",\"today\",\"tokyo\",\"tools\",\"top\",\"toray\",\"toshiba\",\"total\",\"tours\",\"town\",\"toyota\",\"toys\",\"tr\",\"av.tr\",\"bbs.tr\",\"biz.tr\",\"com.tr\",\"dr.tr\",\"gen.tr\",\"info.tr\",\"name.tr\",\"net.tr\",\"org.tr\",\"tel.tr\",\"tv.tr\",\"web.tr\",\"trade\",\"trading\",\"training\",\"travel\",\"travelers\",\"travelersinsurance\",\"trust\",\"trv\",\"tt\",\"biz.tt\",\"co.tt\",\"com.tt\",\"info.tt\",\"jobs.tt\",\"mobi.tt\",\"name.tt\",\"net.tt\",\"org.tt\",\"pro.tt\",\"tube\",\"tui\",\"tunes\",\"tushu\",\"tv\",\"tvs\",\"tw\",\"club.tw\",\"com.tw\",\"ebiz.tw\",\"game.tw\",\"idv.tw\",\"mil.tw\",\"net.tw\",\"org.tw\",\"tz\",\"ac.tz\",\"co.tz\",\"go.tz\",\"hotel.tz\",\"info.tz\",\"me.tz\",\"mil.tz\",\"mobi.tz\",\"ne.tz\",\"or.tz\",\"sc.tz\",\"tv.tz\",\"ua\",\"biz.ua\",\"cherkassy.ua\",\"cherkasy.ua\",\"chernigov.ua\",\"chernivtsi.ua\",\"chernovtsy.ua\",\"ck.ua\",\"cn.ua\",\"co.ua\",\"com.ua\",\"crimea.ua\",\"cv.ua\",\"dn.ua\",\"dnepropetrovsk.ua\",\"dnipropetrovsk.ua\",\"donetsk.ua\",\"dp.ua\",\"edu.ua\",\"gov.ua\",\"if.ua\",\"in.ua\",\"ivano-frankivsk.ua\",\"kh.ua\",\"kharkiv.ua\",\"kharkov.ua\",\"kherson.ua\",\"khmelnitskiy.ua\",\"kiev.ua\",\"kirovograd.ua\",\"km.ua\",\"kr.ua\",\"ks.ua\",\"kyiv.ua\",\"lg.ua\",\"lt.ua\",\"lugansk.ua\",\"lutsk.ua\",\"lviv.ua\",\"mk.ua\",\"net.ua\",\"nikolaev.ua\",\"od.ua\",\"odesa.ua\",\"odessa.ua\",\"org.ua\",\"pl.ua\",\"poltava.ua\",\"pp.ua\",\"rivne.ua\",\"rovno.ua\",\"rv.ua\",\"sebastopol.ua\",\"sm.ua\",\"sumy.ua\",\"te.ua\",\"ternopil.ua\",\"uz.ua\",\"uzhgorod.ua\",\"vinnica.ua\",\"vn.ua\",\"volyn.ua\",\"yalta.ua\",\"zaporizhzhe.ua\",\"zhitomir.ua\",\"zp.ua\",\"zt.ua\",\"ubank\",\"ubs\",\"ug\",\"ac.ug\",\"co.ug\",\"com.ug\",\"go.ug\",\"ne.ug\",\"or.ug\",\"org.ug\",\"sc.ug\",\"uk\",\"ac.uk\",\"barking-dagenham.sch.uk\",\"barnet.sch.uk\",\"barnsley.sch.uk\",\"bathnes.sch.uk\",\"beds.sch.uk\",\"bexley.sch.uk\",\"bham.sch.uk\",\"blackburn.sch.uk\",\"blackpool.sch.uk\",\"bolton.sch.uk\",\"bournemouth.sch.uk\",\"bracknell-forest.sch.uk\",\"bradford.sch.uk\",\"brent.sch.uk\",\"co.uk\",\"doncaster.sch.uk\",\"gov.uk\",\"ltd.uk\",\"me.uk\",\"net.uk\",\"org.uk\",\"plc.uk\",\"sch.uk\",\"unicom\",\"university\",\"uno\",\"uol\",\"ups\",\"us\",\"uy\",\"com.uy\",\"edu.uy\",\"net.uy\",\"org.uy\",\"uz\",\"biz.uz\",\"co.uz\",\"com.uz\",\"net.uz\",\"org.uz\",\"va\",\"vacations\",\"vana\",\"vanguard\",\"vc\",\"com.vc\",\"net.vc\",\"org.vc\",\"ve\",\"co.ve\",\"com.ve\",\"info.ve\",\"net.ve\",\"org.ve\",\"web.ve\",\"vegas\",\"ventures\",\"verisign\",\"vermögensberater\",\"vermögensberatung\",\"versicherung\",\"vet\",\"vg\",\"vi\",\"co.vi\",\"com.vi\",\"net.vi\",\"org.vi\",\"viajes\",\"video\",\"vig\",\"viking\",\"villas\",\"vin\",\"vip\",\"virgin\",\"visa\",\"vision\",\"viva\",\"vivo\",\"vlaanderen\",\"vn\",\"ac.vn\",\"biz.vn\",\"com.vn\",\"edu.vn\",\"gov.vn\",\"health.vn\",\"info.vn\",\"int.vn\",\"name.vn\",\"net.vn\",\"org.vn\",\"pro.vn\",\"vodka\",\"volvo\",\"vote\",\"voting\",\"voto\",\"voyage\",\"vu\",\"com.vu\",\"net.vu\",\"org.vu\",\"wales\",\"walmart\",\"walter\",\"wang\",\"wanggou\",\"watch\",\"watches\",\"weather\",\"weatherchannel\",\"webcam\",\"weber\",\"website\",\"wed\",\"wedding\",\"weibo\",\"weir\",\"wf\",\"whoswho\",\"wien\",\"wiki\",\"williamhill\",\"win\",\"windows\",\"wine\",\"winners\",\"wme\",\"wolterskluwer\",\"woodside\",\"work\",\"works\",\"world\",\"wow\",\"ws\",\"com.ws\",\"net.ws\",\"org.ws\",\"wtc\",\"wtf\",\"xbox\",\"xerox\",\"xihuan\",\"xin\",\"xxx\",\"xyz\",\"yachts\",\"yahoo\",\"yamaxun\",\"yandex\",\"ye\",\"com.ye\",\"net.ye\",\"org.ye\",\"yodobashi\",\"yoga\",\"yokohama\",\"you\",\"youtube\",\"yt\",\"yun\",\"za\",\"co.za\",\"net.za\",\"org.za\",\"web.za\",\"zappos\",\"zara\",\"zero\",\"zip\",\"zm\",\"co.zm\",\"com.zm\",\"org.zm\",\"zone\",\"zuerich\",\"zw\",\"co.zw\",\"org.zw\"\n];\n\nconst validateEmailDomain = (email) => {\n const atIndex = email.lastIndexOf('@');\n if (atIndex === -1) {\n return false;\n }\n const domain = email.slice(atIndex + 1);\n\n for (let i = 0; i < validTLDsAndCountryCodes.length; i++) {\n const code = validTLDsAndCountryCodes[i];\n if (domain.endsWith(`.${code}`)) {\n return true;\n }\n }\n return false;\n};\n\n\nconst standardizeAddress = (addressLine) => {\n if (!addressLine || addressLine.trim() === \"\") return addressLine;\n\n // Remove patterns such as \"C/O\", \"T/AS\", \"T/S\", and various phrases and specific words\n const removalPatterns = [\n \"C\\\\/O\", \"T\\\\/AS\", \"T\\\\/S\",\"X{15}\", // Patterns\n \"CAMPAIGN\", \"GONE\\\\sAWAY\", \"UNKNOWN\", \"OBTAIN\", \"PLEASE\", \"NEEDS?\", \"FLEET\", \"MOVED\", \"GONE\", \n \"STAFF\", \"ONLINE\", \"GET\", \"NOT\\\\sAT\", \"RETURNED\", \"DELETE\", \"DECEASED\", \n \"REQUESTED\\\\sREMOVAL\", \"NO\\\\sLONGER\", \"ADDRESS\", \"NO\\\\sMARKETING\", \"MYSTERY\\\\sSHOP\", \n \"HAS\\\\sCHANGED\", \"NOT\\\\sKNOWN\", \"TEST\", \"TBA\", \"GET\", \"M\\\\/A\", \"N\\\\/A\", \"NA\", // Phrases\n \"contact\", \"records\", \"GDPR\", \"Required\", \"UPDATE\", \"Testing\" // Specific words\n ];\n\n // Create a single regex from the removal patterns\n const removalRegex = new RegExp(`\\\\b(${removalPatterns.join('|')})\\\\b`, 'gi');\n addressLine = addressLine.replace(removalRegex, '').replace(/\\s+/g, ' ').trim();\n\n return addressLine;\n};\n\nconst validateAddress = (address) => {\n const standardized = standardizeAddress(address);\n return standardized !== null && standardized.trim() !== \"\";\n};\n\nconst standardizeFirstName = (firstName) => {\n if (!firstName || firstName.trim() === \"\") return firstName;\n\n //name corrections\n const nameCorrections = { NIEL: \"Neil\", KIETH: \"Keith\" };\n firstName = nameCorrections[firstName.toUpperCase()] || firstName.trim();\n\n // removal lists\n const wordsToRemove = new Set([\n \"X{15}\", \"THE\\\\s.*\",\"N\\\\/A\", \"NA\", \"SIRS\", \n \"DECEASED\", \"DEAR\", \"TITLE\", \"SURNAME\", \"FIRST\\\\sNAME\",\n \"NEW\", \"TO\", \"SALES\", \"AUTO\", \"CAR\", \"FLEET\", \"DIRECTOR\", \"COMPANY\", \"MANAG\", \"ADMIN\", \n \"SYSTEM\", \"OTHER\", \"DEFAULT\", \"UNKNOWN\", \"DEPT\", \"BUYER\", \"LTD\", \"LIMITED\", \"PLC\", \n \"TOYOTA\", \"TEST\", \"LEXUS\", \"PLEASE\", \"OBTAIN\", \"ACCOUNT\", \"PERSON\", \n \"SALES\", \"AUTO\", \"CAR\", \"USED\", \"NULL\", \"TITLE\", \"SURNAME\", \"FIRST NAME\", \"NONE\", \n \"DEAR SIR\", \"DECEASED\", \"MOTOR\", \"FAO\", \"MADAM\", \"THE\", \"STAFF\", \"SOLD\", \"SAAB\", \n \"TRADE\", \"DELETE\", \"GDPR\", \"DATA CLEAN\", \"MANAGING\",\"ADMINISTRATOR\", \"MANAGER\", \"ACCOUNTS\",\n // Titles\n \"MR\", \"MRS\\\\s?\", \"MS\\\\s?\", \"MISS\\\\s?\", \"DR\\\\s?\", \"SIR\\\\s?\", \"MESSRS\\\\s?\", \n \"PROF\\\\s?\", \"SIR\", \"MS\\\\s?\", \"MISS\\\\s?\", \"MR\", \"MRS\\\\s?\"\n ]);\n\n // Create a single regex from the set\n const removalRegex = new RegExp(`\\\\b(${Array.from(wordsToRemove).join('|')})\\\\b`, 'gi');\n firstName = firstName.replace(removalRegex, '').replace(/\\s+/g, ' ').trim();\n\n return firstName;\n};\n\n\nconst validateFirstName = (firstName) => {\n const standardized = standardizeFirstName(firstName);\n return standardized === firstName;\n};\n\n\nconst standardizeSurname = (surname) => {\n if (!surname || surname.trim() === \"\") return surname;\n \n // Trim leading and trailing spaces\n surname = surname.trim();\n\n // Combine the removal lists and optimize regex\n const wordsToRemove = new Set([\n // Words and phrases\n \"THE\\\\s.*\", \"N\\\\/A\", \"NA\", \"SIRS\", \"TO\",\n // Specific words\n \"FLEET\", \"DIRECTOR\", \"COMPANY\", \"MANAG\", \"ADMIN\", \"SYSTEM\", \"OTHER\", \"DEFAULT\", \n \"UNKNOWN\", \"DEPT\", \"BUYER\", \"LTD\", \"LIMITED\", \"PLC\", \"TOYOTA\", \"TEST\", \"LEXUS\", \n \"PLEASE\", \"OBTAIN\", \"ACCOUNT\", \"PERSON\", \"NEW\", \"SALES\", \"AUTO\", \"CAR\", \n \"USED\", \"NULL\", \"TITLE\", \"SURNAME\", \"FIRST NAME\", \"NONE\", \"DEAR SIR\", \"DECEASED\", \n \"MOTOR\", \"FAO\", \"MADAM\", \"THE\", \"STAFF\", \"SOLD\", \"SAAB\", \"TRADE\", \"DELETE\", \"GDPR\", \n \"DATA CLEAN\",\"MANAGING\", \"MANAGER\",\"ACCOUNTS\",\"ADMINISTRATOR\",\n // Titles\n \"MR\", \"MRS\\\\s?\", \"MS\\\\s?\", \"MISS\\\\s?\", \"DR\\\\s?\", \"SIR\\\\s?\", \"MESSRS\\\\s?\", \n \"PROF\\\\s?\", \"SIR\\\\s?\", \"MS\\\\s?\", \"MISS\\\\s?\", \"MR\", \"MRS\\\\s?\"\n ]);\n\n // Create a single regex from the set\n const removalRegex = new RegExp(`\\\\b(${Array.from(wordsToRemove).join('|')})\\\\b`, 'gi');\n surname = surname.replace(removalRegex, '').replace(/\\s+/g, ' ').trim();\n\n return surname;\n};\n\nconst validateSurname = (surname) => {\n const standardized = standardizeSurname(surname);\n return standardized === surname;\n};\n\nconst errorMsgs = {};\n\nconst field = (key, value) => {\n if ((typeof key === 'string') && key === 'address') {\n return true;\n }\n else if(typeof key !== 'string' || key.trim().length === 0 || typeof value !== 'string') {\n return false;\n }\n let regex = /.*/;\n errorMsgs[key] = null;\n switch(key) {\n case 'title':\n regex = /^[a-z]{1,50}$/i;\n break;\n case 'firstName':\n regex = /^[a-z\\- ']+$/i; \n if(!validateFirstName(value)) {\n errorMsgs.firstName = \"This name is not allowed.\";\n return false;\n } else if (!regex.test(value.trim())) {\n errorMsgs.firstName = \"Letters and basic punctuation only\"; \n return false; \n } else if (value.length >= 50) {\n errorMsgs.firstName = 'The input must be no more than 50 characters long.';\n return false; \n } else {\n return true;\n }\n case 'surname':\n regex = /^[a-z\\- ']+$/i; \n if(!validateSurname(value)) {\n errorMsgs.surname = \"This surname is not allowed.\";\n return false;\n } else if (!regex.test(value.trim())) {\n errorMsgs.surname = \"Letters and basic punctuation only\"; \n return false; \n } else if (value.length < 2) {\n errorMsgs.surname = 'The input must be at least 2 character long.';\n return false; \n } else if (value.length >= 50) {\n errorMsgs.surname = 'The input must be no more than 50 characters long.';\n return false; \n } else {\n return true;\n }\n case 'email':\n errorMsgs.email = \"Please enter a valid email address\"; \n if(blacklistedEmailAddresses.includes(value.toLowerCase()) || \n blackListedDomains.some(blackListEntry => value.toLowerCase().endsWith(blackListEntry)) ||\n blackListedUserNames.some(blackListEntry => value.toLowerCase().startsWith(blackListEntry))||\n !validateEmailDomain(value.toLowerCase()))\n {\n return false;\n } \n \n // Email structure check. Source: http://emailregex.com/\n regex = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/ \n\n break;\n case 'telephone':\n regex = /^(0\\d{10}|0\\d{4} \\d{6})$/; \n break;\n case 'postcode':\n regex = /^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))\\s?[0-9][A-Za-z]{2})$/i;\n break;\n case 'houseNumber':\n // Alphanumerics and basic punctuation only:\n regex = /^[0-9a-z ,'-.()/]{1,}$/i;\n break;\n case 'addressLine':\n regex = /^[0-9a-z ,'-.()/]{1,}$/i;\n if(!validateAddress(value)) {\n errorMsgs.addressLine = \"This address is not allowed.\";\n return false;\n } else if (!regex.test(value.trim())) {\n errorMsgs.addressLine = \"Letters and basic punctuation only\"; \n return false; \n } else if (value.length < 2) {\n errorMsgs.addressLine = 'The input must be at least 2 character long.';\n return false; \n } else if (value.length >= 50) {\n errorMsgs.addressLine = 'The input must be no more than 50 characters long.';\n return false; \n } else {\n return true;\n }\n case 'channel':\n regex = /^(EMAIL|MAIL|TELEPHONE|SMS)$/;\n break;\n default:\n regex = /^.{0,50}$/i;\n break;\n }\n return regex.test(value.trim());\n}\n\nconst fields = (obj) => {\n let testObj = {};\n for(let key in obj) {\n if(field(key, obj[key]) === true) {\n testObj[key] = obj[key];\n }\n }\n // We need to know who we are talking to\n if(!testObj.firstName || !testObj.surname) {\n return false;\n }\n // We need to know how to get hold of the customer\n if(!testObj.email && !testObj.telephone && !testObj.address) {\n return false;\n }\n return true;\n}\n\nmodule.exports = {\n field: field,\n fields: fields,\n errorMsgs: errorMsgs\n}\n","module.exports = __webpack_public_path__ + \"static/media/ToyotaLexus.cdc3bda3.png\";","/*****************************************************************************************\n** @description Provides common helper methods for classes that make API calls.\n******************************************************************************************/\nexport default class apiUtils {\n /*****************************************************************************************\n ** FIELDS - no local data\n ******************************************************************************************/\n\n /*****************************************************************************************\n ** CONSTRUCTOR - not instantiable\n ******************************************************************************************/\n\n /*****************************************************************************************\n ** PROPERTIES - no properties\n ******************************************************************************************/\n \n /*****************************************************************************************\n ** PUBLIC METHODS\n ******************************************************************************************/\n static logResponseError(err, contextString) {\n // Either network error, or reponse returned with status != 2XX:\n if (err != null) {\n if (err.timeout) {\n console.log(\"The server took too long to respond. Request aborted.\");\n }\n else if (err.status === null) {\n // No response, unable to reach server:\n console.log(\"Call to \" + contextString + \" failed. Unable to reach or no response from server.\");\n\n }\n else {\n console.log(\"Call to \" + contextString + \" failed with response status: \" + err.status);\n }\n }\n }\n\n static stripLeadingAndTrailingWhitespace(str) {\n if (!str) {\n return \"\";\n }\n else {\n return str.replace(/^\\s+|\\s+$/g, '');\n }\n }\n\n static settingsValid() {\n var valid = false;\n var urlIsValid = apiUtils.isURL(process.env.REACT_APP_API_URL);\n\n valid = urlIsValid;\n\n return valid;\n }\n\n static userProfileValid(user) {\n let valid = false;\n\n try {\n let brandValid = false;\n let authValid = false;\n let userNameValid = false;\n let brand = apiUtils.getBrandQueryValue(user);\n let authToken = user.authToken;\n let centreCode = user.selectedCentreCode;\n\n if (/^(toyota|lexus)$/.test(brand)) {\n brandValid = true;\n }\n\n if ((authToken !== null) && (authToken.length > 0)) {\n authValid = true;\n }\n\n // centreCode will either be an empty string or 6 chars if that many chars could be extracted:\n userNameValid = (centreCode.length > 0); \n\n valid = brandValid && authValid && userNameValid;\n } catch (error) {\n valid = false;\n }\n\n return valid;\n }\n\n static getBrandQueryValue(user) {\n let brandVal = null;\n\n try {\n brandVal = user.brand;\n } catch (error) {\n console.log(error.message);\n brandVal = \"\";\n }\n\n return brandVal;\n }\n\n static getBearerToken(user) {\n let bearerToken = null;\n\n try {\n bearerToken = \"Bearer \" + user.authToken;\n } catch (error) {\n console.log(error.message);\n bearerToken = \"\";\n }\n\n return bearerToken;\n }\n\n static getSessionId(user) {\n let sessionId = null;\n\n try {\n sessionId = user.sessionId;\n } catch (error) {\n console.log(error.message);\n sessionId = \"\";\n }\n\n return sessionId;\n }\n\n static isURL(str) {\n if (typeof str != \"string\") {\n return false;\n }\n else {\n var pattern = new RegExp('^(https?:\\\\/\\\\/)?' + // protocol\n '((([a-z\\\\d]([a-z\\\\d-]*[a-z\\\\d])*)\\\\.?)+[a-z]{2,}|' + // domain name\n '((\\\\d{1,3}\\\\.){3}\\\\d{1,3}))' + // OR ip (v4) address\n '(\\\\:\\\\d+)?(\\\\/[-a-z\\\\d%_.~+]*)*' + // port and path\n '(\\\\?[;&a-z\\\\d%_.~+=-]*)?' + // query string\n '(\\\\#[-a-z\\\\d_]*)?$', 'i'); // fragment locator\n return pattern.test(str);\n }\n }\n\n static getCenterCodeFromUsername(username) {\n let code = \"\";\n try {\n if ((username !== null) && (username.length >= 6)) {\n code = username.substring(username.length - 6);\n }\n } catch (error) {\n console.log(\"Error extracing centre code from username: \" + error.message);\n }\n return code;\n }\n\n static isValidCentreCode(code) {\n let isValid = false;\n\n isValid = true;\n\n return isValid;\n }\n}","import request from 'superagent';\nimport apiUtils from './apiUtils';\n\n/*****************************************************************************************\n** @description TODO\n******************************************************************************************/\nexport default class address {\n /*****************************************************************************************\n ** FIELDS\n ******************************************************************************************/\n #_line1 = \"\";\n #_line2 = \"\";\n #_locality = \"\";\n #_region = \"\";\n #_postalCode = \"\";\n #_qameta = \"\";\n #_addressNotFound = false;\n\n /*****************************************************************************************\n ** CONSTRUCTOR\n ******************************************************************************************/\n constructor(line1, line2, locality, region, postalCode) {\n // Set properties to supplied values or defaults if not supplied:\n this.line1 = line1 || \"\";\n this.line2 = line2 || \"\";\n this.locality = locality || \"\";\n this.region = region || \"\";\n this.postalCode = postalCode || \"\";\n this.qaMeta = \"200\";\n }\n\n /*****************************************************************************************\n ** PROPERTIES\n ******************************************************************************************/\n get line1() {\n return this.#_line1;\n }\n set line1(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set address line 1. Expected type String\");\n }\n this.#_line1 = value;\n }\n\n get line2() {\n return this.#_line2;\n }\n set line2(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set address line 2. Expected type String\");\n }\n this.#_line2 = value;\n }\n\n get locality() {\n return this.#_locality;\n }\n set locality(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set address locality. Expected type String\");\n }\n this.#_locality = value;\n }\n\n get region() {\n return this.#_region;\n }\n set region(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set address region. Expected type String\");\n }\n this.#_region = value;\n }\n\n get postalCode() {\n return this.#_postalCode;\n }\n set postalCode(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set address postal code. Expected type String\");\n }\n this.#_postalCode = value;\n }\n\n get qaMeta() {\n return this.#_qameta;\n }\n set qaMeta(value) {\n this.#_qameta = value;\n }\n\n get addressNotFound() {\n return this.#_addressNotFound;\n }\n set addressNotFound(value) {\n if (typeof value != \"boolean\") {\n throw new TypeError(\"Failed to set addressNotFound. Expected type Boolean or null\");\n }\n\n this.#_addressNotFound = value;\n }\n\n /*****************************************************************************************\n ** PUBLIC METHODS\n ******************************************************************************************/\n\n /*****************************************************************************************\n ** @description @todo\n ******************************************************************************************/\n static lookup(house, postalCode, user) {\n return new Promise((resolve, reject) => {\n // Check that we have valid data and configuration before sending request:\n var err = null;\n let origHouse = house;\n let origPostalCode = postalCode;\n\n // Validate and clean house parameter:\n if (house === null) {\n house = \"\";\n }\n\n if (typeof house != \"string\") {\n console.log(\"Address lookup skipped. Invalid value for house parameter.\");\n err = new Error(\"parameter house is invalid\");\n }\n else {\n // We have a string. Strip whitespace and check length:\n if (house.replace(/\\s+/g, '').length === 0) {\n console.log(\"Address lookup skipped. Invalid value for house parameter.\");\n err = new Error(\"parameter house name/number has no value\");\n }\n }\n\n // Validate and clean postalCode parameter:\n if (typeof postalCode != \"string\") {\n console.log(\"Address lookup skipped. Invalid value for postalCode parameter.\");\n err = new Error(\"parameter postalCode is not a string\");\n }\n else {\n // We have a string. Strip whitespace and check length:\n postalCode = postalCode.replace(/\\s+/g, '');\n\n if (postalCode.length === 0) {\n console.log(\"Address lookup skipped. Invalid value for postalCode parameter.\");\n err = new Error(\"parameter postalCode has no value\");\n }\n }\n\n // Verify that we have an environment configured to allow API calls:\n if (apiUtils.settingsValid() === false) {\n console.log(\"Address lookup skipped. Environment settings are invalid.\");\n err = new Error(\"Environment settings for API operations are not set\");\n }\n\n if (apiUtils.userProfileValid(user) === false) {\n console.log(\"Address lookup skipped. User context is invalid.\");\n err = new Error(\"User context is not set or is invalid\");\n }\n\n if (err !== null) {\n // Return the error resulting from input validation:\n reject(err);\n }\n else {\n // Rejection has not occurred due to input validation -> continue to API call:\n // Configure request parameters:\n var url = process.env.REACT_APP_API_URL + 'core/address/';\n\n // Send request:\n request\n .get(url)\n .set('Authorization', apiUtils.getBearerToken(user))\n .set('sessionId', apiUtils.getSessionId(user))\n .query({ house: house })\n .query({ postalCode: postalCode })\n .timeout({\n response: 5000, // Wait 5 seconds for server response,\n deadline: 10000, // Wait 10 seconds total - small request\n })\n .then((res) => {\n console.log(\"Address lookup returned\");\n\n // Response has returned with status 2XX:\n // Check that the result is in an expected format:\n let err = null;\n let addressFromResponse = null;\n if (Array.isArray(res.body) === true && res.body.length > 0) {\n // We have an array of results - at present the service should return a single result only:\n addressFromResponse = res.body[0];\n\n // Check the structure to check we have the right kind of response:\n let structureOk =\n addressFromResponse.hasOwnProperty(\"addressLine1\") &&\n addressFromResponse.hasOwnProperty(\"addressLine2\") &&\n addressFromResponse.hasOwnProperty(\"addressLocality\") &&\n addressFromResponse.hasOwnProperty(\"addressRegion\") &&\n addressFromResponse.hasOwnProperty(\"postalCode\");\n\n if (structureOk === false) {\n err = new Error(\"Response was not in the expected format - expected address object\");\n }\n } else {\n err = new Error(\"Response was not in the expected format - expected array\");\n }\n\n if (err === null) {\n let addressObj = new address(addressFromResponse.addressLine1, addressFromResponse.addressLine2, addressFromResponse.addressLocality, addressFromResponse.addressRegion, addressFromResponse.postalCode);\n resolve(addressObj);\n }\n else {\n this._logResponseError(err);\n reject(err);\n }\n })\n .catch(err => {\n if (err && err.status === 404) {\n // The house number and postcode did not produce a valid match. \n // Return as an address populating house number and postcode:\n let addressObj = new address(origHouse, null, null, null, origPostalCode);\n addressObj.addressNotFound = true;\n resolve(addressObj);\n }\n else {\n this._logResponseError(err);\n reject(err);\n }\n });\n }\n\n });\n }\n\n isEmpty() {\n return (this.line1.length === 0) && \n (this.line2.length === 0) && \n (this.locality.length === 0) && \n (this.region.length === 0) && \n (this.postalCode.length === 0);\n }\n\n /*****************************************************************************************\n ** PRIVATE METHODS\n ******************************************************************************************/\n static _logResponseError(err) {\n apiUtils.logResponseError(err, \"core/address/lookup\");\n }\n\n _toJSON() {\n var addrObj = {};\n\n addrObj.line1 = this.line1;\n addrObj.line2 = this.line2;\n addrObj.locality = this.locality;\n addrObj.region = this.region;\n addrObj.postalCode = this.postalCode;\n\n return JSON.stringify(addrObj);\n }\n}","export default class TooManyResultsError extends Error {\n constructor(message) {\n super(message);\n this.name = \"TooManyResultsError\";\n }\n }","import request from 'superagent';\nimport address from '../classes/address';\nimport TooManyResultsError from '../classes/tooManyResultsError';\nimport apiUtils from './apiUtils';\n\n/*****************************************************************************************\n** @description The customer class provides the business logic model for all operations relating to\n** customer.\n**\n** It provides helpers (TODO) for validating customer data, and methods for submitting\n** customer data back to a central API.\n**\n** A search method is provided that queries an API to find similar customers.\n******************************************************************************************/\nexport default class customer {\n /*****************************************************************************************\n ** FIELDS\n ******************************************************************************************/\n #_title = \"\";\n #_firstName = \"\";\n #_surname = \"\";\n #_email = \"\";\n #_phone = \"\";\n #_address = \"\";\n #_consent = null;\n #_profilingConsent = null;\n #_consentDate = null;\n #_profilingConsentDate = null;\n #_crmId = null;\n #_qameta = \"\";\n\n /*****************************************************************************************\n ** CONSTRUCTOR\n ******************************************************************************************/\n constructor(title, \n firstName, \n surname, \n email, \n phone, \n addressObj, \n consent, \n consentDate, \n crmId,\n profilingConsent,\n profilingConsentDate) {\n // Set properties to supplied values or defaults if not supplied:\n this.title = title || \"\";\n this.firstName = firstName || \"\";\n this.surname = surname || \"\";\n this.email = email || \"\";\n this.phone = phone || \"\";\n this.address = addressObj || new address();\n this.consent = (consent === undefined) ? null : consent;\n this.consentDate = (consentDate === undefined) ? null : consentDate;\n this.crmId = crmId || null;\n this.qaMeta = \"200\";\n this.profilingConsent = (profilingConsent === undefined) ? null : profilingConsent;\n this.profilingConsentDate = (profilingConsentDate === undefined) ? null : profilingConsentDate;\n }\n\n /*****************************************************************************************\n ** PROPERTIES\n ******************************************************************************************/\n get title() {\n return this.#_title;\n }\n set title(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set title. Expected type String\");\n }\n\n this.#_title = value;\n }\n\n get firstName() {\n return this.#_firstName;\n }\n set firstName(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set first name. Expected type String\");\n }\n\n this.#_firstName = value;\n }\n\n get surname() {\n return this.#_surname;\n }\n set surname(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set surname. Expected type String\");\n }\n\n this.#_surname = value;\n }\n\n get email() {\n return this.#_email;\n }\n set email(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set email. Expected type String\");\n }\n\n this.#_email = value;\n }\n\n get phone() {\n return this.#_phone;\n }\n set phone(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set phone. Expected type String\");\n }\n\n this.#_phone = value;\n }\n\n get address() {\n return this.#_address;\n }\n set address(value) {\n if (typeof value != \"object\") {\n throw new TypeError(\"Failed to set address. Expected type address object\");\n }\n\n this.#_address = value;\n }\n\n /*\n Consent is a nullable boolean. When value is null then we interpret this as the customer has not recently\n provided a valid consent decision (either allow or deny).\n\n null = no recent valid consent\n true = allow offers and events marketing\n false = deny offers and events marketing\n */\n get consent() {\n return this.#_consent;\n }\n set consent(value) {\n if ((typeof value != \"boolean\") && (value !== null)) {\n throw new TypeError(\"Failed to set consent. Expected type Boolean or null\");\n }\n\n this.#_consent = value;\n }\n \n get consentDate() {\n return this.#_consentDate;\n }\n set consentDate(value) {\n if ((typeof value != \"string\") && (value !== null)) {\n throw new TypeError(\"Failed to set consentDate. Expected type String or null\");\n }\n\n this.#_consentDate = value;\n }\n\n get crmId() {\n return this.#_crmId;\n }\n set crmId(value) {\n if ((typeof value != \"string\") && (value !== null)) {\n throw new TypeError(\"Failed to set crmId. Expected type guid or null\");\n }\n\n this.#_crmId = value;\n }\n\n get qaMeta() {\n return this.#_qameta;\n }\n set qaMeta(value) {\n this.#_qameta = value;\n }\n\n get profilingConsent() {\n return this.#_profilingConsent;\n }\n set profilingConsent(value) {\n if ((typeof value != \"boolean\") && (value !== null)) {\n throw new TypeError(\"Failed to set profilingConsent. Expected type Boolean or null\");\n }\n\n this.#_profilingConsent = value;\n }\n \n get profilingConsentDate() {\n return this.#_profilingConsentDate;\n }\n set profilingConsentDate(value) {\n if ((typeof value != \"string\") && (value !== null)) {\n throw new TypeError(\"Failed to set profilingConsentDate. Expected type String or null\");\n }\n\n this.#_profilingConsentDate = value;\n }\n\n /*****************************************************************************************\n ** PUBLIC METHODS\n ******************************************************************************************/\n\n /*****************************************************************************************\n ** @description isValid checks that the minimum required data exists for a customer to\n ** be submitted to the backend API.\n **\n ** @returns {boolean}\n ******************************************************************************************/\n isValid() {\n var valid = false;\n var hasConsent;\n if (this.crmid !== null && this.crmid !== \"\") {\n // For existing customer, just verify we have consent set:\n hasConsent = (this.consent !== null);\n valid = hasConsent;\n }\n else {\n // New customer, check that minimum data supplied:\n var hasFirstName = (this.firstName.length > 0);\n var hasSurname = (this.surname.length > 0);\n var hasPhone = (this.phone.length > 0);\n var hasAddress = (this.address !== null) && (this.address.postalCode.length > 0) && (this.address.line1.length > 0);\n var hasEmail = (this.email.length > 0);\n hasConsent = (this.consent !== null);\n \n valid = hasFirstName && hasSurname && (hasPhone || hasEmail || hasAddress) && hasConsent;\n }\n\n return valid;\n }\n\n /*****************************************************************************************\n ** @todo Search method\n ******************************************************************************************/\n static search(customerObj, user) {\n return new Promise((resolve, reject) => {\n // Check that we have valid data and configuration before sending request:\n var err = null;\n\n if ((customerObj == null) || (customerObj instanceof customer !== true)) {\n console.log(\"Unable to search for customer - invalid object used as search parameter.\")\n err = new TypeError(\"Expected customer object\");\n }\n else if (customerObj.isValid === false) {\n console.log(\"Unable to search for customer - a valid customer object is required.\")\n err = new Error(\"Invalid customer data\");\n }\n else if (apiUtils.settingsValid() === false) {\n console.log(\"Unable to search. Environment settings are invalid.\");\n err = new Error(\"Environment settings for API operations are not set\");\n }\n else if (apiUtils.userProfileValid(user) === false) {\n console.log(\"Unable to search. User context is invalid.\");\n err = new Error(\"User context is not set or is invalid\");\n }\n\n if (err != null) {\n // Return the error resulting from input validation:\n reject(err);\n }\n else {\n // Valid parameters:\n var url = process.env.REACT_APP_API_URL + 'rcc/customerSearch/';\n\n // Send request:\n request\n .get(url)\n .set('Authorization', apiUtils.getBearerToken(user))\n .set('sessionId', apiUtils.getSessionId(user))\n .query({ title: customerObj.title })\n .query({ firstName: apiUtils.stripLeadingAndTrailingWhitespace(customerObj.firstName)})\n .query({ surname: apiUtils.stripLeadingAndTrailingWhitespace(customerObj.surname)})\n .query({ email: apiUtils.stripLeadingAndTrailingWhitespace(customerObj.email)})\n .query({ phone: apiUtils.stripLeadingAndTrailingWhitespace(customerObj.phone)})\n .query({ addressLine1: apiUtils.stripLeadingAndTrailingWhitespace(customerObj.address.line1)})\n .query({ addressLine2: apiUtils.stripLeadingAndTrailingWhitespace(customerObj.address.line2)})\n .query({ addressLocality: apiUtils.stripLeadingAndTrailingWhitespace(customerObj.address.locality) })\n .query({ addressRegion: apiUtils.stripLeadingAndTrailingWhitespace(customerObj.address.region) })\n .query({ postalCode: apiUtils.stripLeadingAndTrailingWhitespace(customerObj.address.postalCode) })\n .query({ franchise: apiUtils.getBrandQueryValue(user) })\n .query( {maxResults: 5})\n .timeout({\n response: 30000, // Wait 10 seconds for server response,\n deadline: 35000, // Wait 15 seconds total - small request\n })\n .then((res) => {\n // Response has returned with status 2XX:\n console.log(\"Customer search returned\");\n\n // Check that we have an 204 response or array of results:\n let err = null;\n if (res.status === 204) {\n err = new TooManyResultsError(\"The maximum number of search results has been exceeded. Please add additional search criteria.\");\n }\n else if (Array.isArray(res.body) === false) {\n err = new Error(\"Response was not in the expected format - expected array\");\n }\n else {\n // Validate structure of response:\n let item;\n for (item of res.body) {\n if (item === null) {\n err = new Error(\"Response was not in the expected format - expected customer object\");\n }\n else {\n let customerStructureOk =\n item.hasOwnProperty(\"crmId\") &&\n item.hasOwnProperty(\"title\") &&\n item.hasOwnProperty(\"firstName\") &&\n item.hasOwnProperty(\"surname\") &&\n item.hasOwnProperty(\"email\") &&\n item.hasOwnProperty(\"phone\") &&\n item.hasOwnProperty(\"address\") &&\n item.hasOwnProperty(\"consent\");\n\n let addressStructureOk = true;\n if (item.address !== null) {\n addressStructureOk =\n item.address.hasOwnProperty(\"addressLine1\") &&\n item.address.hasOwnProperty(\"addressLine2\") &&\n item.address.hasOwnProperty(\"addressLocality\") &&\n item.address.hasOwnProperty(\"addressRegion\") &&\n item.address.hasOwnProperty(\"postalCode\");\n }\n\n let consentStructureOk = true;\n if (item.consent !== null) {\n consentStructureOk =\n item.consent.hasOwnProperty(\"offersAndEvents\");\n item.consent.hasOwnProperty(\"offersAndEventsLastUpdated\");\n item.consent.hasOwnProperty(\"profiling\");\n item.consent.hasOwnProperty(\"profilingLastUpdated\");\n }\n\n if ((customerStructureOk === false) || (addressStructureOk === false) || (consentStructureOk === false)) {\n err = new Error(\"Response was not in the expected format - expected customer object\");\n }\n }\n }\n }\n\n if (err !== null) {\n customer._logResponseError(err);\n reject(err);\n }\n else {\n let searchResults = [];\n let item;\n for (item of res.body) {\n // Check for consent object - if it is null then consent has not been provided. If consent is present, then set based on the offersAndEvents field:\n let consent = null;\n let consentDate = null;\n if ((item.consent !== null) && (item.consent.offersAndEvents !== null) && (typeof item.consent.offersAndEvents === \"boolean\")) {\n consent = item.consent.offersAndEvents;\n consentDate = item.consent.offersAndEventsLastUpdated;\n }\n\n let profilingConsent = null;\n let profilingConsentDate = null;\n if ((item.consent !== null) && (item.consent.profiling !== null) && (typeof item.consent.profiling === \"boolean\")) {\n profilingConsent = item.consent.profiling;\n profilingConsentDate = item.consent.profilingLastUpdated;\n }\n \n let a = new address(item.address.addressLine1, item.address.addressLine2, item.address.addressLocality, item.address.addressRegion, item.address.postalCode);\n let c = new customer(item.title, item.firstName, item.surname, item.email, item.phone, a, consent, consentDate, item.crmId, profilingConsent, profilingConsentDate);\n searchResults.push(c);\n }\n \n resolve(searchResults);\n }\n })\n .catch(err => {\n // Response has returned with status != 2XX:\n console.log(\"Error from invocation of customer search API\");\n customer._logResponseError(err);\n reject(err);\n });\n }\n });\n }\n\n\n /*****************************************************************************************\n ** PRIVATE METHODS\n ******************************************************************************************/\n static _logResponseError(err) {\n apiUtils.logResponseError(err, \"rcc/customer\");\n }\n\n _toJSON() {\n var customerObj = {};\n var addrObj = {};\n\n addrObj.addressLine1 = this.address.line1;\n addrObj.addressLine2 = this.address.line2;\n addrObj.addressLocality = this.address.locality;\n addrObj.addressRegion = this.address.region;\n addrObj.postalCode = this.address.postalCode;\n\n customerObj.crmId = this.crmId;\n customerObj.title = this.title;\n customerObj.firstName = this.firstName;\n customerObj.surname = this.surname;\n customerObj.email = this.email;\n customerObj.phone = this.phone;\n customerObj.address = addrObj;\n customerObj.consent = this.consent;\n\n return JSON.stringify(customerObj);\n }\n}","import validate from './validate'\n\nexport const format = (values, delimiter, limit) => {\n let formatted = ''\n let assignedCount = 0\n limit = limit || 9999\n if (values !== null && Array.isArray(values) === true) {\n for(let i=0;i '' ? value.trim() : ''\n if (value > '') {\n if (value && assignedCount === 0) {\n assignedCount = 1\n formatted = value\n } else {\n assignedCount++\n formatted = formatted + delimiter + value\n }\n } \n } \n }\n }\n return formatted;\n}\nexport const formatName = (title, firstName, surname, delimiter) => {\n return format([title, firstName, surname], delimiter) \n}\n\nexport const formatEmail = (email) => {\n // TODO: any formatting on email required?\n return email;\n}\n\nexport const formatAddress = (line1, line2, locality, region, postalCode, delimiter) => { \n let formattedPart1 = format([line1, line2], delimiter, 1) \n let formattedPart2 = format([postalCode, locality, region], delimiter, 1)\n return format([formattedPart1, formattedPart2], delimiter) \n}\n\nexport const formatTelephone = (telephone) => { \n let phone = telephone.trim() || ''\n if (validate.field('telephone', phone) === true) {\n // Check the phone number is one we can format, and also that it doesnt already have a international dialing code\n if (phone.replace(/[\\s+()]/g, '').length >= 11 && /^\\+/.test(phone) === false) { \n phone = phone.replace(/[\\s+()]/g, '').replace(/(.)(\\d{4})(\\d)/, '$1$2 $3') || ''\n } else {\n // however, if the number starts with +44 and is 10 characters long without the UK code, we can format it\n if (phone.replace(/^\\+44/, '0').replace(/[\\s()]/g, '').length === 11) {\n phone = phone.replace(/^\\+44/, '0').replace(/[\\s()]/g, '').replace(/(.)(\\d{4})(\\d)/, '$1$2 $3') || ''\n } else {\n // Use as is\n } \n } \n } else {\n phone = ''\n }\n return phone \n}\n\nexport const formatConsent = (consent) => {\n return consent !== null ? consent === true ? true : false : null;\n}\n\nexport const formatConsentDate = (consentDate) => {\n let formattedDate = '';\n\n if (consentDate !== undefined && consentDate !== \"\") {\n var dateObj = new Date(consentDate);\n let dd = dateObj.getDate();\n let mmm = [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"][dateObj.getMonth()];\n let yyyy = dateObj.getFullYear();\n dd = dd < 10 ? '0'+dd : dd;\n\n formattedDate = `${dd} ${mmm} ${yyyy}`\n }\n\n return formattedDate;\n}","import customer from './customer';\nimport {formatName, formatEmail, formatAddress, formatConsent, formatTelephone, formatConsentDate} from '../utilities/format';\n\n/*****************************************************************************************\n** @description @todo\n******************************************************************************************/\nexport default class searchResultRow {\n /*****************************************************************************************\n ** FIELDS\n ******************************************************************************************/\n #_customer = null;\n #_name = \"\";\n #_email = \"\";\n #_address = \"\";\n #_telephone = \"\";\n #_consent = \"\";\n #_consentDate = \"\";\n #_profilingConsent = \"\";\n #_profilingConsentDate = \"\";\n /*****************************************************************************************\n ** CONSTRUCTOR\n ******************************************************************************************/\n constructor(customerObj) {\n if ((customerObj == null) || (customerObj instanceof customer !== true)) {\n console.log(\"Warning: searchResultRow constructed without customer object.\")\n\n // Set properties to supplied values or defaults if not supplied:\n this.#_customer = null;\n this.#_name = \"\";\n this.#_email = \"\";\n this.#_address = \"\";\n this.#_telephone = \"\";\n this.#_consent = \"\";\n this.#_consentDate = \"\";\n this.#_profilingConsent = \"\";\n this.#_profilingConsentDate = \"\";\n }\n else\n {\n this.#_customer = customerObj;\n this.#_name = formatName(this.customer.title, this.customer.firstName, this.customer.surname, ' ');\n this.#_email = formatEmail(this.customer.email);\n this.#_address = formatAddress(this.customer.address.line1, this.customer.address.line2, this.customer.address.locality, this.customer.address.region, this.customer.address.postalCode, ', ');\n this.#_telephone = formatTelephone(this.customer.phone);\n this.#_consent = formatConsent(this.customer.consent);\n this.#_consentDate = formatConsentDate(this.customer.consentDate);\n this.#_profilingConsent = formatConsent(this.customer.profilingConsent);\n this.#_profilingConsentDate = formatConsentDate(this.customer.profilingConsentDate);\n }\n }\n\n /*****************************************************************************************\n ** PROPERTIES\n ******************************************************************************************/\n get customer() {\n return this.#_customer;\n }\n\n get name() {\n return this.#_name;\n }\n\n get email() {\n return this.#_email;\n }\n\n get address() {\n return this.#_address;\n }\n \n get telephone() {\n return this.#_telephone;\n }\n \n get consent() {\n return this.#_consent;\n }\n\n get consentDate() {\n return this.#_consentDate;\n }\n\n get profilingConsent() {\n return this.#_profilingConsent;\n }\n\n get profilingConsentDate() {\n return this.#_profilingConsentDate;\n }\n\n /*****************************************************************************************\n ** PUBLIC METHODS\n ******************************************************************************************/\n\n \n\n /*****************************************************************************************\n ** PRIVATE METHODS\n ******************************************************************************************/\n \n}","import { v4 as uuidv4 } from 'uuid';\n\nclass User { \n constructor(openId) {\n this.firstName = openId.profile.FirstName || '';\n this.surname = openId.profile.LastName || '';\n this.setBrand(String(openId.profile['T-Brand'] || '').toLowerCase());\n this.username = openId.profile.username || '';\n this.loggedInCentreCode = this.getCenterCodeFromUsername(this.username);\n this.selectedCentreCode = this.loggedInCentreCode;\n this.selectedCentreName = this.loggedInCentreName || '';\n this.email = String(openId.profile.email || '');\n this.authToken = openId.id_token;\n this.multiCentreRole = this.isMultiCentreRole(openId.profile.Roles);\n // Track when we started\n this.started = new Date().getTime();\n this.sessionId = uuidv4();\n }\n\n getCenterCodeFromUsername(username) {\n let code = \"\";\n try {\n if ((username !== null) && (username.length >= 6)) {\n code = username.substring(username.length - 6);\n }\n } catch (error) {\n console.log(\"Error extracing centre code from username: \" + error.message);\n }\n return code;\n }\n\n isMultiCentreRole(Roles) {\n let rtn = false;\n let role = process.env.REACT_APP_MULTICENTRE_ROLE || \"RCC Group User\";\n if (role && role.trim() > \"\") {\n var regex = new RegExp(role);\n rtn = regex.test(Roles); \n }\n \n return rtn; \n }\n\n setBrand(franchise) {\n this.brand = franchise;\n this.displayBrand = this.brand.charAt(0).toUpperCase() + this.brand.slice(1);\n }\n \n}\n\nlet context = undefined;\nlet singleton = {};\n\nObject.defineProperty(singleton, \"active\", {\n get: function () {\n return context;\n },\n set: function (openId) {\n if (typeof openId === 'object' && !Array.isArray(openId) && openId !== null) {\n context = new User(openId)\n } else {\n context = undefined;\n }\n }\n});\n\n// Do not allow the interface to change\nObject.freeze(singleton);\n\nexport default singleton","import React from 'react';\nimport User from '../classes/user';\n\nconst userData = (path) => {\n const fields = path.split('.')\n let value = User.active;\n if(value) {\n fields.forEach(key => value = value[key])\n }\n return value\n}\n\nconst ApplicationContent = {\n title:
Retailer Consent Capture Tool
(Retail customers only)
,\n backButtonText: \"Change Centre Selection\",\n clearButtonText: \"Clear\",\n searchButtonText: \"Search\",\n cancelSearchButtonText: \"Cancel and modify search​\",\n newCustomerButtonText: \"Create new customer\",\n submitButtonTextExistingConsent: \"Finish\",\n submitButtonTextNewOrChangedConsent: \"Capture Consent\"\n}\n// DYNAMIC CONTENT \nObject.defineProperty(ApplicationContent, \"footerExistingOptedIn\", {\n get: () => {\n return

Select ‘Finish’ to confirm there is no change to consent or un-tick News, Offers and Events to opt the customer out of {userData(\"displayBrand\")} marketing and then confirm by pressing ‘Capture Consent’

\n }\n});\nObject.defineProperty(ApplicationContent, \"footerExistingOptedOut\", {\n get: () => {\n return

Select ‘Finish’ to confirm there is no change to {userData(\"displayBrand\")} consent, or select the ‘Opt In’ button to change consent, and then confirm by pressing ‘Capture Consent’

\n }\n});\nObject.defineProperty(ApplicationContent, \"footerExistingChanged\", {\n get: () => {\n return

Select ‘Capture Consent’ to update your customer’s {userData(\"displayBrand\")} marketing preference. If the News, Offers and Events box is left blank, the customer will be opted out of marketing.​

\n }\n});\nObject.defineProperty(ApplicationContent, \"footerNewCustomer\", {\n get: () => {\n return

Select ‘Capture Consent’ to update your customer’s {userData(\"displayBrand\")} marketing preference.​ If the News, Offers and Events box is left blank, the customer will be opted out of marketing.

\n }\n});\n\nconst CentreSelectionContent = {\n welcomeMessage:

Select the Centre you wish to collect consent for:

,\n centreLoadFailMessage: Unable to load centres for your group. If this issue persists then report to TGB help desk and share with them the error message shown below.\n}\n// DYNAMIC CONTENT\nObject.defineProperty(CentreSelectionContent, \"todo\", {\n get: () => {\n return some dynamic content not written yet\n }\n});\n\nconst CustomerInputContent = {\n communicationMethods: To proceed to ‘Search’, please also enter at least one of the three following contact methods:\n}\n// DYNAMIC CONTENT\nObject.defineProperty(CustomerInputContent, \"instruction\", {\n get: () => {\n return Customer Search: Check if your customer exists within the {userData(\"displayBrand\")} CRM database.​

\n Use the following boxes to help us identify if this is a known customer to {userData(\"displayBrand\")}. The more information you provide, the more likely we will be able to find a match:
\n }\n});\n\nconst SearchResultsContent = {\n instruction:

The following existing customer(s) matched your search details.​

Select the correct customer you wish to collect consent for, or, if none of these are correct, select either ‘Cancel and modify search’ or ‘Create new customer’.

,\n noMatchMessage:

There are no customers matching the search details you entered.

Please double check your search details by clicking ‘Cancel and modify search’. If you are sure that this is not a returning customer, select ‘Create new customer’.

,\n tooManyMatchesMessage:

Your search resulted in too many records being found. Please refine your search criteria and try again.

,\n selectCustomerButtonText: \"Select\"\n}\n\nconst Application = (key) => {\n return ApplicationContent[key] ||

Application.{key} content not found

\n}\n\nconst CentreSelection = (key) => {\n return CentreSelectionContent[key] ||

CentreSelectionContent.{key} content not found

\n}\n\nconst CustomerInput = (key) => {\n return CustomerInputContent[key] ||

CustomerInputContent.{key} content not found

\n}\n\nconst SearchResults = (key) => {\n return SearchResultsContent[key] ||

SearchResults.{key} content not found

\n}\n\nconst TermsAndConditionsContent = {\n toyota:
\n
\n
\n

Toyota (GB) Plc takes data protection seriously​

\n
\n
\n
\n
\n

Where you give us consent to do so, we would like to tell you about new products, services, offers and events by sending you personalised communications by email, phone, SMS or post.

\n

Where you give us further consent to do so, we would like to send you personalised communications by creating an individual profile.

\n

We may also remind you when your service is due or other products purchased from us are due for renewal, as well as periodically inviting you to participate in research and customer satisfaction activities.

\n

You are in control of your data and you can unsubscribe or change your preferences at any time from Toyota (GB) Plc communications as set out below.

\n

For further information on how Toyota (GB) Plc processes your data, including exercising your rights, or whom we share your data with please visit www.toyota.co.uk/footer/privacy-policy or ask for a copy of our Privacy Policy.

\n
\n
\n
\n
\n

Putting you in the driving seat​

\n
\n
\n
\n
\n

You can unsubscribe or change your marketing preferences at any time to suit you. To change your communication preferences please either email privacy@tgb.toyota.co.uk or call 0344 701 6202

\n
\n
\n
,\n lexus:
\n
\n
\n

Lexus UK takes data protection seriously​

\n
\n
\n
\n
\n

Where you give us consent to do so, we would like to tell you about new products, services, offers and events by sending you personalised communications by email, phone, SMS or post.

\n

Where you give us further consent to do so, we would like to send you personalised communications by creating an individual profile.

\n

We may also remind you when your service is due or other products purchased from us are due for renewal, as well as periodically inviting you to participate in research and customer satisfaction activities.

\n

You are in control of your data and you can unsubscribe or change your preferences at any time from Lexus UK communications as set out below.

\n

For further information on how Lexus UK processes your data, including exercising your rights, or whom we share your data with please visit https://www.lexus.co.uk/customer-data/privacy-policy/ or ask for a copy of our Privacy Policy.

\n
\n
\n
\n
\n

Putting you in the driving seat​

\n
\n
\n
\n
\n

You can unsubscribe or change your marketing preferences at any time to suit you. To change your communication preferences please either email privacy@ld.lexus.co.uk or call on 0344 701 6202​

\n
\n
\n
\n}\n// DYNAMIC CONTENT\nObject.defineProperty(TermsAndConditionsContent, \"linkText\", {\n get: () => {\n return `${userData(\"displayBrand\")} Privacy Notice`;\n }\n});\nObject.defineProperty(TermsAndConditionsContent, \"PreLinkText\", {\n get: () => {\n return `Please ensure that you make the `;\n }\n});\nObject.defineProperty(TermsAndConditionsContent, \"PostLinkText\", {\n get: () => {\n return ` available to the customer.`;\n }\n});\nconst TermsAndConditions = (key) => {\n return TermsAndConditionsContent[key] || \n}\n\nconst ReasonForVisitContent = {\n title: We would also like to capture the reason for visit. Please select from the options below:​,\n aftersalesLabel: 'Aftersales',\n salesLabel: 'Sales'\n}\n\nconst ConsentPageContent = {\n eventSavedUnmodifiedConsentConfirmationText: 'Customer consent confirmed.',\n eventSavedModifiedProfileConsentConfirmationText: \"Customer consent confirmed and Personalised Communications updated.\",\n eventSavedNewCustomerConfirmationText: 'Customer consent captured.',\n eventSavedModifiedConsentConfirmationText: 'Customer consent updated.'\n}\n\nconst ConsentPage = (key) => {\n return ConsentPageContent[key] || \n}\n\nconst ReasonForVisit = (key) => {\n return ReasonForVisitContent[key] || \n}\n\nconst ConsentCaptureContent = {\n optInLabel: 'Yes, I would like to be kept informed about the latest news, offers and events (Opt In)',\n outOutLabel: 'No, I do not wish to be kept informed about the latest news, offers and events (Opt Out)​',\n offerHeader: 'News, Offers & Events',\n personalisedCommHeader: 'Personalised Communications',\n profilingOptInLabel: 'Yes, I would like to receive personalised offers and services (Opt In)',\n profilingOptOutLabel: 'No, I do not wish to receive personalised offers and services (Opt Out)'\n\n}\n\nconst ConsentCapture = (key) => {\n return ConsentCaptureContent[key] || \n}\n\nconst AddressLookUpContent = {\n labelAddress1: 'Address 1',\n labelAddress2: 'Address 2',\n labelTown: 'Town',\n labelCounty: 'County',\n labelHouse: 'House name / no',\n labelPostcode: 'Postcode',\n addressLineError: 'Letters, numbers and basic punctuation only',\n postcodeError: 'Please enter a valid postcode',\n sericeError: 'Service error, please enter address manually',\n notFound: 'Address not found, please enter manually'\n\n }\n \n const AddressLookUp = (key) => {\n return AddressLookUpContent[key] || ''\n }\n\n const TimeZoneErrorMessageContent = {\n keyword: 'iat is in the future',\n headline: 'Error logging in',\n description: 'Please check the current time on your computer and correct it. For any further assistance with this issue, please contact your System Admin. If you are still unable to login, please refer to TGB Helpdesk'\n }\n\n const TimeZoneErrorMessage = (key) => {\n return TimeZoneErrorMessageContent[key] || ''\n}\n\nexport default {\n Application,\n CentreSelection,\n CustomerInput,\n SearchResults,\n userData,\n TermsAndConditions,\n ConsentPage,\n ReasonForVisit,\n ConsentCapture,\n AddressLookUp,\n TimeZoneErrorMessage\n} \n","import React, { Component } from 'react';\nimport { Modal } from 'react-bootstrap';\n\n\nclass Waiting extends Component {\n\n render = () => {\n return (\n
\n \n \n
\n )\n }\n}\n\nexport default Waiting;","import request from 'superagent';\nimport apiUtils from './apiUtils';\n\n/*****************************************************************************************\n** @description The centre class provides the business logic model for all operations\n** relating to centres. Primarily it provides a method to fetch a list of centres\n** that are in the same group as the logged in user.\n******************************************************************************************/\nexport default class centre {\n /*****************************************************************************************\n ** FIELDS\n ******************************************************************************************/\n #_code = \"\";\n #_name = \"\";\n #_franchise = \"\";\n\n /*****************************************************************************************\n ** CONSTRUCTOR\n ******************************************************************************************/\n constructor(code, name, franchise) {\n // Set properties to supplied values or defaults if not supplied:\n this.code = code || \"\";\n this.name = name || \"\";\n this.franchise = franchise || \"\";\n }\n\n /*****************************************************************************************\n ** PROPERTIES\n ******************************************************************************************/\n get code() {\n return this.#_code;\n }\n set code(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set code. Expected type String\");\n }\n\n this.#_code = value;\n }\n\n get name() {\n return this.#_name;\n }\n set name(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set name. Expected type String\");\n }\n\n this.#_name = value;\n }\n\n get franchise() {\n return this.#_franchise;\n }\n set franchise(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set franchise. Expected type String\");\n }\n\n this.#_franchise = value;\n }\n\n /*****************************************************************************************\n ** PUBLIC METHODS\n ******************************************************************************************/\n\n /*****************************************************************************************\n ** @todo Search method\n ******************************************************************************************/\n static getGroupCentres(centreCode, user) {\n return new Promise((resolve, reject) => {\n // Check that we have valid data and configuration before sending request:\n var err = null;\n\n\n if (apiUtils.isValidCentreCode(centreCode) === false) {\n console.log(\"Unable to find group dealers - an invalid centre code is being used for search.\")\n err = new TypeError(\"Invalid centre code\");\n }\n else if (apiUtils.userProfileValid(user) === false) {\n console.log(\"Unable to search. User context is invalid.\");\n err = new Error(\"User context is not set or is invalid\");\n }\n if (err != null) {\n // Return the error resulting from input validation:\n reject(err);\n }\n else {\n // Valid parameters:\n //var url = 'https://tgb-edp-dev-neu-apim-01.azure-api.net/core/dealer/' + centreCode;\n var url = process.env.REACT_APP_API_URL + 'core/dealer/' + centreCode;\n\n // Send request:\n request\n .get(url)\n .set('Authorization', apiUtils.getBearerToken(user))\n .set('sessionId', apiUtils.getSessionId(user))\n .timeout({\n response: 10000, // Wait 10 seconds for server response,\n deadline: 15000, // Wait 15 seconds total - small request\n })\n .then((res) => {\n // Response has returned with status 2XX:\n console.log(\"Dealer search returned\");\n\n // Check that we have an array of results:\n let err = null;\n\n // Validate structure of response:\n let centreStructureOk =\n res.body.hasOwnProperty(\"code\") &&\n res.body.hasOwnProperty(\"name\") &&\n res.body.hasOwnProperty(\"franchise\") &&\n res.body.hasOwnProperty(\"status\") &&\n res.body.hasOwnProperty(\"group\");\n\n let groupStructureOk = false;\n if (centreStructureOk === true) {\n let group = res.body.group;\n\n groupStructureOk =\n group.hasOwnProperty(\"id\") &&\n group.hasOwnProperty(\"name\") &&\n group.hasOwnProperty(\"dealers\");\n\n if (Array.isArray(group.dealers) === false) {\n groupStructureOk = false;\n }\n }\n\n let dealerStructureOk = false;\n if (groupStructureOk === true) {\n let dealer;\n dealerStructureOk = true;\n for (dealer of res.body.group.dealers) {\n if (dealer === null) {\n err = new Error(\"Response was not in the expected format - expected dealer object\");\n }\n else {\n dealerStructureOk =\n dealer.hasOwnProperty(\"code\") &&\n dealer.hasOwnProperty(\"name\") &&\n dealer.hasOwnProperty(\"franchise\") &&\n dealer.hasOwnProperty(\"status\");\n }\n }\n }\n\n if ((dealerStructureOk === false) || (groupStructureOk === false) || (centreStructureOk === false)) {\n err = new Error(\"Response was not in the expected format - expected dealers object\");\n }\n\n if (err !== null) {\n centre._logResponseError(err);\n reject(err);\n }\n else {\n let groupDealers = [];\n let dealer;\n for (dealer of res.body.group.dealers) {\n // Only take centres that are open:\n if (dealer.status.toLowerCase() === \"open\") {\n let c = new centre(dealer.code, dealer.name, dealer.franchise);\n groupDealers.push(c);\n }\n }\n\n resolve(groupDealers);\n }\n })\n .catch(err => {\n // Response has returned with status != 2XX:\n console.log(\"Error from invocation of dealer search API\");\n centre._logResponseError(err);\n reject(err);\n });\n }\n });\n }\n\n\n /*****************************************************************************************\n ** PRIVATE METHODS\n ******************************************************************************************/\n static _logResponseError(err) {\n apiUtils.logResponseError(err, \"core/dealer\");\n }\n}","import { ApplicationInsights } from '@microsoft/applicationinsights-web'\nimport { ReactPlugin, withAITracking } from '@microsoft/applicationinsights-react-js'\nimport { createBrowserHistory } from \"history\";\nconsole.log('App Insights');\nconst browserHistory = createBrowserHistory({ basename: '' });\nconst reactPlugin = new ReactPlugin();\nconst ai = new ApplicationInsights({\n config: {\n instrumentationKey: process.env.REACT_APP_APPINSIGHTS_KEY,\n extensions: [reactPlugin],\n extensionConfig: {\n [reactPlugin.identifier]: { history: browserHistory }\n }\n }\n})\n\nai.loadAppInsights();\n\nexport default (Component) => withAITracking(reactPlugin, Component)\nexport const appInsights = ai","import React, { Component } from 'react';\nimport { Modal } from 'react-bootstrap';\n\n\nclass Popup extends Component {\n render = () => {\n return (\n \n \n

{this.props.title || 'Information'}

\n
\n \n

{this.props.primary}

\n

{this.props.secondary || ''}

\n
\n \n \n \n
\n )\n }\n}\n\nexport default Popup;","import React, { Component } from 'react';\nimport Resources from '../../resources/content';\nimport Waiting from '../../Components/Waiting';\nimport centre from '../../classes/centre';\nimport User from '../../classes/user';\nimport { appInsights } from '../../AppInsights';\nimport Popup from '../../Components/Popup';\n\nclass CentreSelection extends Component {\n constructor(props) {\n super(props);\n\n let noFn = () => { };\n\n this.state = {\n onChanged: props.onChanged || noFn,\n onMounted: props.onMounted || noFn,\n handleNextClick: props.handleNextClick || noFn,\n selectedCentre: props.centre || null,\n waiting: false,\n centres: [],\n filteredCentres: [],\n showModal: false,\n modalMessageMain: '',\n modalMessageSecondary: '',\n activeListItem: -1,\n selectedCentreCode: '', \n searchText: props.searchText\n }\n\n this.handleSelectionChange = this.handleSelectionChange.bind(this);\n this.handleModalClose = this.handleModalClose.bind(this);\n }\n \n componentDidMount() {\n this.setState({ waiting: true });\n document.addEventListener(\"keydown\", this.handleKeyDown);\n centre.getGroupCentres(User.active.loggedInCentreCode, User.active)\n .then((groupCentres) => { \n groupCentres.sort((a, b) => {\n if (a.code < b.code) {\n return -1;\n }\n else if (a.code > b.code) {\n return 1;\n }\n else {\n return 0;\n }\n });\n this.setState({\n centres: groupCentres,\n filteredCentres: groupCentres\n });\n this.setSelectedCentre(this.props.selectedCentreCode);\n if (User.active.multiCentreRole === false) {\n this.state.handleNextClick();\n } else {\n let centre = groupCentres.filter(item => item.code === User.active.loggedInCentreCode)[0];\n User.active.selectedCentreName = centre.name;\n this.state.onChanged(this, centre);\n }\n })\n .catch(err => {\n appInsights.trackEvent({ name: \"RCC_EVENT_FAILED_TO_LOAD_CENTRES\", properties: { sessionId: User.active.sessionId } });\n this.showModal(Resources.CentreSelection('centreLoadFailMessage'), `Error: ${err.message}`, `Application Error`);\n })\n .finally(() => {\n this.setState({ waiting: false })\n this.state.onMounted(this);\n });\n }\n\n clearFilter = () => {\n this.filterCentres('');\n }\n\n handleKeyDown = (e) => {\n let index = -1;\n if (this.state.filteredCentres && this.state.filteredCentres.length > 0) {\n if (this.state.selectedCentreCode) {\n index = this.state.filteredCentres.findIndex((item) => item.code === this.state.selectedCentreCode);\n }\n switch (e.key) {\n case \"ArrowUp\":\n if (index === -1) {\n index = this.state.filteredCentres.length;\n }\n if (index > 0 && this.state.filteredCentres[index - 1]) {\n this.setSelectedCentre(this.state.filteredCentres[index - 1].code);\n }\n break;\n case \"ArrowDown\":\n if (index < this.state.filteredCentres.length - 1 && this.state.filteredCentres[index + 1]) {\n this.setSelectedCentre(this.state.filteredCentres[index + 1].code);\n }\n break;\n case \"Enter\":\n if (this.state.selectedCentreCode && this.state.selectedCentre) {\n this.state.handleNextClick();\n }\n break;\n default:\n break;\n }\n }\n };\n\n handleSelectionChange = (e) => {\n this.setSelectedCentre(e._targetInst.key);\n }\n\n showModal = (message1, message2, title) => {\n this.setState({\n waiting: false,\n showModal: true,\n modalMessageMain: message1,\n modalMessageSecondary: message2\n });\n };\n\n handleModalClose = () => {\n this.setState({\n waiting: false,\n showModal: false,\n modalMessageMain: '',\n modalMessageSecondary: ''\n });\n };\n\n handleCentreSearch = (e) => {\n this.filterCentres(e.target.value)\n };\n\n filterCentres = (filterText) => {\n this.setState({\n searchText: filterText\n })\n\n let filteredCentres = this.state.centres.filter((item) => {\n return (item.code + item.name).toLowerCase().indexOf(filterText.toLowerCase()) >= 0;\n });\n this.setState({\n filteredCentres: filteredCentres\n });\n let isSelectedInList = filteredCentres.some((item) => item.code === this.state.selectedCentreCode);\n if (isSelectedInList) {\n this.setSelectedCentre(this.state.selectedCentreCode);\n } else {\n this.setSelectedCentre('');\n }\n }\n\n setSelectedCentre = (centreCode) => {\n let centre = this.state.centres.filter(item => item.code === centreCode)[0];\n if (centre) {\n this.setState({\n selectedCentreCode: centreCode,\n selectedCentre: centre\n });\n }\n else {\n this.setState({\n selectedCentreCode: '',\n selectedCentre: null\n });\n }\n this.state.onChanged(this, centre);\n };\n\n render = () => {\n return (
\n
\n
\n
{Resources.CentreSelection('welcomeMessage')}
\n
\n \n
\n
\n
    \n {this.state.filteredCentres.map((el, i) => (\n
  • \n {el.code}: {el.name}\n
  • \n ))}\n
\n
\n
\n
\n\n \n \n
)\n }\n}\n\nexport default CentreSelection;","import React from 'react';\nimport address from '../../classes/address';\nimport validate from '../../utilities/validate';\nimport User from '../../classes/user';\nimport Resources from '../../resources/content';\nimport Waiting from '../Waiting';\nimport { appInsights } from '../../AppInsights';\n\n\nclass AddressLookup extends React.Component {\n /*****************************************************************************************\n ** PRIVATE FIELDS\n ******************************************************************************************/\n #_houseIsValid = false;\n #_postcodeIsValid = false;\n #_line1IsValid = false;\n #_line2IsValid = false;\n #_townIsValid = false;\n #_countyIsValid = false;\n\n /*****************************************************************************************\n ** CONSTRUCTOR\n ******************************************************************************************/\n constructor(props) {\n super(props);\n this.state =\n {\n fullScreen: props.fullScreen || false,\n colStyle: props.colStyle || 'col-md-2',\n btnColStyle: props.btnColStyle || 'col-sm-6 col-md-2 align-self-center align-self-middle w-50 mt-2',\n houseVal: props.house || \"\",\n postcodeVal: props.postcode || \"\",\n line1Val: \"\",\n line2Val: \"\",\n townVal: \"\",\n countyVal: \"\",\n lookupReturned: false,\n houseIsValid: true,\n postcodeIsValid: true,\n line1IsValid: true,\n errorMessage: null,\n line2IsValid: true,\n townIsValid: true,\n countyIsValid: true,\n findButtonDisabled: \"disabled\",\n showLookupError: false,\n showNotFound: false\n };\n\n // Event Handler Bindings:\n this._onFindAddressClick = this._onFindAddressClick.bind(this);\n this._onFieldChange = this._onFieldChange.bind(this);\n this.reset = this.reset.bind(this);\n }\n\n /*****************************************************************************************\n ** PROPERTIES\n ******************************************************************************************/\n get isValid() {\n return this.#_postcodeIsValid &&\n this.#_line1IsValid &&\n this.#_line2IsValid &&\n this.#_townIsValid &&\n this.#_countyIsValid;\n }\n\n get isEmpty() {\n let postcodeIsEmpty = (this.state.postcodeVal.replace(/\\s+/g, '').length === 0);\n let line1IsEmpty = (this.state.line1Val.replace(/\\s+/g, '').length === 0);\n let line2IsEmpty = (this.state.line2Val.replace(/\\s+/g, '').length === 0);\n let townIsEmpty = (this.state.townVal.replace(/\\s+/g, '').length === 0);\n let countyIsEmpty = (this.state.countyVal.replace(/\\s+/g, '').length === 0);\n\n return postcodeIsEmpty &&\n line1IsEmpty &&\n line2IsEmpty &&\n townIsEmpty &&\n countyIsEmpty;\n }\n\n get mandatoryFieldsHaveData() {\n // Postcode, line1 and town are mandatory:\n let postcodeHasData = (this.state.postcodeVal.replace(/\\s+/g, '').length > 0);\n let line1HasData = (this.state.line1Val.replace(/\\s+/g, '').length > 0);\n let townHasData = (this.state.townVal.replace(/\\s+/g, '').length > 0);\n\n return postcodeHasData &&\n line1HasData &&\n townHasData;\n }\n\n /*****************************************************************************************\n ** PUBLIC METHODS\n ******************************************************************************************/\n\n /*\n Resets the form back to its starting state \n */\n reset() {\n this.setState(\n {\n houseVal: \"\",\n postcodeVal: \"\",\n line1Val: \"\",\n line2Val: \"\",\n townVal: \"\",\n countyVal: \"\",\n lookupReturned: false,\n houseIsValid: true,\n postcodeIsValid: true,\n line1IsValid: true,\n line2IsValid: true,\n townIsValid: true,\n countyIsValid: true,\n findButtonDisabled: 'disabled',\n showLookupError: false,\n showNotFound: false,\n waiting: false\n }, () => {\n // Refresh the validity of the fields based on the change of state:\n this._refreshFieldsValidity();\n\n this._raiseAddressChangeEvent();\n });\n }\n\n resetNonSearchFields() {\n this.setState(\n {\n line1Val: \"\",\n line2Val: \"\",\n townVal: \"\",\n countyVal: \"\",\n lookupReturned: false,\n houseIsValid: true,\n postcodeIsValid: true,\n line1IsValid: true,\n line2IsValid: true,\n townIsValid: true,\n countyIsValid: true,\n findButtonDisabled: 'disabled',\n showLookupError: false,\n showNotFound: false,\n waiting: false\n }, () => {\n // Refresh the validity of the fields based on the change of state:\n this._refreshFieldsValidity();\n\n this._raiseAddressChangeEvent();\n });\n }\n /*****************************************************************************************\n ** REACT LIFECYCLE METHODS\n ******************************************************************************************/\n // Executes when the component is rendered to the DOM for the first time:\n componentDidMount() {\n }\n\n // Executes when the component is removed from the DOM:\n componentWillUnmount() {\n }\n\n // Construct react element to render:\n render() {\n\n let addressFields = null;\n\n if (this.state.lookupReturned) {\n addressFields = (
\n
\n  \n
\n
\n
\n \n \n

{this.state.errorMessage}

\n
\n
\n \n \n

{this.state.errorMessage}

\n
\n
\n
\n
\n \n \n

{this.state.errorMessage}

\n
\n
\n \n \n

{this.state.errorMessage}

\n
\n
\n
\n );\n }\n\n return (\n
\n
\n
\n \n \n

{Resources.AddressLookUp('addressLineError')}

\n
\n
\n \n \n

{Resources.AddressLookUp('postcodeError')}

\n
\n
\n \n \n

{Resources.AddressLookUp('sericeError')}

\n

{Resources.AddressLookUp('notFound')}

\n
\n
\n {addressFields}\n \n
\n );\n }\n\n /*****************************************************************************************\n ** EVENTS\n ******************************************************************************************/\n // onAddressChange(address) event is raised whenever an address field value changes:\n _raiseAddressChangeEvent() {\n let addrObj = new address(this.state.line1Val, this.state.line2Val, this.state.townVal, this.state.countyVal, this.state.postcodeVal);\n this.props.onAddressChange(addrObj, this);\n }\n\n /*****************************************************************************************\n ** EVENT HANDLERS\n ******************************************************************************************/\n _onFindAddressClick(e) {\n e.preventDefault();\n this.setState({ waiting: true });\n address.lookup(this.state.houseVal, this.state.postcodeVal, User.active)\n .then((addrObj) => {\n this.setState(\n {\n postcodeVal: addrObj.postalCode,\n line1Val: addrObj.line1,\n line2Val: addrObj.line2,\n townVal: addrObj.locality,\n countyVal: addrObj.region,\n lookupReturned: true,\n showLookupError: false,\n showNotFound: addrObj.addressNotFound,\n waiting: false\n }, () => {\n // Refresh the validity of the fields based on the change of state:\n this._refreshFieldsValidity();\n this._raiseAddressChangeEvent();\n }\n );\n appInsights.trackTrace({ message: \"Address lookup returned\", severityLevel: 1, properties: { sessionId: User.active.sessionId, house: this.state.houseVal, postalCode: this.state.postcodeVal } });\n })\n .catch(e => {\n // Errors from address lookup should be non-blocking:\n this.setState(\n {\n line1Val: this.state.houseVal,\n line2Val: \"\",\n townVal: \"\",\n countyVal: \"\",\n lookupReturned: true,\n showLookupError: true,\n showNotFound: false,\n waiting: false\n }, () => {\n // Refresh the validity of the fields based on the change of state:\n this._refreshFieldsValidity();\n this._raiseAddressChangeEvent();\n }\n );\n appInsights.trackTrace({ message: \"Address lookup failed\", severityLevel: 2, properties: { sessionId: User.active.sessionId, house: this.state.houseVal, postalCode: this.state.postcodeVal } });\n });\n }\n\n _onFieldChange(e) {\n let targetId = e.target.id;\n let targetValue = e.target.value;\n let resetLookUp = (this.state.lookupReturned && targetId === 'txtPostcode' ? false : this.state.lookupReturned);\n if(!resetLookUp)\n {\n this.resetNonSearchFields();\n }\n this.setState({\n [this._getBindingPathForControlById(targetId)]: targetValue,\n lookupReturned: resetLookUp\n }, () => {\n // Refresh the validity of the fields based on the change of state:\n this._refreshFieldsValidity();\n\n // We only want to raise the address changed event when one of the main address fields changes:\n if (targetId !== \"txtHouse\") {\n this._raiseAddressChangeEvent();\n }\n });\n }\n\n /*****************************************************************************************\n ** PRIVATE METHODS\n ******************************************************************************************/\n _getBindingPathForControlById(ctrlId) {\n let bindingPath = \"\";\n switch (ctrlId) {\n case \"txtHouse\":\n bindingPath = \"houseVal\";\n break;\n case \"txtPostcode\":\n bindingPath = \"postcodeVal\";\n break;\n case \"txtAddressLine1\":\n bindingPath = \"line1Val\";\n break;\n case \"txtAddressLine2\":\n bindingPath = \"line2Val\";\n break;\n case \"txtAddressTown\":\n bindingPath = \"townVal\";\n break;\n case \"txtAddressCounty\":\n bindingPath = \"countyVal\";\n break;\n default:\n console.log(\"No binding path defined for \" + ctrlId);\n }\n\n return bindingPath;\n }\n\n _refreshFieldsValidity() {\n let houseVal = this.state.houseVal;\n let postcodeVal = this.state.postcodeVal;\n let line1Val = this.state.line1Val;\n let line2Val = this.state.line2Val;\n let townVal = this.state.townVal;\n let countyVal = this.state.countyVal;\n\n this.#_houseIsValid = true;\n this.#_postcodeIsValid = true;\n this.#_line1IsValid = true;\n this.#_line2IsValid = true;\n this.#_townIsValid = true;\n this.#_countyIsValid = true;\n\n let houseIsEmpty = (houseVal.replace(/\\s+/g, '').length === 0);\n let postcodeIsEmpty = (postcodeVal.replace(/\\s+/g, '').length === 0);\n let line1IsEmpty = (line1Val.replace(/\\s+/g, '').length === 0);\n let line2IsEmpty = (line2Val.replace(/\\s+/g, '').length === 0);\n let townIsEmpty = (townVal.replace(/\\s+/g, '').length === 0);\n let countyIsEmpty = (countyVal.replace(/\\s+/g, '').length === 0);\n\n if (!houseIsEmpty) {\n this.#_houseIsValid = validate.field(\"houseNumber\", houseVal);\n }\n\n if (!postcodeIsEmpty) {\n this.#_postcodeIsValid = validate.field(\"postcode\", postcodeVal);\n }\n\n if (!line1IsEmpty) {\n this.#_line1IsValid = validate.field(\"addressLine\", line1Val);\n if (!this.#_line1IsValid) {\n this.setState({\n errorMessage: validate.errorMsgs.addressLine\n });\n }\n }\n\n if (!line2IsEmpty) {\n this.#_line2IsValid = validate.field(\"addressLine\", line2Val);\n if (!this.#_line2IsValid) {\n this.setState({\n errorMessage: validate.errorMsgs.addressLine\n });\n }\n }\n\n if (!townIsEmpty) {\n this.#_townIsValid = validate.field(\"addressLine\", townVal);\n if (!this.#_townIsValid) {\n this.setState({\n errorMessage: validate.errorMsgs.addressLine\n });\n }\n }\n\n if (!countyIsEmpty) {\n this.#_countyIsValid = validate.field(\"addressLine\", countyVal);\n if (!this.#_countyIsValid) {\n this.setState({\n errorMessage: validate.errorMsgs.addressLine\n });\n }\n }\n\n // Refresh display:\n this.setState({\n houseIsValid: this.#_houseIsValid,\n postcodeIsValid: this.#_postcodeIsValid,\n line1IsValid: this.#_line1IsValid,\n line2IsValid: this.#_line2IsValid,\n townIsValid: this.#_townIsValid,\n countyIsValid: this.#_countyIsValid,\n findButtonDisabled: (this.#_houseIsValid && this.#_postcodeIsValid && !houseIsEmpty & !postcodeIsEmpty) ? '' : 'disabled'\n });\n }\n}\n\nexport default AddressLookup;\n","import React, { Component } from 'react';\nimport AddressLookup from '../AddressLookup';\nimport validate from '../../utilities/validate';\nimport Resources from '../../resources/content';\n\nclass CustomerInput extends Component {\n constructor(props) { \n super(props);\n\n let noFn = () => {}\n let customer = props.customer || {};\n\n this.state = {\n title: customer.title || '',\n titleValid: customer.title || '',\n firstName: customer.firstName || '',\n firstNameValid: customer.firstName || '',\n firstNameFailsValidation: false,\n surname: customer.surname || '',\n surnameValid: customer.surname || '',\n surnameFailsValidation: false,\n email: customer.email || '',\n emailValid: customer.email || '',\n emailFailsValidation: false,\n telephone: customer.telephone || '',\n telephoneValid: customer.telephone || '',\n telephoneFailsValidation: false,\n address: customer.address || null,\n addressValid: undefined,\n addressFailsValidation: false\n }\n\n this.state.onMounted = props.onMounted || noFn\n this.state.onChanged = props.onChanged || noFn \n this.state.validForm = false\n\n this.handleFieldChange = this.handleFieldChange.bind(this);\n this.handleAddressChange = this.handleAddressChange.bind(this);\n } \n\n componentDidMount() {\n this.state.onMounted(this)\n }\n\n reset = () => {\n this.setState({\n title: '',\n titleValid: '',\n firstName: '',\n firstNameValid: '',\n surname: '',\n surnameValid: '',\n email: '',\n emailValid: '',\n telephone: '',\n telephoneValid: '',\n address: null,\n addressValid: undefined,\n validForm: false\n })\n\n if (this.refs.addressLookupComponent) {\n this.refs.addressLookupComponent.reset()\n }\n }\n \n isValid = () => {\n return this.state.validForm\n }\n\n handleFieldChange(e) {\n // validate the input\n let key = e.target.getAttribute('data-key') || ''\n this.validateFieldChange(key, e.target.value);\n }\n \n handleAddressChange(addressObj, e) {\n this.setState({address: addressObj}) \n let force = (e.isEmpty) || ((e.mandatoryFieldsHaveData) && (e.isValid))\n this.validateFieldChange('address', addressObj, force); \n }\n \n validateFieldChange(key, value, force) {\n force = (typeof force === 'boolean' ? force : false);\n let isValidField = false;\n let validationKey = key + 'Valid';\n let validationFailsKey = key + 'FailsValidation';\n let validatedValue = null;\n let validationErrorKey = key + 'ValidationError';\n let errorMsg = '';\n \n if (validationKey === \"addressValid\") {\n isValidField = (this.refs.addressLookupComponent.isEmpty) || ((this.refs.addressLookupComponent.mandatoryFieldsHaveData) && (this.refs.addressLookupComponent.isValid));\n validatedValue = force === true || isValidField === true ? value : undefined;\n\n if (this.refs.addressLookupComponent.isEmpty) {\n validatedValue = undefined;\n }\n } \n else {\n isValidField = validate.field(key, value.trim()) === true || value === '' ? true : false;\n validatedValue = force === true || isValidField === true ? value : this.state[validationKey];\n errorMsg = validate.errorMsgs[key]; // get the error message for this key\n }\n \n let validatedCustomer = {\n title: this.state.titleValid,\n firstName: this.state.firstNameValid,\n surname: this.state.surnameValid,\n email: this.state.emailValid,\n telephone: this.state.telephoneValid,\n address: this.state.addressValid\n }\n\n\n // Capture the current key validation fail indicators\n let validationState = {\n firstNameFailsValidation: this.state.firstNameFailsValidation,\n surnameFailsValidation: this.state.surnameFailsValidation,\n emailFailsValidation: this.state.emailFailsValidation,\n telephoneFailsValidation: this.state.telephoneFailsValidation, \n addressFailsValidation: this.state.addressFailsValidation\n }\n \n // Set the current indicator to align with the determination\n validationState[validationFailsKey] = !isValidField;\n \n\n // Track when a field becomes invalid so that we know when it's corrected:\n let anyFieldIsInvalid = validationState.firstNameFailsValidation || \n validationState.surnameFailsValidation || \n validationState.emailFailsValidation || \n validationState.telephoneFailsValidation || \n validationState.addressFailsValidation;\n\n // update the validatedCustomer with the changed value\n validatedCustomer[key] = validatedValue;\n let isValidForm = (!anyFieldIsInvalid && validate.fields(validatedCustomer) === true && isValidField === true) ? true : false;\n \n this.setState({ \n [validationFailsKey]: !isValidField,\n [validationErrorKey]: errorMsg,\n submitError: false,\n validForm: isValidForm,\n [key]: value,\n [validationKey]: validatedValue\n }); \n \n // only raise on changed with valid customers\n this.state.onChanged(this, isValidForm === true ? validatedCustomer : null)\n }\n\n render() {\n return (
\n

{Resources.CustomerInput('instruction')}

\n

 Indicates a mandatory field

\n\n\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n

{this.state.firstNameValidationError}

\n
\n
\n
\n
\n \n
\n
\n \n

{this.state.surnameValidationError}

\n
\n
\n
\n
\n
\n

 {Resources.CustomerInput('communicationMethods')}

\n
\n
\n
\n
\n
\n \n
\n
\n \n

{this.state.emailValidationError}

\n
\n
\n
\n
\n \n
\n
\n \n

UK telephone numbers only (e.g. 01737 000000)

\n
\n
\n
\n
\n
\n \n
\n
\n
)\n }\n}\n\nexport default CustomerInput;","import React from 'react';\nimport ReactTooltip from \"react-tooltip\";\nimport Resources from '../../resources/content';\n\nclass CustomerSelection extends React.Component {\n constructor(props) {\n super(props);\n let noFn = () => {}\n this.state =\n {\n onCustomerSelected: props.onCustomerSelected || noFn,\n results: props.searchResults || [],\n hasResults: (props.searchResults != null) && (Array.isArray(props.searchResults)) && (props.searchResults.length > 0)\n };\n\n this.SearchResultsGrid = this.SearchResultsGrid.bind(this);\n this.getId = this.getId.bind(this)\n }\n\n handleSelection = (e) => {\n let selectedCustomer = null;\n let selectedId = e.target.getAttribute('data');\n if ((this.state.results != null) && (Array.isArray(this.state.results)) && (this.state.results.length > 0) && (selectedId && selectedId !== \"\")) {\n let i = 0;\n while ((selectedCustomer === null) && (i < this.state.results.length)) {\n let c = this.state.results[i].customer;\n if (c.crmId === selectedId) {\n selectedCustomer = c;\n }\n i++;\n }\n }\n this.state.onCustomerSelected(selectedCustomer);\n } \n\n getId (crmId, element) {\n return crmId + element\n }\n\n SearchResultsGrid(props) { \n const content = props.searchResults.map((row) => \n
\n
\n
\n Name
\n {row.name}\n \n {row.name}\n \n
\n
\n Email
\n {row.email}\n \n {row.email}\n \n
\n
\n Telephone
\n {row.telephone}\n \n {row.telephone}\n \n
\n
\n Address
\n {row.address}\n \n {row.address}\n \n
\n
\n News, Offers & Events
\n {row.consentDate} \n {row.consentDate} \n Consent missing\n \n Opted In on {row.consentDate}\n Opted Out on {row.consentDate} \n Consent not captured\n \n
\n
\n Personalised Comms
\n {row.profilingConsentDate} \n {row.profilingConsentDate} \n Consent missing\n \n Opted In on {row.profilingConsentDate}\n Opted Out on {row.profilingConsentDate} \n Consent not captured\n \n
\n
\n \n
\n \n
\n
\n
\n ); \n \n return (\n
\n {content}\n
\n );\n }\n\n render() {\n return
\n

{Resources.SearchResults('instruction')}

\n
\n
\n \n
\n
\n
Name
\n
Email
\n
Telephone
\n
Address
\n
News, Offers & Events
\n
Personalised Comms
\n
Select customer
\n
\n
\n
\n
\n \n
\n
\n
{Resources.SearchResults('noMatchMessage')}
\n
\n

\n
\n }\n}\n\nexport default CustomerSelection;\n","import React from 'react';\nimport ReactTooltip from \"react-tooltip\";\nimport Resources from '../../resources/content';\n\nclass CustomerSelection extends React.Component {\n constructor(props) {\n super(props);\n let noFn = () => {}\n this.state =\n {\n onCustomerSelected: props.onCustomerSelected || noFn,\n results: props.searchResults || [],\n hasResults: (props.searchResults != null) && (Array.isArray(props.searchResults)) && (props.searchResults.length > 0)\n };\n\n this.SearchResultsGrid = this.SearchResultsGrid.bind(this);\n this.getId = this.getId.bind(this)\n }\n\n handleSelection = (e) => {\n let selectedCustomer = null;\n let selectedId = e.target.getAttribute('data');\n if ((this.state.results != null) && (Array.isArray(this.state.results)) && (this.state.results.length > 0) && (selectedId && selectedId !== \"\")) {\n let i = 0;\n while ((selectedCustomer === null) && (i < this.state.results.length)) {\n let c = this.state.results[i].customer;\n if (c.crmId === selectedId) {\n selectedCustomer = c;\n }\n i++;\n }\n }\n this.state.onCustomerSelected(selectedCustomer);\n } \n\n getId (crmId, element) {\n return crmId + element\n }\n\n SearchResultsGrid(props) { \n const content = props.searchResults.map((row) => \n
\n
\n
\n Name
\n {row.name}\n \n {row.name}\n \n
\n
\n Email
\n {row.email}\n \n {row.email}\n \n
\n
\n Telephone
\n {row.telephone}\n \n {row.telephone}\n \n
\n
\n Address
\n {row.address}\n \n {row.address}\n \n
\n
\n Consent value
\n {row.consentDate} \n {row.consentDate} \n Consent missing\n \n Opted In on {row.consentDate}\n Opted Out on {row.consentDate} \n Consent not captured\n \n
\n
\n \n
\n \n
\n
\n
\n ); \n \n return (\n
\n {content}\n
\n );\n }\n\n render() {\n return
\n

{Resources.SearchResults('instruction')}

\n
\n
\n \n
\n
\n
Name
\n
Email
\n
Telephone
\n
Address
\n
Consent value
\n
Select customer
\n
\n
\n
\n
\n \n
\n
\n
{Resources.SearchResults('noMatchMessage')}
\n
\n

\n
\n }\n}\n\nexport default CustomerSelection;","import React, { Component } from 'react';\nimport Customer from '../../classes/customer';\nimport validate from '../../utilities/validate';\nimport {format, formatName} from '../../utilities/format';\nimport AddressLookup from '../AddressLookup';\nimport Resources from '../../resources/content';\n\nconst __constentStatus = {\n ExistingWithConsentOptedIn: 'ExistingWithConsentOptedIn',\n ExistingWithConsentOptedOut: 'ExistingWithConsentOptedOut',\n ExistingWithConsentUnkown: 'ExistingWithConsentUnkown',\n\n ExistingWithConsentUnknown: 'ExistingWithConsentUnknown',\n ExistingWithConsentOptedOutBoth: 'ExistingWithConsentOptedOutBoth',\n ExistingWithConsentOnlyOfferOptedIn: 'ExistingWithConsentOnlyOfferOptedIn',\n ExistingWithConsentOnlyProfilingOptedIn: 'ExistingWithConsentOnlyProfilingOptedIn',\n ExistingWithConsentOptedInBoth: 'ExistingWithConsentOptedInBoth',\n NewCustomer: 'NewCustomer'\n}\n\n\nclass ConsentCapture extends Component {\n constructor(props) {\n super(props);\n let noFn = () => {}\n let customer = props.customer || new Customer()\n \n this.state = {\n onChanged: props.onChanged || noFn,\n customer: props.customer, \n email: customer.email || '',\n emailValid: customer.email || '',\n emailFailsValidation: false,\n telephone: customer.phone || '',\n telephoneValid: customer.phone || '',\n telephoneFailsValidation: false,\n address: customer.address || null,\n addressValid: customer.address || null,\n addressFailsValidation: false,\n consentForOffersAndEvents: customer.consent !== null ? customer.consent : false,\n consentForOffersAndEventsValid: customer.consent || false,\n consentForProfiling: customer.profilingConsent !== null ? customer.profilingConsent : false,\n consentForProfilingDisabled: customer.consent === null || !customer.consent,\n consentForProfilingValid: customer.profilingConsent || false,\n expandEmail: false,\n expandTelephone: false,\n expandAddress: false, \n validForm: true \n }\n \n this.handleFieldChange = this.handleFieldChange.bind(this);\n this.handleCheckChange = this.handleCheckChange.bind(this);\n this.handleProfilingCheckChange = this.handleProfilingCheckChange.bind(this);\n this.handleExpand = this.handleExpand.bind(this);\n this.handleAddressChange = this.handleAddressChange.bind(this);\n }\n \n componentDidUpdate = (prevProps, prevState, snapshot) => {\n if (prevState.email !== this.state.email ||\n prevState.telephone !== this.state.telephone ||\n prevState.address !== this.state.address ||\n prevState.consentForOffersAndEvents !== this.state.consentForOffersAndEvents ||\n prevState.consentForProfiling !== this.state.consentForProfiling) {\n this.state.onChanged(this)\n } \n }\n componentDidMount() {\n this.state.onChanged(this)\n }\n\n handleCheckChange = (e) => { \n let optInValue = false\n if (this.state.consentForOffersAndEvents === null) {\n optInValue = e.target.id === 'eventsOptIn' ? true : false\n } else {\n optInValue = !Boolean(this.state.consentForOffersAndEvents)\n }\n this.state.consentForProfilingDisabled = !optInValue;\n if(!optInValue){\n this.state.consentForProfiling = false;\n }\n let key = e.target.getAttribute('data-key') || ''\n this.validateFieldChange(key, optInValue); \n }\n\n handleProfilingCheckChange = (e) => { \n let optInValue = false\n if (this.state.consentForProfiling === null) {\n optInValue = e.target.id === 'profilingEventsOptIn' ? true : false\n } else {\n optInValue = !Boolean(this.state.consentForProfiling)\n }\n\n let key = e.target.getAttribute('data-key') || ''\n this.validateFieldChange(key, optInValue);\n \n }\n\n handleFieldChange = (e) => {\n // validate the input\n let key = e.target.getAttribute('data-key') || '' \n this.validateFieldChange(key, e.target.value);\n } \n\n handleAddressChange = (addressObj, e) => { \n this.validateFieldChange('address', addressObj);\n }\n\n handleExpand = (e) => {\n console.log(`Expanding: ${e.target.id}`)\n let key = e.target.id\n let value = !this.state[key] \n this.setState({\n [key]: value\n })\n console.log(this.state)\n }\n\n validateFieldChange(key, value) {\n let isValidField = false;\n let validationKey = key + 'Valid';\n let validationFailsKey = key + 'FailsValidation';\n let validatedValue = null;\n \n if (key === 'address') {\n isValidField = (this.refs.addressLookupComponent.isEmpty) || ((this.refs.addressLookupComponent.mandatoryFieldsHaveData) && (this.refs.addressLookupComponent.isValid));\n validatedValue = (isValidField === true) ? value : undefined;\n } else {\n isValidField = validate.field(key, value) === true || value === '' ? true : false;\n validatedValue = (isValidField === true) ? value : this.state[validationKey];\n }\n \n // Capture the current key validation fail indicators\n let validationState = {\n emailFailsValidation: this.state.emailFailsValidation,\n telephoneFailsValidation: this.state.telephoneFailsValidation, \n addressFailsValidation: this.state.addressFailsValidation\n }\n\n // Set the current indicator to align with the determination\n validationState[validationFailsKey] = !isValidField;\n\n // Track when a field becomes invalid so that we know when it's corrected:\n let anyFieldIsInvalid = validationState.emailFailsValidation || \n validationState.telephoneFailsValidation || \n validationState.addressFailsValidation;\n \n this.setState({ \n [validationFailsKey]: !isValidField,\n validForm: !anyFieldIsInvalid,\n [key]: value,\n [validationKey]: validatedValue\n }); \n }\n \n isFormValid = () => { \n return this.state.validForm === true;\n }\n\n isConsentChanged = () => {\n return this.state.consentForOffersAndEvents !== this.state.customer.consent ||\n this.state.consentForProfiling !== this.state.customer.profilingConsent\n }\n\n getCustomer = () => {\n let customer = new Customer(\n this.state.customer.title, \n this.state.customer.firstName, \n this.state.customer.surname, \n this.state.email, \n this.state.telephone, \n this.state.address, \n this.state.consentForOffersAndEvents, \n null,\n this.state.customer.crmId,\n this.state.consentForProfiling,\n null\n )\n return customer\n }\n \n evaluateConsentStatus = () => {\n // Offer = true, Profile = false -> OnlyOfferOptIn\n // Offer = true, Profile = null -> OnlyOfferOptIn\n \n // Offer = true, Profile = true -> OptInBoth\n \n // Offer = false, Profile = true -> OnlyProfileOptIn\n // Offer = null, Profile = true -> OnlyProfileOptIn\n \n // Offer = false, Profile = false -> OptOutBoth\n // Offer = false, Profile = null -> OptOutBoth\n // Offer = null, Profile = false -> OptOutBoth\n \n // Offer = null, Profile = null -> Unknown\n\n\n let currentStatus = ''\n if (this.state.customer) {\n let c = this.state.customer; \n if (c.crmId && c.crmid !== \"\") {\n if(c.consent === null){\n currentStatus = (c.profilingConsent === null) ? \n __constentStatus.ExistingWithConsentUnknown :\n (c.profilingConsent ? __constentStatus.ExistingWithConsentOnlyProfilingOptedIn : __constentStatus.ExistingWithConsentOptedOutBoth)\n }\n else if(c.consent){\n currentStatus = (c.profilingConsent === null || !c.profilingConsent) ? \n __constentStatus.ExistingWithConsentOnlyOfferOptedIn :\n __constentStatus.ExistingWithConsentOptedInBoth \n }\n else{\n currentStatus = (c.profilingConsent === null || !c.profilingConsent) ? \n __constentStatus.ExistingWithConsentOptedOutBoth :\n __constentStatus.ExistingWithConsentOnlyProfilingOptedIn \n }\n } else {\n currentStatus = __constentStatus.NewCustomer\n }\n } \n return currentStatus;\n }\n \n getConsentName = () => {\n let c = this.state.customer; \n return c ? formatName(c.title, capitalizeFirstLetter(c.firstName), capitalizeFirstLetter(c.surname), ' ') : 'customer name'\n\n function capitalizeFirstLetter(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n }\n \n \n getConsentStatus = () => { \n let currentStatus = this.evaluateConsentStatus() \n let content = ''\n switch (currentStatus) {\n case __constentStatus.ExistingWithConsentOptedInBoth:\n content = {this.getConsentName()} has already Opted In to {Resources.userData(\"displayBrand\")} Offers and Events and Personalised communications - That's great!\n break;\n case __constentStatus.ExistingWithConsentOnlyOfferOptedIn: \n content = {this.getConsentName()} has already Opted In to {Resources.userData(\"displayBrand\")} Offers and Events communications. Please check whether the customer would also like to Opt In to Personalised Communications.\n break;\n case __constentStatus.ExistingWithConsentOnlyProfilingOptedIn: \n content = {this.getConsentName()} has already Opted In to {Resources.userData(\"displayBrand\")} Personalised Communications. Please check whether the customer would also like to Opt In to Offers and Events communications.\n break;\n case __constentStatus.ExistingWithConsentOptedOutBoth:\n content = {this.getConsentName()} has currently Opted Out of {Resources.userData(\"displayBrand\")} marketing. Please check whether the customer would like to change their consent:\n break; \n case __constentStatus.ExistingWithConsentUnknown:\n case __constentStatus.NewCustomer:\n content = There is no {Resources.userData(\"displayBrand\")} marketing consent held for {this.getConsentName()}, please capture:\n break;\n default:\n content = {'Whoa! - wasn\\'t expecting this...'}\n } \n \n \n return content\n } \n \n getConsentHeader = () => {\n let content = '';\n let currentStatus = this.evaluateConsentStatus()\n let c = this.state.customer; \n if (currentStatus === __constentStatus.NewCustomer) { \n \n content =
\n

We're ready to create {this.getConsentName()}'s record.

\n \n
\n
\n
\n
\n
\n
\n

{this.getConsentName()} will be created with the following details captured, please ensure all details are accurate. \nAdd any missing contact details to maximise marketing communication options for {Resources.userData(\"displayBrand\")}:

\n
\n
\n
\n
\n
\n \n
\n
\n {c.email ? (

{c.email}

) : (
\n \n
\n \n

Please enter a valid email address

\n
\n
)}\n
\n
\n
\n
\n
\n
\n \n
\n
\n {c.phone ? (

{c.phone}

) : (
\n \n
\n \n

UK telephone numbers only

\n
\n
)}\n
\n
\n
\n
\n
\n
\n \n
\n {c.address !== null && c.address.postalCode ? (

{format([c.address.line1, c.address.line2, c.address.locality, c.address.region, c.address.postalCode], ', ')}

) : (
\n \n
\n \n
\n
)}\n
\n
\n
\n
\n
\n
\n
\n\n }\n return

Confirm or Update consent

 Indicates a mandatory field

{content}
\n }\n \n \n render = () => {\n return (
\n
\n
\n {this.getConsentHeader()}\n\n
\n
\n
\n
\n

{this.getConsentStatus()}

\n
\n
\n
\n
\n

{Resources.ConsentCapture('offerHeader')}

\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n {/*
\n
\n \n
\n
\n \n
\n
*/}\n
\n
\n

{Resources.ConsentCapture('personalisedCommHeader')}

\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n {/*
\n
\n \n
\n
\n \n
\n
*/}\n
)\n }\n}\n\nexport default ConsentCapture;","import React, { Component } from 'react';\nimport Customer from '../../classes/customer';\nimport validate from '../../utilities/validate';\nimport {format, formatName} from '../../utilities/format';\nimport AddressLookup from '../AddressLookup';\nimport Resources from '../../resources/content';\n\nconst __constentStatus = {\n ExistingWithConsentOptedIn: 'ExistingWithConsentOptedIn',\n ExistingWithConsentOptedOut: 'ExistingWithConsentOptedOut',\n ExistingWithConsentUnkown: 'ExistingWithConsentUnkown',\n NewCustomer: 'NewCustomer'\n}\n\n\nclass ConsentCapture extends Component {\n constructor(props) {\n super(props);\n let noFn = () => {}\n let customer = props.customer || new Customer()\n \n this.state = {\n onChanged: props.onChanged || noFn,\n customer: props.customer, \n email: customer.email || '',\n emailValid: customer.email || '',\n emailFailsValidation: false,\n telephone: customer.phone || '',\n telephoneValid: customer.phone || '',\n telephoneFailsValidation: false,\n address: customer.address || null,\n addressValid: customer.address || null,\n addressFailsValidation: false,\n consentForOffersAndEvents: customer.consent !== null ? customer.consent : null,\n consentForOffersAndEventsValid: customer.consent || false,\n consentForProfiling: customer.profilingConsent !== null ? customer.profilingConsent : null,\n expandEmail: false,\n expandTelephone: false,\n expandAddress: false, \n isValidForm: customer.consent !== null || false \n }\n \n this.handleFieldChange = this.handleFieldChange.bind(this);\n this.handleCheckChange = this.handleCheckChange.bind(this);\n this.handleExpand = this.handleExpand.bind(this);\n this.handleAddressChange = this.handleAddressChange.bind(this);\n }\n \n componentDidUpdate = (prevProps, prevState, snapshot) => {\n if (prevState.email !== this.state.email ||\n prevState.telephone !== this.state.telephone ||\n prevState.address !== this.state.address ||\n prevState.consentForOffersAndEvents !== this.state.consentForOffersAndEvents) {\n this.state.onChanged(this)\n } \n }\n\n handleCheckChange = (e) => { \n let optInValue = false\n if (this.state.consentForOffersAndEvents === null) {\n optInValue = e.target.id === 'eventsOptIn' ? true : false\n } else {\n optInValue = !Boolean(this.state.consentForOffersAndEvents)\n }\n\n let key = e.target.getAttribute('data-key') || ''\n this.validateFieldChange(key, optInValue);\n }\n\n handleFieldChange = (e) => {\n // validate the input\n let key = e.target.getAttribute('data-key') || '' \n this.validateFieldChange(key, e.target.value);\n } \n\n handleAddressChange = (addressObj, e) => { \n this.validateFieldChange('address', addressObj);\n }\n\n handleExpand = (e) => {\n console.log(`Expanding: ${e.target.id}`)\n let key = e.target.id\n let value = !this.state[key] \n this.setState({\n [key]: value\n })\n console.log(this.state)\n }\n\n validateFieldChange(key, value) {\n let isValidField = false;\n let validationKey = key + 'Valid';\n let validationFailsKey = key + 'FailsValidation';\n let validatedValue = null;\n \n if (key === 'address') {\n isValidField = (this.refs.addressLookupComponent.isEmpty) || ((this.refs.addressLookupComponent.mandatoryFieldsHaveData) && (this.refs.addressLookupComponent.isValid));\n validatedValue = (isValidField === true) ? value : undefined;\n } else {\n isValidField = validate.field(key, value) === true || value === '' ? true : false;\n validatedValue = (isValidField === true) ? value : this.state[validationKey];\n }\n \n // Capture the current key validation fail indicators\n let validationState = {\n emailFailsValidation: this.state.emailFailsValidation,\n telephoneFailsValidation: this.state.telephoneFailsValidation, \n addressFailsValidation: this.state.addressFailsValidation\n }\n\n // Set the current indicator to align with the determination\n validationState[validationFailsKey] = !isValidField;\n\n // Track when a field becomes invalid so that we know when it's corrected:\n let anyFieldIsInvalid = validationState.emailFailsValidation || \n validationState.telephoneFailsValidation || \n validationState.addressFailsValidation;\n \n this.setState({ \n [validationFailsKey]: !isValidField,\n validForm: !anyFieldIsInvalid,\n [key]: value,\n [validationKey]: validatedValue\n }); \n }\n \n isFormValid = () => { \n return this.state.consentForOffersAndEvents !== null && this.state.validForm === true;\n }\n\n isConsentChanged = () => {\n return this.state.consentForOffersAndEvents !== this.state.customer.consent\n }\n\n getCustomer = () => {\n let customer = new Customer(\n this.state.customer.title, \n this.state.customer.firstName, \n this.state.customer.surname, \n this.state.email, \n this.state.telephone, \n this.state.address, \n this.state.consentForOffersAndEvents, \n null,\n this.state.customer.crmId,\n this.state.consentForProfiling,\n null\n )\n return customer\n }\n \n evaluateConsentStatus = () => {\n let currentStatus = ''\n if (this.state.customer) {\n let c = this.state.customer; \n if (c.crmId && c.crmid !== \"\") {\n if (c.consent !== null) {\n currentStatus = c.consent === true ? __constentStatus.ExistingWithConsentOptedIn : __constentStatus.ExistingWithConsentOptedOut\n } else {\n currentStatus = __constentStatus.ExistingWithConsentUnkown\n } \n } else {\n currentStatus = __constentStatus.NewCustomer\n }\n } \n return currentStatus;\n }\n \n getConsentName = () => {\n let c = this.state.customer; \n return c ? formatName(c.title, capitalizeFirstLetter(c.firstName), capitalizeFirstLetter(c.surname), ' ') : 'customer name'\n\n function capitalizeFirstLetter(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n }\n \n \n getConsentStatus = () => { \n let currentStatus = this.evaluateConsentStatus() \n let content = ''\n \n switch (currentStatus) {\n case __constentStatus.ExistingWithConsentOptedIn:\n content = {this.getConsentName()} has already Opted In to {Resources.userData(\"displayBrand\")} Offers and Events communications - That's great!\n break;\n case __constentStatus.ExistingWithConsentOptedOut:\n content = {this.getConsentName()} has currently Opted Out of {Resources.userData(\"displayBrand\")} marketing. Please check whether the customer would like to change their consent:\n break;\n case __constentStatus.ExistingWithConsentUnkown:\n case __constentStatus.NewCustomer:\n content = There is no {Resources.userData(\"displayBrand\")} marketing consent held for {this.getConsentName()}, please capture:\n break;\n default:\n content = {'Whoa! - wasn\\'t expecting this...'}\n } \n \n \n return content\n } \n \n getConsentHeader = () => {\n let content = '';\n let currentStatus = this.evaluateConsentStatus()\n let c = this.state.customer; \n if (currentStatus === __constentStatus.NewCustomer) { \n \n content =
\n

We're ready to create {this.getConsentName()}'s record.

\n \n
\n
\n
\n
\n
\n
\n

{this.getConsentName()} will be created with the following details captured, please ensure all details are accurate. \nAdd any missing contact details to maximise marketing communication options for {Resources.userData(\"displayBrand\")}:

\n
\n
\n
\n
\n
\n \n
\n
\n {c.email ? (

{c.email}

) : (
\n \n
\n \n

Please enter a valid email address

\n
\n
)}\n
\n
\n
\n
\n
\n
\n \n
\n
\n {c.phone ? (

{c.phone}

) : (
\n \n
\n \n

UK telephone numbers only

\n
\n
)}\n
\n
\n
\n
\n
\n
\n \n
\n {c.address !== null && c.address.postalCode ? (

{format([c.address.line1, c.address.line2, c.address.locality, c.address.region, c.address.postalCode], ', ')}

) : (
\n \n
\n \n
\n
)}\n
\n
\n
\n
\n
\n
\n
\n\n }\n return

Confirm or Update consent

 Indicates a mandatory field

{content}
\n }\n \n \n render = () => {\n return (
\n
\n
\n {this.getConsentHeader()}\n
\n
\n
\n
\n

{this.getConsentStatus()}

\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
)\n }\n}\n\nexport default ConsentCapture;","import React, { Component } from 'react';\nimport Resources from '../../resources/content';\n\nconst __rns = {\n a: 'Aftersales',\n s: 'Sales'\n}\n\nclass ReasonForVisit extends Component {\n constructor(props) {\n super(props);\n\n let noFn = () => {}\n this.state = {\n onChanged: props.onChanged || noFn,\n reasonForVisit: props.reasonForVisit || null\n }\n\n this.handleCheckChange = this.handleCheckChange.bind(this)\n }\n\n componentDidMount() {\n // Raise changed event to register default state of control:\n this.state.onChanged(this.state.reasonForVisit);\n }\n\n handleCheckChange = (e) => {\n let reasonForVisit = this.state.reasonForVisit;\n if(reasonForVisit === null) {\n reasonForVisit = e.target.id === 'rfvAftersales' ? __rns.a : __rns.s;\n } else {\n reasonForVisit = reasonForVisit === __rns.a ? __rns.s : __rns.a;\n }\n this.setState({\n reasonForVisit: reasonForVisit\n })\n this.state.onChanged(reasonForVisit)\n }\n\n render = () => {\n return (\n
\n
\n
\n

{Resources.ReasonForVisit('title')}

\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
)\n }\n}\n\nexport default ReasonForVisit;","import request from 'superagent';\nimport customer from './customer';\nimport apiUtils from './apiUtils';\nimport User from './user';\n\n/*****************************************************************************************\n** @description The consentCapturedEvent class is used to write the Event that tracks\n** the outcome fo the consent capture process.\n******************************************************************************************/\nexport default class consentCapturedEvent {\n /*****************************************************************************************\n ** FIELDS\n ******************************************************************************************/\n #_customer = null;\n #_previousConsent = null;\n #_previousProfilingConsent = null;\n #_transactionType = \"\";\n #_qameta = \"\";\n\n /*****************************************************************************************\n ** CONSTRUCTOR\n ******************************************************************************************/\n constructor(customer, previousConsent, previousProfilingConsent, transactionType) {\n // Set properties to supplied values or defaults if not supplied:\n this.customer = customer;\n this.previousConsent = previousConsent;\n this.previousProfilingConsent = previousProfilingConsent;\n this.transactionType = transactionType;\n this.qaMeta = \"200\";\n }\n\n /*****************************************************************************************\n ** PROPERTIES\n ******************************************************************************************/\n get customer() {\n return this.#_customer;\n }\n set customer(value) {\n if (value instanceof customer) {\n this.#_customer = value;\n }\n else {\n throw new TypeError(\"Failed to set customer. Expected type customer object\");\n }\n }\n\n /*\n Consent is a nillable boolean. When value is null then we interpret this as the customer has not recently\n provided a valid consent decision (either allow or deny).\n\n null = no recent valid consent\n true = allow offers and events marketing\n false = deny offers and events marketing\n */\n get previousConsent() {\n return this.#_previousConsent;\n }\n set previousConsent(value) {\n if ((typeof value != \"boolean\") && (value !== null)) {\n throw new TypeError(\"Failed to set previousConsent. Expected type Boolean or null\");\n }\n this.#_previousConsent = value;\n }\n \n get previousProfilingConsent() {\n return this.#_previousProfilingConsent;\n }\n set previousProfilingConsent(value) {\n if ((typeof value != \"boolean\") && (value !== null)) {\n throw new TypeError(\"Failed to set previousProfilingConsent. Expected type Boolean or null\");\n }\n this.#_previousProfilingConsent = value;\n }\n /*\n transactionType enum that tracks the reason for visit. Valid values are: sales, aftersales\n */\n get transactionType() {\n return this.#_transactionType;\n }\n set transactionType(value) {\n if (typeof value != \"string\") {\n throw new TypeError(\"Failed to set transactionType. Expected type String\");\n }\n\n if ((value === \"\") || (value === \"sales\") || (value === \"aftersales\")) {\n this.#_transactionType = value;\n }\n else {\n throw new TypeError(\"Failed to set transactionType. Expected valid enum of sales or aftersales\");\n }\n }\n\n get qaMeta() {\n return this.#_qameta;\n }\n set qaMeta(value) {\n this.#_qameta = value;\n }\n\n\n /*****************************************************************************************\n ** PUBLIC METHODS\n ******************************************************************************************/\n\n /*****************************************************************************************\n ** @description Save method will submit the consent event to backend API.\n ** @param {int} numberOfRetriesOnError optional parameter to specify the number of retries\n ** attempted when a potentially recoverable error is returned from the API.\n **\n ** This method will return an error if customer data is invalid.\n ******************************************************************************************/\n save(numberOfRetriesOnError) {\n var retryCount = 0;\n numberOfRetriesOnError = numberOfRetriesOnError || 10;\n\n return new Promise((resolve, reject) => {\n // Check that we have valid data and configuration before sending request:\n var err = null;\n if (this.isValid() === false) {\n console.log(\"Rejecting save. Invalid event data.\");\n err = new Error(\"Skipping save operation as event data is invalid\");\n reject(err);\n }\n else if (apiUtils.settingsValid() === false) {\n console.log(\"Unable to save. Environment settings are invalid.\");\n err = new Error(\"Environment settings for API operations are not set\");\n reject(err);\n }\n else if (apiUtils.userProfileValid(User.active) === false) {\n console.log(\"Rejecting save. User context is invalid.\");\n err = new Error(\"User context is not set or is invalid\");\n }\n else {\n // Configure request parameters:\n var body = this._toJSON();\n var queryParams = \"\";\n\n if (process.env.REACT_APP_ENV === \"mock\") {\n queryParams = \"QA_meta=\" + this.qaMeta;\n }\n\n var url = process.env.REACT_APP_API_URL + 'rcc/consentCaptureEvent';\n\n // Send request:\n request\n .post(url)\n .set('Content-Type', 'application/json')\n .set('Authorization', apiUtils.getBearerToken(User.active))\n .set('sessionId', apiUtils.getSessionId(User.active))\n .query(queryParams)\n .timeout({\n response: 5000, // Wait 5 seconds for server response,\n deadline: 10000, // Wait 10 seconds total - small request\n })\n .retry(numberOfRetriesOnError,\n (err, response) => {\n customer._logResponseError(err);\n\n retryCount += 1;\n console.log(\"Retry attempt: \" + retryCount);\n }\n )\n .send(body)\n .then((res) => {\n // Response has returned with status 2XX:\n console.log(\"Consent event persisted\")\n resolve();\n })\n .catch(err => {\n customer._logResponseError(err);\n reject(err);\n });\n }\n\n });\n }\n\n /*****************************************************************************************\n ** @description isValid checks that the minimum required data exists for a consent event\n ** to be submitted to the backend API.\n **\n ** @returns {boolean}\n ******************************************************************************************/\n isValid() {\n let valid = false;\n\n let u = User.active;\n let username = \"\";\n\n if (u !== null) {\n username = u.username;\n }\n\n let hasUsername = (username.length > 0);\n let hasCustomer = ((this.customer !== null) && (this.customer.isValid()));\n let hasTansactionType = (this.transactionType.length > 0);\n\n valid = hasUsername && hasCustomer && hasTansactionType;\n\n return valid;\n }\n\n /*****************************************************************************************\n ** PRIVATE METHODS\n ******************************************************************************************/\n static _logResponseError(err) {\n apiUtils.logResponseError(err, \"api/customer\");\n }\n\n /*\n The toJSON method creates a JSON object conformant with the RCC event schema\n which aligns with the Consumer Domain customer schema where appropriate:\n\n https://cde.toyota-europe.com/confluence/display/TGBEDP/Core+-+Customer+Domain\n */\n _toJSON() {\n var existingConsentObj = {};\n var existingConsentAttributesObj = {};\n existingConsentAttributesObj.consentCode = \"OFFERS_EVENTS\";\n existingConsentAttributesObj.consentFlag = this.previousConsent; \n \n var existingProfilingConsentAttributesObj = {};\n existingProfilingConsentAttributesObj.consentCode = \"PROFILING\";\n existingProfilingConsentAttributesObj.consentFlag = this.previousProfilingConsent;\n existingConsentObj.consentAttributes = [existingConsentAttributesObj, existingProfilingConsentAttributesObj]; \n\n\n var currentConsentObj = {};\n var currentConsentAttributesObj = {};\n currentConsentAttributesObj.consentCode = \"OFFERS_EVENTS\";\n currentConsentAttributesObj.consentFlag = this.customer.consent; \n \n var currentProfilingConsentAttributesObj = {};\n currentProfilingConsentAttributesObj.consentCode = \"PROFILING\";\n currentProfilingConsentAttributesObj.consentFlag = this.customer.profilingConsent;\n currentConsentObj.consentAttributes = [currentConsentAttributesObj, currentProfilingConsentAttributesObj]; \n\n var customerAttributesObj = {};\n customerAttributesObj.givenName = this.customer.firstName;\n customerAttributesObj.familyName = this.customer.surname;\n customerAttributesObj.honorificPrefix = this.customer.title;\n \n var addrObj = null;\n if (this.customer.address !== null \n && this.customer.address.isEmpty() === false\n && this.customer.address.postalCode !== null \n && this.customer.address.postalCode.trim() !== \"\" ) {\n addrObj = {};\n addrObj.addressLine1 = this.customer.address.line1;\n addrObj.addressLine2 = this.customer.address.line2;\n addrObj.addressLocality = this.customer.address.locality;\n addrObj.addressRegion = this.customer.address.region;\n addrObj.postalCode = this.customer.address.postalCode;\n }\n\n var emailObj = null;\n if (this.customer.email.length > 0) {\n emailObj = {};\n emailObj.email = this.customer.email;\n }\n \n var phoneObj = null;\n if (this.customer.phone.length > 0) {\n phoneObj = {};\n phoneObj.telephoneNumber = this.customer.phone;\n }\n \n var contactPointsObj = {};\n contactPointsObj.addresses = [];\n contactPointsObj.emails = [];\n contactPointsObj.telephones = [];\n\n if (addrObj !== null) {\n contactPointsObj.addresses.push(addrObj);\n }\n\n if (emailObj !== null) {\n contactPointsObj.emails.push(emailObj);\n }\n \n if (phoneObj !== null) {\n contactPointsObj.telephones.push(phoneObj);\n }\n\n var customerObj = {};\n var isNewCustomer;\n if (this.customer.crmId === null){\n customerObj.id = \"\";\n isNewCustomer = true;\n }\n else {\n customerObj.id = this.customer.crmId.toString();\n isNewCustomer = false;\n }\n \n customerObj.attributes = customerAttributesObj;\n customerObj.contactPoints = contactPointsObj;\n customerObj.subscriptions = [currentConsentObj];\n\n var userObj = null;\n if (User.active !== null) {\n try {\n userObj = {};\n userObj.username = User.active.username;\n\n var userAttributes = {};\n userAttributes.givenName = User.active.firstName;\n userAttributes.familyName = User.active.surname;\n userObj.attributes = userAttributes;\n } catch (error) {\n userObj = null;\n }\n }\n\n var centreObj = null;\n if (User.active !== null) {\n try {\n centreObj = {};\n centreObj.code = User.active.selectedCentreCode;\n centreObj.franchise = User.active.brand;\n } catch (error) {\n centreObj = null;\n }\n }\n \n var eventObj = {};\n eventObj.id = null; // This will be set to a guid by the server-side save method\n eventObj.date = null; // This be set to a UTC date/time by the server-side save method\n eventObj.isNewCustomer = isNewCustomer;\n eventObj.transactionType = this.transactionType;\n eventObj.user = userObj;\n eventObj.centre = centreObj;\n eventObj.existingSubscriptions = [existingConsentObj];\n eventObj.customer = customerObj;\n\n return JSON.stringify(eventObj);\n }\n}","import React, { Component } from 'react';\nimport ReactTooltip from \"react-tooltip\";\nimport Resources from '../../resources/content'\nimport User from '../../classes/user';\n\nclass TermsAndConditions extends Component {\n constructor(props) { \n super(props);\n\n this.state = {\n expanded: false\n }\n }\n\n handleExpand = (e) => {\n this.setState({\n expanded: !this.state.expanded\n }) \n }\n\n render() {\n return (
\n

{Resources.TermsAndConditions('PreLinkText')}{Resources.TermsAndConditions('PostLinkText')}

\n
\n {Resources.TermsAndConditions(User.active.brand)}\n
\n \n {Resources.TermsAndConditions(User.active.brand)}\n \n
)\n }\n}\n\nexport default TermsAndConditions;","import React, { Component } from 'react';\nimport { Redirect } from 'react-router-dom';\nimport customer from '../../classes/customer';\nimport searchResultRow from '../../classes/searchResultRow';\nimport CentreSelection from '../../Components/CentreSelection'\nimport CustomerInput from '../../Components/CustomerInput'\nimport CustomerSelectionProfiling from '../../Components/SearchResultsProfiling';\nimport CustomerSelection from '../../Components/SearchResults';\nimport ConsentCaptureProfiling from '../../Components/ConsentCaptureProfiling'\nimport ConsentCapture from '../../Components/ConsentCapture'\nimport ReasonForVisit from '../../Components/ReasonForVisit'\nimport consentCapturedEvent from '../../classes/consentCapturedEvent';\nimport Resources from '../../resources/content'\nimport TooManyResultsError from '../../classes/tooManyResultsError';\nimport TermsAndConditions from '../../Components/TermsAndConditions';\nimport Waiting from '../../Components/Waiting'\nimport Popup from '../../Components/Popup'\nimport User from '../../classes/user';\nimport { appInsights } from '../../AppInsights';\n\nclass Consent extends Component {\n\n\n constructor(props) {\n super(props);\n\n let noFn = () => { }\n this.state = {\n redirect: false,\n redirectRoute: '/',\n validForm: false,\n customerInputComponent: null,\n centreSelectionComponent: null,\n selectedCrmCustomer: null,\n initialConsentStatus: null,\n selectedCustomerConsent: null,\n reasonForVisit: null,\n selectedCentre: null,\n searchInputCustomer: new customer(),\n centreSelectionShow: User.active.multiCentreRole,\n searchInputShow: !User.active.multiCentreRole,\n searchResultsShow: false,\n searchResultRows: null,\n consentIsValid: false,\n confirmActionShow: false,\n waiting: false,\n confirmActionMessageTitle: '',\n confirmActionMessageMain: '',\n confirmActionMessageSecondary: '',\n searchButtonText: Resources.Application('searchButtonText'),\n submitButtonText: Resources.Application('submitButtonTextExistingConsent'),\n searchFailureText: 'Attempt to perform customer search failed. Please try again, if this issue persists then report to TGB help desk and share with them the error message shown below.',\n saveFailureText: 'Unable to save. Please try again, if this issue persists then report to TGB help desk and share with them the error information shown below.',\n centreSelectionNextButtonDisabled: 'disabled',\n onUpdated: props.onUpdate || noFn,\n isPilotProfilingCentre: false,\n footerConsentStatus: null\n };\n\n this.handleCentreSelectionChanged = this.handleCentreSelectionChanged.bind(this);\n this.handleCentreSelectionDoubleClick = this.handleCentreSelectionDoubleClick.bind(this);\n this.handleCentreSelectionMounted = this.handleCentreSelectionMounted.bind(this);\n\n this.handleCustomerInputChanged = this.handleCustomerInputChanged.bind(this);\n this.handleCustomerInputMounted = this.handleCustomerInputMounted.bind(this);\n\n this.handleNextFromCentreSelect = this.handleNextFromCentreSelect.bind(this);\n this.handleSearch = this.handleSearch.bind(this);\n this.handleNewCustomer = this.handleNewCustomer.bind(this);\n this.handleSearchCancel = this.handleSearchCancel.bind(this);\n\n this.handleBack = this.handleBack.bind(this);\n this.handleClear = this.handleClear.bind(this);\n\n this.handleModalClose = this.handleModalClose.bind(this);\n\n\n this.handleConsentCaptureChanged = this.handleConsentCaptureChanged.bind(this);\n this.handleConsentCaptureSubmit = this.handleConsentCaptureSubmit.bind(this);\n this.handleConsentCaptureCancel = this.handleConsentCaptureCancel.bind(this);\n\n this.handleReasonForVisitChanged = this.handleReasonForVisitChanged.bind(this);\n }\n\n renderRedirect = () => {\n if (this.state.redirect) {\n return \n }\n }\n\n clearForm = () => {\n this.setState({\n waiting: false,\n customerInputCustomer: null,\n selectedCrmCustomer: null,\n initialConsentStatus: null,\n selectedCustomerConsent: null,\n selectedCustomerProfilingConsent: null,\n centreSelectionShow: false,\n searchInputShow: true,\n searchResultsShow: false,\n searchResultRows: null,\n confirmConsentShow: false,\n validForm: false,\n footerConsentStatus: false\n });\n\n if (this.state.customerInputComponent) {\n this.state.customerInputComponent.reset()\n }\n }\n\n handleNextFromCentreSelect = (e) => {\n appInsights.trackEvent({ name: \"RCC_EVENT_CENTRE_SELECTED\", properties: { sessionId: User.active.sessionId } });\n\n this.setState({\n centreSelectionShow: false,\n searchInputShow: true\n });\n let isPilotProfilingCentre = false;\n if (process.env.REACT_APP_PROFILING_PILOT_CENTRES.includes(this.state.selectedCentre.code)) {\n isPilotProfilingCentre = true;\n }\n this.setState({\n isPilotProfilingCentre: isPilotProfilingCentre\n });\n User.active.selectedCentreCode = this.state.selectedCentre.code;\n User.active.selectedCentreName = this.state.selectedCentre.name;\n User.active.setBrand(this.state.selectedCentre.franchise);\n\n if (this.state.centreSelectionComponent && typeof this.state.centreSelectionComponent.clearFilter === 'function') {\n this.state.centreSelectionComponent.clearFilter();\n }\n\n this.state.onUpdated();\n }\n\n handleClear = (e) => {\n this.clearForm();\n\n appInsights.trackEvent({ name: \"RCC_EVENT_SEARCH_FORM_CLEARED\", properties: { sessionId: User.active.sessionId } });\n }\n\n handleBack = (e) => {\n this.handleClear(e);\n\n this.setState({\n centreSelectionShow: true,\n searchInputShow: false\n });\n appInsights.trackEvent({ name: \"RCC_EVENT_BACK_TO_CENTRE_SELECT\", properties: { sessionId: User.active.sessionId } });\n }\n\n handleSearch = (e) => {\n appInsights.trackEvent({ name: \"RCC_EVENT_SEARCH_INITIATED\", properties: { sessionId: User.active.sessionId } });\n\n // Prevent resubmission wihtout going to a disabled state\n if (this.state.waiting === false) {\n this.setState({ waiting: true });\n let inputCustomer = this.createCustomerFromInput();\n\n customer.search(inputCustomer, User.active)\n .then((results) => {\n // Build an array of search result rows and update state to show search results:\n let result = null\n let rows = []\n\n for (result of results) {\n let row = new searchResultRow(result)\n rows.push(row)\n }\n\n this.setState({\n searchInputCustomer: inputCustomer,\n searchInputShow: false,\n searchResultRows: rows,\n searchResultsShow: true\n })\n\n appInsights.trackEvent({ name: \"RCC_EVENT_SEARCH_RESULTS\", properties: { sessionId: User.active.sessionId, resultsCount: rows.length } });\n })\n .catch(err => {\n if (err instanceof TooManyResultsError) {\n this.showModal(Resources.SearchResults('tooManyMatchesMessage'));\n appInsights.trackEvent({ name: \"RCC_EVENT_SEARCH_TOO_MANY_RESULTS\", properties: { sessionId: User.active.sessionId } });\n }\n else {\n this.showModal(this.state.searchFailureText, `Error: ${err.message}`, `Application Error`);\n appInsights.trackEvent({ name: \"RCC_EVENT_SEARCH_FAILED\", properties: { sessionId: User.active.sessionId } });\n }\n })\n .finally(() => {\n this.setState({ waiting: false })\n })\n }\n }\n\n handleSearchCancel = () => {\n appInsights.trackEvent({ name: \"RCC_EVENT_BACK_FROM_SEARCH\", properties: { sessionId: User.active.sessionId } });\n\n this.setState({\n searchInputShow: true,\n searchResultsShow: false\n });\n }\n\n createCustomerFromInput() {\n let inputCustomer = this.state.customerInputCustomer\n return new customer(\n inputCustomer.title,\n inputCustomer.firstName,\n inputCustomer.surname,\n inputCustomer.email,\n inputCustomer.telephone,\n inputCustomer.address\n )\n }\n\n showModal = (message1, message2, title) => {\n this.setState({\n waiting: false,\n confirmActionShow: true,\n confirmActionMessageTitle: typeof title === 'string' ? title : '',\n confirmActionMessageMain: message1,\n confirmActionMessageSecondary: message2\n });\n };\n\n handleModalClose = () => {\n this.setState({\n waiting: false,\n confirmActionShow: false,\n confirmActionMessageTitle: '',\n confirmActionMessageMain: '',\n confirmActionMessageSecondary: ''\n });\n };\n\n handleCustomerSelected = (selectedCustomer) => {\n appInsights.trackEvent({ name: \"RCC_EVENT_SELECT_EXISTING\", properties: { sessionId: User.active.sessionId } });\n\n if (selectedCustomer != null) {\n console.log(\"Selected \" + selectedCustomer.firstName + \" (\" + selectedCustomer.crmId + \")\");\n }\n else {\n console.log(\"Selected customer is null\");\n }\n\n this.setState({\n selectedCrmCustomer: selectedCustomer,\n initialConsentStatus: this.evaluateConsentStatus(selectedCustomer),\n selectedCustomerConsent: selectedCustomer.consent,\n selectedCustomerProfilingConsent: selectedCustomer.profilingConsent,\n isConsentValid: selectedCustomer.consent !== null || false,\n searchResultsShow: false,\n confirmConsentShow: true,\n submitButtonText: Resources.Application('submitButtonTextExistingConsent'),\n footerConsentStatus: this.evaluateFooterConsentStatus(selectedCustomer)\n })\n }\n\n handleNewCustomer = () => {\n appInsights.trackEvent({ name: \"RCC_EVENT_NEW_CUSTOMER\", properties: { sessionId: User.active.sessionId } });\n\n const selectedCustomer = this.createCustomerFromInput()\n this.setState({\n selectedCrmCustomer: selectedCustomer,\n initialConsentStatus: this.evaluateConsentStatus(selectedCustomer),\n selectedCustomerConsent: null,\n selectedCustomerProfilingConsent: null,\n isConsentValid: false,\n searchResultsShow: false,\n confirmConsentShow: true,\n submitButtonText: Resources.Application('submitButtonTextNewOrChangedConsent'),\n footerConsentStatus: this.evaluateFooterConsentStatus(selectedCustomer)\n })\n }\n\n handleCentreSelectionChanged = (centreSelectionForm, centre) => {\n this.setState({\n selectedCentre: centre,\n centreSelectionNextButtonDisabled: ((centre && centre.code) ? '' : 'disabled')\n });\n this.state.onUpdated();\n }\n\n handleCentreSelectionMounted = (sender) => {\n console.log('Centre Selection mounted')\n this.setState({\n centreSelectionComponent: sender\n })\n }\n\n handleCustomerInputMounted = (sender) => {\n console.log('CustomerInput mounted')\n this.setState({\n customerInputComponent: sender\n })\n }\n\n handleCustomerInputChanged = (customerInputForm, customer) => {\n this.setState({\n customerInputCustomer: customer,\n validForm: customer !== null\n })\n }\n\n handleDealerSelectionVisibility = () => {\n if (this.state.centreSelectionShow === true) {\n document.removeEventListener(\"keydown\", this.disableKeyDownEvents, true);\n return true;\n }\n else {\n document.addEventListener(\"keydown\", this.disableKeyDownEvents, true);\n return false;\n }\n };\n\n disableKeyDownEvents = (event) => {\n event.stopPropagation();\n };\n\n handleCentreSelectionDoubleClick = () => {\n this.handleNextFromCentreSelect();\n };\n\n renderCentreSelection = () => {\n let content =

\n content =

\n \n
\n
\n
 
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n\n return content\n }\n\n renderCustomerDetails = () => {\n let content =

\n content =

\n \n
\n
\n
 
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n\n return content\n }\n\n renderSearchResults = () => {\n let content =

\n let customerSelection =

\n if (this.state.searchResultsShow) {\n if (this.state.isPilotProfilingCentre) {\n customerSelection = \n }\n else {\n customerSelection = \n }\n content =

\n
\n {customerSelection}\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n }\n return content;\n }\n\n handleConsentCaptureChanged = (sender) => {\n let isValid = sender.isFormValid() ? sender.isFormValid() : false\n let submitButtonText = sender.isConsentChanged() === false ? Resources.Application('submitButtonTextExistingConsent') : Resources.Application('submitButtonTextNewOrChangedConsent')\n this.setState({\n selectedCrmCustomer: sender.getCustomer(),\n isConsentValid: isValid,\n submitButtonText: submitButtonText\n })\n }\n\n handleConsentCaptureSubmit = (e) => {\n if (this.state.waiting === false && this.state.validForm === true) {\n this.setState({ waiting: true });\n\n let cust = null;\n let originalConsent = null;\n let originalProfilingConsent = null;\n let reasonForVisit = null;\n let username = null;\n let brand = null;\n let event = null;\n let aiEventProperties = null;\n\n try {\n cust = this.state.selectedCrmCustomer;\n\n\n originalConsent = this.state.selectedCustomerConsent;\n originalProfilingConsent = this.state.selectedCustomerProfilingConsent;\n reasonForVisit = this.state.reasonForVisit.toLowerCase();\n username = User.active.username;\n brand = User.active.brand;\n\n event = new consentCapturedEvent(cust, originalConsent, originalProfilingConsent, reasonForVisit);\n\n aiEventProperties = {\n sessionId: User.active.sessionId,\n previousConsent: originalConsent,\n newConsent: cust.consent,\n previousProfilingConsent: originalProfilingConsent,\n newProfilingConsent: cust.profilingConsent,\n reasonForVisit: reasonForVisit,\n username: username,\n franchise: brand\n };\n } catch (error) {\n console.log(\"Failed to populate data for submitting event: \" + error.message);\n this.showModal(this.state.saveFailureText, `Error: Invalid application state.`, `Application Error`);\n appInsights.trackEvent({ name: \"RCC_EVENT_SUBMIT_FAILED\", properties: aiEventProperties });\n this.setState({ waiting: false });\n }\n\n //Raise Consent Captured Event:\n if (event !== null) {\n console.log('Calling consentCapturedEvent save');\n event.save()\n .then(() => {\n console.log(\"Consent Captured Event persisted successfully\");\n\n // Set the confirmation text contextually based on the user actions:\n // Three scenarios: consent unchanged, consent modified, new customer\n let confirmationText = 'Customer consent updated';\n let updateEventKey = 'RCC_EVENT_SUBMIT_EXISTING_CUSTOMER';\n\n try {\n let unmodifiedConsent = (originalConsent === cust.consent);\n\n if (unmodifiedConsent === true) {\n confirmationText = Resources.ConsentPage('eventSavedUnmodifiedConsentConfirmationText');\n\n let isModifiedProfilingConsent = (originalProfilingConsent !== cust.profilingConsent);\n if (isModifiedProfilingConsent === true) {\n confirmationText = Resources.ConsentPage('eventSavedModifiedProfileConsentConfirmationText');\n }\n }\n\n else {\n switch (this.state.initialConsentStatus) {\n case 'NewCustomer':\n updateEventKey = 'RCC_EVENT_SUBMIT_NEW_CUSTOMER';\n confirmationText = Resources.ConsentPage('eventSavedNewCustomerConfirmationText');\n break;\n // case 'ExistingWithConsentOptedIn':\n // case 'ExistingWithConsentOptedOut':\n // case 'ExistingWithConsentUnkown':\n case 'ExistingWithConsentOptedInBoth':\n case 'ExistingWithConsentOnlyOfferOptedIn':\n case 'ExistingWithConsentOptedOutBoth':\n case 'ExistingWithConsentUnknown':\n confirmationText = Resources.ConsentPage('eventSavedModifiedConsentConfirmationText');\n break;\n default:\n break;\n }\n }\n } catch (error) {\n console.log(error.message);\n }\n\n appInsights.trackEvent({ name: updateEventKey, properties: aiEventProperties });\n\n this.showModal(confirmationText);\n this.clearForm();\n this.setState({ waiting: false });\n })\n .catch(e => {\n console.error(\"Critical failure: \" + e.message);\n this.showModal(this.state.saveFailureText, `Error: ${e.message}`, `Application Error`);\n appInsights.trackEvent({ name: \"RCC_EVENT_SUBMIT_FAILED\", properties: aiEventProperties });\n this.setState({ waiting: false });\n })\n }\n }\n\n }\n\n handleConsentCaptureCancel = () => {\n appInsights.trackEvent({ name: \"RCC_EVENT_BACK_FROM_CONSENT\", properties: { sessionId: User.active.sessionId } });\n\n this.setState({\n selectedCrmCustomer: null,\n initialConsentStatus: null,\n selectedCustomerConsent: null,\n selectedCustomerProfilingConsent: null,\n searchInputShow: false,\n confirmConsentShow: false,\n searchResultsShow: true\n })\n }\n\n handleReasonForVisitChanged = (reason) => {\n this.setState({\n reasonForVisit: reason\n })\n }\n\n evaluateConsentStatus = (c) => {\n let currentStatus = 'NewCustomer'\n if (c) {\n if (c.crmId && c.crmid !== \"\") { \n if (c.consent === null) {\n currentStatus = (c.profilingConsent === null) ?\n 'ExistingWithConsentUnknown' :\n (c.profilingConsent ? 'ExistingWithConsentOnlyProfileOptedIn' : 'ExistingWithConsentOptedOutBoth')\n }\n else if (c.consent) {\n currentStatus = (c.profilingConsent === null || !c.profilingConsent) ?\n 'ExistingWithConsentOnlyOfferOptedIn' :\n 'ExistingWithConsentOptedInBoth'\n }\n else {\n currentStatus = (c.profilingConsent === null || !c.profilingConsent) ?\n 'ExistingWithConsentOptedOutBoth' :\n 'ExistingWithConsentOnlyProfileOptedIn'\n } \n }\n }\n return currentStatus;\n }\n evaluateFooterConsentStatus = (c) => {\n let currentStatus = 'NewCustomer'\n if (c) {\n if (c.crmId && c.crmid !== \"\") { \n if (c.consent != null && c.profilingConsent != null) {\n currentStatus = !c.consent ? 'ExistingOptedOut' : 'ExistingOptedIn' \n } \n else{\n currentStatus = 'ExistingChanged' \n }\n }\n }\n return currentStatus;\n }\n\n renderConsentCapture = () => {\n let content =

\n let consentCapture =

\n if (this.state.confirmConsentShow === true) {\n if (this.state.isPilotProfilingCentre) {\n consentCapture = \n }\n else {\n consentCapture = \n }\n content =

\n
\n
\n
\n {consentCapture}\n
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n {Resources.Application(`footer${this.state.footerConsentStatus}`)}\n\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n }\n return content\n }\n\n render() {\n return (\n
\n
\n
\n
\n {this.renderRedirect()}\n {this.renderCentreSelection()}\n {this.renderCustomerDetails()}\n {this.renderSearchResults()}\n {this.renderConsentCapture()}\n
\n
 
\n
\n
\n\n \n \n
);\n }\n}\n\nexport default Consent;\n","/**\n * Finds the specified cookie sections\n * @param {*} name \n */\nconst findCookie = (name) => {\n const regex = new RegExp(`^${name}\\\\d{1,}=`)\n const cookies = decodeURIComponent(document.cookie).split(';')\n return cookies.filter((cookie) => regex.test(cookie.trim()))\n}\n\n/**\n * Gets the specified cookie sections and combines to single\n * @param {*} name \n */\nconst getCookie = (name) => {\n const res = findCookie(name)\n if(res.length === 0) return '{}'\n return res.map((row) => row.substr(row.indexOf('=') + 1).trim()).join('')\n}\n\n/**\n * Deletes the specified cookie sections\n * @param {*} name \n */\nconst deleteCookie = (name) => {\n const res = findCookie(name)\n res.map((row) => row.substr(0, row.indexOf('=')).trim())\n .forEach((row, i) => {\n document.cookie = `${name}${i}= ; Max-Age=-99999999;`\n })\n}\n\n/**\n * Populates the specified cookie, spliting into sized sections. These cookie chunks will \n * be named rcc-user[n] and are necessary to overcome the maximum cookie storage size of\n * 4096 bytes.\n * \n * @param {*} name \n * @param {*} value\n */\nconst setCookie = (name, value) => {\n deleteCookie(name)\n value = JSON.stringify(value)\n // Split the cookie up to avoid the max size (4096)\n const secs = value.match(/.{0,4000}/g)\n if(Array.isArray(secs)) {\n secs.forEach((sec, i) => {\n if (secs[i].trim().length !== 0) {\n // Add \"Secure\" and \"HttpOnly\" flags to the cookie options\n const cookieOptions = \"; Secure; HttpOnly\";\n document.cookie = `${name}${i}=${secs[i]};${cookieOptions}`;\n }\n });\n } \n}\n\nexport default class CookieStore {\n\n constructor(name) {\n this._name = `rcc-${name}`\n try {\n this._store = JSON.parse(getCookie(this._name))\n } catch(err) {\n this._store = {}\n }\n }\n\n // Returns an items in the store\n getItem(key) {\n return key in this._store ? this._store[key] : null\n }\n\n // Creates/Updates item in store\n setItem(key, value) {\n this._store[key] = value || ''\n // Updates the cookie\n setCookie(this._name, this._store)\n }\n\n // Removes item from the store\n removeItem(key) {\n delete this._store[key]\n // Updates the cookie\n setCookie(this._name, this._store)\n }\n\n // Returns the key based on index\n key(i) {\n const keys = Object.keys(this._store);\n return keys[i] || null;\n }\n\n // Number of keys in the store\n get length() {\n return Object.keys(this._store).length;\n }\n}\n","import Resources from '../resources/content';\n\nclass UserFriendlyErrorHandler {\n static overrideError(error) {\n if(error.message.includes(Resources.TimeZoneErrorMessage('keyword'))) {\n error.message = Resources.TimeZoneErrorMessage('headline');\n error.stack = Resources.TimeZoneErrorMessage('description');\n }\n return error;\n } \n}\nexport default UserFriendlyErrorHandler","import React, { Component } from 'react';\nimport { UserManager, WebStorageStateStore } from 'oidc-client';\nimport User from '../../classes/user';\nimport Popup from '../../Components/Popup'\nimport { appInsights } from '../../AppInsights';\nimport CookieStore from '../../classes/cookieStore'\nimport UserFriendlyErrorHandler from \"../../classes/userFriendlyErrorHandler\";\n\nconst getUrlParameter = (name) =>{\n // eslint-disable-next-line \n name = name.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n var regex = new RegExp(`[\\\\?&#]${name}=([^&#]*)`);\n var results = regex.exec(window.location.href);\n return results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));\n}\n\nconst parseJwt = (token) => {\n try {\n const base64 = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/')\n return JSON.parse(decodeURIComponent(atob(base64).split('').map((c) => {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n }).join('')))\n } catch(err) {\n return {}\n }\n}\n\n/** \n * @render react\n * @name Authenticate\n * @description OpenId Connect based Authentication Component\n * @example \n * \n
If you see this you are authenticated.
\n
\n */\nclass Authenticate extends Component {\n constructor(props) {\n super(props);\n this.signin = this.signin.bind(this); \n this.signinResponse = this.signinResponse.bind(this);\n this.signout = this.signout.bind(this); \n this.onUserLoaded = this.onUserLoaded.bind(this);\n this.onUserUnloaded = this.onUserUnloaded.bind(this);\n\n // OpenID UserManager is configured to use custom CookieStore rather than the default browser storage. This\n // resolves issues where we get \"no matching state found in storage\" due to browser compatibility issues.\n this.state = {\n urlState: getUrlParameter('state').trim(),\n urlIdToken: getUrlParameter('id_token').trim(),\n firstLoad: true,\n isAuthenticated: false,\n expired: false,\n expiring: false,\n countDown: 5,\n error: null,\n userManager : new UserManager({\n authority: process.env.REACT_APP_OIDC_AUTH,\n client_id: process.env.REACT_APP_OIDC_ID,\n redirect_uri: process.env.REACT_APP_UI_URL, \n response_type: 'id_token token',\n scope: process.env.REACT_APP_OIDC_SCOPE,\n post_logout_redirect_uri: process.env.REACT_APP_UI_URL,\n userStore: new WebStorageStateStore({store: new CookieStore('user')}),\n stateStore: new WebStorageStateStore({store: new CookieStore('state')})\n })\n };\n }\n\n componentDidMount() {\n // register events\n this.state.userManager.events.addUserLoaded(this.onUserLoaded);\n this.state.userManager.events.addUserUnloaded(this.onUserUnloaded);\n this.state.userManager.events.addAccessTokenExpiring(function() {\n this.setState({expiring:true,error: null});\n console.log('addAccessTokenExpiring')\n }.bind(this));\n this.state.userManager.events.addAccessTokenExpired(function() {\n let interval = setInterval(function () {\n if(this.state.countDown === 0) {\n clearInterval(interval);\n return this.signout();\n }\n this.setState(({ countDown }) => ({\n countDown: countDown - 1\n }))\n }.bind(this), 1000)\n this.setState({expired:true, countDown: 5, expiring:false,error: null});\n console.log('addAccessTokenExpired')\n }.bind(this));\n\n if (process.env.REACT_APP_OIDC_ON === \"FALSE\") {\n // Get role from uri\n let role = \"LMS User^RCC Group User\";\n let userName = \"SI6665@TGB.DSW.D006665\";\n let uri = window.location.href \n if (/role=.+/.test(uri) === true) {\n let roleMatches = uri.match(/role=(.+)&+|role=(.+)$/)\n role = decodeURIComponent(roleMatches[1] || roleMatches[2]) || role;\n }\n if (/user=.+/.test(uri) === true) {\n let userMatches = uri.match(/user=(.+)&+|user=(.+)$/)\n userName = decodeURIComponent(userMatches[1] || userMatches[2]) || userName;\n }\n console.log(`Loading with role ${role}`)\n console.log(`Loading with user ${userName}`)\n // Fake user for mocks\n const now = Math.round(new Date().getTime() / 1000);\n const user = {\n \"id_token\": \"FAKETOKEN\",\n \"access_token\": \"FAKETOKEN\",\n \"token_type\": \"Bearer\",\n \"scope\": \"openid Roles userDetail\",\n \"profile\": {\n \"sub\": \"cn=SI6665@TGB.DSW.D006665,ou=People,ou=006665,ou=TGB,ou=NMSC,ou=extranet,ou=USERS,o=TOYOTA\",\n \"SessionToken\": \"\",\n \"FirstName\": \"Test\",\n \"Roles\": role,\n \"T-OrganisationType\": \"Retailer\",\n \"Language\": \"ENG,EN\",\n \"auth_time\": now,\n \"Country\": \"GB\",\n \"LastName\": \"Testcentreuser\",\n \"T-GeographicLocation\": \"GB\",\n \"email\": \"test.testcentreuser@tgb.toyota.co.uk\",\n \"T-Organisation\": \"TGB.006665\",\n \"username\": userName,\n \"T-Brand\": \"Toyota\"\n },\n \"expires_at\": now + 900\n }\n return this.onUserLoaded(user);\n }\n // Already logged in?\n this.state.userManager.getUser().then((user) => {\n if (user !== null && user !== undefined) { \n this.onUserLoaded(user);\n } else if (window.location.href.includes(\"#id_token\") || window.location.href.includes(\"&id_token\")) {\n this.state.userManager.signinRedirectCallback().then(this.signinResponse).catch(this.signinResponse);\n } else if (window.location.href.includes(\"#error\") ) {\n this.setState({error: {message: getUrlParameter('error_description')}})\n } else {\n this.setState({firstLoad:false,error: null})\n }\n })\n }\n\n signinResponse(res) {\n // change the URL to remove the access info\n // We can start to render now\n const first = this.state.firstLoad\n if(res && res.stack && res.message) {\n console.log('signinRedirectCallback error:', res);\n appInsights.trackEvent({ name: \"RCC_LOGIN_ERROR\", properties: { method: \"signinResponse\", message: res.message, stack: res.stack } });\n\n\n // If the OpenID state cannot be found in the browser, then cookies are disabled. Store in URL instead. Session will not be persisted between\n // browser tabs:\n if(first && /no matching state found in storage/i.test(res.message) && this.state.urlIdToken > '') {\n const jwt = parseJwt(this.state.urlIdToken)\n this.state.userManager._stateStore.set(this.state.urlState, JSON.stringify({\n id: this.state.urlState,\n created: jwt.auth_time - 1000,\n request_type:'si:r',\n nonce:jwt.nonce,\n redirect_uri: this.state.userManager._settings._redirect_uri,\n authority:this.state.userManager._settings._authority,\n client_id:this.state.userManager._settings._client_id,\n response_mode: null,\n scope:this.state.userManager._settings._scope,\n extraTokenParams: {}\n }))\n appInsights.trackEvent({ name: \"RCC_LOGIN_LOCAL_STATE\", properties: { method: \"signinResponse\", message: res.message, stack: res.stack } });\n return this.state.userManager.signinRedirectCallback().then(this.signinResponse).catch(this.signinResponse)\n }\n window.history.replaceState({}, \"\", \"/\");\n this.setState({firstLoad:false,\n error:{\n message: `Error when validating credentials: ${res.message}`,\n stack: res.stack\n }\n })\n } else {\n console.log('signinRedirectCallback ok');\n }\n }\n\n onUserLoaded(user) {\n window.history.replaceState({}, \"\", \"/\");\n // Add some niceness\n User.active = user;\n // Let parent know \n this.props.userLoaded(function() {this.signout()}.bind(this));\n // Manage state\n this.setState({ isAuthenticated: true, firstLoad:false,expired:false,expiring:false,error: null }); \n //Log the authenticated user:\n appInsights.setAuthenticatedUserContext(User.active.username, User.active.sessionId, false);\n appInsights.trackEvent({ name: \"RCC_EVENT_LOGIN\", properties: { sessionId: User.active.sessionId, username: User.active.username } });\n }\n\n onUserUnloaded() {\n // Let the parent know\n this.props.userUnLoaded();\n // Remove from state\n this.setState({ isAuthenticated: false, firstLoad:false,expired:false,expiring:false,error: null });\n //Log the user logout:\n appInsights.clearAuthenticatedUserContext();\n // Redirect to openid to end the session\n if(process.env.REACT_APP_OIDC_ON !== \"FALSE\") {\n window.location.href = process.env.REACT_APP_OIDC_END;\n } else {\n window.location.reload();\n }\n } \n\n signin() {\n // call the login page\n this.state.userManager.signinRedirect().then(function () {\n console.log('signinRedirect ok');\n }).catch(function (err) {\n console.log('signinRedirect error:', err);\n this.signout();\n let errorStack = \"\";\n let errorMessage = \"\";\n if(err && err.stack && err.message) {\n errorStack = err.stack;\n errorMessage = err.message;\n }\n appInsights.trackEvent({ name: \"RCC_LOGIN_ERROR\", properties: { method: \"signin\", message: errorMessage, stack: errorStack } });\n this.setState({error:{\n message: `Error attempting login: ${errorMessage}`,\n stack: errorStack\n }})\n }.bind(this));\n }\n\n signout() {\n appInsights.trackEvent({ name: \"RCC_EVENT_LOGOUT\", properties: { sessionId: User.active.sessionId, username: User.active.username } });\n if(process.env.REACT_APP_OIDC_ON === \"FALSE\") {\n return this.onUserUnloaded();\n }\n // Removal the local user\n return this.state.userManager.removeUser().then(function () {\n console.log('removeUser ok');\n // Register that the user has been unloaded\n this.onUserUnloaded()\n }.bind(this)).catch(function (err) {\n console.log('removeUser error:', err);\n\n let errorStack = \"\";\n let errorMessage = \"\";\n if(err && err.stack && err.message) {\n errorStack = err.stack;\n errorMessage = err.message;\n }\n appInsights.trackEvent({ name: \"RCC_LOGOUT_ERROR\", properties: { method: \"signout\", message: errorMessage, stack: errorStack } });\n this.setState({error:{\n message: `Error attempting log out: ${errorMessage}`,\n stack: errorStack\n }})\n }.bind(this));\n }\n\n render() {\n // Error logging in\n if(this.state.error) {\n\n this.state.error = UserFriendlyErrorHandler.overrideError(this.state.error);\n\n return () \n }\n\n if(this.state.expired) {\n return () \n }\n\n if(this.state.expiring) {\n return () \n }\n \n // Logged in\n if (this.state.isAuthenticated && this.state.firstLoad === false) {\n return (this.props.children);\n }\n\n // New\n if(!this.state.isAuthenticated && !this.state.firstLoad) {\n setTimeout(function() {this.signin()}.bind(this), 1000)\n return (

You are required to login. redirecting, please wait...

) \n }\n\n // Should only get here on first load - waiting for validation of redirect URL (if there is one)\n return (
)\n }\n}\n\nexport default Authenticate;","import React from 'react';\nimport ConsentPage from './Pages/Consent'\nimport jointLogo from './ToyotaLexus.png'\nimport './App.css'\nimport Authenticate from './Components/Login'\nimport Resources from './resources/content'\nimport User from './classes/user';\nimport withAppInsights from './AppInsights';\n\nclass App extends React.Component {\n constructor(props) {\n\n // Verify that expected environment settings have been defined, otherwise fail:\n if ((process.env.REACT_APP_ENV == null) || (process.env.REACT_APP_ENV.length <= 0)) {\n throw new Error(\"Required environment variable REACT_APP_ENV is not set\");\n }\n\n if ((process.env.REACT_APP_API_URL == null) || (process.env.REACT_APP_API_URL.length <= 0)) {\n throw new Error(\"Required environment variable REACT_APP_API_URL is not set\");\n }\n\n // Environment settings exist, continue loading application:cd sou\n console.log(\"Application starting. Loading settings for: \" + process.env.REACT_APP_ENV); \n super(props);\n this.userLoaded = this.userLoaded.bind(this);\n this.userUnLoaded = this.userUnLoaded.bind(this);\n this.onConsentPageUpdated = this.onConsentPageUpdated.bind(this);\n\n this.state = { active: false,\"endsession\": undefined };\n }\n\n userLoaded(endsession) {\n if (endsession) {\n this.setState( {active: true, \"endsession\": endsession });\n }\n }\n\n userUnLoaded() {\n this.setState({ active: false, \"endsession\": undefined });\n }\n\n onConsentPageUpdated() {\n console.log('onConsentPageUpdated');\n this.forceUpdate();\n }\n\n render() {\n return (\n
\n
\n
\n
\n \"TOYOTA\n
\n
\n {this.state.active ? (\n
\n \n
\n ):(
)}\n
\n
\n
\n {Resources.Application('title')}\n
\n
\n
\n\n {this.state.active ? (
\n
\n
\n \n {User.active.firstName} {User.active.surname}\n \n
\n
\n
\n
\n \n {User.active.selectedCentreCode}: {User.active.selectedCentreName}\n \n
\n
\n
\n
\n \n Sign Out \n \n {/* */}\n
\n
\n
) : (
)}\n
\n
\n
\n
\n
\n \n {this.state.active ? () : (
Please wait...
)}\n
\n
\n
\n
\n
\n {this.state.active ? (\n

This is a private computer system. If you are not specifically authorised to access data on this system, disconnect now!
All information and communications on this system are confidential, subject to review, monitoring, and recording at any time without notice or permission.
By logging in to this system, you consent to these conditions of use.
Unauthorised use or access will be subject to prosecution or disciplinary action.

\n ): (

)}\n
\n
\n
\n
\n )\n }\n}\n\nexport default withAppInsights(App);\n\n","// This optional code is used to register a service worker.\n// register() is not called by default.\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 subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\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.0/8 are 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\nexport function register(config) {\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.href);\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/facebook/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. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\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://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\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 // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.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, config);\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\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { BrowserRouter } from 'react-router-dom'\nimport 'bootstrap/dist/css/bootstrap.css';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}