Merged in feat/SW-1452-city-page-filter-2 (pull request #1392)
feat(SW-1452): Added filtering and sorting to destination city pages * feat(SW-1452): Added filtering and sorting to destination city pages * feat(SW-1452): Added temporary component for country pages to avoid Context issues Approved-by: Matilda Landström
This commit is contained in:
65
providers/HotelDataProvider.tsx
Normal file
65
providers/HotelDataProvider.tsx
Normal file
@@ -0,0 +1,65 @@
|
||||
"use client"
|
||||
import { usePathname, useRouter, useSearchParams } from "next/navigation"
|
||||
import { useRef } from "react"
|
||||
|
||||
import { createHotelDataStore } from "@/stores/hotel-data"
|
||||
import { DEFAULT_SORT } from "@/stores/hotel-data/helper"
|
||||
|
||||
import { HotelDataContext } from "@/contexts/HotelData"
|
||||
|
||||
import type { HotelDataStore } from "@/types/contexts/hotel-data"
|
||||
import type { HotelDataProviderProps } from "@/types/providers/hotel-data"
|
||||
import type { SubmitCallbackData } from "@/types/stores/hotel-data"
|
||||
|
||||
export default function HotelDataProvider({
|
||||
allHotels,
|
||||
filterFromUrl,
|
||||
sortItems,
|
||||
children,
|
||||
}: HotelDataProviderProps) {
|
||||
const storeRef = useRef<HotelDataStore>()
|
||||
const searchParams = useSearchParams()
|
||||
const pathname = usePathname()
|
||||
const router = useRouter()
|
||||
|
||||
function submitCallbackFn({ sort, filters, basePath }: SubmitCallbackData) {
|
||||
const parsedUrl = new URL(window.location.href)
|
||||
const searchParams = parsedUrl.searchParams
|
||||
if (sort === DEFAULT_SORT && searchParams.has("sort")) {
|
||||
searchParams.delete("sort")
|
||||
} else if (sort !== DEFAULT_SORT) {
|
||||
searchParams.set("sort", sort)
|
||||
}
|
||||
|
||||
const [firstFilter, ...remainingFilters] = filters
|
||||
|
||||
parsedUrl.pathname = basePath
|
||||
if (firstFilter) {
|
||||
parsedUrl.pathname += `/${firstFilter}`
|
||||
}
|
||||
if (remainingFilters.length > 0) {
|
||||
parsedUrl.hash = `#${remainingFilters.join("&")}`
|
||||
} else {
|
||||
parsedUrl.hash = ""
|
||||
}
|
||||
|
||||
router.push(parsedUrl.toString(), { scroll: false })
|
||||
}
|
||||
|
||||
if (!storeRef.current) {
|
||||
storeRef.current = createHotelDataStore({
|
||||
allHotels,
|
||||
pathname,
|
||||
searchParams,
|
||||
filterFromUrl,
|
||||
sortItems,
|
||||
submitCallbackFn,
|
||||
})
|
||||
}
|
||||
|
||||
return (
|
||||
<HotelDataContext.Provider value={storeRef.current}>
|
||||
{children}
|
||||
</HotelDataContext.Provider>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user