Files
web/apps/scandic-web/stores/tracking.ts
Anton Gunnarsson 03468ad824 Merged in fix/refactor-booking-flow-search-params (pull request #2148)
Fix: refactor booking flow search params

* wip: apply codemod and upgrade swc plugin

* wip: design-system to react 19, fix issues from async (search)params

* Prepare new parse function for booking flow search params

* Prepare serialize function for booking flow search params

* Improve handling of comma separated arrays

* Slightly refactor for readability

* Next abstracts URLSearchParams so handle the abstraction instead

* Refactor booking widget to use new search params parsing

* Rename search param functions

* Refactor select-hotel to use new search param parser

* Use new search params parser in select-rate and details

* Fix hotelId type

* Avoid passing down search params into BookingWidget components

* More updates to use new types instead of SearchParams<T>

* Remove types SelectHotelSearchParams and AlternativeSelectHotelSearchParams

* Fix parseBookingWidgetSearchParams return type

* Add error handling to booking search param parsers

* Fix modifyRateIndex handling in details page

* Clean up

* Refactor booking widget search param serializing to util function

* Move start page booking widget search param parsing to page

* Use new search param serializer in HandleErrorCallback

* Delete convertSearchParamsToObj & convertObjToSearchParams


Approved-by: Michael Zetterberg
2025-06-02 13:38:01 +00:00

101 lines
2.8 KiB
TypeScript

"use client"
import { create } from "zustand"
import { parseSelectRateSearchParams, searchParamsToRecord } from "@/utils/url"
import { checkIsSameBooking } from "./enter-details/helpers"
import type { ReadonlyURLSearchParams } from "next/navigation"
interface TrackingStoreState {
initialStartTime: number
setInitialPageLoadTime: (time: number) => void
getPageLoadTime: () => number
currentParams: ReadonlyURLSearchParams | null
previousParams: ReadonlyURLSearchParams | null
currentPath: string | null
previousPath: string | null
currentLang: string | null
previousLang: string | null
updateRouteInfo: (
path: string,
lang: string,
params: ReadonlyURLSearchParams
) => void
hasPathOrLangChanged: () => boolean
hasBookingFlowParamsChanged: () => boolean
}
const useTrackingStore = create<TrackingStoreState>((set, get) => ({
initialStartTime: Date.now(),
setInitialPageLoadTime: (time) => set({ initialStartTime: time }),
getPageLoadTime: () => {
const { initialStartTime } = get()
return (Date.now() - initialStartTime) / 1000
},
currentParams: null,
previousParams: null,
currentPath: null,
previousPath: null,
currentLang: null,
previousLang: null,
updateRouteInfo: (path, lang, params) =>
set((state) => {
if (!path || !lang) return state
if (!state.currentPath || !state.currentLang) {
return {
currentParams: params,
currentPath: path,
currentLang: lang,
previousParams: null,
previousPath: null,
previousLang: null,
}
}
return {
previousParams: state.currentParams,
previousPath: state.currentPath,
previousLang: state.currentLang,
currentParams: params,
currentPath: path,
currentLang: lang,
}
}),
hasPathOrLangChanged: () => {
const { currentPath, previousPath, currentLang, previousLang } = get()
if (!previousPath || !previousLang) return false
return currentPath !== previousPath || currentLang !== previousLang
},
hasBookingFlowParamsChanged: () => {
const { currentPath, currentParams, previousParams } = get()
if (!previousParams || !currentParams) return false
if (!currentPath?.match(/^\/(da|de|en|fi|no|sv)\/(hotelreservation)/))
return false
const previousParamsObject = parseSelectRateSearchParams(
searchParamsToRecord(previousParams)
)
const currentParamsObject = parseSelectRateSearchParams(
searchParamsToRecord(currentParams)
)
if (!previousParamsObject && !currentParamsObject) return false
if (!previousParamsObject || !currentParamsObject) return true
const isSameBooking = checkIsSameBooking(
previousParamsObject,
currentParamsObject
)
return !isSameBooking
},
}))
export default useTrackingStore