chore (SW-834): Upgrade to Next 15 * wip: apply codemod and upgrade swc plugin * wip: design-system to react 19, fix issues from async (search)params * wip: fix remaining issues from codemod serverClient is now async because context use headers() getLang is now async because it uses headers() * Minor cleanup * Inline react-material-symbols package Package is seemingly not maintained any more and doesn't support React 19. This copies the package source into `design-system`, makes the necessary changes for 19 and export it for others to use. * Fix missing awaits * Disable modal exit animations Enabling modal exit animations via isExiting prop is causing modals to be rendered in "hidden" state and never unmount. Seems to be an issue with react-aria-components, see https://github.com/adobe/react-spectrum/issues/7563. Can probably be fixed by rewriting to a solution similar to https://react-spectrum.adobe.com/react-aria/examples/framer-modal-sheet.html * Remove unstable cache implementation and use in memory cache locally * Fix ref type in SelectFilter * Use cloneElement to add key prop to element Approved-by: Linus Flood
111 lines
3.1 KiB
TypeScript
111 lines
3.1 KiB
TypeScript
"use client"
|
|
import { notFound } from "next/navigation"
|
|
import { use, useRef } from "react"
|
|
import { useIntl } from "react-intl"
|
|
|
|
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 { Packages } from "@/types/components/myPages/myStay/ancillaries"
|
|
import type { MyStayStore } from "@/types/contexts/my-stay"
|
|
import type { RoomCategories } from "@/types/hotel"
|
|
import type {
|
|
BookingConfirmation,
|
|
BookingConfirmationSchema,
|
|
} from "@/types/trpc/routers/booking/confirmation"
|
|
import type { CreditCard } from "@/types/user"
|
|
import type { Lang } from "@/constants/languages"
|
|
|
|
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>
|
|
)
|
|
}
|