Files
web/packages/booking-flow/lib/hooks/useBookingWidgetState.ts
Bianca Widstam f726b4f7e1 Merged in feat/BOOK-377-keep-booking-widget-state (pull request #2894)
feat(BOOK-377): keep dates and rooms & guest in session storage

* feat(BOOK-377): keep dates and rooms & guest in session storage

* feat(BOOK-377): extract to hook and reuse


Approved-by: Erik Tiekstra
2025-10-06 09:33:09 +00:00

93 lines
2.3 KiB
TypeScript

import { useEffect, useState } from "react"
import { z } from "zod"
import { BOOKING_WIDGET_STATE } from "@scandic-hotels/common/constants/bookingWidget"
import { dt } from "@scandic-hotels/common/dt"
import { adultsSchema, childAgeSchema, childBedSchema } from "../utils/url"
const DEFAULT_ROOMS = [{ adults: 1, childrenInRoom: [] }]
const stateSchema = z.object({
fromDate: z.string(),
toDate: z.string(),
rooms: z.array(
z.object({
adults: adultsSchema,
childrenInRoom: z
.array(
z.object({
bed: childBedSchema,
age: childAgeSchema,
})
)
.optional(),
})
),
})
type BookingWidgetState = z.infer<typeof stateSchema>
export function useBookingWidgetState() {
const [bookingState, setBookingState] = useState<BookingWidgetState>({
fromDate: dt().format("YYYY-MM-DD"),
toDate: dt().add(1, "day").format("YYYY-MM-DD"),
rooms: DEFAULT_ROOMS,
})
useEffect(() => {
const now = dt()
const stored = getBookingWidgetState()
if (!stored) {
return
}
const storedFrom = dt(stored.fromDate)
const storedTo = dt(stored.toDate)
const isDateParamValid =
storedFrom.isValid() &&
storedTo.isValid() &&
storedFrom.isSameOrAfter(now, "day") &&
storedTo.isAfter(storedFrom)
if (isDateParamValid && stored.rooms?.length) {
setBookingState({
fromDate: storedFrom.format("YYYY-MM-DD"),
toDate: storedTo.format("YYYY-MM-DD"),
rooms: stored.rooms,
})
}
}, [])
return bookingState
}
function getBookingWidgetState(): BookingWidgetState | null {
if (typeof window === "undefined") {
return null
}
try {
const savedBookingWidgetState = sessionStorage.getItem(BOOKING_WIDGET_STATE)
if (savedBookingWidgetState) {
const stored = JSON.parse(savedBookingWidgetState)
return stateSchema.parse(stored)
}
} catch {
try {
sessionStorage.removeItem(BOOKING_WIDGET_STATE)
} catch {}
}
return null
}
export function setBookingWidgetState(state: BookingWidgetState): void {
if (typeof window === "undefined") {
return
}
try {
sessionStorage.setItem(
BOOKING_WIDGET_STATE,
JSON.stringify(stateSchema.parse(state))
)
} catch {}
}