{"version":3,"file":"static/chunks/229-aecbbf6e5cb8b1c3.js","mappings":"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","sources":["webpack://_N_E/./components/login-modal/login-modal.tsx","webpack://_N_E/./components/use-points/display-points-mvt/display-points.tsx","webpack://_N_E/./components/use-points/use-points.tsx","webpack://_N_E/./components/sort-by-drop-down/dropdown-ui.tsx","webpack://_N_E/./components/sort-by-drop-down/sort-by-drop-down.tsx","webpack://_N_E/./components/sort-by-drop-down/index.ts","webpack://_N_E/./components/zoom-in-for-pricing/zoom-in-for-pricing.tsx","webpack://_N_E/./components/zoom-in-for-pricing/index.ts","webpack://_N_E/./components/map/map.context.tsx","webpack://_N_E/./components/map/map.info-window.tsx","webpack://_N_E/./components/map/map.marker.tsx","webpack://_N_E/./components/map/map.static-marker.tsx","webpack://_N_E/./components/map/map.markers.tsx","webpack://_N_E/../../libs/osc/map/src/lib/info-window/map-info-window.tsx","webpack://_N_E/../../libs/osc/map/src/lib/info-window/index.ts","webpack://_N_E/../../libs/osc/map/src/lib/index.ts","webpack://_N_E/../../libs/osc/map/src/index.ts","webpack://_N_E/./components/map/map.markers.search.tsx","webpack://_N_E/./components/map/map.base.tsx","webpack://_N_E/./components/map/map.provider.tsx","webpack://_N_E/./components/map/map.tsx","webpack://_N_E/./components/map/map.markers.locations.tsx","webpack://_N_E/./components/map/map-block.tsx","webpack://_N_E/./components/map/map.module.css","webpack://_N_E/./hooks/use-vertical-space-MVT.ts","webpack://_N_E/./components/use-points/display-points-mvt/points-message.tsx","webpack://_N_E/./components/hotel-counter/hotel-counter.tsx","webpack://_N_E/./components/hotel-counter/index.ts","webpack://_N_E/./components/list-view/log-in-banner/log-in-banner.tsx","webpack://_N_E/./components/locations-page/locations-page.utils.ts","webpack://_N_E/./components/locations-page/locations-page-heading.tsx","webpack://_N_E/./components/hotel-search-result-summary/hotel-search-result-summary.tsx","webpack://_N_E/./components/compare-hotels/feature-tool-tip.tsx","webpack://_N_E/./components/compare-hotels/compare-hotel-utils.ts","webpack://_N_E/./components/compare-hotels/hooks/use-get-compare-hotels.ts","webpack://_N_E/./components/compare-hotels/compare-skeleton.tsx","webpack://_N_E/./components/compare-hotels/compare-modal.tsx","webpack://_N_E/./components/compare-hotels/compare-bar.tsx","webpack://_N_E/../../libs/osc/pagination/src/lib/pagination.tsx","webpack://_N_E/../../libs/osc/pagination/src/index.ts","webpack://_N_E/./hooks/use-hotel-summary-options/utils/filter-state-country-brand-hashed-hotels.ts","webpack://_N_E/./hooks/use-hotel-summary-options/utils/generate-hotel-summary-options-query-array.ts","webpack://_N_E/./utils/get-bounds-nodes/get-bounds-nodes.ts","webpack://_N_E/./hooks/use-hotel-summary-options/use-quad-nodes.ts","webpack://_N_E/./hooks/use-hotel-summary-options/use-blob.ts","webpack://_N_E/./hooks/use-hotel-summary-options/use-hotel-summary-options.ts","webpack://_N_E/./components/map-list-toggle-button/map-list-toggle-button.tsx","webpack://_N_E/./components/list-view/list-view-utils/list-view-brand-banner.utils.ts","webpack://_N_E/./components/list-view/list-view-brand-banner/list-view-brand-banner.tsx","webpack://_N_E/./components/list-view/list-view-brand-banner/index.ts","webpack://_N_E/./components/age-based-modal/age-based-modal-utils.ts","webpack://_N_E/./components/age-based-modal/age-based-modal.tsx","webpack://_N_E/./components/age-based-modal/index.ts","webpack://_N_E/./components/list-view/list-view-utils/list-view.utils.ts","webpack://_N_E/./hooks/use-get-visible-in-bound-hotels.ts","webpack://_N_E/./components/carousel/carousel.tsx","webpack://_N_E/./components/compare-hotels/compare-checkbox.tsx","webpack://_N_E/./components/hotel-card/key-hotel-amenity-info.tsx","webpack://_N_E/./components/hotel-card/hotel-card.tsx","webpack://_N_E/./components/hotel-card/hotel-card-cta-skeleton.tsx","webpack://_N_E/./components/hotel-card/hotel-card-skeleton.tsx","webpack://_N_E/./components/hotel-card/hotel-cards.tsx","webpack://_N_E/./components/list-view/list-view.tsx","webpack://_N_E/./components/currency-converter/currency-converter.tsx","webpack://_N_E/../../libs/utilities/images/src/lib/get-aspect-ratio-url.ts","webpack://_N_E/../../libs/utilities/images/src/index.ts","webpack://_N_E/./components/info-message-banner/info-message-banner.tsx","webpack://_N_E/./hooks/use-suggested-filters.ts","webpack://_N_E/./components/filters/suggested-filters.tsx","webpack://_N_E/./components/compare-hotels/compare-toggle.tsx"],"sourcesContent":["import { Dialog } from '@dx-ui/osc-dialog-v2';\nimport { LoginIFrame, type LoginResponse } from '@dx-ui/osc-login';\nimport { generateSigninUrl, persistSessionState } from '../../utils';\nimport { useCallback } from 'react';\nimport { useAuth } from '@dx-ui/framework-auth-provider';\nimport { env } from '../../constants';\nimport { useWrappedRouter } from '../../hooks';\nimport { useAppState } from '../../providers/app-provider';\nimport { useFilterState } from '../../providers/filter-provider';\n\nexport const LoginModal = ({\n onClose,\n onLogin,\n showLoginModal,\n title,\n}: {\n onClose: () => void;\n onLogin?: () => void;\n showLoginModal: boolean;\n title: string;\n}) => {\n const { login } = useAuth();\n const { router } = useWrappedRouter();\n const { shouldUsePoints, selectedCurrency, sortType } = useAppState();\n const activeFiltersState = useFilterState();\n const lang = router.locale as string;\n const forgetInfoUrl = env.PARTNER_FORGET_INFO_LINK.replace('/__LANG__/', `/${lang}/`);\n const options = {\n showCreatePassword: false,\n forgetInfoLink: { url: forgetInfoUrl },\n secureInfoLink: { url: env.GLOBAL_PRIVACY_URL },\n signInLink: { url: generateSigninUrl(router.asPath, lang) },\n };\n const onSignInAttempt = useCallback(\n async (resp: LoginResponse) => {\n persistSessionState({ shouldUsePoints, selectedCurrency, sortType, activeFiltersState });\n if (resp?.data) {\n await login(resp);\n }\n },\n [activeFiltersState, login, selectedCurrency, shouldUsePoints, sortType]\n );\n const handleLogin = async (resp: LoginResponse) => {\n await onSignInAttempt?.(resp);\n if (!resp.error) {\n onClose();\n onLogin?.();\n }\n };\n return (\n <Dialog isOpen={showLoginModal} onDismiss={onClose} size=\"md\" title={title}>\n <LoginIFrame\n data-testid=\"loginIframe\"\n frameSrc={generateSigninUrl(router?.asPath, lang)}\n options={options}\n onLoginAttempt={handleLogin}\n onClose={onClose}\n title={title}\n />\n </Dialog>\n );\n};\n","import { useAuth } from '@dx-ui/framework-auth-provider';\nimport { DISPLAY_NUM_OF_AVAILABLE_POINTS, GOALS } from '../../../constants';\nimport { useGetMVTSelections, useWrappedRouter } from '../../../hooks';\nimport { useAppState } from '../../../providers/app-provider';\nimport { Trans, useTranslation } from 'next-i18next';\n\nimport { useState } from 'react';\nimport { LoginModal } from '../../login-modal/login-modal';\nimport { PointsMessage } from './points-message';\nimport { logError } from '@dx-ui/framework-logger';\nimport { sendReward } from '@dx-ui/framework-conductrics';\n\nexport const DisplayPoints = () => {\n const { t } = useTranslation('use-points');\n const { shouldUsePoints } = useAppState();\n const { isAuthenticated } = useAuth();\n const [showLoginModal, setShowLoginModal] = useState(false);\n const { router } = useWrappedRouter();\n\n const {\n isLoaded,\n isMVTVariant: { b: isMVT },\n } = useGetMVTSelections({\n agentId: DISPLAY_NUM_OF_AVAILABLE_POINTS.agentId,\n isProvisional: shouldUsePoints,\n });\n\n const onLogin = () => {\n const params = new URLSearchParams(window.location.search);\n params.set('redeemPts', 'true');\n params.set('pointsLogin', 'true');\n router\n .replace(\n {\n pathname: router.pathname,\n query: params.toString(),\n },\n undefined,\n { shallow: true }\n )\n .catch((error) => logError('DISPLAY_POINTS', error, 'Error redirecting to login page'));\n };\n\n const handleSignInButtonClick = () => {\n setShowLoginModal(true);\n sendReward(GOALS.pointsLoginClick);\n };\n\n const buttonLabel = t('SRSignInToBookWithPoints');\n if (!isMVT || !isLoaded) return null;\n return isAuthenticated ? (\n <PointsMessage />\n ) : (\n <>\n <div className=\"text-nowrap text-sm text-tier-diamond\">\n <Trans\n ns=\"use-points\"\n i18nKey=\"signInToBookWithPoints\"\n components={{\n SignInLink: (\n <button\n onClick={handleSignInButtonClick}\n type=\"button\"\n className=\"font-normal underline\"\n aria-label={buttonLabel}\n aria-live=\"polite\"\n >\n Sign in now\n </button>\n ),\n }}\n />\n </div>\n <LoginModal\n showLoginModal={showLoginModal}\n onClose={() => setShowLoginModal(false)}\n onLogin={onLogin}\n title={t('signInNowToPay')}\n />\n </>\n );\n};\n","import cx from 'classnames';\nimport { useTranslation } from 'next-i18next';\nimport { useGetUsePoints, useMetrics, useWrappedRouter } from '../../hooks';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { InfoPopup } from '@dx-ui/osc-info-popup';\nimport { useIsClient } from 'usehooks-ts';\nimport { DisplayPoints } from './display-points-mvt/display-points';\nimport { useState } from 'react';\nimport { useCurrencyConversion } from '@dx-ui/osc-currency-converter';\n\nexport type UsePointsProps = {\n isInvalidOrUnavailableOffer?: boolean;\n onChange?: () => void;\n};\n\nexport const UsePoints = ({ isInvalidOrUnavailableOffer, onChange }: UsePointsProps) => {\n const { router } = useWrappedRouter();\n const { t } = useTranslation('use-points');\n const { shouldUsePoints, selectedCurrency } = useAppState();\n const dispatch = useAppDispatch();\n const metrics = useMetrics();\n const isClient = useIsClient();\n const [a11yText, setA11yText] = useState('');\n const { currenciesMap } = useCurrencyConversion();\n const selecteCurrencyDesc = currenciesMap?.get(selectedCurrency || 'USD')?.description;\n\n const {\n isDisabled: isPointsDisabled,\n isChecked: shouldUsePointsChecked,\n infoPopupMessage,\n } = useGetUsePoints(isInvalidOrUnavailableOffer);\n\n const handleUsePointsChange = () => {\n const a11yMessage = !shouldUsePointsChecked\n ? t('priceChangeToPoints')\n : t('rateChangedToCurrency', { currencyName: selecteCurrencyDesc });\n setA11yText(a11yMessage);\n dispatch({ type: 'SET_USE_POINTS', payload: !shouldUsePoints });\n void metrics.trackUsePointsChecked();\n if (onChange) onChange();\n setTimeout(() => setA11yText(''), 1000);\n };\n\n return isClient && router.isReady ? (\n <div className=\"ml-2 mr-0 flex-col pt-5 md:mx-2 md:px-2 rtl:mb-2\">\n <div className=\"flex\">\n <label className=\"label label-inline-reverse text-nowrap rtl:label-inline-reverse\">\n <span\n className={cx('text-sm font-semibold lg:text-lg rtl:pl-2 rtl:pr-1', {\n 'text-text-disabled': isPointsDisabled,\n })}\n >\n {t('usePoints')}\n </span>\n <input\n checked={shouldUsePointsChecked}\n className=\"form-checkbox\"\n data-testid=\"searchByUsePoints\"\n disabled={isPointsDisabled}\n onChange={handleUsePointsChange}\n type=\"checkbox\"\n />\n {a11yText ? <span className=\"sr-only\">{a11yText}</span> : null}\n </label>\n {infoPopupMessage && (\n <span className=\"m-1 flex\">\n <InfoPopup testId=\"dayUseRateDisclaimer\" label={t('pointsInfo')}>\n <span className=\"flex w-40\">{t(infoPopupMessage)}</span>\n </InfoPopup>\n </span>\n )}\n </div>\n <DisplayPoints />\n </div>\n ) : null;\n};\n","import type * as React from 'react';\nimport { isBrowser } from '@dx-ui/utilities-is-browser';\nimport { useIsClient } from 'usehooks-ts';\nimport getBreakpoint from '../../utils/get-breakpoint';\nimport type { LabelValue } from '../../utils';\n\ntype DropdownProps = {\n options: LabelValue[];\n handleChange: (event: React.ChangeEvent<HTMLSelectElement>) => void;\n value?: string | number | readonly string[];\n label: string;\n};\nconst Dropdown = ({ options, handleChange, value, label }: DropdownProps) => {\n const isClient = useIsClient();\n const isMobile = isBrowser && window.innerWidth < (getBreakpoint('sm', true) as number);\n\n return isClient ? (\n <div className=\"z-1 ml-2 mr-1 w-32 text-sm md:ml-0 md:w-64\" data-testid=\"sortByDropdown\">\n <label\n className=\"label mr-1 flex h-7 justify-center whitespace-nowrap pb-1 text-xs font-semibold tracking-tight md:text-sm rtl:mx-0\"\n htmlFor=\"selectSortBy\"\n >\n {label}\n </label>\n <select\n aria-label={label}\n className=\"form-select w-32 text-sm leading-4 md:w-full md:text-base\"\n data-testid=\"selectSortBy\"\n id=\"selectSortBy\"\n name={label}\n onChange={(evt) => handleChange(evt)}\n role=\"presentation\"\n style={{ ...(isMobile && { margin: 0 }) }}\n title={label}\n value={value}\n >\n {options?.map(\n (option) =>\n !!option.isVisible && (\n <option\n data-testid={option.testIdLabel}\n disabled={option.isDisabled}\n key={option.value}\n value={option.value}\n >\n {option.label}\n </option>\n )\n )}\n </select>\n </div>\n ) : null;\n};\n\nexport default Dropdown;\n","import type * as React from 'react';\nimport type { SortByDropDownValues } from '../../utils';\nimport { isSortByPoints, isSortByPrice } from '../../utils';\nimport Dropdown from './dropdown-ui';\nimport { useMetrics, useGetSortByOptions } from '../../hooks';\nimport { useTranslation } from 'next-i18next';\nimport { useAppState, useAppDispatch } from '../../providers/app-provider';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { GOALS } from '../../constants';\n\ntype SortByDropDownProps = {\n isInvalidOrUnavailableOffer?: boolean;\n onChange?: () => void;\n filteredHotelCount?: number;\n};\n\nexport const SortByDropDown = ({\n filteredHotelCount,\n isInvalidOrUnavailableOffer,\n onChange,\n}: SortByDropDownProps) => {\n const { t } = useTranslation('sort-by-drop-down');\n const { sortType, shouldUsePoints } = useAppState();\n const dispatch = useAppDispatch();\n\n const metrics = useMetrics();\n\n const { sortByOptions: sortOptions } = useGetSortByOptions({\n filteredHotelsCount: filteredHotelCount,\n isInvalidOrUnavailableOffer,\n });\n\n const handleUsePointsOnSortChange = (sortBy: SortByDropDownValues) => {\n //When switching to -> Points andshouldUsePointsis not selected, force usePoints select\n if (isSortByPoints(sortBy) && !shouldUsePoints) {\n dispatch({ type: 'SET_USE_POINTS', payload: true });\n }\n //When switching to -> Price andshouldUsePointsis selected, force usePoints de-select\n if (isSortByPrice(sortBy) && shouldUsePoints) {\n dispatch({ type: 'SET_USE_POINTS', payload: false });\n }\n return;\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n dispatch({ type: 'SET_SORT_TYPE', payload: event.target.value as SortByDropDownValues });\n dispatch({ type: 'SET_PAGINATION_INDEX', payload: 0 });\n sendReward(GOALS.sortEngagement);\n metrics.propertySearchSort(event.target.value);\n if (onChange) {\n onChange();\n }\n handleUsePointsOnSortChange(event.target.value as SortByDropDownValues);\n };\n\n if (sortType === null || !sortOptions.length) return null;\n\n return (\n <Dropdown\n handleChange={handleChange}\n label={t('label')}\n options={sortOptions}\n value={sortType}\n />\n );\n};\n","export * from './sort-by-drop-down';\n","import { useTranslation } from 'next-i18next';\n\nexport const ZoomInForPricing = () => {\n const { t } = useTranslation('zoom-in-for-additional-pricing');\n\n return (\n <span className=\"absolute z-2 mt-4 w-28 text-wrap rounded-lg border border-text-alt bg-text/75 px-2 py-0.5 text-center text-sm text-text-inverse @[400px]:w-auto @[460px]:mt-3 max-2xl:top-12\">\n {t('zoomInForAdditionalPricing')}\n </span>\n );\n};\n","export * from './zoom-in-for-pricing';\n","import { createContext, useContext } from 'react';\nimport type MarkerClusterer from '@googlemaps/markerclustererplus';\n\ntype IMapContext = {\n apiKey?: string;\n clusterer?: MarkerClusterer;\n infoWindow?: google.maps.InfoWindow;\n infoWindowContainer?: HTMLDivElement;\n map?: google.maps.Map;\n setClusterer: (clusterer?: MarkerClusterer) => void;\n setInfoWindow: (infoWindow?: google.maps.InfoWindow) => void;\n setInfoWindowContainer: (infoWindowContainer?: HTMLDivElement) => void;\n setMap: (map?: google.maps.Map) => void;\n};\n\nconst defaultContext: IMapContext = {\n apiKey: undefined,\n clusterer: undefined,\n infoWindow: undefined,\n infoWindowContainer: undefined,\n map: undefined,\n setClusterer: () => null,\n setInfoWindow: () => null,\n setInfoWindowContainer: () => null,\n setMap: () => null,\n};\n\nexport const MapContext = createContext<IMapContext>(defaultContext);\n\nexport const useMap = () => {\n const context = useContext(MapContext);\n if (context === undefined) {\n throw new Error('useMap must be used within an MapProvider');\n }\n return context;\n};\n","import type * as React from 'react';\nimport { useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useMap } from './map.context';\n\ntype IMapInfoWindow = {\n children: React.ReactNode;\n /**\n * This event is fired when the close button is clicked.\n */\n onCloseClick?: () => void;\n position: google.maps.InfoWindowOptions['position'];\n};\n\n/**\n * Used as a wrapper to insert any React Component into\n */\nconst MapInfoWindow = ({ children, onCloseClick, position }: IMapInfoWindow) => {\n const { infoWindow, infoWindowContainer } = useMap();\n\n useEffect(() => {\n if (infoWindow) {\n if (position) {\n infoWindow.setPosition(position);\n }\n if (onCloseClick) {\n infoWindow.addListener('closeclick', onCloseClick);\n }\n }\n return () => {\n if (infoWindow) {\n google.maps.event.clearListeners(infoWindow, 'closeclick');\n }\n };\n }, [infoWindow, children, onCloseClick, position]);\n\n return infoWindowContainer ? createPortal(children, infoWindowContainer) : null;\n};\n\nexport default MapInfoWindow;\n","import type * as React from 'react';\n\nexport type MapMarkerColor = {\n active: string;\n inactive: string;\n};\n\nexport const MAP_MARKER_COLOR: Record<string, MapMarkerColor> = {\n POINTS_EXPLORER: { active: '#601b45', inactive: '#84235e' } as const,\n DEFAULT: { active: 'rgb(0 22 59)', inactive: 'rgb(0 47 97)' } as const,\n} as const;\n\nexport type IMapMarker = {\n /**\n * if `iconActive` is provided, this will switch to use that icon\n */\n isActive?: boolean;\n id: string | number;\n icon?: string;\n label?: string;\n children: React.ReactNode;\n color?: MapMarkerColor;\n /**\n * This event is fired when the marker is clicked.\n */\n onClick?: () => void;\n onMouseOver?: () => void;\n onMouseOut?: () => void;\n markerOptions?: google.maps.MarkerOptions;\n position: google.maps.MarkerOptions['position'];\n};\n\nconst MapMarker = ({ isActive, children }: IMapMarker) => (isActive ? children : null);\n\nexport default MapMarker;\n","import { useRef, useEffect } from 'react';\nimport { useMap } from './map.context';\n\nexport type IMapStaticMarker = {\n icon?: google.maps.MarkerOptions['icon'];\n position: google.maps.MarkerOptions['position'];\n shouldShowCenterMarker?: boolean;\n};\n\nconst MapStaticMarker = ({ icon = '', position, shouldShowCenterMarker }: IMapStaticMarker) => {\n const { map } = useMap();\n const centerMarker = useRef<google.maps.Marker | null>(null);\n\n useEffect(() => {\n if (map && position) {\n //if marker already drawn remove it.\n if (centerMarker.current) centerMarker.current.setMap(null);\n\n //draw new center marker on map\n\n centerMarker.current = shouldShowCenterMarker\n ? new google.maps.Marker({\n icon,\n map,\n position,\n })\n : null;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [icon, map, JSON.stringify(position)]);\n\n return null;\n};\n\nexport default MapStaticMarker;\n","import { useEffect, useRef, useState } from 'react';\nimport * as React from 'react';\nimport { useMap } from './map.context';\nimport type { IMapMarker, MapMarkerColor } from './map.marker';\nimport { MAP_MARKER_COLOR } from './map.marker';\nimport type { IMapStaticMarker } from './map.static-marker';\nimport type { ClusterIconStyle, MarkerClustererOptions } from '@googlemaps/markerclustererplus';\nimport MarkerClusterer from '@googlemaps/markerclustererplus';\n\nlet MARKER_Z_INDEX = 1;\n/**\n * Dynamically generates the price marker shape using SVG path syntax\n */\nconst getPriceMarkerPath: (width: number) => string = (width) => {\n const height = 15;\n const radius = 4;\n const tailHeight = 10;\n const tailWidth = 10;\n return `\n M 0 0\n l -${tailWidth / 2} -${tailHeight}\n h -${width / 2 - tailWidth / 2}\n a ${radius} ${radius} 0 0 1 -${radius} -${radius}\n v -${height}\n a ${radius} ${radius} 0 0 1 ${radius} -${radius}\n h ${width}\n a ${radius} ${radius} 0 0 1 ${radius} ${radius}\n v ${height}\n a ${radius} ${radius} 0 0 1 -${radius} ${radius}\n h -${width / 2 - tailWidth / 2}\n z`;\n};\n/**\n * Generates a marker with text overlayed on top of it\n * @param label - the text to display on the marker\n */\nconst getPriceMarker = (\n label: string,\n isActive: boolean,\n color?: MapMarkerColor\n): google.maps.Symbol => {\n const estimatedAverageCharacterWidth = 8;\n const width = label.length * estimatedAverageCharacterWidth;\n const defaultColor = MAP_MARKER_COLOR['DEFAULT'];\n return {\n path: getPriceMarkerPath(width),\n scale: 1,\n fillColor: isActive\n ? color?.active || defaultColor?.active\n : color?.inactive || defaultColor?.inactive,\n fillOpacity: 1,\n strokeColor: 'rgb(228 228 228)',\n strokeWeight: 1.2,\n labelOrigin: new google.maps.Point(0, -22),\n };\n};\n\ntype IMapMarkers = {\n children: React.ReactNode;\n clusterOptions?: MarkerClustererOptions;\n /**\n * If using an infoWindow, you must provide this prop in order to have it be closed when there is no active selection\n */\n activeMarker: IMapMarker['id'] | null;\n iconClusterPath?: ClusterIconStyle['url'];\n};\ntype ModifiedMarker = { id?: string } & google.maps.MarkerOptions;\n\nconst MapMarkers = ({ children, clusterOptions, activeMarker, iconClusterPath }: IMapMarkers) => {\n const { map, clusterer, setClusterer, infoWindow } = useMap();\n const { current: markers } = useRef<Map<string, ModifiedMarker>>(new Map());\n const [staticMarker, setStaticMarker] = useState<React.ReactNode>(null);\n\n const markersToDisplay = React.useMemo(\n () =>\n React.Children.map(children, (child) => {\n if (React.isValidElement<IMapMarker>(child)) {\n // this is reducing the time it takes the add/remove marker useEffect to run by just under 1 sec per run\n const { children: _children, ...propsWithoutChildren } = child.props;\n return propsWithoutChildren;\n }\n if (React.isValidElement<IMapStaticMarker>(child)) {\n setStaticMarker(child);\n }\n return null;\n })?.filter(Boolean) as IMapMarker[],\n [children]\n );\n const getMarker = (id?: IMapMarker['id']) =>\n markers.get(id as string) as google.maps.Marker | undefined;\n const addMarker = (m: IMapMarker) => {\n if (map && m) {\n const marker = new google.maps.Marker({\n id: m.id,\n icon: m.label\n ? getPriceMarker(m.label, !!m.isActive, m.color)\n : { url: m.icon, scaledSize: new google.maps.Size(22, 30) },\n label: m.label\n ? { text: m.label, color: '#ffffff', fontWeight: 'bold', fontFamily: 'Hilton Sans' }\n : undefined,\n position: m.position,\n optimized: false,\n visible: true,\n zIndex: MARKER_Z_INDEX++,\n clickable: true,\n ...m.markerOptions,\n } as ModifiedMarker);\n let originalZindex = marker.getZIndex();\n marker.addListener('mouseover', () => {\n originalZindex = marker.getZIndex();\n marker.setZIndex(MARKER_Z_INDEX + 1000);\n if (m.onMouseOver) {\n m.onMouseOver();\n }\n });\n marker.addListener('mouseout', () => {\n if (originalZindex) marker.setZIndex(originalZindex);\n if (m.onMouseOut) {\n m.onMouseOut();\n }\n });\n marker.addListener('click', () => {\n marker.setZIndex(MARKER_Z_INDEX + 1000);\n if (m.onClick) {\n m.onClick();\n }\n });\n markers.set(m.id as string, marker as ModifiedMarker);\n return marker;\n }\n };\n const removeMarker = (marker: google.maps.Marker) => {\n if (map && marker) {\n google.maps.event.clearListeners(marker, 'mouseover');\n markers.delete((marker as ModifiedMarker).id as string);\n return marker;\n }\n };\n\n useEffect(() => {\n if (map && infoWindow) {\n if (activeMarker) {\n const mapMarker = getMarker(activeMarker);\n if (mapMarker) {\n infoWindow.open({\n anchor: mapMarker as google.maps.MVCObject | google.maps.marker.AdvancedMarkerElement,\n map: map as google.maps.Map | google.maps.StreetViewPanorama,\n shouldFocus: false,\n });\n }\n } else {\n infoWindow.close();\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, infoWindow, activeMarker]);\n\n useEffect(() => {\n const shouldHaveCluster = iconClusterPath || clusterOptions;\n if (map) {\n if (shouldHaveCluster && !clusterer) {\n setClusterer(\n new MarkerClusterer(map, [], {\n averageCenter: true,\n minimumClusterSize: 4,\n maxZoom: 9,\n ignoreHidden: true,\n styles: [\n {\n textSize: 16,\n textColor: '#fff',\n url: iconClusterPath,\n height: 53,\n width: 53,\n anchorText: [16, 0],\n },\n ],\n ...(clusterOptions || {}),\n })\n );\n return;\n }\n\n // markers to update\n markersToDisplay.forEach((m) => {\n const marker = getMarker(m.id);\n if (marker) {\n // Anything that changes a label will require re-setting both label and icon on existing markers. Also update marker if icon state changes (no price => price marker for example)\n marker.setIcon(\n m.label\n ? getPriceMarker(m.label, !!m.isActive, m.color)\n : { url: m.icon || '', scaledSize: new google.maps.Size(22, 30) }\n );\n if (m.label !== marker.getLabel())\n if (m.label)\n marker.setLabel({\n text: m.label,\n color: '#ffffff',\n fontWeight: 'bold',\n fontFamily: 'Hilton Sans',\n });\n else marker.setLabel(null);\n }\n });\n // markers to add (exclude any marker w/out an id as it doesnt represent a ctyhocn)\n const markersToAdd = markersToDisplay\n .filter(({ id }) => !getMarker(id as string))\n .map((m) => addMarker(m))\n .filter((m) => m !== undefined && !!(m as ModifiedMarker).id) as google.maps.Marker[];\n if (clusterer) {\n clusterer.addMarkers(markersToAdd);\n } else {\n markersToAdd.forEach((m) => {\n m?.setMap(map);\n });\n }\n // markers to remove\n const toRemove = [...markers]\n .filter(([id, _marker]) => !markersToDisplay.find((m) => m.id === id))\n .map(([_id, marker]) => removeMarker(marker as google.maps.Marker))\n .filter((m) => m !== undefined);\n\n if (clusterer) {\n clusterer.removeMarkers(toRemove);\n } else {\n toRemove.forEach((m) => {\n m.setMap(null);\n });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, iconClusterPath, clusterOptions, clusterer, markersToDisplay]);\n\n return (\n <>\n {staticMarker}\n {children}\n </>\n );\n};\n\nexport default MapMarkers;\n","import type * as React from 'react';\nimport Image from 'next/legacy/image';\nimport { Link } from '@dx-ui/osc-link';\nimport { useMediaQuery } from 'usehooks-ts';\nimport cx from 'classnames';\n\nexport type InfoWindowProps = {\n /**Full address of the property */\n address?: string | null;\n /**Brand code to render brand logo bug */\n brandCode?: string;\n /** pill badges that flag exceptional attributes of the property such as\n * if a property is new or having a sale\n */\n hotelBadges?: React.ReactNode;\n /** Add additional Custom tailwind styling for info-window container */\n containerClassName?: string;\n /** Property ctyhocn */\n ctyhocn: string | null;\n /**Directions object -\n * title - sting that will display as link text, suggest to pass returned t function string value.\n * uri - link URI\n */\n directionsLink?: {\n linkCopy: string;\n url: string;\n };\n /** hotel name to be used as info-window title and logo bug alt*/\n name?: string | null;\n} & React.ComponentProps<'div'>;\n\nexport const InfoWindow = ({\n address,\n brandCode,\n children,\n containerClassName,\n ctyhocn,\n directionsLink,\n hotelBadges,\n name,\n}: InfoWindowProps) => {\n const isMobile = useMediaQuery('(max-width: 640px)');\n\n return (\n <div className={cx('max-w-sm bg-[#ffffff] text-[#121212] shadow-sm', containerClassName)}>\n <div\n className=\"flex max-w-xs rtl:flex-row-reverse\"\n data-testid={`${ctyhocn}-mapMarkerContent`}\n >\n {brandCode ? (\n <div className=\"order-first flex size-8 items-center text-center sm:size-12 rtl:order-last\">\n <Image\n alt={`${name || ctyhocn} logo`}\n className=\"object-contain\"\n src={`/modules/assets/svgs/logos/bug/${brandCode}.svg`}\n height={isMobile ? 32 : 48}\n width={isMobile ? 32 : 48}\n />\n </div>\n ) : null}\n <div className=\"flex flex-col items-start text-left\">\n {name ? <div className=\"w-full px-2 py-1 text-sm font-bold\">{name}</div> : null}\n {hotelBadges ? <div className=\"px-2 \">{hotelBadges}</div> : null}\n {address ? <div className=\"w-full px-2 py-1 text-xs\">{address}</div> : null}\n {directionsLink?.url && directionsLink?.linkCopy ? (\n <Link url={directionsLink.url} isNewWindow={true} className=\"px-2 text-xs sm:text-sm\">\n {directionsLink.linkCopy}\n </Link>\n ) : null}\n {children}\n </div>\n </div>\n </div>\n );\n};\n\nexport default InfoWindow;\n","export * from './map-info-window';\n","export * from './info-window';\n","export * from './lib';\n","import { useCallback, useMemo } from 'react';\n\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\nimport { isAffiliateHotel, useMetrics, useRenovationChip, useWrappedRouter } from '../../hooks';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport type { GoogleCoordinate } from '../../utils';\nimport {\n getCMAPrice,\n getLengthOfStay,\n isSpecialRatesDeeplinked,\n prefixPublicAssetUriWithAppPrefix,\n} from '../../utils';\nimport { isLocalCurrencySameAsHotelCurrency } from '../hotel-card/utils/hotel-info-utils';\nimport MapInfoWindow from './map.info-window';\nimport MapMarker, { MAP_MARKER_COLOR } from './map.marker';\nimport MapStaticMarker from './map.static-marker';\nimport MapMarkers from './map.markers';\nimport type { HotelBadgeTypes } from '../hotel-card/hotel-badges';\nimport { HotelBadges } from '../hotel-card/hotel-badges';\nimport { InfoWindow } from '@dx-ui/osc-map';\nimport { formatAndConvertPrice, useCurrencyConversion } from '@dx-ui/osc-currency-converter';\nimport useShopMultiPropAvail from '../../hooks/use-shop-multi-prop-avail/use-shop-multi-prop-avail';\nimport { MAX_PRICE_PROPERTY_LIMIT } from '../../constants';\n\nexport const SearchMapMarkers = ({\n centerCoordinate,\n matchId,\n sortedHotels,\n}: {\n centerCoordinate: GoogleCoordinate | null;\n matchId?: string | null;\n sortedHotels: HotelType[];\n}) => {\n const visibleHotels = sortedHotels\n ?.slice(0, MAX_PRICE_PROPERTY_LIMIT - 1)\n ?.map((hotel) => hotel.ctyhocn);\n\n const { safeQueryParams: queryParameters, router } = useWrappedRouter();\n\n const hasSpecialRatesDeepLinked = useMemo(\n () => isSpecialRatesDeeplinked(queryParameters),\n [queryParameters]\n );\n const { hashedData: hashedMPAData, isLoading: isMPADataLoading } = useShopMultiPropAvail({\n ctyhocns: visibleHotels,\n enabled: hasSpecialRatesDeepLinked,\n });\n\n const {\n activeProperty,\n selectedCurrency,\n selectedCtyhocn,\n shouldUsePoints,\n pageType,\n hasSpecialRate,\n } = useAppState();\n const { currenciesError, currenciesMap } = useCurrencyConversion();\n const dispatch = useAppDispatch();\n const metrics = useMetrics();\n const { isPointsExplorer } = pageType;\n const { renoChipConfig } = useRenovationChip();\n\n const handleMapMarkerClicked = useCallback(\n (ctyhocn: string, name?: string | null) => {\n dispatch({ type: 'SET_PDP_CTYHOCN', payload: ctyhocn });\n metrics.setBrandDetail({\n ctyhocn,\n view: 'Map',\n name: name || '',\n index: 1,\n });\n },\n [dispatch, metrics]\n );\n const showPointsInMarker = !hasSpecialRate && shouldUsePoints;\n const propertySearch = matchId?.includes('dx-hotel::');\n return (\n <MapMarkers\n activeMarker={activeProperty || selectedCtyhocn}\n iconClusterPath=\"/modules/assets/svgs/map/cluster/HI.svg\"\n >\n {/** Do not render static center marker if specific property searched */}\n <MapStaticMarker\n icon={prefixPublicAssetUriWithAppPrefix('/assets/map-pin-active.png')}\n position={centerCoordinate}\n shouldShowCenterMarker={!propertySearch}\n />\n {!isMPADataLoading &&\n sortedHotels.map(\n ({ address, brandCode, localization, ctyhocn, name, leadRate, amenityIds, display }) => {\n const badges: HotelBadgeTypes[] = [];\n if (hashedMPAData?.[ctyhocn]?.summary?.lowest?.ratePlan?.attributes?.includes('sale'))\n badges.push('sale');\n if (amenityIds.includes('newHotel')) badges.push('new');\n if (renoChipConfig?.includes(ctyhocn)) badges.push('recentlyRenovated');\n\n const position = {\n lat: localization?.coordinate?.latitude || 0,\n lng: localization?.coordinate?.longitude || 0,\n };\n const hasConfidentialRate =\n hashedMPAData?.[ctyhocn]?.summary?.lowest?.ratePlan?.confidentialRates;\n const currentHotel = hashedMPAData[ctyhocn];\n const isNotBookable =\n hashedMPAData &&\n currentHotel &&\n ((currentHotel.summary?.status?.type === 'NOT_AVAILABLE' &&\n !queryParameters?.datesFlex) ||\n currentHotel.summary?.status?.type === 'NOT_OPEN');\n\n // do not display prices/points when flexDates enabled or avail status is effectively not bookable. Fallback to price if pts not avail\n const displayPriceInMarker =\n !isNotBookable && !queryParameters?.datesFlex && !hasConfidentialRate;\n const displayPointsInMarker = showPointsInMarker && displayPriceInMarker;\n const { totalRate, totalRateFmt } = getCMAPrice({\n cmaTotalPriceIndicator:\n hashedMPAData?.[ctyhocn]?.summary?.lowest?.cmaTotalPriceIndicator,\n rateAmount: hashedMPAData?.[ctyhocn]?.summary?.lowest?.rateAmount,\n rateAmountFmt: hashedMPAData?.[ctyhocn]?.summary?.lowest?.rateAmountFmt,\n totalRate: hashedMPAData?.[ctyhocn]?.summary?.lowest?.amountAfterTax,\n totalRateFmt: hashedMPAData?.[ctyhocn]?.summary?.lowest?.amountAfterTaxFmt,\n lengthOfStay: getLengthOfStay(\n queryParameters?.departureDate,\n queryParameters?.departureDate\n ),\n });\n\n const markerPrice = hasConfidentialRate\n ? undefined\n : isLocalCurrencySameAsHotelCurrency(\n selectedCurrency,\n localization?.currencyCode || ''\n )\n ? totalRateFmt\n : formatAndConvertPrice({\n basePrice: !totalRate ? undefined : totalRate,\n currencyQueryError: !!currenciesError,\n fromCurrency: currenciesMap?.get('USD'),\n language: router.locale,\n toCurrency: currenciesMap.get(selectedCurrency || ''),\n }) || totalRateFmt;\n\n const markerPointsOrPrice =\n hashedMPAData?.[ctyhocn]?.summary?.hhonors?.dailyRmPointsRateFmt || markerPrice;\n\n const pointsRangeLabel = leadRate?.hhonors\n ? `${leadRate?.hhonors.min?.dailyRmPointsRateRoundFmt} - ${leadRate?.hhonors.max?.dailyRmPointsRateRoundFmt}`\n : '';\n const markerLabel =\n sortedHotels.length > 150\n ? undefined\n : displayPointsInMarker\n ? isPointsExplorer\n ? pointsRangeLabel\n : markerPointsOrPrice\n : displayPriceInMarker\n ? markerPrice\n : undefined;\n\n const isActive = activeProperty === ctyhocn || selectedCtyhocn === ctyhocn;\n const suppressBrandLogo = isAffiliateHotel(display);\n const icon =\n isActive && !isNotBookable && !isPointsExplorer\n ? prefixPublicAssetUriWithAppPrefix('/assets/map-pin-active.png')\n : isActive && isNotBookable && !isPointsExplorer\n ? prefixPublicAssetUriWithAppPrefix('/assets/map-pin-alt-active.png')\n : isNotBookable && !isPointsExplorer\n ? prefixPublicAssetUriWithAppPrefix('/assets/map-pin-alt.png')\n : prefixPublicAssetUriWithAppPrefix('/assets/map-pin.png');\n\n return (\n <MapMarker\n isActive={isActive}\n color={\n !!isPointsExplorer ||\n (!!showPointsInMarker &&\n hashedMPAData?.[ctyhocn]?.summary?.hhonors?.dailyRmPointsRateFmt)\n ? MAP_MARKER_COLOR['POINTS_EXPLORER']\n : undefined\n }\n icon={icon}\n id={ctyhocn}\n key={`map-marker-item-${ctyhocn}`}\n label={markerLabel || undefined}\n onClick={() => handleMapMarkerClicked(ctyhocn, name)}\n onMouseOut={() => dispatch({ type: 'UNSET_HIGHLIGHTED_MAP_CTYHOCN' })}\n onMouseOver={() =>\n dispatch({ type: 'SET_HIGHLIGHTED_MAP_CTYHOCN', payload: ctyhocn })\n }\n position={position}\n >\n <MapInfoWindow\n onCloseClick={() => dispatch({ type: 'SET_PDP_CTYHOCN', payload: null })}\n position={position}\n >\n <InfoWindow\n address={address ? `${address.addressLine1}, ${address.city}` : ''}\n brandCode={suppressBrandLogo ? undefined : brandCode || 'HI'}\n ctyhocn={ctyhocn}\n hotelBadges={<HotelBadges badges={badges} />}\n name={name || ''}\n containerClassName='w-56 sm:w-fit !font-[\"Hilton_Sans\"]'\n />\n </MapInfoWindow>\n </MapMarker>\n );\n }\n )}\n </MapMarkers>\n );\n};\n","import * as React from 'react';\nimport { useEffect, useRef } from 'react';\nimport { useMap } from './map.context';\nimport { MAPS_URL, MAX_ZOOM } from '../../constants';\nimport { isBrowser } from '@dx-ui/utilities-is-browser';\nimport { useRouter } from 'next/router';\nimport { getLanguageDirection } from '@dx-ui/utilities-get-language-direction';\nimport styles from './map.module.css';\nimport { useHotelQuadrantsQuery } from '@dx-ui/queries-dx-shop-search-ui';\n\ntype IMap = {\n children?: React.ReactNode;\n /**\n * setting `initialBounds` will use the google maps api method `fitBounds()` to set the zoom and center of the map\n */\n initialBounds?: google.maps.LatLngBoundsLiteral;\n /**\n * supports all options from https://developers.google.com/maps/documentation/javascript/reference/map#MapOptions\n */\n options?: google.maps.MapOptions;\n /**\n * whenever the map is panned or zoomed, the bounds of the map are changed.\n */\n onBoundsChange?: (bounds: google.maps.LatLngBoundsLiteral) => void;\n /**\n * whenever the map is panned, the bounds of the map are changed.\n */\n onPan?: (bounds: google.maps.LatLngBoundsLiteral) => void;\n /**\n * whenever the map is zoomed, the bounds of the map are changed.\n */\n onZoom?: () => void;\n /**\n * for development, it is nice to see the bounds that are passed for the initial view\n */\n showInitialBounds?: boolean;\n /**\n * for debug, see quad node boundaries and additional debug info\n */\n showQuadNodeBounds?: boolean;\n};\n/**\n * This is the base for the Google Maps JavaScript API\n *\n * https://developers.google.com/maps/documentation/javascript/reference/map\n */\nexport const MapBase = ({\n children,\n initialBounds,\n options,\n onBoundsChange,\n onPan,\n onZoom,\n showInitialBounds,\n showQuadNodeBounds,\n}: IMap) => {\n const { apiKey, setMap, setInfoWindow, setInfoWindowContainer, map } = useMap();\n const mapRef = useRef<HTMLDivElement>(null);\n const infoWindowRef = useRef<HTMLDivElement>(null);\n const hasDrawnInitialBoundingBox = useRef(false);\n const hasDrawnInitialQuadNodes = useRef(false);\n const router = useRouter();\n const resetMap = useRef(true); // reset map on every search 'Update' cta click\n const isMapInitialized = useRef(false);\n\n const { data: quadNodesData } = useHotelQuadrantsQuery(\n {},\n {\n enabled: isBrowser,\n }\n );\n\n useEffect(() => {\n const listeners: google.maps.MapsEventListener[] = [];\n\n const initMap = () => {\n // empty the array, but keep the reference\n listeners.length = 0;\n const map = new google.maps.Map(mapRef.current as HTMLDivElement, {\n clickableIcons: false,\n disableDefaultUI: true,\n zoomControl: true,\n zoomControlOptions: {\n position:\n getLanguageDirection(router.locale) === 'rtl'\n ? google.maps.ControlPosition.LEFT_TOP\n : google.maps.ControlPosition.RIGHT_TOP,\n },\n restriction: {\n latLngBounds: { north: 85, south: -85, west: -180, east: 180 },\n strictBounds: true,\n },\n maxZoom: MAX_ZOOM,\n ...options,\n });\n\n if (onBoundsChange) {\n listeners.push(\n map.addListener('bounds_changed', () => {\n const bounds = map.getBounds();\n if (bounds) {\n onBoundsChange(bounds.toJSON());\n }\n })\n );\n }\n if (onPan) {\n listeners.push(\n map.addListener('dragend', () => {\n const bounds = map.getBounds();\n if (bounds) {\n onPan(bounds.toJSON());\n }\n })\n );\n }\n if (onZoom) {\n const handleTilesLoaded = () => {\n if (!isMapInitialized.current) {\n isMapInitialized.current = true;\n listeners.push(map.addListener('zoom_changed', () => onZoom()));\n }\n };\n listeners.push(map.addListener('tilesloaded', handleTilesLoaded));\n }\n setMap(map);\n\n if (infoWindowRef.current) {\n setInfoWindowContainer(infoWindowRef.current);\n const newInfoWindow = new google.maps.InfoWindow({\n content: infoWindowRef.current,\n disableAutoPan: true,\n });\n setInfoWindow(newInfoWindow);\n }\n };\n\n if (!window.google) {\n const script = document.createElement('script');\n script.src = `${MAPS_URL}&key=${apiKey}&language=${router.locale}`;\n script.defer = true;\n script.async = true;\n\n script.onload = initMap;\n document.body.appendChild(script);\n } else {\n initMap();\n }\n\n return () => {\n listeners.forEach((listener) => listener.remove());\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //if bounds changes due to shallow route re-calc bounds!\n React.useEffect(() => {\n if (initialBounds && map && resetMap) {\n map.setZoom(9);\n map.fitBounds(initialBounds);\n resetMap.current = false;\n }\n router.events.on('routeChangeComplete', () => {\n resetMap.current = true;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(initialBounds), map, resetMap.current]);\n\n //Show debug initial bounds bbox\n React.useEffect(() => {\n if (showInitialBounds && map && initialBounds && !hasDrawnInitialBoundingBox.current) {\n new google.maps.Rectangle({ map, bounds: initialBounds, strokeWeight: 1, fillOpacity: 0.1 });\n hasDrawnInitialBoundingBox.current = true;\n }\n }, [showInitialBounds, map, initialBounds]);\n\n //Show debug of hotel quad nodes\n React.useEffect(() => {\n if (\n showQuadNodeBounds &&\n map &&\n !hasDrawnInitialQuadNodes.current &&\n quadNodesData?.hotelQuadrants\n ) {\n quadNodesData?.hotelQuadrants?.forEach((node) => {\n //rectangle representing node\n new google.maps.Rectangle({\n map,\n bounds: {\n south: Math.max(node?.bounds?.southwest?.latitude ?? -89.99, -89.99),\n west: Math.max(node?.bounds?.southwest?.longitude ?? -179.99, -179.99),\n north: Math.min(node?.bounds?.northeast?.latitude ?? 89.99, 89.99),\n east: Math.min(node?.bounds?.northeast?.longitude ?? 179.99, 179.99),\n },\n strokeWeight: 1,\n fillOpacity: 0.1,\n });\n //debug info corresponding to node\n new google.maps.Marker({\n position: {\n lat:\n ((node?.bounds?.northeast?.latitude ?? -89.99) +\n (node?.bounds?.southwest?.latitude ?? 89.99)) /\n 2,\n lng:\n ((node?.bounds?.northeast?.longitude ?? 179.99) +\n (node?.bounds?.southwest?.longitude ?? -179.99)) /\n 2,\n },\n map,\n label: {\n className: styles.node_debug_info,\n text: node?.id || 'no id',\n } as string | google.maps.MarkerLabel,\n });\n });\n hasDrawnInitialQuadNodes.current = true;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, quadNodesData?.hotelQuadrants]);\n\n return (\n <>\n <div\n className=\"absolute left-0 m-0 size-full p-0 md:top-0\"\n id=\"searchGoogleMaps\"\n ref={mapRef}\n />\n <div data-testid=\"mapMarker\" ref={infoWindowRef} />\n {children}\n </>\n );\n};\n","import type * as React from 'react';\nimport { useState } from 'react';\nimport { MapContext } from './map.context';\nimport type MarkerClusterer from '@googlemaps/markerclustererplus';\n\ntype MapProviderProps = { apiKey: string; children: React.ReactNode };\n\nconst MapProvider = ({ apiKey, children }: MapProviderProps) => {\n const [clusterer, setClusterer] = useState<MarkerClusterer>();\n const [infoWindow, setInfoWindow] = useState<google.maps.InfoWindow>();\n const [infoWindowContainer, setInfoWindowContainer] = useState<HTMLDivElement>();\n const [map, setMap] = useState<google.maps.Map>();\n\n return (\n <MapContext.Provider\n value={{\n apiKey,\n clusterer,\n infoWindow,\n infoWindowContainer,\n map,\n setClusterer,\n setInfoWindow,\n setInfoWindowContainer,\n setMap,\n }}\n >\n {children}\n </MapContext.Provider>\n );\n};\n\nexport default MapProvider;\n","import { env } from '../../constants';\nimport { useWrappedRouter } from '../../hooks';\nimport { MapBase } from './map.base';\nimport MapProvider from './map.provider';\n\nexport const Map = ({\n handleBoundsChange,\n hasUserPanned,\n hasUserZoomed,\n initialBounds,\n children,\n}: {\n handleBoundsChange: (newBounds: google.maps.LatLngBoundsLiteral) => void;\n hasUserPanned: React.MutableRefObject<boolean>;\n hasUserZoomed: React.MutableRefObject<boolean>;\n initialBounds: google.maps.LatLngBoundsLiteral;\n children: React.ReactNode;\n}) => {\n const { safeQueryParams: queryParameters } = useWrappedRouter();\n\n return (\n <MapProvider apiKey={env.MAP_API_KEY}>\n <MapBase\n initialBounds={initialBounds}\n onBoundsChange={(bounds) => handleBoundsChange(bounds)}\n onPan={() => {\n // need to know if user interacted with the map\n hasUserPanned.current = true;\n }}\n onZoom={() => (hasUserZoomed.current = true)}\n showInitialBounds={queryParameters?.showBbox}\n showQuadNodeBounds={queryParameters?.isDebugQuadTrees as boolean}\n >\n {children}\n </MapBase>\n </MapProvider>\n );\n};\n","import { useCallback } from 'react';\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\nimport { isAffiliateHotel, useMetrics, useRenovationChip, useWrappedRouter } from '../../hooks';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { prefixPublicAssetUriWithAppPrefix } from '../../utils';\nimport { isLocalCurrencySameAsHotelCurrency } from '../hotel-card/utils/hotel-info-utils';\nimport MapInfoWindow from './map.info-window';\nimport MapMarker, { MAP_MARKER_COLOR } from './map.marker';\nimport MapStaticMarker from './map.static-marker';\nimport MapMarkers from './map.markers';\nimport { getMapMarkerIcon, getMarkerPrice } from './map.utils';\nimport { InfoWindow } from '@dx-ui/osc-map';\nimport type { HotelBadgeTypes } from '../hotel-card/hotel-badges';\nimport { HotelBadges } from '../hotel-card/hotel-badges';\nimport { formatAndConvertPrice, useCurrencyConversion } from '@dx-ui/osc-currency-converter';\n\nexport const LocationsMapMarkers = ({\n centerCoordinate,\n hotelsInBounds,\n visibleHotels,\n}: {\n centerCoordinate: {\n lat: number;\n lng: number;\n };\n hotelsInBounds: Record<string, HotelType>;\n visibleHotels: string[];\n}) => {\n const { activeProperty, selectedCurrency, selectedCtyhocn, shouldUsePoints } = useAppState();\n const { currenciesError, currenciesMap } = useCurrencyConversion();\n const dispatch = useAppDispatch();\n const metrics = useMetrics();\n const { router } = useWrappedRouter();\n const { renoChipConfig } = useRenovationChip();\n const disableMarkerPrice = !!(visibleHotels.length > 150);\n\n const handleMapMarkerClicked = useCallback(\n (ctyhocn: string, name?: string | null) => {\n dispatch({ type: 'SET_PDP_CTYHOCN', payload: ctyhocn });\n metrics.setBrandDetail({\n ctyhocn,\n view: 'Map',\n name: name || '',\n index: 1,\n });\n },\n [dispatch, metrics]\n );\n\n return (\n <MapMarkers\n activeMarker={activeProperty || selectedCtyhocn}\n iconClusterPath=\"/modules/assets/svgs/map/cluster/HI.svg\"\n >\n <MapStaticMarker\n icon={prefixPublicAssetUriWithAppPrefix('/assets/map-pin-active.png')}\n position={centerCoordinate}\n shouldShowCenterMarker={true}\n />\n {visibleHotels.map((hotelCtyhocn) => {\n const hotel = hotelsInBounds[hotelCtyhocn];\n if (hotel) {\n const {\n ctyhocn,\n localization,\n brandCode: hotelBrandCode,\n name,\n address,\n amenityIds,\n } = hotel;\n\n const badges: HotelBadgeTypes[] = [];\n if (amenityIds.includes('newHotel')) badges.push('new');\n if (renoChipConfig?.includes(ctyhocn)) badges.push('recentlyRenovated');\n\n const coordinate = localization?.coordinate || null;\n const price =\n currenciesMap.size &&\n !isLocalCurrencySameAsHotelCurrency(\n selectedCurrency || '',\n hotel?.localization?.currencyCode || ''\n )\n ? formatAndConvertPrice({\n basePrice: !hotel?.leadRate?.lowest?.rateAmount\n ? undefined\n : hotel.leadRate?.lowest?.rateAmount,\n currencyQueryError: !!currenciesError,\n fromCurrency: currenciesMap?.get('USD'),\n language: router.locale,\n toCurrency: currenciesMap.get(selectedCurrency || ''),\n }) || hotel?.leadRate?.lowest?.rateAmountFmt\n : hotel?.leadRate?.lowest?.rateAmountFmt;\n const points = hotel?.leadRate?.hhonors?.lead?.dailyRmPointsRateNumFmt;\n\n if (!coordinate) return null;\n const position = { lat: coordinate.latitude, lng: coordinate.longitude };\n const isActive = activeProperty === ctyhocn || selectedCtyhocn === ctyhocn;\n const suppressBrandLogo = isAffiliateHotel(hotel?.display);\n return (\n <MapMarker\n isActive={isActive}\n color={\n !!shouldUsePoints && !!points ? MAP_MARKER_COLOR['POINTS_EXPLORER'] : undefined\n }\n icon={prefixPublicAssetUriWithAppPrefix(\n getMapMarkerIcon(isActive, disableMarkerPrice)\n )}\n id={ctyhocn}\n key={`map-marker-item-${ctyhocn}`}\n label={getMarkerPrice(disableMarkerPrice, shouldUsePoints, points, price)}\n onClick={() => handleMapMarkerClicked(ctyhocn, name)}\n onMouseOut={() => dispatch({ type: 'UNSET_HIGHLIGHTED_MAP_CTYHOCN' })}\n onMouseOver={() =>\n dispatch({ type: 'SET_HIGHLIGHTED_MAP_CTYHOCN', payload: ctyhocn })\n }\n position={position}\n >\n <MapInfoWindow\n onCloseClick={() => dispatch({ type: 'SET_PDP_CTYHOCN', payload: null })}\n position={position}\n >\n <InfoWindow\n address={address ? `${address.addressLine1}, ${address.city}` : ''}\n brandCode={suppressBrandLogo ? undefined : hotelBrandCode || 'HI'}\n ctyhocn={ctyhocn}\n hotelBadges={<HotelBadges badges={badges} />}\n name={name || ''}\n containerClassName='w-56 sm:w-fit !font-[\"Hilton-Sans\"]'\n />\n </MapInfoWindow>\n </MapMarker>\n );\n }\n return null;\n })}\n </MapMarkers>\n );\n};\n","import { MapListToggleButton } from '../map-list-toggle-button/map-list-toggle-button';\nimport { Spinner } from '@dx-ui/osc-spinner';\nimport { ZoomInForPricing } from '../zoom-in-for-pricing';\nimport { SearchMapMarkers } from './map.markers.search';\nimport { MAX_PRICE_PROPERTY_LIMIT } from '../../constants';\nimport { Map } from './map';\nimport { useAppState } from '../../providers/app-provider';\nimport { HotelSearchResultSummaryPanel } from '../hotel-search-result-summary/hotel-search-result-summary';\nimport { useConductricsSelection } from '@dx-ui/framework-conductrics';\nimport { useTranslation } from 'next-i18next';\nimport cx from 'classnames';\nimport type { ActiveFiltersState } from '../filters/filter.constants';\nimport type { MutableRefObject, RefObject } from 'react';\nimport type { DebouncedState } from 'usehooks-ts';\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\nimport { useWrappedRouter, useMapListToggle } from '../../hooks';\nimport { LocationsMapMarkers } from './map.markers.locations';\n// eslint-disable-next-line lodash/import-scope\nimport type { DebouncedFunc } from 'lodash';\nimport type { AmenityItem } from '../filters/suggested-filters';\nimport type { Maybe } from '@dx-ui/gql-types';\nimport { useConfigRule } from '@dx-ui/framework-config-rule-provider';\n\ntype MapProps = {\n showSpinner: boolean | undefined;\n visibleFilteredInBoundHotels: string[];\n handleBoundsChange:\n | DebouncedState<(newBounds: google.maps.LatLngBoundsLiteral) => void>\n | DebouncedFunc<(newBounds: google.maps.LatLngBoundsLiteral) => void>;\n hasUserPanned: MutableRefObject<boolean>;\n hasUserZoomed: MutableRefObject<boolean>;\n initialBounds:\n | {\n south: number;\n west: number;\n north: number;\n east: number;\n }\n | google.maps.LatLngBoundsLiteral;\n sortedHotels?: HotelType[];\n filterChange: (activeFiltersState: Partial<ActiveFiltersState>) => void;\n saleFilterCount?: number | undefined;\n showSaleFilter?: boolean;\n isFindingHotels: boolean;\n h1SearchResultsContent?: string;\n hotelCounterRef: RefObject<HTMLDivElement>;\n pageHeading1Title?: string;\n centerCoordinate: {\n lat: number;\n lng: number;\n };\n amenities: AmenityItem[] | undefined;\n matchId?: Maybe<string>;\n counterMessage?: {\n customCounterMessage: string;\n customCounterSRMessage: string;\n };\n};\nexport const MapBlock = ({\n showSpinner,\n visibleFilteredInBoundHotels,\n handleBoundsChange,\n hasUserPanned,\n hasUserZoomed,\n initialBounds,\n sortedHotels,\n filterChange,\n saleFilterCount,\n showSaleFilter,\n isFindingHotels,\n h1SearchResultsContent,\n hotelCounterRef,\n pageHeading1Title,\n amenities,\n matchId,\n centerCoordinate,\n counterMessage,\n}: MapProps) => {\n const { isListVisible, hotelsInBounds } = useAppState();\n const { isSlimView, isDesktopMapView } = useMapListToggle();\n const { t } = useTranslation('search-page');\n const {\n router: { asPath },\n } = useWrappedRouter();\n const isSearchPage = asPath.includes('/search/');\n const { taggedConfig } = useConfigRule();\n const shouldShowMap = isSearchPage ? !!taggedConfig?.config['showMap'] : true;\n const { isLoaded: isConductricsLoaded } = useConductricsSelection('');\n\n return (\n shouldShowMap && (\n <div\n className={cx('z-0 h-screen text-center @container max-md:w-full', {\n 'max-md:invisible absolute md:sticky md:top-0': isListVisible,\n 'max-sm:z-1 relative': !isListVisible,\n 'relative overflow-hidden': isDesktopMapView,\n })}\n data-testid=\"mapContainer\"\n >\n {/* Map/List toggle button */}\n {shouldShowMap && !isListVisible && (\n <HotelSearchResultSummaryPanel\n amenities={amenities}\n customCounterMessage={counterMessage?.customCounterMessage}\n customCounterSRMessage={counterMessage?.customCounterSRMessage}\n hotelCount={sortedHotels?.length ?? 0}\n isFindingHotels={isFindingHotels}\n isConductricsLoaded={isConductricsLoaded}\n matchId={matchId}\n onFilterChange={(activeFiltersState: ActiveFiltersState) =>\n filterChange(activeFiltersState)\n }\n pageHeading1Title={\n pageHeading1Title ??\n t('searchResults', {\n name: h1SearchResultsContent,\n })\n }\n saleFilter={{\n showSaleFilter: !!showSaleFilter,\n saleFilterCount: saleFilterCount ?? 0,\n }}\n visibleHotels={visibleFilteredInBoundHotels}\n showingHotelDivRef={hotelCounterRef}\n />\n )}\n <div className={cx('relative h-full overflow-hidden')}>\n <div className=\"absolute top-3 z-20 ltr:left-3 rtl:right-3\">\n <MapListToggleButton showMapListToggleButton={!isSlimView} />\n </div>\n\n {showSpinner && (\n <div\n className={cx('absolute z-1 ml-4 mt-4 bg-bg p-2 rtl:mr-4', {\n 'top-12': !isSlimView,\n })}\n >\n <Spinner className=\"text-hilton-alt\" size=\"lg\" />\n </div>\n )}\n {/* Show zoom in overlay on map if we have > 150 hotels on map */}\n {visibleFilteredInBoundHotels.length > MAX_PRICE_PROPERTY_LIMIT ? (\n <div className=\"flex justify-center\">\n <ZoomInForPricing />\n </div>\n ) : null}\n <Map\n handleBoundsChange={handleBoundsChange}\n hasUserPanned={hasUserPanned}\n hasUserZoomed={hasUserZoomed}\n initialBounds={initialBounds}\n >\n {isSearchPage && sortedHotels ? (\n <SearchMapMarkers\n centerCoordinate={centerCoordinate}\n matchId={matchId}\n sortedHotels={sortedHotels}\n />\n ) : (\n <LocationsMapMarkers\n centerCoordinate={centerCoordinate}\n hotelsInBounds={hotelsInBounds}\n visibleHotels={visibleFilteredInBoundHotels}\n />\n )}\n </Map>\n </div>\n </div>\n )\n );\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"node_debug_info\":\"map_node_debug_info___9ET3\"};","import { useTranslation } from 'react-i18next';\nimport { VERTICAL_SPACE_SAVINGS } from '../constants';\nimport { useGetMVTSelections } from './use-get-mvt-selections';\n\nexport const useVerticalSpaceMVT = () => {\n const { t } = useTranslation('filters');\n const {\n isLoaded: isVerticalSpaceMVTLoaded,\n isMVTVariant: {\n b: isVerticalSpaceVar1,\n c: isVerticalSpaceVar2,\n d: isVerticalSpaceVar3,\n e: isVerticalSpaceVar4,\n f: isVerticalSpaceVar5,\n g: isVerticalSpaceVar6,\n h: isVerticalSpaceVar7,\n i: isVerticalSpaceVar8,\n },\n } = useGetMVTSelections({\n agentId: VERTICAL_SPACE_SAVINGS.agentId,\n MVTVariants: ['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'],\n });\n const filterAndSortLabel = t('filterAndSort');\n const isFilterAndSortInAccordion =\n isVerticalSpaceVar1 || isVerticalSpaceVar5 || isVerticalSpaceVar6;\n const isSuggestedFiltersInHorizontalScroll =\n isVerticalSpaceVar4 || isVerticalSpaceVar6 || isVerticalSpaceVar8;\n const isShorterSuggestedFilters =\n isVerticalSpaceVar3 || isVerticalSpaceVar5 || isVerticalSpaceVar7;\n const isCurrencyAndSortInAllFiltersModal =\n isVerticalSpaceVar2 || isVerticalSpaceVar7 || isVerticalSpaceVar8;\n\n return isVerticalSpaceMVTLoaded\n ? {\n filterAndSortLabel,\n isFilterAndSortInAccordion,\n isShorterSuggestedFilters,\n isCurrencyAndSortInAllFiltersModal,\n isSuggestedFiltersInHorizontalScroll,\n isVerticalSpaceVar8,\n }\n : {};\n};\n","import { useAuth } from '@dx-ui/framework-auth-provider';\nimport { useWrappedRouter } from '../../../hooks';\nimport { useTranslation } from 'next-i18next';\nimport { useEffect, useRef } from 'react';\nimport cx from 'classnames';\n\nexport const PointsMessage = ({ className }: { className?: string }) => {\n const { guestInfo } = useAuth();\n const { t } = useTranslation('use-points');\n const { router } = useWrappedRouter();\n const pointsAvailable = guestInfo?.hhonors?.summary?.points;\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (ref?.current && router.query?.['pointsLogin']) return ref.current.focus();\n }, [router.query]);\n\n return (\n <div className={cx('text-sm font-bold text-tier-diamond', className)} ref={ref} tabIndex={-1}>\n <span className=\"sr-only\" aria-live=\"assertive\">\n {t('numPoints_a11y', { numPoints: pointsAvailable })}\n </span>\n <span aria-hidden=\"true\" className=\"text-nowrap\">\n {t('numPoints', { numPoints: pointsAvailable })}\n </span>\n </div>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { useTranslation } from 'next-i18next';\nimport { MAX_PROPERTIES_PER_LIST_VIEW_PAGE } from '../../constants';\n\nexport type HotelCounterProps = {\n count: number;\n currentPageIndex: number;\n customMessage?: string;\n customSRMessage?: string;\n isLoading: boolean;\n isListVisible: boolean;\n};\n\nexport const HotelCounter = ({\n count,\n currentPageIndex,\n isLoading,\n customMessage,\n customSRMessage,\n isListVisible,\n}: HotelCounterProps) => {\n const pageStart = currentPageIndex * MAX_PROPERTIES_PER_LIST_VIEW_PAGE + 1;\n const pageEnd =\n pageStart + MAX_PROPERTIES_PER_LIST_VIEW_PAGE - 1 < count\n ? pageStart + MAX_PROPERTIES_PER_LIST_VIEW_PAGE - 1\n : count;\n const { t } = useTranslation('hotel-counter-text');\n\n const message = customMessage\n ? customMessage\n : count > MAX_PROPERTIES_PER_LIST_VIEW_PAGE && isListVisible\n ? t('hotelShowingWithPages', { count, pageStart, pageEnd })\n : t('hotelShowingWithCount', { count });\n\n const srMessage = customSRMessage\n ? customSRMessage\n : count === 0\n ? t('notFoundMessage')\n : message;\n const [srCounter, setSrCounter] = useState(1);\n useEffect(() => {\n let interval: ReturnType<typeof setInterval>;\n if (isLoading) {\n interval = setInterval(() => setSrCounter(srCounter + 1), 3000);\n } else {\n setSrCounter(0);\n }\n return () => clearInterval(interval);\n }, [isLoading, srCounter]);\n\n return isLoading ? (\n <div>\n <h2\n aria-hidden\n className=\"text-sm font-semibold md:text-lg lg:text-xl\"\n data-testid=\"findingHotels\"\n >\n {t('findingHotels')}\n </h2>\n <span aria-live=\"assertive\" className=\"sr-only\">\n <span key={srCounter} role=\"status\">\n {t('findingHotels')}\n </span>\n </span>\n </div>\n ) : (\n <div>\n <h2\n className=\"mr-2 font-semibold md:mr-0 md:text-lg lg:text-xl \"\n data-testid=\"numberOfHotelsShowing\"\n >\n <span aria-hidden=\"true\">{message} </span>\n </h2>\n <span aria-atomic=\"true\" aria-live=\"assertive\" className=\"sr-only -order-1\">\n <span role=\"status\">{srMessage}</span>\n </span>\n </div>\n );\n};\n","export * from './hotel-counter';\n","import { type LoginResponse, useAuth } from '@dx-ui/framework-auth-provider';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { Dialog } from '@dx-ui/osc-dialog-v2';\nimport { LoginIFrame } from '@dx-ui/osc-login';\nimport { Trans, useTranslation } from 'next-i18next';\nimport { useCallback, useState } from 'react';\nimport { useIsClient } from 'usehooks-ts';\nimport { GOALS, env } from '../../../constants';\nimport { useWrappedRouter } from '../../../hooks';\nimport { generateSigninUrl } from '../../../utils';\nimport { InfoMessageBanner } from '../../info-message-banner/info-message-banner';\n\nexport const LogInBanner = () => {\n const isClient = useIsClient();\n const { t } = useTranslation('list-view');\n const { router } = useWrappedRouter();\n const { login, isAuthenticated } = useAuth();\n const [showLoginModal, setShowLoginModal] = useState<boolean>(false);\n\n const closeLoginModal = () => setShowLoginModal(false);\n const openLoginModal = () => {\n setShowLoginModal(true);\n sendReward(GOALS.shopLoginClick);\n };\n\n const lang = router.locale as string;\n const forgetInfoUrl = env.PARTNER_FORGET_INFO_LINK.replace('/__LANG__/', `/${lang}/`);\n const options = {\n showCreatePassword: false,\n forgetInfoLink: { url: forgetInfoUrl },\n secureInfoLink: { url: env.GLOBAL_PRIVACY_URL },\n signInLink: { url: generateSigninUrl(router.asPath, lang) },\n };\n\n const onSignInAttempt = useCallback(\n async (resp: LoginResponse) => {\n if (resp?.data) {\n await login(resp);\n window.location.reload();\n }\n },\n [login]\n );\n const handleLogin = async (resp: LoginResponse) => {\n await onSignInAttempt?.(resp);\n if (!resp.error) {\n closeLoginModal();\n sendReward(GOALS.shopHonorsLogin);\n }\n };\n\n return isClient && !isAuthenticated ? (\n <>\n <InfoMessageBanner\n bannerClassName=\"bg-tertiary\"\n iconClassName=\"text-bg\"\n iconName=\"star-burst\"\n >\n <div className=\"pl-2.5 pt-px font-bold text-bg\">\n <Trans\n ns=\"list-view\"\n i18nKey=\"loginBanner.getExclusiveRates\"\n components={{\n SignInLink: (\n <button onClick={openLoginModal} type=\"button\" className=\"font-normal underline\">\n signing in\n </button>\n ),\n }}\n />\n </div>\n </InfoMessageBanner>\n <Dialog\n isOpen={showLoginModal}\n onDismiss={closeLoginModal}\n size=\"md\"\n title={t('loginBanner.signIn')}\n >\n <LoginIFrame\n data-testid=\"loginIframe\"\n frameSrc={generateSigninUrl(router?.asPath, lang)}\n options={options}\n onLoginAttempt={handleLogin}\n onClose={closeLoginModal}\n title={t('loginBanner.signIn')}\n />\n </Dialog>\n </>\n ) : null;\n};\n","// The <abbr> tags announces the Abbreviation of states on the screen readers\n// This function will return the non-abbrevated form from the end of the Title\n// e.g. \"Hotels in New York, [NY](New York)\" becomes \"New York\"\nexport const getTitleExpandedAbbreviation = (title: string) => {\n if (title) return title.substring(title.indexOf('(') + 1, title.lastIndexOf(')'));\n};\n","import Markdown from 'markdown-to-jsx';\nimport * as React from 'react';\nimport { getTitleExpandedAbbreviation } from './locations-page.utils';\n\n// We're \"hijacking\" markdown's link syntax in order to create <abbr> tags\n// markdown-to-jsx doesn't handle spaces in the link's href, so we need to intercept the markdown and encode the href value\n// e.g. \"Hotels in New York, [NY](New York)\" becomes \"Hotels in New York, [NY](New%20York)\"\nconst sanitizeTitleMarkdown = (title: string) =>\n title?.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/,\n (_, abbreviation, expandedName) => `[${abbreviation}](${encodeURI(expandedName)})`\n );\nexport const LocationsPageHeadingLevel1 = ({ title }: { title: string | null | undefined }) => {\n const titleAbbreviationExpanded = title ? getTitleExpandedAbbreviation(title) : undefined;\n\n return title ? (\n <div className=\"mb-4 flex-1 text-left rtl:text-right\">\n <h1 className=\"font-sans text-xl font-bold\">\n <Markdown\n options={{\n createElement(type, props, children) {\n if (type === 'a') {\n const abbreviation = children;\n const expandedName = decodeURI((props as { href: string }).href);\n return React.createElement(\n 'abbr',\n {\n title: expandedName,\n style: { textDecoration: 'none' },\n key: `abbr-${JSON.stringify(children)}`,\n 'aria-hidden': true,\n },\n abbreviation\n );\n }\n return React.createElement(type, props, children);\n },\n }}\n >\n {sanitizeTitleMarkdown(title || '')}\n </Markdown>\n </h1>\n {titleAbbreviationExpanded && <span className=\"sr-only\">{titleAbbreviationExpanded}</span>}\n </div>\n ) : null;\n};\n","import type { AmenityItem } from '../filters/suggested-filters';\nimport { SuggestedFilterButtons } from '../filters/suggested-filters';\nimport { HotelCounter } from '../hotel-counter';\nimport { MapListToggleButton } from '../map-list-toggle-button/map-list-toggle-button';\nimport { useConfigRule } from '@dx-ui/framework-config-rule-provider';\nimport type { ActiveFiltersState } from '../filters/filter.constants';\nimport type { Maybe } from '@dx-ui/gql-types';\nimport { useAppState } from '../../providers/app-provider';\nimport { SMBProfileSwitcher } from '@dx-ui/osc-smb-profile-switcher';\nimport { useSmbToggle, useWrappedRouter } from '../../hooks';\nimport { LogInBanner } from '../list-view/log-in-banner/log-in-banner';\nimport { LocationsPageHeadingLevel1 } from '../locations-page/locations-page-heading';\nimport { useVerticalSpaceMVT } from '../../hooks/use-vertical-space-MVT';\n\nexport const HotelSearchResultSummaryPanel = ({\n amenities,\n customCounterMessage,\n customCounterSRMessage,\n hotelCount,\n isFindingHotels,\n isConductricsLoaded,\n matchId,\n onFilterChange,\n saleFilter,\n visibleHotels,\n pageHeading1Title,\n showingHotelDivRef,\n}: {\n amenities?: AmenityItem[];\n customCounterMessage?: string;\n customCounterSRMessage?: string;\n hotelCount: number;\n isFindingHotels: boolean;\n isConductricsLoaded: boolean;\n matchId?: Maybe<string>;\n onFilterChange?: (activeFiltersState: ActiveFiltersState) => void;\n saleFilter?: { showSaleFilter: boolean; saleFilterCount: number };\n visibleHotels: string[];\n pageHeading1Title: string;\n showingHotelDivRef?: React.Ref<HTMLDivElement>;\n}) => {\n const { taggedConfig } = useConfigRule();\n const configShowMap = taggedConfig?.config['showMap'] as boolean;\n const { isListVisible, paginationIndex } = useAppState();\n const { safeQueryParams: queryParameters, router } = useWrappedRouter();\n\n const { handleSMBSwitch, isSMBContextSwitchingEnabled } = useSmbToggle();\n const smbChecked = queryParameters?.smbRate || false;\n\n /* NHCSEARCH-5451 Vertical Space MVT */\n const { isSuggestedFiltersInHorizontalScroll } = useVerticalSpaceMVT();\n\n return (\n <>\n <div className=\"flex items-start justify-between\">\n {router.asPath.includes('/locations/') ? (\n <LocationsPageHeadingLevel1 title={pageHeading1Title} />\n ) : (\n <h1 className=\"mb-4 font-sans text-xl font-bold\">{pageHeading1Title}</h1>\n )}\n <MapListToggleButton showMapListToggleButton={configShowMap} className=\"md:hidden\" />\n </div>\n {isSMBContextSwitchingEnabled ? (\n <SMBProfileSwitcher\n className=\"mb-4\"\n onInputChange={handleSMBSwitch}\n isSmbChecked={smbChecked}\n />\n ) : null}\n {isSuggestedFiltersInHorizontalScroll ? null : (\n <SuggestedFilterButtons\n amenities={amenities}\n isConductricsLoaded={isConductricsLoaded}\n isFindingHotels={isFindingHotels}\n onFilterCriteriaChange={(activeFiltersState: ActiveFiltersState) => {\n if (onFilterChange) onFilterChange(activeFiltersState);\n }}\n visibleHotels={visibleHotels}\n matchId={matchId}\n saleFilter={saleFilter}\n />\n )}\n <LogInBanner />\n <div\n ref={showingHotelDivRef}\n tabIndex={-1}\n className=\"flex items-center justify-between pb-2\"\n >\n <HotelCounter\n count={hotelCount}\n customMessage={customCounterMessage}\n customSRMessage={customCounterSRMessage}\n currentPageIndex={paginationIndex}\n isListVisible={isListVisible}\n isLoading={isFindingHotels}\n />\n </div>\n </>\n );\n};\n","import { ControlClose } from '@dx-ui/osc-controls';\nimport { useTranslation } from 'next-i18next';\nimport cx from 'classnames';\nimport { useEffect, useRef } from 'react';\n\nexport const FeatureToolTip = ({\n absolutePosition,\n cta,\n containerClass,\n message,\n onDismiss,\n shouldShowFeatureToolTip,\n tailPosition,\n title,\n}: {\n absolutePosition: string;\n cta?: { label: string; onClick: () => void };\n containerClass?: string;\n message?: string;\n onDismiss: () => void;\n shouldShowFeatureToolTip: boolean;\n tailPosition?: string;\n title?: string;\n}) => {\n const { t } = useTranslation('osc-dialog');\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (ref.current) ref.current.focus();\n }, []);\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onDismiss?.();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [onDismiss]);\n\n return shouldShowFeatureToolTip ? (\n <div className={cx('absolute z-50', absolutePosition)} ref={ref} tabIndex={-1} role=\"tooltip\">\n <div\n className={cx(\n 'relative flex flex-col gap-2 rounded bg-tier-diamond text-base text-bg shadow-[0px_4px_4px_0px_rgba(0,0,0,0.40)]',\n containerClass\n )}\n >\n {title ? <div className=\"font-bold\">{title}</div> : null}\n <div>{message}</div>\n {cta?.label ? (\n <button\n type=\"button\"\n onClick={cta.onClick}\n className=\"self-start rounded-lg border border-bg px-4 py-2 text-sm\"\n >\n {cta.label}\n </button>\n ) : null}\n <div\n className={cx(\n 'absolute bottom-[-8px] size-0 border-x-8 border-t-8 border-transparent border-t-tier-diamond',\n tailPosition\n )}\n />\n </div>\n {!cta?.label ? (\n <ControlClose\n size=\"xs\"\n onClick={onDismiss}\n className=\"absolute end-0.5 top-0.5 text-bg\"\n label={t('close')}\n />\n ) : null}\n </div>\n ) : null;\n};\n","import type { TFunction } from 'i18next';\nimport type {\n HotelImageRatioName,\n HotelImageVariantSize,\n HotelQuery,\n Maybe,\n} from '@dx-ui/queries-dx-shop-search-ui';\nimport { getAspectRatioUrl } from '@dx-ui/utilities-images';\nimport { getNoPhotoAvailable } from '../../utils';\nimport type { IconNames } from '@dx-ui/osc-icon';\n\nexport const MOBILE_COMPARE_LIMIT = 2;\nexport const TABLET_COMPARE_LIMIT = 3;\nexport const DESKTOP_COMPARE_LIMIT = 5;\n\nexport const getParkingType = (\n parking: NonNullable<HotelQuery['hotel']>['parking'] | null | undefined,\n t: TFunction<['hotel-card', 'rate-name-cta', 'locations-page', 'compare-hotels'], undefined>\n) => {\n switch (true) {\n case parking?.hasFreeParking:\n return t('compare-hotels:freeParking');\n case parking?.hasValetParking:\n return t('compare-hotels:valetParking', {\n price: parking?.valetParkingCharge?.chargeAmountFmt,\n });\n case parking?.hasSelfParking && !!parking?.selfParkingCharge?.chargeAmountFmt:\n return t('compare-hotels:selfParking', {\n price: parking?.selfParkingCharge?.chargeAmountFmt,\n });\n default:\n return t('compare-hotels:noParking');\n }\n};\n\nexport const getRoomTypes = (\n rooms: NonNullable<HotelQuery['hotel']>['roomTypes'] | null | undefined,\n t: TFunction<['hotel-card', 'rate-name-cta', 'locations-page', 'compare-hotels'], undefined>\n) => {\n const types = new Set<string>();\n rooms?.forEach((room) => {\n if (room.suite) types.add(t('compare-hotels:suites'));\n else if (room.features.some((feature) => feature.name === 'Connecting rooms'))\n types.add(t('compare-hotels:connectedRooms'));\n else if (room?.numBeds)\n types.add(\n t('compare-hotels:bedWithCount', {\n count: room.numBeds,\n })\n );\n });\n const roomTypes: { type: string; icon: (typeof IconNames)[number] }[] = [];\n types?.forEach((type) => {\n if (type === t('compare-hotels:suites')) roomTypes.push({ type, icon: 'suites' });\n else if (type === t('compare-hotels:connectedRooms'))\n roomTypes.push({ type: t('compare-hotels:connectedRooms'), icon: 'connecting-rooms' });\n else\n roomTypes.push({\n type,\n icon: 'bed',\n });\n });\n return roomTypes.sort((a, b) => a.type.localeCompare(b.type));\n};\nexport const getModalSize = ({\n isMobile,\n isDesktop,\n compareCtyhocnsCount,\n}: {\n isMobile: boolean;\n isDesktop: boolean;\n compareCtyhocns?: string[];\n compareCtyhocnsCount: number;\n}) => {\n switch (true) {\n case isMobile:\n return 'lg';\n case isDesktop && compareCtyhocnsCount < 3:\n return '2xl';\n case isDesktop && compareCtyhocnsCount >= 4:\n return 'container';\n case isDesktop && compareCtyhocnsCount < 4:\n return '5xl';\n default:\n return 'xl';\n }\n};\n\ntype CompareImage = {\n altText?: Maybe<string>;\n ratios: Array<{ url?: Maybe<string>; size: HotelImageRatioName }>;\n variants: Array<{ size: HotelImageVariantSize; url?: Maybe<string> }>;\n};\nexport const getCompareImage = (image?: CompareImage | null) => {\n if (!!image?.ratios?.[0]) {\n const { imgUrl } = getAspectRatioUrl({\n src: image?.ratios?.[0]?.url,\n width: 326,\n });\n return { url: imgUrl, altText: image?.altText };\n }\n const noPhoto = getNoPhotoAvailable('xs')?.[0]?.variants[0];\n return { url: noPhoto?.url };\n};\n","import { keepPreviousData, useQueries } from '@tanstack/react-query';\nimport { HotelDocument } from '@dx-ui/queries-dx-shop-search-ui';\nimport type { HotelQuery } from '@dx-ui/queries-dx-shop-search-ui';\nimport { getMPAHotelRate } from '../../hotel-card/utils/hotel-mpa-rate-utils';\nimport {\n getHotelLeadRateInfo,\n type HotelCardData,\n} from '../../hotel-card/utils/hotel-lead-rate-utils';\nimport { useAppState } from '../../../providers/app-provider';\nimport { useRenovationChip, useWrappedRouter } from '../../../hooks';\nimport { useCurrencyConversion } from '@dx-ui/osc-currency-converter';\nimport useShopMultiPropAvail from '../../../hooks/use-shop-multi-prop-avail/use-shop-multi-prop-avail';\nimport { useTranslation } from 'next-i18next';\nimport type { HotelBadgeTypes } from '../../hotel-card/hotel-badges';\nimport { getDistanceFromCenterFmt, type GoogleCoordinate } from '../../../utils';\nimport { getCompareImage, getParkingType, getRoomTypes } from '../compare-hotel-utils';\nimport type { HotelInfoAttributes } from '../../hotel-card/utils/hotel-info-utils';\nimport { isIndividualRoomLimitExceeded } from '../../hotel-card/utils/hotel-info-utils';\n\nexport const useGetCompareHotelsInfo = ({\n ctyhocns,\n centerCoordinate,\n displayHotelCount = 0,\n isEnabled,\n}: {\n ctyhocns: string[];\n centerCoordinate: GoogleCoordinate | null;\n displayHotelCount?: number;\n isEnabled?: boolean;\n}) => {\n const {\n hasConnectingRooms,\n selectedCurrency = '',\n shouldUsePoints = false,\n pageType,\n hasSpecialRate,\n } = useAppState();\n const { safeQueryParams: queryParameters, router } = useWrappedRouter();\n const isDateFlex = queryParameters?.datesFlex || false;\n const { currenciesError, currenciesMap } = useCurrencyConversion();\n const { t } = useTranslation(['hotel-card', 'rate-name-cta', 'locations-page', 'compare-hotels']);\n const { isPointsExplorer, isDateSearch, isDreams } = pageType;\n const numOfChildren =\n queryParameters?.rooms\n .map((room) => room.children)\n .reduce((previous: number, current: number) => previous + current) || 0;\n\n const hotelsQueryArr = ctyhocns.map((ctyhocn) => {\n const variables = { language: 'en', ctyhocn, ratios: 'threeByTwo' };\n return {\n queryKey: [HotelDocument, variables],\n placeholderData: keepPreviousData,\n retry: 2,\n staleTime: 1000 * 60 * 10,\n enabled: isEnabled,\n };\n });\n const results = useQueries({\n queries: hotelsQueryArr,\n });\n const hotelData = results.map((hotel) => hotel.data as HotelQuery);\n const { renoChipConfig } = useRenovationChip();\n\n const { hashedData: priceInfoCollection, isLoading: isMPALoading } = useShopMultiPropAvail({\n ctyhocns: ctyhocns.map((ctyhocn) => ctyhocn),\n mpaConstraints: true,\n enabled: router.asPath.includes('/search/'),\n });\n const hotelInfo = hotelData.map((hotelData) => {\n const hotel = hotelData?.hotel;\n const isRenoHotel = renoChipConfig.includes(hotel?.ctyhocn);\n const currentHotelPriceInfo = hotel?.ctyhocn ? priceInfoCollection[hotel.ctyhocn] : undefined;\n const isIndividualRoomsOnly = isIndividualRoomLimitExceeded(\n currentHotelPriceInfo?.statusCode,\n queryParameters\n );\n let hotelRateInfo: HotelInfoAttributes = {};\n if ((!!priceInfoCollection && isDateSearch) || isPointsExplorer || isDateFlex) {\n hotelRateInfo = getMPAHotelRate({\n numOfChildren,\n usePoints: shouldUsePoints,\n isDateFlex,\n hasSpecialRate,\n hotelData: hotel as HotelCardData,\n priceInfo: currentHotelPriceInfo,\n t,\n locale: router.locale ?? 'en',\n pageType,\n ctyhocn: hotel?.ctyhocn,\n queryParameters,\n selectedCurrency,\n hasConnectingRooms,\n isPointsExplorer,\n currenciesError,\n currenciesMap,\n isIndividualRoomsOnly,\n });\n } else if (isDreams) {\n hotelRateInfo = getHotelLeadRateInfo({\n hotelData: hotel as HotelCardData,\n locale: router.locale ?? 'en',\n ctyhocn: hotel?.ctyhocn,\n usePoints: shouldUsePoints,\n selectedCurrency,\n hasConnectingRooms,\n currenciesError,\n currenciesMap,\n pageType,\n t,\n queryParameters,\n });\n }\n\n const badges: HotelBadgeTypes[] = [];\n if (hotelRateInfo.isNewHotel) badges.push('new');\n if (hotelRateInfo.isSaleHotel) badges.push('sale');\n if (isRenoHotel) badges.push('recentlyRenovated');\n\n const { distanceFmt: distance } = getDistanceFromCenterFmt(\n t,\n centerCoordinate,\n hotel?.localization?.coordinate,\n router.locale\n );\n const {\n ctyhocn,\n images,\n name,\n tripAdvisorLocationSummary,\n parking,\n amenities: hotelAmenities,\n roomTypes,\n } = hotelData?.hotel ?? {};\n const parkingType = getParkingType(parking, t);\n const rooms = getRoomTypes(roomTypes, t).slice(0, 3);\n const masterImage = getCompareImage(images?.carousel?.[0]);\n const { ctaHref, ctaLabel, messages } = hotelRateInfo ?? {};\n const amenities = hotelAmenities\n ?.filter((amenity) => !amenity.name.includes('parking'))\n ?.slice(0, 4);\n\n return {\n ctyhocn,\n name,\n tripAdvisorLocationSummary,\n amenities,\n rooms,\n badges,\n distance,\n parkingType,\n masterImage,\n ctaHref,\n ctaLabel,\n messages,\n };\n });\n return {\n isFetching: results.some((result) => result.isFetching),\n isMPALoading,\n hotelInfo: hotelInfo?.slice(0, displayHotelCount),\n };\n};\n","export const CompareSkeleton = ({ numHotels }: { numHotels: number }) => (\n <div className=\"flex w-full\">\n {Array.from({ length: numHotels })\n .fill('_')\n .map((_, i) => (\n <div\n className=\"grid size-full min-w-40 max-w-[336px] items-start border border-border\"\n // eslint-disable-next-line react/no-array-index-key\n key={`compare-skeleton-${i}`}\n >\n {/* image */}\n <div className=\"h-48 w-full animate-pulse border-b border-border bg-bg-alt\" />\n {/* title */}\n <div className=\"w-full self-start border-b border-border p-2\">\n <div className=\"h-6 animate-pulse bg-bg-alt\" />\n </div>\n {/* trip advisor */}\n <div className=\"flex w-full flex-col justify-start gap-1 border-b border-border p-2\">\n <div className=\" h-3 w-32 animate-pulse bg-bg-alt\" />\n <div className=\" h-6 w-28 animate-pulse bg-bg-alt\" />\n <div className=\" h-3 w-32 animate-pulse bg-bg-alt\" />\n </div>\n {/* pricing */}\n <div className=\"flex w-full flex-col justify-start gap-1 border-b border-border p-2\">\n <div className=\" h-12 w-24 animate-pulse bg-bg-alt\" />\n <div className=\" h-4 w-32 animate-pulse bg-bg-alt\" />\n </div>\n {/* parking */}\n <div className=\"flex w-full flex-col gap-1 self-start border-b border-border p-2\">\n <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n </div>\n {/* amenities */}\n <div className=\"flex w-full flex-col gap-1 self-start border-b border-border p-2\">\n <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n </div>\n {/* rooms */}\n <div className=\"flex w-full flex-col gap-1 self-start border-b border-border p-2\">\n <div className=\" h-4 w-32 animate-pulse bg-bg-alt\" />\n <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n </div>\n {/* CTA */}\n <div className=\"flex w-full flex-col items-center gap-1 p-2\">\n <div className=\" h-10 w-full animate-pulse bg-bg-alt\" />\n {numHotels > 2 ? <div className=\" h-6 w-1/2 animate-pulse bg-bg-alt\" /> : null}\n </div>\n </div>\n ))}\n </div>\n);\n","import { Dialog } from '@dx-ui/osc-dialog-v2';\nimport { useTranslation } from 'next-i18next';\nimport { useMediaQuery } from 'usehooks-ts';\nimport { useWrappedRouter } from '../../hooks';\nimport { getModalSize, MOBILE_COMPARE_LIMIT, TABLET_COMPARE_LIMIT } from './compare-hotel-utils';\n\nimport { useGetCompareHotelsInfo } from './hooks/use-get-compare-hotels';\nimport Image from 'next/image';\nimport { CompareSkeleton } from './compare-skeleton';\nimport { TripAdvisorRating } from '../trip-advisor/trip-advisor-rating';\nimport Icon from '@dx-ui/osc-icon';\nimport { RateInfoMessages } from '../rate-name-cta/rate-name-cta';\nimport { Link } from '@dx-ui/osc-link';\nimport { HotelBadges } from '../hotel-card/hotel-badges';\nimport type { GoogleCoordinate } from '../../utils';\nimport { useAppDispatch } from '../../providers/app-provider';\n\ntype CompareModalProps = {\n centerCoordinate: GoogleCoordinate | null;\n hotelsToCompare: string[];\n isOpen: boolean;\n onDismiss: () => void;\n onStopCompare?: () => void;\n};\nexport const CompareModal = ({\n hotelsToCompare,\n isOpen,\n onDismiss,\n onStopCompare,\n centerCoordinate,\n}: CompareModalProps) => {\n const { t } = useTranslation('compare-hotels');\n const {\n router: { asPath },\n } = useWrappedRouter();\n const isDesktop = useMediaQuery('(min-width:1024px)');\n const isMobile = useMediaQuery('(max-width:640px)');\n const isTablet = useMediaQuery(`(max-width:1023px)`);\n\n const dispatch = useAppDispatch();\n\n const showRemoveCTA = hotelsToCompare.length > 2;\n\n const modalSize = getModalSize({\n isMobile,\n isDesktop: isTablet || isDesktop,\n compareCtyhocnsCount: hotelsToCompare?.length || 0,\n });\n\n const onRemoveHotel = (ctyhocnToRemove?: string) => {\n if (ctyhocnToRemove) {\n const newCtyhocnList = hotelsToCompare?.filter((hotel) => hotel !== ctyhocnToRemove);\n dispatch({ type: 'SET_HOTELS_TO_COMPARE', payload: newCtyhocnList });\n }\n };\n let displayHotelCount = hotelsToCompare?.length;\n\n if (isMobile) displayHotelCount = MOBILE_COMPARE_LIMIT;\n else if (isTablet)\n displayHotelCount =\n hotelsToCompare.length > TABLET_COMPARE_LIMIT ? TABLET_COMPARE_LIMIT : hotelsToCompare.length;\n\n const { hotelInfo, isMPALoading, isFetching } = useGetCompareHotelsInfo({\n ctyhocns: hotelsToCompare,\n centerCoordinate,\n displayHotelCount,\n isEnabled: isOpen,\n });\n\n const handleOnDismiss = (\n event: React.MouseEvent | React.KeyboardEvent,\n isStopCompare?: boolean\n ) => {\n if (!!isStopCompare) {\n event.preventDefault();\n event.stopPropagation();\n }\n onDismiss();\n };\n\n const handleStopComparing = (event: React.MouseEvent | React.KeyboardEvent) => {\n if (hotelsToCompare.length) dispatch({ type: 'SET_HOTELS_TO_COMPARE', payload: [] });\n if (onStopCompare) setTimeout(() => onStopCompare(), 50);\n handleOnDismiss(event, true);\n };\n\n const stopComparingButton = () => (\n <div className=\"sticky -bottom-4 flex h-full items-center justify-center bg-bg py-2\">\n <button\n className=\"btn-primary-link mt-2.5 text-sm\"\n type=\"button\"\n onClick={handleStopComparing}\n >\n {t('stopComparing')}\n </button>\n </div>\n );\n\n return (\n <Dialog\n bottomContent={stopComparingButton()}\n isOpen={isOpen}\n size={modalSize}\n title={t('compare')}\n onDismiss={handleOnDismiss as () => void}\n dialogClassName=\"max-h-[90vh]\"\n stickyHeader\n >\n {isFetching || isMPALoading ? (\n <CompareSkeleton numHotels={hotelsToCompare.length} />\n ) : (\n <div className=\"flex flex-col overflow-auto\">\n <table className=\"border border-border-alt\">\n <tr>\n {hotelInfo.map((data) => {\n return (\n <td\n className=\"h-full border-2 border-border-alt p-0\"\n key={`${data?.ctyhocn}-image`}\n >\n <Image\n alt={data?.masterImage?.altText ?? ''}\n width={600}\n height={400}\n src={data?.masterImage?.url ?? ''}\n unoptimized={true}\n data-testid=\"carousel-image\"\n />\n </td>\n );\n })}\n </tr>\n <tr>\n {hotelInfo.map((data) => {\n return (\n <th\n className=\"border-2 border-border p-2 text-left align-top text-sm font-bold\"\n key={data?.name}\n scope=\"col\"\n >\n {data?.name}\n\n {data?.badges ? <HotelBadges badges={data?.badges} /> : null}\n <span\n className=\"block whitespace-nowrap text-xs font-normal text-text-alt\"\n data-testid=\"distanceMarker\"\n >\n {data?.distance}\n </span>\n </th>\n );\n })}\n </tr>\n <tr>\n {hotelInfo.map((data) => {\n const tripAdvisorLocationSummary = data?.tripAdvisorLocationSummary;\n return (\n <td\n className=\"border-2 border-border p-2\"\n key={tripAdvisorLocationSummary?.numReviews}\n >\n <TripAdvisorRating\n tripAdvisorLocationSummary={tripAdvisorLocationSummary}\n showReviewCount\n isCompare\n />\n </td>\n );\n })}\n </tr>\n <tr>\n {hotelInfo.map((data) => {\n return (\n <td className=\"border-2 border-border p-2\" key={`${data?.ctyhocn}-rate`}>\n <RateInfoMessages rateMessages={data?.messages} isCompare />\n </td>\n );\n })}\n </tr>\n <tr>\n {hotelInfo.map((data) => {\n return (\n <td\n className=\"items-center gap-0.5 border-2 border-border p-2 text-sm\"\n key={`${data?.ctyhocn}-parking`}\n >\n <div className=\"flex items-start sm:items-center\">\n <Icon name=\"parking\" />\n <span>{data?.parkingType}</span>\n </div>\n </td>\n );\n })}\n </tr>\n <tr>\n {hotelInfo.map((data) => {\n return (\n <td\n className=\"items-center gap-0.5 border-2 border-border p-2 text-sm\"\n key={`${data?.ctyhocn}-amenities`}\n >\n <ul className=\"grid grid-cols-1 text-sm\">\n {data?.amenities?.map((amenity) => (\n <li key={amenity.id} className=\"flex items-center gap-0.5\">\n <Icon name=\"check\" />\n <span> {amenity.name}</span>\n </li>\n ))}\n </ul>\n </td>\n );\n })}\n </tr>\n <tr>\n {hotelInfo.map((data) => (\n <td\n className=\"items-center gap-0.5 border-2 border-border p-2 text-sm\"\n key={`${data?.ctyhocn}-rooms`}\n >\n <ul className=\"grid grid-cols-1 gap-1.5 text-sm font-bold\">\n <p>\n {t(\n asPath.includes('/locations/') ? 'roomTypesOffered' : 'roomTypesAvailable'\n )}\n </p>\n {data?.rooms?.map((room) => (\n <li\n key={room?.type}\n className=\"flex items-start gap-0.5 font-normal sm:items-center\"\n >\n <Icon name={room.icon} />\n <span> {room.type}</span>\n </li>\n ))}\n </ul>\n </td>\n ))}\n </tr>\n <tr>\n {hotelInfo.map((data) => {\n const ctaHref = data?.ctaHref;\n const ctaLabel = data?.ctaLabel;\n return (\n <td\n className=\"items-center gap-0.5 border-2 border-border p-2 text-sm\"\n key={ctaHref}\n >\n <div className=\"flex size-full flex-col justify-end gap-3 p-2 font-bold\">\n {ctaHref && ctaLabel ? (\n <Link\n url={ctaHref}\n className=\"btn btn-primary flex w-full justify-center no-underline\"\n target=\"_blank\"\n showNewWindowIcon={false}\n >\n {ctaLabel.text}\n </Link>\n ) : null}\n {showRemoveCTA ? (\n <button\n className=\"btn-primary-link hidden text-sm lg:block\"\n type=\"button\"\n onClick={() => onRemoveHotel(data?.ctyhocn)}\n >\n {t('remove')}\n </button>\n ) : null}\n </div>\n </td>\n );\n })}\n </tr>\n </table>\n </div>\n )}\n </Dialog>\n );\n};\n","import { useTranslation } from 'next-i18next';\nimport { InfoMessageBanner } from '../info-message-banner/info-message-banner';\nimport { useMediaQuery } from 'usehooks-ts';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { GOALS } from '../../constants';\nimport { useState } from 'react';\nimport { DESKTOP_COMPARE_LIMIT, MOBILE_COMPARE_LIMIT } from './compare-hotel-utils';\nimport { CompareModal } from './compare-modal';\nimport type { GoogleCoordinate } from '../../utils';\n\ntype CompareBarProps = {\n hotelsToCompare?: string[];\n centerCoordinate: GoogleCoordinate | null;\n onCompare?: () => void;\n onStopCompare?: () => void;\n};\n\nexport const CompareBar = ({ onStopCompare, onCompare, centerCoordinate }: CompareBarProps) => {\n const { t } = useTranslation('compare-hotels');\n const isMobile = useMediaQuery('(max-width:640px)');\n const [showCompareModal, setShowCompareModal] = useState<boolean>(false);\n const { hotelsToCompare, compareHotelsToggle: showCompareBar } = useAppState();\n const dispatch = useAppDispatch();\n\n const selectHotelsBannerMessage = () => {\n if (hotelsToCompare.length < 2) {\n if (hotelsToCompare.length === 1) return t('selectOneMoreHotel');\n return t('selectHotelsToStart');\n }\n return null;\n };\n\n const handleCompareHotels = () => {\n if (onCompare) onCompare();\n sendReward(GOALS.compareHotelsCTAClick);\n setShowCompareModal(true);\n };\n\n const closeCompareModal = () => setShowCompareModal(false);\n\n const handleStopComparing = () => {\n if (hotelsToCompare.length) dispatch({ type: 'SET_HOTELS_TO_COMPARE', payload: [] });\n closeCompareModal();\n onStopCompare?.();\n };\n\n return showCompareBar && hotelsToCompare.length ? (\n <>\n <div\n className=\"sticky bottom-0 z-10 flex w-full flex-col items-center justify-between gap-3 border-t-2 border-border bg-bg-alt p-4 md:flex-row\"\n data-testId=\"compare-hotels-bar\"\n >\n {hotelsToCompare.length < 2 ? (\n <InfoMessageBanner bannerClassName=\"bg-bg-alt gap-3 flex items-center pb-0 font-base\">\n <span aria-live=\"assertive\"> {selectHotelsBannerMessage()} </span>\n </InfoMessageBanner>\n ) : (\n <div aria-live=\"assertive\">\n {t('numOfHotelsCompared', {\n compareHotelsSelected: hotelsToCompare.length,\n compareLimit: isMobile ? `${MOBILE_COMPARE_LIMIT}` : `${DESKTOP_COMPARE_LIMIT}`,\n })}\n </div>\n )}\n <div className=\"flex w-full flex-col-reverse gap-4 text-sm md:w-auto md:flex-row\">\n {hotelsToCompare.length ? (\n <button type=\"button\" onClick={handleStopComparing} className=\"btn-primary-link\">\n {t('stopComparing')}\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"btn-primary w-full rounded p-3 font-bold disabled:bg-text-disabled md:w-72 lg:w-[343px]\"\n disabled={hotelsToCompare.length < 2}\n onClick={handleCompareHotels}\n >\n {t('compareHotels')}\n </button>\n </div>\n </div>\n <CompareModal\n centerCoordinate={centerCoordinate}\n hotelsToCompare={[...hotelsToCompare]}\n isOpen={showCompareModal}\n onDismiss={closeCompareModal}\n onStopCompare={onStopCompare}\n />\n </>\n ) : null;\n};\n","import type * as React from 'react';\nimport { ControlNext, ControlBack } from '@dx-ui/osc-controls';\nimport { useTranslation } from 'next-i18next';\n\nexport type Pagination = {\n /**\n * `id` of the element pagination controls for usage with aria-controls\n */\n controls?: string;\n /**\n * Current active page (zero based)\n */\n current?: number;\n /**\n * The text displayed in front of the page numbers and used for a11y\n */\n label?: string;\n /**\n * Whether to visually hide the label\n */\n hideLabel?: boolean;\n /**\n * Controls whether or not to disable buttons at either end\n */\n loop?: boolean;\n /**\n * Total number of pages\n */\n total?: number;\n /**\n * When the page is selected from the dropdown\n */\n onChange?: (val: number) => void;\n onPreviousClick?: React.DOMAttributes<HTMLButtonElement>['onClick'];\n onNextClick?: React.DOMAttributes<HTMLButtonElement>['onClick'];\n /** Pagination item id */\n groupId?: string;\n};\n\n/**\n * Use when you need a control to cycle through \"pages\" or any paginated data.\n *\n * Pass the `current` page _(zero-based)_ and `total` pages, if you want to allow the select element to jump to a specific page, include the `onChange` callback. You can include listeners for `onPreviousClick` and `onNextClick` to change pages one by one.\n */\nexport const Pagination: React.FC<React.PropsWithChildren<Pagination>> = ({\n controls,\n loop,\n onChange,\n onPreviousClick,\n onNextClick,\n hideLabel,\n current = 0,\n total = 0,\n label,\n groupId,\n}) => {\n const { t } = useTranslation('osc-pagination');\n // eslint-disable-next-line prefer-spread\n const pageNumbers = Array.apply(null, Array(total));\n const prevDisabled = loop ? false : current === 0;\n const nextDisabled = loop ? false : current === total - 1;\n\n const paginationLabel = label ?? t('defaultLabel');\n\n return (\n <div className=\"pointer-events-auto flex items-center justify-center space-x-4\">\n <div className=\"sr-only\" aria-live=\"polite\">{`${paginationLabel} ${t('count', {\n current: current + 1,\n total,\n })}`}</div>\n <ControlBack\n id={groupId ? `pagination-left-${groupId}` : 'pagination-left'}\n size=\"lg\"\n aria-controls={controls}\n onClick={onPreviousClick}\n disabled={prevDisabled}\n label={`${t('previousLabel', { label: paginationLabel })}, ${t('count', {\n current: current - 1 < 0 ? total : current,\n total,\n })}`}\n />\n <div className=\"flex items-center justify-center\">\n {onChange ? (\n <>\n {!hideLabel && <span className=\"pr-2\">{paginationLabel}</span>}\n <label>\n <span className=\"sr-only\">{t('prompt', { label: paginationLabel })}</span>\n <select\n aria-controls={controls}\n className=\"form-select\"\n value={current}\n onBlur={(e) => onChange(parseInt(e.currentTarget.value, 10))}\n onChange={(e) => onChange(parseInt(e.currentTarget.value, 10))}\n >\n {pageNumbers.map((_, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <option key={index} value={index}>\n {index + 1}\n </option>\n ))}\n </select>\n </label>\n <span className=\"pl-2\">{t('count', { current: undefined, total })}</span>\n </>\n ) : (\n <span className=\"text-center\">\n {!hideLabel && `${paginationLabel} `}\n <span className=\"tabular-nums\">{t('count', { current: current + 1, total })}</span>\n </span>\n )}\n </div>\n <ControlNext\n id={groupId ? `pagination-right-${groupId}` : 'pagination-right'}\n size=\"lg\"\n aria-controls={controls}\n onClick={onNextClick}\n disabled={nextDisabled}\n label={`${t('nextLabel', { label: paginationLabel })}, ${t('count', {\n current: current + 1 >= total ? 1 : current + 2,\n total,\n })}`}\n />\n </div>\n );\n};\n\nexport default Pagination;\n","export * from './lib/pagination';\n","import type { HotelType } from '../../../providers/app-provider/app-provider.types';\nimport type { GeocodeAddress } from '@dx-ui/queries-dx-shop-search-ui';\n\nexport const filterStateCountryBrandHashedHotels = (\n address: Pick<GeocodeAddress, 'state' | '_id' | 'city' | 'country'> | null | undefined,\n brandCode: string | undefined,\n hashedHotelSummaryOptionsHotelData: Record<string, HotelType>\n) =>\n Object.keys(hashedHotelSummaryOptionsHotelData || {})\n .filter((ctyhocn) => {\n const currentHotel = hashedHotelSummaryOptionsHotelData[ctyhocn];\n if (brandCode && currentHotel && brandCode !== currentHotel.brandCode) return false;\n if (address) {\n if (\n address?.country &&\n address?.country !== hashedHotelSummaryOptionsHotelData[ctyhocn]?.address?.country\n )\n return false;\n if (\n address?.state &&\n address?.state !== hashedHotelSummaryOptionsHotelData[ctyhocn]?.address?.state\n )\n return false;\n }\n\n return true;\n })\n .reduce((obj, key) => {\n const hotel = hashedHotelSummaryOptionsHotelData[key];\n if (hotel) obj[key] = hotel;\n return obj;\n }, {} as Record<string, HotelType>);\n\nexport const filterRegionHashedHotels = (\n countriesInRegion: string[],\n hashedHotelSummaryOptionsHotelData: Record<string, HotelType>\n) =>\n Object.keys(hashedHotelSummaryOptionsHotelData || {})\n .filter((ctyhocn) => {\n const currentHotel = hashedHotelSummaryOptionsHotelData[ctyhocn];\n return countriesInRegion?.includes(currentHotel?.address?.country || '');\n })\n .reduce((obj, key) => {\n const hotel = hashedHotelSummaryOptionsHotelData[key];\n if (hotel) obj[key] = hotel;\n return obj;\n }, {} as Record<string, HotelType>);\n","import { keepPreviousData, type UseQueryOptions } from '@tanstack/react-query';\nimport { isBrowser } from '@dx-ui/utilities-is-browser';\nimport type { HotelSummaryOptionsQuery, HotelQuadrant } from '@dx-ui/queries-dx-shop-search-ui';\nimport { HotelSummaryOptionsDocument } from '@dx-ui/queries-dx-shop-search-ui';\n\nexport const generateHotelSummaryOptionsQueryArray = ({\n language,\n enabled,\n quadNodes,\n guestLocationCountry,\n}: {\n language: string;\n enabled: boolean;\n quadNodes?: HotelQuadrant[];\n guestLocationCountry?: string;\n}) =>\n quadNodes?.reduce((arr, node) => {\n arr.push({\n queryKey: [\n HotelSummaryOptionsDocument,\n {\n language,\n input: {\n quadrantId: node?.id,\n guestLocationCountry,\n },\n },\n ],\n enabled: isBrowser && enabled,\n placeholderData: keepPreviousData,\n retry: 2,\n });\n return arr;\n }, [] as UseQueryOptions<HotelSummaryOptionsQuery>[]) || [];\n","import type { Maybe, HotelQuadrantBounds, HotelQuadrant } from '@dx-ui/queries-dx-shop-search-ui';\n\ntype NodeFilterCountry = {\n countryCode: string;\n stateCode?: string | null;\n};\n\ntype NodeFilter = {\n brandCode?: string | null;\n countries?: NodeFilterCountry[] | null;\n};\n\nexport type GoogleCoordinate = {\n lat: number;\n lng: number;\n};\n\n/**\n * Determines if two rectangular bounds intercept. Basically this method confirms that there is no overlap between rectangles and then returns the result logically NOT'ed.\n *\n * @param bounds1\n * @param bounds2\n */\nfunction isOverlappingBounds(\n bounds1?: Maybe<HotelQuadrantBounds>,\n bounds2?: Maybe<HotelQuadrantBounds>\n) {\n return (\n typeof bounds1?.northeast?.latitude !== 'undefined' &&\n typeof bounds2?.southwest?.latitude !== 'undefined' &&\n typeof bounds1?.southwest?.latitude !== 'undefined' &&\n typeof bounds2?.northeast?.latitude !== 'undefined' &&\n !(\n bounds1?.northeast?.latitude < bounds2?.southwest?.latitude ||\n bounds1?.southwest?.latitude > bounds2?.northeast?.latitude ||\n bounds1?.southwest?.longitude > bounds2?.northeast?.longitude ||\n bounds1?.northeast?.longitude < bounds2?.southwest?.longitude\n )\n );\n}\n\n/**\n * Determines if the quad node matches the filter criteria.\n *\n * @param {HotelQuadrant} validNode\n * @param {NodeFilter} filter\n */\nfunction isMatchFilter(validNode: HotelQuadrant, filter?: NodeFilter) {\n let brandCodeMatch = true;\n let stateOrCountryMatch = true;\n if (filter) {\n // Filter by brand codes if provided\n if (filter?.brandCode) {\n brandCodeMatch = Boolean(validNode?.brands.find((brand) => brand.code === filter?.brandCode));\n }\n // Filter by country/state if provided\n if (brandCodeMatch && filter.countries && validNode.countries) {\n stateOrCountryMatch = filter.countries.some((c) => {\n const nodeCountry = validNode?.countries?.find(\n (nodeCountry) => nodeCountry.code === c.countryCode\n );\n return !!(nodeCountry && (!c.stateCode || nodeCountry?.states?.includes(c.stateCode)));\n });\n }\n }\n return brandCodeMatch && stateOrCountryMatch;\n}\n\n/**\n * Determines the list of quad tree nodes within the bounds provided. Able to also further filter nodes by a list of brands, states, or countries.\n *\n * @param {HotelQuadrant[]} validNodes\n * @param {Maybe<HotelQuadrantBounds>} bounds\n * @param {NodeFilter} filter\n */\nconst getBoundNodes = (\n validNodes: HotelQuadrant[],\n bounds: Maybe<HotelQuadrantBounds>,\n filter?: NodeFilter\n): HotelQuadrant[] => {\n //if we dont have any nodes or a value for bounds is missing return an empty arr\n if (validNodes.length === 0 || !bounds?.northeast || !bounds.southwest) return [];\n\n // If the bounding box crosses the international time line, create a bounding box for each side of the time line,\n // and get the quad nodes for each.\n const { southwest, northeast } = bounds || {};\n\n if (southwest?.longitude && northeast?.longitude && southwest?.longitude > northeast?.longitude) {\n return [\n ...getBoundNodes(\n validNodes,\n { southwest, northeast: { ...northeast, longitude: 180 } },\n filter\n ),\n ...getBoundNodes(\n validNodes,\n { southwest: { ...southwest, longitude: -180 }, northeast },\n filter\n ),\n ];\n }\n\n // Filter quad nodes based on whether it overlaps with the provided bounding box and matches the filter criteria.\n return validNodes\n .filter((validNode) => isOverlappingBounds(validNode?.bounds, bounds))\n .filter((validNode) => isMatchFilter(validNode, filter));\n};\n\nexport default getBoundNodes;\n","import { useIsClient } from 'usehooks-ts';\nimport { useHotelQuadrantsQuery } from '@dx-ui/queries-dx-shop-search-ui';\nimport { generateHotelSummaryOptionsQueryArray } from './utils/generate-hotel-summary-options-query-array';\nimport { useQueries } from '@tanstack/react-query';\nimport getBoundNodes from '../../utils/get-bounds-nodes/get-bounds-nodes';\nimport { toNestedBounds } from '../../providers/app-provider/app-provider.utils';\nimport { useLocation } from '@dx-ui/framework-location-provider';\n\nexport const useQuadNodes = ({\n language,\n enabled,\n bounds,\n brandCode,\n stateOrCountryOrRegionFilter,\n}: {\n language: string;\n enabled: boolean;\n bounds: google.maps.LatLngBoundsLiteral;\n brandCode?: string;\n stateOrCountryOrRegionFilter:\n | {\n countries:\n | {\n countryCode: string;\n stateCode: string;\n }[]\n | null;\n }\n | undefined;\n}) => {\n const isClient = useIsClient();\n\n const { country: guestLocationCountry, isLoading: isGuestLocationLoading } = useLocation();\n\n const { data: quadNodesData, isLoading: isQuadNodesDataLoading } = useHotelQuadrantsQuery(\n {},\n {\n enabled: isClient && enabled,\n }\n );\n const quadNodes = getBoundNodes(quadNodesData?.hotelQuadrants || [], toNestedBounds(bounds), {\n ...stateOrCountryOrRegionFilter,\n brandCode,\n });\n\n const isHotelSummaryQueryEnabled =\n Boolean(quadNodesData) && enabled && !isQuadNodesDataLoading && !isGuestLocationLoading;\n\n const queryArr = generateHotelSummaryOptionsQueryArray({\n language,\n enabled: isHotelSummaryQueryEnabled,\n quadNodes,\n guestLocationCountry,\n });\n //parallel fetch zoned hotel summary options\n const results = useQueries({ queries: queryArr });\n\n return {\n isFetching: results.some((result) => result.isFetching),\n isInitialRender: results.some(\n (result) => result.status === 'success' || result.status === 'error'\n ),\n };\n};\n","import { useQuery } from '@tanstack/react-query';\nimport type { THsoHotel } from './utils/get-hashed-hotel-summary-options-data-from-cache';\nimport { logError } from '@dx-ui/framework-logger';\n\nconst fetchHotelSummaryOptions = async ({\n queryKey,\n}: {\n queryKey: [string];\n}): Promise<THsoHotel> => {\n const [url] = queryKey;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n logError(\n 'Shop HSO blob fetch',\n `${response.status}: ${response.statusText}`,\n 'failed to fetch blob'\n );\n throw new Error(`Error ${response.status}: ${response.statusText}`);\n }\n\n return response.json();\n};\n\nexport const useBlob = ({\n enabled,\n hotelSummaryExtractUrl,\n}: {\n enabled: boolean;\n hotelSummaryExtractUrl: string;\n}) => {\n const { isFetching, status, data } = useQuery({\n queryKey: [hotelSummaryExtractUrl],\n queryFn: fetchHotelSummaryOptions,\n enabled,\n });\n\n return {\n data,\n isFetching,\n isInitialRender: status === 'success' || status === 'error',\n status,\n };\n};\n","import { useQueryClient } from '@tanstack/react-query';\nimport type { GeocodeAddress, GeocodePlaceType } from '@dx-ui/queries-dx-shop-search-ui';\nimport { getHashedHotelSummaryOptionsDataFromCache } from './utils/get-hashed-hotel-summary-options-data-from-cache';\n\nimport {\n filterStateCountryBrandHashedHotels,\n filterRegionHashedHotels,\n} from './utils/filter-state-country-brand-hashed-hotels';\nimport * as React from 'react';\nimport { useGetRegions } from '../use-get-regions';\nimport { useQuadNodes } from './use-quad-nodes';\nimport { useBlob } from './use-blob';\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\n\nconst useHotelSummaryOptions = ({\n initialHashedHotelSummaryOptionsData,\n bounds,\n brandCode,\n language,\n address,\n type,\n isInitialRender,\n matchName,\n blobEnabled = false,\n hotelSummaryExtractUrl,\n}: {\n initialHashedHotelSummaryOptionsData: Record<string, HotelType>;\n bounds: google.maps.LatLngBoundsLiteral;\n brandCode?: string;\n language: string;\n address: Pick<GeocodeAddress, '_id' | 'city' | 'country' | 'state'> | null | undefined;\n type: GeocodePlaceType | undefined;\n isInitialRender: React.MutableRefObject<boolean>;\n matchName?: string;\n blobEnabled?: boolean;\n hotelSummaryExtractUrl?: string;\n}) => {\n const isRegions = type === 'region';\n const { countryCodes: countriesInRegion } = useGetRegions({\n isTypeRegion: isRegions,\n regionName: matchName || '',\n isEnabled: isRegions,\n });\n const queryClient = useQueryClient();\n\n const stateOrCountryFilter =\n address && !isRegions\n ? {\n countries: ['country', 'state'].includes(type || '')\n ? [{ countryCode: address?.country || '', stateCode: address?.state || '' }]\n : null,\n }\n : undefined;\n\n let stateOrCountryOrRegionFilter = stateOrCountryFilter;\n if (isRegions) {\n stateOrCountryOrRegionFilter = {\n countries:\n countriesInRegion?.map((country) => ({\n countryCode: country,\n stateCode: '',\n })) || null,\n };\n }\n const isBlobEnabledWithExtractURL = !!hotelSummaryExtractUrl && blobEnabled;\n const {\n data: blobData,\n isFetching: isFetchingBlobNodes,\n isInitialRender: isInitialRenderBlobNodes,\n status: blobStatus,\n } = useBlob({\n enabled: isBlobEnabledWithExtractURL,\n hotelSummaryExtractUrl: hotelSummaryExtractUrl ?? '',\n });\n\n const isFallbackToNodes = !isBlobEnabledWithExtractURL || blobStatus === 'error';\n const { isFetching: isFetchingQuadNodes, isInitialRender: isInitialRenderQuadNodes } =\n useQuadNodes({\n language,\n enabled: isFallbackToNodes,\n bounds,\n brandCode,\n stateOrCountryOrRegionFilter,\n });\n\n const { isFetching, isInitial } = !isFallbackToNodes\n ? { isFetching: isFetchingBlobNodes, isInitial: isInitialRenderBlobNodes }\n : { isFetching: isFetchingQuadNodes, isInitial: isInitialRenderQuadNodes };\n\n if (isInitial) isInitialRender.current = false;\n\n const hotelDataToUse =\n !isFallbackToNodes && blobData\n ? blobData\n : getHashedHotelSummaryOptionsDataFromCache(\n queryClient,\n initialHashedHotelSummaryOptionsData\n );\n\n const filteredHotelDataToUse = React.useMemo(() => {\n if (isFetching) return {};\n return isRegions && countriesInRegion\n ? filterRegionHashedHotels(countriesInRegion, hotelDataToUse)\n : filterStateCountryBrandHashedHotels(address, brandCode, hotelDataToUse);\n }, [address, brandCode, countriesInRegion, hotelDataToUse, isFetching, isRegions]);\n\n return {\n hashedHotelSummaryOptionsHotelData: filteredHotelDataToUse,\n isFetching,\n };\n};\n\nexport default useHotelSummaryOptions;\n","import { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { useIsClient, useMediaQuery } from 'usehooks-ts';\nimport cx from 'classnames';\nimport { Icon, type IconNames } from '@dx-ui/osc-icon';\nimport { useMapListToggle } from '../../hooks';\n\nexport const MapListToggleButton = ({\n showMapListToggleButton = true,\n className,\n}: {\n showMapListToggleButton?: boolean;\n className?: string;\n}) => {\n const { isListVisible } = useAppState();\n const dispatch = useAppDispatch();\n const isClient = useIsClient();\n const isSlimView = useMediaQuery('(max-width: 767px)');\n\n const { iconName: listMapViewButtonIconName, label: listMapViewButtonLabel } = useMapListToggle();\n const mapToggleButtonArrowDirection = listMapViewButtonIconName as (typeof IconNames)[number];\n\n return isClient && showMapListToggleButton ? (\n <button\n className={cx(\n 'btn flex items-center justify-center rtl:ml-0 rtl:mr-auto',\n {\n 'md:hidden btn-primary': isSlimView,\n ' btn-text-outline text-base text-text px-3 py-2 shadow-xl bg-bg hover:text-text focus:text-text':\n !isSlimView,\n },\n className\n )}\n onClick={() => {\n dispatch({ type: 'SET_IS_LIST_VISIBLE', payload: !isListVisible });\n }}\n type=\"button\"\n >\n {listMapViewButtonLabel}\n {!isSlimView ? <Icon name={mapToggleButtonArrowDirection} /> : null}\n </button>\n ) : null;\n};\n","import type { HotelType } from '../../../providers/app-provider/app-provider.types';\n\nexport const shouldDisplayBrandedHotels = (brandName: string | undefined): boolean => {\n if (brandName !== 'hilton-honors') {\n return true;\n }\n return false;\n};\n\nexport const getBrandedHotels = (\n hotelPageCards: HotelType[],\n brandCode: string | undefined,\n brandName: string | undefined\n): HotelType[] =>\n shouldDisplayBrandedHotels(brandName)\n ? hotelPageCards.filter((hotel) => hotel.brandCode === brandCode)\n : [];\n\nexport const getOtherHotels = (\n hotelPageCards: HotelType[],\n brandCode: string | undefined,\n brandName: string | undefined\n): HotelType[] =>\n shouldDisplayBrandedHotels(brandName)\n ? hotelPageCards.filter((hotel) => hotel.brandCode !== brandCode)\n : hotelPageCards;\n\n//link for no branded hotels found info banner that removes brand slug from uri\nexport const getInfoBannerURLWithBrandRemoved = ({\n baseUrl,\n path,\n locale = 'en',\n canonicalSlug = '',\n altSlugs = [],\n brandCode,\n}: {\n baseUrl: string;\n path: string;\n locale?: string;\n canonicalSlug?: string | null;\n altSlugs?: string[];\n brandCode?: string;\n}) => {\n //remove brand filter param from URL\n const newURL = path.replace(`&f-brandCodes=${brandCode}`, '');\n //remove slug from URL\n if (canonicalSlug && newURL.includes(canonicalSlug))\n return encodeURI(`${baseUrl}${locale}${newURL.replace(`${canonicalSlug}/`, '')}`);\n const slug = altSlugs?.find((slug) => newURL.includes(slug)) ?? '';\n return encodeURI(`${baseUrl}${locale}${newURL.replace(`${slug}/`, '')}`);\n};\n","import { useBrandDetails, useWrappedRouter } from '../../../hooks';\nimport { useTranslation } from 'next-i18next';\nimport { useAppState } from '../../../providers/app-provider';\nimport { InfoMessageBanner } from '../../info-message-banner/info-message-banner';\nimport { Link } from '@dx-ui/osc-link';\nimport { env } from '../../../constants';\nimport { getInfoBannerURLWithBrandRemoved } from '../list-view-utils/list-view-brand-banner.utils';\n\nexport type ListViewBrandBannerProps = {\n numBrandedHotels: number;\n brandCode: string | undefined;\n isDisplayBrandBanner?: boolean;\n isPageBrandFilterEnabled?: boolean;\n isEndOfResults?: boolean;\n};\n\nexport const ListViewBrandBanner = ({\n numBrandedHotels,\n brandCode,\n isDisplayBrandBanner,\n isPageBrandFilterEnabled,\n isEndOfResults = false,\n}: ListViewBrandBannerProps) => {\n const { pageType } = useAppState();\n const brandInfo = useBrandDetails({ brandCode });\n const { t } = useTranslation(['list-view-brand-banner', 'list-view']);\n const { isGlobal: isGlobalPage } = pageType;\n const {\n router: { asPath, locale },\n } = useWrappedRouter();\n\n const atLeastOneBrandedHotel = numBrandedHotels > 0;\n\n const infoBannerMessage = atLeastOneBrandedHotel\n ? t('list-view-brand-banner:endOfBrandedHotelsResults', { brandName: brandInfo.name })\n : t('list-view-brand-banner:couldNotFindHotelsInSearchArea', { brandName: brandInfo.name });\n\n const linkWithoutBrandSlug = pageType.isBrand ? (\n <Link\n url={getInfoBannerURLWithBrandRemoved({\n baseUrl: env.OHW_BASE_URL,\n path: asPath,\n locale,\n canonicalSlug: brandInfo.canonicalSlug,\n altSlugs: brandInfo.altSlugs,\n brandCode,\n })}\n className=\"px-2 text-sm font-normal\"\n >\n {t('exploreOtherHotelsLink')}\n </Link>\n ) : null;\n\n return isDisplayBrandBanner && isPageBrandFilterEnabled && isEndOfResults\n ? ((!!brandInfo?.isHotelBrand && !!brandInfo?.hasHotels) || isGlobalPage) && (\n <InfoMessageBanner message={infoBannerMessage}>{linkWithoutBrandSlug}</InfoMessageBanner>\n )\n : null;\n};\n","export * from './list-view-brand-banner';\n","import type { QueryParameters } from '../../constants';\n\nimport type { ShopMultiPropAvailPointsQuery } from '@dx-ui/queries-dx-shop-search-ui';\n\nexport const hasAgeBased = (\n queryParameters?: QueryParameters,\n pricing?: Record<string, ShopMultiPropAvailPointsQuery['shopMultiPropAvail'][0]>\n): boolean => {\n if (queryParameters)\n return Object.values(pricing || {}).filter((price) => price?.ageBasedPricing).length > 0;\n return false;\n};\n\nexport const hasChildAges = (queryParameters?: QueryParameters): boolean =>\n (queryParameters &&\n queryParameters.rooms\n .filter(({ children, childAges }) => {\n if (children > 0) {\n return (\n childAges &&\n typeof childAges !== 'number' &&\n childAges.filter(({ age }) => typeof age !== 'undefined').length !== children\n );\n }\n return false;\n })\n .filter(Boolean).length > 0) ||\n false;\n\nexport const hasTMTPRatesSelected = (queryParameters: QueryParameters): boolean =>\n queryParameters &&\n (queryParameters.employeeRate ||\n queryParameters.friendsAndFamilyRate ||\n queryParameters.ownerVIPRate);\n","import type { MapLanguage, BrandCode, SortByValues, Child } from '@dx-ui/framework-uri-builder';\nimport { searchUriBuilder } from '@dx-ui/framework-uri-builder';\nimport { RoomsModal } from '@dx-ui/osc-rooms';\nimport { parseISO } from 'date-fns';\nimport isNumber from 'lodash/isNumber';\nimport { useTranslation } from 'next-i18next';\nimport * as React from 'react';\nimport type { QueryParameters } from '../../constants';\nimport type { ShopMultiPropAvailQuery } from '@dx-ui/queries-dx-shop-search-ui';\nimport { useBrandDetails, useWrappedRouter } from '../../hooks';\nimport { getTARatingValue, getValidFilters, isPriceRangeValid } from '../filters/filter-utils';\nimport { hasAgeBased, hasChildAges, hasTMTPRatesSelected } from './age-based-modal-utils';\nimport { mapRatesToSearchUriBuilder } from '../osc-search-form/search-form.utils';\nimport { useAppState } from '../../providers/app-provider';\nimport type { FieldValues } from 'react-hook-form';\nimport { useFilterState } from '../../providers/filter-provider';\n\nconst AgeBasedModal = ({\n isAgeBasedModalOpen,\n setIsAgeBasedModalOpen,\n pricing,\n}: {\n isAgeBasedModalOpen: boolean;\n setIsAgeBasedModalOpen: React.Dispatch<React.SetStateAction<boolean>>;\n pricing?: Record<string, ShopMultiPropAvailQuery['shopMultiPropAvail'][0]>;\n}) => {\n const { t } = useTranslation(['hotel-card', 'osc-shop-form-wrapper']);\n const { hasConnectingRooms, selectedCurrency, sortType, shouldUsePoints } = useAppState();\n const activeFiltersState = useFilterState();\n\n const { safeQueryParams: queryParameters, router } = useWrappedRouter();\n\n const isAgeBased = hasAgeBased(queryParameters, pricing) && hasChildAges(queryParameters);\n\n const { code: brandCode } = useBrandDetails({});\n\n React.useEffect(() => {\n if (isAgeBased) {\n setIsAgeBasedModalOpen(isAgeBased);\n }\n }, [queryParameters, pricing, isAgeBased, setIsAgeBasedModalOpen]);\n\n const roomInfo =\n queryParameters &&\n queryParameters.rooms.map((room) => ({\n adults: room.adults,\n kids: room.children,\n childAges: room.childAges?.map(({ age }) => ({ age: isNumber(age) ? age : '' })),\n }));\n\n const handleRoomInfoSubmit = (data: FieldValues) => {\n const roomInfo = data?.rooms?.map((room: { adults: number; children: Child[] }) => ({\n adults: room?.adults,\n children: room?.children,\n }));\n\n const path =\n window.location.pathname.split('/').includes('go-hilton') ||\n hasTMTPRatesSelected(queryParameters as QueryParameters)\n ? 'go-hilton'\n : 'search';\n\n if (queryParameters) {\n const { offerId, pnd, specPlan, fromId, travelAgentId, requestedRatesOnly } = queryParameters;\n\n const url = searchUriBuilder({\n brandCode: brandCode as keyof BrandCode,\n locale: router.locale as MapLanguage,\n urlParams: {\n content: queryParameters?.content,\n dates: {\n arrivalDate: parseISO(queryParameters.arrivalDate),\n departureDate: parseISO(queryParameters.departureDate),\n flexibleDates: queryParameters.datesFlex,\n },\n placeId: queryParameters.placeId,\n query: queryParameters.query,\n sortBy: sortType as SortByValues,\n f_amenityIds: getValidFilters(activeFiltersState?.amenityFilters),\n f_brandCodes: getValidFilters(activeFiltersState?.brandFilters),\n f_price: isPriceRangeValid(activeFiltersState?.priceFilter)\n ? activeFiltersState?.priceFilter\n : undefined,\n f_tripAdvisorRatings: getTARatingValue(activeFiltersState?.ratingsFilter),\n availableHotelsOnly: activeFiltersState?.showAvailableHotels,\n rates: {\n ...mapRatesToSearchUriBuilder(queryParameters, shouldUsePoints),\n ...(offerId ? { offerId } : {}),\n ...(pnd ? { pnd } : {}),\n ...(specPlan ? { spec_plan: specPlan.join(',') } : {}),\n ...(fromId ? { fromId } : {}),\n ...(travelAgentId ? { travelAgentId } : {}),\n ...(requestedRatesOnly ? { requestedRatesOnly } : {}),\n },\n numRooms: roomInfo?.length || 1,\n rooms: roomInfo,\n sessionToken: queryParameters.sessionToken,\n specialRateTokens: queryParameters.specialRateTokens,\n displayCurrency: selectedCurrency || '',\n adjoiningRoomStay: hasConnectingRooms,\n maxPoints: queryParameters.maxPoints,\n },\n path,\n relative: true,\n });\n\n window.location.href = url;\n }\n };\n\n return isAgeBasedModalOpen ? (\n <RoomsModal\n ageRange={{ min: 0, max: 18 }}\n agesRequired\n ariaLabel={t('hotel-card:roomModalAria')}\n isOpen\n occupancyLimitMessage={t('osc-shop-form-wrapper:maxGuestsSingleRoom')}\n onSubmit={handleRoomInfoSubmit}\n useFormProps={{\n defaultValues: {\n rooms: roomInfo?.map((room) => ({\n adults: room.adults,\n children: room.childAges.map((child) => ({\n age: child?.age,\n })),\n })),\n },\n }}\n />\n ) : null;\n};\n\nexport { AgeBasedModal };\n","export * from './age-based-modal';\n","export const setFocusOnFirstListViewCard = (\n ulContainerRef: React.MutableRefObject<HTMLDivElement | null>\n) => {\n const firstHotelCardItem = ulContainerRef?.current?.querySelector('li');\n if (firstHotelCardItem) {\n firstHotelCardItem.setAttribute('tabindex', '0');\n firstHotelCardItem.focus();\n }\n};\n","import { useMemo } from 'react';\nimport type { HotelType } from '../providers/app-provider/app-provider.types';\nimport {\n getBrandedHotels,\n getOtherHotels,\n} from '../components/list-view/list-view-utils/list-view-brand-banner.utils';\n\ntype GetVisibleInBoundHotelsProps = {\n currentPageVisibleHotels: HotelType[];\n brandCode: string | undefined;\n brandName: string | undefined;\n};\n\nexport const useGetVisibleInBoundHotels = ({\n currentPageVisibleHotels,\n brandCode,\n brandName,\n}: GetVisibleInBoundHotelsProps) => {\n const brandedVisibleHotels = useMemo(\n () => getBrandedHotels(currentPageVisibleHotels, brandCode, brandName),\n [currentPageVisibleHotels, brandCode, brandName]\n );\n\n const otherVisibleHotels = useMemo(\n () => getOtherHotels(currentPageVisibleHotels, brandCode, brandName),\n [currentPageVisibleHotels, brandCode, brandName]\n );\n\n return { brandedVisibleHotels, otherVisibleHotels };\n};\n","import * as React from 'react';\n\nimport type { HotelImageRatio, Maybe } from '@dx-ui/queries-dx-shop-search-ui';\nimport { CarouselSingle } from '@dx-ui/osc-carousel';\nimport { getAspectRatioUrl } from '@dx-ui/utilities-images';\nimport { useRect } from '@dx-ui/utilities-use-rect';\nimport { env } from '../../constants';\nimport { useTranslation } from 'next-i18next';\n\nexport type IHotelImagesVariants =\n | {\n altText?: string | null;\n size?: 'xs' | 'sm' | 'md';\n ratios?: Maybe<Pick<HotelImageRatio, 'url' | 'size'>[]> | undefined;\n }\n | undefined;\n\ntype ICarousel = {\n images?: IHotelImagesVariants[];\n isLoading?: boolean;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nconst Carousel = ({ images, isLoading }: ICarousel) => {\n const carouselRef = React.useRef<HTMLDivElement | null>(null);\n const rect = useRect({ ref: carouselRef });\n\n const { t } = useTranslation(['osc-carousel']);\n const noPhotoImageUrl = `${env.HILTON_ASSETS_URI}/modules/assets/img/common/no-photo-available.png`;\n const carouselImages = images\n ?.map((props) => {\n const { imgUrl } = getAspectRatioUrl({\n src: props?.ratios?.[0]?.url,\n width: rect?.width ?? 0,\n });\n const src = props?.ratios?.[0]?.url ? imgUrl : null;\n return { alt: props?.altText || t('noPhotoAvailable'), url: src || noPhotoImageUrl };\n })\n .filter((image) => image.url);\n return carouselImages && carouselImages?.length >= 1 ? (\n <div ref={carouselRef}>\n <CarouselSingle\n data-testid=\"imageCarousel\"\n images={carouselImages || []}\n isLoading={isLoading}\n />\n </div>\n ) : null;\n};\n\nexport default Carousel;\n","import cx from 'classnames';\nimport { useTranslation } from 'next-i18next';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { COMPARE_ONBOARDING, GOALS } from '../../constants';\nimport { useLocalStorage, useMediaQuery } from 'usehooks-ts';\nimport { DESKTOP_COMPARE_LIMIT, MOBILE_COMPARE_LIMIT } from './compare-hotel-utils';\nimport { FeatureToolTip } from './feature-tool-tip';\nimport { useGetMVTSelections } from '../../hooks';\nimport { useRef } from 'react';\n\ntype CompareCheckboxProps = {\n ctyhocn?: string;\n onChange?: () => void;\n isFirstCheckbox?: boolean;\n};\n\nexport const CompareHotelsCheckbox = ({\n onChange,\n ctyhocn: selectedCtyhocn,\n isFirstCheckbox,\n}: CompareCheckboxProps) => {\n const { t } = useTranslation('compare-hotels');\n const isSubDesktop = useMediaQuery('(max-width: 1023px)');\n const compareCheckboxRef = useRef<HTMLInputElement>(null);\n\n const { hotelsToCompare, compareHotelsToggle: showCompareCheckBox } = useAppState();\n const dispatch = useAppDispatch();\n\n //NHCSEARCH-5449 | Compare Hotels Onboarding MVT\n const {\n isLoaded: isOnboardingMVTLoaded,\n isMVTVariant: { c: isOnboardingVarC },\n } = useGetMVTSelections({ agentId: COMPARE_ONBOARDING.agentId, MVTVariants: ['c'] });\n const [isOnboarded, setIsOnboarded] = useLocalStorage('compare-hotels-onboarded', false);\n const handleToolTipClose = () => {\n setIsOnboarded(true);\n if (compareCheckboxRef.current) compareCheckboxRef.current.focus();\n };\n\n const handleCompareHotelChange = () => {\n if (onChange) onChange();\n\n if (selectedCtyhocn) {\n let selectedHotels = [...hotelsToCompare];\n if (hotelsToCompare.includes(selectedCtyhocn))\n selectedHotels = hotelsToCompare?.filter((hotel) => hotel !== selectedCtyhocn);\n else selectedHotels.push(selectedCtyhocn);\n dispatch({ type: 'SET_HOTELS_TO_COMPARE', payload: selectedHotels });\n if (selectedHotels.length) sendReward(GOALS.compareHotelsCheckboxSelected);\n }\n if (!isOnboarded && isOnboardingVarC) setIsOnboarded(true);\n };\n const isCompareCBChecked = selectedCtyhocn ? !!hotelsToCompare?.includes(selectedCtyhocn) : false;\n //Disable checkbox when hotels selected is 2 for mobile and 5 selected for other large device\n const isCompareCBDisabled =\n !isCompareCBChecked &&\n (isSubDesktop\n ? hotelsToCompare?.length >= MOBILE_COMPARE_LIMIT\n : hotelsToCompare?.length === DESKTOP_COMPARE_LIMIT);\n\n return showCompareCheckBox ? (\n <div className=\"relative mr-0 pt-1.5 rtl:mb-2\">\n <div className=\"flex\">\n <label className=\"label label-inline-reverse rtl:label-inline-reverse\">\n <span className={cx('text-base font-semibold rtl:pl-2 rtl:pr-1')}>{t('compare')}</span>\n <input\n className=\"form-checkbox\"\n checked={isCompareCBChecked}\n disabled={isCompareCBDisabled}\n onChange={handleCompareHotelChange}\n type=\"checkbox\"\n ref={compareCheckboxRef}\n />\n </label>\n </div>\n {/* NHCSEARCH-5449 | Compare Hotels Onboarding MVT */}\n <FeatureToolTip\n absolutePosition=\"-left-5 bottom-9\"\n title={t('startComparing')}\n message={t('selectFirstHotel')}\n onDismiss={handleToolTipClose}\n cta={{ label: t('gotIt'), onClick: handleToolTipClose }}\n containerClass=\"w-[343px] p-3\"\n shouldShowFeatureToolTip={\n !!(isOnboardingMVTLoaded && isOnboardingVarC && !isOnboarded && isFirstCheckbox)\n }\n />\n </div>\n ) : null;\n};\n","import Icon, { AmenityIcons } from '@dx-ui/osc-icon';\nimport type { HotelAmenityId } from '@dx-ui/queries-dx-shop-search-ui';\n\ntype HotelAmenities = { name: string; id: string };\n\nconst KEY_AMENITIES = {\n freeParking: { id: 'freeParking', name: 'Free parking' },\n freeBreakfast: { id: 'freeBreakfast', name: 'Free breakfast' },\n indoorPool: { id: 'indoorPool', name: 'Indoor pool' },\n outdoorPool: { id: 'outdoorPool', name: 'Outdoor pool' },\n} as unknown as Record<string, HotelAmenities>;\n\nexport const KeyHotelAmenities = ({ amenities }: { amenities: HotelAmenityId[] | undefined }) => {\n const keyAmenities: HotelAmenities[] = [];\n amenities?.forEach((amenityId) => {\n if (Object.keys(KEY_AMENITIES).includes(amenityId)) {\n keyAmenities.push(KEY_AMENITIES[amenityId] as HotelAmenities);\n }\n });\n\n return keyAmenities?.length ? (\n <div className=\"flex flex-wrap gap-1.5 py-2.5 pb-1.5\" data-testid=\"key-hotel-amenities\">\n {keyAmenities.map((amenity: HotelAmenities) => (\n <div key={amenity.id} className=\"flex items-center gap-0.5 text-sm\">\n <Icon name={AmenityIcons[amenity.id as HotelAmenityId]} size=\"sm\" />\n <span> {amenity?.name}</span>\n </div>\n ))}\n </div>\n ) : null;\n};\n","import { useTranslation } from 'next-i18next';\nimport cx from 'classnames';\nimport type { Maybe, ShopMultiPropAvailPointsQuery } from '@dx-ui/queries-dx-shop-search-ui';\nimport Carousel from '../carousel/carousel';\nimport { HotelBadges } from './hotel-badges';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { useMediaQuery } from 'usehooks-ts';\nimport { TripAdvisorRating } from '../trip-advisor/trip-advisor-rating';\nimport { useMetrics } from '../../hooks';\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\nimport type { RateInfoMessage } from '../rate-name-cta/rate-name-cta';\nimport { RateNameCTA } from '../rate-name-cta/rate-name-cta';\nimport { useGetHotelInfo } from './hooks/use-get-hotel-info';\nimport { CompareHotelsCheckbox } from '../compare-hotels/compare-checkbox';\nimport { useRecentlyViewed } from '../../hooks/use-recently-viewed';\nimport { KeyHotelAmenities } from './key-hotel-amenity-info';\n\nconst preventNavigation = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n e.preventDefault();\n};\nconst preventFocus = (e: React.FocusEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n e.target.blur();\n};\n\nconst HotelNameHeader = ({\n children,\n name,\n url,\n}: {\n children: React.ReactElement;\n name?: string | null;\n url?: Maybe<string>;\n}) => {\n if (url) {\n return (\n <>\n {/* This is a bit 'hacky'. We need a link in the page for SEO, but it is non-functional when JS is enabled */}\n <a\n aria-hidden=\"true\"\n className=\"cursor-default\"\n href={url}\n onClick={preventNavigation}\n onFocus={preventFocus}\n tabIndex={-1}\n >\n {children}\n </a>\n {/* For a11y, we're hiding the above link (since it behaves as text) and supplementing it with sr-only content */}\n <h3 className=\"sr-only\">{name}</h3>\n </>\n );\n }\n return children;\n};\n\ntype HotelCardProps = {\n distance?: string;\n isTALoadingState?: boolean;\n onDetailsClick?: () => void;\n showImages?: boolean;\n isListViewOnly?: boolean;\n priceInfo?: ShopMultiPropAvailPointsQuery['shopMultiPropAvail'][0] | null;\n hotelInfo?: HotelType | null | undefined;\n isFirstAvailableProperty?: boolean;\n};\n\nconst HotelCard = ({\n distance,\n isTALoadingState,\n onDetailsClick,\n showImages,\n isListViewOnly,\n priceInfo,\n hotelInfo,\n isFirstAvailableProperty,\n}: HotelCardProps) => {\n const { t } = useTranslation(['hotel-card']);\n const { pageType } = useAppState();\n const smMedViewPort = useMediaQuery('(min-width: 500px) and (max-width: 767px)');\n const metrics = useMetrics();\n const dispatch = useAppDispatch();\n\n const {\n amenities,\n badges,\n carouselImages,\n ctaLabel,\n ctaHref,\n ctaMessage,\n customParams,\n hotelUrl,\n isHotelDataLoading,\n masterImage,\n rateInfo,\n disclaimerMessages,\n transactionPropertyData,\n } = useGetHotelInfo({\n priceInfo,\n hotelInfo,\n additionalParams: { isHotelCard: true },\n });\n const hotelName = hotelInfo?.name || '';\n const tripAdvisorLocationSummary = hotelInfo?.tripAdvisorLocationSummary || null;\n const ctyhocn = hotelInfo?.ctyhocn;\n const classname = {\n rateNameClassName: 'mt-auto w-1/2 sm:w-full md:mt-0 md:w-3/5 xl:w-auto',\n propertyNameClassName: 'w-1/2 sm:w-full md:w-2/5 xl:flex-grow rtl:mr-2',\n hotelCardContentClassName: cx('flex w-full items-end', {\n 'sm:flex-col': !showImages && !isListViewOnly,\n 'sm:justify-end md:flex-row': showImages && !isListViewOnly,\n }),\n wrapperHotelCardHeaderAndCardContentClassName: cx(\n 'w-full content-end lg:grid lg:h-full lg:grid-cols-1',\n {\n 'px-2.5 py-1': showImages,\n }\n ),\n hotelCardImage: 'w-full justify-center flex',\n distanceClassName: cx('whitespace-nowrap text-xs font-normal text-text-alt', {\n hidden: !!pageType?.isGlobal,\n }),\n };\n\n const amexDisclaimer = disclaimerMessages?.find((disclaimer: RateInfoMessage) => {\n return disclaimer?.type === 'amexDisclaimer';\n })?.heading?.text;\n const { recentlyViewed, setRecentlyViewed, showRecentlyViewedChip } = useRecentlyViewed(\n ctyhocn as string\n );\n\n if (showRecentlyViewedChip) {\n badges?.push('view');\n }\n\n const handleOnRateNameCTAClick = () => {\n setRecentlyViewed({ ...recentlyViewed });\n if (transactionPropertyData) metrics.setPriceClicked(transactionPropertyData);\n };\n const setHighlightedMapCtyhocn = (ctyhocn: string | null) => {\n dispatch({ type: 'SET_HIGHLIGHTED_MAP_CTYHOCN', payload: ctyhocn });\n };\n const getHotelLocationName = () => {\n // In dream on a global page should display (city, state, Country) instead of distance marker\n const address = hotelInfo?.address;\n let location;\n let srLocation;\n if (pageType.isGlobal) {\n // Hotel location name\n location = address?.city;\n if (address?.city) location = address.city;\n if (address?.state) {\n location += location ? `, ${address.state}` : address.state;\n }\n if (address?.country) {\n location += location ? `, ${address.country}` : address.country;\n }\n //screen reader location text\n if (address?.city) srLocation = address.city;\n if (address?.stateName) {\n srLocation += srLocation ? `, ${address.stateName}` : address.stateName;\n }\n if (address?.countryName) {\n srLocation += srLocation ? `, ${address.countryName}` : address.countryName;\n }\n }\n return { location, srLocation };\n };\n const { location, srLocation } = getHotelLocationName();\n\n return (\n <li\n className=\"flex w-full justify-self-center rounded-lg border border-border\"\n data-testid={`hotel-card-${ctyhocn}`}\n onBlur={() => setHighlightedMapCtyhocn(ctyhocn || null)}\n onFocus={() => setHighlightedMapCtyhocn(null)}\n onMouseEnter={() => setHighlightedMapCtyhocn(ctyhocn || null)}\n onMouseLeave={() => setHighlightedMapCtyhocn(null)}\n >\n <div className=\"flex w-full flex-col lg:max-w-[343px] xl:max-w-[440px]\">\n {showImages && (\n <div className={classname.hotelCardImage} data-testid=\"hotel-card-image\">\n <div className=\"relative h-0 w-full overflow-hidden rounded-t-lg bg-bg-alt pb-2/3\">\n <Carousel\n data-testid=\"listViewImageCarousel\"\n images={carouselImages ? carouselImages : [masterImage]}\n />\n </div>\n </div>\n )}\n <HotelNameHeader url={hotelUrl} name={hotelName}>\n <h3\n className={cx('w-full break-words px-2.5 pt-2.5 font-semibold leading-snug', {\n 'text-sm': smMedViewPort,\n 'text-base': !smMedViewPort,\n })}\n data-testid=\"listViewPropertyName\"\n id={`hotel-${ctyhocn}`}\n >\n {hotelName}\n </h3>\n </HotelNameHeader>\n {badges?.length ? (\n <div className=\"ps-2.5\">\n <HotelBadges badges={badges} />\n </div>\n ) : null}\n\n <div\n className={classname.wrapperHotelCardHeaderAndCardContentClassName}\n data-testid=\"wrapper-hotel-card-content\"\n >\n <div className={classname.hotelCardContentClassName} data-testid=\"hotel-card-content\">\n <div className={classname.propertyNameClassName}>\n <button\n className=\"btn-sm btn-primary-text block self-start font-semibold\"\n data-testid={`hotelDetails-${ctyhocn}`}\n onClick={onDetailsClick}\n type=\"button\"\n >\n <span>{t('hotelDetails')}</span>\n <span className=\"sr-only\"> {t('forHotel', { hotel: hotelName })}</span>\n <span aria-hidden> ></span>\n </button>\n <span className={classname.distanceClassName} data-testid=\"distanceMarker\">\n {distance}\n </span>\n <span className=\"sr-only\">{srLocation}</span>\n <span\n aria-hidden=\"true\"\n className=\"whitespace-nowrap text-xs font-normal text-text-alt\"\n data-testid=\"locationMarker\"\n >\n {location}\n </span>\n <TripAdvisorRating\n isLoadingState={isTALoadingState}\n showReviewCount={true}\n tripAdvisorLocationSummary={tripAdvisorLocationSummary}\n />\n </div>\n <div className={classname.rateNameClassName}>\n <RateNameCTA\n ctaHref={ctaHref || ''}\n ctaLabel={ctaLabel}\n ctaMessage={ctaMessage}\n customRateInfo={customParams}\n data-testid=\"priceInfo\"\n isLoading={isHotelDataLoading}\n rateMessages={rateInfo}\n onRateNameCTAClick={handleOnRateNameCTAClick}\n />\n </div>\n </div>\n <KeyHotelAmenities amenities={amenities} />\n {!!customParams?.showCompare ? (\n <CompareHotelsCheckbox\n ctyhocn={ctyhocn || ''}\n isFirstCheckbox={isFirstAvailableProperty}\n />\n ) : null}\n {amexDisclaimer ? (\n <div\n className=\"shrink-0 grow-0 pt-2.5 text-xs font-normal flex-basis-full\"\n data-testid=\"amexDisclaimerMsg\"\n >\n {amexDisclaimer}\n </div>\n ) : null}\n </div>\n </div>\n </li>\n );\n};\n\nexport default HotelCard;\n","export default function HotelCardCTASkeleton() {\n return (\n <div\n aria-hidden\n className=\"flex h-full flex-col items-end justify-end space-y-2 pt-2\"\n data-testid=\"HotelCardCTASkeleton\"\n >\n <div className=\"h-8 w-16 animate-pulse bg-bg-alt\" />\n <div className=\"h-4 w-1/2 animate-pulse bg-bg-alt\" />\n <div className=\"h-10 w-32 animate-pulse rounded bg-bg-alt\" />\n </div>\n );\n}\n","import cx from 'classnames';\nimport HotelCardCTASkeleton from './hotel-card-cta-skeleton';\nimport { useMediaQuery } from 'usehooks-ts';\n\ntype HotelCardSkeletonProps = {\n isListViewOnly?: boolean;\n showImages?: boolean;\n};\n\nconst HotelCardSkeleton = ({ isListViewOnly, showImages }: HotelCardSkeletonProps) => {\n const isDesktop = useMediaQuery('(min-width: 1024px)');\n\n // Do not modify the classname string without notifying the team\n const classname = {\n wrapperHotelCardHeaderAndCardContentClassName: cx('w-full md:max-w-[440px]', {\n 'pl-0 py-2 md:pl-2 md:pr-2 pt-2 grow': showImages && !isDesktop,\n ' md:min-w-[343px]': showImages && isDesktop,\n 'pt-2 sm:w-5/7 sm:pt-0 sm:pl-4 md:w-3/4': showImages && isListViewOnly,\n }),\n hotelCardImage: 'flex-shrink-0 w-full',\n };\n\n return (\n <li\n className={cx(\n 'flex w-full min-w-[343px] flex-col justify-self-center rounded-lg md:max-w-[440px]',\n {\n ' last:mb-4': !isDesktop,\n }\n )}\n data-testid=\"hotel-card-skeleton\"\n >\n {/* Hotel Image placeholder */}\n {showImages && (\n <div className={classname.hotelCardImage} data-testid=\"hotel-card-image-shimmer\">\n <div className=\"relative h-0 w-full animate-pulse overflow-hidden bg-bg-alt pb-2/3\" />\n </div>\n )}\n {/* Hotel Card Details Wrapper */}\n <div\n className={classname.wrapperHotelCardHeaderAndCardContentClassName}\n data-testid=\"wrapper-hotel-card-details-shimmer\"\n >\n {/* Hotel Header placeholder */}\n <div\n className=\"my-2 h-4 w-full animate-pulse bg-bg-alt leading-snug rtl:mr-2\"\n data-testid=\"listView-property-name-shimmer\"\n />\n {/* Hotel Card Details Wrapper */}\n <div className=\"flex\">\n <div className=\"w-1/2 sm:w-full md:w-3/5 xl:grow rtl:mr-2\">\n {/* Hotel Details placeholder */}\n <div\n className=\"mb-2 block h-4 w-24 animate-pulse self-start bg-bg-alt\"\n data-testid=\"hotel-details-button-shimmer\"\n />\n {/* Hotel Distance Marker placeholder */}\n <div\n className=\"h-4 w-16 animate-pulse whitespace-nowrap bg-bg-alt\"\n data-testid=\"distance-marker-shimmer\"\n />\n {/* Trip Advisor placeholder */}\n <div\n className=\"mt-2 h-4 w-32 animate-pulse bg-bg-alt\"\n data-testid=\"trip-advisor-rating-shimmer\"\n />\n {/* Trip Advisor Circle placeholder */}\n <div\n className=\"mt-2 h-4 w-20 animate-pulse bg-bg-alt\"\n data-testid=\"trip-advisor-circle-review-shimmer\"\n />\n {/* Trip Advisor Based on Reviews placeholder */}\n <div\n className=\"mt-2 h-4 w-28 animate-pulse bg-bg-alt\"\n data-testid=\"trip-advisor-reviews-shimmer\"\n />\n </div>\n {/* Hotel Details CTA shimmer */}\n <div className=\"flex w-1/2 shrink-0 justify-end overflow-hidden\">\n <HotelCardCTASkeleton />\n </div>\n </div>\n </div>\n </li>\n );\n};\n\nexport default HotelCardSkeleton;\n","import { forwardRef, useMemo, useState } from 'react';\n\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\nimport { useTranslation } from 'next-i18next';\nimport type { GoogleCoordinate } from '../../utils';\nimport { getDistanceFromCenterFmt } from '../../utils';\nimport HotelCard from './hotel-card';\nimport HotelCardSkeleton from './hotel-card-skeleton';\nimport { useMetrics, useWrappedRouter } from '../../hooks';\n\nimport type { ShopMultiPropAvailQuery } from '@dx-ui/queries-dx-shop-search-ui';\nimport { useAppDispatch } from '../../providers/app-provider';\nimport {\n DEFAULT_HOTEL_CARD_SKELETON_COUNT,\n MAX_PROPERTIES_PER_LIST_VIEW_PAGE,\n} from '../../constants';\nimport { InfoMessageBanner } from '../info-message-banner/info-message-banner';\nimport { useGetPOIAirportInfoMVT } from './hooks/use-get-poi-airport-info-mvt';\n\nexport type IHotelCards = {\n hotels: HotelType[];\n pricing?: Record<string, ShopMultiPropAvailQuery['shopMultiPropAvail'][0]>;\n showImages: boolean;\n isListViewOnly?: boolean;\n isLoadingState?: boolean;\n centerCoordinate: GoogleCoordinate | null;\n cardsClassName?: string;\n initHotelCount?: number;\n} & React.HTMLAttributes<HTMLUListElement>;\n\nconst HotelCards = forwardRef<HTMLUListElement, IHotelCards>(\n (\n {\n hotels,\n pricing,\n showImages,\n isListViewOnly,\n isLoadingState,\n centerCoordinate,\n cardsClassName,\n initHotelCount,\n ...rest\n },\n forwardedRef\n ) => {\n const { t } = useTranslation(['hotel-card', 'rate-name-cta', 'locations-page']);\n const dispatch = useAppDispatch();\n const metrics = useMetrics();\n const { safeQueryParams: queryParameters, router } = useWrappedRouter();\n\n //NHCSEARCH-5621\n const [enablePOIAndAirportTest, setEnablePOIAndAirporTest] = useState(false);\n useGetPOIAirportInfoMVT({ enableTest: enablePOIAndAirportTest });\n\n const handleDetailsClick = (ctyhocn: string, name: string, index: number) => {\n setEnablePOIAndAirporTest(true);\n dispatch({ type: 'SET_PDP_CTYHOCN', payload: ctyhocn });\n metrics.setBrandDetail({\n ctyhocn,\n view: 'List',\n name,\n index: index + 1,\n });\n };\n\n const skeletonCardCount = useMemo(() => {\n if (initHotelCount && initHotelCount > 0) {\n return initHotelCount && initHotelCount > MAX_PROPERTIES_PER_LIST_VIEW_PAGE\n ? MAX_PROPERTIES_PER_LIST_VIEW_PAGE\n : initHotelCount;\n }\n return DEFAULT_HOTEL_CARD_SKELETON_COUNT;\n }, [initHotelCount]);\n if (isLoadingState) {\n let cnt = 0;\n return (\n <ul ref={forwardedRef} {...rest} className={cardsClassName}>\n {Array.from({ length: skeletonCardCount }, () => (\n <HotelCardSkeleton\n key={cnt++}\n isListViewOnly={isListViewOnly}\n showImages={showImages}\n />\n ))}\n </ul>\n );\n }\n const keyString: string | undefined =\n Object.keys(rest).find((key) => key === 'data-testid') ?? '';\n\n const firstAvailableProperty = hotels.findIndex((hotel) =>\n router.asPath.includes('/search/')\n ? pricing?.[hotel?.ctyhocn]?.summary?.status?.type === 'AVAILABLE'\n : hotel?.display?.open && hotel?.leadRate?.lowest\n );\n const SoldOutInfoMessageBanner = () => {\n /* show property sold out info banner if specific searched property sold out */\n const hotelPlaceId = queryParameters?.placeId?.includes('dx-hotel')\n ? queryParameters?.placeId?.split('::')[1]?.toUpperCase()\n : null;\n const queryParam = queryParameters?.query?.toUpperCase();\n return (hotelPlaceId && pricing?.[hotelPlaceId]?.statusCode === 1740) ||\n (queryParam && pricing?.[queryParam]?.statusCode === 1740) ? (\n <InfoMessageBanner message={t('selectedHotelSoldOut')} />\n ) : null;\n };\n if (!hotels.length) return null;\n\n return (\n <>\n <SoldOutInfoMessageBanner />\n <ul\n key={`ulHotelCard-${keyString}`}\n ref={forwardedRef}\n {...rest}\n className={cardsClassName}\n >\n {hotels.map((hotel, _id) => {\n const { name, ctyhocn, localization } = hotel;\n const { distanceFmt } = getDistanceFromCenterFmt(\n t,\n centerCoordinate,\n localization?.coordinate,\n router.locale\n );\n const priceInfo = pricing && pricing[ctyhocn];\n\n return (\n <HotelCard\n key={`hotel-card-${ctyhocn}`}\n distance={distanceFmt}\n isTALoadingState={isLoadingState}\n isListViewOnly={isListViewOnly}\n onDetailsClick={() => handleDetailsClick(ctyhocn, name || '', _id)}\n showImages={showImages}\n priceInfo={priceInfo}\n hotelInfo={hotel}\n isFirstAvailableProperty={_id === firstAvailableProperty}\n />\n );\n })}\n </ul>\n </>\n );\n }\n);\n\nHotelCards.displayName = 'HotelCards';\n\nexport default HotelCards;\n","import { Pagination } from '@dx-ui/osc-pagination';\nimport { useRef, useState, useEffect, useMemo } from 'react';\nimport { useTranslation } from 'next-i18next';\n\nimport { useMetrics, useTrackSearchPricing, useWrappedRouter, useBrandDetails } from '../../hooks';\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\nimport { ListViewBrandBanner } from './list-view-brand-banner';\nimport {\n DEFAULT_HOTEL_CARD_SKELETON_COUNT,\n MAX_PROPERTIES_PER_LIST_VIEW_PAGE,\n env,\n} from '../../constants';\nimport { AgeBasedModal } from '../../components/age-based-modal';\nimport type { GoogleCoordinate } from '../../utils';\nimport { getLengthOfStay } from '../../utils';\nimport { setFocusOnFirstListViewCard } from './list-view-utils/list-view.utils';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { useConfigRule } from '@dx-ui/framework-config-rule-provider';\nimport useShopMultiPropAvail from '../../hooks/use-shop-multi-prop-avail/use-shop-multi-prop-avail';\nimport { getInfoBannerURLWithBrandRemoved } from './list-view-utils/list-view-brand-banner.utils';\nimport { useGetVisibleInBoundHotels } from '../../hooks/use-get-visible-in-bound-hotels';\nimport { InfoMessageBanner } from '../info-message-banner/info-message-banner';\nimport { Link } from '@dx-ui/osc-link';\nimport HotelCards from '../hotel-card/hotel-cards';\nimport HotelCardSkeleton from '../hotel-card/hotel-card-skeleton';\nimport cx from 'classnames';\n\ntype ListViewProps = {\n isConductricsLoaded?: boolean;\n brandName?: string;\n brandCode?: string;\n centerCoordinate: GoogleCoordinate | null;\n isHSODataLoading?: boolean;\n onPageChanged?: (paginationIndex: number, pageSize: number) => void;\n sortedHotels: HotelType[];\n initHotelCount?: number;\n};\ntype IListViewLoadingShimmer = {\n isListViewOnly?: boolean;\n showImages?: boolean;\n cardsClassName?: string;\n cardCount?: number;\n};\n\n/*\n * List View Loading / Shimmer\n * Displays if hotel data is being fetched from backend\n */\nconst ListViewLoadingShimmer = ({\n isListViewOnly,\n showImages,\n cardsClassName,\n cardCount = DEFAULT_HOTEL_CARD_SKELETON_COUNT,\n}: IListViewLoadingShimmer) => {\n let cnt = 0;\n return (\n <ul className={cx(cardsClassName)}>\n {Array.from({ length: cardCount }, () => (\n <HotelCardSkeleton key={cnt++} isListViewOnly={isListViewOnly} showImages={showImages} />\n ))}\n </ul>\n );\n};\n\nexport const ListView = ({\n isConductricsLoaded,\n brandName,\n brandCode,\n centerCoordinate,\n isHSODataLoading,\n onPageChanged,\n sortedHotels,\n initHotelCount,\n}: ListViewProps) => {\n const {\n hasConnectingRooms,\n showHotelImages,\n paginationIndex,\n selectedCurrency,\n pageType,\n isListVisible,\n } = useAppState();\n const listRef = useRef<HTMLUListElement | null>(null);\n const { t } = useTranslation(['locations-page', 'list-view', 'list-view-brand-banner']);\n const metrics = useMetrics();\n const dispatch = useAppDispatch();\n\n const [isAgeBasedModalOpen, setIsAgeBasedModalOpen] = useState(false);\n const ulContainerRef = useRef<HTMLDivElement | null>(null);\n\n const { taggedConfig } = useConfigRule();\n // if show hotel images toggle is disabled always show images. Otherwise show images depending on toggle state\n const showImages = !taggedConfig?.config.showListViewHotelImagesToggle || !!showHotelImages;\n const isListViewOnly = !taggedConfig?.config['showMap'];\n\n const {\n safeQueryParams: queryParameters,\n router: { asPath, locale },\n } = useWrappedRouter();\n const { canonicalSlug, altSlugs, isHotelBrand } = useBrandDetails({ brandCode });\n\n const currentPageVisibleHotels = sortedHotels.slice(\n paginationIndex * MAX_PROPERTIES_PER_LIST_VIEW_PAGE,\n (paginationIndex + 1) * MAX_PROPERTIES_PER_LIST_VIEW_PAGE\n );\n const totalPages = Math.ceil(sortedHotels.length / MAX_PROPERTIES_PER_LIST_VIEW_PAGE);\n\n //guarantee we always fetch hotels in list view even if >150. Disable query if on locations page\n const { hashedData: pricing } = useShopMultiPropAvail({\n ctyhocns: currentPageVisibleHotels.map((hotel) => hotel.ctyhocn),\n mpaConstraints: true,\n });\n\n const showAmountAfterTax = useMemo(() => {\n return asPath.includes('/locations/')\n ? sortedHotels?.some((hotel) => !!hotel?.leadRate?.lowest?.cmaTotalPriceIndicator)\n : sortedHotels.some((hotel) =>\n Boolean(pricing[hotel.ctyhocn]?.summary?.lowest?.cmaTotalPriceIndicator)\n );\n }, [asPath, pricing, sortedHotels]);\n\n useTrackSearchPricing({\n isDateSearch: true,\n hotels: currentPageVisibleHotels,\n pricing,\n datesFlex: queryParameters?.datesFlex,\n selectedCurrency: selectedCurrency || '',\n lengthOfStay: getLengthOfStay(queryParameters?.departureDate, queryParameters?.arrivalDate),\n });\n\n const { brandedVisibleHotels, otherVisibleHotels } = useGetVisibleInBoundHotels({\n currentPageVisibleHotels,\n brandCode,\n brandName,\n });\n\n const shouldDisplayBrandBannerInCurrentPage = () => {\n const atLeastOneHotelNotBranded = otherVisibleHotels?.length > 0;\n const displayAtEndOfBrandPageResults = pageType.isBrand && paginationIndex === totalPages - 1;\n\n switch (true) {\n case displayAtEndOfBrandPageResults:\n return true;\n case pageType.isGlobal && atLeastOneHotelNotBranded:\n return true;\n default:\n return false;\n }\n };\n //call onPageChange if it exists and reset focus on first card if paginationIndex changes\n useEffect(() => {\n if (onPageChanged) onPageChanged(paginationIndex, MAX_PROPERTIES_PER_LIST_VIEW_PAGE);\n }, [onPageChanged, paginationIndex]);\n\n //reset focus on first card in list any time pagination changes\n useEffect(() => {\n if (paginationIndex > 0) setFocusOnFirstListViewCard(ulContainerRef);\n }, [paginationIndex]);\n\n const handlePagination = async (newPageIndex: number) => {\n dispatch({ type: 'SET_PAGINATION_INDEX', payload: newPageIndex });\n await metrics.trackPaginationClick({\n paginationNumber: `${newPageIndex + 1}`,\n actionType: !queryParameters ? 'categoryPagination' : 'searchAction',\n });\n };\n useEffect(() => {\n // setting setPaginationData separately for each flow (search & locations)\n // since search hotels will not load till conductrics is resolved\n if (isConductricsLoaded && totalPages > 0) {\n // due to string character limit constraints with Adobe,\n // we still want only first page results in the propertyResultList.\n // but propertyResults should reflect the total number of hotels returned.\n metrics.setPaginationData({\n totalPages: `${totalPages}`,\n propertyResultList: otherVisibleHotels.map((hotel) => hotel.ctyhocn).join(','),\n propertyResults: otherVisibleHotels.length,\n brandedHotels: brandedVisibleHotels\n .filter((hotel) => hotel.brandCode === brandCode)\n .map((hotel) => hotel.ctyhocn),\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isConductricsLoaded]);\n\n // if the current page is beyond the last page, set it to the last page\n const lastPageIndex = Math.max(totalPages - 1, 0); // go no lower than the first page\n if (paginationIndex > lastPageIndex && dispatch) {\n dispatch({ type: 'SET_PAGINATION_INDEX', payload: lastPageIndex });\n }\n const showHotelCardImage = !!pageType.isDreams || !!showImages;\n const classname = {\n cardsClassName:\n 'mb-4 grid justify-center gap-2 grid-cols-1 lg:grid-cols-2 lg:w-[694px] xl:w-[888px]',\n };\n const linkWithoutBrandSlug = pageType.isBrand ? (\n <Link\n url={getInfoBannerURLWithBrandRemoved({\n baseUrl: env.OHW_BASE_URL,\n path: asPath,\n locale,\n canonicalSlug,\n altSlugs,\n brandCode,\n })}\n className=\"px-2 text-sm font-normal\"\n >\n {t('list-view-brand-banner:exploreOtherHotelsLink')}\n </Link>\n ) : null;\n\n const skeletonCardCount = useMemo(() => {\n if (initHotelCount && initHotelCount > 0) {\n return initHotelCount && initHotelCount > MAX_PROPERTIES_PER_LIST_VIEW_PAGE\n ? MAX_PROPERTIES_PER_LIST_VIEW_PAGE\n : initHotelCount;\n }\n return DEFAULT_HOTEL_CARD_SKELETON_COUNT;\n }, [initHotelCount]);\n\n if (isHSODataLoading && sortedHotels?.length === 0)\n return (\n <ListViewLoadingShimmer\n isListViewOnly={isListViewOnly}\n showImages={showHotelCardImage}\n cardsClassName={classname.cardsClassName}\n cardCount={skeletonCardCount}\n />\n );\n\n // Returns Message when zero hotels are found to adjust search / map\n if (!isHSODataLoading && sortedHotels?.length === 0) {\n const noHotelsFoundBannerMessage = isHotelBrand\n ? t('list-view-brand-banner:couldNotFindHotelsInSearchArea', { brandName })\n : t('notFoundMessage');\n return (\n <InfoMessageBanner message={noHotelsFoundBannerMessage}>\n {linkWithoutBrandSlug}\n </InfoMessageBanner>\n );\n }\n\n return (\n <div ref={ulContainerRef} className={cx({ hidden: !isListVisible })}>\n {showAmountAfterTax ? <p className=\"block pb-2 \">{t('list-view:cmaPriceMessage')}</p> : null}\n {hasConnectingRooms && <InfoMessageBanner message={t('list-view:ccrPricingMessage')} />}\n {/* Child based pricing modal when at least one property in map requires child ages but arent specified by customer. but TBD about this location in code (at least no longer in hotel card)*/}\n <AgeBasedModal\n isAgeBasedModalOpen={isAgeBasedModalOpen}\n pricing={pricing}\n setIsAgeBasedModalOpen={setIsAgeBasedModalOpen}\n />\n <HotelCards\n aria-label={t('list-view:hotelSearchResults')}\n centerCoordinate={centerCoordinate}\n data-testid=\"hotelsList\"\n hotels={currentPageVisibleHotels || []}\n isListViewOnly={isListViewOnly}\n isLoadingState={isHSODataLoading}\n pricing={pricing}\n ref={listRef}\n showImages={showHotelCardImage}\n cardsClassName={classname.cardsClassName}\n initHotelCount={initHotelCount}\n />\n <ListViewBrandBanner\n brandCode={brandCode}\n isDisplayBrandBanner={shouldDisplayBrandBannerInCurrentPage()}\n isPageBrandFilterEnabled={pageType.isPageBrandFilterEnabled}\n numBrandedHotels={brandedVisibleHotels?.length}\n isEndOfResults={!isHSODataLoading && paginationIndex === lastPageIndex}\n />\n\n <div className=\"border-y border-border py-4\">\n <Pagination\n current={paginationIndex}\n onNextClick={() => handlePagination(paginationIndex + 1)}\n onPreviousClick={() => handlePagination(paginationIndex - 1)}\n total={totalPages}\n />\n </div>\n </div>\n );\n};\n","import type * as React from 'react';\nimport { useMetrics, useWrappedRouter } from '../../hooks';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport {\n CurrencyConverter as OSCCurrencyConverter,\n convert,\n useCurrencyConversion,\n} from '@dx-ui/osc-currency-converter';\nimport { useFilterState } from '../../providers/filter-provider';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { GOALS } from '../../constants';\n\ntype CurrencyConverterProps = {\n onChange?: () => void;\n};\n\nexport const CurrencyConverter = ({ onChange }: CurrencyConverterProps) => {\n const metrics = useMetrics();\n const { router } = useWrappedRouter();\n const dispatch = useAppDispatch();\n const { selectedCurrency: currencyCode, pageType, selectedCurrency } = useAppState();\n const activeFiltersState = useFilterState();\n\n const { currenciesMap } = useCurrencyConversion();\n async function handleChange(event: React.ChangeEvent<HTMLSelectElement>) {\n const currency = event.target.value;\n\n const fromCurrency = currenciesMap?.get(selectedCurrency || 'USD');\n const toCurrency = currenciesMap?.get(currency || 'USD');\n if (!fromCurrency || !toCurrency) {\n return;\n }\n sendReward(GOALS.currencyEngagement);\n const converted = convert(\n activeFiltersState?.priceFilter?.[1],\n fromCurrency,\n toCurrency,\n 0,\n ''\n );\n dispatch({\n type: 'SET_DISPLAY_CURRENCY',\n payload: {\n currency,\n ...(activeFiltersState?.priceFilter &&\n converted.price && {\n priceFilter: [activeFiltersState?.priceFilter?.[0], converted.price],\n }),\n },\n });\n onChange?.();\n await metrics.trackCurrencyConverterClick({ currencyCode: currency || 'LOCAL' });\n }\n\n const selectProps = {\n id: 'selectCurrencyConverter',\n 'data-testid': 'currencyConverterSelect',\n };\n\n if (pageType.isPointsExplorer) return null;\n\n return (\n <div className=\"w-36 items-center pl-2 text-sm md:w-64 rtl:pl-0 rtl:pr-2\">\n <OSCCurrencyConverter\n showDefaultOption={true}\n language={router.locale as string}\n onChange={handleChange}\n selectedCurrency={currencyCode as string}\n hasStackedDisplay={true}\n selectProps={selectProps}\n />\n </div>\n );\n};\n","type GetAspectRatioUrlParams = {\n /** Aspect ratio based URL from CMS */\n src?: string | null;\n /** Carousel container width */\n width: number;\n};\n\nconst BREAK_POINTS = Object.freeze({\n small: 640,\n medium: 768,\n large: 1024,\n extraLarge: 1280,\n twoExtraLarge: 1440,\n});\n\nexport type BreakPoints = keyof typeof BREAK_POINTS;\n\n/**\n * Returns a set of aspect ratio based URLs (with 2x and 3x options) bucketed by breakpoints\n * @param src Aspect ratio based URL from CMS\n * @param width desired image width\n * @returns imgUrl, twoXimgUrl, threeXImgUrl\n */\nexport const getAspectRatioUrl = ({ src, width }: GetAspectRatioUrlParams) => {\n if (!src) return { imgUrl: null, twoXimgUrl: null, threeXImgUrl: null };\n\n const srcUrl = new URLSearchParams(src);\n\n const cw = srcUrl.has('cw') ? parseInt(srcUrl.get('cw') as string) : null;\n const ch = srcUrl.has('ch') ? parseInt(srcUrl.get('ch') as string) : null;\n\n // If a crop width or height is not present in the URL, return null as we cant do the math to return the appopriate img src. Contact the CMS team in case we see broken assets\n if (!cw || !ch) return { imgUrl: null, twoXimgUrl: null, threeXImgUrl: null };\n\n const aspectRatioVariants = Object.entries(BREAK_POINTS).reduce(\n (accum, [breakPointName, breakPointWidth]) => {\n const imgUrl = `${src}&rw=${breakPointWidth}&rh=${Math.round((breakPointWidth * ch) / cw)}`;\n\n const twoXimgUrl = `${src}&rw=${breakPointWidth * 2}&rh=${\n Math.round((breakPointWidth * ch) / cw) * 2\n }`;\n\n const threeXImgUrl = `${src}&rw=${breakPointWidth * 3}&rh=${\n Math.round((breakPointWidth * ch) / cw) * 3\n }`;\n\n return { ...accum, [breakPointName]: { imgUrl, twoXimgUrl, threeXImgUrl } };\n },\n {} as Record<BreakPoints, { imgUrl: string; twoXimgUrl: string; threeXImgUrl: string }>\n );\n\n switch (true) {\n case width <= BREAK_POINTS.small:\n return aspectRatioVariants.small;\n\n case width > BREAK_POINTS.small && width <= BREAK_POINTS.medium:\n return aspectRatioVariants.medium;\n\n case width > BREAK_POINTS.medium && width <= BREAK_POINTS.large:\n return aspectRatioVariants.large;\n\n case width > BREAK_POINTS.large && width <= BREAK_POINTS.extraLarge:\n return aspectRatioVariants.extraLarge;\n\n default:\n return aspectRatioVariants.twoExtraLarge;\n }\n};\n","export * from './lib/get-aspect-ratio-url';\n","import type { IconNames } from '@dx-ui/osc-icon';\nimport Icon from '@dx-ui/osc-icon';\nimport cx from 'classnames';\n\nexport const InfoMessageBanner = ({\n bannerClassName,\n message,\n children,\n shouldCenterInfoIcon,\n iconClassName,\n iconName = 'info-circle',\n}: {\n message?: string;\n children?: React.ReactNode;\n shouldCenterInfoIcon?: boolean;\n bannerClassName?: string;\n iconClassName?: string;\n iconName?: (typeof IconNames)[number];\n}) => (\n <h2\n className={cx(\n 'mb-4 flex px-4 py-3 font-semibold leading-none',\n {\n 'bg-bg-primary': !bannerClassName,\n },\n bannerClassName\n )}\n >\n <div className={cx({ 'flex items-center': shouldCenterInfoIcon })}>\n <Icon name={iconName} variant=\"regular\" size=\"sm\" className={iconClassName} />\n </div>\n <div className=\"flex flex-col\">\n <span className=\"pl-2 text-base\">{message}</span>\n {children}\n </div>\n </h2>\n);\n","import {\n NUM_AMENITIES_SUGGESTIONS_WANTED,\n HotelAttributeIds,\n MAX_SUGGESTED_AMENITY_FILTERS_WITH_SALE_FILTER,\n} from '../components/filters/filter.constants';\nimport type { AmenityItem } from '../components/filters/suggested-filters';\nimport type { HotelAmenityId } from '@dx-ui/queries-dx-shop-search-ui';\nimport { useAppState } from '../providers/app-provider';\nimport type { HotelType } from '../providers/app-provider/app-provider.types';\nimport { useMemo } from 'react';\nimport { useFeatureToggleConfig } from './use-feature-toggle';\nimport type { Maybe } from '@dx-ui/gql-types';\nimport { useTranslation } from 'next-i18next';\nimport { HIGHEST_AMENITIES_SUGGESTED_FILTERS } from '../constants';\nimport { useGetMVTSelections } from './use-get-mvt-selections';\n\nconst findAmenity = (wantedAmenityId: string, amenities: AmenityItem[]) => {\n const foundAmenity = amenities.find((amenity) => amenity.id === wantedAmenityId);\n return (\n foundAmenity || {\n id: wantedAmenityId,\n name: wantedAmenityId,\n }\n );\n};\n\nconst calculateSuggestedFilterCounts = ({\n filtersList,\n visibleHotels,\n hotelsInBounds,\n}: {\n filtersList?: string[];\n visibleHotels: string[];\n hotelsInBounds: Record<string, HotelType>;\n}) => {\n return filtersList?.length\n ? filtersList.reduce<{\n isAtleastOneSuggestedFilter: boolean;\n suggestedFilterCounts: { [key: string]: number };\n }>(\n (result, suggestedFilter) => {\n const count = visibleHotels.reduce((count, hotel) => {\n const inBoundsHotel = hotelsInBounds[hotel];\n if (inBoundsHotel) {\n return inBoundsHotel.amenityIds.includes(suggestedFilter as HotelAmenityId)\n ? count + 1\n : count;\n }\n return count;\n }, 0);\n\n return {\n isAtleastOneSuggestedFilter: result.isAtleastOneSuggestedFilter || count > 0,\n suggestedFilterCounts: {\n ...result.suggestedFilterCounts,\n [suggestedFilter]: count,\n },\n };\n },\n {\n isAtleastOneSuggestedFilter: false,\n suggestedFilterCounts: {},\n }\n )\n : {\n isAtleastOneSuggestedFilter: false,\n suggestedFilterCounts: {},\n };\n};\n\nconst calculateTopSuggestedFilters = (\n suggestedFilterCounts: { [key: string]: number },\n amenities: AmenityItem[],\n maxSuggestedFilters: number\n) => {\n const topSuggestedFilters: { [key: string]: AmenityItem } = {};\n\n for (const suggestedFilter of Object.keys(suggestedFilterCounts)) {\n const count = suggestedFilterCounts[suggestedFilter] ?? 0;\n\n if (count > 0 && Object.keys(topSuggestedFilters)?.length < maxSuggestedFilters) {\n topSuggestedFilters[suggestedFilter] = findAmenity(suggestedFilter, amenities);\n const topFilter = topSuggestedFilters[suggestedFilter];\n if (topFilter) topFilter.count = suggestedFilterCounts[suggestedFilter];\n } else if (count > 0) {\n const smallestCountKey = Object.keys(topSuggestedFilters).reduce((a, b) => {\n const filterA = topSuggestedFilters[a];\n const filterB = topSuggestedFilters[b];\n if (filterA && filterB) {\n const aCount = filterA.count || 0;\n const bCount = filterB.count || 0;\n return aCount < bCount ? a : b;\n }\n return a;\n });\n\n const smallestCount = topSuggestedFilters[smallestCountKey]?.count;\n\n if (!smallestCount || count > smallestCount) {\n delete topSuggestedFilters[smallestCountKey];\n topSuggestedFilters[suggestedFilter] = findAmenity(suggestedFilter, amenities);\n const topSuggestedFilter = topSuggestedFilters[suggestedFilter];\n if (topSuggestedFilter) topSuggestedFilter.count = suggestedFilterCounts[suggestedFilter];\n }\n }\n }\n return topSuggestedFilters;\n};\n\nconst getSuggestedFiltersQuant = ({ hasSalesFilter }: { hasSalesFilter: boolean }) => {\n if (hasSalesFilter) {\n return MAX_SUGGESTED_AMENITY_FILTERS_WITH_SALE_FILTER;\n } else {\n return NUM_AMENITIES_SUGGESTIONS_WANTED;\n }\n};\n//NHCSEARCH-5346\nconst HIGHEST_CONVERTING_AMENITIES = ['evCharging', 'freeParking', 'airportShuttle', 'petsAllowed'];\nconst CONGFIGURED_SUGGESTED_FILTERS = [\n 'dx-location::locality::us::ny::new-york-city',\n 'dx-location::locality::us::ca::los-angeles',\n 'dx-location::locality::us::fl::orlando',\n 'dx-location::locality::us::il::chicago',\n 'dx-location::locality::us::dc::washington-dc',\n 'dx-location::locality::us::nv::las-vegas',\n 'dx-location::locality::gb::london',\n 'dx-location::locality::us::ga::atlanta',\n 'dx-location::locality::us::ca::orange',\n 'dx-location::locality::us::ca::san-diego',\n 'dx-location::locality::us::tx::dallas',\n 'dx-location::locality::us::ma::boston',\n 'dx-location::locality::us::hi::honolulu',\n 'dx-location::locality::us::fl::ft-lauderdale',\n 'dx-location::locality::us::fl::miami',\n 'dx-location::locality::us::tn::nashville',\n 'dx-location::locality::mx::cancun',\n 'dx-location::locality::us::fl::tampa',\n 'dx-location::locality::us::tx::houston',\n 'dx-location::locality::us::az::phoenix',\n];\n\nexport const useSuggestedFilters = ({\n visibleHotels,\n amenities,\n matchId,\n saleFilter,\n}: {\n visibleHotels: string[];\n amenities: AmenityItem[];\n matchId?: Maybe<string>;\n saleFilter?: { showSaleFilter: boolean; saleFilterCount: number };\n}) => {\n const { hotelsInBounds } = useAppState();\n const { t } = useTranslation('filters');\n\n const { isLoaded: isConducticsLoaded, isMVTVariant: isHighestConvertingAmenitiesVariant } =\n useGetMVTSelections({ agentId: HIGHEST_AMENITIES_SUGGESTED_FILTERS.agentId });\n\n const isHighestConvertingAmenitiesTest =\n isConducticsLoaded && isHighestConvertingAmenitiesVariant.b;\n\n const { config: defaultConfig, configFromRule } = useFeatureToggleConfig(\n 'config-rule-search-ui-suggested-filters',\n { matchId: matchId || '' }\n );\n\n const suggestedSaleFilter = useMemo(\n () =>\n saleFilter?.showSaleFilter && visibleHotels.length <= 150\n ? {\n sale: {\n id: HotelAttributeIds.sale,\n name: t('saleRates'),\n count: saleFilter?.saleFilterCount,\n },\n }\n : null,\n [saleFilter?.saleFilterCount, saleFilter?.showSaleFilter, t, visibleHotels.length]\n );\n\n const filtersList =\n isHighestConvertingAmenitiesTest && matchId && !CONGFIGURED_SUGGESTED_FILTERS.includes(matchId)\n ? HIGHEST_CONVERTING_AMENITIES\n : (configFromRule || defaultConfig)?.suggestedFilters;\n\n const maxSuggestedFilters = getSuggestedFiltersQuant({\n hasSalesFilter: Boolean(suggestedSaleFilter),\n });\n\n // get the count of all filters in filtersList\n const { isAtleastOneSuggestedFilter, suggestedFilterCounts } = useMemo(\n () => calculateSuggestedFilterCounts({ filtersList, visibleHotels, hotelsInBounds }),\n [filtersList, hotelsInBounds, visibleHotels]\n );\n // get only the top filters count while maintaining the order of filtersList\n const suggestedFilters = useMemo(\n () => calculateTopSuggestedFilters(suggestedFilterCounts, amenities, maxSuggestedFilters),\n\n [suggestedFilterCounts, amenities, maxSuggestedFilters]\n );\n\n const topSuggestedFilters = suggestedSaleFilter\n ? {\n ...suggestedSaleFilter,\n ...suggestedFilters,\n }\n : suggestedFilters;\n\n return { topSuggestedFilters, isAtleastOneSuggestedFilter };\n};\n","import cx from 'classnames';\nimport { useTranslation } from 'next-i18next';\nimport { useFilterState } from '../../providers/filter-provider';\nimport type { HotelAmenityId, Maybe } from '@dx-ui/queries-dx-shop-search-ui';\nimport type { ActiveFiltersState } from './filter.constants';\nimport { useMetrics } from '../../hooks';\nimport { GOALS } from '../../constants';\nimport { useSuggestedFilters } from '../../hooks/use-suggested-filters';\nimport Icon, { AmenityIcons } from '@dx-ui/osc-icon';\nimport { HotelAttributeIds } from './filter.constants';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { TaxonomyList } from '@dx-ui/osc-taxonomy-list';\nimport { useState } from 'react';\nimport { useVerticalSpaceMVT } from '../../hooks/use-vertical-space-MVT';\n\nexport type AmenityItem = {\n id: string;\n name: string;\n hint?: string | null;\n count?: number;\n};\ntype SuggestedFilterButtonsProps = {\n amenities?: AmenityItem[];\n isConductricsLoaded?: boolean;\n isFindingHotels?: boolean;\n onFilterCriteriaChange: (activeFiltersState: ActiveFiltersState) => void;\n visibleHotels: string[];\n matchId?: Maybe<string>;\n saleFilter?: { showSaleFilter: boolean; saleFilterCount: number };\n};\n\ntype SuggestedFiltersAmenitiesProps = {\n suggestedFilterOrderedList: AmenityItem[];\n onFilterCriteriaChange: (activeFiltersState: ActiveFiltersState) => void;\n showSaleFilter?: boolean;\n suggestedFilterMVTVariant?: Record<string, boolean>;\n};\n\n/*\n * SuggestedFilterButtons\n * Displays the Suggested Filter Component\n */\nexport const SuggestedFilterButtons = ({\n amenities = [],\n isConductricsLoaded,\n isFindingHotels,\n onFilterCriteriaChange,\n visibleHotels,\n matchId,\n saleFilter,\n}: SuggestedFilterButtonsProps) => {\n const { isAtleastOneSuggestedFilter, topSuggestedFilters } = useSuggestedFilters({\n visibleHotels,\n amenities,\n matchId,\n saleFilter,\n });\n const suggestedFiltersOrderedList = Object.values(topSuggestedFilters);\n\n const showSuggestedFilters = isAtleastOneSuggestedFilter || saleFilter?.showSaleFilter;\n\n const { isSuggestedFiltersInHorizontalScroll } = useVerticalSpaceMVT();\n\n if (showSuggestedFilters) {\n if (isFindingHotels || !isConductricsLoaded || !amenities.length)\n return <SuggestedFiltersShimmer shouldShowTitle={!isSuggestedFiltersInHorizontalScroll} />;\n else if (isConductricsLoaded && !!visibleHotels.length)\n return (\n <>\n {isSuggestedFiltersInHorizontalScroll ? null : <SuggestedFiltersTitle />}\n <SuggestedFiltersAmenities\n onFilterCriteriaChange={onFilterCriteriaChange}\n suggestedFilterOrderedList={suggestedFiltersOrderedList}\n showSaleFilter={saleFilter?.showSaleFilter}\n />\n </>\n );\n }\n return null;\n};\n\n/*\n * SuggestedFiltersShimmer\n * Returns the Suggested Filters Shimmer State\n */\nconst SuggestedFiltersShimmer = ({ shouldShowTitle }: { shouldShowTitle?: boolean }) => (\n <>\n {shouldShowTitle ? (\n <div className=\"flex\" data-testid=\"suggested-filters-shimmer\">\n <div className=\"mb-4 h-6 w-32 animate-pulse bg-bg-alt\" />\n </div>\n ) : null}\n <div\n className={cx('flex h-32 gap-2 lg:h-16', {\n '-mb-3 pt-3.5': !shouldShowTitle,\n })}\n >\n <div className=\"mr-2 h-10 w-20 animate-pulse rounded-full bg-bg-alt lg:mr-1 lg:w-36\" />\n <div className=\"mr-2 h-10 w-20 animate-pulse rounded-full bg-bg-alt lg:mr-1 lg:w-36\" />\n <div className=\"mr-2 h-10 w-20 animate-pulse rounded-full bg-bg-alt lg:mr-1 lg:w-36\" />\n <div className=\"mr-2 h-10 w-20 animate-pulse rounded-full bg-bg-alt lg:mr-1 lg:w-36\" />\n </div>\n </>\n);\n\n/*\n * Returns Suggest Filters Title\n */\nconst SuggestedFiltersTitle = () => {\n const { t } = useTranslation('filters');\n return (\n <h2 className=\"label mr-1 flex items-start pb-1 font-semibold tracking-tight rtl:mx-0\">\n {t('suggestedFiltersLabel')}\n </h2>\n );\n};\n\nconst SuggestedFiltersAmenities = ({\n onFilterCriteriaChange,\n suggestedFilterOrderedList,\n}: SuggestedFiltersAmenitiesProps) => {\n const { t } = useTranslation('filters');\n const activeFiltersState = useFilterState();\n\n /* NHCSEARCH-5451 Vertical Space MVT */\n const { isShorterSuggestedFilters, isSuggestedFiltersInHorizontalScroll } = useVerticalSpaceMVT();\n\n const getTaxonomyListClassName = () => {\n switch (true) {\n case isShorterSuggestedFilters:\n return '-mb-3';\n case isSuggestedFiltersInHorizontalScroll:\n return '-mb-3 pt-3.5';\n default:\n return undefined;\n }\n };\n return (\n <div className=\"pb-2\">\n <TaxonomyList\n labelledBy=\"suggestedFilters\"\n testId=\"suggested-filters\"\n name={t('suggestedFiltersLabel')}\n listItemClassname={getTaxonomyListClassName()}\n >\n {suggestedFilterOrderedList?.map((amenity) => {\n const amenityListCount = amenity?.count;\n const amenitySelected =\n activeFiltersState.amenityFilters.includes(amenity?.id ?? '') ||\n activeFiltersState.attributeFilters.includes(amenity?.id);\n return amenityListCount ? (\n <SuggestedFilterButton\n amenity={amenity}\n amenityListCount={amenityListCount}\n isAmenitySelected={amenitySelected}\n onFilterCriteriaChange={onFilterCriteriaChange}\n />\n ) : null;\n })}\n </TaxonomyList>\n <span aria-hidden=\"true\" className=\"sr-only\" id=\"suggestedFilters\">\n {t('suggestedFiltersLabel')}\n </span>\n </div>\n );\n};\nfunction SuggestedFilterButton({\n amenity,\n amenityListCount,\n isAmenitySelected,\n onFilterCriteriaChange,\n}: {\n amenity: AmenityItem;\n amenityListCount: number;\n isAmenitySelected: boolean;\n onFilterCriteriaChange: (activeFiltersState: ActiveFiltersState) => void;\n}) {\n const [a11yText, setA11yText] = useState<string>('');\n const [selectedAmenity, setSelectedAmenity] = useState('');\n const { t } = useTranslation('filters');\n const activeFiltersState = useFilterState();\n const metrics = useMetrics();\n\n /* NHCSEARCH-5451 Vertical Space MVT */\n const { isShorterSuggestedFilters } = useVerticalSpaceMVT();\n\n const resetSuggestedFilter = (amenityId: HotelAmenityId | typeof HotelAttributeIds.sale) => {\n const attributeFilters = [...activeFiltersState.attributeFilters];\n const attributeIndex = attributeFilters.indexOf(amenityId);\n const amenityFilters = [...activeFiltersState.amenityFilters];\n const amenityIndex = amenityFilters.indexOf(amenityId);\n\n if (amenityId === HotelAttributeIds.sale) {\n if (attributeIndex !== -1) attributeFilters.splice(attributeIndex, 1);\n else attributeFilters.push(amenityId);\n } else {\n if (amenityIndex !== -1) amenityFilters.splice(amenityIndex, 1);\n else amenityFilters.push(amenityId);\n }\n\n const updatedActiveFiltersState = {\n ...activeFiltersState,\n amenityFilters,\n attributeFilters,\n };\n\n onFilterCriteriaChange(updatedActiveFiltersState);\n };\n const handleOnClick = async (\n amenityId: HotelAmenityId | typeof HotelAttributeIds.sale,\n amenitySelected: boolean\n ) => {\n setSelectedAmenity(amenityId);\n const suggestedFiltersA11YText = amenitySelected\n ? t('suggestedFiltersRemoved')\n : t('suggestedFiltersApplied');\n setA11yText(suggestedFiltersA11YText);\n\n resetSuggestedFilter(amenityId);\n sendReward(GOALS.suggestedFilterEngagement);\n await metrics.trackSuggestedFilters(amenityId);\n\n setTimeout(() => {\n if (amenitySelected) setA11yText('');\n }, 2000);\n };\n\n return (\n <div className=\"h-10 px-1\" key={amenity.name}>\n <button\n type=\"button\"\n name={`${amenity?.name} (${amenityListCount})`}\n aria-label={`${amenity?.name} ${amenityListCount} ${\n selectedAmenity === amenity.id ? a11yText : ''\n }`}\n className={cx(\n 'btn btn-primary-outline flex items-center rounded-full focus:border-primary',\n {\n 'text-bg bg-primary outline-none active:text-text-inverse focus:text-text-inverse hover:text-text-inverse':\n isAmenitySelected,\n 'h-[26px] gap-x-1': isShorterSuggestedFilters,\n 'gap-x-2': !isShorterSuggestedFilters,\n }\n )}\n onClick={() => handleOnClick(amenity?.id as HotelAmenityId, isAmenitySelected)}\n >\n <span>\n <Icon\n name={AmenityIcons[amenity.id as HotelAmenityId] || amenity.id}\n size={isShorterSuggestedFilters ? 'xs' : 'md'}\n />\n </span>\n <span\n aria-hidden\n className={cx({\n 'text-xs font-normal': isShorterSuggestedFilters,\n 'text-sm font-bold': !isShorterSuggestedFilters,\n })}\n >\n <span>{`${amenity.name} (${amenityListCount})`}</span>\n </span>\n </button>\n {a11yText && selectedAmenity === amenity.id ? (\n <span aria-live=\"assertive\" className=\"sr-only -order-1\">\n <span role=\"status\">{`${amenity?.name} ${a11yText}`} </span>\n </span>\n ) : null}\n </div>\n );\n}\n","import { useTranslation } from 'next-i18next';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { COMPARE_ONBOARDING, GOALS } from '../../constants';\nimport { useGetMVTSelections, useWrappedRouter } from '../../hooks';\nimport { FeatureToolTip } from './feature-tool-tip';\nimport { useLocalStorage } from 'usehooks-ts';\nimport { useRef, useState } from 'react';\n\ntype CompareToggleProps = {\n onChange?: () => void;\n};\n\nexport const CompareHotelsToggle = ({ onChange }: CompareToggleProps) => {\n const { t } = useTranslation('compare-hotels');\n const { safeQueryParams: queryParameters, router } = useWrappedRouter();\n\n const { compareHotelsToggle, hotelsToCompare } = useAppState();\n const dispatch = useAppDispatch();\n\n //NHCSEARCH-5449 | Compare Hotels Onboarding MVT\n const toggleRef = useRef<HTMLInputElement>(null);\n const {\n isLoaded: isOnboardingMVTLoaded,\n isMVTVariant: { b: isOnboardingVarB, c: isOnboardingVarC },\n } = useGetMVTSelections({\n agentId: COMPARE_ONBOARDING.agentId,\n MVTVariants: ['b', 'c'],\n isProvisional: router.locale === 'en',\n });\n const [isOnboarded, setIsOnboarded] = useLocalStorage('compare-hotels-onboarded', false);\n const [isCompareToolTipOpen, setIsCompareToolTipOpen] = useState(true);\n const handleToolTipClose = () => {\n if (isOnboardingVarB) setIsOnboarded(true);\n setIsCompareToolTipOpen(false);\n if (toggleRef.current) toggleRef.current.focus();\n };\n const showCompareOnboardingToolTip = isOnboardingMVTLoaded && !isOnboarded;\n\n const handleInputChange = () => {\n if (onChange) onChange();\n if (!compareHotelsToggle) sendReward(GOALS.compareHotelsToggleOn);\n //when hotels to compare still selected and toggle is set to false - remove previous selections\n if (!compareHotelsToggle && hotelsToCompare.length)\n dispatch({ type: 'SET_HOTELS_TO_COMPARE', payload: [] });\n dispatch({ type: 'SET_COMPARE_HOTELS_TOGGLE', payload: !compareHotelsToggle });\n if (isOnboardingVarB) setIsOnboarded(true);\n setIsCompareToolTipOpen(false);\n };\n return !queryParameters?.datesFlex ? (\n <div className=\"relative ml-1 mr-2 text-nowrap pt-5 rtl:mb-2\">\n {/* NHCSEARCH-5449 | Compare Hotels Onboarding MVT */}\n <FeatureToolTip\n absolutePosition=\"-left-2 -top-10\"\n tailPosition=\"left-6\"\n message={t('newFeature')}\n onDismiss={handleToolTipClose}\n containerClass=\"w-[115px] py-3 pl-3 pr-4\"\n shouldShowFeatureToolTip={\n !!(showCompareOnboardingToolTip && isOnboardingVarB && isCompareToolTipOpen)\n }\n />\n <FeatureToolTip\n absolutePosition=\"[@media(max-width:422px)]:-right-24 [@media(min-width:423px)]:-right-48 [@media(min-width:588px)]:-right-2 [@media(min-width:768px)]:-right-44 [@media(min-width:876px)]:-right-2 [@media(min-width:1200px)]:left-0 -top-36\"\n tailPosition=\"[@media(max-width:422px)]:left-1/3 [@media(min-width:423px & max-width:587px)]:left-28 [@media(min-width:588px)]:left-48 [@media(min-width:768px)]:left-6 [@media(min-width:876px)]:left-48 [@media(min-width:1124px)]:left-2 [@media(min-width:1201px)]:-translate-x-44\"\n title={t('compareAndBook')}\n message={t('compareKeyFeatures')}\n onDismiss={handleToolTipClose}\n cta={{ label: t('ok'), onClick: handleToolTipClose }}\n containerClass=\"w-[343px] p-3\"\n shouldShowFeatureToolTip={\n !!(showCompareOnboardingToolTip && isOnboardingVarC && isCompareToolTipOpen)\n }\n />\n <div className=\"flex\">\n <label className=\"flex cursor-pointer items-center font-bold\">\n <div className=\"relative mr-1 inline-flex\">\n <input\n className=\"peer sr-only\"\n type=\"checkbox\"\n onChange={handleInputChange}\n ref={toggleRef}\n checked={compareHotelsToggle}\n />\n <div className=\"peer h-6 w-12 rounded-full bg-[#CFCFCF] ring-offset-1 after:absolute after:top-[2px] after:size-5 after:rounded-full after:border after:border-bg-disabled after:bg-bg after:transition-all after:content-[''] peer-checked:bg-hilton peer-checked:after:border-bg peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-hilton motion-reduce:transition-none ltr:after:left-[4px] peer-checked:ltr:after:translate-x-full rtl:after:right-[4px] peer-checked:rtl:after:-translate-x-full\" />\n </div>\n <span className=\"text-sm first-letter:capitalize rtl:pr-2\">{t('compareHotels')}</span>\n </label>\n </div>\n </div>\n ) : null;\n};\n"],"names":["LoginModal","onClose","onLogin","showLoginModal","title","login","useAuth","router","useWrappedRouter","shouldUsePoints","selectedCurrency","sortType","useAppState","activeFiltersState","useFilterState","lang","locale","options","showCreatePassword","forgetInfoLink","url","env","forgetInfoUrl","PARTNER_FORGET_INFO_LINK","replace","secureInfoLink","GLOBAL_PRIVACY_URL","signInLink","generateSigninUrl","asPath","onSignInAttempt","useCallback","resp","persistSessionState","data","handleLogin","error","Dialog","isOpen","onDismiss","size","LoginIFrame","data-testid","frameSrc","onLoginAttempt","DisplayPoints","t","useTranslation","isAuthenticated","setShowLoginModal","useState","isLoaded","isMVTVariant","b","isMVT","useGetMVTSelections","agentId","DISPLAY_NUM_OF_AVAILABLE_POINTS","isProvisional","buttonLabel","PointsMessage","div","className","Trans","ns","i18nKey","components","SignInLink","button","onClick","handleSignInButtonClick","sendReward","GOALS","pointsLoginClick","type","aria-label","aria-live","params","URLSearchParams","window","location","search","set","pathname","query","toString","undefined","shallow","catch","logError","UsePoints","isInvalidOrUnavailableOffer","onChange","dispatch","useAppDispatch","metrics","useMetrics","isClient","useIsClient","a11yText","setA11yText","currenciesMap","useCurrencyConversion","selecteCurrencyDesc","get","description","isDisabled","isPointsDisabled","isChecked","shouldUsePointsChecked","infoPopupMessage","useGetUsePoints","isReady","label","span","cx","input","checked","disabled","handleUsePointsChange","a11yMessage","currencyName","payload","trackUsePointsChecked","setTimeout","InfoPopup","testId","Dropdown","handleChange","value","isMobile","isBrowser","innerWidth","getBreakpoint","htmlFor","select","id","name","evt","role","style","margin","map","option","isVisible","testIdLabel","SortByDropDown","filteredHotelCount","sortByOptions","sortOptions","useGetSortByOptions","filteredHotelsCount","handleUsePointsOnSortChange","isSortByPoints","sortBy","isSortByPrice","length","event","target","sortEngagement","propertySearchSort","ZoomInForPricing","MapContext","createContext","apiKey","clusterer","infoWindow","infoWindowContainer","setClusterer","setInfoWindow","setInfoWindowContainer","setMap","useMap","context","useContext","children","MapInfoWindow","onCloseClick","position","useEffect","setPosition","addListener","google","maps","clearListeners","createPortal","MAP_MARKER_COLOR","POINTS_EXPLORER","active","inactive","DEFAULT","isActive","MapMarker","icon","MapStaticMarker","shouldShowCenterMarker","centerMarker","useRef","current","Marker","JSON","stringify","MARKER_Z_INDEX","getPriceMarkerPath","width","tailWidth","getPriceMarker","color","defaultColor","estimatedAverageCharacterWidth","path","scale","fillColor","fillOpacity","strokeColor","strokeWeight","labelOrigin","Point","clusterOptions","MapMarkers","activeMarker","iconClusterPath","markers","Map","staticMarker","setStaticMarker","markersToDisplay","React","child","_children","propsWithoutChildren","props","filter","Boolean","getMarker","addMarker","m","marker","scaledSize","Size","text","fontWeight","fontFamily","optimized","visible","zIndex","clickable","markerOptions","originalZindex","getZIndex","setZIndex","onMouseOver","onMouseOut","removeMarker","delete","mapMarker","open","anchor","shouldFocus","close","shouldHaveCluster","MarkerClusterer","averageCenter","minimumClusterSize","maxZoom","ignoreHidden","styles","textSize","textColor","height","anchorText","forEach","setIcon","getLabel","setLabel","markersToAdd","addMarkers","toRemove","_marker","find","_id","removeMarkers","InfoWindow","address","brandCode","containerClassName","ctyhocn","directionsLink","hotelBadges","useMediaQuery","Image","alt","src","linkCopy","Link","isNewWindow","SearchMapMarkers","centerCoordinate","matchId","sortedHotels","visibleHotels","slice","MAX_PRICE_PROPERTY_LIMIT","hotel","safeQueryParams","queryParameters","hasSpecialRatesDeepLinked","useMemo","isSpecialRatesDeeplinked","hashedData","hashedMPAData","isLoading","isMPADataLoading","useShopMultiPropAvail","ctyhocns","enabled","activeProperty","selectedCtyhocn","pageType","hasSpecialRate","currenciesError","isPointsExplorer","renoChipConfig","useRenovationChip","handleMapMarkerClicked","setBrandDetail","view","index","showPointsInMarker","propertySearch","includes","prefixPublicAssetUriWithAppPrefix","localization","leadRate","amenityIds","display","badges","summary","lowest","ratePlan","attributes","push","lat","coordinate","latitude","lng","longitude","hasConfidentialRate","confidentialRates","currentHotel","isNotBookable","status","datesFlex","displayPriceInMarker","totalRate","totalRateFmt","getCMAPrice","cmaTotalPriceIndicator","rateAmount","rateAmountFmt","amountAfterTax","amountAfterTaxFmt","lengthOfStay","getLengthOfStay","departureDate","markerPrice","isLocalCurrencySameAsHotelCurrency","currencyCode","formatAndConvertPrice","basePrice","currencyQueryError","fromCurrency","language","toCurrency","markerPointsOrPrice","hhonors","dailyRmPointsRateFmt","pointsRangeLabel","min","dailyRmPointsRateRoundFmt","max","markerLabel","displayPointsInMarker","suppressBrandLogo","isAffiliateHotel","addressLine1","city","HotelBadges","MapBase","initialBounds","onBoundsChange","onPan","onZoom","showInitialBounds","showQuadNodeBounds","mapRef","infoWindowRef","hasDrawnInitialBoundingBox","hasDrawnInitialQuadNodes","useRouter","resetMap","isMapInitialized","quadNodesData","useHotelQuadrantsQuery","listeners","initMap","clickableIcons","disableDefaultUI","zoomControl","zoomControlOptions","getLanguageDirection","ControlPosition","LEFT_TOP","RIGHT_TOP","restriction","latLngBounds","north","south","west","east","strictBounds","MAX_ZOOM","bounds","getBounds","toJSON","handleTilesLoaded","newInfoWindow","content","disableAutoPan","script","document","createElement","MAPS_URL","defer","async","onload","body","appendChild","listener","remove","setZoom","fitBounds","events","on","Rectangle","hotelQuadrants","Math","node","southwest","northeast","ref","MapProvider","Provider","handleBoundsChange","hasUserPanned","hasUserZoomed","MAP_API_KEY","showBbox","isDebugQuadTrees","LocationsMapMarkers","hotelsInBounds","disableMarkerPrice","hotelCtyhocn","hotelBrandCode","price","points","lead","dailyRmPointsRateNumFmt","getMapMarkerIcon","getMarkerPrice","MapBlock","showSpinner","visibleFilteredInBoundHotels","filterChange","saleFilterCount","showSaleFilter","isFindingHotels","h1SearchResultsContent","hotelCounterRef","pageHeading1Title","amenities","counterMessage","isListVisible","isSlimView","isDesktopMapView","useMapListToggle","isSearchPage","taggedConfig","useConfigRule","shouldShowMap","config","isConductricsLoaded","useConductricsSelection","HotelSearchResultSummaryPanel","customCounterMessage","customCounterSRMessage","hotelCount","onFilterChange","saleFilter","showingHotelDivRef","MapListToggleButton","showMapListToggleButton","Spinner","useVerticalSpaceMVT","isVerticalSpaceMVTLoaded","isVerticalSpaceVar1","c","isVerticalSpaceVar2","d","isVerticalSpaceVar3","e","isVerticalSpaceVar4","f","isVerticalSpaceVar5","g","isVerticalSpaceVar6","h","isVerticalSpaceVar7","i","isVerticalSpaceVar8","VERTICAL_SPACE_SAVINGS","MVTVariants","filterAndSortLabel","isFilterAndSortInAccordion","isShorterSuggestedFilters","isCurrencyAndSortInAllFiltersModal","isSuggestedFiltersInHorizontalScroll","guestInfo","pointsAvailable","focus","tabIndex","numPoints","aria-hidden","HotelCounter","count","currentPageIndex","customMessage","customSRMessage","pageStart","MAX_PROPERTIES_PER_LIST_VIEW_PAGE","pageEnd","message","srMessage","srCounter","setSrCounter","interval","setInterval","clearInterval","h2","aria-atomic","LogInBanner","closeLoginModal","reload","shopHonorsLogin","InfoMessageBanner","bannerClassName","iconClassName","iconName","openLoginModal","shopLoginClick","getTitleExpandedAbbreviation","substring","indexOf","lastIndexOf","_","abbreviation","expandedName","encodeURI","LocationsPageHeadingLevel1","titleAbbreviationExpanded","h1","Markdown","decodeURI","href","textDecoration","key","sanitizeTitleMarkdown","configShowMap","paginationIndex","handleSMBSwitch","isSMBContextSwitchingEnabled","useSmbToggle","smbChecked","smbRate","SMBProfileSwitcher","onInputChange","isSmbChecked","SuggestedFilterButtons","onFilterCriteriaChange","FeatureToolTip","absolutePosition","cta","containerClass","shouldShowFeatureToolTip","tailPosition","handleKeyDown","addEventListener","removeEventListener","ControlClose","MOBILE_COMPARE_LIMIT","parking","hasFreeParking","hasValetParking","valetParkingCharge","chargeAmountFmt","hasSelfParking","selfParkingCharge","rooms","types","Set","room","suite","add","features","some","feature","numBeds","roomTypes","sort","a","localeCompare","isDesktop","compareCtyhocnsCount","image","ratios","imgUrl","getAspectRatioUrl","altText","noPhoto","getNoPhotoAvailable","variants","useGetCompareHotelsInfo","displayHotelCount","isEnabled","hasConnectingRooms","isDateFlex","isDateSearch","isDreams","numOfChildren","reduce","previous","hotelsQueryArr","queryKey","HotelDocument","placeholderData","keepPreviousData","retry","staleTime","results","useQueries","queries","hotelData","priceInfoCollection","isMPALoading","mpaConstraints","hotelInfo","isRenoHotel","currentHotelPriceInfo","isIndividualRoomsOnly","isIndividualRoomLimitExceeded","statusCode","hotelRateInfo","getMPAHotelRate","usePoints","priceInfo","getHotelLeadRateInfo","isNewHotel","isSaleHotel","distanceFmt","distance","getDistanceFromCenterFmt","images","tripAdvisorLocationSummary","hotelAmenities","parkingType","getParkingType","getRoomTypes","masterImage","getCompareImage","carousel","ctaHref","ctaLabel","messages","amenity","isFetching","result","CompareSkeleton","numHotels","Array","from","fill","CompareModal","hotelsToCompare","onStopCompare","isTablet","showRemoveCTA","modalSize","getModalSize","onRemoveHotel","ctyhocnToRemove","newCtyhocnList","TABLET_COMPARE_LIMIT","handleOnDismiss","isStopCompare","preventDefault","stopPropagation","bottomContent","stopComparingButton","handleStopComparing","dialogClassName","stickyHeader","table","tr","td","unoptimized","th","scope","TripAdvisorRating","showReviewCount","isCompare","numReviews","RateInfoMessages","rateMessages","Icon","ul","li","p","showNewWindowIcon","onCompare","showCompareModal","setShowCompareModal","compareHotelsToggle","showCompareBar","closeCompareModal","data-testId","compareHotelsSelected","compareLimit","DESKTOP_COMPARE_LIMIT","handleCompareHotels","compareHotelsCTAClick","Pagination","controls","loop","onPreviousClick","onNextClick","hideLabel","total","groupId","pageNumbers","apply","prevDisabled","nextDisabled","paginationLabel","ControlBack","aria-controls","onBlur","parseInt","currentTarget","ControlNext","filterStateCountryBrandHashedHotels","hashedHotelSummaryOptionsHotelData","Object","keys","country","state","obj","countriesInRegion","generateHotelSummaryOptionsQueryArray","quadNodes","guestLocationCountry","arr","HotelSummaryOptionsDocument","quadrantId","getBoundNodes","validNodes","isOverlappingBounds","bounds1","bounds2","validNode","isMatchFilter","brandCodeMatch","stateOrCountryMatch","brands","brand","code","countries","nodeCountry","countryCode","stateCode","states","useQuadNodes","stateOrCountryOrRegionFilter","isGuestLocationLoading","useLocation","isQuadNodesDataLoading","toNestedBounds","queryArr","isHotelSummaryQueryEnabled","isInitialRender","fetchHotelSummaryOptions","response","fetch","ok","statusText","json","useBlob","hotelSummaryExtractUrl","useQuery","queryFn","useHotelSummaryOptions","initialHashedHotelSummaryOptionsData","matchName","blobEnabled","isRegions","countryCodes","useGetRegions","isTypeRegion","regionName","queryClient","useQueryClient","stateOrCountryFilter","isBlobEnabledWithExtractURL","blobData","isFetchingBlobNodes","isInitialRenderBlobNodes","blobStatus","isFallbackToNodes","isFetchingQuadNodes","isInitialRenderQuadNodes","isInitial","hotelDataToUse","getHashedHotelSummaryOptionsDataFromCache","filteredHotelDataToUse","filterRegionHashedHotels","listMapViewButtonIconName","listMapViewButtonLabel","mapToggleButtonArrowDirection","shouldDisplayBrandedHotels","brandName","getBrandedHotels","hotelPageCards","getInfoBannerURLWithBrandRemoved","baseUrl","canonicalSlug","altSlugs","newURL","slug","numBrandedHotels","isDisplayBrandBanner","isPageBrandFilterEnabled","isEndOfResults","brandInfo","useBrandDetails","isGlobal","isGlobalPage","infoBannerMessage","atLeastOneBrandedHotel","linkWithoutBrandSlug","isBrand","OHW_BASE_URL","isHotelBrand","hasHotels","hasAgeBased","pricing","values","ageBasedPricing","hasChildAges","childAges","age","hasTMTPRatesSelected","employeeRate","friendsAndFamilyRate","ownerVIPRate","AgeBasedModal","isAgeBasedModalOpen","setIsAgeBasedModalOpen","isAgeBased","roomInfo","adults","kids","isNumber","RoomsModal","ageRange","agesRequired","ariaLabel","occupancyLimitMessage","onSubmit","handleRoomInfoSubmit","split","offerId","pnd","specPlan","fromId","travelAgentId","requestedRatesOnly","searchUriBuilder","urlParams","dates","arrivalDate","parseISO","flexibleDates","placeId","f_amenityIds","getValidFilters","amenityFilters","f_brandCodes","brandFilters","f_price","isPriceRangeValid","priceFilter","f_tripAdvisorRatings","getTARatingValue","ratingsFilter","availableHotelsOnly","showAvailableHotels","rates","mapRatesToSearchUriBuilder","spec_plan","join","numRooms","sessionToken","specialRateTokens","displayCurrency","adjoiningRoomStay","maxPoints","relative","useFormProps","defaultValues","setFocusOnFirstListViewCard","firstHotelCardItem","ulContainerRef","querySelector","setAttribute","useGetVisibleInBoundHotels","currentPageVisibleHotels","brandedVisibleHotels","otherVisibleHotels","getOtherHotels","Carousel","carouselRef","rect","useRect","noPhotoImageUrl","HILTON_ASSETS_URI","carouselImages","CarouselSingle","CompareHotelsCheckbox","isFirstCheckbox","isSubDesktop","compareCheckboxRef","showCompareCheckBox","isOnboardingMVTLoaded","isOnboardingVarC","COMPARE_ONBOARDING","isOnboarded","setIsOnboarded","useLocalStorage","handleToolTipClose","isCompareCBChecked","isCompareCBDisabled","handleCompareHotelChange","selectedHotels","compareHotelsCheckboxSelected","KEY_AMENITIES","freeParking","freeBreakfast","indoorPool","outdoorPool","KeyHotelAmenities","keyAmenities","amenityId","AmenityIcons","preventNavigation","preventFocus","blur","HotelNameHeader","onFocus","h3","HotelCard","isTALoadingState","onDetailsClick","showImages","isListViewOnly","isFirstAvailableProperty","smMedViewPort","ctaMessage","customParams","hotelUrl","isHotelDataLoading","rateInfo","disclaimerMessages","transactionPropertyData","useGetHotelInfo","additionalParams","isHotelCard","hotelName","classname","rateNameClassName","propertyNameClassName","hotelCardContentClassName","wrapperHotelCardHeaderAndCardContentClassName","hotelCardImage","distanceClassName","hidden","amexDisclaimer","disclaimer","heading","recentlyViewed","setRecentlyViewed","showRecentlyViewedChip","useRecentlyViewed","setHighlightedMapCtyhocn","srLocation","getHotelLocationName","stateName","countryName","onMouseEnter","onMouseLeave","isLoadingState","RateNameCTA","customRateInfo","onRateNameCTAClick","handleOnRateNameCTAClick","setPriceClicked","showCompare","HotelCardCTASkeleton","HotelCardSkeleton","HotelCards","forwardRef","hotels","cardsClassName","initHotelCount","rest","forwardedRef","enablePOIAndAirportTest","setEnablePOIAndAirporTest","useGetPOIAirportInfoMVT","enableTest","handleDetailsClick","skeletonCardCount","DEFAULT_HOTEL_CARD_SKELETON_COUNT","cnt","keyString","firstAvailableProperty","findIndex","SoldOutInfoMessageBanner","hotelPlaceId","toUpperCase","queryParam","displayName","ListViewLoadingShimmer","cardCount","ListView","isHSODataLoading","onPageChanged","showHotelImages","listRef","showListViewHotelImagesToggle","totalPages","ceil","showAmountAfterTax","useTrackSearchPricing","handlePagination","newPageIndex","trackPaginationClick","paginationNumber","actionType","setPaginationData","propertyResultList","propertyResults","brandedHotels","lastPageIndex","showHotelCardImage","noHotelsFoundBannerMessage","ListViewBrandBanner","shouldDisplayBrandBannerInCurrentPage","atLeastOneHotelNotBranded","displayAtEndOfBrandPageResults","CurrencyConverter","currency","currencyEngagement","converted","convert","trackCurrencyConverterClick","OSCCurrencyConverter","showDefaultOption","hasStackedDisplay","selectProps","BREAK_POINTS","freeze","small","medium","large","extraLarge","twoExtraLarge","twoXimgUrl","threeXImgUrl","srcUrl","cw","has","ch","aspectRatioVariants","entries","accum","breakPointName","breakPointWidth","round","shouldCenterInfoIcon","variant","findAmenity","wantedAmenityId","calculateSuggestedFilterCounts","filtersList","suggestedFilter","inBoundsHotel","isAtleastOneSuggestedFilter","suggestedFilterCounts","calculateTopSuggestedFilters","maxSuggestedFilters","topSuggestedFilters","topFilter","smallestCountKey","filterA","filterB","aCount","bCount","smallestCount","topSuggestedFilter","getSuggestedFiltersQuant","hasSalesFilter","MAX_SUGGESTED_AMENITY_FILTERS_WITH_SALE_FILTER","NUM_AMENITIES_SUGGESTIONS_WANTED","HIGHEST_CONVERTING_AMENITIES","CONGFIGURED_SUGGESTED_FILTERS","useSuggestedFilters","isConducticsLoaded","isHighestConvertingAmenitiesVariant","HIGHEST_AMENITIES_SUGGESTED_FILTERS","isHighestConvertingAmenitiesTest","defaultConfig","configFromRule","useFeatureToggleConfig","suggestedSaleFilter","sale","HotelAttributeIds","suggestedFilters","suggestedFiltersOrderedList","showSuggestedFilters","SuggestedFiltersShimmer","shouldShowTitle","SuggestedFiltersTitle","SuggestedFiltersAmenities","suggestedFilterOrderedList","TaxonomyList","labelledBy","listItemClassname","getTaxonomyListClassName","amenityListCount","amenitySelected","attributeFilters","SuggestedFilterButton","isAmenitySelected","selectedAmenity","setSelectedAmenity","resetSuggestedFilter","attributeIndex","amenityIndex","splice","updatedActiveFiltersState","handleOnClick","suggestedFiltersA11YText","suggestedFilterEngagement","trackSuggestedFilters","CompareHotelsToggle","toggleRef","isOnboardingVarB","isCompareToolTipOpen","setIsCompareToolTipOpen","showCompareOnboardingToolTip","handleInputChange","compareHotelsToggleOn"],"sourceRoot":"","ignoreList":[]}