feat (SW-2864): Move booking router to trpc package * Add env to trpc package * Add eslint to trpc package * Apply lint rules * Use direct imports from trpc package * Add lint-staged config to trpc * Move lang enum to common * Restructure trpc package folder structure * WIP first step * update internal imports in trpc * Fix most errors in scandic-web Just 100 left... * Move Props type out of trpc * Fix CategorizedFilters types * Move more schemas in hotel router * Fix deps * fix getNonContentstackUrls * Fix import error * Fix entry error handling * Fix generateMetadata metrics * Fix alertType enum * Fix duplicated types * lint:fix * Merge branch 'master' into feat/sw-2863-move-contentstack-router-to-trpc-package * Fix broken imports * Move booking router to trpc package * Merge branch 'master' into feat/sw-2864-move-hotels-router-to-trpc-package Approved-by: Linus Flood
113 lines
3.1 KiB
TypeScript
113 lines
3.1 KiB
TypeScript
"use client"
|
|
import { notFound } from "next/navigation"
|
|
import { use, useRef } from "react"
|
|
import { useIntl } from "react-intl"
|
|
|
|
import { type RoomCategories } from "@scandic-hotels/trpc/types/hotel"
|
|
|
|
import { trpc } from "@/lib/trpc/client"
|
|
import { createMyStayStore } from "@/stores/my-stay"
|
|
|
|
import { MyStaySkeleton } from "@/components/HotelReservation/MyStay/myStaySkeleton"
|
|
import { MyStayContext } from "@/contexts/MyStay"
|
|
|
|
import type { Lang } from "@scandic-hotels/common/constants/language"
|
|
import type { CreditCard } from "@scandic-hotels/trpc/types/user"
|
|
|
|
import type { Packages } from "@/types/components/myPages/myStay/ancillaries"
|
|
import type { MyStayStore } from "@/types/contexts/my-stay"
|
|
import type {
|
|
BookingConfirmation,
|
|
BookingConfirmationSchema,
|
|
} from "@/types/trpc/routers/booking/confirmation"
|
|
|
|
interface MyStayProviderProps {
|
|
bookingConfirmation: BookingConfirmation
|
|
breakfastPackages: Packages | null
|
|
lang: Lang
|
|
linkedReservationsPromise: Promise<BookingConfirmationSchema[]>
|
|
refId: string
|
|
roomCategories: RoomCategories
|
|
savedCreditCards: CreditCard[] | null
|
|
}
|
|
|
|
export default function MyStayProvider({
|
|
bookingConfirmation,
|
|
breakfastPackages,
|
|
children,
|
|
lang,
|
|
linkedReservationsPromise,
|
|
refId,
|
|
roomCategories,
|
|
savedCreditCards,
|
|
}: React.PropsWithChildren<MyStayProviderProps>) {
|
|
const storeRef = useRef<MyStayStore>(undefined)
|
|
const intl = useIntl()
|
|
|
|
const { data, error, isFetching, isFetchedAfterMount } =
|
|
trpc.booking.get.useQuery(
|
|
{
|
|
refId: bookingConfirmation.booking.refId,
|
|
lang,
|
|
},
|
|
{
|
|
initialData: bookingConfirmation,
|
|
refetchOnMount: false,
|
|
refetchOnWindowFocus: false,
|
|
}
|
|
)
|
|
|
|
// We need this two-step business since `use` must resolve
|
|
// the promise passed from the server whereas `useQuery`
|
|
// needs to own the data when in the client so that invalidations
|
|
// actually triggers a refetch of the data
|
|
const linkedReservationsResponses = use(linkedReservationsPromise)
|
|
const {
|
|
data: linkedReservations,
|
|
error: linkedReservationsError,
|
|
isFetching: linkedReservationsIsFetching,
|
|
isFetchedAfterMount: linkedReservationsIsFetchedAfterMount,
|
|
} = trpc.booking.linkedReservations.useQuery(
|
|
{
|
|
lang,
|
|
refId: bookingConfirmation.booking.refId,
|
|
},
|
|
{
|
|
initialData: linkedReservationsResponses,
|
|
refetchOnMount: false,
|
|
refetchOnWindowFocus: false,
|
|
}
|
|
)
|
|
|
|
if (isFetching || linkedReservationsIsFetching) {
|
|
return <MyStaySkeleton />
|
|
}
|
|
|
|
if (!data || error || linkedReservationsError) {
|
|
return notFound()
|
|
}
|
|
|
|
const rooms = [data.booking, ...linkedReservations]
|
|
|
|
const hasInvalidatedQueryAndRefetched =
|
|
(isFetchedAfterMount && data) ||
|
|
(linkedReservationsIsFetchedAfterMount && linkedReservations)
|
|
if (!storeRef.current || hasInvalidatedQueryAndRefetched) {
|
|
storeRef.current = createMyStayStore({
|
|
breakfastPackages,
|
|
hotel: bookingConfirmation.hotel,
|
|
intl,
|
|
refId,
|
|
roomCategories,
|
|
rooms,
|
|
savedCreditCards,
|
|
})
|
|
}
|
|
|
|
return (
|
|
<MyStayContext.Provider value={storeRef.current}>
|
|
{children}
|
|
</MyStayContext.Provider>
|
|
)
|
|
}
|