{"version":3,"sources":["webpack:///./apps/user-menu/getLogonProfile.js","webpack:///./hooks/useBoop.js","webpack:///./apps/user-menu/useGlobalUserData.js","webpack:///./apps/user-menu/UserMenu.js","webpack:///./apps/user-menu/index.js","webpack:///./helpers/isMobileApp.js","webpack:///./apps/change-trip/services/automatedActionsProcessor.js","webpack:///./appService/eventSystem/AmtravEvent.js","webpack:///./appService/eventSystem/EventDispatcher.js","webpack:///./appService/BaseStore.js","webpack:///./appService/indexedDb/indexedDbPersister.js","webpack:///./appService/indexedDb/IndexedDbStore.js","webpack:///./appService/inMemory/InMemoryPersister.js","webpack:///./appService/inMemory/InMemoryStore.js","webpack:///./appService/localStorage/LocalSessionPersister.js","webpack:///./appService/localStorage/LocalSessionStore.js","webpack:///./appService/GlobalAppService.js","webpack:///./appService/configs.js","webpack:///./appService/appService.js","webpack:///./apps/user-menu/MenuPopover.js","webpack:///./appService/hooks/useGlobalAppService.jsx"],"names":["intervalId","resolveLogonProfile","rejectLogonProfile","payload","window","eventListener","document","data","error","useBoop","x","y","rotation","scale","timing","springConfig","tension","friction","React","useState","isBooped","setIsBooped","style","useSpring","transform","config","useEffect","timeoutId","setTimeout","clearTimeout","useCallback","useGlobalUserData","getLogonProfile","globalData","setGlobalData","useGlobalAppService","globalAppServiceReady","globalAppService","a","services","logonProfile","fetch","logonProfileData","refresh","events","on","off","asyncSubAndGetData","UserMenuTarget","styled","Flex","AvatarLink","UserName","Box","getThemeProp","CaretContainer","CompanyName","GreyPalette","ImportantLink","UserMenu","themeName","trigger","userData","viewSettings","navMyProfile","alignItems","MediumAndLess","href","size","bordered","imgUrl","profileImageUrl","initials","Large","placement","withPadding","content","MenuPopover","showProfileLink","navPolicyDoc","userRole","onMouseEnter","flexDirection","pr","firstName","lastName","pt","companyName","span","pl","propTypes","PropTypes","string","isRequired","func","process","theme","querySelector","dataset","ReactDOM","render","Promise","resolve","reject","setInterval","clearInterval","getElementById","classList","contains","COMPONENT_TYPE","F","H","C","processAutomatedActions","automatedActions","map","ac","componentType","c","isCancel","cancel","driverName","componentDescriptions","currentCar","displayName","newSegmentData","change","car","newSegment","isPersonal","Boolean","shopRequest","requestedChanges","request","carTypeCode","carType","carTypeLabel","dropOffDate","parseDate","dropOff","dropOffLocationName","pickUpDate","pickUp","pickUpLocationName","vendorName","vendorCode","termsAndConditions","pricing","current","creditCard","undefined","fop","cardType","cardNumber","cardNum","cardHolderName","cardholder","creditCardDisplayAs","displayAs","fopType","priceAmount","priceLabel","hidePricing","componentId","exchangeId","oneStep","agreedToTerms","travelers","changeOption","CHANGE_OPTION","modify","changeRules","cancelRules","termsMessage","outOfPolicy","outOfPolicyDetails","needsApproval","footnoteMessage","processCarChange","guestName","currentHotel","hotel","checkInDate","checkIn","checkOutDate","checkOut","locId","arrives","departs","hotelName","roomType","roomDescription","thumbnail","thumbNail","hotelAddress","rules","propId","processHotelChange","travelersArr","newFlightsData","flight","newFlights","newFlightPrice","expectedAddCollectGross","newFlightCredit","residualCredit","requests","rc","i","departDate","departTimeLabel","fromCode","fromName","toCode","toName","cabinLabel","cabinTypeLabel","cabin","label","existingFlightToKeep","uniqueId","fromLocId","toLocId","hasCurrentFlights","length","currentFlights","des","currentFlight","arriveDate","airlineCode","airlineName","flightNumber","routeAirlineFlightNumbers","numStops","segments","cabinText","nf","forEach","t","push","name","nameNum","processFlightChange","console","warn","getAndProcessAutomatedActions","changeId","getChangeTripActions","result","Error","rest","AmtravEvent","eventName","this","callbacks","callback","index","indexOf","splice","slice","EventDispatcher","event","fire","registerCallback","unregisterCallback","BaseStore","version","debug","onOrOff","showAtsDebugMessage","args","log","key","expiresAt","substring","indexedDbPersister","IndexedDbStore","db","mode","tx","transaction","onerror","err","onblocked","makeTransaction","onabort","target","debugMsg","objectStore","add","put","get","onsuccess","set","update","txStore","range","IDBKeyRange","bound","clear","IndexedDbPersister","stores","storeConfigs","Object","values","s","setDebug","indexedDB","deleteDatabase","close","that","dbOpen","open","addEventListener","info","objectStoreNames","deleteObjectStore","createObjectStore","keyPath","connectToDb","storeConfig","store","getIndexedDbPersister","storeIdentifiers","initDataStore","inMemoryPersister","InMemoryStore","Map","keys","InMemoryPersister","getInMemoryPersister","localSessionPersister","LocalSessionStore","type","prefix","localStorage","sessionStorage","reDateDetect","prefixGenerator","jsonString","JSON","parse","_","value","exec","Date","setItem","keyGenerator","stringify","resolvedKey","rawData","getItem","parsedData","parseWithDate","removeItem","resolvedSubstring","k","LocalSessionPersister","getLocalSessionPersister","GlobalAppService","settingsStoreConfig","eventDispatcher","serviceSettings","showDebugMessages","webServiceCalls","inMemStorage","cachePersister","kill","getServices","shouldDisplay","newSettings","ttl","now","upsert","funcKey","has","serviceConfig","serviceFunc","params","makeKeyFromParams","callPromise","originalPromise","dispatch","loading","promiseWrapper","success","clearWebServicePromise","failure","wrappedPromise","serviceCall","cacheStore","storageKey","existingResult","foundInCache","isExpired","debugMessage","fetchObject","batchedCallHandler","keyFromParams","invalidateKey","invalidateMemoryStore","fetchAndReplace","clearServiceData","deleteStartsWith","serviceCallHandler","bindCallToStorage","makeFetchObject","serviceConfigs","allStoreConfigs","persisterBuilder","determinePersister","then","res","entries","sc","resolvedConfig","generateEventNames","clearOnRefresh","reduce","acc","service","generateService","pageDidReload","filter","performance","getEntriesByType","navigation","TYPE_RELOAD","totalFail","storage","e","DOMException","code","localStorageAvailable","changeTrip","user","changeTripAutomatedActions","patchChangeTripActions","accountData","fetchAccountData","includes","location","$ats","appServiceInitPromise","logServiceRequested","shutUpEslint","groupCollapsed","trace","groupEnd","globalService","init","appService","globalAppServiceInit","USER_ROLE","showLogout","isMobileApp","LinkOption","hideBorder","media","ImportantOption","py","onClick","p","justifyContent","kind","bool","isReady","hookState","setHookState"],"mappings":"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","file":"user-menu.bundle.js","sourcesContent":["let resolveLogonProfile = false;\r\nlet rejectLogonProfile = false;\r\nlet payload = null;\r\nlet intervalId;\r\n\r\nwindow.eventListener(document, 'ATS_LOGON_PROFILE_SUCCESS', (data) => {\r\n payload = data;\r\n resolveLogonProfile = true;\r\n});\r\n\r\nwindow.eventListener(document, 'ATS_LOGON_PROFILE_FAILED', (error) => {\r\n payload = error;\r\n rejectLogonProfile = true;\r\n});\r\n\r\nexport default () => {\r\n return new Promise((resolve, reject) => {\r\n intervalId = setInterval(() => {\r\n if (resolveLogonProfile) {\r\n clearInterval(intervalId);\r\n resolve(payload);\r\n }\r\n\r\n if (rejectLogonProfile) {\r\n clearInterval(intervalId);\r\n reject(payload);\r\n }\r\n }, 100);\r\n });\r\n};\r\n","// https://www.joshwcomeau.com/snippets/react-hooks/use-boop/\r\n\r\nimport React from 'react';\r\nimport { useSpring } from 'react-spring';\r\n\r\nfunction useBoop({\r\n x = 0,\r\n y = 0,\r\n rotation = 0,\r\n scale = 1,\r\n timing = 150,\r\n springConfig = {\r\n tension: 300,\r\n friction: 10,\r\n },\r\n}) {\r\n const [isBooped, setIsBooped] = React.useState(false);\r\n const style = useSpring({\r\n transform: isBooped\r\n ? `translate(${x}px, ${y}px)\r\n rotate(${rotation}deg)\r\n scale(${scale})`\r\n : `translate(0px, 0px)\r\n rotate(0deg)\r\n scale(1)`,\r\n config: springConfig,\r\n });\r\n React.useEffect(() => {\r\n if (!isBooped) {\r\n return () => {};\r\n }\r\n const timeoutId = window.setTimeout(() => {\r\n setIsBooped(false);\r\n }, timing);\r\n return () => {\r\n window.clearTimeout(timeoutId);\r\n };\r\n }, [isBooped]);\r\n const trigger = React.useCallback(() => {\r\n setIsBooped(true);\r\n }, []);\r\n return [style, trigger];\r\n}\r\nexport default useBoop;\r\n","import { useState, useEffect } from 'react';\r\nimport useGlobalAppService from '../../appService/hooks/useGlobalAppService';\r\n\r\nconst useGlobalUserData = (getLogonProfile) => {\r\n const [globalData, setGlobalData] = useState(null);\r\n const [globalAppServiceReady, globalAppService] = useGlobalAppService();\r\n\r\n useEffect(() => {\r\n const asyncSubAndGetData = async () => {\r\n if (globalAppServiceReady) {\r\n let logonProfileData = await globalAppService.services.logonProfile.fetch();\r\n setGlobalData(logonProfileData);\r\n\r\n const { refresh } = globalAppService.services.logonProfile.events;\r\n\r\n globalAppService.services.logonProfile.on(refresh, async () => {\r\n logonProfileData = await globalAppService.services.logonProfile.fetch();\r\n setGlobalData(logonProfileData);\r\n });\r\n return globalAppService.services.logonProfile.off(refresh);\r\n }\r\n return null;\r\n };\r\n\r\n asyncSubAndGetData();\r\n }, [globalAppServiceReady, getLogonProfile]);\r\n\r\n return [globalAppServiceReady, globalData];\r\n};\r\n\r\nexport default useGlobalUserData;\r\n","import React from 'react';\r\nimport { ThemeSystemProvider } from '@amtrav/theme-system';\r\nimport { DynamicThemeProvider, getThemeProp, MatchMedia, GreyPalette } from '@amtrav/themes';\r\nimport { animated } from 'react-spring';\r\nimport { Popover, Avatar } from '@amtrav/view-components';\r\nimport { IconCaretDown } from '@amtrav/icons';\r\nimport { Flex, Box } from '@rebass/grid';\r\nimport { hot } from 'react-hot-loader/root';\r\nimport PropTypes from 'prop-types';\r\nimport styled from 'styled-components';\r\nimport MenuPopover from './MenuPopover';\r\nimport useBoop from '../../hooks/useBoop';\r\nimport useGlobalUserData from './useGlobalUserData';\r\n\r\nconst UserMenuTarget = styled(Flex)`\r\n display: inline-flex;\r\n &:hover {\r\n cursor: pointer;\r\n }\r\n`;\r\n\r\nconst AvatarLink = styled.a`\r\n text-decoration: none;\r\n`;\r\n\r\nconst UserName = styled(Box)`\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: ${getThemeProp('global.link--color')};\r\n`;\r\n\r\nconst CaretContainer = styled(Box)`\r\n color: ${getThemeProp('global.link--color')};\r\n`;\r\n\r\nconst CompanyName = styled(Box)`\r\n font-size: 12px;\r\n font-weight: 700;\r\n color: ${GreyPalette['600']};\r\n`;\r\n\r\nconst ImportantLink = styled.a`\r\n color: ${getThemeProp('global.danger--color')};\r\n font-weight: 600;\r\n font-size: 16px;\r\n\r\n &:active,\r\n &:hover {\r\n color: ${getThemeProp('global.danger--color')};\r\n }\r\n`;\r\n\r\nconst UserMenu = ({ themeName, getLogonProfile }) => {\r\n const [style, trigger] = useBoop({ y: 2 });\r\n const [globalAppDataReady, userData] = useGlobalUserData(getLogonProfile);\r\n\r\n if (userData?.viewSettings && !userData?.viewSettings?.navMyProfile) {\r\n return (\r\n \r\n \r\n Logout\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }>\r\n \r\n \r\n \r\n {userData?.firstName} {userData?.lastName}\r\n \r\n {userData?.companyName}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nUserMenu.propTypes = {\r\n themeName: PropTypes.string.isRequired,\r\n getLogonProfile: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default process.env.USE_HMR ? hot(UserMenu) : UserMenu;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport getLogonProfile from './getLogonProfile';\r\nimport UserMenu from './UserMenu';\r\n\r\nconst { theme } = document.querySelector('body').dataset;\r\n\r\nReactDOM.render(\r\n ,\r\n document.getElementById('userMenuApp'),\r\n);\r\n","export default () => document.querySelector('body').classList.contains('is-our-app');\r\n","import { parseDate } from '@amtrav/dates';\r\nimport { CHANGE_OPTION } from '@amtrav/change-trip';\r\nimport { getChangeTripActions } from '@amtrav/webservice';\r\n\r\nexport const COMPONENT_TYPE = {\r\n F: 'Flight',\r\n H: 'Hotel',\r\n C: 'Car',\r\n};\r\n\r\nconst processCarChange = (c) => {\r\n const isCancel = c.cancel !== null;\r\n const driverName = c.componentDescriptions[0]?.currentCar?.displayName;\r\n const newSegmentData = c?.change?.car?.newSegment;\r\n const isPersonal = Boolean(c?.change?.car?.shopRequest?.isPersonal);\r\n const shopRequest = isCancel ? null : { ...c.change.car.shopRequest, isPersonal };\r\n\r\n let requestedChanges = null;\r\n if (!isCancel) {\r\n const { request } = c.change.car;\r\n requestedChanges = {\r\n carTypeCode: request.carType,\r\n carTypeLabel: request.carTypeLabel,\r\n driverName,\r\n dropOffDate: parseDate(request.dropOff),\r\n dropOffLocationName: request.dropOffLocationName,\r\n pickUpDate: parseDate(request.pickUp),\r\n pickUpLocationName: request.pickUpLocationName,\r\n vendorName: request.vendorName,\r\n vendorCode: request.vendorCode,\r\n termsAndConditions: null,\r\n pricing: null,\r\n };\r\n }\r\n const { currentCar } = c.componentDescriptions[0];\r\n const current = currentCar\r\n ? {\r\n carTypeCode: currentCar.carTypeCode,\r\n carTypeLabel: currentCar.carType,\r\n driverName,\r\n dropOffDate: parseDate(currentCar.dropOff),\r\n dropOffLocationName: currentCar.dropOffLocationName,\r\n pickUpDate: parseDate(currentCar.pickUp),\r\n pickUpLocationName: currentCar.pickUpLocationName,\r\n vendorName: currentCar.vendorName,\r\n vendorCode: currentCar.vendorCode,\r\n termsAndConditions: currentCar.termsAndConditions,\r\n pricing: currentCar.pricing,\r\n }\r\n : {};\r\n const newSegment =\r\n isCancel || !newSegmentData\r\n ? null\r\n : {\r\n carTypeCode: newSegmentData.carTypeCode,\r\n carTypeLabel: newSegmentData.carType,\r\n driverName,\r\n dropOffDate: parseDate(newSegmentData.dropOff),\r\n dropOffLocationName: newSegmentData.dropOffLocationName || newSegmentData.pickUpLocationName,\r\n pickUpDate: parseDate(newSegmentData.pickUp),\r\n pickUpLocationName: newSegmentData.pickUpLocationName,\r\n vendorName: newSegmentData.vendorName,\r\n vendorCode: newSegmentData.vendorCode,\r\n termsAndConditions: newSegmentData.termsAndConditions || null,\r\n pricing: newSegmentData.pricing,\r\n creditCard:\r\n newSegmentData.fop !== undefined && newSegmentData.fop?.creditCard\r\n ? {\r\n cardType: newSegmentData.fop?.creditCard?.cardType,\r\n cardNumber: newSegmentData.fop?.creditCard?.cardNum,\r\n cardHolderName: newSegmentData.fop?.creditCard?.cardholder,\r\n creditCardDisplayAs: newSegmentData.fop?.creditCard?.displayAs,\r\n fopType: newSegmentData.fop?.fopType,\r\n priceAmount: c.priceAmount,\r\n priceLabel: c.priceLabel,\r\n hidePricing: c.hidePricing,\r\n }\r\n : null,\r\n\r\n // use this to test CreditCardDisplay since we rarely\r\n // get that data from the back-end for car changes\r\n // {\r\n // cardType: '',\r\n // cardNumber: '4xxxxxxxxxxx1111',\r\n // cardHolderName: 'Irwin Fletcher',\r\n // creditCardDisplayAs: 'Visa *1111 (Irwin Fletcher)',\r\n // fopType: 'C',\r\n // priceAmount: '$225.18',\r\n // priceLabel: 'TBD',\r\n // hidePricing: true,\r\n // },\r\n };\r\n return {\r\n componentId: c.componentId,\r\n exchangeId: c.exchangeId,\r\n oneStep: Boolean(c?.change?.oneStep),\r\n isCancel,\r\n isPersonal,\r\n cancel: c.cancel,\r\n agreedToTerms: Boolean(c.agreedToTerms),\r\n componentType: COMPONENT_TYPE[c.componentType],\r\n travelers: [{ displayName: driverName }],\r\n changeOption: c.cancel === null ? CHANGE_OPTION.modify : CHANGE_OPTION.cancel,\r\n current,\r\n requestedChanges,\r\n newSegment,\r\n shopRequest,\r\n changeRules: null,\r\n cancelRules: null,\r\n termsMessage: c.termsMessage,\r\n outOfPolicy: c.outOfPolicy,\r\n outOfPolicyDetails: c.outOfPolicyDetails,\r\n needsApproval: c.needsApproval,\r\n footnoteMessage: c.footnoteMessage,\r\n hidePricing: c.hidePricing,\r\n };\r\n};\r\n\r\nconst processHotelChange = (c) => {\r\n const isCancel = c.cancel !== null;\r\n const guestName = c.componentDescriptions[0]?.currentHotel?.displayName;\r\n const newSegmentData = c?.change?.hotel?.newSegment;\r\n const isPersonal = Boolean(c?.change?.hotel?.shopRequest?.isPersonal);\r\n const shopRequest = isCancel ? null : { ...c.change.hotel.shopRequest, isPersonal };\r\n let requestedChanges = null;\r\n if (!isCancel) {\r\n const { request } = c.change.hotel;\r\n requestedChanges = {\r\n checkInDate: parseDate(request.checkIn),\r\n checkOutDate: parseDate(request.checkOut),\r\n guestName,\r\n locId: request.locId,\r\n termsAndConditions: null,\r\n pricing: null,\r\n };\r\n }\r\n const { currentHotel } = c.componentDescriptions[0];\r\n const current = currentHotel\r\n ? {\r\n checkInDate: parseDate(currentHotel.arrives),\r\n checkOutDate: parseDate(currentHotel.departs),\r\n hotelName: currentHotel.hotelName,\r\n guestName,\r\n roomType: currentHotel.roomDescription,\r\n thumbnail: currentHotel.thumbNail,\r\n hotelAddress: currentHotel.hotelAddress,\r\n termsAndConditions: currentHotel.rules?.termsAndConditions || null,\r\n pricing: currentHotel.pricing,\r\n propId: currentHotel.propId,\r\n }\r\n : {};\r\n const newSegment =\r\n isCancel || !newSegmentData\r\n ? null\r\n : {\r\n checkInDate: parseDate(newSegmentData.arrives),\r\n checkOutDate: parseDate(newSegmentData.departs),\r\n hotelName: newSegmentData.hotelName,\r\n guestName,\r\n roomType: newSegmentData.roomDescription,\r\n thumbnail: newSegmentData.thumbNail,\r\n hotelAddress: newSegmentData.hotelAddress,\r\n termsAndConditions: newSegmentData.rules?.termsAndConditions || null,\r\n pricing: newSegmentData.pricing,\r\n creditCard:\r\n newSegmentData.fop !== undefined && newSegmentData.fop?.creditCard\r\n ? {\r\n cardType: newSegmentData.fop?.creditCard?.cardType,\r\n cardNumber: newSegmentData.fop?.creditCard?.cardNum,\r\n cardHolderName: newSegmentData.fop?.creditCard?.cardholder,\r\n creditCardDisplayAs: newSegmentData.fop?.creditCard?.displayAs,\r\n fopType: newSegmentData.fop?.fopType,\r\n priceAmount: c.priceAmount,\r\n priceLabel: c.priceLabel,\r\n hidePricing: c.hidePricing,\r\n }\r\n : null,\r\n };\r\n return {\r\n componentId: c.componentId,\r\n exchangeId: c.exchangeId,\r\n isCancel,\r\n isPersonal,\r\n oneStep: Boolean(c?.change?.oneStep),\r\n cancel: c.cancel,\r\n agreedToTerms: Boolean(c.agreedToTerms),\r\n componentType: COMPONENT_TYPE[c.componentType],\r\n travelers: [{ displayName: guestName }],\r\n changeOption: c.cancel === null ? CHANGE_OPTION.modify : CHANGE_OPTION.cancel,\r\n current,\r\n requestedChanges,\r\n newSegment,\r\n shopRequest,\r\n changeRules: null,\r\n cancelRules: null,\r\n termsMessage: c.termsMessage,\r\n outOfPolicy: c.outOfPolicy,\r\n outOfPolicyDetails: c.outOfPolicyDetails,\r\n needsApproval: c.needsApproval,\r\n footnoteMessage: c.footnoteMessage,\r\n hidePricing: c.hidePricing,\r\n };\r\n};\r\n\r\nconst processFlightChange = (c) => {\r\n const isCancel = c.cancel !== null;\r\n const travelersArr = [];\r\n const newFlightsData = c?.change?.flight?.newFlights;\r\n const newFlightPrice = c?.change?.flight?.expectedAddCollectGross;\r\n const newFlightCredit = c?.change?.flight?.residualCredit;\r\n const isPersonal = Boolean(c?.change?.flight?.shopRequest?.isPersonal);\r\n const shopRequest = isCancel ? null : { ...c.change.flight.shopRequest, isPersonal };\r\n let requestedChanges = null;\r\n if (!isCancel) {\r\n requestedChanges = c.change.flight.requests.map((rc, i) => ({\r\n departDate: parseDate(rc.departDate),\r\n departTimeLabel: rc.departTimeLabel,\r\n fromCode: rc.fromCode,\r\n fromName: rc.fromName,\r\n toCode: rc.toCode,\r\n toName: rc.toName,\r\n cabinLabel: rc.cabinTypeLabel,\r\n cabin: { label: rc.cabinTypeLabel },\r\n existingFlightToKeep: rc.existingFlightToKeep,\r\n uniqueId: `${i}-${rc.departDate}-${rc.fromLocId}-${rc.toLocId}`,\r\n }));\r\n }\r\n const hasCurrentFlights = c.componentDescriptions.length > 0;\r\n let currentFlights = null;\r\n if (hasCurrentFlights) {\r\n currentFlights = c.componentDescriptions.map((des) => ({\r\n departDate: parseDate(des.currentFlight.departs),\r\n arriveDate: parseDate(des.currentFlight.arrives),\r\n airlineCode: des.currentFlight.airlineCode,\r\n airlineName: des.currentFlight.airlineName,\r\n fromCode: des.currentFlight.fromCode,\r\n fromName: des.currentFlight.fromName,\r\n toCode: des.currentFlight.toCode,\r\n toName: des.currentFlight.toName,\r\n flightNumber: des.routeAirlineFlightNumbers,\r\n numStops: des.numStops,\r\n cabin: { label: des.currentFlight.segments[0].cabinText },\r\n componentId: des.currentFlight.componentId,\r\n termsAndConditions: null,\r\n }));\r\n }\r\n let newFlights = null;\r\n if (!isCancel && newFlightsData) {\r\n newFlights = newFlightsData.map((nf) => ({\r\n departDate: parseDate(nf.departs),\r\n arriveDate: parseDate(nf.arrives),\r\n airlineCode: nf.airlineCode,\r\n airlineName: nf.airlineName,\r\n fromCode: nf.fromCode,\r\n fromName: nf.fromName,\r\n toCode: nf.toCode,\r\n toName: nf.toName,\r\n flightNumber: nf.routeAirlineFlightNumbers,\r\n numStops: nf.numStops,\r\n cabin: { label: nf.segments[0].cabinText },\r\n componentId: nf.componentId,\r\n termsAndConditions: null,\r\n }));\r\n }\r\n if (hasCurrentFlights) {\r\n c.componentDescriptions[0].currentFlight.travelers.forEach((t) => {\r\n travelersArr.push({\r\n displayName: t.name,\r\n nameNum: t.nameNum,\r\n });\r\n });\r\n }\r\n return {\r\n componentId: c.componentId,\r\n exchangeId: c.exchangeId,\r\n isCancel,\r\n isPersonal,\r\n oneStep: Boolean(c?.change?.oneStep),\r\n cancel: c.cancel,\r\n agreedToTerms: Boolean(c.agreedToTerms),\r\n componentType: COMPONENT_TYPE[c.componentType],\r\n travelers: travelersArr,\r\n changeOption: c.cancel === null ? CHANGE_OPTION.modify : CHANGE_OPTION.cancel,\r\n currentFlights,\r\n requestedChanges,\r\n newFlights,\r\n newFlightPrice,\r\n newFlightCredit,\r\n shopRequest,\r\n changeRules: null,\r\n cancelRules: null,\r\n creditCard:\r\n newFlightsData && c?.change?.flight.fop !== undefined && c?.change?.flight.fop?.creditCard\r\n ? {\r\n cardType: c?.change?.flight.fop?.creditCard?.cardType,\r\n cardNumber: c?.change?.flight.fop?.creditCard?.cardNum,\r\n cardHolderName: c?.change?.flight.fop?.creditCard?.cardholder,\r\n creditCardDisplayAs: c?.change?.flight.fop?.creditCard?.displayAs,\r\n fopType: c?.change?.flight.fop?.fopType,\r\n priceAmount: c.priceAmount,\r\n priceLabel: c.priceLabel,\r\n hidePricing: false,\r\n }\r\n : null,\r\n termsMessage: c.termsMessage,\r\n outOfPolicy: c.outOfPolicy,\r\n outOfPolicyDetails: c.outOfPolicyDetails,\r\n needsApproval: c.needsApproval,\r\n footnoteMessage: c.footnoteMessage,\r\n hidePricing: false,\r\n };\r\n};\r\n\r\nexport const processAutomatedActions = (automatedActions) => {\r\n const actions = automatedActions.map((ac) => {\r\n switch (ac.componentType) {\r\n case 'C':\r\n return processCarChange(ac);\r\n case 'H':\r\n return processHotelChange(ac);\r\n case 'F':\r\n return processFlightChange(ac);\r\n default:\r\n console.warn(`Unknown component type: ${ac.componentType}`);\r\n return {};\r\n }\r\n });\r\n return actions;\r\n};\r\n\r\nexport const getAndProcessAutomatedActions = async (changeId) => {\r\n const result = await getChangeTripActions(changeId);\r\n if (result === null) {\r\n throw new Error('Invalid ChangeTrip Id');\r\n }\r\n const { automatedActions, ...rest } = result;\r\n return { automatedActions: processAutomatedActions(automatedActions), ...rest };\r\n};\r\n","export class AmtravEvent {\r\n constructor(eventName) {\r\n this.eventName = eventName;\r\n this.callbacks = [];\r\n }\r\n\r\n registerCallback(callback) {\r\n this.callbacks.push(callback);\r\n }\r\n\r\n unregisterCallback(callback) {\r\n const index = this.callbacks.indexOf(callback);\r\n if (index > -1) {\r\n this.callbacks.splice(index, 1);\r\n }\r\n }\r\n\r\n fire(data) {\r\n const callbacks = this.callbacks.slice(0);\r\n callbacks.forEach((callback) => {\r\n callback(data);\r\n });\r\n }\r\n}\r\n","import { AmtravEvent } from './AmtravEvent';\r\n\r\nexport class EventDispatcher {\r\n constructor() {\r\n this.events = {};\r\n }\r\n\r\n dispatch(eventName, data) {\r\n const event = this.events[eventName];\r\n if (event) {\r\n event.fire(data);\r\n }\r\n }\r\n\r\n on(eventName, callback) {\r\n // console.log('🙊 ON', eventName);\r\n let event = this.events[eventName];\r\n if (!event) {\r\n event = new AmtravEvent(eventName);\r\n this.events[eventName] = event;\r\n }\r\n event.registerCallback(callback);\r\n }\r\n\r\n off(eventName, callback) {\r\n // console.log('🙉 OFF', eventName);\r\n const event = this.events[eventName];\r\n if (event && event.callbacks.indexOf(callback) > -1) {\r\n event.unregisterCallback(callback);\r\n if (event.callbacks.length === 0) {\r\n delete this.events[eventName];\r\n }\r\n }\r\n }\r\n}\r\n","/* eslint-disable class-methods-use-this */\r\n\r\n/**\r\n * All Stores should extend this class but this class should never be\r\n * instantiated directly.\r\n */\r\nclass BaseStore {\r\n constructor(name, version) {\r\n this.debug = false;\r\n this.name = name;\r\n this.version = version;\r\n }\r\n\r\n setDebug(onOrOff) {\r\n this.debug = Boolean(onOrOff);\r\n }\r\n\r\n debugMsg(...args) {\r\n if (this.debug || window.showAtsDebugMessage === true) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[${this.name}]`, ...args);\r\n }\r\n }\r\n\r\n set(key, data, expiresAt) {\r\n console.warn('`set` not implemented.', key, data, expiresAt);\r\n }\r\n\r\n update(key, data, expiresAt) {\r\n console.warn('`update` not implemented.', key, data, expiresAt);\r\n }\r\n\r\n get(key) {\r\n return new Promise(() => {\r\n console.warn('`get` not implemented.', key);\r\n });\r\n }\r\n\r\n async upsert(key, data, expiresAt) {\r\n console.warn('`upsert` not implemented.', key, data, expiresAt);\r\n }\r\n\r\n delete(key) {\r\n return new Promise(() => {\r\n console.warn('`delete` not implemented.', key);\r\n });\r\n }\r\n\r\n deleteStartsWith(substring) {\r\n return new Promise(() => {\r\n console.warn('`delete` not implemented.', substring);\r\n });\r\n }\r\n\r\n // Delete all entries with the prefix\r\n clear() {\r\n console.warn('`clear` not implemented.');\r\n }\r\n}\r\n\r\nexport default BaseStore;\r\n","import IndexedDbStore from './IndexedDbStore';\r\n\r\nexport class IndexedDbPersister {\r\n constructor(name) {\r\n this.stores = {};\r\n this.storeConfigs = undefined;\r\n this.debug = false;\r\n this.name = name || 'indexedDbPersister';\r\n this.version = 1;\r\n this.db = null;\r\n }\r\n\r\n setDebug(onOrOff) {\r\n this.debug = Boolean(onOrOff);\r\n Object.values(this.stores).forEach((s) => s.setDebug(onOrOff));\r\n }\r\n\r\n debugMsg(...args) {\r\n if (this.debug || window.showAtsDebugMessage === true) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[${this.name}_${this.version}]`, ...args);\r\n }\r\n }\r\n\r\n /**\r\n * This will delete the indexedDB completely. Only use this for logout.\r\n */\r\n kill() {\r\n window.indexedDB.deleteDatabase(this.db.name);\r\n this.stores = {};\r\n }\r\n\r\n closeDb() {\r\n this.db.close();\r\n }\r\n\r\n connectToDb() {\r\n return new Promise((resolve, reject) => {\r\n const that = this; // Need to preserve the scope of `this`.\r\n const dbOpen = window.indexedDB.open(this.name, this.version);\r\n dbOpen.addEventListener('blocked', () => {\r\n console.warn('Cannot open indexedDB, it blocked by another process. Check if other tabs are open');\r\n });\r\n // event handlers\r\n dbOpen.addEventListener('error', (err) => {\r\n console.warn('TODO: add graceful degradation for error fallback.');\r\n console.error(err);\r\n reject(err);\r\n });\r\n\r\n dbOpen.addEventListener('success', (event) => {\r\n console.info('Successfully opened indexedDB');\r\n that.db = event.target.result;\r\n resolve(that.db);\r\n });\r\n\r\n dbOpen.addEventListener('upgradeneeded', (event) => {\r\n that.db = event.target.result;\r\n Object.values(that.storeConfigs).forEach((s) => {\r\n if (that.db.objectStoreNames.contains(s.name)) {\r\n that.db.deleteObjectStore(s.name);\r\n }\r\n that.stores[s.name] = that.db.createObjectStore(s.name, { keyPath: s.keyPath });\r\n });\r\n });\r\n });\r\n }\r\n\r\n async initDataStore(storeConfigs) {\r\n this.storeConfigs = storeConfigs;\r\n const db = await this.connectToDb();\r\n // New map is already set in constructor. Just need to cycle through storage configs\r\n Object.values(this.storeConfigs).forEach((storeConfig) => {\r\n const store = new IndexedDbStore(storeConfig.name, this.version, db);\r\n this.stores[storeConfig.name] = store;\r\n });\r\n return this;\r\n }\r\n}\r\n\r\nlet indexedDbPersister;\r\n\r\n/**\r\n * Enforces a singleton pattern that always returns a promise resolving a single\r\n * instance of an IndexedDbPersister.\r\n * @param {Object} storeIdentifiers A lookup object of store identifiers.\r\n * @returns Promise\r\n */\r\nexport const getIndexedDbPersister = async (name, storeIdentifiers = {}) => {\r\n if (indexedDbPersister !== undefined) {\r\n return indexedDbPersister;\r\n }\r\n indexedDbPersister = new IndexedDbPersister(name);\r\n\r\n return indexedDbPersister.initDataStore(storeIdentifiers);\r\n};\r\n","import BaseStore from '../BaseStore';\r\n\r\nclass IndexedDbStore extends BaseStore {\r\n constructor(name, version, db) {\r\n super(name, version);\r\n this.db = db;\r\n }\r\n\r\n makeTransaction(mode) {\r\n const tx = this.db.transaction(this.name, mode);\r\n tx.onerror = (err) => {\r\n console.warn('Failed to create a transaction', this.name, err);\r\n console.error(err);\r\n throw err;\r\n };\r\n tx.onblocked = () => console.warn('Could not write. DB was blocked.');\r\n return tx;\r\n }\r\n\r\n set(key, data, expiresAt) {\r\n try {\r\n const tx = this.makeTransaction('readwrite');\r\n tx.onabort = (event) => {\r\n const { error } = event.target; // DOMException\r\n if (error.name === 'QuotaExceededError') {\r\n this.debugMsg('🚮 QuotaExceededError encountered', event);\r\n }\r\n console.warn(\r\n 'Two processes attempted to write data at the same time and were not batched. This is not a concern if ' +\r\n 'multiple tabs/windows are open. If not this should be reported.',\r\n );\r\n throw error;\r\n };\r\n tx.onblocked = () => console.warn(`Could not write ${key}. IndexedDB was blocked.`);\r\n const txStore = tx.objectStore(this.name);\r\n txStore.add({ key, data, expiresAt });\r\n this.debugMsg('IdxDB 🖊️ added', key);\r\n } catch (err) {\r\n // No need to break the site for a cache. Just warn and fall through\r\n console.error('Failed to set a resource from indexedDB', key);\r\n }\r\n }\r\n\r\n // This is a put operation so the entire object will be replaced.\r\n update(key, data, expiresAt) {\r\n try {\r\n const tx = this.makeTransaction('readwrite');\r\n const txStore = tx.objectStore(this.name);\r\n txStore.put({ key, data, expiresAt });\r\n this.debugMsg('IdxDB 🖊️ updated', key);\r\n } catch (err) {\r\n // No need to break the site for a cache. Just warn and fall through\r\n console.error('Failed to update a resource from indexedDB', key);\r\n }\r\n }\r\n\r\n get(key) {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const tx = this.makeTransaction('readonly');\r\n tx.onerror = (err) => reject(err);\r\n const txStore = tx.objectStore(this.name);\r\n const result = txStore.get(key);\r\n result.onsuccess = (event) => {\r\n this.debugMsg('IdxDB 🔎', key, event.target.result);\r\n resolve(event.target.result);\r\n };\r\n } catch (err) {\r\n console.error('Failed to get a resource from indexedDB', key);\r\n reject(err);\r\n }\r\n });\r\n }\r\n\r\n async upsert(key, data, expiresAt) {\r\n const result = await this.get(key);\r\n if (result === undefined) {\r\n this.set(key, data, expiresAt);\r\n } else {\r\n this.update(key, data, expiresAt);\r\n }\r\n }\r\n\r\n delete(key) {\r\n return new Promise((resolve, reject) => {\r\n const tx = this.makeTransaction('readwrite');\r\n tx.onerror = (err) => {\r\n console.error('Failed to delete a resource from indexedDB', key);\r\n return reject(err);\r\n };\r\n const txStore = tx.objectStore(this.name);\r\n const result = txStore.delete(key);\r\n result.onsuccess = () => {\r\n this.debugMsg('IdxDB ❌ deleted', key);\r\n resolve();\r\n };\r\n });\r\n }\r\n\r\n deleteStartsWith(substring) {\r\n return new Promise((resolve, reject) => {\r\n const tx = this.makeTransaction('readwrite');\r\n tx.onerror = (err) => reject(err);\r\n const txStore = tx.objectStore(this.name);\r\n const range = IDBKeyRange.bound(substring, `${substring}|`, true, true);\r\n const request = txStore.delete(range);\r\n request.onsuccess = () => {\r\n this.debugMsg('IdxDB ❌ deleted all records starting with', substring);\r\n resolve();\r\n };\r\n });\r\n }\r\n\r\n clear() {\r\n const tx = this.makeTransaction('readwrite');\r\n const txStore = tx.objectStore(this.name);\r\n txStore.clear();\r\n this.debugMsg('IdxDB ❌ All data deleted.');\r\n }\r\n}\r\n\r\nexport default IndexedDbStore;\r\n","import InMemoryStore from './InMemoryStore';\r\n\r\nexport class InMemoryPersister {\r\n constructor(name) {\r\n this.stores = {};\r\n this.debug = false;\r\n this.name = name || 'inMemoryPersister';\r\n this.version = 1;\r\n }\r\n\r\n setDebug(onOrOff) {\r\n this.debug = Boolean(onOrOff);\r\n Object.values(this.stores).forEach((s) => s.setDebug(onOrOff));\r\n }\r\n\r\n debugMsg(...args) {\r\n if (this.debug || window.showAtsDebugMessage === true) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[${this.name}_${this.version}]`, ...args);\r\n }\r\n }\r\n\r\n /**\r\n * This will delete the indexedDB completely. Only use this for logout.\r\n */\r\n kill() {\r\n console.warn(`Calling \\`kill()\\` on InMemoryPersister is a noop.`, this.name);\r\n }\r\n\r\n closeDb() {\r\n console.warn(`Calling \\`closeDb()\\` on InMemoryPersister is a noop.`, this.name);\r\n }\r\n\r\n async initDataStore(storeConfigs) {\r\n Object.values(storeConfigs).forEach((storeConfig) => {\r\n const store = new InMemoryStore(storeConfig.name, this.version);\r\n this.stores[storeConfig.name] = store;\r\n });\r\n return this;\r\n }\r\n}\r\n\r\nlet inMemoryPersister;\r\n\r\n/**\r\n * Enforces a singleton pattern that always returns a promise resolving a single\r\n * instance of an inMemoryPersister.\r\n * @param {Object} storeIdentifiers A lookup object of store identifiers.\r\n * @returns Promise\r\n */\r\nexport const getInMemoryPersister = async (name, storeIdentifiers = {}) => {\r\n if (inMemoryPersister !== undefined) {\r\n return inMemoryPersister;\r\n }\r\n inMemoryPersister = new InMemoryPersister(name);\r\n\r\n return inMemoryPersister.initDataStore(storeIdentifiers);\r\n};\r\n","import BaseStore from '../BaseStore';\r\n\r\nclass InMemoryStore extends BaseStore {\r\n constructor(name, version) {\r\n super(name, version);\r\n this.store = new Map();\r\n }\r\n\r\n set(key, data, expiresAt) {\r\n this.store.set(key, { data, expiresAt });\r\n this.debugMsg('Mem 🖊️ added', key);\r\n }\r\n\r\n // This is a put operation so the entire object will be replaced.\r\n // That makes it the same as set for a JS MAP\r\n update(key, data, expiresAt) {\r\n this.set(key, data, expiresAt);\r\n this.debugMsg('Mem 🖊️ updated', key);\r\n }\r\n\r\n get(key) {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const result = this.store.get(key);\r\n this.debugMsg('Mem 🔎', key, result);\r\n resolve(result);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n }\r\n\r\n async upsert(key, data, expiresAt) {\r\n const result = await this.get(key);\r\n if (result === undefined) {\r\n this.set(key, data, expiresAt);\r\n } else {\r\n this.update(key, data, expiresAt);\r\n }\r\n }\r\n\r\n delete(key) {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const result = this.store.delete(key);\r\n this.debugMsg('Mem ❌ deleted', key);\r\n resolve(result);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n }\r\n\r\n deleteStartsWith(substring) {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n [...this.store.keys()].forEach((key) => {\r\n if (key.indexOf(substring) === 0) {\r\n this.store.delete(key);\r\n }\r\n });\r\n this.debugMsg('Mem ❌ deleted all records starting with', substring);\r\n resolve();\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n }\r\n\r\n // Delete all entries with the prefix\r\n clear() {\r\n this.store.clear();\r\n this.debugMsg('Mem ❌ All data deleted.');\r\n }\r\n}\r\n\r\nexport default InMemoryStore;\r\n","import LocalSessionStore from './LocalSessionStore';\r\n\r\nexport class LocalSessionPersister {\r\n constructor(name) {\r\n this.stores = {};\r\n this.debug = false;\r\n this.name = name || 'LocalSessionPersister';\r\n this.version = 1;\r\n }\r\n\r\n setDebug(onOrOff) {\r\n this.debug = Boolean(onOrOff);\r\n Object.values(this.stores).forEach((s) => s.setDebug(onOrOff));\r\n }\r\n\r\n debugMsg(...args) {\r\n if (this.debug || window.showAtsDebugMessage === true) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[${this.name}_${this.version}]`, ...args);\r\n }\r\n }\r\n\r\n /**\r\n * This will delete the indexedDB completely. Only use this for logout.\r\n */\r\n kill() {\r\n console.warn(`No need to call \\`kill\\` on ${this.name}. These are killed elsewhere.`);\r\n }\r\n\r\n closeDb() {\r\n console.warn(`Calling \\`closeDb()\\` on InMemoryPersister is a noop.`, this.name);\r\n }\r\n\r\n async initDataStore(storeConfigs) {\r\n Object.values(storeConfigs).forEach((storeConfig) => {\r\n const store = new LocalSessionStore(storeConfig.name, this.version, this.type);\r\n this.stores[storeConfig.name] = store;\r\n });\r\n return this;\r\n }\r\n}\r\n\r\nlet localSessionPersister;\r\n\r\n/**\r\n * Enforces a singleton pattern that always returns a promise resolving a single\r\n * instance of an LocalSessionPersister.\r\n * @param {Object} storeIdentifiers A lookup object of store identifiers.\r\n * @returns Promise\r\n */\r\nexport const getLocalSessionPersister = async (name, storeIdentifiers = {}) => {\r\n if (localSessionPersister !== undefined) {\r\n return localSessionPersister;\r\n }\r\n localSessionPersister = new LocalSessionPersister(name);\r\n\r\n return localSessionPersister.initDataStore(storeIdentifiers);\r\n};\r\n","import BaseStore from '../BaseStore';\r\n\r\n/**\r\n * A Store for local or session storage.\r\n */\r\nclass LocalSessionStore extends BaseStore {\r\n constructor(name, version, type) {\r\n super(name, version);\r\n this.prefix = 'AppService';\r\n this.store = type === 'local' ? window.localStorage : window.sessionStorage;\r\n this.reDateDetect = /(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})/;\r\n }\r\n\r\n prefixGenerator() {\r\n return `${this.prefix}_${this.version}_`;\r\n }\r\n\r\n keyGenerator(key) {\r\n return `${this.prefixGenerator()}${key}`;\r\n }\r\n\r\n parseWithDate(jsonString) {\r\n const resultObject = JSON.parse(jsonString, (_, value) => {\r\n if (typeof value === 'string' && this.reDateDetect.exec(value)) {\r\n return new Date(value);\r\n }\r\n return value;\r\n });\r\n return resultObject;\r\n }\r\n\r\n set(key, data, expiresAt) {\r\n if (data === null) {\r\n console.warn(\r\n 'Storing `null` in local/session storage is an ambiguous operation. It will become impossible' +\r\n ' when fetching the key to determine if the returned value is null or if the key is not set. ' +\r\n 'Value from the `get` call will returned as `undefined`. Consider deleting the entry all together.',\r\n );\r\n }\r\n this.store.setItem(this.keyGenerator(key), JSON.stringify({ data, expiresAt }));\r\n this.debugMsg('🖊️ added', key);\r\n }\r\n\r\n // This is a put operation so the entire object will be replaced.\r\n // That makes it the same as this.set\r\n update(key, data, expiresAt) {\r\n this.set(key, data, expiresAt);\r\n this.debugMsg('🖊️ updated', key);\r\n }\r\n\r\n get(key) {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const resolvedKey = this.keyGenerator(key);\r\n const rawData = this.store.getItem(resolvedKey);\r\n const parsedData = this.parseWithDate(rawData);\r\n this.debugMsg('🔎', resolvedKey, parsedData);\r\n resolve(parsedData === null ? undefined : parsedData);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n }\r\n\r\n async upsert(key, data, expiresAt) {\r\n const result = await this.get(key);\r\n if (result === undefined) {\r\n this.set(key, data, expiresAt);\r\n } else {\r\n this.update(key, data, expiresAt);\r\n }\r\n }\r\n\r\n delete(key) {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const resolvedKey = this.keyGenerator(key);\r\n this.store.removeItem(resolvedKey);\r\n this.debugMsg('❌ deleted', resolvedKey);\r\n resolve();\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n }\r\n\r\n deleteStartsWith(substring) {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const resolvedSubstring = this.keyGenerator(substring);\r\n Object.keys({ ...this.store }).forEach((key) => {\r\n if (key.indexOf(resolvedSubstring) === 0) {\r\n this.store.removeItem(key);\r\n }\r\n });\r\n this.debugMsg('❌ deleted all records starting with', substring);\r\n resolve();\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n }\r\n\r\n // Delete all entries with the prefix\r\n clear() {\r\n const prefix = this.prefixGenerator();\r\n Object.keys(this.store).forEach((k) => {\r\n if (k.indexOf(prefix) === 0) {\r\n this.delete(k);\r\n }\r\n });\r\n this.debugMsg('❌ All data deleted.');\r\n }\r\n}\r\n\r\nexport default LocalSessionStore;\r\n","import { EventDispatcher } from './eventSystem/EventDispatcher';\r\nimport { getIndexedDbPersister } from './indexedDb/indexedDbPersister';\r\nimport { getInMemoryPersister } from './inMemory/InMemoryPersister';\r\nimport { getLocalSessionPersister } from './localStorage/LocalSessionPersister';\r\n\r\n/**\r\n * Persisters available are:\r\n * - IndexedDB - Uses indexedDB\r\n * - LocalStorage - Uses LocalStorage\r\n * - inMemory - uses JS Map object for in memory storage\r\n */\r\n\r\nconst SETTINGS_NAME = 'serviceSettings';\r\n\r\nclass GlobalAppService {\r\n constructor() {\r\n this.settingsStoreConfig = { name: SETTINGS_NAME, keyPath: 'key', type: 'local' };\r\n this.eventDispatcher = new EventDispatcher();\r\n this.serviceSettings = {\r\n showDebugMessages: false,\r\n };\r\n\r\n // This Map will hold the unresolved promises tied to a web service call.\r\n this.webServiceCalls = new Map();\r\n this.inMemStorage = null;\r\n this.cachePersister = null;\r\n this.services = null;\r\n this.stores = null;\r\n }\r\n\r\n static pageDidReload() {\r\n try {\r\n return window.performance.getEntriesByType('navigation')[0].type === 'reload';\r\n } catch (err) {\r\n try {\r\n // Need to try deprecated value for iOS 14 safari. This can be removed when stop supporting that browser\r\n // https://bugs.webkit.org/show_bug.cgi?id=184363\r\n return performance.navigation.type === performance.navigation.TYPE_RELOAD;\r\n } catch (totalFail) {\r\n console.warn('Unable to detect page reload using modern and deprecated techniques', err, totalFail);\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n clearPersister() {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n this.cachePersister.kill();\r\n resolve(true);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n }\r\n\r\n clearAllStores() {\r\n Object.values(this.stores).forEach((s) => s.clear());\r\n Object.values(this.cachePersister.stores).forEach((s) => s.clear());\r\n }\r\n\r\n getServices() {\r\n return this.services;\r\n }\r\n\r\n listServices() {\r\n return Object.keys(this.getServices());\r\n }\r\n\r\n async showDebugMessages(shouldDisplay) {\r\n const newSettings = { ...this.serviceSettings, showDebugMessages: shouldDisplay };\r\n const ttl = Date.now() + 99999 * 1000;\r\n await this.stores.serviceSettings.upsert(SETTINGS_NAME, newSettings, ttl);\r\n await this.cachePersister.stores.serviceSettings.upsert(SETTINGS_NAME, newSettings, ttl);\r\n const { data } = await this.stores.serviceSettings.get(SETTINGS_NAME);\r\n this.serviceSettings = data;\r\n this.inMemStorage.setDebug(shouldDisplay);\r\n this.cachePersister.setDebug(shouldDisplay);\r\n }\r\n\r\n debugMessage(...args) {\r\n if (this.serviceSettings.showDebugMessages || window.showAtsDebugMessage === true) {\r\n // eslint-disable-next-line no-console\r\n console.log(...args);\r\n }\r\n }\r\n\r\n /**\r\n * Generates event names.\r\n * @param {string} key Usually the name of the service\r\n * @returns A lookup of event names\r\n */\r\n static generateEventNames(key) {\r\n return {\r\n loading: `AGS_${key}_loading`,\r\n success: `AGS_${key}_success`,\r\n failure: `AGS_${key}_failure`,\r\n refresh: `AGS_${key}_refresh'`,\r\n };\r\n }\r\n\r\n /**\r\n * Generates a key with a given prefix and list of additional parameters\r\n * @param {string} prefix\r\n * @param {...any} params\r\n * @returns string\r\n */\r\n static makeKeyFromParams(prefix, ...params) {\r\n return prefix + JSON.stringify(params);\r\n }\r\n\r\n clearWebServicePromise(funcKey) {\r\n if (this.webServiceCalls.has(funcKey)) {\r\n this.webServiceCalls.delete(funcKey);\r\n }\r\n }\r\n\r\n /**\r\n * Batch redundant calls and return the same promise while request is in progress.\r\n * This needs to be done at call time because function parameters are needed to\r\n * identify redundant function calls.\r\n *\r\n * @param {Object} serviceConfig as defined in the serviceConfigs\r\n * @param {function} serviceFunc The service call\r\n * @param {...any} params Any parameters used to make the call\r\n * @returns Promise\r\n */\r\n batchedCallHandler(serviceConfig, serviceFunc, ...params) {\r\n const { key, events } = serviceConfig;\r\n // check for existing unresolved call\r\n const funcKey = GlobalAppService.makeKeyFromParams(key, ...params);\r\n const { callPromise } = this.webServiceCalls.get(funcKey) || {};\r\n if (callPromise) {\r\n return callPromise;\r\n }\r\n // make the call and put the promise in the webServiceCalls map.\r\n const originalPromise = serviceFunc(...params);\r\n // Fire an event for loading started\r\n this.eventDispatcher.dispatch(events.loading, { funcKey });\r\n\r\n // Async functions always return a promise so we can use async here to wrap a\r\n // promise around the webservice call's promise for webServiceCalls clean up.\r\n // When the service call resolves remove the promise from the lookup.\r\n const promiseWrapper = async () => {\r\n try {\r\n const result = await originalPromise;\r\n // Fire an event for loading successful.\r\n this.eventDispatcher.dispatch(events.success, { funcKey, result });\r\n this.clearWebServicePromise(funcKey);\r\n return result;\r\n } catch (err) {\r\n console.error(err);\r\n // Fire an event for loading failed.\r\n this.eventDispatcher.dispatch(events.failure, { funcKey, err });\r\n this.clearWebServicePromise(funcKey);\r\n throw err;\r\n }\r\n };\r\n const wrappedPromise = promiseWrapper();\r\n this.webServiceCalls.set(funcKey, { callPromise: wrappedPromise });\r\n return wrappedPromise;\r\n }\r\n\r\n /**\r\n * This is a curried function to help bind a service call to storage. Used for convenience\r\n * because much of the set, get, and delete logic is redundant across call handlers.\r\n *\r\n * @param {Object} serviceConfig as defined in the serviceConfigs\r\n * @returns function\r\n */\r\n bindCallToStorage(serviceConfig) {\r\n const { serviceCall, key, ttl, store, events } = serviceConfig;\r\n const cacheStore = this.cachePersister?.stores[store.name] || undefined;\r\n return async (...params) => {\r\n const storageKey = GlobalAppService.makeKeyFromParams(key, ...params);\r\n let existingResult = await store.get(storageKey);\r\n let foundInCache = false;\r\n if (cacheStore && ttl > 0 && existingResult === undefined) {\r\n try {\r\n existingResult = await cacheStore.get(storageKey);\r\n foundInCache = true;\r\n } catch (err) {\r\n console.warn('Cache store is broken. Implement some reporting code in here.');\r\n console.error(err);\r\n // Database is locked for some reason, Mark false and continue on. Should correct itself on the next page\r\n foundInCache = false;\r\n }\r\n }\r\n const isExpired = Date.now() > existingResult?.expiresAt || 0;\r\n if (isExpired) {\r\n this.debugMessage(`🔥 Expired Kill ${storageKey} with 🔥`);\r\n // TODO Do we need to trigger delete events?\r\n if (cacheStore) {\r\n await cacheStore.delete(storageKey);\r\n }\r\n await store.delete(storageKey);\r\n }\r\n\r\n if (existingResult !== undefined && !isExpired) {\r\n this.debugMessage(`💾 Found ${storageKey} from storage 💾`);\r\n if (foundInCache) {\r\n // Put this back in memory storage\r\n store.set(storageKey, existingResult.data, Date.now() + ttl);\r\n }\r\n return existingResult.data;\r\n }\r\n this.debugMessage(`🤙 ${storageKey} with params`, params);\r\n const result = await serviceCall(...params);\r\n try {\r\n store.set(storageKey, result, Date.now() + ttl);\r\n if (cacheStore && ttl > 0) {\r\n cacheStore.set(storageKey, result, Date.now() + ttl);\r\n }\r\n this.eventDispatcher.dispatch(events.refresh, { storageKey });\r\n } catch (err) {\r\n console.error(err);\r\n throw err;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n makeFetchObject(serviceConfig, serviceCall) {\r\n const { key, store, events } = serviceConfig;\r\n const fetchObject = {\r\n fetch: (...params) => this.batchedCallHandler(serviceConfig, serviceCall, ...params),\r\n keyFromParams: (...params) => GlobalAppService.makeKeyFromParams(key, ...params),\r\n // clear out data from in memory store and cache store\r\n invalidateKey: async (...params) => {\r\n const resolvedKey = params ? GlobalAppService.makeKeyFromParams(key, ...params) : key;\r\n const cacheStore = this.cachePersister?.stores[store.name] || undefined;\r\n let existingResult = await store.get(resolvedKey);\r\n if (existingResult === undefined) {\r\n existingResult = await cacheStore.get(resolvedKey);\r\n }\r\n if (existingResult !== undefined) {\r\n this.debugMessage(`💥 ${resolvedKey} invalidating key 💥`);\r\n if (cacheStore) {\r\n await cacheStore.delete(resolvedKey);\r\n }\r\n await store.delete(resolvedKey);\r\n this.eventDispatcher.dispatch(events.refresh);\r\n }\r\n },\r\n invalidateMemoryStore: async (...params) => {\r\n const resolvedKey = params ? GlobalAppService.makeKeyFromParams(key, ...params) : key;\r\n const existingResult = await store.get(resolvedKey);\r\n if (existingResult !== undefined) {\r\n this.debugMessage(`💥 ${resolvedKey} invalidating memory store only 💥`);\r\n await store.delete(resolvedKey);\r\n this.eventDispatcher.dispatch(events.refresh);\r\n }\r\n },\r\n events,\r\n // expose event on and off methods. Need to wrap them in function to avoid what I think is a stale closure\r\n on: (...params) => this.eventDispatcher.on(...params),\r\n off: (...params) => this.eventDispatcher.off(...params),\r\n };\r\n\r\n fetchObject.fetchAndReplace = async (...params) => {\r\n await fetchObject.invalidateKey(...params);\r\n return fetchObject.fetch(...params);\r\n };\r\n\r\n fetchObject.clearServiceData = async () => {\r\n const cacheStore = this.cachePersister?.stores[store.name] || undefined;\r\n if (cacheStore) {\r\n cacheStore.deleteStartsWith(key);\r\n }\r\n store.deleteStartsWith(key);\r\n };\r\n return fetchObject;\r\n }\r\n\r\n generateService(serviceConfig) {\r\n const serviceCallHandler = this.bindCallToStorage(serviceConfig);\r\n return this.makeFetchObject(serviceConfig, serviceCallHandler);\r\n }\r\n\r\n /**\r\n * Initializes the GlobalAppService. Cannot do this in the constructor because it is asynchronous.\r\n * @param {Object} config Config options. TODO write these option out.\r\n * @returns Promise\r\n */\r\n async init(config) {\r\n const { name, storeIdentifiers, serviceConfigs } = config;\r\n if (window.showAtsDebugMessage) {\r\n // eslint-disable-next-line no-console\r\n console.log('🏗️ initGlobalAppService making instance.', config);\r\n }\r\n const { settingsStoreConfig } = this;\r\n const allStoreConfigs = { settingsStoreConfig, ...storeIdentifiers };\r\n\r\n // build a cache persister here.\r\n const persisterBuilder = GlobalAppService.determinePersister();\r\n // Generate the stores and associated methods\r\n this.cachePersister = await persisterBuilder(name, allStoreConfigs);\r\n this.inMemStorage = await getInMemoryPersister(name, allStoreConfigs);\r\n\r\n // restore any config settings from the storage. Don't block on this.\r\n this.cachePersister.stores.serviceSettings.get(SETTINGS_NAME).then((res) => {\r\n if (res?.data) {\r\n this.serviceSettings = res.data;\r\n this.inMemStorage.setDebug(res.data?.showDebugMessages);\r\n this.cachePersister.setDebug(res.data?.showDebugMessages);\r\n }\r\n });\r\n\r\n // bind the store to the serviceConfig\r\n Object.entries(serviceConfigs).forEach(([key, sc]) => {\r\n // apply defaults\r\n const resolvedConfig = {\r\n ...sc,\r\n ttl: sc.ttl !== undefined ? sc.ttl : 3_600_000,\r\n events: GlobalAppService.generateEventNames(sc.key),\r\n store: this.inMemStorage.stores[sc.storeConfig.name],\r\n clearOnRefresh: Boolean(sc?.clearOnRefresh),\r\n };\r\n serviceConfigs[key] = resolvedConfig;\r\n });\r\n // Loop through each serviceConfig and generate a service.\r\n this.services = Object.values(serviceConfigs).reduce((acc, service) => {\r\n return { ...acc, [service.key]: this.generateService(service) };\r\n }, {});\r\n\r\n if (GlobalAppService.pageDidReload()) {\r\n if (window.showAtsDebugMessage) {\r\n // eslint-disable-next-line no-console\r\n console.log('🔄 Reload detected. Clearing out services marked by `clearOnRefresh`');\r\n }\r\n Object.values(serviceConfigs)\r\n .filter((sc) => sc.clearOnRefresh)\r\n .forEach((sc) => {\r\n this.cachePersister.stores[sc.storeConfig.name].deleteStartsWith(sc.key);\r\n });\r\n }\r\n\r\n this.stores = this.inMemStorage.stores;\r\n return this;\r\n }\r\n\r\n static localStorageAvailable() {\r\n const storage = window.localStorage;\r\n try {\r\n const x = '__storage_test__';\r\n storage.setItem(x, x);\r\n storage.removeItem(x);\r\n return true;\r\n } catch (e) {\r\n return (\r\n e instanceof DOMException &&\r\n // everything except Firefox\r\n (e.code === 22 ||\r\n // Firefox\r\n e.code === 1014 ||\r\n // test name field too, because code might not be present\r\n // everything except Firefox\r\n e.name === 'QuotaExceededError' ||\r\n // Firefox\r\n e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&\r\n // acknowledge QuotaExceededError only if there's something already stored\r\n storage &&\r\n storage.length !== 0\r\n );\r\n }\r\n }\r\n\r\n static determinePersister() {\r\n if (window?.indexedDB) {\r\n return getIndexedDbPersister;\r\n }\r\n if (GlobalAppService.localStorageAvailable()) {\r\n return getLocalSessionPersister;\r\n }\r\n return null;\r\n }\r\n}\r\n\r\nexport default GlobalAppService;\r\n","import { fetchAccountData, getLogonProfile, patchChangeTripActions } from '@amtrav/webservice';\r\nimport { getAndProcessAutomatedActions } from '../apps/change-trip/services/automatedActionsProcessor';\r\n\r\nconst getLogonProfileHandler = () => {\r\n return getLogonProfile()\r\n .then((result) => result)\r\n .catch((err) => {\r\n console.warn('Unauthorized or corrupted user session. Redirecting to logout page.', err.code);\r\n console.error(err);\r\n const errorCodesRequiringLogout = [7008, 7048, 8005];\r\n if (errorCodesRequiringLogout.includes(err.code)) {\r\n window.location.href = '/logout';\r\n }\r\n });\r\n};\r\n\r\n// TODO add defaults to reduce redundancy\r\nexport const storeIdentifiers = {\r\n changeTrip: { name: 'changeTrip', keyPath: 'key', type: 'local' },\r\n user: { name: 'user', keyPath: 'key', type: 'session' },\r\n};\r\n\r\n// const ONE_HOUR = 3_600_000;\r\n// const FIFTEEN_MINUTES = 900_000;\r\nconst FIVE_MINUTES = 300_000;\r\nconst NO_CACHE = 0;\r\n\r\nexport const serviceConfigs = {\r\n changeTripAutomatedActions: {\r\n key: 'changeTripAutomatedActions',\r\n ttl: NO_CACHE,\r\n storeConfig: storeIdentifiers.changeTrip,\r\n serviceCall: getAndProcessAutomatedActions,\r\n },\r\n patchChangeTripActions: {\r\n key: 'patchChangeTripActions',\r\n ttl: NO_CACHE,\r\n storeConfig: storeIdentifiers.changeTrip,\r\n serviceCall: patchChangeTripActions,\r\n },\r\n accountData: {\r\n key: 'accountData',\r\n ttl: FIVE_MINUTES,\r\n storeConfig: storeIdentifiers.user,\r\n serviceCall: fetchAccountData,\r\n clearOnRefresh: true,\r\n },\r\n logonProfile: {\r\n key: 'logonProfile',\r\n ttl: FIVE_MINUTES,\r\n storeConfig: storeIdentifiers.user,\r\n serviceCall: getLogonProfileHandler,\r\n clearOnRefresh: true,\r\n },\r\n};\r\n","import GlobalAppService from './GlobalAppService';\r\nimport { storeIdentifiers, serviceConfigs } from './configs';\r\n// window.showAtsDebugMessage = true;\r\n\r\n// Make sure any calls to globalAppService always get the same promise back.\r\n// This gets immediately attached to window so the legacy side will get the same one.\r\nwindow.$ats.appServiceInitPromise = undefined;\r\n\r\n/**\r\n * For debug only. This will output a stack trace every time the globalAppService singleton is requested.\r\n * The stack trace can be expanded to see from where the globalAppService is being requested. This will\r\n * give insight into possible race conditions and other hard to debug issues.\r\n *\r\n * This will not fire unless `window.showAtsDebugMessage = true;` is added somewhere early in the code\r\n * like for example anywhere in this file.\r\n */\r\nconst logServiceRequested = () => {\r\n if (window.showAtsDebugMessage) {\r\n // eslint-disable-next-line no-console\r\n const shutUpEslint = console;\r\n shutUpEslint.groupCollapsed('🛎️ appService requested.');\r\n shutUpEslint.trace();\r\n shutUpEslint.groupEnd();\r\n }\r\n};\r\n\r\n/**\r\n * This should return a Promise that resolves a singleton of a GlobalAppService.\r\n * The promise is attached to the window so the legacy side has access to it.\r\n * @returns Promise\r\n */\r\nexport const globalAppService = async () => {\r\n logServiceRequested();\r\n // Enforce the singleton pattern.\r\n if (window.$ats.appServiceInitPromise) {\r\n return window.$ats.appServiceInitPromise;\r\n }\r\n const globalService = new GlobalAppService();\r\n window.$ats.appServiceInitPromise = globalService.init({\r\n name: 'globalAppService',\r\n storeIdentifiers,\r\n serviceConfigs,\r\n });\r\n window.$ats.appServiceInitPromise.then((appService) => {\r\n window.$ats.appService = appService;\r\n });\r\n return window.$ats.appServiceInitPromise;\r\n};\r\n\r\nwindow.$ats.globalAppServiceInit = globalAppService;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport PropTypes from 'prop-types';\r\nimport { IconOpenNew } from '@amtrav/icons';\r\nimport { Badge } from '@amtrav/view-components';\r\nimport { getThemeProp, media } from '@amtrav/themes';\r\nimport { Flex, Box } from '@rebass/grid';\r\nimport isMobileApp from '../../helpers/isMobileApp';\r\n\r\nconst USER_ROLE = {\r\n administrator: 'A',\r\n coordinator: 'C',\r\n};\r\n\r\nconst showLogout = !isMobileApp();\r\n\r\nconst LinkOption = styled(Flex)`\r\n cursor: pointer;\r\n font-weight: bold;\r\n color: ${getThemeProp('global.link--color')};\r\n min-width: 200px;\r\n align-items: center;\r\n border-bottom: ${({ hideBorder }) => (hideBorder ? '0px' : '1px solid #ddd')};\r\n font-size: 16px;\r\n\r\n ${media.Large`\r\n font-size: 14px;\r\n \r\n &:hover {\r\n color: white;\r\n background: ${getThemeProp('global.link--color')};\r\n }\r\n `};\r\n`;\r\n\r\nconst ImportantOption = styled(LinkOption)`\r\n color: ${getThemeProp('global.danger--color')};\r\n border-bottom: 0;\r\n\r\n ${media.Large`\r\n &:hover {\r\n background: ${getThemeProp('global.danger--color')};\r\n }\r\n `};\r\n`;\r\n\r\nconst MenuPopover = ({ userRole = '', navPolicyDoc = '', showProfileLink = false }) => {\r\n return (\r\n \r\n {showProfileLink ? (\r\n {\r\n window.document.location = '/profile/';\r\n }}\r\n p={3}\r\n pl={['40px', '40px', '40px', 3]}>\r\n \r\n My Profile\r\n {userRole === USER_ROLE.administrator ? Administrator : null}\r\n {userRole === USER_ROLE.coordinator ? Coordinator : null}\r\n \r\n \r\n ) : null}\r\n {navPolicyDoc ? (\r\n {\r\n window.open(`/policies-document/${navPolicyDoc}`);\r\n }}\r\n p={3}\r\n pl={['40px', '40px', '40px', 3]}>\r\n \r\n View Policy\r\n \r\n \r\n \r\n \r\n \r\n ) : null}\r\n {showLogout ? (\r\n {\r\n window.document.location = '/logout/';\r\n }}\r\n p={3}\r\n pl={['40px', '40px', '40px', 3]}>\r\n Log Out\r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nMenuPopover.propTypes = {\r\n userRole: PropTypes.string,\r\n /**\r\n * Name of travel policy document\r\n */\r\n navPolicyDoc: PropTypes.string,\r\n showProfileLink: PropTypes.bool,\r\n};\r\n\r\nexport default MenuPopover;\r\n","import { useEffect, useState } from 'react';\r\nimport { globalAppService } from '../appService';\r\n\r\n// Get a jump on Initializing the globalAppService.\r\n(async () => {\r\n await globalAppService();\r\n})();\r\n\r\nconst useGlobalAppService = () => {\r\n const [hookState, setHookState] = useState({\r\n isReady: false,\r\n appService: null,\r\n });\r\n\r\n useEffect(() => {\r\n const init = async () => {\r\n const appService = await globalAppService();\r\n setHookState({\r\n isReady: true,\r\n appService,\r\n });\r\n };\r\n init();\r\n }, []);\r\n\r\n // TODO: Consider making global event listeners and binding them here.\r\n\r\n return [hookState.isReady, hookState.appService];\r\n};\r\n\r\nexport default useGlobalAppService;\r\n"],"sourceRoot":""}