{"version":3,"mappings":"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","names":["Icon","isOpen","React","ListingSelect","placeholder","options","selectedLocations","onChange","showMenu","setShowMenu","useState","inputRef","useRef","dropdownMenuRef","selected","setSelected","useEffect","handler","e","handleInputClick","getDisplay","handleCheckboxChange","optionId","prevSelected","id","option","ListingFilters","filterLabel","filterLabelMobile","filters","handlerSelectedLocation","ids","isMobile","currentSelectionSet","filter","index","target","ListingCards","__vitePreload","OffersListing","endpoint","itemsPerPageDesktop","itemsPerPageMobile","cardVariant","viewDetailsLabel","bookingLabel","allFilterLabel","propertyFilterId","showDescription","preSelected","callToBookLabel","FilterAllId","sarchQueryName","page","setPage","items","setItems","setSelectedLocations","itemsPerPage","setItemsPerPage","setFilters","firstLoad","setFirstLoad","cardVariantLower","observer","updateItemsPerPage","breakpoint","subscribeToBreakpointChange","eventBus","initialBreakpoint","fetchCards","queryParams","data","filterAll","_a","error","fetchNextPage","isFetching","hasNextPage","isLoading","useSuspenseInfiniteQuery","pageParam","res","totalItems","totalPages","lastElementRef","useCallback","node","entries","locations","newLocationsSet","currentLocationsSet","location","updateQueryString","scrollToSection","el","queryString","url","searchQuery","Suspense"],"ignoreList":[],"sources":["../../../../src/scripts/modules/react/listings/listing-select.tsx","../../../../src/scripts/modules/react/listings/listing-filters.tsx","../../../../src/scripts/modules/react/listings/index.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Options } from '.';\n\ninterface OwnProps {\n placeholder: string;\n options: Options[];\n selectedLocations: string[];\n onChange: (value: string[], isMobile: boolean) => void;\n}\n\n// Icon component\nconst Icon = ({ isOpen }: { isOpen: boolean }) => {\n return (\n \n \n \n );\n};\n\n// ListingSelect component\nconst ListingSelect = ({ placeholder, options, selectedLocations, onChange }: OwnProps) => {\n const [showMenu, setShowMenu] = useState(false);\n const inputRef = useRef(null);\n const dropdownMenuRef = useRef(null); // Ref for the dropdown menu\n const [selected, setSelected] = useState(\n selectedLocations.includes('all') ? [] : selectedLocations\n );\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (\n inputRef.current &&\n !inputRef.current.contains(e.target as Node) &&\n dropdownMenuRef.current &&\n !dropdownMenuRef.current.contains(e.target as Node)\n ) {\n setShowMenu(false);\n }\n };\n\n window.addEventListener('click', handler);\n return () => window.removeEventListener('click', handler);\n }, []);\n\n const handleInputClick = (e: React.MouseEvent) => {\n if (inputRef.current && inputRef.current.contains(e.target as Node)) {\n setShowMenu(!showMenu);\n }\n };\n\n const getDisplay = () => {\n if (selected.length === 0) {\n return placeholder;\n }\n\n if (selected.includes('all')) {\n return `Categories selected (${selected.length - 1})`;\n }\n\n return `Categories selected (${selected.length})`;\n };\n\n const handleCheckboxChange = (optionId: string) => {\n // if (selected.includes('all')) {\n // // we remove the all from the selected array, and just add the selected option plus the rest of the selected options\n\n // setSelected([optionId, ...selected.filter(id => id !== 'all')]);\n // }\n\n setSelected(prevSelected => {\n if (prevSelected.includes(optionId)) {\n return prevSelected.filter(id => id !== optionId);\n }\n\n return [...prevSelected, optionId];\n });\n };\n\n return (\n <>\n handleInputClick(e)}\n className={`listings-select__dropdown-input ${showMenu ? 'open' : ''}`}\n >\n \n {getDisplay()}\n \n
\n
\n \n
\n
\n \n\n {showMenu && (\n
\n {options.map(option => {\n if (option.id === 'all') {\n return null;\n }\n\n return (\n \n );\n })}\n\n {\n onChange(\n selected.length === 0 || selected.length + 1 === options.length\n ? ['all']\n : selected,\n true\n );\n setShowMenu(false);\n }}\n >\n Apply\n \n
\n )}\n \n );\n};\n\nexport default ListingSelect;\n","import React, { useEffect } from 'react';\nimport { Options } from '.';\nimport ListingSelect from './listing-select';\n\nconst ListingFilters = ({\n filterLabel,\n filterLabelMobile,\n filters,\n selectedLocations,\n handlerSelectedLocation\n}: {\n filterLabel: string;\n filterLabelMobile: string;\n filters: Options[];\n selectedLocations: string[];\n handlerSelectedLocation: (value: string[]) => void;\n}) => {\n useEffect(() => {\n if (selectedLocations.length === 0) {\n handlerSelectedLocation(['all']);\n }\n }, [selectedLocations]);\n\n const onChange = (ids: string[], isMobile?: boolean) => {\n // If 'all' is selected, reset the selection to just 'all'\n if (ids.includes('all')) {\n handlerSelectedLocation(['all']);\n return;\n }\n\n // Toggle the selection state of each id\n let currentSelectionSet = new Set();\n\n if (!isMobile) {\n currentSelectionSet = new Set(selectedLocations);\n // Remove 'all' from the current selection if it exists\n currentSelectionSet.delete('all');\n ids.forEach(id => {\n currentSelectionSet.has(id) ? currentSelectionSet.delete(id) : currentSelectionSet.add(id);\n });\n } else {\n currentSelectionSet = new Set(ids);\n }\n\n handlerSelectedLocation(Array.from(currentSelectionSet));\n };\n\n return (\n
\n \n
\n \n
\n\n
    \n {filters &&\n filters.map((filter, index) => (\n
  • \n {\n const target = e.target as HTMLButtonElement;\n onChange([target.value.toLowerCase()]);\n }}\n type=\"button\"\n >\n {filter.value}\n \n
  • \n ))}\n
\n
\n );\n};\n\nexport default ListingFilters;\n","import React, { Suspense, useCallback, useEffect, useRef, useState } from 'react';\nimport { CardItem } from '../../../components/react/Cards/types';\nimport { eventBus } from '../../../helpers/resize';\nimport { useSuspenseInfiniteQuery } from '@tanstack/react-query';\nimport ListingFilters from './listing-filters';\n\ninterface Props {\n endpoint: string;\n itemsPerPageDesktop: string;\n itemsPerPageMobile: string;\n cardVariant: string;\n filterLabel: string;\n filterLabelMobile: string;\n viewDetailsLabel: string;\n bookingLabel: string;\n allFilterLabel: string;\n preSelected?: string;\n propertyFilterId?: string;\n showDescription?: string;\n callToBookLabel?: string;\n}\n\nexport interface EndpointResponse {\n data: {\n cards: [];\n filters?: Options[];\n pagination?: {\n totalItems: number;\n };\n };\n}\n\nexport interface Options {\n id: string;\n value: string;\n}\n\nconst ListingCards = React.lazy(() => import('./listing-cards'));\n\nconst OffersListing = ({\n endpoint,\n itemsPerPageDesktop,\n itemsPerPageMobile,\n cardVariant,\n filterLabel,\n filterLabelMobile,\n viewDetailsLabel,\n bookingLabel,\n allFilterLabel,\n propertyFilterId,\n showDescription,\n preSelected,\n callToBookLabel\n}: Props) => {\n const FilterAllId = 'all';\n const sarchQueryName = 'listing-location';\n\n const [page, setPage] = useState(1);\n const [items, setItems] = useState([]);\n const [selectedLocations, setSelectedLocations] = useState(\n preSelected ? [preSelected] : [FilterAllId]\n );\n const [itemsPerPage, setItemsPerPage] = useState(0);\n const [filters, setFilters] = useState(null);\n const [firstLoad, setFirstLoad] = useState(true);\n const cardVariantLower = cardVariant?.toLowerCase();\n const observer = useRef();\n\n const updateItemsPerPage = (breakpoint: string) => {\n if (breakpoint === 'mobile') {\n return setItemsPerPage(parseInt(itemsPerPageMobile));\n }\n\n return setItemsPerPage(parseInt(itemsPerPageDesktop));\n };\n\n const subscribeToBreakpointChange = () => {\n eventBus.subscribe('breakpointChange', updateItemsPerPage);\n };\n\n useEffect(() => {\n // Call the function initially\n const initialBreakpoint = window.innerWidth <= 768 ? 'mobile' : 'desktop';\n updateItemsPerPage(initialBreakpoint);\n\n // Subscribe to breakpoint changes\n subscribeToBreakpointChange();\n }, []);\n\n const fetchCards = async ({\n page,\n itemsPerPage,\n selectedLocations\n }: {\n page: number;\n itemsPerPage: number;\n selectedLocations: string[];\n }) => {\n if (page === 0 || itemsPerPage === 0) {\n return;\n }\n\n let queryParams = `?page=${page}&itemsPerPage=${itemsPerPage}`;\n\n if (selectedLocations) {\n queryParams += `&location=${selectedLocations}`;\n }\n\n if (propertyFilterId) {\n queryParams += `&propertyFilterId=${propertyFilterId}`;\n }\n\n const response = await fetch(`${endpoint}${queryParams}`);\n\n const data = (await response.json()) as EndpointResponse;\n\n const filterAll = { id: FilterAllId, value: allFilterLabel };\n data.data.filters?.unshift(filterAll);\n\n setFilters(data.data.filters ?? []);\n setItems([...items, ...data.data.cards]);\n\n return data.data;\n };\n\n const { error, fetchNextPage, isFetching, hasNextPage, isLoading } = useSuspenseInfiniteQuery({\n queryKey: ['cards', itemsPerPage, selectedLocations, page],\n queryFn: ({ pageParam }) => fetchCards({ page: pageParam, itemsPerPage, selectedLocations }),\n initialPageParam: page,\n refetchOnWindowFocus: false,\n getNextPageParam: res => {\n const totalItems = res?.pagination?.totalItems ?? 0;\n const totalPages = Math.ceil(totalItems / itemsPerPage);\n if (itemsPerPage > 0 && page < totalPages) {\n return page + 1;\n }\n return undefined;\n }\n });\n\n const lastElementRef = useCallback(\n (node: HTMLLIElement) => {\n if (isLoading) return;\n\n if (observer.current) observer.current.disconnect();\n\n observer.current = new IntersectionObserver(\n entries => {\n if (entries[0].isIntersecting && hasNextPage && !isFetching) {\n setPage(page + 1);\n fetchNextPage();\n }\n },\n { threshold: 1, rootMargin: '0px 0px 100px 0px' }\n );\n\n if (node) observer.current.observe(node);\n },\n [fetchNextPage, hasNextPage, isFetching, isLoading, page]\n );\n\n const handlerSelectedLocation = (locations: string[]) => {\n // Convert both arrays to Sets for easier comparison\n const newLocationsSet = new Set(locations);\n const currentLocationsSet = new Set(selectedLocations);\n\n // Check if the new locations are different from the current selected locations\n // by comparing the size of the sets and ensuring every element in one set is present in the other\n const isDifferent =\n newLocationsSet.size !== currentLocationsSet.size ||\n [...newLocationsSet].some(location => !currentLocationsSet.has(location));\n\n if (!isDifferent) {\n return;\n }\n\n setPage(1);\n setSelectedLocations(locations);\n updateQueryString(locations);\n setItems([]);\n };\n\n if (error) return 'An error has occurred: ' + error.message;\n\n const scrollToSection = () => {\n if (window.location.hash) {\n const el = document.querySelector(window.location.hash);\n if (el) {\n el.scrollIntoView({ behavior: 'smooth' });\n }\n }\n };\n\n const updateQueryString = (queryString: string[]) => {\n const url = new URL(window.location.href);\n url.searchParams.set(sarchQueryName, queryString.join(','));\n window.history.replaceState({}, '', url.toString());\n\n if (queryString.length === 1 && queryString[0] === FilterAllId) {\n const url = new URL(window.location.href);\n url.searchParams.delete(sarchQueryName);\n window.history.replaceState({}, '', url.toString());\n return;\n }\n };\n\n useEffect(() => {\n const searchQuery = new URLSearchParams(window.location.search).get(sarchQueryName);\n if (searchQuery) {\n setSelectedLocations(searchQuery.split(','));\n }\n }, []);\n\n useEffect(() => {\n if (firstLoad && items.length > 0) {\n setFirstLoad(false);\n\n setTimeout(() => {\n scrollToSection();\n }, 500);\n }\n }, [items, firstLoad]);\n\n return (\n \n
Loading...
\n \n }\n >\n \n\n \n \n );\n};\n\nexport default OffersListing;\n"],"file":"public/Limelight/scripts/index-DN6RB6qz.js"}