{"version":3,"sources":["webpack:///./app/javascript/utilities/config.js","webpack:///./app/javascript/utilities/enums.js","webpack:///./app/javascript/utilities/helpers.js"],"names":["env","process","cdnDomain","postHogHostUrl","postHogAPIKey","webVersion","currentChatbotCharacter","chatbotProfilePicture","actionNotPossiblePolicyAlreadyExists","domain","Domains","webDomain","WebDomains","motorDomain","MicroServices","Motor","dealershipDomain","Dealership","recollectionsDomain","Recollections","Config","authHeader","scheme","key","secret","googleCloud","apiKey","endpoints","geocode","placesAutocomplete","placeDetails","referrerUuidMap","appsFlyer","devKey","appId","firebaseToken","splitio","premium_strikethrough_split_id","default_treatment_single_discounted_premium","payment_details_input_emojis_split_id","default_treatment_input_emojis","services","analytics","attributeTag","AnalyticsDomain","eventTag","screenTag","registration","appsflyerId","googleConversion","trackExperiment","agent","generateAgentVerificationCode","verifyAgentCode","claims","retrieveInsuredAllRiskItems","submitAllRiskClaim","submitMotorClaim","user","retrieve","processOptInOptOut","retrieveV2User","searchByField","retrieveSalesAgent","sendSMS","verifySMS","sendEmail","updateUserOnVerifyAccount","callLead","verifyEmail","dealership","create","createDealership","update","auth","sendPasswordResetEmail","changePassword","createLead","chartData","profile","bankingDetails","details","getLeadStates","getLeads","requestCallback","leadEmailNotification","sendQueryEmail","sync","paymentMethods","get","vehicle","getAll","searchMake","searchModel","searchTrackerMake","searchTrackerModel","getByReg","getByMmCode","getPremiums","getDriveLessPremiums","getBanks","getBranches","updateVehicleFinanceDetails","getProofOfCover","getConfig","searchMMcode","sendIntercomTags","sendIntercomEvent","updateVin","deleteVehicle","searchFinanceHouse","getFinanceHouseName","person","createIWYZEPerson","getITCPerson","getAfrigisSuburb","getGoogleAutocomplete","getGooglePlace","getGooglePlaceLatLng","createClient","updateClient","getAddedPerson","motorPolicy","conditions","getTermsAndConditions","tags","interactions","interact","experiments","wills","processWillLead","rewarmWillLead","recollections","schedule","getCollectionInfo","saveResponse","saveError","timeLimit","getExcesses","WTF3","CLIENT","ITC","UPDATE_DECLARATIONS","LOOKUP","EXCESSES","ADDRESS_AUTOCOMPLETE","ADDRESS_AUTOCOMPLETE_FIELDS","ADDRESS_LATLNG","HIGH_RISK_VEHICLE","QUOTE_TCS","QUOTE","UPSERT","REMOVE_VEHICLE","REMOVE_OBJECT","ADD_BANK_DETAILS_TO_QUOTE","CREATE_POLICY","development","API_URL_DEV","test","API_URL_TEST","production","configurables","IS_QUOTE_OPTIMISATION_ON","WEB_DOMAIN_DEV","WEB_DOMAIN_TEST","Regex","CDN_URL_DEV","CDN_URL_TEST","email","noWhitespace","numeric","alphaSpaceDash","alphanumericSpace","alphabets","alphanumeric","vin","zaId","zaCompanyRegistrationNumer","zaVatNumber","engineNo","streetName","cellNumber","landLineNumber","BLOCKED_REFFERER_URLS","MOTOR_URL_DEV","MOTOR_URL_TEST","DEALERSHIP_URL_DEV","DEALERSHIP_URL_TEST","RECOLLECTIONS_URL_DEV","RECOLLECTIONS_URL_TEST","VehicleColours","VehicleStatuses","description","value","MaritalStatuses","EmploymentStatuses","VehicleUses","VehicleDisabilities","CompanyStructures","LicenseCodes","LicenseCodesMap","B","C","C1","EB","EC","EC1","LicenseRestrictions","AccountTypes","RelationshipTypesRegularDriver","A","A1","A2","D1","A3","G","RelationshipTypesOwner","RelationshipTypesBankAccountHolder","F3","D4","FinanceHouses","ExcessCodes","PreviousLossesDamageTypes","AccidentalDamage","DamageToOthers","Fire","MotherNature","TheftHijacking","ClaimRejectionReasons","NightTimeStructures","NightTimeSituations","NightTimeSecurityOptions","formatValidationMessage","field","formatSelectionValidationMessage","genericNotificationMessage","validationMessages","creditshotFall","residualAmount","loanAmount","monthlyInstallment","loanPeriod","numberPlate","contactNumber","lastName","firstName","fullName","vinNumber","engineNumber","mmCode","carMake","carYear","carModel","carColor","carStatus","carDaytimeAddress","carNighttimeAddress","carNightSituation","carAccessControl","carSecurityGuard","carUse","carOwner","relationshipStatus","idNumber","maritalStatus","employmentStatus","licenseCode","licenseRestriction","address","continuousCover","continuousOwnerCover","historicClaims","licenseIssueDate","regularDriver","accessories","accessoriesAmount","financed","financeHouse","svr","disability","disabilityDescription","daynightAddress","addressComparison","coverStartDate","claimRejected","claimRejectedReason","claimDescription","claimCost","claimCostMaxLimit","claimYear","streetNumber","postalCode","suburb","userId","claimType","claimDate","claimTime","lossType","causeType","theftClaimCaseNumber","theftClaimPoliceStation","damageClaimDamageAmount","claimIncidentAddress","claimIncidentDescription","carHireOptions","D","E","K","vehicleCategoriesThatCanSelectSUVForCarHire","vehiclePriceLimit","errorFetchingPremium","LOW_MILEAGE_PERCENTAGE","REFUND_PERCENTAGE_STRING","defaultSasria","Helpers","constructor","removeSpecialCharacters","inputString","replace","_Helpers","getInStorage","async","islocalStorage","localStorage","getItem","sessionStorage","e","console","log","setInStorage","val","setItem","removeFromStorage","isLocalStorage","arguments","length","undefined","removeItem","setAuthUser","JSON","stringify","getAuthUser","userStr","parse","getAuthUserId","id","_id","getSavedVehicle","str","getSavedVehicles","getSavedRegularDriver","setCurrentReferrerLink","document","referrer","getSavedOwner","clearStorage","clear","querystring","json","Object","keys","map","encodeURIComponent","join","replaceAllInString","target","search","replacement","RegExp","capitalizeFirstLetter","string","charAt","toUpperCase","slice","destructureNightSecurity","nightSecurity","vehicleNightTimeAccessControl","vehicleNightTimeSecurityGuard","sanitiseText","text","parseSAIdNo","today","moment","yr_str","substring","m_str","d_str","tempDate","id_date","date","id_month","month","year","age","format","add","parseInt","day","gender","getEmploymentStatuses","parsedZaId","status","label","filter","indexOf","getBasketPremiumTotals","basket","reduce","totals","item","lowMileage","low_mileage_premium","credit_shortfall_premium","comprehensive","comprehensive_premium","parsePreviousLossesAnswers","answers","values","loss","incident_year","thisYearStr","lossDate","daysDiff","diff","halfDaysDiff","Math","round","subtract","dateStr","Date","selected","editing","display","prevLossDate","prevLossCategory","loss_type","prevLossSection","hasClaimBeenRejected","claim_rejected","prevLossDetails","incident_description","prevLossAmount","loss_value","claimRejectionReason","claim_rejected_reason","parseClaimDates","claimDates","claim","getFullYear","toString","getAddressLine","riskscapeAddress","property_details","address_candidate","full_address","short_address","province","postal_code","municipality","formatUserInfo","data","platform","assign","entity","type","hideMobileViewProgressIndicator","window","screen","width","innerHeight","scrollY","body","scrollHeight","querySelectorAll","forEach","element","style","addDataLayer","isSalesAgent","ucid","uuid","pid","product","userType","dataLayer","push","chatBotScript","character","GetStarted_General_Greet","GetStarted_FirstName_Greet","VehicleDetails_Start","VehicleDetails_CarMake","VehicleDetails_Parking","VehicleDetails_Search_Reg","VehicleDetails_Search_Reg_Success","VehicleDetails_Search_Reg_Error","VehicleDetails_Sleep_Passive","VehicleDetails_Sleep_Active","VehicleDetails_Progress_Update_A","VehicleDetails_Progress_Update_B","VehicleDetails_Owner_status","VehicleDetails_Progress_Update_C","PersonalDetails_Start","PersonalDetails_License_Date","PersonalDetails_Progress_Update_A","PersonalDetails_Complete","startPromt","proceedPromt","completePromt","default","chatBotInteraction","step","chatBotCharacter","dynamicWord","currentUser","currentUserFirstName","first_name","currentStepScript","displayReg","regStr","displayMake","make","makeStr","formatAmount","amount","toFixed","removeVehicleFromStorage","condition","error","getUserMetaData","previousUrl","previousURL","user_agent","userCreatedViaWeb","browserInfo","name","getBrowserName","userAgent","navigator","toLowerCase","includes","brave","language","appName","appVersion","operatingSystem","deviceInfo","makeAndModel","getDeviceMakeAndModel","match","getClosestDate","payday","currentYear","currentMonth","getMonth","possibleDates","paydayDate","find","getDate","calculateProRata","commencementDay","strikeDay","basketComprehensiveTotal","numberOfVehiclesInBasket","startOf","startOfMonth","proRataDays","daysInMonth","daysInSelectedMonth","sasriaAmount","shouldUpdateUserDetails","userDetails","external_lead_source","regex","contact_number","last_name","RenderClauses","vehicleStatus","vehicleTracking","clauses","RenderClause","FindClauseIndex","subText","findIndex","preInspectionClauseIndex","noTrackingDeviceClauseIndex","presentTrackingDeviceClauseIndex","stolenVehicleRecoveryClauseIndex","extractUserSubset","acc","maskEmail","_email$split","split","_email$split2","_slicedToArray","localPart","maskedLocal","maskLength","repeat"],"mappings":"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","file":"js/index~cc0d3b32-86b760db57cced9ced03.chunk.js","sourcesContent":["import 'dotenv'\nimport { Domains, WebDomains, AnalyticsDomain, MicroServices } from './enums'\n\nconst env = process.env.REACT_ENV || 'development' // options: 'development', 'test', 'production'.\nconst cdnDomain = process.env.CDN_DOMAIN || 'https://cdn.pineapple.co.za'\nconst postHogHostUrl = process.env.POSTHOG_HOST\nconst postHogAPIKey = process.env.POSTHOG_KEY\nconst webVersion = '1.0.5'\nconst currentChatbotCharacter = 'Ntsundeni Mudzunga' // set the global chatbot character\n\nconst chatbotProfilePictureUrls = {\n 'Ntsundeni Mudzunga': `${cdnDomain}/static/images/ntsundeni.jpg`\n}\n\nconst chatbotProfilePicture = chatbotProfilePictureUrls[currentChatbotCharacter]\n\nconst actionNotPossiblePolicyAlreadyExists = 'policy has already been created'\n\nlet domain = Domains[env]\nlet webDomain = WebDomains[env]\nlet motorDomain = MicroServices.Motor[env]\nlet dealershipDomain = MicroServices.Dealership[env]\nconst recollectionsDomain = MicroServices.Recollections[env]\n\nconst Config = {\n authHeader: {\n scheme: process.env.AUTH_SCHEME,\n key: process.env.AUTH_KEY,\n secret: process.env.AUTH_SECRET,\n },\n googleCloud: {\n apiKey: process.env.GOOGLE_CLOUD_API_KEY,\n endpoints: {\n geocode: 'https://maps.googleapis.com/maps/api/geocode/json',\n placesAutocomplete:\n 'https://maps.googleapis.com/maps/api/place/autocomplete/json',\n placeDetails: 'https://maps.googleapis.com/maps/api/place/details/json',\n },\n },\n referrerUuidMap: {\n '50c3f366-9ec8-11ec-b909-0242ac120002': 'cars.co.za',\n },\n appsFlyer: {\n devKey: process.env.APPSFLYER_DEV_KEY,\n appId: process.env.APPSFLYER_APP_ID,\n firebaseToken: process.env.FIREBASE_TOKEN,\n },\n splitio: {\n apiKey: process.env.SPLIT_IO_API_KEY,\n premium_strikethrough_split_id: 'split_602e81a595ed5707d4d2a5eb',\n default_treatment_single_discounted_premium:\n 'treatment_602e827d95ed5707d4d2a613',\n payment_details_input_emojis_split_id: 'split_633154abb991f169474af0c3',\n default_treatment_input_emojis: 'treatment_633154c4202fdf39abedb0ec',\n },\n services: {\n analytics: {\n attributeTag: `${AnalyticsDomain}/tag/attribute`,\n eventTag: `${AnalyticsDomain}/tag/event`,\n screenTag: `${AnalyticsDomain}/tag/screen`,\n registration: `${AnalyticsDomain}/registrations`,\n appsflyerId: `${AnalyticsDomain}/appsflyer/appsflyerid`,\n googleConversion: `${AnalyticsDomain}/analytics/googleConversion`,\n trackExperiment: `${domain}/ab-tests/experiments`,\n },\n agent: {\n generateAgentVerificationCode: `${domain}/send-agent-verification-email/:agent_id`,\n verifyAgentCode: `${domain}/verify-agent-code`,\n },\n claims: {\n retrieveInsuredAllRiskItems: `${domain}/v2/asset-registers/assets/:user_id`,\n submitAllRiskClaim: `${domain}/v2/claims`,\n submitMotorClaim: `${motorDomain}/claim/submit-fnol/:user_id`\n },\n user: {\n retrieve: `${domain}/v2/users/retrieve`,\n processOptInOptOut: `${domain}/v2/users/opt-in`,\n retrieveV2User: `${domain}/v2/users/v2User`,\n searchByField: `${domain}/v2/users/search-user/field`,\n retrieveSalesAgent: `${domain}/v2/users/retrieve-sales-agent`,\n sendSMS: `${domain}/v2/users/send-sms/:user_id`,\n verifySMS: `${domain}/v2/users/verify-sms-code`,\n sendEmail: `${domain}/v2/users/send-email/:user_id`,\n updateUserOnVerifyAccount: `${domain}/v2/users/update-user-verify-account/:user_id`,\n callLead: `${domain}/v2/users/call-lead`,\n verifyEmail: `${domain}/v2/users/verify-email/:user_id`\n },\n dealership: {\n retrieve: `${dealershipDomain}/dealerships/dealership/:duuid`,\n create: `${dealershipDomain}/dealerships/create`,\n createDealership: `${dealershipDomain}/dealerships/createDealership`,\n update: `${dealershipDomain}/dealerships/update`,\n auth: `${dealershipDomain}/dealerships/auth`,\n sendPasswordResetEmail: `${dealershipDomain}/dealerships/sendPasswordResetEmail`,\n changePassword: `${dealershipDomain}/dealerships/changePassword`,\n createLead: `${dealershipDomain}/dealerships/create-lead`,\n chartData: `${dealershipDomain}/dealerships/dashboard-graphs-data/:id`,\n profile: `${dealershipDomain}/dealerships/profile/:id`,\n bankingDetails: `${dealershipDomain}/dealerships/banking-details/:id`,\n details: `${dealershipDomain}/dealerships/details/:id`,\n key: `${dealershipDomain}/dealerships/key/:id`,\n getLeadStates: `${dealershipDomain}/dealerships/lead-states`,\n getLeads: `${dealershipDomain}/dealerships/leads/:uuid`,\n requestCallback: `${dealershipDomain}/dealerships/request-callback/:user_id`,\n leadEmailNotification: `${dealershipDomain}/dealerships/update-lead-email-notification/:uuid`,\n sendQueryEmail: `${dealershipDomain}/dealerships/send-query-email`,\n sync: `${dealershipDomain}/dealerships/sync`,\n },\n paymentMethods: {\n get: `${domain}/v2/payment-methods/:user_id`,\n },\n vehicle: {\n getAll: `${motorDomain}/vehicles/:user_id`,\n searchMake: `${motorDomain}/vehicles/search/make?q={query}`,\n searchModel: `${motorDomain}/vehicles/search/model?make={make}&q={query}&year={year}`,\n searchTrackerMake: `${motorDomain}/trackers/search/make?q={query}`,\n searchTrackerModel: `${motorDomain}/trackers/search/model?make={make}&q={query}`,\n getByReg: `${motorDomain}/vehicles/reg/:reg_no`,\n getByMmCode: `${motorDomain}/vehicles/:mmcode/:year`,\n create: `${motorDomain}/vehicles`,\n getPremiums: `${motorDomain}/vehicles/premium`,\n getDriveLessPremiums: `${motorDomain}/vehicles/premium/drive-less`,\n getBanks: `${motorDomain}/banks`,\n getBranches: `${motorDomain}/banks/branches`,\n updateVehicleFinanceDetails: `${motorDomain}/vehicles/finance-details/:vehicle_id`,\n getProofOfCover: `${motorDomain}/vehicles/confirmation-of-cover`,\n getConfig: `${domain}/v2/config`,\n searchMMcode: `${motorDomain}/vehicles/search/mmcode?q={query}&year={year}`,\n sendIntercomTags: `${domain}/v2/vehicle/send-intercom-tags`,\n sendIntercomEvent: `${domain}/v2/vehicle/send-intercom-event`,\n updateVin: `${motorDomain}/vehicles/update-vin`,\n deleteVehicle: `${motorDomain}/vehicles/delete`,\n searchFinanceHouse: `${motorDomain}/vehicles/search/finance-house?q={query}`,\n getFinanceHouseName: `${motorDomain}/vehicles/search/finance-house-name?code={code}`,\n },\n person: {\n get: `${motorDomain}/person/:id`,\n createIWYZEPerson: `${motorDomain}/person`,\n getITCPerson: `${motorDomain}/person/itc/:id`,\n getAfrigisSuburb: `${motorDomain}/suburbs?lat=:lat&lng=:lng`,\n getGoogleAutocomplete: `${motorDomain}/suburbs/autocomplete?address=:address&type=:type`,\n getGooglePlace: `${motorDomain}/suburbs/place?place_id=:placeId`,\n getGooglePlaceLatLng: `${motorDomain}/suburbs/reverse-geocode?lat=:lat&lng=:lng`,\n createClient: `${domain}/iwyze-person/:user_id`,\n updateClient: `${domain}/iwyze-person/:user_id`,\n getAddedPerson: `${motorDomain}/person/iwyze-person/:user_id?type=:type`,\n },\n motorPolicy: {\n create: `${motorDomain}/vehicles/policy`,\n sync: `${motorDomain}/policies/sync/:user_id`,\n },\n conditions: {\n getTermsAndConditions: `${domain}/v2/conditions`,\n },\n tags: {\n create: `${AnalyticsDomain}/analytics/webEvents`,\n },\n interactions: {\n create: `${domain}/v2/interactions/`,\n interact: `${domain}/v2/interactions/interact`,\n update: `${domain}/v2/interactions/update`,\n },\n experiments: {\n create: `${domain}/analytics/experiments/create`,\n update: `${domain}/analytics/experiments/update`,\n },\n wills: {\n processWillLead: `${domain}/wills/processLead`,\n rewarmWillLead: `${domain}/wills/rewarmLead`,\n },\n recollections: {\n schedule: `${motorDomain}/v3/lookup/update-case`,\n getCollectionInfo: `${recollectionsDomain}/get/:request_id`,\n saveResponse: `${recollectionsDomain}/response`,\n saveError: `${recollectionsDomain}/error`,\n }\n },\n timeLimit: {\n getExcesses: 90000, // 1 minute 30 seconds\n },\n};\n\nconst WTF3 = {\n CLIENT: {\n ITC: `${motorDomain}/v2/client/:za_id/:personType/:user_id/itc`,\n UPDATE_DECLARATIONS: `${motorDomain}/v2/client/declarations/:user_id`,\n },\n LOOKUP: {\n EXCESSES: `${motorDomain}/v2/lookup/excesses?user_id=:user_id`,\n ADDRESS_AUTOCOMPLETE: `${motorDomain}/v3/lookup/address/riskscape/autocomplete?q=:query`,\n ADDRESS_AUTOCOMPLETE_FIELDS: `${motorDomain}/v3/lookup/address/riskscape/autocomplete`,\n ADDRESS_LATLNG: `${motorDomain}/v2/lookup/address/riskscape/latlng?lat=:lat&lng=:lng`,\n HIGH_RISK_VEHICLE: `${motorDomain}/v2/lookup/vehicles/high-risk?mmcode=:mmcode&year=:year`,\n QUOTE_TCS: `${motorDomain}/v2/lookup/tcs/quote`,\n },\n QUOTE: {\n UPSERT: `${motorDomain}/v2/quotes/:user_id?commit=:commit&sasria=:sasria`,\n REMOVE_VEHICLE: `${motorDomain}/v2/quotes/:userId/:vehicleId`,\n REMOVE_OBJECT: `${motorDomain}/v2/quotes/:user_id/objects/:object_no`,\n ADD_BANK_DETAILS_TO_QUOTE: `${motorDomain}/v2/quotes/:user_id/bank-details`,\n CREATE_POLICY: `${motorDomain}/v2/quotes/:user_id/purchase`,\n }\n}\n\nexport {\n Config,\n env,\n cdnDomain,\n webDomain,\n WTF3,\n currentChatbotCharacter,\n chatbotProfilePicture,\n actionNotPossiblePolicyAlreadyExists,\n postHogHostUrl,\n postHogAPIKey,\n webVersion\n}\n","import 'dotenv'\n\n// api url\nconst Domains = {\n development: process.env.API_URL_DEV,\n test: process.env.API_URL_TEST,\n production: process.env.API_URL_PROD,\n}\n\n// configurables\nconst configurables = {\n IS_QUOTE_OPTIMISATION_ON: false\n}\n\n// web domains\nconst WebDomains = {\n development: process.env.WEB_DOMAIN_DEV,\n test: process.env.WEB_DOMAIN_TEST,\n production: process.env.WEB_DOMAIN_PROD,\n}\n\nconst AnalyticsDomain = process.env.ANALYTICS_DOMAIN_URL\n\nconst Cdns = {\n development: process.env.CDN_URL_DEV,\n test: process.env.CDN_URL_TEST,\n production: process.env.CDN_URL_PROD,\n}\n\nconst Regex = {\n email: /^[a-zA-Z0-9][a-zA-Z0-9_.+\\-]*@[a-zA-Z0-9]+([-.][a-zA-Z0-9]+)*\\.[a-zA-Z]{2,}$/,\n noWhitespace: /^\\S*$/,\n numeric: /^\\d+$/,\n alphaSpaceDash: /^[a-z -]+$/i,\n alphanumericSpace: /^[a-zA-Z0-9 ]+$/i,\n alphabets: /^[a-zA-Z]+$/,\n alphanumeric: /^[a-zA-Z0-9]*$/,\n vin: /[A-HJ-NPR-Z0-9]{17}/,\n zaId: /^(((\\d{2}((0[13578]|1[02])(0[1-9]|[12]\\d|3[01])|(0[13456789]|1[012])(0[1-9]|[12]\\d|30)|02(0[1-9]|1\\d|2[0-8])))|([02468][048]|[13579][26])0229))((\\d{4})(0|1)(\\d{2}))/,\n zaCompanyRegistrationNumer: /((19|20)[\\d]{2}\\/[\\d]{6}\\/[\\d]{2})/,\n zaVatNumber: /^[4][0-9]{9}$/,\n engineNo: /[A-HJ-NPR-Z0-9]{1,12}/,\n streetName: /^[a-zA-Z ]{3,35}$/,\n cellNumber: /^0[6-8]\\d{8}$/,\n landLineNumber: /^0[1-8]\\d{8}$/,\n}\n\nconst BLOCKED_REFFERER_URLS = [\n process.env.BLOCKED_REFFERER_URL_1,\n process.env.BLOCKED_REFFERER_URL_2,\n]\n\n/* microservices */\nconst MicroServices = {\n Motor: {\n development: process.env.MOTOR_URL_DEV,\n test: process.env.MOTOR_URL_TEST,\n production: process.env.MOTOR_URL_PROD,\n },\n Dealership: {\n development: process.env.DEALERSHIP_URL_DEV,\n test: process.env.DEALERSHIP_URL_TEST,\n production: process.env.DEALERSHIP_URL_PROD,\n },\n Recollections: {\n development: process.env.RECOLLECTIONS_URL_DEV,\n test: process.env.RECOLLECTIONS_URL_TEST,\n production: process.env.RECOLLECTIONS_URL_PROD,\n },\n}\n\nconst VehicleColours = [\n 'Gold',\n 'White',\n 'Blue',\n 'Silver',\n 'Purple',\n 'Green',\n 'Red',\n 'Black',\n 'Yellow',\n 'Brown',\n 'Grey',\n 'Orange',\n]\n\nconst VehicleStatuses = [\n {\n description: 'New',\n value: 'New',\n },\n {\n description: 'Second Hand/Used',\n value: 'Used',\n },\n]\n\nconst MaritalStatuses = [\n 'Single',\n // 'Unmarried',\n 'Married',\n 'Living Together',\n 'Divorced',\n 'Widow',\n 'Annulment'\n]\n\nconst EmploymentStatuses = [\n {\n description: 'Employed',\n value: 'Employed',\n },\n {\n description: 'Unemployed',\n value: 'Unemployed',\n },\n {\n description: 'Retired',\n value: 'RetiredAndNotGainfullyEmployed',\n },\n {\n description: 'Retired but earning active income',\n value: 'Retired',\n },\n]\n\nconst VehicleUses = [\n {\n description: 'Private',\n value: 'domestic'\n },\n {\n description: 'Professional',\n value: 'business'\n },\n {\n description: 'Commercial',\n value: 'commercial'\n }\n]\n\nconst VehicleAnnualMileages = [\n {\n description: '0 - 15 000 km',\n value: '1'\n },\n {\n description: '15000 km - 30 000 km',\n value: '2'\n },\n {\n description: '30 001 km - 45 000 km',\n value: '3'\n },\n {\n description: '45001 km - 60 000 km',\n value: '4'\n },\n {\n description: 'Over 60 000',\n value: '5'\n },\n]\n\nconst VehicleDisabilities = [\n {\n description: 'Yes',\n value: 'Y'\n },\n {\n description: 'No',\n value: 'N'\n },\n]\n\nconst CompanyStructures = [\n 'Registered Company',\n 'Sole Proprietor'\n]\n\nconst LicenseCodes = [\n 'B: Motor vehicle that does not exceed 3500kgs.',\n 'C: Motor vehicle that exceeds 16000kgs.',\n 'C1: Motor vehicle between 3500kgs and 16000kgs',\n 'EB: Articulated motor vehicle that does not exceed 3500kgs',\n 'EC: Articulated motor vehicle that exceeds 16000kgs',\n 'EC1: Articulated motor between 3500kgs and 16000kgs',\n]\n\nconst LicenseCodesMap = {\n B: 'B: Motor vehicle that does not exceed 3500kgs.',\n C: 'C: Motor vehicle that exceeds 16000kgs.',\n C1: 'C1: Motor vehicle between 3500kgs and 16000kgs',\n EB: 'EB: Articulated motor vehicle that does not exceed 3500kgs',\n EC: 'EC: Articulated motor vehicle that exceeds 16000kgs',\n EC1: 'EC1: Articulated motor between 3500kgs and 16000kgs',\n}\n\nconst LicenseRestrictions = [\n {\n description: 'None',\n value: 'none',\n },\n {\n description: 'Automatic cars only',\n value: 'AUTO',\n },\n {\n description: 'Disabled',\n value: 'DISA',\n }\n]\n\nconst AccountTypes = ['Current', 'Savings', 'Transmission']\n\nconst RelationshipTypesRegularDriver = {\n A: 'They are my spouse',\n A1: 'They are my parent/step-parent',\n // F3: 'They are my parent-inlaw',\n A2: 'They are my child/stepchild living with me, the policyholder',\n // D4: 'They are my family member living with me, the policyholder',\n D1: 'We are living together',\n A3: 'They are my allocated driver (owner is incapacitated)',\n G: 'They are other persons to me',\n}\n\nconst RelationshipTypesOwner = {\n A: 'They are my spouse',\n A1: 'They are my parent/step-parent',\n // F3: 'They are my parent-inlaw',\n A2: 'They are my child/stepchild living with me, the policyholder',\n // D4: 'They are my family member living with me, the policyholder',\n D1: 'We are living together',\n G: 'They are other persons to me',\n}\n\nconst RelationshipTypesBankAccountHolder = {\n 77: 'They are my spouse',\n A1: 'They are my parent/step-parent',\n F3: 'They are my parent-inlaw',\n A2: 'They are my child/stepchild living with me, the policyholder',\n D4: 'They are my family member living with me, the policyholder',\n D1: 'We are living together',\n G: 'They are other persons to me',\n}\n\nconst FinanceHouses = {\n 'AA Asset Finance (SA Motor Admin)': 17,\n 'ABSA': 1,\n 'African Bank': 27,\n 'Albaraka Bank': 35,\n 'Audi Financial Services': 28,\n 'Bidvest': 34,\n 'BMW Financial Services': 12,\n 'Daimler Chrysler Finance': 15,\n 'Ford Credit': 2,\n 'IEMAS Financial Services': 32,\n 'IEMAS Motor Finance': 21,\n 'Imas': 26,\n 'Imperial Bank': 18,\n 'Investec': 19,\n 'Ithala Development Finance Corporation': 29,\n 'Ithala SOC Limited': 30,\n 'Lexus Finance House': 22,\n 'Marquis Finance': 33,\n 'MFC': 13,\n 'MLS': 3,\n 'Mercantile Bank': 16,\n 'Mercedes Benz Finance': 14,\n 'Nedbank': 4,\n 'Nissan Finance': 8,\n 'Old Mutual': 5,\n 'Standard Bank': 24,\n 'Stannic': 6,\n 'Themba Bank': 25,\n 'Toyota Finance': 9,\n 'U Buy Motor': 20,\n 'Unconfirmed': 'U',\n 'VW Financial Services': 10,\n 'Wesbank': 7,\n 'Wesbank Corporate': 11,\n}\n\nconst ExcessCodes = {\n 0: 100,\n 2000: 110,\n 4500: 175,\n 6200: 200,\n 8100: 210,\n 9200: 220,\n 10350: 230,\n 11600: 240,\n 12750: 250,\n 13900: 260,\n 15000: 270,\n 16250: 280,\n 17400: 290,\n 17900: 300\n}\n\nconst PreviousLossesDamageTypes = {\n AccidentalDamage: 'GMLT',\n DamageToOthers: '103',\n Fire: '108',\n MotherNature: '105',\n TheftHijacking: '107'\n}\n\nconst ClaimRejectionReasons = [\n {\n description: 'Late notification/No cover/Policy exclusion',\n value: 'PEX',\n },\n {\n description: 'Fraud/Potential fraud/Misrepresentation/Moral risk',\n value: 'MND',\n },\n {\n description: 'Other/Premium unpaid',\n value: 'OTH',\n },\n]\n\nconst NightTimeStructures = [\n {\n description: 'Carport',\n value: 'C',\n },\n {\n description: 'Garage',\n value: 'G',\n },\n {\n description: 'In the open',\n value: 'O',\n },\n {\n description: 'Not sure yet',\n value: 'U',\n },\n]\n\nconst NightTimeSituations = [\n {\n description: 'Standalone house',\n value: 'R',\n },\n {\n description: 'Plot/Small holding',\n value: 'S',\n },\n {\n description: 'Complex/Gated estate',\n value: 'E',\n },\n {\n description: 'Unconfirmed',\n value: 'U',\n },\n]\n\nconst NightTimeSecurityOptions = [\n {\n description: 'Yes',\n value: 'Y',\n },\n {\n description: 'No',\n value: 'N',\n },\n {\n description: 'Not sure',\n value: 'U'\n }\n]\n\nconst NightTimeSecurityMap = {\n 'U': {\n nightTimeAccessControl: 'Unknown',\n nightTimeSecurityGuard: 'Unknown'\n },\n 'ACSG': {\n nightTimeAccessControl: 'Yes',\n nightTimeSecurityGuard: 'YES'\n },\n 'ACNSG': {\n nightTimeAccessControl: 'Yes',\n nightTimeSecurityGuard: 'No'\n },\n 'SG': {\n nightTimeAccessControl: 'No',\n nightTimeSecurityGuard: 'Yes'\n },\n 'NACNSG': {\n nightTimeAccessControl: 'No',\n nightTimeSecurityGuard: 'NO'\n }\n}\n\nconst DefaultCssSelectors = {\n idName: 'ThisIsADefault'\n}\n\nconst formatValidationMessage = (field) => {\n return `Please enter a valid ${field}`\n}\n\nconst formatSelectionValidationMessage = (field) => {\n return `Please select a ${field}`\n}\n\nconst genericValidationMessage = () => {\n return 'Please select an option'\n}\n\nconst genericNotificationMessage = (field) => {\n return `Please note: ${field}`\n}\n\nconst validationMessages = {\n creditshotFall: genericNotificationMessage('You do not qualify for credit shortfall as the vehicle retail value is greater that the loan amount'),\n residualAmount: formatValidationMessage('Residual Payment Amount'),\n loanAmount: formatValidationMessage('Loan Amount'),\n monthlyInstallment: formatValidationMessage('Monthly Installment'),\n loanPeriod: formatValidationMessage('Loan Period'),\n numberPlate: formatValidationMessage('Number Plate'),\n contactNumber: formatValidationMessage('Contact Number (e.g 0831231231)'),\n email: formatValidationMessage('Email Address'),\n lastName: formatValidationMessage('last name'),\n firstName: formatValidationMessage('first name'),\n fullName: formatValidationMessage('Name & Surname'),\n vinNumber: formatValidationMessage('Vin Number'),\n engineNumber:formatValidationMessage('Engine Number'),\n mmCode: formatValidationMessage('MM Code'),\n carMake: formatSelectionValidationMessage('Make'),\n carYear: formatValidationMessage('Year'),\n carModel: formatSelectionValidationMessage('Model that matches Make and Year'),\n carColor: formatSelectionValidationMessage('Colour'),\n carStatus: formatSelectionValidationMessage('Status'),\n carDaytimeAddress: formatSelectionValidationMessage('Day Address'),\n carNighttimeAddress: formatSelectionValidationMessage('Home Address'),\n carNightSituation: genericValidationMessage(),\n carNightSituation: genericValidationMessage(),\n carAccessControl: genericValidationMessage(),\n carSecurityGuard: genericValidationMessage(),\n carUse: genericValidationMessage(),\n carOwner: genericValidationMessage(),\n relationshipStatus: genericValidationMessage(),\n idNumber: formatValidationMessage('ID Number'),\n maritalStatus: genericValidationMessage(),\n employmentStatus: genericValidationMessage(),\n licenseCode: genericValidationMessage(),\n licenseRestriction: genericValidationMessage(),\n address: formatSelectionValidationMessage('Address'),\n continuousCover: formatValidationMessage('Number, and make sure it is less than the number of years you have held a driver\\'s license.'),\n continuousOwnerCover: formatValidationMessage('Number, and make sure it is less than your current age'),\n historicClaims: genericValidationMessage(),\n licenseIssueDate: formatSelectionValidationMessage('license issue date, it is required and make sure you were 18 years old on this date'),\n regularDriver: genericValidationMessage(),\n accessories: genericValidationMessage(),\n accessoriesAmount: formatValidationMessage('Number'),\n financed: genericValidationMessage(),\n financeHouse: formatValidationMessage('Finance House'),\n svr: genericValidationMessage(),\n disability: genericValidationMessage(),\n disabilityDescription: formatValidationMessage('Description'),\n daynightAddress: genericValidationMessage(),\n addressComparison: genericValidationMessage(),\n coverStartDate: formatSelectionValidationMessage('Date'),\n claimRejected: genericValidationMessage(),\n claimRejectedReason: genericValidationMessage(),\n claimDescription: formatValidationMessage('Description (minimum 10 characters)'),\n claimCost: formatValidationMessage('Number'),\n claimCostMaxLimit: genericNotificationMessage('The loss value cannot exceed R10 million'),\n claimYear: formatValidationMessage('Year'),\n streetName: formatValidationMessage('Street name'),\n streetNumber: formatValidationMessage('Street number'),\n postalCode: formatValidationMessage('Postal code'),\n suburb: formatValidationMessage('Suburb'),\n userId: formatValidationMessage('user ID'),\n claimType: formatValidationMessage('Claim Type'),\n claimDate: formatValidationMessage('Claim Date, that is not in the future'),\n claimTime: formatValidationMessage('Claim Time, that is not in the future'),\n lossType: formatValidationMessage('Loss Type'),\n causeType: formatValidationMessage('Cause Type'),\n theftClaimCaseNumber: formatValidationMessage('SAPS Case Number'),\n theftClaimPoliceStation: formatValidationMessage('Police Station'),\n damageClaimDamageAmount: formatValidationMessage('Damage Amount'),\n claimIncidentAddress: formatValidationMessage('Incident Address'),\n claimIncidentDescription: formatValidationMessage('Incident Description'),\n bankingDetails: 'Your bank account details do not seem to be valid. Please double-check that your account number has been entered correctly, ensure the correct account type has been selected, and then try again.',\n}\n\nconst carHireOptions = {\n A: 'Mini',\n B: 'Economy Hatchback',\n D: 'Economy Sedan',\n E: 'Economy Sedan Automatic',\n K: 'Standard SUV 2WD',\n}\n\nconst vehicleCategoriesThatCanSelectSUVForCarHire = ['D/C', 'D/S', 'P/V', 'MPV', 'S/C', 'SAV', 'SUV']\n\nconst vehiclePriceLimit = 1200000\n\nconst errorFetchingPremium = 'Could not calculate your premium'\n\n// Drive Less Get Blessed discount\n// Should apply to base premium + options\n// but not to sasria\nconst LOW_MILEAGE_PERCENTAGE = 0.71\n\n// String representing how much of a refund\n// the user will get for Drive Less Get Blessed\n// for display purposes\nconst REFUND_PERCENTAGE_STRING = '30'\n\nexport {\n Domains,\n WebDomains,\n AnalyticsDomain,\n Cdns,\n Regex,\n MicroServices,\n VehicleColours,\n VehicleStatuses,\n MaritalStatuses,\n CompanyStructures,\n LicenseCodes,\n LicenseCodesMap,\n AccountTypes,\n RelationshipTypesRegularDriver,\n RelationshipTypesOwner,\n RelationshipTypesBankAccountHolder,\n FinanceHouses,\n EmploymentStatuses,\n ExcessCodes,\n VehicleUses,\n VehicleAnnualMileages,\n VehicleDisabilities,\n PreviousLossesDamageTypes,\n LicenseRestrictions,\n ClaimRejectionReasons,\n NightTimeStructures,\n NightTimeSituations,\n NightTimeSecurityOptions,\n NightTimeSecurityMap,\n DefaultCssSelectors,\n validationMessages,\n configurables,\n carHireOptions,\n vehicleCategoriesThatCanSelectSUVForCarHire,\n BLOCKED_REFFERER_URLS,\n vehiclePriceLimit,\n errorFetchingPremium,\n LOW_MILEAGE_PERCENTAGE,\n REFUND_PERCENTAGE_STRING\n}\n","import moment from 'moment'\nimport { EmploymentStatuses } from './enums'\n\nconst defaultSasria = 2.02\n\nexport class Helpers {\n constructor() { }\n\n static getInStorage = async (key, islocalStorage) => {\n try {\n // if is local storage\n if (islocalStorage) {\n return await localStorage.getItem(`@pineapple:${key}`)\n } else {\n // if session storage\n return await sessionStorage.getItem(`@pineapple:${key}`)\n }\n } catch (e) {\n console.log('getInStorage error', e)\n }\n }\n\n static setInStorage = async (key, val, islocalStorage) => {\n try {\n // if is local storage\n if (islocalStorage) {\n await localStorage.setItem(`@pineapple:${key}`, val)\n } else {\n // if session storage\n await sessionStorage.setItem(`@pineapple:${key}`, val)\n }\n } catch (e) {\n console.log('setInStorage error', e)\n }\n }\n\n static removeFromStorage = async (key, isLocalStorage = false) => {\n try {\n if (isLocalStorage) {\n return await localStorage.removeItem(`@pineapple:${key}`)\n } else {\n return await sessionStorage.removeItem(`@pineapple:${key}`)\n }\n } catch (e) {\n console.log('removeFromStorage error', e)\n }\n }\n\n /**\n * Set the logged in user\n */\n static setAuthUser = async (user) => {\n await Helpers.setInStorage('user', JSON.stringify(user))\n }\n\n /**\n * Get the logged in user\n */\n static getAuthUser = async () => {\n const userStr = await Helpers.getInStorage('user')\n if (userStr) {\n return JSON.parse(userStr)\n }\n }\n\n static getAuthUserId = async () => {\n const userStr = await Helpers.getInStorage('user')\n\n if (userStr) {\n const user = JSON.parse(userStr)\n return user.id || user._id\n }\n }\n\n static getSavedVehicle = async () => {\n const str = await Helpers.getInStorage('vehicle');\n\n if (str && str.length > 0 && str !== 'undefined') {\n return JSON.parse(str)\n }\n\n return null\n }\n\n static getSavedVehicles = async () => {\n try {\n const str = await Helpers.getInStorage('vehicles')\n return JSON.parse(str)\n } catch (e) {\n return []\n }\n }\n\n static removeSpecialCharacters(inputString) {\n const regex = /[^a-zA-Z0-9-' ]/g\n const result = inputString.replace(regex, '')\n return result\n }\n\n static getSavedRegularDriver = async () => {\n const str = await Helpers.getInStorage('regularDriver')\n\n if (str) {\n return JSON.parse(str)\n }\n }\n\n static setCurrentReferrerLink = async () => {\n await Helpers.setInStorage('referrerUrl', document.referrer);\n }\n\n static getSavedOwner = async () => {\n const str = await Helpers.getInStorage('owner')\n\n if (str) {\n return JSON.parse(str)\n }\n }\n\n static clearStorage = () => {\n sessionStorage.clear()\n }\n\n static querystring = (json) => {\n const str = Object.keys(json)\n .map(\n (key) => encodeURIComponent(key) + '=' + encodeURIComponent(json[key])\n )\n .join('&')\n\n return str\n }\n\n static replaceAllInString = (target, search, replacement) => {\n return target.replace(new RegExp(search, 'g'), replacement)\n }\n\n static capitalizeFirstLetter = (string) => {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n static destructureNightSecurity = (nightSecurity) => {\n // night time security\n let vehicleNightTimeAccessControl = 'U';\n let vehicleNightTimeSecurityGuard = 'U';\n\n switch (nightSecurity) {\n case 'ACSG':\n vehicleNightTimeAccessControl = 'Y';\n vehicleNightTimeSecurityGuard = 'Y';\n break;\n case 'ACNSG':\n vehicleNightTimeAccessControl = 'Y';\n vehicleNightTimeSecurityGuard = 'N';\n break;\n case 'SG':\n vehicleNightTimeAccessControl = 'N';\n vehicleNightTimeSecurityGuard = 'Y';\n break;\n case 'NACNSG':\n vehicleNightTimeAccessControl = 'N';\n vehicleNightTimeSecurityGuard = 'N';\n break;\n }\n return { vehicleNightTimeAccessControl, vehicleNightTimeSecurityGuard };\n };\n\n // removes special characters and emoji from a string\n static sanitiseText = (text) => {\n return text.replace(/[^a-zA-Z0-9 _'-]/gi, '')\n }\n\n static parseSAIdNo = (idNumber) => {\n if (!idNumber || idNumber.length != 13) {\n return false\n }\n\n // today's date\n const today = moment()\n\n // assume you're born in 20th century\n let yr_str = `19${idNumber.substring(0, 2)}`\n const m_str = idNumber.substring(2, 4)\n const d_str = idNumber.substring(4, 6)\n\n // Handle edgecase of user born on 29 Feb 2000\n if (idNumber.substring(0, 6) === '000229') {\n yr_str = `20${idNumber.substring(0, 2)}`\n }\n\n // date from above info\n const tempDate = moment(`${yr_str}-${m_str}-${d_str}`, 'YYYY-MM-DD')\n\n const id_date = tempDate.date()\n const id_month = tempDate.month() + 1\n let year = tempDate.year()\n\n // calculate assumed age\n let age = today.format('YYYY') - tempDate.format('YYYY')\n\n // assume you're always younger than 100\n while (age > 100) {\n age -= 100\n tempDate.add(100, 'y')\n }\n\n // update year\n year = tempDate.format('YYYY')\n\n if (\n year.substring(2, 4) !== idNumber.substring(0, 2) ||\n parseInt(id_month, 10) !== parseInt(idNumber.substring(2, 4), 10) ||\n parseInt(id_date, 10) !== parseInt(idNumber.substring(4, 6), 10)\n ) {\n return false\n }\n\n // return dictionary\n return {\n age,\n day: id_date,\n month: id_month,\n year,\n gender:\n parseInt(idNumber.substring(6, 10), 10) < 5000 ? 'female' : 'male',\n }\n }\n\n static getEmploymentStatuses = (zaId) => {\n const parsedZaId = Helpers.parseSAIdNo(zaId)\n\n // za ID could not be parsed - return default values\n if (!parsedZaId || parsedZaId.age >= 55) {\n return EmploymentStatuses.map(status => ({\n label: status.description,\n value: status.value\n }))\n } else {\n // younger than 55\n return EmploymentStatuses.filter((status) => {\n if (['Employed', 'Unemployed'].indexOf(status.value) < 0) {\n return false\n }\n\n return true\n })\n .map(status => ({\n label: status.description,\n value: status.value\n }))\n }\n }\n\n static getBasketPremiumTotals = (basket) => {\n const premiumTotals = basket.reduce((totals, item) => {\n totals.lowMileage = totals.lowMileage + item.low_mileage_premium + (item.credit_shortfall_premium || 0) + defaultSasria\n totals.comprehensive = totals.comprehensive + item.comprehensive_premium + (item.credit_shortfall_premium || 0) + defaultSasria\n return totals\n }, { lowMileage: 0, comprehensive: 0 })\n return premiumTotals\n }\n\n static parsePreviousLossesAnswers = (answers) => {\n const losses = Object.values(answers)\n .filter((loss) => {\n if (\n !loss.incident_year\n || loss.incident_year.length !== 4\n || loss.incident_year > parseInt(moment().format('YYYY'), 10)\n ) {\n return false;\n }\n return true;\n })\n .map((loss) => {\n const thisYearStr = moment().format('YYYY')\n let lossDate\n\n if (loss.incident_year === thisYearStr) {\n const daysDiff = moment().diff(moment(`${thisYearStr}-01-01`), 'd')\n const halfDaysDiff = Math.round(daysDiff / 2)\n\n lossDate = moment().subtract(halfDaysDiff, 'd').format('YYYY-MM-DD')\n } else {\n const dateStr = `${loss.incident_year}-06-30`\n const date = new Date(dateStr)\n const momentDate = moment(date)\n lossDate = momentDate.format('YYYY-MM-DD')\n }\n\n return ({\n selected: true,\n editing: false,\n display: true,\n prevLossDate: lossDate,\n prevLossCategory: loss.loss_type,\n prevLossSection: 'STMTR',\n hasClaimBeenRejected: loss.claim_rejected === 'Y',\n prevLossDetails: loss.incident_description,\n prevLossAmount: parseInt(loss.loss_value, 10),\n claimRejectionReason: loss.claim_rejected === 'Y' ? loss.claim_rejected_reason : undefined,\n })\n })\n\n return losses\n }\n\n static parseClaimDates = (claimDates = []) => {\n const lossAnswers = Object.values(claimDates).map((claim) => {\n const year = new Date(claim.prevLossDate).getFullYear()\n\n return {\n claim_rejected: claim.hasClaimBeenRejected ? 'Y' : 'N',\n claim_rejected_reason: claim.hasClaimBeenRejected ? claim.claimRejectionReason : '',\n incident_description: claim.prevLossDetails,\n incident_year: year.toString(),\n loss_type: claim.prevLossCategory,\n loss_value: claim.prevLossAmount.toString(),\n }\n })\n\n return lossAnswers\n }\n\n static getAddressLine = (address) => {\n const { riskscapeAddress } = address\n\n // check riskscape\n if (riskscapeAddress) {\n const { property_details, address_candidate } = riskscapeAddress\n\n if (address_candidate) {\n return address_candidate\n } else if (property_details) {\n const {\n full_address,\n short_address,\n suburb,\n province,\n postal_code,\n municipality,\n } = property_details\n\n if (full_address) {\n return full_address\n } else if (short_address) {\n return `${short_address}, ${suburb}, ${municipality}, ${province} ${postal_code}`\n }\n }\n }\n }\n\n static formatUserInfo = (agent, user, dealership) => {\n // user data\n const data = {\n platform: 'web',\n date: new Date()\n }\n\n if (agent) {\n // add agent data\n Object.assign(data, {\n entity: agent.type === 'retentions' ? 'retentions' : 'agent',\n email: agent.email\n })\n } else if (dealership) {\n // save partner email\n Object.assign(data, {\n entity: 'partner',\n email: dealership.email\n })\n } else {\n // add user data\n Object.assign(data, {\n entity: 'user',\n email: user.email\n })\n }\n return data\n }\n\n static hideMobileViewProgressIndicator = () => {\n // this logic only triggers on mobile screens once the progress tracker snaps to the bottom\n if (window.screen.width > 468) return\n\n // this condition checks if you have reached the bottom of the page\n if ((window.innerHeight + window.scrollY) >= (document.body.scrollHeight - 250)) {\n document.querySelectorAll('.progress-step-indicator-data-wrapper').forEach((element) => {\n element.style.display = 'none'\n })\n } else {\n document.querySelectorAll('.progress-step-indicator-data-wrapper').forEach((element) => {\n element.style.display = 'inherit'\n })\n }\n }\n\n static addDataLayer = async (data) => {\n const isSalesAgent = await this.getInStorage('sales_agent', true);\n const ucid = data.ucid || (await this.getInStorage('ucid', true));\n const uuid = data.uuid || (await this.getAuthUserId());\n const pid = data.pid || await this.getInStorage('pid', true);\n\n Object.assign(data, {\n product: 'car-insurance',\n userType: isSalesAgent ? 'agent' : 'customer',\n uuid,\n ucid,\n pid\n });\n\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(data);\n }\n\n static chatBotScript = (character) => {\n // in the future, the scripts for other chatbot characters will live here\n const scripts = {\n 'Ntsundeni Mudzunga': {\n GetStarted_General_Greet: 'Hi, I’m Ntsundeni 👋. Let’s get your car insured...',\n GetStarted_FirstName_Greet: 'Great to meet you ${dynamicWord}. I hope you are having a great day!',\n VehicleDetails_Start: 'Don’t be shy, tell us more about the car you are driving by filling in the details below...',\n VehicleDetails_CarMake: 'Oooh! ${dynamicWord}. We see you ${userFirstName} 😉.',\n VehicleDetails_Parking: 'Cool! Tell me ${userFirstName}, where do you park your car?',\n VehicleDetails_Search_Reg: 'Please wait while we retrieve your details from TransUnion...',\n VehicleDetails_Search_Reg_Success: 'All done! Are the details below correct?',\n VehicleDetails_Search_Reg_Error: 'Oops, we could not find your details on TransUnion but please feel free to provide them to us below...',\n VehicleDetails_Sleep_Passive: '${dynamicWord}? No worries, you’ll let us know when you get there 👍.',\n VehicleDetails_Sleep_Active: '${dynamicWord}? NICE, we like it 👍.',\n VehicleDetails_Progress_Update_A: 'Wow ${userFirstName}. Look at you go, keep it up!',\n VehicleDetails_Progress_Update_B: '${dynamicWord}? That’s perfect ${userFirstName}✨!',\n VehicleDetails_Owner_status: 'Oh, ${dynamicWord} you say? Look at you go 😉!',\n VehicleDetails_Progress_Update_C: 'Nearly there ${userFirstName}, hang in there✌️!',\n PersonalDetails_Start: 'We just need a few more personal details ${userFirstName}...',\n PersonalDetails_License_Date: 'Oooh, that’s a good date ${userFirstName}! 👌',\n PersonalDetails_Progress_Update_A: 'Step 3/3! Let’s get you your quote, ${userFirstName}!',\n PersonalDetails_Complete: 'Click “Complete” to see your quote 🔥',\n startPromt: 'Please click on the \"Start\" button to begin!',\n proceedPromt: 'Please click on the \"Proceed\" button to move forward.',\n completePromt: 'Please click on the \"Complete\" button to move forward.',\n default: 'Please tell us as much detail as possible in order for us to give you the best price.'\n }\n }\n return scripts[character]\n }\n\n static chatBotInteraction = async (step, chatBotCharacter, dynamicWord) => {\n // get the current logged-in user\n let currentUser = await Helpers.getAuthUser()\n let currentUserFirstName = currentUser && currentUser.first_name\n // get the appropriate script line\n let currentStepScript = Helpers.chatBotScript(chatBotCharacter)[step]\n if (currentStepScript) {\n // return the appropriate script line\n return currentStepScript.replace('${dynamicWord}', dynamicWord).replace('${userFirstName}', currentUserFirstName)\n } else if (Helpers.chatBotScript(chatBotCharacter)) {\n // character fallback text\n return Helpers.chatBotScript(chatBotCharacter).default\n } else {\n // general fallback text\n return 'Welcome to Pineapple, we hope you enjoy the experience.'\n }\n }\n\n static displayReg = (registration) => {\n let regStr = registration\n if (registration && registration.length > 10) {\n regStr = registration.substring(0, 10) + '...'\n }\n return regStr\n }\n\n static displayMake = (make) => {\n let makeStr = make\n if (make && make.length > 13) {\n makeStr = make.substring(0, 13) + '...'\n }\n return makeStr\n }\n\n static formatAmount = (amount) => {\n if (amount >= 1000000) {\n return (amount / 1000000).toFixed(1) + 'm';\n } else if (amount >= 1000) {\n return (amount / 1000).toFixed(1) + 'k';\n } else {\n return amount.toString();\n }\n }\n\n static removeVehicleFromStorage = async (condition) => {\n try {\n if (condition) {\n // remove vehicle from session storage so that a new vehicle can be added by user when navigating to the dashboard\n await Helpers.removeFromStorage('vehicle')\n // set numberPlate to empty string to remove previous vehicle number plate from populating number plate input\n await Helpers.removeFromStorage('numberPlate')\n await Helpers.removeFromStorage('hasNoNumberPlate')\n }\n }\n catch (error) {\n console.log('removeVehicleFromStorage error', error)\n }\n }\n\n\n\n static getUserMetaData = (previousUrl) => {\n const userCreatedViaWeb = true\n const previousURL = previousUrl || document.referrer;\n\n const getBrowserName = () => {\n const userAgent = navigator.userAgent.toLowerCase();\n if (userAgent.includes('edg') || userAgent.includes('edge')) return 'Microsoft Edge';\n if (userAgent.includes('msie') || userAgent.includes('trident')) return 'Internet Explorer';\n if (userAgent.includes('opera') || userAgent.includes('opr')) return 'Opera';\n if (navigator.brave) return 'Brave';\n if (userAgent.includes('chrome')) return 'Google Chrome';\n if (userAgent.includes('safari')) return 'Apple Safari';\n if (userAgent.includes('firefox')) return 'Mozilla Firefox';\n return 'Unknown Browser';\n };\n\n const getDeviceMakeAndModel = () => {\n const userAgent = navigator.userAgent;\n\n // Extracting device make and model from the user agent string\n const match = userAgent.match(/\\(([^)]+)\\)/);\n return match ? match[1] : 'Unknown';\n };\n\n const browserInfo = {\n name: getBrowserName(),\n userAgent: navigator.userAgent,\n language: navigator.language,\n platform: navigator.platform,\n appName: navigator.appName,\n appVersion: navigator.appVersion,\n };\n\n const operatingSystem = (() => {\n const userAgent = navigator.userAgent.toLowerCase();\n if (userAgent.includes('windows')) return 'Windows';\n if (userAgent.includes('mac')) return 'Mac';\n if (userAgent.includes('android')) return 'Android';\n if (userAgent.includes('iphone') || userAgent.includes('ipad')) return 'iOS';\n return 'Unknown';\n })();\n\n const deviceInfo = {\n makeAndModel: getDeviceMakeAndModel(),\n };\n\n return {\n user_agent: {\n userCreatedViaWeb,\n browserInfo,\n operatingSystem,\n deviceInfo,\n previousURL\n }\n }\n }\n \n static getClosestDate = (payday) => {\n const options = [1, 15, 20, 25, 26, 27]\n const today = new Date()\n const currentYear = today.getFullYear()\n const currentMonth = today.getMonth()\n \n // Map each option to a Date object in the current month\n const possibleDates = options.map((day) => new Date(currentYear, currentMonth, day))\n \n const paydayDate = new Date(currentYear, currentMonth, payday)\n \n // Find the closest future or same-day debit date relative to the payday\n const closestFutureDate = possibleDates.find((date) => date >= paydayDate) || possibleDates[0]\n return closestFutureDate.getDate().toString()\n };\n \n static calculateProRata = (commencementDay, strikeDay, basketComprehensiveTotal, numberOfVehiclesInBasket) => {\n const today = moment().startOf('day')\n const startOfMonth = moment(today).startOf('month')\n strikeDay = parseInt(strikeDay, 10)\n let proRataDays\n\n // Get the total days in the current month\n const daysInMonth = startOfMonth.daysInMonth()\n // Validate that both commencementDay and strikeDay are within the valid range\n if (commencementDay > daysInMonth || strikeDay > 31) {\n return `Invalid date: Commencement day or Strike day exceeds the days in this month (${daysInMonth} days).`\n }\n if (strikeDay >= commencementDay) {\n proRataDays = strikeDay - commencementDay\n } else {\n const daysLeftInCurrentMonth = daysInMonth - commencementDay\n // Pro-rata days includes both the remainder of the current month and the strikeDay in the next month\n proRataDays = daysLeftInCurrentMonth + strikeDay\n }\n\n // Get the total number of days in the month (for pro-rata calculation)\n const daysInSelectedMonth = startOfMonth.daysInMonth()\n\n // Calculate sasria total sasria amount\n const sasriaAmount = defaultSasria * numberOfVehiclesInBasket\n\n // Calculate the pro-rata amount\n const proRataWithoutSasria = ((basketComprehensiveTotal - sasriaAmount) / daysInSelectedMonth) * proRataDays\n const sasriaProRata = (sasriaAmount / daysInSelectedMonth) * proRataDays\n const proRata = proRataWithoutSasria + sasriaProRata\n return proRata.toFixed(2)\n }\n\n\n static shouldUpdateUserDetails = (userDetails) => {\n // If not external lead source\n if (!userDetails || !userDetails.external_lead_source) {\n return false\n }\n\n const regex = new RegExp('noemail|^[\\+27]|' + userDetails.contact_number, 'i')\n const { first_name, last_name, email } = userDetails\n\n // Check for missing first name, last name, or email\n if (regex.test(email) || first_name === 'Nofirstname' || last_name === 'Nolastname') {\n return true\n }\n\n return false\n }\n\n static RenderClauses = (vehicleStatus, vehicleTracking, clauses) => {\n\n let RenderClause = []\n\n length = clauses.length\n\n const FindClauseIndex = (clauses, subText) => {\n return clauses.findIndex(str => str.includes(subText))\n }\n\n const preInspectionClauseSubtext = 'You must complete your vehicle\\'s pre-inspection on the Pineapple app for your cover to commence.'\n const preInspectionClauseIndex = FindClauseIndex(clauses, preInspectionClauseSubtext)\n\n const noTrackingDeviceClauseSubText = 'As there is currently no tracking device installed in your vehicle'\n const noTrackingDeviceClauseIndex = FindClauseIndex(clauses, noTrackingDeviceClauseSubText)\n\n const presentTrackingDeviceClauseSubText = 'You confirmed that the vehicle is fitted with a tracking device that meets our approval and policy requirement'\n const presentTrackingDeviceClauseIndex = FindClauseIndex(clauses, presentTrackingDeviceClauseSubText)\n\n const stolenVehicleRecoveryClauseSubText = \"It is a policy requirement for you to have a tracking device with Stolen Vehicle Recovery\"\n const stolenVehicleRecoveryClauseIndex = FindClauseIndex(clauses, stolenVehicleRecoveryClauseSubText)\n\n // Handle preInspectionClause\n if (vehicleStatus === 'Used' || vehicleStatus === 'SecondHand') {\n if (preInspectionClauseIndex !== -1) {\n RenderClause.push(clauses[preInspectionClauseIndex])\n }\n }\n\n // Handle noTrackingDeviceClause\n if (vehicleTracking == 'N' && noTrackingDeviceClauseIndex !== -1) {\n RenderClause.push(clauses[noTrackingDeviceClauseIndex])\n } else if (presentTrackingDeviceClauseIndex !== -1) {\n RenderClause.push(clauses[presentTrackingDeviceClauseIndex])\n }\n\n // Handle stolenVehicleRecoveryClause\n if (\n stolenVehicleRecoveryClauseIndex !== -1 &&\n !RenderClause.includes(clauses[stolenVehicleRecoveryClauseIndex])\n ) {\n RenderClause.push(clauses[stolenVehicleRecoveryClauseIndex]);\n }\n\n return RenderClause;\n }\n\n static extractUserSubset = (user) => {\n const keys = [\n '_id',\n 'first_name',\n 'last_name',\n 'email',\n 'contact_number',\n 'users_invite_code',\n 'sms_sent_today',\n 'contact_number_verified',\n 'intercom_contact_id',\n 'motor_policy_number',\n 'motor_quote_number',\n 'location',\n ]\n\n return keys.reduce((acc, key) => {\n if (user[key] !== undefined) {\n acc[key] = user[key]\n }\n return acc\n }, {})\n\n }\n\n // Mask email when displaying to user\n // example@mail.com => e*****e@mail.com\n static maskEmail = (email) => {\n if (typeof email !== 'string') {\n return email\n }\n\n // Split the email into the local part and the domain\n const [localPart, domain] = email.split('@')\n\n if (!localPart || !domain) {\n return email\n }\n\n let maskedLocal\n const maxMaskLength = 10\n\n let maskLength = localPart.length - 2\n\n if (localPart.length - 2 > maxMaskLength) {\n maskLength = maxMaskLength\n }\n // Mask all characters in the local part except the first and last\n if (localPart.length <= 3) {\n maskedLocal = localPart[0] + '*'.repeat(localPart.length - 1)\n }\n else {\n maskedLocal = localPart[0] + '*'.repeat(maskLength) + localPart[localPart.length - 1]\n }\n\n return `${maskedLocal}@${domain}`\n\n }\n}\n\n\n"],"sourceRoot":""}