{"version":3,"file":"modules/layout-b1-46fdf5b02b56cd9e06ac.js","mappings":"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","sources":["webpack:///./scripts/constants/googleAnalyticsCustomDimension.js","webpack:///./scripts/constants/routes.js","webpack:///./scripts/dataTransferObjects/googleAnalyticsEvent.js","webpack:///./scripts/enums/loadingStatus.js","webpack:///./scripts/features/totalDeliveryValue/services/processEvents.js","webpack:///./scripts/features/totalDeliveryValue/redux/slices.js","webpack:///./scripts/features/totalDeliveryValue/components/trackOnDemand.js","webpack:///./scripts/features/totalDeliveryValue/apis/postEvents.js","webpack:///./scripts/features/totalDeliveryValue/redux/epics.js","webpack:///./scripts/features/totalDeliveryValue/index.js","webpack:///./scripts/features/userProfile/services/getListingInformationForPendingSave.js","webpack:///./scripts/features/userProfile/components/favorites.js","webpack:///./scripts/libraries/googleOneTapLibrary.js","webpack:///./scripts/features/userProfile/apis/loginWithGoogleOneTap.js","webpack:///./scripts/features/userProfile/services/parseJsonWebToken.js","webpack:///./scripts/features/userProfile/components/googleOneTapAuthentication.js","webpack:///./scripts/features/userProfile/components/signUpValidator.js","webpack:///./scripts/features/userProfile/components/auth0BaseConfiguration.js","webpack:///./scripts/features/userProfile/components/mainAuthentication.js","webpack:///./scripts/features/userProfile/components/modal.js","webpack:///./scripts/features/userProfile/components/neustarListener.js","webpack:///./scripts/modules/cookieManager.js","webpack:///./scripts/features/userProfile/components/sessionAliveInteraction.js","webpack:///./scripts/features/userProfile/components/userMenu.b1.js","webpack:///./scripts/features/userProfile/constants/auth0Constants.js","webpack:///./scripts/features/userProfile/constants/sessionStorageConstants.js","webpack:///./scripts/features/userProfile/enums/favoriteType.js","webpack:///./scripts/features/userProfile/index.js","webpack:///./scripts/features/userProfile/redux/listeners.js","webpack:///./scripts/features/userProfile/redux/selectors.js","webpack:///./scripts/features/userProfile/redux/initialState.js","webpack:///./scripts/features/userProfile/redux/slices.js","webpack:///./scripts/layout/analytics/footer.js","webpack:///./scripts/layout/analytics/header.js","webpack:///./scripts/features/utm/apis/setUtmParameters.js","webpack:///./scripts/features/utm/redux/slices.js","webpack:///./scripts/features/utm/redux/epics.js","webpack:///./scripts/features/utm/index.js","webpack:///./scripts/layout/redux/configurationSlice.js","webpack:///./scripts/layout/redux/epics.js","webpack:///./scripts/layout/app.b1.js","webpack:///./scripts/layout/apis/getConfiguration.js","webpack:///./scripts/layout/components/back.js","webpack:///./scripts/layout/components/dataLayer.js","webpack:///./scripts/layout/components/hamburgerMenu.js","webpack:///./scripts/layout/components/modal.js","webpack:///./scripts/layout/components/overlay.js","webpack:///./scripts/layout/components/responsiveLayoutHandler.js","webpack:///./scripts/layout/constants/pageLayoutNames.js","webpack:///./scripts/layout/constants/resultPresentationType.js","webpack:///./scripts/layout/enums/layoutBreakpoint.js","webpack:///./scripts/layout/redux/listeners.js","webpack:///./scripts/layout/redux/selectors.js","webpack:///./scripts/layout/services/resultsPresentationService.js","webpack:///./scripts/layout/redux/uiStateSlice.js","webpack:///./scripts/layout/services/modalService.js","webpack:///./scripts/libraries/authLibrary.js","webpack:///./scripts/pages/searchResults/redux/actions.js","webpack:///./scripts/features/userProfile/apis/getUserProfile.js","webpack:///./scripts/features/userProfile/apis/getUserFavorites.js","webpack:///./scripts/features/userProfile/apis/saveFavorite.js","webpack:///./scripts/features/userProfile/apis/deleteFavorite.js","webpack:///./scripts/features/userProfile/services/getHousingProductType.js","webpack:///./scripts/features/userProfile/models/specProductType.js","webpack:///./scripts/features/userProfile/models/planProductType.js","webpack:///./scripts/features/userProfile/models/communityProductType.js","webpack:///./scripts/features/userProfile/redux/epics.js","webpack:///./scripts/redux/rootEpics.js","webpack:///./scripts/features/userProfile/services/getFavoriteFromState.js","webpack:///./scripts/redux/store.js","webpack:///./scripts/utils/camelCase.js","webpack:///./scripts/utils/urlExtension.js"],"sourcesContent":["export default class GoogleAnalyticsCustomDimensions {\r\n static MarketId() {\r\n return new GoogleAnalyticsCustomDimensions('marketId');\r\n }\r\n\r\n static PartnerName() {\r\n return new GoogleAnalyticsCustomDimensions('partnerName');\r\n }\r\n\r\n static BuilderCorporation() {\r\n return new GoogleAnalyticsCustomDimensions('builderCorp');\r\n }\r\n\r\n static CommunityName() {\r\n return new GoogleAnalyticsCustomDimensions('communityName');\r\n }\r\n\r\n static City() {\r\n return new GoogleAnalyticsCustomDimensions('city');\r\n }\r\n\r\n static PageType() {\r\n return new GoogleAnalyticsCustomDimensions('pageType');\r\n }\r\n\r\n static PartnerId() {\r\n return new GoogleAnalyticsCustomDimensions('partnerId');\r\n }\r\n\r\n static MarketName() {\r\n return new GoogleAnalyticsCustomDimensions('marketName');\r\n }\r\n\r\n static CommunityId() {\r\n return new GoogleAnalyticsCustomDimensions('communityId');\r\n }\r\n\r\n static UserId() {\r\n return new GoogleAnalyticsCustomDimensions('i_uid');\r\n }\r\n\r\n static CurrentPageNumber() {\r\n return new GoogleAnalyticsCustomDimensions('currentPageNumber');\r\n }\r\n\r\n static NeustarResponse() {\r\n return new GoogleAnalyticsCustomDimensions('n_response');\r\n }\r\n\r\n static OffMarket() {\r\n return new GoogleAnalyticsCustomDimensions('OffMarket');\r\n }\r\n\r\n static BuilderId() {\r\n return new GoogleAnalyticsCustomDimensions('builderId');\r\n }\r\n\r\n static BrandName() {\r\n return new GoogleAnalyticsCustomDimensions('brandName');\r\n }\r\n\r\n static PlanId() {\r\n return new GoogleAnalyticsCustomDimensions('planId');\r\n }\r\n\r\n static SpecId() {\r\n return new GoogleAnalyticsCustomDimensions('specId');\r\n }\r\n\r\n static IsPaid() {\r\n return new GoogleAnalyticsCustomDimensions('IsPaid');\r\n }\r\n\r\n static MatchingResults() {\r\n return new GoogleAnalyticsCustomDimensions('matchingResults');\r\n }\r\n\r\n static Counties() {\r\n return new GoogleAnalyticsCustomDimensions('counties');\r\n }\r\n\r\n static Location() {\r\n return new GoogleAnalyticsCustomDimensions('location');\r\n }\r\n\r\n static PriceReduction() {\r\n return new GoogleAnalyticsCustomDimensions('priceReduction');\r\n }\r\n\r\n static SearchWithinMapActivated() {\r\n return new GoogleAnalyticsCustomDimensions('searchWithinMapActivated');\r\n }\r\n\r\n constructor(dimension) {\r\n this.dimension = dimension;\r\n }\r\n\r\n getName() {\r\n return this.dimension;\r\n }\r\n}\r\n","/**\r\n * The idea for this filter is to have a centralized list of all routes used in the front-end,\r\n * Using destructuring assignment and tree-shaking, we can only load those routes that we need\r\n * making sure that if the routes change in the future, we can easily update them in the front-end\r\n * without requiring changes in multiple places\r\n *\r\n * an example of how to load routes can be seen below:\r\n *\r\n * import { getTypeaheadOptions } from 'constants/routes'\r\n */\r\n\r\n/*\r\n * Gets the value of the `href` attribute of the `base` element in the HTML document.\r\n * If the `base` element does not exist or does not have an `href` attribute, `baseElementUrl` will be `undefined`.\r\n *\r\n * Using document.querySelector('base').href could induce error in the code if the base element does not exist\r\n * or the href attribute is undefined, as it fallbacks to the document's fallback base URL, which is the current\r\n * Document's URL.\r\n */\r\nconst baseElementUrl = document.querySelector('base')?.attributes?.href?.value;\r\n\r\n/*\r\n * Object that contains properties that can be useful for configuring the API requests\r\n * or other network requests in the application.\r\n */\r\nconst configuration = {\r\n baseUrl: baseElementUrl || window.location.origin,\r\n};\r\n\r\nexport const getAdConfiguration = `${configuration.baseUrl}/ajax/getadconfiguration`;\r\nexport const getBreadcrumbContent = `${configuration.baseUrl}/ajax/getonpagebreadcrumb`;\r\nexport const getCommunitiesResults = `${configuration.baseUrl}/ajax/getResults`;\r\nexport const getHousingProductSnippetContent = `${configuration.baseUrl}/ajax/gethousingproductsnippetscontent`;\r\nexport const getListingCounts = `${configuration.baseUrl}/ajax/getResultCounts`;\r\nexport const getOnPageContent = `${configuration.baseUrl}/ajax/gethousingproductlocationcontentajax`;\r\nexport const getResultFacets = `${configuration.baseUrl}/ajax/getResultFacets`;\r\nexport const getTypeaheadOptions = `${configuration.baseUrl}/gettypeaheadoptions`;\r\nexport const leadsBasicCommunitySubmission = `${configuration.baseUrl}/ajax/leads/basiccommunitysubmission/`;\r\nexport const leadsBasicPlanSubmission = `${configuration.baseUrl}/ajax/leads/basicplansubmission/`;\r\nexport const leadsBasicSpecSubmission = `${configuration.baseUrl}/ajax/leads/basicspecsubmission/`;\r\nexport const leadsBasicListingSubmission = `${configuration.baseUrl}/ajax/leads/basiclistingsubmission/`;\r\nexport const leadsGetRecommendedCommunities = `${configuration.baseUrl}/ajax/leads/getrecommendedcommunities/`;\r\nexport const leadsPaidCommunitySubmission = `${configuration.baseUrl}/ajax/leads/paidcommunitysubmission/`;\r\nexport const leadsPaidPlanSubmission = `${configuration.baseUrl}/ajax/leads/paidplansubmission/`;\r\nexport const leadsPaidSpecSubmission = `${configuration.baseUrl}/ajax/leads/paidspecsubmission/`;\r\nexport const leadsRecommendedCommunitySubmission = `${configuration.baseUrl}/ajax/leads/recommendedcommunitysubmission/`;\r\nexport const mapGetCommunitiesPoints = `${configuration.baseUrl}/ajax/communities/getcommunitypoints`;\r\nexport const mapGetHomesPoints = `${configuration.baseUrl}/ajax/homes/gethomepoints`;\r\nexport const totalDeliveryValueCommunityLogger = `${configuration.baseUrl}/communitylogger`;\r\nexport const totalDeliveryValuePlanLogger = `${configuration.baseUrl}/planlogger`;\r\nexport const totalDeliveryValueSpecLogger = `${configuration.baseUrl}/speclogger`;\r\nexport const userDeleteFavorite = `${configuration.baseUrl}/user/deleteFavorite`;\r\nexport const userGetProfile = `${configuration.baseUrl}/getUserProfile`;\r\nexport const userProfileGetFavorites = `${configuration.baseUrl}/getUserFavorites`;\r\nexport const userSaveFavorite = `${configuration.baseUrl}/user/saveFavorite`;\r\nexport const marketingcampaignUnsubscribe = `${configuration.baseUrl}/marketingcampaign/unsubscribemarketingcampaign`;\r\nexport const marketingcampaignUnsubscribeFeedback = `${configuration.baseUrl}/marketingcampaign/unsubscribefeedback`;\r\nexport const googleOneTapLogin = `${configuration.baseUrl}/ajax/googleOneTapLogin`;\r\nexport const getCommunityNearbyListingsInfo = `${configuration.baseUrl}/ajax/getcommunitynearbylistings`;\r\nexport const getBuildablePlanNearbylistingsInfo = `${configuration.baseUrl}/ajax/getbuildableplannearbylistings`;\r\nexport const getPlanNearbyListingsInfo = `${configuration.baseUrl}/ajax/getplannearbylistings`;\r\nexport const getSpecNearbyListingsInfo = `${configuration.baseUrl}/ajax/getspecnearbylistings`;\r\nexport const listingCounts = `${configuration.baseUrl}/learn/dynamic/getlistingcounts`;\r\nexport const getArticleSuggestions = `${configuration.baseUrl}/learn/dynamic/getarticlesuggestions`;\r\nexport const getCommunitiesForYou = `${configuration.baseUrl}/learn/dynamic/getcommunitiesforyou`;\r\nexport const getHomesForYou = `${configuration.baseUrl}/learn/dynamic/gethomesforyou`;\r\nexport const getMetroSpecificArticles = `${configuration.baseUrl}/learn/dynamic/getmetroarearelatedarticles`;\r\nexport const getMostRecentArticles = `${configuration.baseUrl}/learn/dynamic/getmostrecentarticles`\r\nexport const blogRequestAccessToCacheManager = `${configuration.baseUrl}/util/blogcachemanager/requestaccess`;\r\nexport const deleteItemInAllServers = `${configuration.baseUrl}/util/cachemanager/deleteiteminallservers`;\r\nexport const purgeCdnCache = `${configuration.baseUrl}/util/purge-cdn-cache`;\r\nexport const learningCenter = `${configuration.baseUrl}/learn/`;\r\nexport const getArticleSearchResults = `${configuration.baseUrl}/learn/dynamic/getresults/`;\r\nexport const getArticleCountResults = `${configuration.baseUrl}/learn/dynamic/getcountsresults/`;\r\nexport const searchCommunitySitePlans = `${configuration.baseUrl}/ajax/searchcommunitysiteplans`;\r\nexport const getCommunityInteractiveSitePlanMarkers = `${configuration.baseUrl}/ajax/getcommunityinteractivesiteplanmarkers`;\r\nexport const getCommunitySummaryCard = `${configuration.baseUrl}/ajax/getcommunitysummarycard`;\r\nexport const getHousingUnitSummaryCard = `${configuration.baseUrl}/ajax/gethousingunitsummarycard`;","class GoogleAnalyticsEvent {\r\n constructor(category, action, label, customDimensions = {}) {\r\n this.eventCategory = category;\r\n this.eventAction = action;\r\n this.eventLabel = label;\r\n this.event = 'GAEvent';\r\n\r\n // Use this property to add custom dimensions that are part of the\r\n // event you are tracking. These properties will be pushed to the data layer.\r\n Object.assign(this, customDimensions);\r\n }\r\n}\r\n\r\nexport default GoogleAnalyticsEvent;","/* \r\n Defines a LoadingStatus object with four static properties: failed, idle, loading, and succeeded.\r\n The statuses indicates the state of an asynchronous operation.\r\n\r\n It provides the methods for creating and retrieving instances of the object.\r\n*/\r\nexport default class LoadingStatus {\r\n /**\r\n * This is a static getter function that returns an instance of the \"Failed\" loading status.\r\n * This status indicates the asynchronous operation has finished but returned an error.\r\n *\r\n * @returns it returns the instance of the class with the name `'failed'`.\r\n */\r\n static get Failed() {\r\n return this.getInstance('failed');\r\n }\r\n\r\n /**\r\n * This is a static getter function that returns an instance of the \"Idle\" loading status.\r\n * This status indicates the asynchronous operation is not started.\r\n *\r\n * @returns it returns the instance of the class with the name `'idle'`.\r\n */\r\n static get Idle() {\r\n return this.getInstance('idle');\r\n }\r\n\r\n /**\r\n * This is a static getter function that returns an instance of the \"Loading\" loading status.\r\n * This status indicates the asynchronous operation has started but it hasn't finished.\r\n *\r\n * @returns it returns the instance of the class with the name `'loading'`.\r\n */\r\n static get Loading() {\r\n return this.getInstance('loading');\r\n }\r\n\r\n /**\r\n * This is a static getter function that returns an instance of the \"Succeeded\" loading status.\r\n * This status indicates the asynchronous operation has finished without errors.\r\n *\r\n * @returns it returns the instance of the class with the name `'succeeded'`.\r\n */\r\n static get Succeeded() {\r\n return this.getInstance('succeeded');\r\n }\r\n\r\n static fromKey(key) {\r\n const statusMap = {\r\n failed: LoadingStatus.Failed,\r\n idle: LoadingStatus.Idle,\r\n loading: LoadingStatus.Loading,\r\n succeeded: LoadingStatus.Succeeded,\r\n };\r\n return statusMap[key];\r\n }\r\n\r\n /**\r\n * This function returns an instance of the LoadingStatus class based on a given key, creating a new\r\n * instance if one does not already exist.\r\n *\r\n * @param key - a unique identifier used to create and retrieve instances of the LoadingStatus class.\r\n * It is used to ensure that only one instance of the LoadingStatus class is created for each unique key value.\r\n *\r\n * @returns returns an instance of the `LoadingStatus` class with the specified `key`.\r\n * If an instance with the specified `key` already exists, it returns that instance instead of creating a new one.\r\n */\r\n static getInstance(key) {\r\n if (!this.instances[key]) {\r\n this.instances[key] = new LoadingStatus(key);\r\n }\r\n return this.instances[key];\r\n }\r\n\r\n constructor(name) {\r\n this.name = name;\r\n }\r\n\r\n toString() {\r\n return `${this.name}`;\r\n }\r\n}\r\n\r\nObject.defineProperty(LoadingStatus, 'instances', { value: {} });\r\n","const totalDeliveryEvents = {\r\n \"MPC_Result\": {\r\n param: 'buildercommunitylist',\r\n getAttributes: (dataset) => `${dataset.builderId} ${dataset.communityId},` \r\n },\r\n \"COMR\": {\r\n param: 'buildercommunitylist',\r\n getAttributes: (dataset) => `${dataset.builderId} ${dataset.communityId},` \r\n },\r\n \"HOMEHR\": {\r\n param: 'homeList',\r\n getAttributes: (dataset) => {\r\n if (dataset.specId) {\r\n return `${dataset.specId} s,`;\r\n }\r\n\r\n return `${dataset.planId} p,`;\r\n } \r\n }\r\n};\r\n\r\nconst getEvent = (eventLabel, datasets) => {\r\n const event = {};\r\n if (datasets.length !== 0) {\r\n const config = totalDeliveryEvents[eventLabel];\r\n event[config.param] = '';\r\n datasets.forEach(dataset => { \r\n event[config.param] += config.getAttributes(dataset);\r\n });\r\n event[config.param] = event[config.param].slice(0,-1);\r\n // Not best approach, it should be consistent on every card, but as a hotfix urgency I will\r\n // manage it on my next pull request.\r\n event.market = datasets[0].market || datasets[0].marketId;\r\n }\r\n\r\n return event;\r\n};\r\n\r\nexport default getEvent;","import { createSlice } from '@reduxjs/toolkit';\r\nimport getEvent from '../services/processEvents';\r\n\r\n/* Creating a slice of the state for stuff related to the events. */\r\nconst totalDeliveryValueSlice = createSlice({\r\n name: 'totalDeliveryValue',\r\n initialState: {\r\n type: null\r\n },\r\n reducers: {\r\n fireTdvEvent: (state, action) => {\r\n state.type = 'tdv';\r\n const datasets = action.payload.datasets;\r\n const eventLabel = action.payload.event;\r\n state.parameters = getEvent(eventLabel, datasets);\r\n state.event = action.payload.event;\r\n },\r\n trackingEvent: (state, action) => {\r\n state.parameters = action.payload.parameters;\r\n state.isFetchingEvent = true;\r\n },\r\n trackingEventError: (state) => {\r\n state.parameters = null;\r\n state.isFetchingEvent = false;\r\n },\r\n trackingEventFulfilled: (state) => {\r\n state.parameters = null;\r\n state.event = null;\r\n state.type = null;\r\n state.isFetchingEvent = false;\r\n }\r\n },\r\n});\r\n\r\nexport default totalDeliveryValueSlice;\r\n","import { store } from \"@redux/store\";\r\nimport eventTrackingSlice from \"../redux/slices\";\r\n\r\nconst actions = eventTrackingSlice.actions;\r\n\r\nconst dispatchEvent = (event) => {\r\n event.eventType = \"tdvEvent\";\r\n document.body.dispatchEvent(new CustomEvent(\"trackOnDemandEvent\", {\r\n detail: { data: event }\r\n }));\r\n store.dispatch(actions.trackingEventFulfilled());\r\n};\r\n\r\nexport default dispatchEvent;","import { fromFetch } from 'rxjs/fetch';\r\nimport {\r\n totalDeliveryValueCommunityLogger,\r\n totalDeliveryValuePlanLogger,\r\n totalDeliveryValueSpecLogger,\r\n} from 'constants/routes';\r\n\r\nexport const postCommunityLogger$ = (payload) => {\r\n const requestObject = {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n ...payload,\r\n }),\r\n selector: (response) => response.text(),\r\n };\r\n\r\n return fromFetch(totalDeliveryValueCommunityLogger, requestObject);\r\n};\r\n\r\nexport const postPlanLogger$ = (payload) => {\r\n const requestObject = {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n ...payload,\r\n }),\r\n selector: (response) => response.text(),\r\n };\r\n\r\n return fromFetch(totalDeliveryValuePlanLogger, requestObject);\r\n};\r\n\r\nexport const postSpecLogger$ = (payload) => {\r\n const requestObject = {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n ...payload,\r\n }),\r\n selector: (response) => response.text(),\r\n };\r\n\r\n return fromFetch(totalDeliveryValueSpecLogger, requestObject);\r\n};\r\n","import { catchError, filter, of, switchMap } from 'rxjs';\r\nimport { ofType } from 'redux-observable';\r\nimport eventTrackingSlice from './slices';\r\nimport { postCommunityLogger$, postPlanLogger$, postSpecLogger$ } from '../apis/postEvents';\r\n\r\nconst actions = eventTrackingSlice.actions;\r\n\r\nexport const getPlanLoggerEpic = (action$) =>\r\n action$.pipe(\r\n ofType(actions.trackingEvent.type),\r\n filter((action) => action?.payload?.parameters?.type === 'plan'),\r\n switchMap((action) =>\r\n postPlanLogger$(action.payload.parameters).pipe(\r\n switchMap(() => of(actions.trackingEventFulfilled())),\r\n catchError((err) => of(actions.trackingEventError(err)))\r\n )\r\n )\r\n );\r\n\r\nexport const getSpecLoggerEpic = (action$) =>\r\n action$.pipe(\r\n ofType(actions.trackingEvent.type),\r\n filter((action) => action?.payload?.parameters?.type === 'spec'),\r\n switchMap((action) =>\r\n postSpecLogger$(action.payload.parameters).pipe(\r\n switchMap(() => of(actions.trackingEventFulfilled())),\r\n catchError((err) => of(actions.trackingEventError(err)))\r\n )\r\n )\r\n );\r\n\r\n export const getCommunityLoggerEpic = (action$) =>\r\n action$.pipe(\r\n ofType(actions.trackingEvent.type),\r\n filter((action) => action?.payload?.parameters?.type === 'community' ||\r\n action?.payload?.parameters?.type === 'buildeablePlan'),\r\n switchMap((action) =>\r\n postCommunityLogger$(action.payload.parameters).pipe(\r\n switchMap(() => of(actions.trackingEventFulfilled())),\r\n catchError((err) => of(actions.trackingEventError(err)))\r\n )\r\n )\r\n );","import { epic$, store$ } from \"@redux/store\";\r\nimport { map, filter, distinctUntilChanged } from \"rxjs\";\r\nimport dispatchEvent from \"./components/trackOnDemand\";\r\nimport totalDeliveryValueSlice from \"./redux/slices\";\r\nimport { getCommunityLoggerEpic, getPlanLoggerEpic, getSpecLoggerEpic } from \"./redux/epics\";\r\n\r\nconst eventTrackingSelector = (state) => state?.totalDeliveryValue;\r\nconst isTdvEvent = (eventTracking) => eventTracking?.type === 'tdv';\r\nconst { actions: totalDeliveryValueActions, reducer: totalDeliveryValueReducers} = totalDeliveryValueSlice;\r\n\r\n\r\nconst firedTdvEvents = (eventTracking) => {\r\n const event = {\r\n label: eventTracking.event,\r\n ...eventTracking.parameters\r\n }\r\n dispatchEvent(event);\r\n};\r\n\r\nstore$.pipe(\r\n map(eventTrackingSelector),\r\n filter(isTdvEvent),\r\n distinctUntilChanged()\r\n ).subscribe(firedTdvEvents);\r\n\r\nexport {\r\n totalDeliveryValueActions,\r\n totalDeliveryValueReducers\r\n};\r\n\r\nepic$.next(getPlanLoggerEpic);\r\nepic$.next(getSpecLoggerEpic);\r\nepic$.next(getCommunityLoggerEpic);","import FavoriteType from \"../enums/favoriteType\";\r\n\r\n/**\r\n * getListingInformationForPaidSpec: Gets all the listing information that will be used to add a new Pending Save value.\r\n * @param {Object} dataset All the information related to the Paid Spec Card.\r\n * @returns An object with the required listing information for Paid Spec Listings for the new Pending Save value.\r\n */\r\nfunction getListingInformationForPaidSpec(dataset) {\r\n const {\r\n specId, marketId, marketName, builderId, brandName, communityName, communityId, imageUrl,\r\n price, city, stateAbbreviation, zip, homeStatus, isBasic\r\n } = dataset;\r\n\r\n return {\r\n marketId,\r\n marketName,\r\n builderId,\r\n brandName,\r\n communityId,\r\n communityName,\r\n imageUrl,\r\n isBasic,\r\n homeStatus,\r\n price,\r\n id: specId,\r\n city,\r\n stateAbbreviation,\r\n zip,\r\n };\r\n}\r\n\r\n/**\r\n * getListingInformationForPaidCommunity: Gets all the listing information that will be used to add a\r\n * new Pending Save value.\r\n * @param {Object} dataset All the information related to the Paid Community Card.\r\n * @returns An object with the required listing information for Paid Community Listings for the new Pending Save value.\r\n */\r\nfunction getListingInformationForPaidCommunity(dataset) {\r\n const {\r\n id, marketId, marketName, builderId, brandName, communityName, marketingStatusLabel, isBasic, imageUrl,\r\n priceHigh, priceLow, city, stateAbbreviation, zip\r\n } = dataset;\r\n\r\n return {\r\n id,\r\n marketId,\r\n marketName,\r\n builderId,\r\n brandName,\r\n name: communityName,\r\n marketingStatusLabel,\r\n isBasic,\r\n imageUrl,\r\n priceHigh,\r\n priceLow,\r\n city,\r\n stateAbbreviation,\r\n zip\r\n };\r\n}\r\n\r\n/**\r\n * getListingInformationForPaidPlan: Gets all the listing information that will be used to add a new Pending Save value.\r\n * @param {Object} dataset All the information related to the Paid Plan Card.\r\n * @returns An object with the required listing information for Paid Plan Listings for the new Pending Save value.\r\n */\r\nfunction getListingInformationForPaidPlan(dataset) {\r\n const {\r\n planId, marketId, marketName, builderId, brandName, communityName, communityId, imageUrl,\r\n price, city, stateAbbreviation, zip, homeStatus, isBasic\r\n } = dataset;\r\n\r\n return {\r\n marketId,\r\n marketName,\r\n builderId,\r\n brandName,\r\n communityId,\r\n communityName,\r\n imageUrl,\r\n isBasic,\r\n homeStatus,\r\n price,\r\n id: planId,\r\n city,\r\n stateAbbreviation,\r\n zip,\r\n };\r\n}\r\n\r\nconst listingInformationGetter = new Map();\r\n\r\nlistingInformationGetter.set(FavoriteType.Community, getListingInformationForPaidCommunity);\r\nlistingInformationGetter.set(FavoriteType.Spec, getListingInformationForPaidSpec);\r\nlistingInformationGetter.set(FavoriteType.Plan, getListingInformationForPaidPlan);\r\n\r\nexport default function getListingInformationFromDataset(dataset) {\r\n const listingType = FavoriteType.fromKey(dataset.type);\r\n const getListingInformation = listingInformationGetter.get(listingType);\r\n\r\n if (!getListingInformation) {\r\n return {}\r\n }\r\n\r\n return getListingInformation(dataset);\r\n}","import { map, filter, take, distinctUntilChanged } from 'rxjs';\r\nimport { store$, store } from '@redux/store';\r\nimport { userProfileSlice } from '../redux/slices';\r\nimport {\r\n selectFavorites,\r\n selectIsLoggedIn,\r\n selectIsProfileFavoritesLoaded,\r\n selectUserIdAndPendingSaves\r\n} from '../redux/selectors';\r\nimport FavoriteType from '../enums/favoriteType';\r\nimport onOpenModal from './modal';\r\nimport getListingInformationFromDataset from '../services/getListingInformationForPendingSave';\r\n\r\nconst actions = userProfileSlice.actions;\r\n\r\n// Get the favorite information from the card\r\nfunction getCardInformation(card) {\r\n const { type } = card.dataset;\r\n const url = new URL(card.querySelector('a').href).pathname;\r\n const listingInformation = getListingInformationFromDataset(card.dataset)\r\n\r\n return {\r\n listingInformation,\r\n type: FavoriteType.fromKey(type).type,\r\n url,\r\n };\r\n }\r\n\r\n// Check if a favorite is already saved\r\nfunction isFavoriteSaved(id, favorites) {\r\n return favorites.some(favorite => favorite.listingId === Number(id));\r\n}\r\n\r\n// Dispatch the save/delete action\r\nfunction dispatchSaveOrDeleteAction(payload, isSaved) {\r\n const action = isSaved ? actions.deleteFavorite(payload) : actions.saveFavorite(payload);\r\n store.dispatch(action);\r\n}\r\n\r\n/**\r\n * handles whether to save or delete a favorite from the user's profile on user's click.\r\n * @param {HTMLElement} icon the icon clicked by the user.\r\n */\r\nfunction toggleFavorite(icon){\r\n const card = icon.closest('[data-card]');\r\n const { userId, favorites } = store.getState().userProfile;\r\n const cardInfo = getCardInformation(card);\r\n const isSaved = isFavoriteSaved(cardInfo.listingInformation.id, favorites);\r\n const payload = { ...cardInfo, userId };\r\n\r\n dispatchSaveOrDeleteAction(payload, isSaved);\r\n}\r\n\r\n/**\r\n * updates the favorites icon on each card to show if the listing is already saved as a favorite.\r\n * @param {Array[Object]} favorites list of favorites from the user's profile.\r\n */\r\nfunction updateSavedFavorites(favorites) {\r\n const favoritesIds = favorites?.map(favorite => favorite.listingId) ?? [];\r\n\r\n const cards = document.querySelectorAll('[data-card]') ?? [];\r\n\r\n cards.forEach(card => {\r\n const { id } = card.dataset;\r\n const isSaved = favoritesIds.includes(Number(id));\r\n const favorite = card.querySelector('.icon__save');\r\n\r\n if(favorite){\r\n favorite.classList?.toggle('icon__saved', isSaved);\r\n if (isSaved) {\r\n favorite.setAttribute('data-qa', 'favorite_saved');\r\n }\r\n }\r\n })\r\n}\r\n\r\n// Save pending favorites on initial load to handle logged-out users \r\n// that have favorites saved in the cookie from before they logged-in.\r\nfunction savePendingFavorites(data) {\r\n const { userId, pendingSaves } = data;\r\n \r\n if(pendingSaves){\r\n pendingSaves.forEach(pendingSave => {\r\n\r\n // update the favorite with the new user id.\r\n store.dispatch(actions.saveFavorite({ ...pendingSave, userId }));\r\n });\r\n }\r\n}\r\n\r\n\r\n/*\r\nSubscribe to the store$ observable to listen for changes. When the user is logged in and the favorites profile\r\nis loaded, map the favorites and compare with the lasted version. If the favorites change, update the\r\nfavorite UI.\r\n*/\r\nstore$.pipe(\r\n filter(selectIsLoggedIn),\r\n filter(selectIsProfileFavoritesLoaded),\r\n map(selectFavorites),\r\n distinctUntilChanged((previous, current) => JSON.stringify(previous) === JSON.stringify(current))\r\n).subscribe(updateSavedFavorites);\r\n\r\n/*\r\nSubscribe to the store$ observable to listen for changes. When the user is logged in and the favorites profile\r\nis loaded, map the pending favorites and the user id, because this scenarios handles and save the pending favcorites\r\nwhen the user is not logged in. Take only the first value emmited in the observable.\r\n*/\r\nstore$.pipe(\r\n filter(selectIsLoggedIn),\r\n filter(selectIsProfileFavoritesLoaded),\r\n map(selectUserIdAndPendingSaves),\r\n take(1)\r\n).subscribe(savePendingFavorites);\r\n\r\n/**\r\n * Using event delegation to handle clicks on the favorites icon.\r\n */\r\ndocument.body.addEventListener('click', (event) => {\r\n const icon = event.target.closest('.icon__save');\r\n const state = store.getState();\r\n const isLogin = state?.userProfile?.isLogin;\r\n\r\n // if the click was inside the icon, save or delete the favorite.\r\n if (icon) {\r\n toggleFavorite(icon)\r\n\r\n if (!isLogin) {\r\n onOpenModal(event);\r\n }\r\n }\r\n});\r\n\r\nexport default updateSavedFavorites;","/**\r\n * This module encapsulates Google One Tap functionality.\r\n * Use this module as a facade so interactions with Google One Tap library are simplified for any subject interest\r\n * in accessing Google One Tap capabilities.\r\n * Google One Tap is a user authentication and sign-in solution provided by Google.\r\n * It allows users to sign in to websites and apps using their Google account with a single tap,\r\n * providing a streamlined and secure authentication experience. With Google One Tap, users can\r\n * easily access websites without the need to remember and enter complex passwords.\r\n */\r\n\r\nconst googleOneTapInstance = {\r\n isGoogleOneTapLoaded: false,\r\n isGoogleOneTapLoading: false,\r\n clientId: null,\r\n onAuthenticated: null,\r\n};\r\n\r\n// Interval to sample waiting for the load event; this number is arbitrary.\r\nconst googleOneTapLoadSampleRate = 100;\r\n\r\n/**\r\n * If the Google One Tap API fails to load, set the loading and loaded flags to false and reject the promise.\r\n * @param reject - A function that rejects the promise.\r\n */\r\nconst onGoogleOneTapError = (reject) => {\r\n googleOneTapInstance.isGoogleOneTapLoading = false;\r\n googleOneTapInstance.isGoogleOneTapLoaded = false;\r\n reject(new Error(`Unable to load Google One Tap API.`));\r\n};\r\n\r\n/**\r\n * When the Google One Tap API is loaded, set the isGoogleOneTapLoaded property of the googleOneTapInstance object to\r\n * true and resolve the promise.\r\n * @param resolve - A function that is called when the promise is resolved.\r\n */\r\nconst onGoogleOneTapLoaded = (resolve) => {\r\n window.google.accounts.id.initialize({\r\n client_id: googleOneTapInstance.clientId,\r\n callback: googleOneTapInstance.onAuthenticated,\r\n cancel_on_tap_outside: false,\r\n // Due to Intelligent Tracking Prevention (ITP), the normal One Tap UX doesn't work on\r\n // Chrome on iOS, Safari, or Firefox. A different UX is provided instead on these browsers.\r\n itp_support: true,\r\n use_fedcm_for_prompt: true,\r\n });\r\n googleOneTapInstance.isGoogleOneTapLoaded = true;\r\n resolve();\r\n};\r\n\r\n/**\r\n * Create a script element, set its source to the Google One Tap source,\r\n * set its onerror property to a function that rejects the promise,\r\n * set its onload property to a function that resolves the promise.\r\n * @param resolve - The function to call when the script has loaded.\r\n * @param reject - A function that is called when the promise is rejected.\r\n */\r\nconst appendGoogleOneTapScript = (resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = 'https://accounts.google.com/gsi/client';\r\n script.async = true;\r\n script.defer = true;\r\n script.onerror = onGoogleOneTapError.bind(this, reject);\r\n script.onload = onGoogleOneTapLoaded.bind(this, resolve);\r\n document.head.appendChild(script);\r\n};\r\n\r\n/**\r\n * If the Google One Tap is loaded, resolve the promise.\r\n * If not, wait the amount of time from googleOneTapLoadSampleRate and try again.\r\n * @param resolve - The resolve function of the promise.\r\n */\r\nconst isGoogleOneTapLoaded = (resolve) => {\r\n if (googleOneTapInstance.isGoogleOneTapLoaded) {\r\n resolve();\r\n } else {\r\n setTimeout(isGoogleOneTapLoaded.bind(null, resolve), googleOneTapLoadSampleRate);\r\n }\r\n};\r\n\r\n/**\r\n * Wait the amount of time from googleOneTapLoadSampleRate for Google One Tap to load, and then resolve the promise.\r\n * @returns A promise that will resolve when the Google One Tap API is loaded.\r\n */\r\nconst waitForGoogleOneTap = () =>\r\n new Promise((resolve) => {\r\n setTimeout(isGoogleOneTapLoaded.bind(null, resolve), googleOneTapLoadSampleRate);\r\n });\r\n\r\n/**\r\n * loadGoogleOneTap: if the Google One Tap instance is not loading, then load it.\r\n * If it is loading, wait for it to load.\r\n * If it is loaded, resolve the promise\r\n * @param googleOneTapLoaded - A function that is called when the Google One Tap instance has loaded.\r\n * @param googleOneTapErrored - A function that will be called if the Google One Tap script fails to load.\r\n * @returns A promise.\r\n */\r\nexport function loadGoogleOneTap({ onLibraryLoaded, onLibraryErrored, onAuthenticated, clientId }) {\r\n googleOneTapInstance.clientId = clientId;\r\n googleOneTapInstance.onAuthenticated = onAuthenticated;\r\n\r\n if (!googleOneTapInstance.isGoogleOneTapLoading) {\r\n // Set the Google One Tap instance as loading to prevent multiple requests.\r\n googleOneTapInstance.isGoogleOneTapLoading = true;\r\n return new Promise(appendGoogleOneTapScript).then(onLibraryLoaded).catch(onLibraryErrored);\r\n }\r\n\r\n if (googleOneTapInstance.isGoogleOneTapLoaded) {\r\n // If the Google One Tap instance is already loaded resolve the promise.\r\n return Promise.resolve().then(onLibraryLoaded).catch(onLibraryErrored);\r\n }\r\n\r\n // Otherwise wait to review if the Google One Tap instance has loaded.\r\n return waitForGoogleOneTap().then(onLibraryLoaded).catch(onLibraryErrored);\r\n}\r\n\r\n/**\r\n * showGoogleOneTapModal: this function will prompt the google one tap login modal to the user.\r\n */\r\nexport function showGoogleOneTapModal() {\r\n window.google.accounts.id.prompt();\r\n}\r\n\r\n/**\r\n * Hides the Google One Tap modal.\r\n */\r\nexport function hideGoogleOneTapModal() {\r\n window.google?.accounts?.id?.cancel();\r\n}\r\n","import { catchError, switchMap } from 'rxjs';\r\nimport { fromFetch } from 'rxjs/fetch';\r\nimport { googleOneTapLogin } from 'constants/routes'\r\n\r\n/**\r\n * loginUserWithGoogleOneTap: this function returns a fromFetch observable. This observable is in charge of\r\n * posting user authentication information from Google One Tap to NewHomeSource so the page can sucessfully\r\n * authenticate an user coming from Google One Tap authentication widget.\r\n * @param {*} parameters a set of information retrieved from Google One Tap containing information used to\r\n * authenticate an user in NewHomeSource.\r\n * @returns \r\n */\r\nconst loginUserWithGoogleOneTap = (parameters) => fromFetch(googleOneTapLogin, {\r\n method: 'POST',\r\n body: JSON.stringify(parameters),\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }).pipe(\r\n switchMap((response) => response.json()),\r\n catchError(() => {}),\r\n );\r\n\r\nexport default loginUserWithGoogleOneTap;","/**\r\n * parseJsonWebToken: This function is designed to parse a JSON Web Token (JWT) by extracting and decoding its payload.\r\n * JWTs consist of three parts: a header, a payload, and a signature, each separated by a period ('.').\r\n * This function focuses on the payload, which is base64-encoded.\r\n * The function decodes the base64-encoded payload and returns the corresponding JSON object.\r\n * @param {string} token the JWT from which the payload needs to be extracted and decoded.\r\n * @returns a json object containing the payload information retrieved from the JWT.\r\n */\r\nconst parseJsonWebToken = (token) => {\r\n const base64Url = token.split('.')[1];\r\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\r\n const jsonPayload = decodeURIComponent(window.atob(base64)\r\n .split('')\r\n .map((character) => '%' + ('00' + character.charCodeAt(0).toString(16)).slice(-2))\r\n .join(''));\r\n\r\n return JSON.parse(jsonPayload);\r\n}\r\n\r\nexport default parseJsonWebToken;","/**\r\n * This component works together with the information streamed from the store to accomplish functionality\r\n * related with the authentication in NewHomeSource using Google One Tap as the provider.\r\n * Interactions with Google One Tap are encapsulated in the googleOneTapLibrary.js facade, use this\r\n * component as the link between the interaction of the user in the page and that facade.\r\n */\r\n\r\nimport { store$, store } from '@redux/store';\r\nimport LoadingStatus from 'enums/loadingStatus';\r\nimport { combineLatest, distinctUntilChanged, filter, fromEvent, map, take } from 'rxjs';\r\nimport { hideGoogleOneTapModal, loadGoogleOneTap, showGoogleOneTapModal } from 'libraries/googleOneTapLibrary';\r\nimport { selectConfigurationGoogleOneTapClientId, selectModal } from 'layout/redux/selectors';\r\nimport { selectIsLoggedIn, selectGoogleOneTapLibraryLoadingStatus } from '../redux/selectors';\r\nimport { authenticationSlice } from '../redux/slices';\r\nimport loginUserWithGoogleOneTap from '../apis/loginWithGoogleOneTap';\r\nimport parseJsonWebToken from '../services/parseJsonWebToken';\r\n\r\nconst authActions = authenticationSlice.actions;\r\n\r\nconst onLibraryLoaded = () => store.dispatch(authActions.googleOneTapLibraryLoadingStatus(LoadingStatus.Succeeded));\r\nconst onLibraryErrored = () => store.dispatch(authActions.googleOneTapLibraryLoadingStatus(LoadingStatus.Failed));\r\n\r\nconst onPageLoaded$ = fromEvent(window, 'load');\r\n\r\n/**\r\n * onAuthenticated: callback executed when Google One Tap successfully authenticated an user.\r\n * @param {object} googleResponse containing the information needed to authenticate the user in NewHomeSource.\r\n */\r\nconst onAuthenticated = async (googleResponse) => {\r\n const idToken = parseJsonWebToken(googleResponse.credential);\r\n const parameters = {\r\n payload: {\r\n locale: idToken.locale,\r\n picture: idToken.picture,\r\n email: idToken.email,\r\n name: idToken.name,\r\n givenName: idToken.given_name,\r\n familyName: idToken.family_name,\r\n subject: idToken.sub,\r\n audience: idToken.aud,\r\n emailVerified: idToken.email_verified,\r\n notBeforeTimeSeconds: idToken.nbf,\r\n hostedDomain: idToken.hd,\r\n issuer: idToken.iss,\r\n issuedAtTimeSeconds: idToken.iat,\r\n expirationTimeSeconds: idToken.exp,\r\n jwtId: idToken.jti,\r\n },\r\n keepMeLogged: true,\r\n };\r\n\r\n loginUserWithGoogleOneTap(parameters).subscribe((data) => {\r\n if (data?.Success) {\r\n window.location.reload();\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * Subscribe to the store$ observable to listen for changes.\r\n * If the user is not logged in and the Google One Tap library is not loaded, we proceed\r\n * and load the library so we gain access to Google One Tap capabilities.\r\n * This obserbable streams just one time since every time a user logges in/out a full\r\n * page reload happens, so there is no need to keep listening to the store$ while the user\r\n * navigates in NewHomeSource.\r\n */\r\nconst googleOneTapConfiguration$ = store$.pipe(\r\n filter((state) => selectIsLoggedIn(state) === false),\r\n filter((state) => selectGoogleOneTapLibraryLoadingStatus(state) !== LoadingStatus.Succeeded.name),\r\n map((state) => ({\r\n onLibraryLoaded,\r\n onLibraryErrored,\r\n onAuthenticated,\r\n clientId: selectConfigurationGoogleOneTapClientId(state),\r\n })),\r\n distinctUntilChanged(),\r\n filter((googleOneTapInformation) => !!googleOneTapInformation.clientId),\r\n take(1)\r\n);\r\n\r\ncombineLatest([googleOneTapConfiguration$, onPageLoaded$])\r\n .pipe(map(([googleOneTapConfiguration]) => googleOneTapConfiguration))\r\n .subscribe(loadGoogleOneTap);\r\n\r\n/**\r\n * Subscribe to the store$ observable to listen for changes.\r\n * If the user is not logged in and Google One Tap library is loaded, then we prompt the modal\r\n * inviting the user to log in using Google One Tap.\r\n * This obserbable streams just one time since every time a user logges in/out a full\r\n * page reload happens, so there is no need to keep listening to the store$ while the user\r\n * navigates in NewHomeSource.\r\n */\r\nstore$\r\n .pipe(\r\n filter((state) => selectIsLoggedIn(state) === false),\r\n filter((state) => selectGoogleOneTapLibraryLoadingStatus(state) === LoadingStatus.Succeeded.name),\r\n take(1)\r\n )\r\n .subscribe(showGoogleOneTapModal);\r\n\r\n/**\r\n * Subscribe to the store$ observable to hide the Google One Tap modal\r\n * when a modal is opened.\r\n */\r\nstore$\r\n .pipe(\r\n filter((state) => Boolean(selectModal(state))),\r\n take(1)\r\n )\r\n .subscribe(hideGoogleOneTapModal);\r\n","/**\r\n * @public\r\n * getValidationCallback: get the validator callback to each fields in Sign Up modal.\r\n * @param {Object} signUpField with the information of the field \r\n * \r\n * @returns {Function} that will be execute when form need to be validate.\r\n */\r\nfunction getValidationCallback(signUpField) {\r\n switch(signUpField.name) {\r\n case 'FirstName':\r\n case 'LastName': {\r\n const regex = new RegExp(signUpField.validator.pattern);\r\n const hint = signUpField.validator.hint;\r\n return (name) => ({\r\n valid: regex.test(name) && name.length >= 2,\r\n hint\r\n });\r\n }\r\n case 'PostalCode': {\r\n const hint = signUpField.validator.hint;\r\n return (name) => ({\r\n valid: name.length === 0 || name.length === 5,\r\n hint\r\n });\r\n }\r\n default:\r\n return () => (true);\r\n }\r\n}\r\n\r\nexport default getValidationCallback;","import getValidationCallback from \"./signUpValidator\";\r\n\r\nconst configElement = document.querySelector('[data-auth0-parameter]');\r\nconst keepMeLoggedSection = document.querySelector('[data-keep-me-logged-section]');\r\nconst legalContentSection = document.querySelector('[data-legal-section]');\r\nconst configObject = JSON.parse(configElement.innerText);\r\nconfigObject.keepMeLoggedSection = keepMeLoggedSection;\r\nconfigObject.legalContentSection = legalContentSection;\r\nconfigObject.options.additionalSignUpFields.forEach((signUpField) => {\r\n const callback = getValidationCallback(signUpField);\r\n signUpField.validator = callback;\r\n});\r\n\r\n/**\r\n * @public\r\n * getBaseConfig: get the configuration object to show authentication modal.\r\n *\r\n * @returns { Object } with the configuration of authentication.\r\n */\r\nfunction getBaseConfig() {\r\n return Object.assign({}, configObject);\r\n}\r\n\r\nexport default getBaseConfig;\r\n","import { store$, store } from '@redux/store';\r\nimport { distinctUntilChanged, filter, map } from 'rxjs';\r\nimport { createAuthInstance, showModal } from 'libraries/authLibrary';\r\nimport { isAuthLibraryLoaded, isAuthModalOpen } from '../constants/auth0Constants';\r\nimport { modalSlice, authenticationSlice } from '../redux/slices';\r\nimport getBaseConfig from './auth0BaseConfiguration';\r\n\r\nconst { actions: modalActions, reducer: modalReducers } = modalSlice;\r\nconst { reducer: authenticationReducers } = authenticationSlice\r\n\r\nconst configuration = getBaseConfig();\r\nconst onCloseModal = () => store.dispatch(modalActions.onClose());\r\nconst initAuthentication = () => createAuthInstance(configuration, onCloseModal);\r\nconst openModal = () => showModal();\r\nconst userIdSelector = (state) => state?.userProfile?.userId;\r\nconst invalidValuesFilter = (value) => !!value;\r\n\r\nconst storeUserId = (userId) => { \r\n localStorage.setItem('UserId', userId)\r\n };\r\n\r\n // We have to execute initAuthentication when the modal is not opened.\r\n // So it means we need to track isAuthModalOpen.\r\n // Where if it was already on true, we should not continue the flow.\r\n // If it was on false, so we should check if the new isAuthModalOpen value is true or false to determine\r\n // whether to continue the flow.\r\nstore$.pipe(\r\n filter(isAuthLibraryLoaded),\r\n map(isAuthModalOpen),\r\n distinctUntilChanged(),\r\n filter(Boolean))\r\n .subscribe(initAuthentication);\r\n\r\nstore$.pipe(\r\n filter(isAuthModalOpen),\r\n distinctUntilChanged())\r\n .subscribe(openModal);\r\n\r\nstore$.pipe(\r\n map(userIdSelector),\r\n distinctUntilChanged(),\r\n filter(invalidValuesFilter)\r\n ).subscribe(storeUserId);\r\n\r\nstore.injectReducer('modal', modalReducers);\r\nstore.injectReducer('authentication', authenticationReducers);","import { store, store$ } from \"@redux/store\";\r\nimport { loadAuth0 } from \"libraries/authLibrary\";\r\nimport { filter, fromEvent, take } from \"rxjs\";\r\nimport { authenticationSlice, modalSlice } from '../redux/slices';\r\nimport { isAuthLibraryNotLoaded } from '../constants/auth0Constants';\r\n\r\nconst { actions: authenticationActions } = authenticationSlice;\r\nconst { actions: modalActions } = modalSlice;\r\n\r\n// Dispatch the redux slices.\r\nconst onAuthLibraryLoaded = () => store.dispatch(authenticationActions.authLibraryLoaded());\r\nconst onAuthLibraryErrored = (value) => store.dispatch(authenticationActions.authLibraryErrored(value));\r\nconst openModal = () => store.dispatch(modalActions.onOpen());\r\n\r\n// check if user is logged in\r\nconst isUserNotLogin = (state) => state?.userProfile?.isLogin === false;\r\n\r\n// check if the target for the event is a sign-in component.\r\nconst isSignInElement = (event) => event?.target?.closest('[data-component=\"sign-in\"]');\r\n\r\n/**\r\n * @private\r\n * onOpenModal: open the authentication modal.\r\n *\r\n */\r\nfunction onOpenModal(event) {\r\n event.preventDefault();\r\n loadAuth0(onAuthLibraryLoaded, onAuthLibraryErrored).then(openModal);\r\n}\r\n\r\n/**\r\n * @private\r\n * attachSignUpClick: method to attach when user is not loging and need to open auth0 modal.\r\n * \r\n */\r\nconst attachSignUpClick = () => {\r\n // user event delegation listen to click on a sign-in component\r\n fromEvent(document.body, 'click').pipe(\r\n filter(isSignInElement),\r\n filter(Boolean)\r\n ).subscribe(onOpenModal);\r\n}\r\n\r\nstore$.pipe(\r\n filter(isUserNotLogin),\r\n filter(isAuthLibraryNotLoaded),\r\n take(1))\r\n .subscribe(attachSignUpClick);\r\n\r\nexport default onOpenModal;","import { fromEvent, map } from 'rxjs';\r\nimport { store } from '@redux/store';\r\nimport { userProfileSlice } from '../redux/slices';\r\n\r\nconst actions = userProfileSlice.actions;\r\n\r\nconst updateNeustarInformation = (response) => store.dispatch(actions.updateNeustarInformation(response));\r\n\r\nfromEvent(document.body, 'neustarLoaded')\r\n .pipe(map((event) => event.detail))\r\n .subscribe(updateNeustarInformation);\r\n","/**\r\n * Module to manage cookies in the site.\r\n * \r\n * The main difference of this cookieManager between legacies files in GlobalResources14 is that\r\n * those older modules should only be used on pages that use vanillaJS and requireJS for module loading.\r\n */\r\nconst partnerIdElement = document.querySelector('[data-cookie-partner]');\r\n\r\nfunction getCookieName(name, isPartnerCookie) {\r\n if (isPartnerCookie && partnerIdElement) {\r\n return `${name}_${partnerIdElement.value}`\r\n }\r\n return name;\r\n}\r\n\r\n/**\r\n * @public\r\n * readCookie: searches for a cookie and returns its value.\r\n *\r\n * @param {string} name of the cookie to be retrieved.\r\n * @param {boolean} isPartnerCookie true if the cookie name should include the partner ID information,\r\n * otherwise false.\r\n */\r\nfunction readCookie(name, isPartnerCookie) {\r\n let cookieName = getCookieName(name, isPartnerCookie);\r\n cookieName += '=';\r\n\r\n const items = document.cookie.split(';') || [];\r\n const nameLength = cookieName.length;\r\n const cookieFound = items.find((item) => {\r\n if (item.trim().indexOf(cookieName) === 0) {\r\n return item;\r\n }\r\n return null;\r\n });\r\n\r\n if (!cookieFound) {\r\n return null;\r\n }\r\n\r\n return cookieFound.trim().substring(nameLength);\r\n}\r\n\r\n/**\r\n * @public\r\n * createCookieByMins: creates a new cookie for the domain, expering in minutes.\r\n *\r\n * @param {string} name of the cookie.\r\n * @param {any} value that will be stored in the cookie.\r\n * @param {number} minutes of expiration time for the cookie.\r\n * @param {boolean} isPartnerCookie true if the cookie name should include the partner ID information,\r\n * otherwise false.\r\n */\r\nfunction createCookieByMins(name, value, mins, isPartnerCookie) {\r\n let expires = '';\r\n const cookieName = getCookieName(name, isPartnerCookie);\r\n\r\n if (mins) {\r\n const date = new Date();\r\n date.setTime(date.getTime() + (mins * 60 * 1000));\r\n expires = '; expires=' + date.toGMTString();\r\n }\r\n\r\n document.cookie = `${cookieName}=${value}${expires}; path=/; secure`;\r\n}\r\n\r\nexport {\r\n readCookie,\r\n createCookieByMins\r\n};\r\n","import { debounce, fromEvent, interval } from 'rxjs';\r\nimport { readCookie, createCookieByMins } from 'modules/cookieManager';\r\n\r\n/**\r\n * @public\r\n * initUserInteractions: init the interactions between user and login cookie,\r\n * to notice when the interaction with the site is lost.\r\n * In a certain time, check the value of @see sessionAliveElement, if that number of minuts already happen and\r\n * the user don't interact the user need to be log out, for this reason we need to check the cookie IsUserLoggedIn\r\n */\r\nconst documentClicks$ = fromEvent(document, 'click')\r\n.pipe(\r\n debounce(() => interval(3000))\r\n);\r\nconst sessionAliveElement = document.querySelector('[data-session-alive-minutes]');\r\nconst sessionAliveMin = (sessionAliveElement && sessionAliveElement.value) || 10; \r\n\r\nconst updateSession = {\r\n next: () => {\r\n const isUserLoggedIn = readCookie('IsUserLoggedIn', true);\r\n if (isUserLoggedIn === 'True') {\r\n createCookieByMins('IsUserLoggedIn', 'True', sessionAliveMin, true);\r\n }\r\n }\r\n};\r\n\r\ndocumentClicks$.subscribe(updateSession);","const { store$ } = require(\"@redux/store\");\r\nconst { map, distinctUntilChanged, filter } = require(\"rxjs\");\r\n\r\n/**\r\n * TODO: Rebrand Code Improvement\r\n * This code helps to prevent affect not B1 version.\r\n * Remove the links on the backend.\r\n */\r\nconst componentLinksToInclude = ['sign-in', 'account', 'sign-out']\r\n\r\nconst subMenuAccountList = document.querySelector('[data-sub-menu-account-list]');\r\nconst subMenuAccountContainer = document.querySelector('[data-sub-menu-account-container]');\r\nconst linkSelector = (state) => state?.userProfile?.links;\r\nconst invalidValuesFilter = (value) => !!value && value.length > 0;\r\nconst drawMenu = (links) => {\r\n const linksToPaint = links.filter((link) => componentLinksToInclude.includes(link.component));\r\n linksToPaint.forEach(link => {\r\n const li = document.createElement('li');\r\n li.dataset.component = link?.component;\r\n const anchor = document.createElement('a');\r\n anchor.href = link?.url;\r\n anchor.innerText = link.text;\r\n anchor.classList.add('nhs-c-standard-link--medium-regular');\r\n if (link.ShouldOpenNewTab) {\r\n anchor.target = '_blank';\r\n anchor.rel = 'noopener noreferrer';\r\n }\r\n anchor.dataset.qa = link?.component;\r\n li.appendChild(anchor);\r\n subMenuAccountList.appendChild(li);\r\n if (link?.component === 'account') {\r\n const signInToggle = document.querySelector('[data-sign-in-toggle]');\r\n \r\n signInToggle.classList.remove('nhs-mq-icon__unauthed-user--24-large');\r\n signInToggle.classList.add('nhs-mq-icon__authed-user--24-large');\r\n }\r\n });\r\n subMenuAccountContainer.removeAttribute('hidden')\r\n };\r\n\r\nstore$.pipe(\r\n map(linkSelector),\r\n distinctUntilChanged(),\r\n filter(invalidValuesFilter)\r\n).subscribe(drawMenu);","/**\r\n * @public\r\n * isAuthLibraryLoaded: verify if the authetication library is loaded\r\n * @param {Object} state of the Redux store. \r\n *\r\n * @returns true when the library is already loaded otherwise false.\r\n */\r\nexport const isAuthLibraryLoaded = (state) => !!state?.authentication?.isAuthLibraryLoaded;\r\n\r\n/**\r\n * @public\r\n * isAuthLibraryNotLoaded: verify if the authetication library is not loaded\r\n * @param {Object} state of the Redux store. \r\n *\r\n * @returns true when the library is not already loaded otherwise false.\r\n */\r\nexport const isAuthLibraryNotLoaded = (state) => state?.authentication?.isAuthLibraryLoaded === false;\r\n\r\n/**\r\n * @public\r\n * isAuthModalOpen: verify if the authetication modal is currently open in the user screen.\r\n * @param {Object} state of the Redux store. \r\n *\r\n * @returns true when modal is opening otherwise false.\r\n */\r\nexport const isAuthModalOpen = (state) => !!state?.modal?.isAuthModalOpen;","export const pendingSavesSessionStorageKey = 'pendingFavorites';\r\nexport const favoritesSessionStorageKey = 'favorites';\r\n","/**\r\n * FavoriteType enum\r\n * Contains the different types of favorites that can be saved.\r\n */\r\nexport default class FavoriteType {\r\n static get Plan() {\r\n return this.getInstance('HomePlan');\r\n }\r\n\r\n static get Spec() {\r\n return this.getInstance('HomeSpec');\r\n }\r\n\r\n static get Community() {\r\n return this.getInstance('Community');\r\n }\r\n\r\n static get Builder() {\r\n return this.getInstance('Builder');\r\n }\r\n\r\n static fromKey(key) {\r\n const typeMap = {\r\n plan: FavoriteType.Plan,\r\n spec: FavoriteType.Spec,\r\n community: FavoriteType.Community,\r\n builder: FavoriteType.Builder,\r\n };\r\n return typeMap[key.toLowerCase()];\r\n }\r\n\r\n static getInstance(key) {\r\n if (!this.instances[key]) {\r\n this.instances[key] = new FavoriteType(key);\r\n }\r\n return this.instances[key];\r\n }\r\n\r\n constructor(type) {\r\n this.type = type;\r\n }\r\n\r\n toString() {\r\n return `${this.type}`;\r\n }\r\n}\r\n\r\nObject.defineProperty(FavoriteType, 'instances', { value: {} });\r\n","import FavoriteType from './enums/favoriteType';\r\nimport { \r\n deleteFavoriteEpic, \r\n fetchUserFavoritesEpic, \r\n fetchUserProfileEpic, \r\n saveFavoriteEpic } from './redux/epics';\r\nimport {\r\n selectEmail,\r\n selectFavorites,\r\n selectIsLoggedIn,\r\n selectIsProfileFavoritesLoaded,\r\n selectPendingSaves,\r\n selectUserProfileTrackingCommonProperties,\r\n selectUserLocation,\r\n selectNeustarSegment,\r\n selectNeustarStatus,\r\n selectNeustarInformation,\r\n} from './redux/selectors';\r\nimport { userProfileSlice } from './redux/slices';\r\n\r\nrequire('./components/userMenu');\r\nrequire('./components/sessionAliveInteraction');\r\nrequire('./components/mainAuthentication');\r\nrequire('./components/modal');\r\nrequire('./components/favorites');\r\nrequire('./redux/listeners');\r\nrequire('./components/neustarListener');\r\nrequire('./components/googleOneTapAuthentication');\r\n\r\nconst { actions: userProfileActions, reducer: userProfileReducers } = userProfileSlice;\r\n\r\nexport {\r\n selectPendingSaves,\r\n selectFavorites,\r\n selectIsProfileFavoritesLoaded,\r\n fetchUserProfileEpic,\r\n fetchUserFavoritesEpic,\r\n saveFavoriteEpic,\r\n deleteFavoriteEpic,\r\n userProfileActions,\r\n userProfileReducers,\r\n selectUserProfileTrackingCommonProperties,\r\n FavoriteType,\r\n selectIsLoggedIn,\r\n selectEmail,\r\n selectUserLocation,\r\n selectNeustarSegment,\r\n selectNeustarInformation,\r\n selectNeustarStatus,\r\n};\r\n","import { createListenerMiddleware, isAnyOf } from '@reduxjs/toolkit';\r\nimport { addMiddleware } from 'redux-dynamic-middlewares';\r\nimport { store } from '@redux/store';\r\nimport onListViewPaint from 'pages/searchResults/redux/actions';\r\nimport { userProfileSlice } from './slices';\r\nimport { favoritesSessionStorageKey, pendingSavesSessionStorageKey } from '../constants/sessionStorageConstants';\r\nimport { selectFavorites, selectIsLoggedIn } from './selectors';\r\nimport updateSavedFavorites from '../components/favorites';\r\n\r\nconst actions = userProfileSlice.actions;\r\nconst listenerMiddleware = createListenerMiddleware();\r\n\r\n// update the favorites data on session storage.\r\n// this is done when a save / delete is successful.\r\nlistenerMiddleware.startListening({\r\n matcher: isAnyOf(actions.deleteFavoriteFullfilled, actions.saveFavoriteFulfilled),\r\n effect: async () => {\r\n const state = store.getState();\r\n const { favorites } = state.userProfile;\r\n sessionStorage.setItem(favoritesSessionStorageKey, JSON.stringify(favorites));\r\n },\r\n});\r\n\r\n// update the pending saves data on session storage.\r\n// this is done when a save / delete hasn't been completed yet.\r\nlistenerMiddleware.startListening({\r\n matcher: isAnyOf(actions.saveFavorite, actions.deleteFavorite, actions.saveFavoriteFulfilled),\r\n effect: async () => {\r\n const state = store.getState();\r\n const { pendingSaves } = state.userProfile;\r\n\r\n sessionStorage.setItem(pendingSavesSessionStorageKey, JSON.stringify(pendingSaves));\r\n },\r\n});\r\n\r\n/* When the list view is paint, update the favorites if the user is login. */\r\nlistenerMiddleware.startListening({\r\n matcher: isAnyOf(onListViewPaint),\r\n effect: async () => {\r\n const state = store.getState();\r\n const isLoggedIn = selectIsLoggedIn(state);\r\n if (isLoggedIn) {\r\n const favorites = selectFavorites(state);\r\n updateSavedFavorites(favorites);\r\n }\r\n },\r\n});\r\n\r\naddMiddleware(listenerMiddleware.middleware);\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nexport const selectIsLoggedIn = (state) => state?.userProfile?.isLogin;\r\nexport const selectFavorites = (state) => state?.userProfile?.favorites;\r\nexport const selectPendingSaves = (state) => state?.userProfile?.pendingSaves;\r\nexport const selectIsProfileFavoritesLoaded = (state) => state?.userProfile?.isProfileFavoritesLoaded;\r\nexport const selectUserId = (state) => state?.userProfile?.userId;\r\nexport const selectEmail = (state) => state?.userProfile?.email;\r\nexport const selectName = (state) => state?.userProfile?.name;\r\nexport const selectPhone = (state) => state?.userProfile?.phone;\r\nexport const selectZip = (state) => state?.userProfile?.zip;\r\nexport const selectlivesOutside = (state) => state?.userProfile?.livesOutside;\r\n\r\nexport const selectNeustarStatus = (state) => state?.userProfile?.neustarStatus;\r\nexport const selectNeustarSegment = (state) => state?.userProfile?.neustarInformation?.s;\r\nexport const selectNeustarZip = (state) => state?.userProfile?.neustarInformation?.z;\r\nexport const selectNeustarAge = (state) => state?.userProfile?.neustarInformation?.a;\r\nexport const selectNeustarGender = (state) => state?.userProfile?.neustarInformation?.g;\r\nexport const selectNeustarInformation = (state) => state?.userProfile?.neustarInformation;\r\n\r\nexport const selectUserLocationCity = (state) => state?.userProfile?.userLocation?.userCity;\r\nexport const selectUserLocationCountry = (state) => state?.userProfile?.userLocation?.userCountry;\r\nexport const selectUserLocationMarketId = (state) => state?.userProfile?.userLocation?.userMarketId;\r\nexport const selectUserLocationState = (state) => state?.userProfile?.userLocation?.userState;\r\nexport const selectUserLocationZipCode = (state) => state?.userProfile?.userLocation?.userZipCode;\r\n\r\n/**\r\n * @public\r\n * selectGoogleOneTapLibraryLoadingStatus: returns the loading status of the Google One Tap Library.\r\n * @param {Object} state of the Redux store.\r\n *\r\n * @returns the loading status of the Google One Tap Library.\r\n */\r\nexport const selectGoogleOneTapLibraryLoadingStatus = (state) =>\r\n state?.authentication?.googleOneTapLibraryLoadingStatus;\r\n\r\n/** this selector is intended to expose useful properties when the user use the save to favorites feature\r\n * but it is not logged in.\r\n */\r\nexport const selectUserIdAndPendingSaves = createSelector(selectUserId, selectPendingSaves, (userId, pendingSaves) => ({\r\n userId,\r\n pendingSaves,\r\n}));\r\n\r\n/* It is using the `createSelector` function from the `@reduxjs/toolkit`\r\nlibrary to create a memoized selector. It takes in multiple input selectors\r\n(`selectUserLocationCity`, `selectUserLocationCountry`, `selectUserLocationMarketId`,\r\n`selectUserLocationState`, `selectUserLocationZipCode`) and a result function. */\r\nexport const selectUserLocation = createSelector(\r\n selectUserLocationCity,\r\n selectUserLocationCountry,\r\n selectUserLocationMarketId,\r\n selectUserLocationState,\r\n selectUserLocationZipCode,\r\n (userLocationCity, userLocationCountry, userLocationMarketId, userLocationState, userLocationZipCode) => ({\r\n userLocationCity,\r\n userLocationCountry,\r\n userLocationMarketId,\r\n userLocationState,\r\n userLocationZipCode,\r\n })\r\n);\r\n\r\n/** this selector is intended to expose all the properties that should be included as common tracking properties.\r\n * the idea behind this is tha here should be placed the selectors/props that are usually used in tracking events.\r\n * then the consumers will filter and take the props they need, this will just serve the information.\r\n */\r\nexport const selectUserProfileTrackingCommonProperties = createSelector(\r\n selectUserId,\r\n selectEmail,\r\n selectName,\r\n selectPhone,\r\n selectZip,\r\n selectlivesOutside,\r\n selectFavorites,\r\n selectNeustarSegment,\r\n selectNeustarZip,\r\n selectNeustarAge,\r\n selectNeustarGender,\r\n selectIsLoggedIn,\r\n (\r\n userId,\r\n email,\r\n name,\r\n phone,\r\n zip,\r\n livesOutside,\r\n favorites,\r\n neustarSegment,\r\n neustarZip,\r\n neustarAge,\r\n neustarGender,\r\n isLoggedIn\r\n ) => ({\r\n userId,\r\n email,\r\n name,\r\n phone,\r\n zip,\r\n livesOutside,\r\n favorites,\r\n neustarSegment,\r\n neustarZip,\r\n neustarAge,\r\n neustarGender,\r\n isLoggedIn,\r\n })\r\n);\r\n","import LoadingStatus from \"enums/loadingStatus\";\r\nimport { favoritesSessionStorageKey, pendingSavesSessionStorageKey } from \"../constants/sessionStorageConstants\";\r\n\r\n// Read \"pendingSaves\" session storage on initial load\r\nconst pendingSavesData= sessionStorage.getItem(pendingSavesSessionStorageKey, false);\r\n// Assign value to a list\r\nconst pendingSaves = pendingSavesData ? JSON.parse(pendingSavesData) : [];\r\n\r\n// Read \"favorites\" information on initial load\r\nconst favoritesData = sessionStorage.getItem(favoritesSessionStorageKey, false);\r\nconst favorites = favoritesData ? JSON.parse(favoritesData) : [];\r\n\r\nexport default {\r\n name: '',\r\n email: '',\r\n phone: '',\r\n zip: '',\r\n livesOutside: false,\r\n pendingSaves,\r\n favorites,\r\n hasUserOptedIntoRecommendationEmail: true,\r\n realtorQuestion : '',\r\n neustarStatus: LoadingStatus.Idle.toString()\r\n}","import { createSlice } from '@reduxjs/toolkit';\r\nimport { camelCaseObjectKeys } from 'utils/camelCase';\r\nimport LoadingStatus from 'enums/loadingStatus';\r\nimport userProfileInitialState from './initialState';\r\n\r\nconst userProfileSlice = createSlice({\r\n name: 'userProfile',\r\n initialState: userProfileInitialState,\r\n reducers: {\r\n apply: (state, action) => \r\n // return the new state with camel case object keys and isLoading set to false\r\n {\r\n\r\n const profile = camelCaseObjectKeys(action.payload);\r\n\r\n state.email = profile.email;\r\n state.id = profile.id;\r\n state.imageProfile = profile.imageProfile;\r\n state.isLogin = profile.isLogin;\r\n state.links = profile.links;\r\n state.livesOutside = profile.livesOutside;\r\n state.name = profile.name?.trim().replace(/\\s+/g, ' ');\r\n state.phone = profile.phone;\r\n state.preferredContactMethod = profile.preferredContactMethod;\r\n state.hasUserOptedIntoRecommendationEmail = profile.hasUserOptedIntoRecommendationEmail;\r\n state.realtorQuestion = profile.realtorQuestion;\r\n state.userId = profile.userId;\r\n state.userLocation = profile.userLocation;\r\n state.zip = profile.zip;\r\n state.isLoading = false;\r\n },\r\n applyFavorites: (state, action) => {\r\n const payload = camelCaseObjectKeys(action.payload);\r\n state.favorites = payload?.favorites;\r\n state.isProfileFavoritesLoaded = true;\r\n },\r\n update: (state, action) => {\r\n const userInfo = {...state, ...action.payload};\r\n state.name = userInfo.name?.trim().replace(/\\s+/g, ' ');\r\n state.email = userInfo.email;\r\n state.phone = userInfo.phone;\r\n state.zip = userInfo.zip;\r\n state.livesOutside = userInfo.livesOutside;\r\n state.preferredContactMethod = userInfo.preferredContactMethod || state.preferredContactMethod;\r\n state.hasUserOptedIntoRecommendationEmail = userInfo.hasUserOptedIntoRecommendationEmail ??\r\n state.hasUserOptedIntoRecommendationEmail;\r\n state.realtorQuestion = userInfo.realtorQuestion || state.realtorQuestion;\r\n },\r\n fetch: (state) => {\r\n state.isLoading = true;\r\n },\r\n handleError: (state) => {\r\n state.isLoading = false;\r\n },\r\n saveFavorite: (state, action) => {\r\n // check if the action.payload.id is already in the pendingSaves array, if not, add it.\r\n const pendingSaveExists = state.pendingSaves.some((favorite) => \r\n Number(favorite.listingInformation.id) === Number(action.payload.listingInformation.id)\r\n );\r\n\r\n if (!pendingSaveExists) {\r\n\r\n // add the favorite to the pending array, in case the API call fails or the user is logged out\r\n // and we need to retry the API call once the user logs in.\r\n state.pendingSaves.push(action.payload);\r\n }\r\n\r\n },\r\n deleteFavorite: () => {},\r\n deleteFavoriteFullfilled: (state, action) => {\r\n const payload = action.payload;\r\n state.favorites = state.favorites.filter((favorite) => favorite.listingId !== payload.listingId);\r\n },\r\n saveFavoriteFulfilled: (state, action) => {\r\n const newFavorite = action.payload.data.favorite;\r\n\r\n // remove the favorite from the pending array\r\n state.pendingSaves = state.pendingSaves.filter(\r\n (favorite) => Number(favorite.listingInformation.id) !== Number(newFavorite.listingId)\r\n );\r\n \r\n const favoriteExists = state.favorites.find((favorite) => favorite.listingId === newFavorite.listingId);\r\n \r\n if (!favoriteExists) {\r\n // add the favorite to the favorites array\r\n state.favorites = [...state.favorites, newFavorite];\r\n }\r\n },\r\n updateNeustarInformation: (state, action) => {\r\n const neustarInformation = action.payload;\r\n state.neustarInformation = neustarInformation;\r\n state.neustarStatus = LoadingStatus.Succeeded.toString()\r\n },\r\n}});\r\n\r\nconst authenticationSlice = createSlice({\r\n name: 'authentication',\r\n initialState: {\r\n isAuthLibraryLoaded: false,\r\n isAuthModalOpen: false,\r\n googleOneTapLibraryLoadingStatus: null,\r\n },\r\n reducers: {\r\n authLibraryLoaded: (state) => {\r\n state.isAuthLibraryLoaded = true;\r\n },\r\n authLibraryErrored: (state) => {\r\n state.isAuthLibraryLoaded = false;\r\n },\r\n googleOneTapLibraryLoadingStatus: (state, action) => {\r\n state.googleOneTapLibraryLoadingStatus = action.payload.name;\r\n },\r\n },\r\n});\r\n\r\nconst modalSlice = createSlice({\r\n name: 'modal',\r\n initialState: {\r\n isAuthModalOpen: false\r\n },\r\n reducers: {\r\n onOpen: (state) => {\r\n state.isAuthModalOpen = true;\r\n },\r\n onClose: (state) => {\r\n state.isAuthModalOpen = false;\r\n }\r\n },\r\n});\r\n\r\n// Extract the action creators object and the reducer\r\nexport { userProfileSlice, authenticationSlice, modalSlice };\r\n","import { store } from '@redux/store';\r\nimport GoogleAnalyticsEvent from 'dataTransferObjects/googleAnalyticsEvent';\r\nimport uiStateSlice from 'layout/redux/uiStateSlice';\r\nimport { filter, fromEvent, map } from 'rxjs';\r\n\r\nconst footerLinks = document.querySelector('[data-footer-links]');\r\nconst eventsMapper = new Map();\r\n\r\n// Quick Links\r\neventsMapper.set('footer_55_plus', new GoogleAnalyticsEvent('Site Links', 'Footer', 'New 55+ Communities'));\r\neventsMapper.set('footer_condos_townhouses', new GoogleAnalyticsEvent('Outbound Links', 'Footer', 'Search New Condos'));\r\neventsMapper.set('footer_custom_homes_center', new GoogleAnalyticsEvent('Site Links', 'Footer', 'Custom Home Buyers'));\r\neventsMapper.set('footer_first_time_homebuyers',\r\n new GoogleAnalyticsEvent('Site Links', 'Footer', 'New First Time Buyers Communities'));\r\neventsMapper.set('footer_luxury_homes', new GoogleAnalyticsEvent('Outbound Links', 'Footer', 'Search Luxury Homes'));\r\neventsMapper.set('footer_modular_homes', new GoogleAnalyticsEvent('Outbound Links', 'Footer', 'Search Modular Homes'));\r\n// Resources\r\neventsMapper.set('footer_learning_center', new GoogleAnalyticsEvent('Outbound Links', 'Footer', 'Learning Center'));\r\neventsMapper.set('footer_ratings_and_reviews',\r\n new GoogleAnalyticsEvent('Outbound Links', 'Footer', 'TrustBuilder Ratings Review'));\r\neventsMapper.set('footer_real_estate_professionals',\r\n new GoogleAnalyticsEvent('Outbound Links', 'Footer', 'New Home Source Professional'));\r\neventsMapper.set('footer_casas_nuevas', new GoogleAnalyticsEvent('Outbound Links', 'Footer', 'Casas Nuevas'));\r\neventsMapper.set('footer_start_fresh_buy_new',\r\n new GoogleAnalyticsEvent('Outbound Links', 'Footer', 'StartFreshBuyNew'));\r\n// Helpful Links\r\neventsMapper.set('footer_about_us', new GoogleAnalyticsEvent('Site Links', 'Footer', 'About us'));\r\neventsMapper.set('footer_contact_us', new GoogleAnalyticsEvent('Site Links', 'Footer', 'Contact us'));\r\neventsMapper.set('footer_list_your_homes', new GoogleAnalyticsEvent('Outbound Links', 'Footer', 'List Your Homes'));\r\neventsMapper.set('footer_unsubscribe', new GoogleAnalyticsEvent('Site Links', 'Footer', 'Unsubscribe'));\r\neventsMapper.set('footer_accessibility', new GoogleAnalyticsEvent('Site Links', 'Footer', 'Accessibility statement'));\r\neventsMapper.set('footer_terms_of_use', new GoogleAnalyticsEvent('Site Links', 'Footer', 'Terms of use'));\r\neventsMapper.set('footer_privacy_policy', new GoogleAnalyticsEvent('Site Links', 'Footer', 'Privacy policy'));\r\neventsMapper.set('footer_site_help', new GoogleAnalyticsEvent('Site Links', 'Footer', 'Site Help'));\r\neventsMapper.set('footer_do_not_sell_my_info', new GoogleAnalyticsEvent('Site Links', 'Footer', 'Do Not Sell My Info'));\r\n// Footer Social Site Links\r\neventsMapper.set('footer_facebook_link', new GoogleAnalyticsEvent('Outbound Links', 'Social', 'Facebook'));\r\neventsMapper.set('footer_pinterest_link', new GoogleAnalyticsEvent('Outbound Links', 'Social', 'Pinterest'));\r\neventsMapper.set('footer_twitter_link', new GoogleAnalyticsEvent('Outbound Links', 'Social', 'Twitter'));\r\neventsMapper.set('footer_youtube_link', new GoogleAnalyticsEvent('Outbound Links', 'Social', 'Ytube'));\r\neventsMapper.set('footer_instagram_link', new GoogleAnalyticsEvent('Outbound Links', 'Social', 'Instagram'));\r\n\r\nfunction trackGAEvent(key) {\r\n const googleAnalyticsDTO = eventsMapper.get(key);\r\n store.dispatch(uiStateSlice.actions.trackUserEvent({googleAnalyticsDTO}))\r\n}\r\n\r\nfromEvent(footerLinks, 'click')\r\n .pipe(\r\n map((element)=> element.target.closest('[data-footer-link]')),\r\n filter(Boolean),\r\n map((element)=> element.dataset.footerLink), \r\n filter(Boolean)\r\n )\r\n .subscribe(trackGAEvent);\r\n\r\n","import { store } from '@redux/store';\r\nimport GoogleAnalyticsEvent from 'dataTransferObjects/googleAnalyticsEvent';\r\nimport uiStateSlice from 'layout/redux/uiStateSlice';\r\nimport { filter, fromEvent, map } from 'rxjs';\r\n\r\nconst siteLinks = 'Site Links';\r\nconst navigation = 'Navigation';\r\nconst navLinks = document.querySelector('[data-nav-links]');\r\nconst eventsMapper = new Map();\r\n\r\n// Advertise\r\neventsMapper.set('header_advertise', new GoogleAnalyticsEvent('Outbound Links', navigation, 'Builder Advertising'));\r\n// Resources\r\neventsMapper.set('header_reviews', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'Trustbuilder Ratings & Reviews clicks'));\r\neventsMapper.set('header_learn', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'Homebuying Learning Center clicks'));\r\neventsMapper.set('header_first_time_homebuyers', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'First Time Home Buyers clicks'));\r\neventsMapper.set('header_custom_homes_center', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'Custom Home Buyers clicks'));\r\neventsMapper.set('header_55_plus', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n '55+ Home Buyers clicks'));\r\neventsMapper.set('header_military_buyers', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'For the Military clicks'));\r\neventsMapper.set('header_homebuying_tools', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'Home Buying Tools clicks'));\r\neventsMapper.set('header_affordability_calculator', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'Affordability Calculator clicks'));\r\neventsMapper.set('header_home_buying_tools', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'Homeownership Cost Calculator clicks'));\r\neventsMapper.set('header_credit_score', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'Credit Score clicks'));\r\neventsMapper.set('header_mortgage_calculator', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'Mortgage Calculator clicks'));\r\neventsMapper.set('header_get_preapproved', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'Get Pre-Approved clicks'));\r\neventsMapper.set('header_prep_home_for_sale', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'Prep Home for Sale clicks'));\r\neventsMapper.set('header_homeowners_insurance', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'Homeowners Insurance'));\r\neventsMapper.set('header_get_offers', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'Get Offers clicks'));\r\neventsMapper.set('header_home_buying_tools_landing', new GoogleAnalyticsEvent(siteLinks, navigation,\r\n 'See All Homebuying Tools'));\r\n\r\nconst metroLinksContainer = document.querySelector('[data-metro-links]');\r\n\r\nfunction trackGAMetroLinkEvent(element) {\r\n const linkvalue = element.text;\r\n const googleAnalyticsDTO = new GoogleAnalyticsEvent(siteLinks, 'Header Metro Link', `${linkvalue} Clicks`) \r\n \r\n store.dispatch(uiStateSlice.actions.trackUserEvent({googleAnalyticsDTO}))\r\n}\r\n\r\nfromEvent(metroLinksContainer, 'click')\r\n .pipe(\r\n map((element)=> element.target.closest('a')),\r\n filter(Boolean)\r\n )\r\n .subscribe(trackGAMetroLinkEvent);\r\n\r\nconst stateLinksContainer = document.querySelector('[data-state-links]');\r\n\r\nfunction trackGAStateLinkEvent(element) {\r\n const linkvalue = element.text;\r\n const googleAnalyticsDTO = new GoogleAnalyticsEvent(siteLinks, 'Header State Link', `${linkvalue} Clicks`) \r\n \r\n store.dispatch(uiStateSlice.actions.trackUserEvent({googleAnalyticsDTO}))\r\n}\r\n\r\nfromEvent(stateLinksContainer, 'click')\r\n .pipe(\r\n map((element)=> element.target.closest('a')),\r\n filter(Boolean)\r\n )\r\n .subscribe(trackGAStateLinkEvent);\r\n\r\nfunction trackGAEvent(key) {\r\n const googleAnalyticsDTO = eventsMapper.get(key);\r\n store.dispatch(uiStateSlice.actions.trackUserEvent({googleAnalyticsDTO}))\r\n}\r\n\r\nfromEvent(navLinks, 'click')\r\n .pipe(\r\n map((element)=> element.target.closest('[data-nav-link]')),\r\n filter(Boolean),\r\n map((element)=> element.dataset.navLink), \r\n filter(Boolean)\r\n )\r\n .subscribe(trackGAEvent);\r\n\r\n","import { fromFetch } from 'rxjs/fetch';\r\nimport UrlExtensions from 'utils/urlExtension';\r\n\r\n/**\r\n * @private\r\n *\r\n * The function creates a URL with UTM parameters.\r\n *\r\n * @returns a URL with UTM parameters, as well as the values for gclid, httpReferer, and entranceUrl.\r\n */\r\nfunction createUtmUrl() {\r\n const location = window.location;\r\n const path = '/setUtmParameters';\r\n const utmSource = UrlExtensions.getParameterValue(location, 'utm_source') ||\r\n UrlExtensions.getParameterValueFromHash(location, 'utm_source');\r\n const refer = UrlExtensions.getParameterValue(location, 'refer') ||\r\n UrlExtensions.getParameterValueFromHash(location, 'refer');\r\n const utmMedium = UrlExtensions.getParameterValue(location, 'utm_medium') ||\r\n UrlExtensions.getParameterValueFromHash(location, 'utm_medium');\r\n const utmCampaign = UrlExtensions.getParameterValue(location, 'utm_campaign') ||\r\n UrlExtensions.getParameterValueFromHash(location, 'utm_campaign');\r\n const utmTerm = UrlExtensions.getParameterValue(location, 'utm_term') ||\r\n UrlExtensions.getParameterValueFromHash(location, 'utm_term');\r\n const utmContent = UrlExtensions.getParameterValue(location, 'utm_content') ||\r\n UrlExtensions.getParameterValueFromHash(location, 'utm_content');\r\n const gclid = UrlExtensions.getParameterValue(location, 'gclid') ||\r\n UrlExtensions.getParameterValueFromHash(location, 'gclid');\r\n const httpReferer = document.referrer;\r\n const entranceUrl = document.location.href;\r\n\r\n const url = UrlExtensions.setParameters(path, {\r\n refer: UrlExtensions.removeQueryString(refer),\r\n utm_source: utmSource,\r\n utm_medium: utmMedium,\r\n utm_campaign: utmCampaign,\r\n utm_term: utmTerm,\r\n utm_content: utmContent,\r\n gclid,\r\n httpReferer,\r\n entranceUrl,\r\n });\r\n return url;\r\n}\r\n\r\nexport default fromFetch(createUtmUrl(), {\r\n 'credentials': 'include',\r\n 'Accept': 'application/json',\r\n});\r\n","import { createSlice } from '@reduxjs/toolkit';\r\nimport LoadingStatus from 'enums/loadingStatus';\r\nimport { camelCaseObjectKeys } from 'utils/camelCase';\r\n\r\nconst utmParametersSlice = createSlice({\r\n name: 'utmParameters',\r\n initialState: {\r\n isLoading: LoadingStatus.Idle,\r\n },\r\n reducers: {\r\n apply: (state, action) => {\r\n const utm = camelCaseObjectKeys(action.payload);\r\n\r\n state.utmSource = utm.utmSource;\r\n state.utmMedium = utm.utmMedium;\r\n state.utmCampaign = utm.utmCampaign;\r\n state.utmTerm = utm.utmTerm;\r\n state.utmContent = utm.utmContent;\r\n state.entranceUrl = utm.entranceUrl;\r\n state.googleClickId = utm.googleClickId;\r\n state.httpReferer = utm.httpReferer;\r\n state.refer = utm.refer;\r\n state.isLoading = LoadingStatus.Succeeded;\r\n },\r\n fetch: (state) => {\r\n state.isLoading = LoadingStatus.Loading;\r\n },\r\n handleError: (state) => {\r\n state.isLoading = LoadingStatus.Failed;\r\n },\r\n },\r\n});\r\n\r\n// Extract the action creators object and the reducer\r\nexport default utmParametersSlice;\r\n","import { catchError, from, of, mergeMap, switchMap } from 'rxjs';\r\nimport { ofType } from 'redux-observable';\r\nimport setUtmParameters$ from '../apis/setUtmParameters';\r\nimport utmParametersSlice from './slices';\r\n\r\nconst actions = utmParametersSlice.actions;\r\n\r\nexport default (action$) =>\r\n action$.pipe(\r\n ofType(actions.fetch.type),\r\n switchMap(() =>\r\n setUtmParameters$.pipe(\r\n switchMap((response) => from(response.json()).pipe(mergeMap((data) => of(actions.apply(data))))),\r\n catchError((err) => of(actions.handleError(err)))\r\n )\r\n )\r\n );\r\n","import { epic$, store } from '@redux/store';\r\nimport fetchUtmParameters from './redux/epics';\r\nimport utmParametersSlice from './redux/slices';\r\nimport { isLoading, selectUtmTrackingCommonProperties } from './redux/selectors';\r\n\r\n\r\nconst { actions, reducer } = utmParametersSlice;\r\n\r\nepic$.next(fetchUtmParameters);\r\nstore.injectReducer('utmParameters', reducer);\r\n\r\nexport {\r\n fetchUtmParameters,\r\n isLoading,\r\n actions as utmParametersActions,\r\n reducer as utmParametersReducers,\r\n selectUtmTrackingCommonProperties,\r\n};\r\n","import { createSlice } from '@reduxjs/toolkit';\r\nimport LoadingStatus from 'enums/loadingStatus';\r\n\r\n/* Defines a Redux slice named `configuration` to share the configuration data across the application. */\r\nconst configurationSlice = createSlice({\r\n name: 'configuration',\r\n initialState: {\r\n resourceDomain: null,\r\n loading: LoadingStatus.Idle.toString(),\r\n error: null,\r\n },\r\n reducers: {\r\n fetchConfiguration: (state) => {\r\n state.loading = LoadingStatus.Loading.toString();\r\n },\r\n fetchConfigurationError: (state, action) => {\r\n state.loading = LoadingStatus.Failed.toString();\r\n state.error = action.payload;\r\n },\r\n fetchConfigurationFulfilled: (state, action) => {\r\n state.resourceDomain = action.payload.ResourceDomain;\r\n state.segmentApiKey = action.payload.SegmentApiKey;\r\n state.neustarApiKey = action.payload.NeustarApiKey;\r\n state.imageResizeService = action.payload.IRSDomain;\r\n state.googleOneTapClientId = action.payload.GoogleOneTapClientId;\r\n state.isMarkerAutoScrollFeatureEnabled = action.payload.IsMarkerAutoScrollFeatureEnabled;\r\n state.loading = LoadingStatus.Succeeded.toString();\r\n state.error = null;\r\n },\r\n },\r\n});\r\nexport default configurationSlice;\r\n","import { ofType } from 'redux-observable';\r\nimport { catchError, mergeMap, switchMap } from 'rxjs/operators';\r\nimport { of } from 'rxjs';\r\nimport configurationSlice from './configurationSlice';\r\nimport getConfiguration$ from '../apis/getConfiguration';\r\n\r\nconst actions = configurationSlice.actions;\r\n\r\nexport default (action$) =>\r\n action$.pipe(\r\n ofType(actions.fetchConfiguration.type),\r\n switchMap(() =>\r\n getConfiguration$().pipe(\r\n mergeMap((response) => of(actions.fetchConfigurationFulfilled(response))),\r\n catchError((error) => of(actions.fetchConfigurationError(error.message)))\r\n )\r\n )\r\n );","import { epic$, store } from '@redux/store';\r\nimport { totalDeliveryValueReducers } from 'features/totalDeliveryValue';\r\nimport { userProfileActions, userProfileReducers } from 'features/userProfile';\r\nimport { utmParametersActions } from 'features/utm';\r\nimport configurationSlice from './redux/configurationSlice';\r\nimport getConfigurationEpic from './redux/epics';\r\nimport uiStateSlice from './redux/uiStateSlice';\r\n\r\nepic$.next(getConfigurationEpic);\r\n\r\nstore.dispatch(userProfileActions.fetch());\r\nstore.dispatch(utmParametersActions.fetch());\r\nstore.injectReducer('userProfile', userProfileReducers);\r\nstore.injectReducer('totalDeliveryValue', totalDeliveryValueReducers);\r\nstore.injectReducer('configuration', configurationSlice.reducer);\r\nstore.injectReducer('uiState', uiStateSlice.reducer);\r\nstore.dispatch(configurationSlice.actions.fetchConfiguration());\r\nrequire('./components/modal');\r\nrequire('./components/back');\r\nrequire('./components/hamburgerMenu');\r\nrequire('./components/dataLayer');\r\nrequire('./components/responsiveLayoutHandler');\r\n\r\nrequire('./analytics/header');\r\nrequire('./analytics/footer');\r\nrequire('./redux/listeners');\r\n","import { fromFetch } from 'rxjs/fetch';\r\n\r\nexport default () => {\r\n const requestObject = {\r\n method: 'GET',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n },\r\n selector: (response) => response.json(),\r\n };\r\n return fromFetch('/configuration/getvalues', requestObject);\r\n};","/**\r\n * Handles the functionality of the back label for mobile navigation.\r\n * \r\n * This script adds event listeners to sub-navigation labels and the back label\r\n * to toggle the visibility of the back label when navigating through the mobile menu.\r\n */\r\n\r\nconst subnavLabels = document.querySelectorAll('[data-sub-nav-label]');\r\nconst backLabel = document.querySelector('[data-back-menu-label]');\r\n\r\nfunction handleSubnavLabelClick() {\r\n // Show the back label when a sub-navigation label is clicked\r\n backLabel.classList.add('nhs-c-nav__show-back-label');\r\n}\r\n\r\nsubnavLabels.forEach(label => {\r\n label.addEventListener('click', handleSubnavLabelClick);\r\n});\r\n\r\n// Function to handle back label click\r\nfunction handleBackLabelClick() {\r\n // Hide the back label when it is clicked\r\n backLabel.classList.remove('nhs-c-nav__show-back-label');\r\n}\r\n\r\n// Check if the back label element exists\r\nif (backLabel) {\r\n // Add a click event listener to the back label\r\n backLabel.addEventListener('click', handleBackLabelClick);\r\n}","import { store$ } from '@redux/store';\r\nimport { map, distinctUntilChanged, filter } from 'rxjs';\r\n\r\nconst userLocationSelector = (state) => state?.userProfile?.userLocation;\r\nconst validValuesFilter = (value) => !!value;\r\nconst isDataLayerValid = () => !!window.dataLayer;\r\n\r\n/**\r\n * A function that push information to dataLayer.\r\n */\r\nconst updateDataLayer = (data) => {\r\n setTimeout(() => window.dataLayer.push(data), 0);\r\n};\r\n\r\n/**\r\n * Update the dataLayer when user information is ready.\r\n * The user location information must be pushed to the dataLayer always.\r\n */\r\nstore$\r\n .pipe(filter(isDataLayerValid), map(userLocationSelector), distinctUntilChanged(), filter(validValuesFilter))\r\n .subscribe(updateDataLayer);\r\n\r\nexport default updateDataLayer;\r\n","import { store$ } from '@redux/store';\r\nimport LayoutBreakpoint from 'layout/enums/layoutBreakpoint';\r\nimport { selectLayoutBreakpoint } from 'layout/redux/selectors';\r\nimport { combineLatest, distinctUntilChanged, fromEvent, map } from 'rxjs';\r\n\r\n/**\r\n * Adds a CSS class to the `` element to prevent scrolling.\r\n * \r\n * This function applies the `nhs-u-overflow--hidden` class to the `` \r\n * element, which is typically styled to disable scrolling (e.g., `overflow: hidden`).\r\n */\r\nconst bodyNoScrollable = () => document.body.classList.add('nhs-u-overflow--hidden');\r\n\r\n/**\r\n * Removes the CSS class from the `` element to allow scrolling.\r\n * \r\n * This function removes the `nhs-u-overflow--hidden` class from the `` \r\n * element, re-enabling scrolling behavior if it was previously disabled.\r\n */\r\nconst bodyScrollable = () => document.body.classList.remove('nhs-u-overflow--hidden');\r\n\r\n/**\r\n * Handles the state of the hamburger menu and controls the ``'s scrollability.\r\n * \r\n * This function determines whether to disable scrolling on the `` based on \r\n * the state of the hamburger menu (`isHamburgerMenuOpen`) and the current layout \r\n * breakpoint (`layoutBreakPoint`). If the menu is open and the layout breakpoint \r\n * is smaller than `LayoutBreakpoint.Big`, scrolling is disabled.\r\n * \r\n * @param {Object} options.layoutBreakPoint - The current layout breakpoint (e.g., \"Small\", \"Medium\", \"Big\").\r\n * @param {boolean} options.isHamburgerMenuOpen - Whether the hamburger menu is open.\r\n */\r\nconst handlerHamburgerMenu = ({ layoutBreakPoint, isHamburgerMenuOpen }) => {\r\n if (isHamburgerMenuOpen && layoutBreakPoint !== LayoutBreakpoint.Big) {\r\n bodyNoScrollable();\r\n return;\r\n }\r\n\r\n bodyScrollable();\r\n}\r\n\r\nconst onHamburgerMenuClicked$ = fromEvent(document.body, 'hamburgerMenuClicked').pipe(\r\n map((event) => event.detail.data.isOpen)\r\n);\r\n\r\nconst onLayoutBreakPointChanged$ = store$.pipe(\r\n map(selectLayoutBreakpoint),\r\n distinctUntilChanged(),\r\n)\r\n\r\ncombineLatest([onLayoutBreakPointChanged$, onHamburgerMenuClicked$]).pipe(\r\n map(([layoutBreakPoint, isHamburgerMenuOpen]) => ({\r\n layoutBreakPoint, isHamburgerMenuOpen\r\n }))\r\n).subscribe(handlerHamburgerMenu)\r\n","import { filter, merge, tap } from 'rxjs';\r\nimport { store } from '@redux/store';\r\nimport uiSlice from '../redux/uiStateSlice';\r\nimport modalService from '../services/modalService';\r\nimport Overlay from './overlay';\r\n\r\nconst modal$ = modalService.getHtml();\r\nconst modalHtml = {\r\n modalContainer: document.querySelector('.modal__box'),\r\n previousHtml: null,\r\n};\r\nconst disconnectedCallbacks = new Map();\r\nconst registeredCallbacks = new Map();\r\nconst overlay = new Overlay();\r\n\r\nconst onDisconnected = (callbackName) => {\r\n const callbacksDisconnected = registeredCallbacks.get(callbackName) ?? [];\r\n callbacksDisconnected.filter((fn) => typeof fn === 'function')?.forEach((fn) => fn());\r\n\r\n // A callback that's registered for the HTML Ready and the Disconnected events are assumed\r\n // to run together, so remove them from the map as the modal is removed from the HTML.\r\n if (disconnectedCallbacks.has(callbackName)) {\r\n disconnectedCallbacks.delete(callbackName);\r\n registeredCallbacks.delete(callbackName);\r\n }\r\n};\r\n\r\nconst closeModal = () => {\r\n const modalInformation = store.getState().uiState?.modalInformation;\r\n const callbackName = modalInformation?.name;\r\n\r\n onDisconnected(callbackName);\r\n modalHtml.modalContainer.classList.remove('modal--expanded');\r\n overlay.remove();\r\n modalHtml.modalContainer.innerHTML = null;\r\n modalHtml.previousCallback = null;\r\n modalHtml.previousHtml = null;\r\n\r\n store.dispatch(uiSlice.actions.clearModal());\r\n\r\n // trigger a custom event that contains the information for the previously closed modal.\r\n const event = new CustomEvent('modalClosed', {\r\n detail: {\r\n modalInformation,\r\n },\r\n });\r\n\r\n setTimeout(() => {\r\n document.body.dispatchEvent(event);\r\n }, 100);\r\n};\r\n\r\nconst disconnectCallback = (data) => {\r\n const name = data.name;\r\n const fn = data.fn;\r\n const existingCallbacks = disconnectedCallbacks.get(name) ?? [];\r\n const callbacks = [fn, ...existingCallbacks];\r\n disconnectedCallbacks.set(name, callbacks);\r\n};\r\n\r\nconst openModal = (html) => {\r\n const callbackName = store.getState().uiState?.modalInformation?.name;\r\n const previouscallbackName = store.getState().uiState?.modalInformation?.previousName;\r\n const callbacksRegistered = registeredCallbacks.get(callbackName) ?? [];\r\n\r\n modalHtml.previousCallback = callbackName;\r\n modalHtml.previousHtml = modalHtml.modalContainer.innerHTML?.trim();\r\n\r\n if (modalHtml.previousHtml) {\r\n onDisconnected(previouscallbackName);\r\n }\r\n\r\n modalHtml.modalContainer.innerHTML = html.value;\r\n modalHtml.modalContainer.classList.add('modal--expanded');\r\n overlay.create();\r\n callbacksRegistered.filter((fn) => typeof fn === 'function')?.forEach((fn) => fn());\r\n};\r\n\r\nconst registerCallback = (data) => {\r\n const name = data.name;\r\n const fn = data.fn;\r\n const existingCallbacks = registeredCallbacks.get(name) ?? [];\r\n const callbacks = [fn, ...existingCallbacks];\r\n registeredCallbacks.set(name, callbacks);\r\n};\r\n\r\nconst setPreviousHtml = () => {\r\n onDisconnected(modalHtml.previousCallback);\r\n modalHtml.modalContainer.innerHTML = null;\r\n modalService.setHtml({ payload: modalHtml.previousHtml });\r\n};\r\n\r\nconst close = modal$.pipe(\r\n filter((data) => data.action === 'clearHtml'),\r\n tap(closeModal)\r\n);\r\nconst disconnect = modal$.pipe(\r\n filter((data) => data.action === 'onHtmlRemoved'),\r\n tap(disconnectCallback)\r\n);\r\nconst open = modal$.pipe(\r\n filter((data) => data.action === 'setHtml'),\r\n tap(openModal)\r\n);\r\nconst register = modal$.pipe(\r\n filter((data) => data.action === 'onHtmlReady'),\r\n tap(registerCallback)\r\n);\r\nconst previous = modal$.pipe(\r\n filter((data) => data.action === 'setPreviousHtml'),\r\n tap(setPreviousHtml)\r\n);\r\nmerge(close, disconnect, open, register, previous).subscribe();\r\n","export default class Overlay {\r\n constructor() {\r\n this.overlayId = 'overlayElement';\r\n this.overlayClass = 'overlay';\r\n this.isMacOS = navigator.userAgent.indexOf('Mac') > -1;\r\n }\r\n\r\n getOverlay() {\r\n return document.getElementById(this.overlayId);\r\n }\r\n\r\n create() {\r\n requestAnimationFrame(() => {\r\n if (this.getOverlay()) {\r\n return;\r\n }\r\n\r\n if (this.isMacOS) {\r\n document.body.classList.add('macOS');\r\n }\r\n \r\n document.body.classList.add('body-no-scrolleable');\r\n document.body.insertAdjacentHTML('beforeend', this.getHtml());\r\n });\r\n }\r\n\r\n remove() {\r\n requestAnimationFrame(() => {\r\n const overlay = this.getOverlay();\r\n if (!overlay) {\r\n return;\r\n }\r\n\r\n if (this.isMacOS) {\r\n document.body.classList.remove('macOS');\r\n }\r\n \r\n document.body.classList.remove('body-no-scrolleable');\r\n \r\n overlay.remove();\r\n });\r\n }\r\n\r\n getHtml() {\r\n return `\r\n
`;\r\n }\r\n}\r\n","import { store } from '@redux/store';\r\nimport LayoutBreakpoint from 'layout/enums/layoutBreakpoint'\r\nimport uiStateSlice from 'layout/redux/uiStateSlice';\r\n\r\n/*\r\n * Handler to set the layout size.\r\n */\r\nconst responsiveLayoutHandler = (event) => {\r\n if (event.matches) {\r\n const layoutBreakpoint = LayoutBreakpoint.getLayoutBreakpointByMediaQuery(event.media)\r\n store.dispatch(uiStateSlice.actions.updateLayoutBreakpoint(layoutBreakpoint));\r\n }\r\n};\r\n\r\n/*\r\n * Method to configure the listiner when the layout size change.\r\n */\r\nconst configureLayoutHandler = (layoutBreakpoint) => {\r\n const mediaQueryList = window.matchMedia(layoutBreakpoint.getMediaQuery());\r\n mediaQueryList.addEventListener('change', responsiveLayoutHandler);\r\n \r\n // This invoke is to get the first (onLoad document) layout size of the site.\r\n responsiveLayoutHandler(mediaQueryList);\r\n}\r\n\r\n\r\n/*\r\n * Method to raise the configurations listiners when the layout size change.\r\n */\r\nconst configureLayoutHandlers = () => {\r\n const layoutBreakpoints = LayoutBreakpoint.toList();\r\n for (let i = 0; i < layoutBreakpoints.length; i+=1) {\r\n configureLayoutHandler(layoutBreakpoints[i])\r\n }\r\n}\r\n\r\nconfigureLayoutHandlers();","export default class PageLayout {\r\n static get Communities() {\r\n return this.getInstance('communities-communities');\r\n }\r\n\r\n static get Homes() {\r\n return this.getInstance('homes-homes');\r\n }\r\n\r\n static get Builders() {\r\n return this.getInstance('AllProducts-builders');\r\n }\r\n \r\n static get BoylLocations() {\r\n return this.getInstance('boyl-locations');\r\n }\r\n\r\n static get CustomHomes() {\r\n return this.getInstance('custom-homes');\r\n }\r\n\r\n static get ManufacturedLocations() {\r\n return this.getInstance('manufactured-locations');\r\n }\r\n\r\n static get ManufacturedHomes() {\r\n return this.getInstance('manufactured-homes');\r\n }\r\n\r\n static fromKey(key) {\r\n const statusMap = {\r\n 'communities-communities': PageLayout.Communities,\r\n 'homes-homes': PageLayout.Homes,\r\n 'AllProducts-builders': PageLayout.Builders,\r\n 'boyl-locations': PageLayout.BoylLocations,\r\n 'custom-homes': PageLayout.CustomHomes,\r\n 'manufactured-locations': PageLayout.ManufacturedLocations,\r\n 'manufactured-homes': PageLayout.ManufacturedHomes\r\n };\r\n return statusMap[key];\r\n }\r\n\r\n static getInstance(key) {\r\n if (!this.instances[key]) {\r\n this.instances[key] = new PageLayout(key);\r\n }\r\n return this.instances[key];\r\n }\r\n\r\n constructor(name) {\r\n this.name = name;\r\n }\r\n\r\n toString() {\r\n return `${this.name}`;\r\n }\r\n}\r\n\r\nObject.defineProperty(PageLayout, 'instances', { value: {} });\r\n","export default class ResultPresentationType {\r\n\r\n /**\r\n * The static get Pagination function returns an instance of the 'Pagination' class.\r\n * @returns The method is returning an instance of the 'Pagination' class.\r\n */\r\n static get Pagination() {\r\n return this.getInstance('Pagination');\r\n }\r\n \r\n /**\r\n * The function returns an instance of the 'InfiniteScrolling' class.\r\n * @returns The method `get InfiniteScrolling()` is returning the result of calling the `getInstance`\r\n * method with the argument `'InfiniteScrolling'`.\r\n */\r\n static get InfiniteScrolling() {\r\n return this.getInstance('InfiniteScrolling');\r\n }\r\n \r\n /**\r\n * The function \"fromKey\" takes a key as input and returns the corresponding value from a\r\n * predefined map.\r\n * @param key - The `key` parameter is a string that represents a key in the `statusMap` object.\r\n * @returns The value associated with the given key in the statusMap object is being returned.\r\n */\r\n static fromKey(key) {\r\n const statusMap = {\r\n 'Pagination': ResultPresentationType.Pagination,\r\n 'InfiniteScrolling': ResultPresentationType.InfiniteScrolling,\r\n };\r\n return statusMap[key];\r\n }\r\n \r\n /**\r\n * Gets an instance of a ResultPresentationType object based on a given name.\r\n * If the instance does not already exist, it creates a new instance using the configuration provided.\r\n *\r\n * @param name a unique identifier used to retrieve or create an instance of the ResultPresentationType class.\r\n * @param configuration an object that contains various properties and values that are used to configure\r\n * the instance of the ResultPresentationType class that is being created.\r\n *\r\n * @returns an instance of `ResultPresentation` that corresponds to the given `name`.\r\n */\r\n static getInstance(key) {\r\n if (!this.instances[key]) {\r\n this.instances[key] = new ResultPresentationType(key);\r\n }\r\n return this.instances[key];\r\n }\r\n \r\n /**\r\n * This is a constructor function that takes a name as a parameter and sets the name\r\n * @param name -The `name` property is a string that represents the name of the\r\n * configuration\r\n */\r\n constructor(name) {\r\n this.name = name;\r\n }\r\n \r\n /**\r\n * Method that returns the name property of an object as a string.\r\n * @returns returns the `name` property of that object as a string.\r\n */\r\n toString() {\r\n return `${this.name}`;\r\n }\r\n }\r\n \r\n Object.defineProperty(ResultPresentationType, 'instances', { value: {} });\r\n ","/* \r\n * Enum for layout breakpoints. Represents the minimum width values for different layout sizes.\r\n*/\r\nexport default class LayoutBreakpoint { \r\n /*\r\n * Represents small screens with a minimum width of 380px and max 768px\r\n */\r\n static get Small() {\r\n return this.getInstance(380, `(max-width: 768px)`, \"Small\");\r\n }\r\n \r\n /*\r\n * Represents medium screens with a minimum width of 768px and max 1023px\r\n */\r\n static get Medium() {\r\n return this.getInstance(768, `(min-width: 768px) and (max-width: 1023px)`, \"Medium\");\r\n }\r\n \r\n /*\r\n * Represents Big screens with a minimum width of 1024px\r\n */\r\n static get Big() {\r\n return this.getInstance(1024, `(min-width: 1024px)`, \"Big\");\r\n }\r\n\r\n static getInstance(key, mediaQuery, text) {\r\n if (!this.instances[key]) {\r\n this.instances[key] = new LayoutBreakpoint(key, mediaQuery, text);\r\n }\r\n\r\n return this.instances[key];\r\n }\r\n \r\n /*\r\n * Get the layoutBreakpoint by the media query\r\n */\r\n static getLayoutBreakpointByMediaQuery(mediaQuery){\r\n switch(mediaQuery){\r\n case LayoutBreakpoint.Small.getMediaQuery():\r\n return LayoutBreakpoint.Small;\r\n case LayoutBreakpoint.Medium.getMediaQuery():\r\n return LayoutBreakpoint.Medium;\r\n case LayoutBreakpoint.Big.getMediaQuery():\r\n return LayoutBreakpoint.Big;\r\n default:\r\n return LayoutBreakpoint.Small;\r\n }\r\n }\r\n\r\n /*\r\n * All LayoutBreakpoints values\r\n */\r\n static toList(){\r\n return [\r\n LayoutBreakpoint.Small,\r\n LayoutBreakpoint.Medium,\r\n LayoutBreakpoint.Big,\r\n ];\r\n }\r\n\r\n constructor(value, mediaQuery, text) {\r\n this.value = value;\r\n this.mediaQuery = mediaQuery;\r\n this.text = text;\r\n }\r\n \r\n toString() {\r\n return this.text;\r\n }\r\n\r\n getValue(){\r\n return this.value;\r\n }\r\n\r\n getMediaQuery(){\r\n return this.mediaQuery;\r\n }\r\n\r\n\r\n}\r\n \r\nObject.defineProperty(LayoutBreakpoint, 'instances', { value: {} });\r\n ","import { createListenerMiddleware } from '@reduxjs/toolkit';\r\nimport { addMiddleware } from 'redux-dynamic-middlewares';\r\nimport { userProfileActions } from 'features/userProfile';\r\nimport GoogleAnalyticsCustomDimensions from 'constants/googleAnalyticsCustomDimension';\r\nimport layoutStateSlice from './uiStateSlice';\r\nimport updateDataLayer from '../components/dataLayer';\r\n\r\nconst layoutActions = layoutStateSlice.actions;\r\nconst listenerMiddleware = createListenerMiddleware();\r\n\r\nfunction updateDataLayerEntry(value) {\r\n setTimeout(() => { updateDataLayer(value) }, 500);\r\n}\r\n\r\n// This listener is in charge to return a custom dimension value to it's default state.\r\nlistenerMiddleware.startListening({\r\n type: layoutActions.trackUserEvent.type,\r\n effect: (action) => {\r\n const trackedEvent = action.payload;\r\n if (GoogleAnalyticsCustomDimensions.PriceReduction().getName() in trackedEvent.googleAnalyticsDTO)\r\n {\r\n updateDataLayerEntry(({\r\n [GoogleAnalyticsCustomDimensions.PriceReduction().getName()]: null,\r\n }));\r\n }\r\n if (GoogleAnalyticsCustomDimensions.CommunityName().getName() in trackedEvent.googleAnalyticsDTO)\r\n {\r\n updateDataLayerEntry(({\r\n [GoogleAnalyticsCustomDimensions.CommunityName().getName()]: null,\r\n }));\r\n }\r\n if (GoogleAnalyticsCustomDimensions.BrandName().getName() in trackedEvent.googleAnalyticsDTO)\r\n {\r\n updateDataLayerEntry(({\r\n [GoogleAnalyticsCustomDimensions.BrandName().getName()]: null,\r\n }));\r\n }\r\n if (GoogleAnalyticsCustomDimensions.SpecId().getName() in trackedEvent.googleAnalyticsDTO)\r\n {\r\n updateDataLayerEntry(({\r\n [GoogleAnalyticsCustomDimensions.SpecId().getName()]: null,\r\n }));\r\n }\r\n if (GoogleAnalyticsCustomDimensions.PlanId().getName() in trackedEvent.googleAnalyticsDTO)\r\n {\r\n updateDataLayerEntry(({\r\n [GoogleAnalyticsCustomDimensions.PlanId().getName()]: null,\r\n }));\r\n }\r\n if (GoogleAnalyticsCustomDimensions.CommunityId().getName() in trackedEvent.googleAnalyticsDTO)\r\n {\r\n updateDataLayerEntry(({\r\n [GoogleAnalyticsCustomDimensions.CommunityId().getName()]: null,\r\n }));\r\n }\r\n if (GoogleAnalyticsCustomDimensions.IsPaid().getName() in trackedEvent.googleAnalyticsDTO)\r\n {\r\n updateDataLayerEntry(({\r\n [GoogleAnalyticsCustomDimensions.IsPaid().getName()]: null,\r\n }));\r\n }\r\n }\r\n});\r\n\r\nlistenerMiddleware.startListening({\r\n type: userProfileActions.saveFavoriteFulfilled.type,\r\n effect: () => {\r\n updateDataLayerEntry(({\r\n [GoogleAnalyticsCustomDimensions.SpecId().getName()]: null,\r\n [GoogleAnalyticsCustomDimensions.PlanId().getName()]: null,\r\n [GoogleAnalyticsCustomDimensions.CommunityId().getName()]: null,\r\n [GoogleAnalyticsCustomDimensions.BrandName().getName()]: null,\r\n [GoogleAnalyticsCustomDimensions.IsPaid().getName()]: null,\r\n }));\r\n }\r\n});\r\n\r\naddMiddleware(listenerMiddleware.middleware);","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nexport const selectUiState = (state) => state?.uiState;\r\nexport const selectFetchingModal = (state) => state?.uiState.isFetchingModal;\r\nexport const selectDisplaySkeleton = (state) => state?.uiState?.displayCardGridSkeleton;\r\nexport const selectPageLayout = (state) => state?.uiState?.pageLayout;\r\nexport const selectResultsPresentationType = (state) => state?.uiState?.resultsPresentationType;\r\nexport const selectModal = (state) => state?.uiState?.modalInformation;\r\nexport const selectModalListingInformation = (state) => state?.uiState?.modalInformation?.listingInformation;\r\nexport const selectLoading = (state) => state?.configuration?.loading;\r\nexport const selectConfigurationResourceDomain = (state) => state?.configuration?.resourceDomain;\r\nexport const selectConfigurationSegmentApiKey = (state) => state?.configuration?.segmentApiKey;\r\nexport const selectConfigurationNeustarApiKey = (state) => state?.configuration?.neustarApiKey;\r\nexport const selectConfigurationImageResizeService = (state) => state?.configuration?.imageResizeService;\r\nexport const selectConfigurationGoogleOneTapClientId = (state) => state?.configuration?.googleOneTapClientId;\r\nexport const selectIsMarkerAutoScrollFeatureEnabled = (state) => state?.configuration?.isMarkerAutoScrollFeatureEnabled;\r\nexport const selectLayoutBreakpoint = (state) => state?.uiState?.layoutBreakpoint;\r\n\r\n/**\r\n * Selector to get all the host name used in NewHomeSource site.\r\n */\r\nexport const selectResourcesHostNames = createSelector(\r\n selectConfigurationResourceDomain,\r\n selectConfigurationImageResizeService,\r\n (resourceDomain, imageResizeService) => ({\r\n staticImagesHostName: resourceDomain,\r\n imageResizeService,\r\n })\r\n);","import PageLayout from \"layout/constants/pageLayoutNames\";\r\nimport ResultPresentationType from \"layout/constants/resultPresentationType\";\r\n\r\nconst lookup = {\r\n [PageLayout.Communities]: ResultPresentationType.Pagination.toString(),\r\n [PageLayout.Homes]: ResultPresentationType.Pagination.toString(),\r\n [PageLayout.Builders]: ResultPresentationType.InfiniteScrolling.toString(),\r\n [PageLayout.BoylLocations]: ResultPresentationType.Pagination.toString(),\r\n [PageLayout.CustomHomes]: ResultPresentationType.Pagination.toString(),\r\n [PageLayout.ManufacturedLocations]: ResultPresentationType.Pagination.toString(),\r\n [PageLayout.ManufacturedHomes]: ResultPresentationType.Pagination.toString(),\r\n};\r\n\r\nconst getResultPresentationByLayoutName = (layoutName) => lookup[layoutName];\r\n\r\nexport default getResultPresentationByLayoutName;","import { createSlice } from '@reduxjs/toolkit';\r\nimport LoadingStatus from 'enums/loadingStatus';\r\nimport getResultPresentationByLayoutName from 'layout/services/resultsPresentationService';\r\n\r\nconst uiStateSlice = createSlice({\r\n name: 'uiState',\r\n initialState: {\r\n isFetchingModal: false,\r\n modalInformation: null,\r\n },\r\n reducers: {\r\n clearModal: (state) => {\r\n state.isFetchingModal = false;\r\n state.modalInformation = null;\r\n },\r\n fetchModal: (state, action) => {\r\n state.isFetchingModal = action.payload.isFetchingModal;\r\n },\r\n fetchModalError: (state) => {\r\n state.isFetchingModal = false;\r\n },\r\n fetchModalFulfilled: (state) => {\r\n state.isFetchingModal = false;\r\n },\r\n updatePageLayout: (state, action) => {\r\n state.pageLayout = action.payload;\r\n state.resultsPresentationType = getResultPresentationByLayoutName(action.payload);\r\n },\r\n updateCardGridSkeleton: (state, action) => {\r\n state.displayCardGridSkeleton = action.payload === LoadingStatus.Loading;\r\n },\r\n focusedListingInformation: (state, action) => {\r\n state.focusedListing = action.payload;\r\n },\r\n modalInformation: (state, action) => {\r\n const previousName = state.modalInformation?.name;\r\n const newModalInformation = {...action.payload};\r\n // We don't need to save the events information into the state. So\r\n // we are removing them before assigning to the state.\r\n delete newModalInformation.googleAnalyticsDTO;\r\n\r\n state.modalInformation = {\r\n ...state.modalInformation,\r\n ...newModalInformation,\r\n };\r\n\r\n // the \"previousName\" property should change only when a new name is being set\r\n if (previousName) {\r\n state.modalInformation.previousName = previousName;\r\n }\r\n },\r\n updateLayoutBreakpoint: (state, action) => {\r\n state.layoutBreakpoint = action.payload;\r\n },\r\n /* A reducer that does nothing because it's used for Google Analytics Redux Beacon. */\r\n trackUserEvent: () => {},\r\n },\r\n});\r\n\r\nexport default uiStateSlice;\r\n","import { Subject } from 'rxjs';\r\n\r\nconst subject = new Subject();\r\n\r\nexport default {\r\n clearHtml: () => subject.next({ action: 'clearHtml' }),\r\n getHtml: () => subject.asObservable(),\r\n onHtmlReady: (data) => subject.next({ action: 'onHtmlReady', ...data }),\r\n onHtmlRemoved: (data) => subject.next({ action: 'onHtmlRemoved', ...data }),\r\n setHtml: (data) => subject.next({ action: 'setHtml', value: data.payload }),\r\n setPreviousHtml: () => subject.next({ action: 'setPreviousHtml' }),\r\n};\r\n","const authObject = {\r\n isAuth0Loaded: false,\r\n isAuth0Loading: false,\r\n lock: null,\r\n settings: null,\r\n Auth0Lock: null,\r\n};\r\n\r\nconst authLoadSampleRate = 300;\r\n\r\n/**\r\n * @private\r\n * onAuth0Error: reject the promise when authetication library is loaded.\r\n *\r\n * @param {Function} reject the promise.\r\n */\r\nconst onAuth0Error = (reject) => {\r\n authObject.isAuth0Loading = false;\r\n authObject.isAuth0Loaded = false;\r\n reject(new Error(`Unable to load Auth0 API.`));\r\n};\r\n\r\n/**\r\n * @private\r\n * onAuth0Loaded: resolve the promise when authentication library is loaded \r\n * @param {Function} resolve the promise.\r\n */\r\nconst onAuth0Loaded = (resolve) => {\r\n authObject.isAuth0Loaded = true;\r\n resolve();\r\n};\r\n\r\n/**\r\n * @private\r\n * loadAuth0Module: import the auth0 lock module.\r\n *\r\n * @param {Function} resolve the promise\r\n * @param {Function} reject the promise\r\n */\r\nconst loadAuth0Module = async (resolve, reject) => {\r\n await import('../../styles/components/auth0.scss');\r\n import('auth0-lock').then(({ Auth0Lock }) => {\r\n authObject.Auth0Lock = Auth0Lock;\r\n onAuth0Loaded.call(this, resolve);\r\n })\r\n .catch(onAuth0Error.bind(this, reject));\r\n};\r\n\r\n/**\r\n * @private\r\n * isAuthLoaded: resolve the promise when auth0 is loaded. Retry when auth0 is loading.\r\n *\r\n * @param {Function} resolve the promise. \r\n */\r\nconst isAuthLoaded = (resolve) => {\r\n if (authObject.isAuth0Loaded) {\r\n resolve();\r\n } else {\r\n setTimeout(isAuthLoaded.bind(null, resolve), authLoadSampleRate);\r\n }\r\n};\r\n\r\n/**\r\n * @private\r\n * waitForAuth: wait for Authentication library, waiting a @see authLoadSampleRate milliseconds.\r\n * \r\n * @returns {Promise} notify that authentication library is loaded.\r\n */\r\nconst waitForAuth = () =>\r\n new Promise((resolve) => {\r\n setTimeout(isAuthLoaded.bind(null, resolve), authLoadSampleRate);\r\n});\r\n\r\n/**\r\n * @private\r\n * getSignUpFieldByName: get the sign up field by name in setting authetication object.\r\n * @param {String} name of the sign up field.\r\n * \r\n * @returns {Object} with the sign up field information. \r\n */\r\nconst getSignUpFieldByName = (name) => authObject.settings.options\r\n.additionalSignUpFields.find(item => item.name === name) || {};\r\n\r\n/**\r\n * @private\r\n * goToNextPageAfterLogIn: redirect to the next page after user is autheticated.\r\n * @param {String} config with the next page to go.\r\n * \r\n */\r\nconst goToNextPageAfterLogIn = (nextPage) => {\r\n if (nextPage) {\r\n window.location = nextPage;\r\n } else {\r\n window.location.reload();\r\n }\r\n};\r\n\r\n/**\r\n * @private\r\n * onSignUpReady: method to execute when sign up form is visible to the user.\r\n * This method helps to:\r\n * Avoid numbers in zip code input\r\n * Disable zip code when user is outside of United States.\r\n */\r\nconst onSignUpReady = () => {\r\n const zip = document.querySelector('[name=\"PostalCode\"]');\r\n zip.setAttribute('maxlength', 5);\r\n zip.onkeypress = function (evt) {\r\n const charCode = (evt.which) ? evt.which : evt.keyCode;\r\n if (charCode > 31 && (charCode < 48 || charCode > 57)) { return false; }\r\n return true;\r\n };\r\n const outsideUS = document.querySelector('[name=\"OutsideUS\"]');\r\n outsideUS.onchange = function () {\r\n zip.disabled = outsideUS.checked;\r\n };\r\n const outSideUsItem = getSignUpFieldByName(\"OutsideUS\");\r\n if (outSideUsItem.prefill === 'true') {\r\n zip.disabled = true;\r\n }\r\n\r\n const outsideUSContainer = outsideUS.closest('div');\r\n const fieldsContainer = outsideUSContainer.parentElement;\r\n const lastFormElement = fieldsContainer.lastElementChild;\r\n\r\n lastFormElement.after(authObject.settings.legalContentSection.content.cloneNode(true));\r\n};\r\n\r\n/**\r\n * @private\r\n * onAuthenticated: method to execute after user is autheticated.\r\n * It helps to request NHS servers to create the cookies and get the main information of the user.\r\n * \r\n * @param {Object} authResult information with the user token. \r\n */\r\nconst onAuthenticated = async (authResult) => {\r\n document.querySelectorAll('.auth0-lock-close-button').forEach((element) => {\r\n element.remove();\r\n });\r\n\r\n const accessToken = authResult.accessToken;\r\n const keepMeLogged = document.querySelector('[name=\"KeepMeLogged\"]');\r\n let keepMeLoggedValue = false;\r\n if (keepMeLogged) {\r\n keepMeLoggedValue = keepMeLogged.checked;\r\n }\r\n const url = authObject.settings.basic.auth0Authenticated;\r\n const parameters = {\r\n accessToken,\r\n keepMeLogged: keepMeLoggedValue\r\n };\r\n\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(parameters),\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n });\r\n\r\n if (response.ok) {\r\n const data = await response.json();\r\n\r\n if (data.Success) {\r\n if (authObject.settings.afterLogin) {\r\n authObject.settings.afterLogin();\r\n }\r\n goToNextPageAfterLogIn(authObject.settings.nextPage);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * @private\r\n * onSigninReady: method to execute when sign in form is visible to the user.\r\n * This method helps to:\r\n * Create the keep me login checkbox from authentication modal.\r\n */\r\nconst onSigninReady = () => {\r\n const referenceElement = document.querySelector('.auth0-lock-alternative');\r\n const parentContainer = referenceElement.parentElement;\r\n parentContainer.insertBefore(\r\n authObject.settings.keepMeLoggedSection.content.cloneNode(true),\r\n referenceElement);\r\n referenceElement.after(authObject.settings.legalContentSection.content.cloneNode(true));\r\n};\r\n\r\n/**\r\n * @public\r\n * loadAuth0: load the auth0 library.\r\n * @param {Function} authLoaded to be executed when the promise is resolved.\r\n * @param {*} authError to be executed when the promise is reject.\r\n *\r\n * @returns {Promise} that will be resolved. \r\n */\r\nexport function loadAuth0(authLoaded, authError) {\r\n if (!authObject.isAuth0Loading) {\r\n authObject.isAuth0Loading = true;\r\n return new Promise(loadAuth0Module).then(authLoaded).catch(authError);\r\n }\r\n\r\n if (authObject.isAuth0Loaded) {\r\n return Promise.resolve().then(authLoaded).catch(authError);\r\n }\r\n\r\n return waitForAuth().then(authLoaded).catch(authError);\r\n};\r\n\r\n/**\r\n * @public\r\n * createAuthInstance: create the authetication instance\r\n * @param {Object} settings of the authentication modal.\r\n * @param {Function} onCloseModal callback to be execute in hide event.\r\n */\r\nexport function createAuthInstance(settings, onCloseModal) {\r\n authObject.settings = settings;\r\n authObject.lock = new authObject.Auth0Lock(\r\n settings.basic.auth0ClientId,\r\n settings.basic.auth0Domain,\r\n settings.options);\r\n authObject.lock.on('signup ready', onSignUpReady);\r\n authObject.lock.on('authenticated', onAuthenticated);\r\n authObject.lock.on('signin ready', onSigninReady);\r\n authObject.lock.on('hide', onCloseModal);\r\n\r\n}\r\n\r\n/**\r\n * @public\r\n * showModal: open the authentication modal.\r\n *\r\n */\r\nexport function showModal() {\r\n authObject.lock.show();\r\n}","import { createAction } from '@reduxjs/toolkit';\r\n\r\n/* Action dispatched after the list view is paitend in the DOM to handler side effects.\r\n */\r\nconst onListViewPaint = createAction('searchResults/listViewPaint');\r\n\r\nexport default onListViewPaint;\r\n","import { fromFetch } from 'rxjs/fetch';\r\nimport UrlExtensions from 'utils/urlExtension';\r\n\r\n/**\r\n * @private\r\n *\r\n * The function returns a the User profile URL.\r\n *\r\n * @returns user profile URL string with parameters for the user's profile page, including IP address.\r\n */\r\nfunction getUserProfileUrl() {\r\n const location = window.location;\r\n const path = '/getUserProfile';\r\n const ip = UrlExtensions.getParameterValue(location, 'ip');\r\n\r\n const url = UrlExtensions.setParameters(path, {\r\n ip,\r\n });\r\n return url;\r\n}\r\n\r\nexport default fromFetch(getUserProfileUrl(),\r\n {\r\n 'credentials': 'include',\r\n headers: {\r\n 'Accept': 'application/json',\r\n }\r\n });\r\n","import { fromFetch } from 'rxjs/fetch';\r\nimport { userProfileGetFavorites } from 'constants/routes';\r\n\r\nexport default fromFetch(userProfileGetFavorites, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n // disabling cache to always get the latest favorites\r\n 'Cache-Control': 'no-cache',\r\n 'Accept': 'application/json',\r\n },\r\n});\r\n","import { switchMap, map } from 'rxjs';\r\nimport { fromFetch } from 'rxjs/fetch';\r\nimport { userSaveFavorite } from 'constants/routes';\r\nimport { camelCaseObjectKeys } from 'utils/camelCase';\r\n\r\nfunction saveUserFavorite(payload) {\r\n const url = `${userSaveFavorite}`;\r\n\r\n return fromFetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(payload),\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n },\r\n }).pipe(\r\n switchMap((response) => response.json()),\r\n map((response) => camelCaseObjectKeys(response))\r\n );\r\n}\r\n\r\nexport default saveUserFavorite;\r\n","import { switchMap } from 'rxjs';\r\nimport { fromFetch } from 'rxjs/fetch';\r\nimport { userDeleteFavorite } from 'constants/routes';\r\n\r\nfunction deleteUserFavorite(id) {\r\n const url = `${userDeleteFavorite}?id=${id}`;\r\n\r\n return fromFetch(url, {\r\n method: 'GET',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n },\r\n }).pipe(switchMap((response) => response.json()));\r\n}\r\n\r\nexport default deleteUserFavorite;\r\n","import FavoriteType from \"../enums/favoriteType\";\r\nimport SpecProductType from \"../models/specProductType\";\r\nimport PlanProductType from \"../models/planProductType\";\r\nimport CommunityProductType from \"../models/communityProductType\";\r\n\r\nconst housingProductConstructor = new Map();\r\n\r\nhousingProductConstructor.set(FavoriteType.Spec.toString(), SpecProductType);\r\nhousingProductConstructor.set(FavoriteType.Plan.toString(), PlanProductType);\r\nhousingProductConstructor.set(FavoriteType.Community.toString(), CommunityProductType)\r\n\r\n/**\r\n * Returns the class constructor with the listing information according to the type.\r\n *\r\n * @param type - The type of listing (Spec, plan, community).\r\n * @param listingInformation - The listing (Spec, plan, community) information.\r\n */\r\n\r\nexport default (type, listingInformation) => {\r\n const generator = housingProductConstructor.get(type);\r\n \r\n if (!generator) {\r\n return null;\r\n }\r\n \r\n return new generator.prototype.constructor(listingInformation);\r\n };\r\n ","import GoogleAnalyticsEvent from 'dataTransferObjects/googleAnalyticsEvent';\r\nimport GoogleAnalyticsCustomDimensions from 'constants/googleAnalyticsCustomDimension';\r\n\r\nconst tdvEvents = 'TDV Events';\r\n\r\n/* Creates a new instance for housing product type. */\r\nexport default class SpecProductType {\r\n constructor(listing) {\r\n this.id = listing.id;\r\n this.brandName = listing.brandName;\r\n this.communityName = listing.communityName;\r\n this.communityId = listing.communityId;\r\n this.isBasic = listing.isBasic === \"true\";\r\n }\r\n\r\n /**\r\n * This function returns a new GoogleAnalyticsEvent object with the event category, event action,\r\n * event label and custom dimensions set.\r\n * @returns A new instance of the GoogleAnalyticsEvent class for favorites.\r\n */\r\n getFavoriteGoogleAnalyticsEvent() {\r\n const customDimensions = { \r\n [GoogleAnalyticsCustomDimensions.SpecId().getName()] :\r\n this.id,\r\n [GoogleAnalyticsCustomDimensions.BrandName().getName()] :\r\n this.brandName,\r\n [GoogleAnalyticsCustomDimensions.CommunityName().getName()] :\r\n this.communityName,\r\n [GoogleAnalyticsCustomDimensions.CommunityId().getName()] :\r\n this.communityId,\r\n [GoogleAnalyticsCustomDimensions.IsPaid().getName()] :\r\n !this.isBasic,\r\n };\r\n return new GoogleAnalyticsEvent(tdvEvents, 'SRP Listing Card', 'Listing Saved', customDimensions);\r\n }\r\n}\r\n","import GoogleAnalyticsEvent from 'dataTransferObjects/googleAnalyticsEvent';\r\nimport GoogleAnalyticsCustomDimensions from 'constants/googleAnalyticsCustomDimension';\r\n\r\nconst tdvEvents = 'TDV Events';\r\n\r\n/* Creates a new instance for housing product type. */\r\nexport default class PlanProductType {\r\n constructor(listing) {\r\n this.brandName = listing.brandName;\r\n this.communityName = listing.communityName;\r\n this.id = listing.id;\r\n this.communityId = listing.communityId;\r\n this.isBasic = listing.isBasic === \"true\";\r\n }\r\n\r\n /**\r\n * This function returns a new GoogleAnalyticsEvent object with the event category, event action,\r\n * event label and custom dimensions set.\r\n * @returns A new instance of the GoogleAnalyticsEvent class for favorites.\r\n */\r\n getFavoriteGoogleAnalyticsEvent() {\r\n const customDimensions = { \r\n [GoogleAnalyticsCustomDimensions.BrandName().getName()] :\r\n this.brandName,\r\n [GoogleAnalyticsCustomDimensions.CommunityName().getName()] :\r\n this.communityName,\r\n [GoogleAnalyticsCustomDimensions.PlanId().getName()] :\r\n this.id,\r\n [GoogleAnalyticsCustomDimensions.CommunityId().getName()] :\r\n this.communityId,\r\n [GoogleAnalyticsCustomDimensions.IsPaid().getName()] : \r\n !this.isBasic,\r\n };\r\n return new GoogleAnalyticsEvent(tdvEvents, 'SRP Listing Card', 'Listing Saved', customDimensions);\r\n }\r\n}\r\n","import GoogleAnalyticsEvent from 'dataTransferObjects/googleAnalyticsEvent';\r\nimport GoogleAnalyticsCustomDimensions from 'constants/googleAnalyticsCustomDimension';\r\n\r\nconst tdvEvents = 'TDV Events';\r\n\r\n/* Creates a new instance of a community listing. */\r\nexport default class CommunityProductType {\r\n constructor(listing) {\r\n this.brandName = listing.brandName;\r\n this.name = listing.name;\r\n this.id = listing.id;\r\n this.isBasic = listing.isBasic === \"true\";\r\n }\r\n\r\n /**\r\n * This function returns a new GoogleAnalyticsEvent object with the event category, event action, and\r\n * event label set.\r\n * @returns A new instance of the GoogleAnalyticsEvent class.\r\n */\r\n getFavoriteGoogleAnalyticsEvent() {\r\n const customDimensions = { \r\n [GoogleAnalyticsCustomDimensions.BrandName().getName()] :\r\n this.brandName,\r\n [GoogleAnalyticsCustomDimensions.CommunityName().getName()] :\r\n this.name,\r\n [GoogleAnalyticsCustomDimensions.CommunityId().getName()] :\r\n this.id,\r\n [GoogleAnalyticsCustomDimensions.IsPaid().getName()] : \r\n !this.isBasic,\r\n };\r\n return new GoogleAnalyticsEvent(tdvEvents, 'SRP Listing Card', 'Listing Saved', customDimensions);\r\n }\r\n}\r\n","import { catchError, from, of, mergeMap, switchMap, map, filter } from 'rxjs';\r\nimport { ofType } from 'redux-observable';\r\nimport getUserProfile$ from '../apis/getUserProfile';\r\nimport getUserFavorites$ from '../apis/getUserFavorites';\r\nimport { userProfileSlice } from './slices';\r\nimport saveUserFavorite from '../apis/saveFavorite';\r\nimport deleteUserFavorite from '../apis/deleteFavorite';\r\nimport getFavoriteFromState from '../services/getFavoriteFromState';\r\nimport housingProductConstructor from '../services/getHousingProductType';\r\n\r\nconst actions = userProfileSlice.actions;\r\n\r\n// this epic requests the profile data for logged in users.\r\nexport const fetchUserProfileEpic = (action$) =>\r\n action$.pipe(\r\n ofType(actions.fetch.type),\r\n switchMap(() =>\r\n getUserProfile$.pipe(\r\n switchMap((response) => from(response.json()).pipe(mergeMap((data) =>\r\n of(actions.apply(data))))),\r\n catchError((err) => of(actions.handleError(err)))\r\n )\r\n )\r\n );\r\n\r\n// this epic requests the profile data for logged in users.\r\nexport const fetchUserFavoritesEpic = (action$) =>\r\n action$.pipe(\r\n ofType(actions.apply.type),\r\n filter((action) => action.payload && action.payload.IsLogin === true),\r\n switchMap(() =>\r\n getUserFavorites$.pipe(\r\n switchMap((response) => from(response.json()).pipe(mergeMap((data) =>\r\n of(actions.applyFavorites(data))))),\r\n catchError((err) => of(actions.handleError(err)))\r\n )\r\n )\r\n );\r\n\r\n// this epic is triggered when the user profile is loaded\r\n// it loads the user's favorites into the favorites slice.\r\nexport const getUserFavoritesEpic = (action$) =>\r\n action$.pipe(\r\n ofType(actions.apply.type),\r\n map((action) => actions.loadFavorites(action.payload))\r\n );\r\n\r\n// this epic is triggered when the user clicks on the favorite icon on a card \r\n// that is not already a favorite. \r\nexport const saveFavoriteEpic = (action$, state$) => \r\naction$.pipe( \r\n ofType(actions.saveFavorite.type),\r\n filter(() => state$.value?.userProfile?.isLogin),\r\n mergeMap((action) => { \r\n const { listingInformation, type, url, userId } = action.payload;\r\n const housingProductType = housingProductConstructor(type, listingInformation);\r\n const saveInformation = {\r\n id: listingInformation.id,\r\n type,\r\n url,\r\n userId\r\n };\r\n return saveUserFavorite(saveInformation).pipe(\r\n switchMap((data) => of(actions.saveFavoriteFulfilled({data, housingProductType})))\r\n );\r\n}));\r\n\r\n// this epic is triggered when the user clicks on the favorite icon on a card\r\n// that is already a favorite.\r\nexport const deleteFavoriteEpic = (action$, state$) =>\r\n action$.pipe(\r\n ofType(actions.deleteFavorite.type),\r\n switchMap((action) => {\r\n const payload = action.payload;\r\n \r\n // get the favorite from the state that matches the action.payload.id\r\n const favorite = getFavoriteFromState(state$.value, Number(payload.listingInformation.id));\r\n\r\n return deleteUserFavorite(favorite.id).pipe(\r\n switchMap(() => of(actions.deleteFavoriteFullfilled(favorite)))\r\n );\r\n }));","import { BehaviorSubject, mergeMap } from 'rxjs';\r\nimport { \r\n fetchUserProfileEpic,\r\n saveFavoriteEpic, \r\n deleteFavoriteEpic,\r\n fetchUserFavoritesEpic,\r\n} from 'features/userProfile';\r\nimport { combineEpics } from 'redux-observable';\r\n\r\nconst combinedUserProfileEpic = combineEpics(\r\n fetchUserProfileEpic,\r\n saveFavoriteEpic,\r\n deleteFavoriteEpic,\r\n fetchUserFavoritesEpic,\r\n );\r\n// Exports the Observable of 'epic' to allow other modules to dynamically register their epic.\r\nexport const epic$ = new BehaviorSubject(combinedUserProfileEpic);\r\n\r\nexport const rootEpic = (action$, state$) => epic$.pipe(mergeMap((epic) => epic(action$, state$)));","\r\n\r\n// this function is used to get the favorite from the state that matches the id of the action.payload.id\r\nexport default function getFavoriteFromState(state, id) {\r\n return state.userProfile?.favorites?.find((fav) => fav.listingId === id);\r\n }","import { distinctUntilChanged, from } from 'rxjs';\r\nimport { createEpicMiddleware } from 'redux-observable';\r\nimport { combineReducers, configureStore } from '@reduxjs/toolkit';\r\nimport dynamicMiddlewares from 'redux-dynamic-middlewares'\r\nimport { rootEpic } from './rootEpics';\r\n\r\n// Register global reducers if needed.\r\nconst staticReducers = {};\r\n\r\n// Function need to allow other modules to dynamically register their reducers.\r\nfunction createReducer(asyncReducers) {\r\n return combineReducers({\r\n ...staticReducers,\r\n ...asyncReducers,\r\n });\r\n}\r\n\r\n// Epic Middleware allow RxJS to work with Redux via Redux-Observable.\r\nconst epicMiddleware = createEpicMiddleware();\r\n\r\n// Creates, configure, and export the global store.\r\nexport const store = configureStore({\r\n reducer: staticReducers,\r\n middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(epicMiddleware).concat(dynamicMiddlewares),\r\n});\r\n\r\n// Observable store that notifies the latest changes.\r\n\r\nexport const store$ = from(store).pipe(distinctUntilChanged());\r\n// Add a dictionary to keep track of the registered async reducers.\r\nstore.asyncReducers = {};\r\n\r\n// Create an inject reducer function.\r\n// This function adds the async reducer, and creates a new combined reducer.\r\nstore.injectReducer = (key, asyncReducer) => {\r\n store.asyncReducers[key] = asyncReducer;\r\n store.replaceReducer(createReducer(store.asyncReducers));\r\n};\r\n\r\n// Run the root 'epic'.\r\nepicMiddleware.run(rootEpic);\r\nexport { epic$ } from './rootEpics';\r\n","/**\r\n * Recursively converts object keys to camel case\r\n */\r\nexport const camelCaseObjectKeys = (object) => {\r\n if (typeof object !== 'object' || !object) {\r\n return object;\r\n }\r\n\r\n // eslint-disable-next-line no-use-before-define\r\n const camelCaseObject = camelCaseArray(object) || {};\r\n\r\n if (object && !camelCaseObject.length) {\r\n Object.keys(object).forEach((key) => {\r\n const camelCaseKey = key.charAt(0).toLowerCase() + key.slice(1);\r\n camelCaseObject[camelCaseKey] = camelCaseObjectKeys(object[key]);\r\n });\r\n }\r\n\r\n return camelCaseObject;\r\n};\r\n\r\n/**\r\n * Recursively converts object keys to camel case\r\n * This function just change the properties of your object, not the value or the types of your properties.\r\n */\r\nexport const camelCaseArray = (object) => {\r\n if (Array.isArray(object)) {\r\n object.forEach((element, index) => {\r\n object[index] = camelCaseObjectKeys(element);\r\n });\r\n return object;\r\n }\r\n\r\n return null;\r\n};\r\n","/**\r\n * A utility class for working with URLs.\r\n */\r\nexport default class UrlExtensions {\r\n\r\n /**\r\n * Gets the subdirectory of a URL.\r\n * @param {URL} url - The URL to get the subdirectory from.\r\n * @returns {string|null} The subdirectory of the URL, or null if there is none.\r\n */\r\n static getSubdirectory(url) {\r\n const firstSegment = url.pathname?.split('/')?.[1];\r\n const subdirectory = firstSegment || null;\r\n\r\n return subdirectory;\r\n }\r\n\r\n /**\r\n * Removes the query string from a URL.\r\n * @param {string} url - The URL to remove the query string from.\r\n * @returns {string} The URL without the query string.\r\n */\r\n static removeQueryString(url) {\r\n if(!url){\r\n return url;\r\n }\r\n \r\n const urlWithoutQueryString = url?.split('?')[0];\r\n return urlWithoutQueryString;\r\n }\r\n\r\n /**\r\n * Gets the value of a query parameter from a URL.\r\n * @param {URL} url - The URL to get the parameter value from.\r\n * @param {string} parameter - The name of the parameter to get the value of.\r\n * @returns {string|null} The value of the parameter, or null if it doesn't exist.\r\n */\r\n static getParameterValue(url, parameter) {\r\n const searchParams = new URLSearchParams(url.search);\r\n return searchParams.get(parameter) ?? null;\r\n }\r\n\r\n /**\r\n * Gets the value of a query parameter from the URL hash.\r\n * @param {URL} url - The URL to get the parameter value from.\r\n * @param {string} parameter - The name of the parameter to get the value of.\r\n * @returns {string|null} The value of the parameter, or null if it doesn't exist.\r\n */\r\n static getParameterValueFromHash(url, parameter) {\r\n const search = url.hash.replace('#', '?');\r\n const searchParams = new URLSearchParams(search);\r\n return searchParams.get(parameter) ?? null;\r\n }\r\n\r\n /**\r\n * Sets query parameters on a URL.\r\n * @param {string} url - The URL to set the parameters on.\r\n * @param {Object.} parameters - An object containing the parameter names and values to set.\r\n * @returns {string} The URL with the new parameters set.\r\n */\r\n static setParameters(url, parameters) {\r\n const separator = url.includes('?') ? '&' : '?';\r\n const query = [];\r\n Object.keys(parameters).forEach((key) => {\r\n const value = parameters[key];\r\n if (value !== null) {\r\n query.push(`${key}=${encodeURIComponent(value)}`);\r\n }\r\n });\r\n\r\n if (query.length) {\r\n return `${url}${separator}${query.join('&')}`;\r\n }\r\n\r\n return `${url}`;\r\n }\r\n}\r\n"],"names":["GoogleAnalyticsCustomDimensions","static","constructor","dimension","this","getName","baseElementUrl","document","querySelector","attributes","href","value","configuration","window","location","origin","getBreadcrumbContent","getCommunitiesResults","getHousingProductSnippetContent","getListingCounts","getOnPageContent","getResultFacets","getTypeaheadOptions","leadsBasicCommunitySubmission","leadsBasicPlanSubmission","leadsBasicSpecSubmission","leadsBasicListingSubmission","leadsGetRecommendedCommunities","leadsPaidCommunitySubmission","leadsPaidPlanSubmission","leadsPaidSpecSubmission","leadsRecommendedCommunitySubmission","mapGetCommunitiesPoints","mapGetHomesPoints","totalDeliveryValueCommunityLogger","totalDeliveryValuePlanLogger","totalDeliveryValueSpecLogger","userDeleteFavorite","userProfileGetFavorites","userSaveFavorite","googleOneTapLogin","getCommunityNearbyListingsInfo","getBuildablePlanNearbylistingsInfo","getPlanNearbyListingsInfo","getSpecNearbyListingsInfo","searchCommunitySitePlans","getCommunityInteractiveSitePlanMarkers","getCommunitySummaryCard","getHousingUnitSummaryCard","category","action","label","customDimensions","eventCategory","eventAction","eventLabel","event","Object","assign","LoadingStatus","Failed","getInstance","Idle","Loading","Succeeded","key","failed","idle","loading","succeeded","instances","name","toString","defineProperty","totalDeliveryEvents","param","getAttributes","dataset","builderId","communityId","specId","planId","datasets","length","config","forEach","slice","market","marketId","initialState","type","reducers","fireTdvEvent","state","payload","parameters","trackingEvent","isFetchingEvent","trackingEventError","trackingEventFulfilled","actions","eventType","body","dispatchEvent","CustomEvent","detail","data","store","totalDeliveryValueActions","reducer","totalDeliveryValueReducers","store$","map","totalDeliveryValue","filter","eventTracking","distinctUntilChanged","subscribe","action$","pipe","switchMap","requestObject","method","headers","JSON","stringify","selector","response","text","postPlanLogger$","of","catchError","err","postSpecLogger$","postCommunityLogger$","listingInformationGetter","Map","set","id","marketName","brandName","communityName","marketingStatusLabel","isBasic","imageUrl","priceHigh","priceLow","city","stateAbbreviation","zip","price","homeStatus","getCardInformation","card","url","URL","pathname","listingInformation","listingType","getListingInformation","get","getListingInformationFromDataset","toggleFavorite","icon","closest","userId","favorites","userProfile","cardInfo","isSaved","some","favorite","listingId","Number","isFavoriteSaved","deleteFavorite","saveFavorite","dispatchSaveOrDeleteAction","updateSavedFavorites","favoritesIds","querySelectorAll","includes","classList","toggle","setAttribute","previous","current","take","pendingSaves","pendingSave","addEventListener","target","isLogin","googleOneTapInstance","isGoogleOneTapLoaded","isGoogleOneTapLoading","clientId","onAuthenticated","onGoogleOneTapError","reject","Error","onGoogleOneTapLoaded","resolve","google","accounts","initialize","client_id","callback","cancel_on_tap_outside","itp_support","use_fedcm_for_prompt","appendGoogleOneTapScript","script","createElement","src","async","defer","onerror","bind","onload","head","appendChild","setTimeout","json","token","base64","split","replace","jsonPayload","decodeURIComponent","atob","character","charCodeAt","join","parse","authActions","onLibraryLoaded","googleOneTapLibraryLoadingStatus","onLibraryErrored","onPageLoaded$","fromEvent","googleResponse","idToken","credential","locale","picture","email","givenName","given_name","familyName","family_name","subject","sub","audience","aud","emailVerified","email_verified","notBeforeTimeSeconds","nbf","hostedDomain","hd","issuer","iss","issuedAtTimeSeconds","iat","expirationTimeSeconds","exp","jwtId","jti","keepMeLogged","Success","reload","googleOneTapConfiguration$","googleOneTapInformation","combineLatest","googleOneTapConfiguration","Promise","then","catch","prompt","Boolean","cancel","signUpField","regex","RegExp","validator","pattern","hint","valid","test","configElement","keepMeLoggedSection","legalContentSection","configObject","innerText","options","additionalSignUpFields","modalActions","modalReducers","authenticationReducers","onCloseModal","onClose","localStorage","setItem","authenticationActions","onAuthLibraryLoaded","authLibraryLoaded","onAuthLibraryErrored","authLibraryErrored","openModal","onOpen","isSignInElement","onOpenModal","preventDefault","updateNeustarInformation","partnerIdElement","getCookieName","isPartnerCookie","documentClicks$","debounce","interval","sessionAliveElement","sessionAliveMin","updateSession","next","cookieName","items","cookie","nameLength","cookieFound","find","item","trim","indexOf","substring","readCookie","mins","expires","date","Date","setTime","getTime","toGMTString","createCookieByMins","componentLinksToInclude","subMenuAccountList","subMenuAccountContainer","links","link","component","li","anchor","add","ShouldOpenNewTab","rel","qa","signInToggle","remove","removeAttribute","isAuthLibraryLoaded","authentication","isAuthLibraryNotLoaded","isAuthModalOpen","modal","pendingSavesSessionStorageKey","favoritesSessionStorageKey","FavoriteType","Plan","Spec","Community","Builder","plan","spec","community","builder","toLowerCase","userProfileActions","userProfileReducers","listenerMiddleware","startListening","matcher","deleteFavoriteFullfilled","saveFavoriteFulfilled","effect","sessionStorage","middleware","selectIsLoggedIn","selectFavorites","selectPendingSaves","selectIsProfileFavoritesLoaded","isProfileFavoritesLoaded","selectUserId","selectNeustarStatus","neustarStatus","selectGoogleOneTapLibraryLoadingStatus","selectUserIdAndPendingSaves","selectUserLocation","userLocation","userCity","userCountry","userMarketId","userState","userZipCode","userLocationCity","userLocationCountry","userLocationMarketId","userLocationState","userLocationZipCode","selectUserProfileTrackingCommonProperties","phone","livesOutside","neustarInformation","s","z","a","g","neustarSegment","neustarZip","neustarAge","neustarGender","isLoggedIn","pendingSavesData","getItem","favoritesData","hasUserOptedIntoRecommendationEmail","realtorQuestion","userProfileSlice","apply","profile","camelCase","imageProfile","preferredContactMethod","isLoading","applyFavorites","update","userInfo","fetch","handleError","push","newFavorite","authenticationSlice","modalSlice","footerLinks","eventsMapper","element","footerLink","googleAnalyticsDTO","siteLinks","navigation","navLinks","metroLinksContainer","linkvalue","stateLinksContainer","navLink","utmSource","refer","utmMedium","utmCampaign","utmTerm","utmContent","gclid","httpReferer","referrer","entranceUrl","utm_source","utm_medium","utm_campaign","utm_term","utm_content","createUtmUrl","utm","googleClickId","setUtmParameters","from","mergeMap","resourceDomain","error","fetchConfiguration","fetchConfigurationError","fetchConfigurationFulfilled","ResourceDomain","segmentApiKey","SegmentApiKey","neustarApiKey","NeustarApiKey","imageResizeService","IRSDomain","googleOneTapClientId","GoogleOneTapClientId","isMarkerAutoScrollFeatureEnabled","IsMarkerAutoScrollFeatureEnabled","message","uiStateSlice","subnavLabels","backLabel","handleSubnavLabelClick","updateDataLayer","dataLayer","onHamburgerMenuClicked$","isOpen","onLayoutBreakPointChanged$","layoutBreakPoint","isHamburgerMenuOpen","modal$","modalService","modalHtml","modalContainer","previousHtml","disconnectedCallbacks","registeredCallbacks","overlay","overlayId","overlayClass","isMacOS","navigator","userAgent","getOverlay","getElementById","create","requestAnimationFrame","insertAdjacentHTML","getHtml","onDisconnected","callbackName","fn","has","delete","tap","modalInformation","uiState","innerHTML","previousCallback","disconnect","callbacks","html","previouscallbackName","previousName","callbacksRegistered","register","merge","responsiveLayoutHandler","matches","layoutBreakpoint","media","configureLayoutHandler","mediaQueryList","matchMedia","getMediaQuery","layoutBreakpoints","i","configureLayoutHandlers","PageLayout","Communities","Homes","Builders","BoylLocations","CustomHomes","ManufacturedLocations","ManufacturedHomes","ResultPresentationType","Pagination","InfiniteScrolling","LayoutBreakpoint","Small","Medium","Big","mediaQuery","getValue","layoutActions","updateDataLayerEntry","trackUserEvent","trackedEvent","selectUiState","selectDisplaySkeleton","displayCardGridSkeleton","selectResultsPresentationType","resultsPresentationType","selectModal","selectLoading","selectConfigurationSegmentApiKey","selectConfigurationImageResizeService","selectConfigurationGoogleOneTapClientId","selectIsMarkerAutoScrollFeatureEnabled","selectLayoutBreakpoint","selectResourcesHostNames","staticImagesHostName","lookup","layoutName","isFetchingModal","clearModal","fetchModal","fetchModalError","fetchModalFulfilled","updatePageLayout","pageLayout","updateCardGridSkeleton","focusedListingInformation","focusedListing","newModalInformation","updateLayoutBreakpoint","clearHtml","asObservable","onHtmlReady","onHtmlRemoved","setHtml","setPreviousHtml","authObject","isAuth0Loaded","isAuth0Loading","lock","settings","Auth0Lock","onAuth0Error","onAuth0Loaded","loadAuth0Module","call","isAuthLoaded","onSignUpReady","onkeypress","evt","charCode","which","keyCode","outsideUS","onchange","disabled","checked","prefill","parentElement","lastElementChild","after","content","cloneNode","authResult","accessToken","keepMeLoggedValue","basic","auth0Authenticated","ok","afterLogin","nextPage","onSigninReady","referenceElement","insertBefore","loadAuth0","authLoaded","authError","createAuthInstance","auth0ClientId","auth0Domain","on","showModal","show","ip","getUserProfileUrl","housingProductConstructor","listing","getFavoriteGoogleAnalyticsEvent","combinedUserProfileEpic","getUserProfile","state$","housingProductType","generator","prototype","saveInformation","fav","IsLogin","getUserFavorites","epic$","BehaviorSubject","rootEpic","epic","staticReducers","epicMiddleware","getDefaultMiddleware","concat","asyncReducers","injectReducer","asyncReducer","replaceReducer","combineReducers","run","camelCaseObjectKeys","object","camelCaseObject","camelCaseArray","keys","camelCaseKey","charAt","Array","isArray","index","UrlExtensions","firstSegment","urlWithoutQueryString","parameter","URLSearchParams","search","hash","separator","query","encodeURIComponent"],"sourceRoot":""}