diff --git a/apps/partner-sas/app/[lang]/hotelreservation/(standard)/select-rate/page.tsx b/apps/partner-sas/app/[lang]/hotelreservation/(standard)/select-rate/page.tsx index 63cdea728..8ca937805 100644 --- a/apps/partner-sas/app/[lang]/hotelreservation/(standard)/select-rate/page.tsx +++ b/apps/partner-sas/app/[lang]/hotelreservation/(standard)/select-rate/page.tsx @@ -1,4 +1,24 @@ -export default async function SelectRatePage() { - // eslint-disable-next-line formatjs/no-literal-string-in-jsx - return
select-rate
+import { SelectRatePage as SelectRatePagePrimitive } from "@scandic-hotels/booking-flow/pages/SelectRatePage" + +import TrackingSDK from "@/components/TrackingSDK" +import { getLang } from "@/i18n/serverContext" + +import { type LangParams, type PageArgs } from "@/types/params" + +export default async function SelectRatePage(props: PageArgs) { + const searchParams = await props.searchParams + const lang = await getLang() + + return ( + ( + + )} + /> + ) } diff --git a/apps/partner-sas/app/[lang]/layout.tsx b/apps/partner-sas/app/[lang]/layout.tsx index 0b86d0070..af717b698 100644 --- a/apps/partner-sas/app/[lang]/layout.tsx +++ b/apps/partner-sas/app/[lang]/layout.tsx @@ -6,6 +6,7 @@ import "../../globals.css" import { BookingFlowContextProvider } from "@scandic-hotels/booking-flow/BookingFlowContextProvider" import { BookingFlowTrackingProvider } from "@scandic-hotels/booking-flow/BookingFlowTrackingProvider" +import { NuqsAdapter } from "@scandic-hotels/booking-flow/utils/nuqs" import { Lang } from "@scandic-hotels/common/constants/language" import { TrpcProvider } from "@scandic-hotels/trpc/Provider" @@ -62,40 +63,42 @@ export default async function RootLayout(props: RootLayoutProps) { locale={lang} messages={messages} > - {/* TODO handle onError */} - - - + {/* TODO handle onError */} + + -
- {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} -

SAS

-
- {props.bookingwidget} -
{children}
-
-
-
+
+ {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} +

SAS

+
+ {props.bookingwidget} +
{children}
+ + + + diff --git a/apps/scandic-web/__mocks__/hotelReservation/index.ts b/apps/scandic-web/__mocks__/hotelReservation/index.ts index cb42e6fc5..cb02fd07e 100644 --- a/apps/scandic-web/__mocks__/hotelReservation/index.ts +++ b/apps/scandic-web/__mocks__/hotelReservation/index.ts @@ -1,7 +1,7 @@ // import { BedTypeEnum } from "@/constants/booking" // import { ChildBedMapEnum } from "@/types/components/bookingWidget/enums" -// import type { BreakfastPackage } from "@/types/components/hotelReservation/breakfast" +// import type { BreakfastPackage } from "@scandic-hotels/trpc/routers/hotels/schemas/packages" // import type { BedTypeSelection } from "@/types/components/hotelReservation/enterDetails/bedType" // import type { // DetailsSchema, diff --git a/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/loading.tsx b/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/loading.tsx index 34397b975..212163f82 100644 --- a/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/loading.tsx +++ b/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/loading.tsx @@ -1,12 +1,5 @@ -import { HotelInfoCardSkeleton } from "@scandic-hotels/design-system/HotelInfoCard" - -import { RoomsContainerSkeleton } from "@/components/HotelReservation/SelectRate/RoomsContainer/RoomsContainerSkeleton" +import { SelectRateSkeleton } from "@scandic-hotels/booking-flow/components/SelectRate" export default function LoadingSelectRate() { - return ( - <> - - - - ) + return } diff --git a/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx b/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx index 5769c8b86..1d4bec75f 100644 --- a/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx +++ b/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx @@ -1,68 +1,30 @@ -import { notFound } from "next/navigation" +import { SelectRatePage as SelectRatePagePrimitive } from "@scandic-hotels/booking-flow/pages/SelectRatePage" -import { SelectRateProvider } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" -import { parseSelectRateSearchParams } from "@scandic-hotels/booking-flow/utils/url" -import { logger } from "@scandic-hotels/common/logger" -import { SEARCH_TYPE_REDEMPTION } from "@scandic-hotels/trpc/constants/booking" +import TrackingSDK from "@/components/TrackingSDK" +import { getLang } from "@/i18n/serverContext" -import { combineRegExps, rateTypeRegex } from "@/constants/booking" -import { getHotel } from "@/lib/trpc/memoizedRequests" - -import SelectRate from "@/components/HotelReservation/SelectRate" - -import type { LangParams, NextSearchParams, PageArgs } from "@/types/params" - -const singleRoomRateTypes = combineRegExps( - [rateTypeRegex.ARB, rateTypeRegex.VOUCHER], - "i" -) +import { + type LangParams, + type NextSearchParams, + type PageArgs, +} from "@/types/params" export default async function SelectRatePage( - props: PageArgs + props: PageArgs ) { - const params = await props.params const searchParams = await props.searchParams - const booking = parseSelectRateSearchParams(searchParams) - - if (!booking) { - logger.debug("Invalid search params", searchParams) - notFound() - } - - const isMultiRoom = booking.rooms.length > 1 - const isRedemption = booking.searchType === SEARCH_TYPE_REDEMPTION - const isArbOrVoucher = booking.bookingCode - ? singleRoomRateTypes.test(booking.bookingCode) - : false - - if ((isMultiRoom && isRedemption) || (isMultiRoom && isArbOrVoucher)) { - logger.debug( - "Invalid search params, can't have multiroom and redemption/voucher", - { isMultiRoom, isRedemption, isArbOrVoucher } - ) - notFound() - } - - // If someone tries to update the url with - // a bookingCode also, then we need to remove it - if (isRedemption && searchParams.bookingCode) { - delete searchParams.bookingCode - } - - const hotelData = await getHotel({ - hotelId: booking.hotelId, - isCardOnlyPayment: false, - language: params.lang, - }) - - if (!hotelData) { - logger.debug("Unable to find hotel data") - notFound() - } + const lang = await getLang() return ( - - - + ( + + )} + /> ) } diff --git a/apps/scandic-web/app/[lang]/(live)/layout.tsx b/apps/scandic-web/app/[lang]/(live)/layout.tsx index 44da328ef..070f33af8 100644 --- a/apps/scandic-web/app/[lang]/(live)/layout.tsx +++ b/apps/scandic-web/app/[lang]/(live)/layout.tsx @@ -7,8 +7,8 @@ import "@scandic-hotels/design-system/style.css" import { ReactQueryDevtools } from "@tanstack/react-query-devtools" import Script from "next/script" import { SessionProvider } from "next-auth/react" -import { NuqsAdapter } from "nuqs/adapters/next/app" +import { NuqsAdapter } from "@scandic-hotels/booking-flow/utils/nuqs" import { Lang } from "@scandic-hotels/common/constants/language" import { ToastHandler } from "@scandic-hotels/design-system/ToastHandler" diff --git a/apps/scandic-web/app/[lang]/(no-layout)/layout.tsx b/apps/scandic-web/app/[lang]/(no-layout)/layout.tsx index 39580997b..652ccc0c5 100644 --- a/apps/scandic-web/app/[lang]/(no-layout)/layout.tsx +++ b/apps/scandic-web/app/[lang]/(no-layout)/layout.tsx @@ -7,8 +7,8 @@ import "@scandic-hotels/design-system/style.css" import { ReactQueryDevtools } from "@tanstack/react-query-devtools" import Script from "next/script" import { SessionProvider } from "next-auth/react" -import { NuqsAdapter } from "nuqs/adapters/next/app" +import { NuqsAdapter } from "@scandic-hotels/booking-flow/utils/nuqs" import { Lang } from "@scandic-hotels/common/constants/language" import { ToastHandler } from "@scandic-hotels/design-system/ToastHandler" diff --git a/apps/scandic-web/app/[lang]/(partner)/layout.tsx b/apps/scandic-web/app/[lang]/(partner)/layout.tsx index b8788f34d..efdec4a4a 100644 --- a/apps/scandic-web/app/[lang]/(partner)/layout.tsx +++ b/apps/scandic-web/app/[lang]/(partner)/layout.tsx @@ -6,8 +6,8 @@ import "@scandic-hotels/design-system/style.css" import { ReactQueryDevtools } from "@tanstack/react-query-devtools" import Script from "next/script" -import { NuqsAdapter } from "nuqs/adapters/next/app" +import { NuqsAdapter } from "@scandic-hotels/booking-flow/utils/nuqs" import { Lang } from "@scandic-hotels/common/constants/language" import { ToastHandler } from "@scandic-hotels/design-system/ToastHandler" diff --git a/apps/scandic-web/app/[lang]/webview/layout.tsx b/apps/scandic-web/app/[lang]/webview/layout.tsx index 15b9ff488..6be312399 100644 --- a/apps/scandic-web/app/[lang]/webview/layout.tsx +++ b/apps/scandic-web/app/[lang]/webview/layout.tsx @@ -5,8 +5,8 @@ import "@scandic-hotels/design-system/style.css" import "@scandic-hotels/design-system/design-system-new-deprecated.css" import Script from "next/script" -import { NuqsAdapter } from "nuqs/adapters/next/app" +import { NuqsAdapter } from "@scandic-hotels/booking-flow/utils/nuqs" import { Lang } from "@scandic-hotels/common/constants/language" import { ToastHandler } from "@scandic-hotels/design-system/ToastHandler" diff --git a/apps/scandic-web/components/ErrorBoundary/ErrorBoundary.tsx b/apps/scandic-web/components/ErrorBoundary/ErrorBoundary.tsx index fa218c2ff..8ae4b4d01 100644 --- a/apps/scandic-web/components/ErrorBoundary/ErrorBoundary.tsx +++ b/apps/scandic-web/components/ErrorBoundary/ErrorBoundary.tsx @@ -46,8 +46,6 @@ export class ErrorBoundary extends React.Component< )} ) - - return this.props.fallback } return this.props.children diff --git a/apps/scandic-web/components/HotelReservation/BookingConfirmation/PriceDetails/index.tsx b/apps/scandic-web/components/HotelReservation/BookingConfirmation/PriceDetails/index.tsx index efa8c03ab..74074faeb 100644 --- a/apps/scandic-web/components/HotelReservation/BookingConfirmation/PriceDetails/index.tsx +++ b/apps/scandic-web/components/HotelReservation/BookingConfirmation/PriceDetails/index.tsx @@ -1,11 +1,10 @@ "use client" +import PriceDetailsModal from "@scandic-hotels/booking-flow/components/PriceDetailsModal" import { CurrencyEnum } from "@scandic-hotels/common/constants/currency" import { dt } from "@scandic-hotels/common/dt" import { useBookingConfirmationStore } from "@/stores/booking-confirmation" -import PriceDetailsModal from "@/components/HotelReservation/PriceDetailsModal" - import { mapToPrice } from "./mapToPrice" import type { Price } from "@/types/components/hotelReservation/price" diff --git a/apps/scandic-web/components/HotelReservation/BookingConfirmation/PriceDetails/mapToPrice.ts b/apps/scandic-web/components/HotelReservation/BookingConfirmation/PriceDetails/mapToPrice.ts index 0bc2f940c..1c47bd121 100644 --- a/apps/scandic-web/components/HotelReservation/BookingConfirmation/PriceDetails/mapToPrice.ts +++ b/apps/scandic-web/components/HotelReservation/BookingConfirmation/PriceDetails/mapToPrice.ts @@ -2,13 +2,13 @@ import { BreakfastPackageEnum } from "@scandic-hotels/trpc/enums/breakfast" import { ChildBedMapEnum } from "@scandic-hotels/trpc/enums/childBedMapEnum" import { PackageTypeEnum } from "@scandic-hotels/trpc/enums/packages" import { + type BreakfastPackage, breakfastPackageSchema, packageSchema, } from "@scandic-hotels/trpc/routers/hotels/schemas/packages" import type { Package } from "@scandic-hotels/trpc/types/packages" -import type { BreakfastPackage } from "@/types/components/hotelReservation/breakfast" import type { Room } from "@/types/stores/booking-confirmation" export function mapToPrice(rooms: (Room | null)[], nights: number) { diff --git a/apps/scandic-web/components/HotelReservation/BookingConfirmation/Rooms/Room/index.tsx b/apps/scandic-web/components/HotelReservation/BookingConfirmation/Rooms/Room/index.tsx index f8f50d0da..76e748a5a 100644 --- a/apps/scandic-web/components/HotelReservation/BookingConfirmation/Rooms/Room/index.tsx +++ b/apps/scandic-web/components/HotelReservation/BookingConfirmation/Rooms/Room/index.tsx @@ -2,6 +2,7 @@ import { useIntl } from "react-intl" +import { RoomDetailsSidePeek } from "@scandic-hotels/booking-flow/components/RoomDetailsSidePeek" import { changeOrCancelDateFormat, longDateFormat, @@ -16,7 +17,6 @@ import { getHotelRoom } from "@scandic-hotels/trpc/routers/booking/helpers" import { CancellationRuleEnum } from "@/constants/booking" import { useBookingConfirmationStore } from "@/stores/booking-confirmation" -import RoomDetailsSidePeek from "@/components/SidePeeks/RoomDetailsSidePeek" import useLang from "@/hooks/useLang" import styles from "./room.module.css" diff --git a/apps/scandic-web/components/HotelReservation/EnterDetails/BedType/schema.ts b/apps/scandic-web/components/HotelReservation/EnterDetails/BedType/schema.ts index 1bc1b1550..977076464 100644 --- a/apps/scandic-web/components/HotelReservation/EnterDetails/BedType/schema.ts +++ b/apps/scandic-web/components/HotelReservation/EnterDetails/BedType/schema.ts @@ -1,12 +1,5 @@ import { z } from "zod" -export const bedTypeSchema = z.object({ - bedType: z.object({ - description: z.string(), - roomTypeCode: z.string(), - type: z.string(), - }), -}) export const bedTypeFormSchema = z.object({ bedType: z.string(), }) diff --git a/apps/scandic-web/components/HotelReservation/EnterDetails/SelectedRoom/index.tsx b/apps/scandic-web/components/HotelReservation/EnterDetails/SelectedRoom/index.tsx index 9565e5766..bd592d816 100644 --- a/apps/scandic-web/components/HotelReservation/EnterDetails/SelectedRoom/index.tsx +++ b/apps/scandic-web/components/HotelReservation/EnterDetails/SelectedRoom/index.tsx @@ -4,6 +4,7 @@ import { useRouter } from "next/navigation" import { useTransition } from "react" import { useIntl } from "react-intl" +import { RoomDetailsSidePeek } from "@scandic-hotels/booking-flow/components/RoomDetailsSidePeek" import { selectRate } from "@scandic-hotels/common/constants/routes/hotelReservation" import { Button } from "@scandic-hotels/design-system/Button" import Footnote from "@scandic-hotels/design-system/Footnote" @@ -13,7 +14,6 @@ import { getHotelRoom } from "@scandic-hotels/trpc/routers/booking/helpers" import { useEnterDetailsStore } from "@/stores/enter-details" -import RoomDetailsSidePeek from "@/components/SidePeeks/RoomDetailsSidePeek" import { useRoomContext } from "@/contexts/Details/Room" import useLang from "@/hooks/useLang" diff --git a/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/Mobile/BottomSheet/index.tsx b/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/Mobile/BottomSheet/index.tsx index c3e871858..eb5903670 100644 --- a/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/Mobile/BottomSheet/index.tsx +++ b/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/Mobile/BottomSheet/index.tsx @@ -6,6 +6,7 @@ import { type PropsWithChildren, useEffect, useRef } from "react" import { Button as ButtonRAC } from "react-aria-components" import { useIntl } from "react-intl" +import { isBookingCodeRate } from "@scandic-hotels/booking-flow/components/SelectRate/RoomsContainer/RateSummary/utils" import { formatPrice } from "@scandic-hotels/common/utils/numberFormatting" import { Button } from "@scandic-hotels/design-system/Button" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" @@ -14,7 +15,6 @@ import { Typography } from "@scandic-hotels/design-system/Typography" import { useEnterDetailsStore } from "@/stores/enter-details" import { formId } from "@/components/HotelReservation/EnterDetails/Payment/PaymentClient" -import { isBookingCodeRate } from "@/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/utils" import styles from "./bottomSheet.module.css" diff --git a/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/Mobile/index.tsx b/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/Mobile/index.tsx index 6f01c85ed..f251aa696 100644 --- a/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/Mobile/index.tsx +++ b/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/Mobile/index.tsx @@ -1,8 +1,8 @@ "use client" -import { useEnterDetailsStore } from "@/stores/enter-details" +import SignupPromoMobile from "@scandic-hotels/booking-flow/components/SignupPromoMobile" -import SignupPromoMobile from "@/components/HotelReservation/SignupPromo/Mobile" +import { useEnterDetailsStore } from "@/stores/enter-details" import SummaryUI from "../UI" import SummaryBottomSheet from "./BottomSheet" diff --git a/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/UI/Room/Breakfast/index.tsx b/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/UI/Room/Breakfast/index.tsx index b6106495d..46c5f2362 100644 --- a/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/UI/Room/Breakfast/index.tsx +++ b/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/UI/Room/Breakfast/index.tsx @@ -6,7 +6,7 @@ import { Typography } from "@scandic-hotels/design-system/Typography" import styles from "./breakfast.module.css" -import type { BreakfastPackage } from "@/types/components/hotelReservation/breakfast" +import type { BreakfastPackage } from "@scandic-hotels/trpc/routers/hotels/schemas/packages" interface BreakfastProps { adults: number diff --git a/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/UI/index.tsx b/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/UI/index.tsx index 94eb0920d..73905d9ab 100644 --- a/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/UI/index.tsx +++ b/apps/scandic-web/components/HotelReservation/EnterDetails/Summary/UI/index.tsx @@ -4,6 +4,9 @@ import { cx } from "class-variance-authority" import { useIntl } from "react-intl" import { useMediaQuery } from "usehooks-ts" +import PriceDetailsModal from "@scandic-hotels/booking-flow/components/PriceDetailsModal" +import { isBookingCodeRate } from "@scandic-hotels/booking-flow/components/SelectRate/RoomsContainer/RateSummary/utils" +import SignupPromoDesktop from "@scandic-hotels/booking-flow/components/SignupPromoDesktop" import { CurrencyEnum } from "@scandic-hotels/common/constants/currency" import { longDateFormat } from "@scandic-hotels/common/constants/dateFormats" import { dt } from "@scandic-hotels/common/dt" @@ -15,9 +18,6 @@ import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import Subtitle from "@scandic-hotels/design-system/Subtitle" import { Typography } from "@scandic-hotels/design-system/Typography" -import PriceDetailsModal from "@/components/HotelReservation/PriceDetailsModal" -import { isBookingCodeRate } from "@/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/utils" -import SignupPromoDesktop from "@/components/HotelReservation/SignupPromo/Desktop" import useLang from "@/hooks/useLang" import { mapToPrice } from "./mapToPrice" diff --git a/apps/scandic-web/components/HotelReservation/EnterDetails/Tracking/tracking.ts b/apps/scandic-web/components/HotelReservation/EnterDetails/Tracking/tracking.ts index 3f2962daf..e78e00b19 100644 --- a/apps/scandic-web/components/HotelReservation/EnterDetails/Tracking/tracking.ts +++ b/apps/scandic-web/components/HotelReservation/EnterDetails/Tracking/tracking.ts @@ -16,6 +16,7 @@ import { RoomPackageCodeEnum } from "@scandic-hotels/trpc/enums/roomFilter" import { getSpecialRoomType } from "@/utils/specialRoomType" import type { Lang } from "@scandic-hotels/common/constants/language" +import type { BreakfastPackages } from "@scandic-hotels/trpc/routers/hotels/output" import type { Hotel } from "@scandic-hotels/trpc/types/hotel" import type { Room } from "@scandic-hotels/trpc/types/room" import type { @@ -23,7 +24,6 @@ import type { Product, } from "@scandic-hotels/trpc/types/roomAvailability" -import type { BreakfastPackages } from "@/types/components/hotelReservation/breakfast" import type { DetailsBooking, RoomRate, diff --git a/apps/scandic-web/components/HotelReservation/MyStay/PriceDetails/index.tsx b/apps/scandic-web/components/HotelReservation/MyStay/PriceDetails/index.tsx index 04f3ec276..8dde629b8 100644 --- a/apps/scandic-web/components/HotelReservation/MyStay/PriceDetails/index.tsx +++ b/apps/scandic-web/components/HotelReservation/MyStay/PriceDetails/index.tsx @@ -1,10 +1,9 @@ "use client" +import PriceDetailsModal from "@scandic-hotels/booking-flow/components/PriceDetailsModal" import { dt } from "@scandic-hotels/common/dt" import { useMyStayStore } from "@/stores/my-stay" -import PriceDetailsModal from "@/components/HotelReservation/PriceDetailsModal" - import { calculateTotalPrice, mapToPrice } from "./mapToPrice" import styles from "./priceDetails.module.css" diff --git a/apps/scandic-web/components/HotelReservation/MyStay/utils/mapRoomDetails.ts b/apps/scandic-web/components/HotelReservation/MyStay/utils/mapRoomDetails.ts index 9f4d1c02b..01e435004 100644 --- a/apps/scandic-web/components/HotelReservation/MyStay/utils/mapRoomDetails.ts +++ b/apps/scandic-web/components/HotelReservation/MyStay/utils/mapRoomDetails.ts @@ -11,10 +11,10 @@ import { getPriceType } from "../../utils/getPriceType" import { formatChildBedPreferences } from "../utils" import type { RateEnum } from "@scandic-hotels/common/constants/rate" +import type { BreakfastPackage } from "@scandic-hotels/trpc/routers/hotels/schemas/packages" import type { BookingConfirmation } from "@scandic-hotels/trpc/types/bookingConfirmation" import type { Room } from "@scandic-hotels/trpc/types/hotel" -import type { BreakfastPackage } from "@/types/components/hotelReservation/breakfast" import type { Room as MyStayRoom } from "@/types/stores/my-stay" interface MapRoomDetailsParams { diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/Packages.tsx b/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/Packages.tsx deleted file mode 100644 index d962ff2fa..000000000 --- a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/Packages.tsx +++ /dev/null @@ -1,34 +0,0 @@ -"use client" -import { useIntl } from "react-intl" - -import { formatPrice } from "@scandic-hotels/common/utils/numberFormatting" - -import { getFeatureDescription } from "@/components/HotelReservation/utils/getRoomFeatureDescription" - -import RegularRow from "../Regular" - -import type { Packages as PackagesType } from "@scandic-hotels/trpc/types/packages" - -interface PackagesProps { - packages: PackagesType | null -} - -export default function PackagesRow({ packages }: PackagesProps) { - const intl = useIntl() - - if (!packages || !packages.length) { - return null - } - - return packages?.map((pkg) => ( - - )) -} diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/mapToPrice.ts b/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/mapToPrice.ts deleted file mode 100644 index 3af057e8b..000000000 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/mapToPrice.ts +++ /dev/null @@ -1,66 +0,0 @@ -import type { - Rate, - Room as SelectRateRoom, -} from "@scandic-hotels/booking-flow/types/components/selectRate/selectRate" - -import type { Room } from "@/components/HotelReservation/PriceDetailsModal/PriceDetailsTable" - -export function mapToPrice( - rooms: (Rate | null)[], - bookingRooms: SelectRateRoom[], - isUserLoggedIn: boolean -) { - return rooms - .map((room, idx) => { - if (!room) { - return null - } - - let price = null - if ("corporateCheque" in room.product) { - price = { - corporateCheque: room.product.corporateCheque.localPrice, - } - } else if ("redemption" in room.product) { - price = { - redemption: room.product.redemption.localPrice, - } - } else if ("voucher" in room.product) { - price = { - voucher: room.product.voucher, - } - } else { - const isMainRoom = idx === 0 - const memberRate = room.product.member - const onlyMemberRate = !room.product.public && memberRate - if ((isUserLoggedIn && isMainRoom && memberRate) || onlyMemberRate) { - price = { - regular: { - ...memberRate.localPrice, - regularPricePerStay: - room.product.public?.localPrice.pricePerStay || - memberRate.localPrice.pricePerStay, - }, - } - } else if (room.product.public) { - price = { - regular: room.product.public.localPrice, - } - } - } - - const bookingRoom = bookingRooms[idx] - return { - adults: bookingRoom.adults, - bedType: undefined, - breakfast: undefined, - breakfastIncluded: room.product.rateDefinition.breakfastIncluded, - childrenInRoom: bookingRoom.childrenInRoom, - packages: room.packages, - price, - roomType: room.roomType, - rateDefinition: room.product.rateDefinition, - } - }) - .filter((r) => !!(r && r.price)) as Room[] -} diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/Tracking/index.tsx b/apps/scandic-web/components/HotelReservation/SelectRate/Tracking/index.tsx deleted file mode 100644 index 7dc0f8afe..000000000 --- a/apps/scandic-web/components/HotelReservation/SelectRate/Tracking/index.tsx +++ /dev/null @@ -1,59 +0,0 @@ -"use client" - -import { useSearchParams } from "next/navigation" -import React from "react" - -import { - parseSelectRateSearchParams, - searchParamsToRecord, -} from "@scandic-hotels/booking-flow/utils/url" -import { SEARCH_TYPE_REDEMPTION } from "@scandic-hotels/trpc/constants/booking" - -import TrackingSDK from "@/components/TrackingSDK" -import useLang from "@/hooks/useLang" - -import { getValidDates } from "../getValidDates" -import { getSelectRateTracking } from "./tracking" - -export default function Tracking({ - hotelId, - hotelName, - country, - city, -}: { - hotelId: string - hotelName: string - country: string - city: string -}) { - const lang = useLang() - const params = useSearchParams() - const booking = parseSelectRateSearchParams(searchParamsToRecord(params)) - - if (!booking) return null - - const { fromDate, toDate } = getValidDates(booking.fromDate, booking.toDate) - - const { rooms, searchType, bookingCode, city: paramCity } = booking - - const arrivalDate = fromDate.toDate() - const departureDate = toDate.toDate() - - const { hotelsTrackingData, pageTrackingData } = getSelectRateTracking({ - lang, - arrivalDate, - departureDate, - hotelId, - hotelName, - country, - hotelCity: city, - paramCity, - bookingCode, - isRedemption: searchType === SEARCH_TYPE_REDEMPTION, - rooms, - }) - - return ( - - ) -} diff --git a/apps/scandic-web/components/SidePeeks/BookedRoomSidePeek/index.tsx b/apps/scandic-web/components/SidePeeks/BookedRoomSidePeek/index.tsx index e430d10f3..4d7d7a9ac 100644 --- a/apps/scandic-web/components/SidePeeks/BookedRoomSidePeek/index.tsx +++ b/apps/scandic-web/components/SidePeeks/BookedRoomSidePeek/index.tsx @@ -25,12 +25,12 @@ import RoomDetails from "./RoomDetails" import styles from "./bookedRoomSidePeek.module.css" +import type { BreakfastPackage } from "@scandic-hotels/trpc/routers/hotels/schemas/packages" import type { BookingConfirmationSchema } from "@scandic-hotels/trpc/types/bookingConfirmation" import type { Child } from "@scandic-hotels/trpc/types/child" import type { Room as HotelRoom } from "@scandic-hotels/trpc/types/hotel" import type { Packages } from "@scandic-hotels/trpc/types/packages" -import type { BreakfastPackage } from "@/types/components/hotelReservation/breakfast" import type { BedTypeSchema } from "@/types/components/hotelReservation/enterDetails/bedType" import type { PriceTypeEnum } from "@/types/components/hotelReservation/myStay/myStay" import type { SafeUser } from "@/types/user" diff --git a/apps/scandic-web/constants/booking.ts b/apps/scandic-web/constants/booking.ts index 98623048a..f782c4776 100644 --- a/apps/scandic-web/constants/booking.ts +++ b/apps/scandic-web/constants/booking.ts @@ -65,12 +65,3 @@ export enum PaymentCallbackStatusEnum { Error = "error", Cancel = "cancel", } - -export function combineRegExps(regexps: RegExp[], flags = "") { - return new RegExp(regexps.map((r) => r.source).join("|"), flags) -} - -export const rateTypeRegex = { - ARB: /(^B[a-z]{3}\d{6}$)/, - VOUCHER: /(^VO[0-9a-z]*$)/, -} diff --git a/apps/scandic-web/next.config.ts b/apps/scandic-web/next.config.ts index 77d722107..91f08d416 100644 --- a/apps/scandic-web/next.config.ts +++ b/apps/scandic-web/next.config.ts @@ -33,6 +33,7 @@ const nextConfig = { "@scandic-hotels/common", "@scandic-hotels/trpc", "@scandic-hotels/booking-flow", + "@scandic-hotels/design-system", ], experimental: { serverActions: { diff --git a/apps/scandic-web/package.json b/apps/scandic-web/package.json index d96b8309a..ec9fe6509 100644 --- a/apps/scandic-web/package.json +++ b/apps/scandic-web/package.json @@ -40,7 +40,10 @@ "@opentelemetry/sdk-trace-base": "^1.29.0", "@radix-ui/react-slot": "^1.2.2", "@react-aria/ssr": "^3.9.8", + "@scandic-hotels/booking-flow": "workspace:*", + "@scandic-hotels/common": "workspace:*", "@scandic-hotels/design-system": "workspace:*", + "@scandic-hotels/trpc": "workspace:*", "@sentry/nextjs": "^8.41.0", "@swc/plugin-formatjs": "^3.2.2", "@t3-oss/env-nextjs": "^0.13.4", @@ -79,9 +82,8 @@ "md5": "^2.3.0", "motion": "^12.10.0", "nanoid": "^5.1.5", - "next": "15.3.3", + "next": "15.3.4", "next-auth": "5.0.0-beta.27", - "nuqs": "^2.4.3", "react": "19.1.0", "react-aria-components": "^1.8.0", "react-day-picker": "^9.6.7", @@ -105,7 +107,6 @@ "@formatjs/cli": "^6.7.1", "@lokalise/node-api": "^14.0.0", "@react-aria/test-utils": "1.0.0-alpha.8", - "@scandic-hotels/common": "workspace:*", "@scandic-hotels/typescript-config": "workspace:*", "@svgr/webpack": "^8.1.0", "@testing-library/react": "^16.3.0", diff --git a/apps/scandic-web/stores/enter-details/helpers.ts b/apps/scandic-web/stores/enter-details/helpers.ts index 0a45c61a5..74ee9d4cf 100644 --- a/apps/scandic-web/stores/enter-details/helpers.ts +++ b/apps/scandic-web/stores/enter-details/helpers.ts @@ -10,6 +10,7 @@ import { logger } from "@scandic-hotels/common/logger" import { detailsStorageName } from "." +import type { BreakfastPackage } from "@scandic-hotels/trpc/routers/hotels/schemas/packages" import type { Packages } from "@scandic-hotels/trpc/types/packages" import type { CorporateChequeProduct, @@ -18,7 +19,6 @@ import type { VoucherProduct, } from "@scandic-hotels/trpc/types/roomAvailability" -import type { BreakfastPackage } from "@/types/components/hotelReservation/breakfast" import { type RoomRate } from "@/types/components/hotelReservation/enterDetails/details" import type { Price } from "@/types/components/hotelReservation/price" import type { PersistedState, RoomState } from "@/types/stores/enter-details" diff --git a/apps/scandic-web/stores/enter-details/index.ts b/apps/scandic-web/stores/enter-details/index.ts index 6c3ebf255..2fbbb08ea 100644 --- a/apps/scandic-web/stores/enter-details/index.ts +++ b/apps/scandic-web/stores/enter-details/index.ts @@ -17,8 +17,8 @@ import { } from "./helpers" import type { Lang } from "@scandic-hotels/common/constants/language" +import type { BreakfastPackages } from "@scandic-hotels/trpc/routers/hotels/output" -import type { BreakfastPackages } from "@/types/components/hotelReservation/breakfast" import type { Price } from "@/types/components/hotelReservation/price" import { StepEnum } from "@/types/enums/step" import type { diff --git a/apps/scandic-web/types/components/hotelReservation/breakfast.ts b/apps/scandic-web/types/components/hotelReservation/breakfast.ts index 7defda500..363f22c9e 100644 --- a/apps/scandic-web/types/components/hotelReservation/breakfast.ts +++ b/apps/scandic-web/types/components/hotelReservation/breakfast.ts @@ -1,14 +1,6 @@ -import type { breakfastPackagesSchema } from "@scandic-hotels/trpc/routers/hotels/output" -import type { breakfastPackageSchema } from "@scandic-hotels/trpc/routers/hotels/schemas/packages" import type { z } from "zod" import type { breakfastFormSchema } from "@/components/HotelReservation/EnterDetails/Breakfast/schema" export interface BreakfastFormSchema extends z.output {} - -export interface BreakfastPackages - extends z.output {} - -export interface BreakfastPackage - extends z.output {} diff --git a/apps/scandic-web/types/components/hotelReservation/enterDetails/bedType.ts b/apps/scandic-web/types/components/hotelReservation/enterDetails/bedType.ts index 2524d217d..ed01e977f 100644 --- a/apps/scandic-web/types/components/hotelReservation/enterDetails/bedType.ts +++ b/apps/scandic-web/types/components/hotelReservation/enterDetails/bedType.ts @@ -1,14 +1,14 @@ import type { z } from "zod" -import type { - bedTypeFormSchema, - bedTypeSchema, -} from "@/components/HotelReservation/EnterDetails/BedType/schema" +import type { bedTypeFormSchema } from "@/components/HotelReservation/EnterDetails/BedType/schema" export interface BedTypeFormSchema extends z.output {} -export type BedTypeSchema = z.output["bedType"] - +export type BedTypeSchema = { + description: string + type: string + roomTypeCode: string +} export type BedTypeInfoProps = { hasMultipleBedTypes: boolean } diff --git a/apps/scandic-web/types/components/hotelReservation/selectRate/roomListItem.ts b/apps/scandic-web/types/components/hotelReservation/selectRate/roomListItem.ts index d36aed65a..f79c0aa7c 100644 --- a/apps/scandic-web/types/components/hotelReservation/selectRate/roomListItem.ts +++ b/apps/scandic-web/types/components/hotelReservation/selectRate/roomListItem.ts @@ -11,12 +11,3 @@ export type RoomListItemImageProps = Pick< > & { roomPackages: Package[] } - -export interface RoomSizeProps { - roomSize: - | { - max: number - min: number - } - | undefined -} diff --git a/apps/scandic-web/types/components/hotelReservation/selectRate/roomsContainer.ts b/apps/scandic-web/types/components/hotelReservation/selectRate/roomsContainer.ts deleted file mode 100644 index 570598d9c..000000000 --- a/apps/scandic-web/types/components/hotelReservation/selectRate/roomsContainer.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { HotelData } from "@scandic-hotels/trpc/types/hotel" - -export interface RoomsContainerProps - extends Pick, - Pick {} diff --git a/apps/scandic-web/types/components/hotelReservation/signupPromo.ts b/apps/scandic-web/types/components/hotelReservation/signupPromo.ts deleted file mode 100644 index 07be54267..000000000 --- a/apps/scandic-web/types/components/hotelReservation/signupPromo.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface SignupPromoProps { - memberPrice: { - amount: number - currency: string - } - badgeContent?: string - isEnterDetailsPage?: boolean -} diff --git a/apps/scandic-web/types/providers/enter-details.ts b/apps/scandic-web/types/providers/enter-details.ts index 2e6c9f4f9..20e377833 100644 --- a/apps/scandic-web/types/providers/enter-details.ts +++ b/apps/scandic-web/types/providers/enter-details.ts @@ -1,9 +1,9 @@ import type { Lang } from "@scandic-hotels/common/constants/language" +import type { BreakfastPackages } from "@scandic-hotels/trpc/routers/hotels/output" import type { RoomCategories } from "@scandic-hotels/trpc/types/hotel" import type { Room } from "@scandic-hotels/trpc/types/room" import type { SafeUser } from "@/types/user" -import type { BreakfastPackages } from "../components/hotelReservation/breakfast" import type { DetailsBooking } from "../components/hotelReservation/enterDetails/details" export interface DetailsProviderProps extends React.PropsWithChildren { diff --git a/apps/scandic-web/types/stores/enter-details.ts b/apps/scandic-web/types/stores/enter-details.ts index 40f9314f2..eb62bb829 100644 --- a/apps/scandic-web/types/stores/enter-details.ts +++ b/apps/scandic-web/types/stores/enter-details.ts @@ -1,13 +1,11 @@ import type { CurrencyEnum } from "@scandic-hotels/common/constants/currency" +import type { BreakfastPackages } from "@scandic-hotels/trpc/routers/hotels/output" +import type { BreakfastPackage } from "@scandic-hotels/trpc/routers/hotels/schemas/packages" import type { BedTypeSelection } from "@scandic-hotels/trpc/types/bedTypeSelection" import type { Child } from "@scandic-hotels/trpc/types/child" import type { RoomCategories } from "@scandic-hotels/trpc/types/hotel" import type { Packages } from "@scandic-hotels/trpc/types/packages" -import type { - BreakfastPackage, - BreakfastPackages, -} from "@/types/components/hotelReservation/breakfast" import type { BedTypeSchema } from "@/types/components/hotelReservation/enterDetails/bedType" import type { DetailsBooking, diff --git a/apps/scandic-web/types/stores/my-stay.ts b/apps/scandic-web/types/stores/my-stay.ts index c4031e7d5..560c102d9 100644 --- a/apps/scandic-web/types/stores/my-stay.ts +++ b/apps/scandic-web/types/stores/my-stay.ts @@ -1,3 +1,4 @@ +import type { BreakfastPackage } from "@scandic-hotels/trpc/routers/hotels/schemas/packages" import type { BookingConfirmation } from "@scandic-hotels/trpc/types/bookingConfirmation" import type { Child } from "@scandic-hotels/trpc/types/child" import type { @@ -8,7 +9,6 @@ import type { import type { CreditCard } from "@scandic-hotels/trpc/types/user" import type { IntlShape } from "react-intl" -import type { BreakfastPackage } from "@/types/components/hotelReservation/breakfast" import type { BedTypeSchema } from "@/types/components/hotelReservation/enterDetails/bedType" import type { RoomPrice } from "@/types/components/hotelReservation/enterDetails/details" import type { PriceTypeEnum } from "@/types/components/hotelReservation/myStay/myStay" diff --git a/apps/scandic-web/utils/tracking/booking.ts b/apps/scandic-web/utils/tracking/booking.ts index 8d2c081bc..bff2af37d 100644 --- a/apps/scandic-web/utils/tracking/booking.ts +++ b/apps/scandic-web/utils/tracking/booking.ts @@ -2,8 +2,8 @@ import { trackEvent } from "@scandic-hotels/common/tracking/base" -import type { BreakfastPackages } from "@/types/components/hotelReservation/breakfast" import type { LowestRoomPriceEvent } from "@scandic-hotels/common/tracking/types" +import type { BreakfastPackages } from "@scandic-hotels/trpc/routers/hotels/output" export function trackLowestRoomPrice(event: LowestRoomPriceEvent) { trackEvent({ diff --git a/package.json b/package.json index c59a2b8f4..86c401bf9 100644 --- a/package.json +++ b/package.json @@ -1,49 +1,49 @@ { - "name": "scandic", - "packageManager": "yarn@4.6.0", - "scripts": { - "build": "turbo run build --env-mode=loose", - "build:web": "turbo run build --filter=@scandic-hotels/scandic-web --env-mode=loose", - "build:sas": "turbo run build --filter=@scandic-hotels/partner-sas --env-mode=loose", - "lint": "turbo run lint", - "dev": "turbo run dev --output-logs new-only", - "dev:web": "turbo run dev --filter=@scandic-hotels/scandic-web --output-logs new-only", - "dev:ds": "turbo run dev --filter=@scandic-hotels/design-system --output-logs new-only", - "dev:sas": "turbo run dev --filter=@scandic-hotels/partner-sas --output-logs new-only", - "test": "turbo run test", - "postinstall": "husky", - "icons:update": "node scripts/material-symbols-update.mjs", - "check-types": "turbo run check-types", - "env:web": "node scripts/show-env.mjs scandic-web --missing", - "env:sas": "node scripts/show-env.mjs partner-sas --missing", - "i18n:extract": "formatjs extract \"{apps/scandic-web,apps/partner-sas,packages/booking-flow,packages/design-system}/{actions,app,components,constants,contexts,env,hooks,i18n,lib,middlewares,netlify,providers,server,services,stores,utils}/**/*.{ts,tsx}\" --format scripts/i18n/formatter.mjs --out-file scripts/i18n/extracted.json", - "i18n:upload": "jiti scripts/i18n/upload.ts", - "i18n:download": "jiti scripts/i18n/download.ts", - "i18n:compile": "formatjs compile-folder --ast --format scripts/i18n/formatter.mjs scripts/i18n/translations-all scripts/i18n/dictionaries", - "i18n:diff": "node scripts/i18n/diff.mjs", - "i18n:clean": "jiti scripts/i18n/clean.ts", - "i18n:distribute": "jiti scripts/i18n/distribute.ts scandic-web partner-sas", - "i18n:push": "yarn i18n:extract && yarn i18n:upload", - "i18n:pull": "yarn i18n:download && yarn i18n:compile && yarn i18n:distribute", - "i18n:sync": "yarn i18n:push && yarn i18n:pull" - }, - "workspaces": [ - "apps/*", - "packages/*" - ], - "devDependencies": { - "@eslint/compat": "^1.2.9", - "@formatjs/cli": "^6.7.1", - "@types/react": "19.1.0", - "@types/react-dom": "19.1.0", - "@yarnpkg/types": "^4.0.1", - "husky": "^9.1.7", - "jiti": "^1.21.0", - "lint-staged": "^15.2.2", - "ts-node": "^10.9.2", - "turbo": "^2.5.2" - }, - "resolutions": { - "vite": "^6.3.5" - } + "name": "scandic", + "packageManager": "yarn@4.6.0", + "scripts": { + "build": "turbo run build --env-mode=loose", + "build:web": "turbo run build --filter=@scandic-hotels/scandic-web --env-mode=loose", + "build:sas": "turbo run build --filter=@scandic-hotels/partner-sas --env-mode=loose", + "lint": "turbo run lint", + "dev": "turbo run dev --output-logs new-only", + "dev:web": "turbo run dev --filter=@scandic-hotels/scandic-web --output-logs new-only", + "dev:ds": "turbo run dev --filter=@scandic-hotels/design-system --output-logs new-only", + "dev:sas": "turbo run dev --filter=@scandic-hotels/partner-sas --output-logs new-only", + "test": "turbo run test", + "postinstall": "husky", + "icons:update": "node scripts/material-symbols-update.mjs", + "check-types": "turbo run check-types", + "env:web": "node scripts/show-env.mjs scandic-web --missing", + "env:sas": "node scripts/show-env.mjs partner-sas --missing", + "i18n:extract": "formatjs extract \"{apps/scandic-web,apps/partner-sas,packages/booking-flow,packages/design-system}/{actions,app,components,constants,contexts,env,hooks,i18n,lib,middlewares,netlify,providers,server,services,stores,utils}/**/*.{ts,tsx}\" --format scripts/i18n/formatter.mjs --out-file scripts/i18n/extracted.json", + "i18n:upload": "jiti scripts/i18n/upload.ts", + "i18n:download": "jiti scripts/i18n/download.ts", + "i18n:compile": "formatjs compile-folder --ast --format scripts/i18n/formatter.mjs scripts/i18n/translations-all scripts/i18n/dictionaries", + "i18n:diff": "node scripts/i18n/diff.mjs", + "i18n:clean": "jiti scripts/i18n/clean.ts", + "i18n:distribute": "jiti scripts/i18n/distribute.ts scandic-web partner-sas", + "i18n:push": "yarn i18n:extract && yarn i18n:upload", + "i18n:pull": "yarn i18n:download && yarn i18n:compile && yarn i18n:distribute", + "i18n:sync": "yarn i18n:push && yarn i18n:pull" + }, + "workspaces": [ + "apps/*", + "packages/*" + ], + "devDependencies": { + "@eslint/compat": "^1.2.9", + "@formatjs/cli": "^6.7.1", + "@types/react": "19.1.0", + "@types/react-dom": "19.1.0", + "@yarnpkg/types": "^4.0.1", + "husky": "^9.1.7", + "jiti": "^1.21.0", + "lint-staged": "^15.2.2", + "ts-node": "^10.9.2", + "turbo": "^2.5.2" + }, + "resolutions": { + "vite": "^6.3.5" + } } diff --git a/packages/booking-flow/lib/components/ErrorBoundary/ErrorBoundary.tsx b/packages/booking-flow/lib/components/ErrorBoundary/ErrorBoundary.tsx new file mode 100644 index 000000000..483d3c832 --- /dev/null +++ b/packages/booking-flow/lib/components/ErrorBoundary/ErrorBoundary.tsx @@ -0,0 +1,49 @@ +import * as Sentry from "@sentry/nextjs" +import React from "react" + +import { logger } from "@scandic-hotels/common/logger" + +type ErrorBoundaryProps = { + children: React.ReactNode + fallback?: React.ReactNode +} +type ErrorBoundaryState = { hasError: boolean; error?: Error } + +export class ErrorBoundary extends React.Component< + ErrorBoundaryProps, + ErrorBoundaryState +> { + constructor(props: ErrorBoundaryProps) { + super(props) + this.state = { hasError: false } + } + + static getDerivedStateFromError(error: Error) { + return { hasError: true, error } + } + + componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { + logger.error("ErrorBoundary caught an error:", error, errorInfo) + Sentry.captureException(error, { extra: { errorInfo } }) + } + + render() { + if (this.state.hasError) { + const hasFallback = !!this.props.fallback + + return ( + <> + {hasFallback && this.props.fallback} + {!hasFallback &&

Something went wrong.

} + {process.env.NODE_ENV === "development" && ( + + )} + + ) + } + + return this.props.children + } +} diff --git a/packages/booking-flow/lib/components/HotelDetailsSidePeek/index.tsx b/packages/booking-flow/lib/components/HotelDetailsSidePeek/index.tsx index f72d98e55..334006638 100644 --- a/packages/booking-flow/lib/components/HotelDetailsSidePeek/index.tsx +++ b/packages/booking-flow/lib/components/HotelDetailsSidePeek/index.tsx @@ -14,6 +14,7 @@ import type { Hotel, Restaurant, } from "@scandic-hotels/trpc/types/hotel" +import type { ReactNode } from "react" enum SidePeekEnum { hotelDetails = "hotel-detail-side-peek", @@ -23,7 +24,7 @@ interface HotelDetailsSidePeekProps { hotel: Hotel & { url: string | null } restaurants: Restaurant[] additionalHotelData: AdditionalData | undefined - triggerLabel: string + triggerLabel: ReactNode buttonVariant: "primary" | "secondary" wrapping?: boolean } diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Breakfast.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Breakfast.tsx similarity index 98% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Breakfast.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Breakfast.tsx index b9af7df45..31804f8e0 100644 --- a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Breakfast.tsx +++ b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Breakfast.tsx @@ -7,10 +7,9 @@ import BoldRow from "./Row/Bold" import RegularRow from "./Row/Regular" import Tbody from "./Tbody" +import type { BreakfastPackage } from "@scandic-hotels/trpc/routers/hotels/schemas/packages" import type { Child } from "@scandic-hotels/trpc/types/child" -import type { BreakfastPackage } from "@/types/components/hotelReservation/breakfast" - interface BreakfastProps { adults: number breakfast: Omit | false | undefined | null diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Bold.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Bold.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Bold.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Bold.tsx diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/BookingCode.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/BookingCode.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/BookingCode.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/BookingCode.tsx diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Header.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Header.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Header.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Header.tsx diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Large.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Large.tsx similarity index 95% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Large.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Large.tsx index 5ca994a92..67970b788 100644 --- a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Large.tsx +++ b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Large.tsx @@ -6,7 +6,7 @@ import { Typography } from "@scandic-hotels/design-system/Typography" import styles from "./row.module.css" -import type { Price } from "@/types/components/hotelReservation/price" +import type { Price } from "../../../../types/price" interface RowProps { allPricesIsDiscounted: boolean diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/BedType.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/BedType.tsx similarity index 78% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/BedType.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/BedType.tsx index 7e6230e40..9820c7efb 100644 --- a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/BedType.tsx +++ b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/BedType.tsx @@ -5,10 +5,12 @@ import { formatPrice } from "@scandic-hotels/common/utils/numberFormatting" import RegularRow from "../Regular" -import type { BedTypeSchema } from "@/types/components/hotelReservation/enterDetails/bedType" - interface BedTypeRowProps { - bedType: BedTypeSchema | undefined + bedType: + | { + description: string + } + | undefined currency?: string } diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/CorporateCheque.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/CorporateCheque.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/CorporateCheque.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/CorporateCheque.tsx diff --git a/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/Packages.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/Packages.tsx new file mode 100644 index 000000000..5976152c2 --- /dev/null +++ b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/Packages.tsx @@ -0,0 +1,54 @@ +"use client" +import { type IntlShape, useIntl } from "react-intl" + +import { formatPrice } from "@scandic-hotels/common/utils/numberFormatting" +import { RoomPackageCodeEnum } from "@scandic-hotels/trpc/enums/roomFilter" + +import RegularRow from "../Regular" + +import type { Packages as PackagesType } from "@scandic-hotels/trpc/types/packages" + +interface PackagesProps { + packages: PackagesType | null +} + +export default function PackagesRow({ packages }: PackagesProps) { + const intl = useIntl() + + if (!packages || !packages.length) { + return null + } + + return packages?.map((pkg) => ( + + )) +} + +// TODO this might be duplicated, check if we can reuse +function getFeatureDescription( + code: string, + description: string, + intl: IntlShape +): string { + const roomFeatureDescriptions: Record = { + [RoomPackageCodeEnum.ACCESSIBILITY_ROOM]: intl.formatMessage({ + defaultMessage: "Accessible room", + }), + [RoomPackageCodeEnum.ALLERGY_ROOM]: intl.formatMessage({ + defaultMessage: "Allergy-friendly room", + }), + [RoomPackageCodeEnum.PET_ROOM]: intl.formatMessage({ + defaultMessage: "Pet-friendly room", + }), + } + + return roomFeatureDescriptions[code] ?? description +} diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/Redemption.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/Redemption.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/Redemption.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/Redemption.tsx diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/Regular.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/Regular.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/Regular.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/Regular.tsx diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/Voucher.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/Voucher.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/Voucher.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/Voucher.tsx diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/price.ts b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/price.ts similarity index 54% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/price.ts rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/price.ts index 535eefd10..1e7c53fcf 100644 --- a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Price/price.ts +++ b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Price/price.ts @@ -1,9 +1,13 @@ import type { Packages } from "@scandic-hotels/trpc/types/packages" -import type { BedTypeSchema } from "@/types/components/hotelReservation/enterDetails/bedType" - export interface SharedPriceRowProps { - bedType: BedTypeSchema | undefined + bedType: + | { + description: string + type: string + roomTypeCode: string + } + | undefined nights: number packages: Packages | null } diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Regular.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Regular.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Regular.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Regular.tsx diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Vat.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Vat.tsx similarity index 87% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Vat.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Vat.tsx index b279cd733..0ae3515e8 100644 --- a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/Vat.tsx +++ b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/Vat.tsx @@ -1,13 +1,13 @@ "use client" import { useIntl } from "react-intl" -import { calculateVat } from "@scandic-hotels/booking-flow/utils/SelectRate" import { CurrencyEnum } from "@scandic-hotels/common/constants/currency" import { formatPrice } from "@scandic-hotels/common/utils/numberFormatting" +import { calculateVat } from "../../../../utils/SelectRate" import RegularRow from "./Regular" -import type { Price } from "@/types/components/hotelReservation/price" +import type { Price } from "../../../../types/price" interface VatProps { totalPrice: Price diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/row.module.css b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/row.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Row/row.module.css rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Row/row.module.css diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Tbody/index.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Tbody/index.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Tbody/index.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Tbody/index.tsx diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Tbody/tbody.module.css b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Tbody/tbody.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Tbody/tbody.module.css rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Tbody/tbody.module.css diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Tbody/variants.ts b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Tbody/variants.ts similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/Tbody/variants.ts rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/Tbody/variants.ts diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/index.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/index.tsx similarity index 95% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/index.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/index.tsx index 7836f98b0..d379e768d 100644 --- a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/index.tsx +++ b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/index.tsx @@ -6,8 +6,7 @@ import { longDateFormat } from "@scandic-hotels/common/constants/dateFormats" import { dt } from "@scandic-hotels/common/dt" import { Typography } from "@scandic-hotels/design-system/Typography" -import useLang from "@/hooks/useLang" - +import useLang from "../../../hooks/useLang" import BookingCodeRow from "./Row/BookingCode" import HeaderRow from "./Row/Header" import LargeRow from "./Row/Large" @@ -26,13 +25,12 @@ import Tbody from "./Tbody" import styles from "./priceDetailsTable.module.css" import type { CurrencyEnum } from "@scandic-hotels/common/constants/currency" +import type { BreakfastPackage } from "@scandic-hotels/trpc/routers/hotels/schemas/packages" import type { Child } from "@scandic-hotels/trpc/types/child" import type { Packages } from "@scandic-hotels/trpc/types/packages" import type { RateDefinition } from "@scandic-hotels/trpc/types/roomAvailability" -import type { BreakfastPackage } from "@/types/components/hotelReservation/breakfast" -import type { BedTypeSchema } from "@/types/components/hotelReservation/enterDetails/bedType" -import type { Price } from "@/types/components/hotelReservation/price" +import type { Price } from "../../../types/price" type RoomPrice = | CorporateChequePriceType @@ -42,7 +40,13 @@ type RoomPrice = export interface Room { adults: number - bedType: BedTypeSchema | undefined + bedType: + | { + description: string + type: string + roomTypeCode: string + } + | undefined breakfast: Omit | false | undefined | null breakfastChildren?: Omit | null breakfastIncluded: boolean diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/priceDetailsTable.module.css b/packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/priceDetailsTable.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/PriceDetailsTable/priceDetailsTable.module.css rename to packages/booking-flow/lib/components/PriceDetailsModal/PriceDetailsTable/priceDetailsTable.module.css diff --git a/apps/scandic-web/components/HotelReservation/PriceDetailsModal/index.tsx b/packages/booking-flow/lib/components/PriceDetailsModal/index.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/PriceDetailsModal/index.tsx rename to packages/booking-flow/lib/components/PriceDetailsModal/index.tsx diff --git a/apps/scandic-web/components/SidePeeks/RoomDetailsSidePeek/RoomSidePeekContent/index.tsx b/packages/booking-flow/lib/components/RoomDetailsSidePeek/RoomSidePeekContent/index.tsx similarity index 98% rename from apps/scandic-web/components/SidePeeks/RoomDetailsSidePeek/RoomSidePeekContent/index.tsx rename to packages/booking-flow/lib/components/RoomDetailsSidePeek/RoomSidePeekContent/index.tsx index 1e2db15aa..3bb73d9fc 100644 --- a/apps/scandic-web/components/SidePeeks/RoomDetailsSidePeek/RoomSidePeekContent/index.tsx +++ b/packages/booking-flow/lib/components/RoomDetailsSidePeek/RoomSidePeekContent/index.tsx @@ -1,13 +1,11 @@ import { useIntl } from "react-intl" -import { - BED_TYPE_ICONS, - type BedTypes, -} from "@scandic-hotels/booking-flow/bedTypeIcons" import { FacilityIcon } from "@scandic-hotels/design-system/Icons/FacilityIcon" import ImageGallery from "@scandic-hotels/design-system/ImageGallery" import { Typography } from "@scandic-hotels/design-system/Typography" +import { BED_TYPE_ICONS, type BedTypes } from "../../../misc/bedTypeIcons" + import styles from "./roomSidePeekContent.module.css" import type { ApiImage, Room } from "@scandic-hotels/trpc/types/hotel" diff --git a/apps/scandic-web/components/SidePeeks/RoomDetailsSidePeek/RoomSidePeekContent/roomSidePeekContent.module.css b/packages/booking-flow/lib/components/RoomDetailsSidePeek/RoomSidePeekContent/roomSidePeekContent.module.css similarity index 100% rename from apps/scandic-web/components/SidePeeks/RoomDetailsSidePeek/RoomSidePeekContent/roomSidePeekContent.module.css rename to packages/booking-flow/lib/components/RoomDetailsSidePeek/RoomSidePeekContent/roomSidePeekContent.module.css diff --git a/apps/scandic-web/components/SidePeeks/RoomDetailsSidePeek/index.tsx b/packages/booking-flow/lib/components/RoomDetailsSidePeek/index.tsx similarity index 88% rename from apps/scandic-web/components/SidePeeks/RoomDetailsSidePeek/index.tsx rename to packages/booking-flow/lib/components/RoomDetailsSidePeek/index.tsx index 26584fad1..618baabf9 100644 --- a/apps/scandic-web/components/SidePeeks/RoomDetailsSidePeek/index.tsx +++ b/packages/booking-flow/lib/components/RoomDetailsSidePeek/index.tsx @@ -6,13 +6,14 @@ import { Button } from "@scandic-hotels/design-system/Button" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import SidePeekSelfControlled from "@scandic-hotels/design-system/SidePeekSelfControlled" -import { trackOpenSidePeekEvent } from "@/utils/tracking" - +import { useTrackingContext } from "../../trackingContext" import { RoomSidePeekContent } from "./RoomSidePeekContent" import type { Room } from "@scandic-hotels/trpc/types/hotel" -import { SidePeekEnum } from "@/types/sidepeek" +enum SidePeekEnum { + roomDetails = "room-detail-side-peek", +} interface RoomDetailsSidePeekProps { hotelId: string @@ -44,7 +45,7 @@ const buttonPropsMap: Record< }, } -export default function RoomDetailsSidePeek({ +export function RoomDetailsSidePeek({ hotelId, room, roomTypeCode, @@ -52,6 +53,7 @@ export default function RoomDetailsSidePeek({ wrapping = true, buttonVariant: variant = "primary", }: RoomDetailsSidePeekProps) { + const tracking = useTrackingContext() const buttonProps = buttonPropsMap[variant] return ( @@ -60,7 +62,7 @@ export default function RoomDetailsSidePeek({ {...buttonProps} wrapping={wrapping} onPress={() => - trackOpenSidePeekEvent({ + tracking.trackOpenSidePeek({ name: SidePeekEnum.roomDetails, hotelId, roomTypeCode, diff --git a/packages/booking-flow/lib/components/SelectRate/AmenititesSidePeekLabel.tsx b/packages/booking-flow/lib/components/SelectRate/AmenititesSidePeekLabel.tsx new file mode 100644 index 000000000..aa21dfa5a --- /dev/null +++ b/packages/booking-flow/lib/components/SelectRate/AmenititesSidePeekLabel.tsx @@ -0,0 +1,13 @@ +"use client" +import { useIntl } from "react-intl" + +export function AmenitiesSidePeekLabel() { + const intl = useIntl() + return ( + <> + {intl.formatMessage({ + defaultMessage: "See all amenities", + })} + + ) +} diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/AvailabilityError.tsx b/packages/booking-flow/lib/components/SelectRate/AvailabilityError.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/AvailabilityError.tsx rename to packages/booking-flow/lib/components/SelectRate/AvailabilityError.tsx diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/DesktopSummary.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/DesktopSummary.tsx similarity index 96% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/DesktopSummary.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/DesktopSummary.tsx index 7a818656d..e2e12382f 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/DesktopSummary.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/DesktopSummary.tsx @@ -8,15 +8,14 @@ import Footnote from "@scandic-hotels/design-system/Footnote" import { OldDSButton as Button } from "@scandic-hotels/design-system/OldDSButton" import Subtitle from "@scandic-hotels/design-system/Subtitle" -import SignupPromoDesktop from "@/components/HotelReservation/SignupPromo/Desktop" -import { useIsUserLoggedIn } from "@/hooks/useIsUserLoggedIn" - +import { useIsLoggedIn } from "../../../../hooks/useIsLoggedIn" +import SignupPromoDesktop from "../../../SignupPromo/Desktop" import { isBookingCodeRate } from "./utils" import styles from "./rateSummary.module.css" -import type { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" -import type { SelectedRate } from "@scandic-hotels/booking-flow/contexts/SelectRate/types" +import type { useSelectRateContext } from "../../../../contexts/SelectRate/SelectRateContext" +import type { SelectedRate } from "../../../../contexts/SelectRate/types" export function DesktopSummary({ input, @@ -30,7 +29,7 @@ export function DesktopSummary({ bookingCode: string }) { const intl = useIntl() - const isUserLoggedIn = useIsUserLoggedIn() + const isUserLoggedIn = useIsLoggedIn() if (!selectedRates.totalPrice) { return null diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/Content/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/Content/index.tsx similarity index 94% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/Content/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/Content/index.tsx index 15e1f530d..775d405cc 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/Content/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/Content/index.tsx @@ -2,7 +2,6 @@ import { cx } from "class-variance-authority" import { useIntl } from "react-intl" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" import { CurrencyEnum } from "@scandic-hotels/common/constants/currency" import { longDateFormat } from "@scandic-hotels/common/constants/dateFormats" import { dt } from "@scandic-hotels/common/dt" @@ -12,17 +11,17 @@ import { IconButton } from "@scandic-hotels/design-system/IconButton" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import { Typography } from "@scandic-hotels/design-system/Typography" -import PriceDetailsModal from "@/components/HotelReservation/PriceDetailsModal" -import SignupPromoDesktop from "@/components/HotelReservation/SignupPromo/Desktop" -import useRateTitles from "@/hooks/booking/useRateTitles" -import useLang from "@/hooks/useLang" - +import { useSelectRateContext } from "../../../../../../contexts/SelectRate/SelectRateContext" +import useLang from "../../../../../../hooks/useLang" +import PriceDetailsModal from "../../../../../PriceDetailsModal" +import SignupPromoDesktop from "../../../../../SignupPromo/Desktop" +import { useRateTitles } from "../../../Rooms/RoomsList/RoomListItem/Rates/useRateTitles" import { isBookingCodeRate } from "../../utils" import Room from "../Room" import styles from "./summaryContent.module.css" -import type { Price } from "@scandic-hotels/booking-flow/contexts/SelectRate/getTotalPrice" +import type { Price } from "../../../../../../contexts/SelectRate/getTotalPrice" export type SelectRateSummaryProps = { isMember: boolean @@ -100,12 +99,10 @@ export default function SummaryContent({ .locale(lang) .format(longDateFormat[lang])} - {/* eslint-disable formatjs/no-literal-string-in-jsx */} {dt(input.data?.booking.toDate) .locale(lang) .format(longDateFormat[lang])}{" "} ({nightsLabel}) - {/* eslint-enable formatjs/no-literal-string-in-jsx */}

diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/Content/summaryContent.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/Content/summaryContent.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/Content/summaryContent.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/Content/summaryContent.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/Room/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/Room/index.tsx similarity index 97% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/Room/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/Room/index.tsx index 35a609b24..d2770e8e5 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/Room/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/Room/index.tsx @@ -16,19 +16,20 @@ import styles from "./room.module.css" import type { Child } from "@scandic-hotels/trpc/types/child" import type { Packages } from "@scandic-hotels/trpc/types/packages" +import type { Product } from "@scandic-hotels/trpc/types/roomAvailability" -import type { - RoomPrice, - RoomRate, -} from "@/types/components/hotelReservation/enterDetails/details" +import type { Price } from "../../../../../../types/price" interface RoomProps { room: { adults: number childrenInRoom: Child[] | undefined roomType: string - roomPrice: RoomPrice - roomRate: RoomRate + roomPrice: { + perNight: Price + perStay: Price + } + roomRate: Product rateDetails: string[] | undefined cancellationText: string packages?: Packages diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/Room/room.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/Room/room.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/Room/room.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/Room/room.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/index.tsx similarity index 95% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/index.tsx index 80c637470..c8679b7c1 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/index.tsx @@ -4,14 +4,13 @@ import { useEffect, useRef, useState } from "react" import { Button as ButtonRAC } from "react-aria-components" import { useIntl } from "react-intl" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" import { formatPrice } from "@scandic-hotels/common/utils/numberFormatting" import { Button } from "@scandic-hotels/design-system/Button" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import { Typography } from "@scandic-hotels/design-system/Typography" -import { useIsUserLoggedIn } from "@/hooks/useIsUserLoggedIn" - +import { useSelectRateContext } from "../../../../../contexts/SelectRate/SelectRateContext" +import { useIsLoggedIn } from "../../../../../hooks/useIsLoggedIn" import { isBookingCodeRate } from "../utils" import SummaryContent from "./Content" @@ -21,7 +20,7 @@ export function MobileSummary() { const intl = useIntl() const scrollY = useRef(0) const [isSummaryOpen, setIsSummaryOpen] = useState(false) - const isUserLoggedIn = useIsUserLoggedIn() + const isUserLoggedIn = useIsLoggedIn() const { selectedRates } = useSelectRateContext() diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/mapRate.ts b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/mapRate.ts similarity index 96% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/mapRate.ts rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/mapRate.ts index 8318ff882..a39e87086 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/mapRate.ts +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/mapRate.ts @@ -1,12 +1,12 @@ import { CurrencyEnum } from "@scandic-hotels/common/constants/currency" +import type { Packages } from "@scandic-hotels/trpc/types/packages" + import type { Rate, Room, -} from "@scandic-hotels/booking-flow/types/components/selectRate/selectRate" -import type { Packages } from "@scandic-hotels/trpc/types/packages" - -import type { Price } from "@/types/components/hotelReservation/price" +} from "../../../../../types/components/selectRate/selectRate" +import type { Price } from "../../../../../types/price" export function mapRate( room: Rate, diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/mobileSummary.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/mobileSummary.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/mobileSummary.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/mobileSummary.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/summary.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/summary.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/summary.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/summary.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/utils.ts b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/utils.ts similarity index 64% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/utils.ts rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/utils.ts index 8863fd899..3fcac662e 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/MobileSummary/utils.ts +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/MobileSummary/utils.ts @@ -1,6 +1,6 @@ -import type { RoomRate } from "@/types/components/hotelReservation/enterDetails/details" +import type { Product } from "@scandic-hotels/trpc/types/roomAvailability" -export function getMemberPrice(roomRate: RoomRate) { +export function getMemberPrice(roomRate: Product) { if ("member" in roomRate && roomRate.member) { return { amount: roomRate.member.localPrice.pricePerStay, diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/index.tsx similarity index 83% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/index.tsx index 53b90c2aa..497ca8de4 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/index.tsx @@ -3,10 +3,8 @@ import { useRouter, useSearchParams } from "next/navigation" import { useState, useTransition } from "react" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" - -import { ErrorBoundary } from "@/components/ErrorBoundary/ErrorBoundary" - +import { useSelectRateContext } from "../../../../contexts/SelectRate/SelectRateContext" +import { ErrorBoundary } from "../../../ErrorBoundary/ErrorBoundary" import { DesktopSummary } from "./DesktopSummary" import { MobileSummary } from "./MobileSummary" @@ -14,7 +12,6 @@ import styles from "./rateSummary.module.css" export function RateSummary() { return ( - // eslint-disable-next-line formatjs/no-literal-string-in-jsx Unable to render summary}> @@ -62,7 +59,6 @@ function InnerRateSummary() { >
- {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} Unable to render desktop summary
}>
- {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} Unable to render mobile summary
}> diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/rateSummary.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/rateSummary.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/rateSummary.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/rateSummary.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/utils.ts b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/utils.ts similarity index 96% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/utils.ts rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/utils.ts index 675066d3a..591b30253 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/RateSummary/utils.ts +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/RateSummary/utils.ts @@ -1,15 +1,16 @@ -import { sumPackages } from "@scandic-hotels/booking-flow/utils/SelectRate" import { CurrencyEnum } from "@scandic-hotels/common/constants/currency" import { RateTypeEnum } from "@scandic-hotels/common/constants/rateType" -import type { Rate } from "@scandic-hotels/booking-flow/types/components/selectRate/selectRate" +import { sumPackages } from "../../../../utils/SelectRate" + import type { Packages } from "@scandic-hotels/trpc/types/packages" import type { Product, RedemptionProduct, } from "@scandic-hotels/trpc/types/roomAvailability" -import type { Price } from "@/types/components/hotelReservation/price" +import type { Rate } from "../../../../types/components/selectRate/selectRate" +import type { Price } from "../../../../types/price" export function calculateTotalPrice( selectedRateSummary: Rate[], diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/SelectedRoomPanel/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/SelectedRoomPanel/index.tsx similarity index 96% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/SelectedRoomPanel/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/SelectedRoomPanel/index.tsx index 704ed9b7b..37d2d9dfb 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/SelectedRoomPanel/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/SelectedRoomPanel/index.tsx @@ -1,7 +1,6 @@ "use client" import { useIntl } from "react-intl" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" import { CurrencyEnum } from "@scandic-hotels/common/constants/currency" import { RateEnum } from "@scandic-hotels/common/constants/rate" import { logger } from "@scandic-hotels/common/logger" @@ -13,7 +12,8 @@ import Image from "@scandic-hotels/design-system/Image" import { OldDSButton as Button } from "@scandic-hotels/design-system/OldDSButton" import Subtitle from "@scandic-hotels/design-system/Subtitle" -import { useIsUserLoggedIn } from "@/hooks/useIsUserLoggedIn" +import { useSelectRateContext } from "../../../../../../contexts/SelectRate/SelectRateContext" +import { useIsLoggedIn } from "../../../../../../hooks/useIsLoggedIn" import styles from "./selectedRoomPanel.module.css" @@ -100,7 +100,7 @@ export function SelectedRoomPanel({ roomIndex }: { roomIndex: number }) { function useSelectedProductTitle({ roomIndex }: { roomIndex: number }) { const intl = useIntl() - const isUserLoggedIn = useIsUserLoggedIn() + const isUserLoggedIn = useIsLoggedIn() const { selectedRates, input: { nights }, diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/SelectedRoomPanel/selectedRoomPanel.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/SelectedRoomPanel/selectedRoomPanel.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/SelectedRoomPanel/selectedRoomPanel.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/SelectedRoomPanel/selectedRoomPanel.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/index.tsx similarity index 97% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/index.tsx index 4254111e2..f20599827 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/index.tsx @@ -1,12 +1,12 @@ import { useEffect } from "react" import { useIntl } from "react-intl" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" import useStickyPosition from "@scandic-hotels/common/hooks/useStickyPosition" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import { OldDSButton as Button } from "@scandic-hotels/design-system/OldDSButton" import Subtitle from "@scandic-hotels/design-system/Subtitle" +import { useSelectRateContext } from "../../../../../contexts/SelectRate/SelectRateContext" import { SelectedRoomPanel } from "./SelectedRoomPanel" import { roomSelectionPanelVariants } from "./variants" diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/multiRoomWrapper.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/multiRoomWrapper.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/multiRoomWrapper.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/multiRoomWrapper.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/variants.ts b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/variants.ts similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/variants.ts rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/MultiRoomWrapper/variants.ts diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/NoAvailabilityAlert/alert.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/NoAvailabilityAlert/alert.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/NoAvailabilityAlert/alert.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/NoAvailabilityAlert/alert.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/NoAvailabilityAlert/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/NoAvailabilityAlert/index.tsx similarity index 95% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/NoAvailabilityAlert/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/NoAvailabilityAlert/index.tsx index eb5f1fcca..735e39306 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/NoAvailabilityAlert/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/NoAvailabilityAlert/index.tsx @@ -1,13 +1,13 @@ "use client" import { useIntl } from "react-intl" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" import { AlertTypeEnum } from "@scandic-hotels/common/constants/alert" import { alternativeHotels } from "@scandic-hotels/common/constants/routes/hotelReservation" import { Alert } from "@scandic-hotels/design-system/Alert" import { AvailabilityEnum } from "@scandic-hotels/trpc/enums/selectHotel" -import useLang from "@/hooks/useLang" +import { useSelectRateContext } from "../../../../../contexts/SelectRate/SelectRateContext" +import useLang from "../../../../../hooks/useLang" import styles from "./alert.module.css" diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/BookingCodeFilter/bookingCodeFilter.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/BookingCodeFilter/bookingCodeFilter.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/BookingCodeFilter/bookingCodeFilter.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/BookingCodeFilter/bookingCodeFilter.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/BookingCodeFilter/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/BookingCodeFilter/index.tsx similarity index 96% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/BookingCodeFilter/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/BookingCodeFilter/index.tsx index fb14a7840..5ad5e575d 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/BookingCodeFilter/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/BookingCodeFilter/index.tsx @@ -12,15 +12,15 @@ import { } from "react-aria-components" import { useIntl } from "react-intl" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" -import { BookingCodeFilterEnum } from "@scandic-hotels/booking-flow/stores/bookingCode-filter" import { RateTypeEnum } from "@scandic-hotels/common/constants/rateType" import { ChipButton } from "@scandic-hotels/design-system/ChipButton" import { IconButton } from "@scandic-hotels/design-system/IconButton" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import { Typography } from "@scandic-hotels/design-system/Typography" -import { useBreakpoint } from "@/hooks/useBreakpoint" +import { useSelectRateContext } from "../../../../../../contexts/SelectRate/SelectRateContext" +import { useBreakpoint } from "../../../../../../hooks/useBreakpoint" +import { BookingCodeFilterEnum } from "../../../../../../stores/bookingCode-filter" import styles from "./bookingCodeFilter.module.css" diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RemoveBookingCodeButton/RemoveBookingCodeButton.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RemoveBookingCodeButton/RemoveBookingCodeButton.tsx similarity index 81% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RemoveBookingCodeButton/RemoveBookingCodeButton.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RemoveBookingCodeButton/RemoveBookingCodeButton.tsx index 7fb162ef6..c1b9f4171 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RemoveBookingCodeButton/RemoveBookingCodeButton.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RemoveBookingCodeButton/RemoveBookingCodeButton.tsx @@ -1,6 +1,7 @@ -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" import { BookingCodeChip } from "@scandic-hotels/design-system/BookingCodeChip" +import { useSelectRateContext } from "../../../../../../contexts/SelectRate/SelectRateContext" + export function RemoveBookingCodeButton() { const { input: { bookingCode }, diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/PetRoomMessage/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/PetRoomMessage/index.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/PetRoomMessage/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/PetRoomMessage/index.tsx diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/PetRoomMessage/petRoom.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/PetRoomMessage/petRoom.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/PetRoomMessage/petRoom.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/PetRoomMessage/petRoom.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/checkbox.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/checkbox.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/checkbox.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/checkbox.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/index.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/Checkboxes/index.tsx diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/form.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/form.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/form.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/form.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/formValues.ts b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/formValues.ts similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/formValues.ts rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/formValues.ts diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/index.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Form/index.tsx diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Modal.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Modal.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Modal.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Modal.tsx diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Popover.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Popover.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Popover.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/Popover.tsx diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/index.tsx similarity index 96% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/index.tsx index 56a51f6ba..28779b503 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/index.tsx @@ -1,13 +1,12 @@ "use client" import { Button as ButtonRAC } from "react-aria-components" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import { Typography } from "@scandic-hotels/design-system/Typography" import { RoomPackageCodeEnum } from "@scandic-hotels/trpc/enums/roomFilter" -import { useBreakpoint } from "@/hooks/useBreakpoint" - +import { useSelectRateContext } from "../../../../../../contexts/SelectRate/SelectRateContext" +import { useBreakpoint } from "../../../../../../hooks/useBreakpoint" import PetRoomMessage from "./Form/Checkboxes/PetRoomMessage" import { RoomPackageFilterModal } from "./Modal" import { RoomPackageFilterPopover } from "./Popover" diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/roomPackageFilter.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/roomPackageFilter.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/roomPackageFilter.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/roomPackageFilter.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/usePackageLabels.ts b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/usePackageLabels.ts similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/usePackageLabels.ts rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/usePackageLabels.ts diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/utils.ts b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/utils.ts similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/utils.ts rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/RoomPackageFilter/utils.ts diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/index.tsx similarity index 90% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/index.tsx index 479a954bf..f2f4b201c 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/index.tsx @@ -1,13 +1,12 @@ "use client" import { useIntl } from "react-intl" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" import SkeletonShimmer from "@scandic-hotels/design-system/SkeletonShimmer" import { Typography } from "@scandic-hotels/design-system/Typography" import { AvailabilityEnum } from "@scandic-hotels/trpc/enums/selectHotel" -import { ErrorBoundary } from "@/components/ErrorBoundary/ErrorBoundary" - +import { useSelectRateContext } from "../../../../../contexts/SelectRate/SelectRateContext" +import { ErrorBoundary } from "../../../../ErrorBoundary/ErrorBoundary" import { RemoveBookingCodeButton } from "./RemoveBookingCodeButton/RemoveBookingCodeButton" import { RoomPackageFilter } from "./RoomPackageFilter" @@ -15,7 +14,6 @@ import styles from "./roomsHeader.module.css" export function RoomsHeader({ roomIndex }: { roomIndex: number }) { return ( - // eslint-disable-next-line formatjs/no-literal-string-in-jsx Unable to render rooms header}> diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/roomsHeader.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/roomsHeader.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsHeader/roomsHeader.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsHeader/roomsHeader.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/RoomSize.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/RoomSize.tsx similarity index 83% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/RoomSize.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/RoomSize.tsx index 351469f11..ee6994c36 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/RoomSize.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/RoomSize.tsx @@ -3,7 +3,14 @@ import { useIntl } from "react-intl" import { Typography } from "@scandic-hotels/design-system/Typography" -import type { RoomSizeProps } from "@/types/components/hotelReservation/selectRate/roomListItem" +type RoomSizeProps = { + roomSize: + | { + max: number + min: number + } + | undefined +} export default function RoomSize({ roomSize }: RoomSizeProps) { const intl = useIntl() @@ -16,7 +23,6 @@ export default function RoomSize({ roomSize }: RoomSizeProps) { return ( <> - {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}

@@ -35,7 +41,6 @@ export default function RoomSize({ roomSize }: RoomSizeProps) { return ( <> - {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}

diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/details.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/details.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/details.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/details.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/index.tsx similarity index 94% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/index.tsx index ae1766c41..cfa88cd65 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Details/index.tsx @@ -7,7 +7,7 @@ import RoomSize from "./RoomSize" import styles from "./details.module.css" -import type { RoomInfo } from "@scandic-hotels/booking-flow/contexts/SelectRate/types" +import type { RoomInfo } from "../../../../../../../contexts/SelectRate/types" type Props = { roomInfo: RoomInfo diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/breakfastMessage.module.css b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/breakfastMessage.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/breakfastMessage.module.css rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/breakfastMessage.module.css diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/getBreakfastMessage.ts b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/getBreakfastMessage.ts similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/getBreakfastMessage.ts rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/getBreakfastMessage.ts diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/index.tsx similarity index 83% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/index.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/index.tsx index 160da236c..72eafb24b 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/BreakfastMessage/index.tsx @@ -1,14 +1,12 @@ "use client" -import { useSession } from "next-auth/react" import { useIntl } from "react-intl" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" -import { BookingCodeFilterEnum } from "@scandic-hotels/booking-flow/stores/bookingCode-filter" import { Divider } from "@scandic-hotels/design-system/Divider" import { Typography } from "@scandic-hotels/design-system/Typography" -import { isValidClientSession } from "@/utils/clientSession" - +import { useSelectRateContext } from "../../../../../../../../contexts/SelectRate/SelectRateContext" +import { useIsLoggedIn } from "../../../../../../../../hooks/useIsLoggedIn" +import { BookingCodeFilterEnum } from "../../../../../../../../stores/bookingCode-filter" import { getBreakfastMessage } from "./getBreakfastMessage" import styles from "./breakfastMessage.module.css" @@ -32,8 +30,7 @@ export function BreakfastMessage({ const selectedFilter = BookingCodeFilterEnum.All as BookingCodeFilterEnum const hotelType = hotel.data?.hotel.hotelType - const { data: session } = useSession() - const isUserLoggedIn = isValidClientSession(session) + const isUserLoggedIn = useIsLoggedIn() const breakfastMessages = { included: intl.formatMessage({ diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Campaign.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Campaign.tsx similarity index 94% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Campaign.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Campaign.tsx index ad63fdf43..a2c3ef44e 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Campaign.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Campaign.tsx @@ -1,24 +1,23 @@ "use client" import { useIntl } from "react-intl" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" -import { BookingCodeFilterEnum } from "@scandic-hotels/booking-flow/stores/bookingCode-filter" -import { - sumPackages, - sumPackagesRequestedPrice, -} from "@scandic-hotels/booking-flow/utils/SelectRate" import CampaignRateCard from "@scandic-hotels/design-system/CampaignRateCard" import NoRateAvailableCard from "@scandic-hotels/design-system/NoRateAvailableCard" -import useRateTitles from "@/hooks/booking/useRateTitles" -import { useIsUserLoggedIn } from "@/hooks/useIsUserLoggedIn" - +import { useSelectRateContext } from "../../../../../../../contexts/SelectRate/SelectRateContext" +import { useIsLoggedIn } from "../../../../../../../hooks/useIsLoggedIn" +import { BookingCodeFilterEnum } from "../../../../../../../stores/bookingCode-filter" +import { + sumPackages, + sumPackagesRequestedPrice, +} from "../../../../../../../utils/SelectRate" import { calculatePricePerNightPriceProduct } from "./totalPricePerNight" +import { useRateTitles } from "./useRateTitles" import type { AvailabilityWithRoomInfo, Package, -} from "@scandic-hotels/booking-flow/contexts/SelectRate/types" +} from "../../../../../../../contexts/SelectRate/types" type CampaignProps = { nights: number @@ -85,7 +84,7 @@ function Inner({ } = useSelectRateContext() const rateTitles = useRateTitles() - const isUserLoggedIn = useIsUserLoggedIn() + const isUserLoggedIn = useIsLoggedIn() const intl = useIntl() const night = intl .formatMessage({ diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Code.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Code.tsx similarity index 97% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Code.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Code.tsx index d26eb0687..0c060dfce 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Code.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Code.tsx @@ -2,20 +2,20 @@ import { useIntl } from "react-intl" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" +import CodeRateCard from "@scandic-hotels/design-system/CodeRateCard" + +import { useSelectRateContext } from "../../../../../../../contexts/SelectRate/SelectRateContext" import { sumPackages, sumPackagesRequestedPrice, -} from "@scandic-hotels/booking-flow/utils/SelectRate" -import CodeRateCard from "@scandic-hotels/design-system/CodeRateCard" - -import useRateTitles from "@/hooks/booking/useRateTitles" - +} from "../../../../../../../utils/SelectRate" import { calculatePricePerNightPriceProduct } from "./totalPricePerNight" +import { useRateTitles } from "./useRateTitles" -import type { Package } from "@scandic-hotels/booking-flow/contexts/SelectRate/types" import type { CodeProduct } from "@scandic-hotels/trpc/types/roomAvailability" +import type { Package } from "../../../../../../../contexts/SelectRate/types" + type CodeProps = { nights: number roomTypeCode: string diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Redemptions.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Redemptions.tsx similarity index 89% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Redemptions.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Redemptions.tsx index 72a6d932c..7723a08cf 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Redemptions.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Redemptions.tsx @@ -1,17 +1,17 @@ "use client" import { useIntl } from "react-intl" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" -import { BookingCodeFilterEnum } from "@scandic-hotels/booking-flow/stores/bookingCode-filter" -import { sumPackages } from "@scandic-hotels/booking-flow/utils/SelectRate" import PointsRateCard from "@scandic-hotels/design-system/PointsRateCard" -import useRateTitles from "@/hooks/booking/useRateTitles" +import { useSelectRateContext } from "../../../../../../../contexts/SelectRate/SelectRateContext" +import { BookingCodeFilterEnum } from "../../../../../../../stores/bookingCode-filter" +import { sumPackages } from "../../../../../../../utils/SelectRate" +import { useRateTitles } from "./useRateTitles" import type { AvailabilityWithRoomInfo, Package, -} from "@scandic-hotels/booking-flow/contexts/SelectRate/types" +} from "../../../../../../../contexts/SelectRate/types" type RedemptionsProps = { redemptions: AvailabilityWithRoomInfo["redemptions"] diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Regular.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Regular.tsx similarity index 91% rename from apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Regular.tsx rename to packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Regular.tsx index 6b45f285e..441634db6 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Regular.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Regular.tsx @@ -1,24 +1,23 @@ "use client" -import { useSession } from "next-auth/react" import { useIntl } from "react-intl" -import { useSelectRateContext } from "@scandic-hotels/booking-flow/contexts/SelectRate/SelectRateContext" -import { BookingCodeFilterEnum } from "@scandic-hotels/booking-flow/stores/bookingCode-filter" -import { - sumPackages, - sumPackagesRequestedPrice, -} from "@scandic-hotels/booking-flow/utils/SelectRate" import NoRateAvailableCard from "@scandic-hotels/design-system/NoRateAvailableCard" import RegularRateCard from "@scandic-hotels/design-system/RegularRateCard" -import useRateTitles from "@/hooks/booking/useRateTitles" -import { isValidClientSession } from "@/utils/clientSession" - +import { useSelectRateContext } from "../../../../../../../contexts/SelectRate/SelectRateContext" +import { useIsLoggedIn } from "../../../../../../../hooks/useIsLoggedIn" +import { BookingCodeFilterEnum } from "../../../../../../../stores/bookingCode-filter" +import { + sumPackages, + sumPackagesRequestedPrice, +} from "../../../../../../../utils/SelectRate" import { calculatePricePerNightPriceProduct } from "./totalPricePerNight" +import { useRateTitles } from "./useRateTitles" -import type { AvailabilityWithRoomInfo } from "@scandic-hotels/booking-flow/contexts/SelectRate/types" import type { Package } from "@scandic-hotels/trpc/types/packages" +import type { AvailabilityWithRoomInfo } from "../../../../../../../contexts/SelectRate/types" + interface Rate { label: string price: string @@ -44,8 +43,7 @@ export function RegularRate({ roomIndex, selectedPackages, }: RegularRateProps) { - const { data: session } = useSession() - const isUserLoggedIn = isValidClientSession(session) + const isUserLoggedIn = useIsLoggedIn() return regular.map((product, ix) => ( , + Pick {} export function RoomsContainer({}: RoomsContainerProps) { const intl = useIntl() diff --git a/packages/booking-flow/lib/components/SelectRate/SelectRateSkeleton.tsx b/packages/booking-flow/lib/components/SelectRate/SelectRateSkeleton.tsx new file mode 100644 index 000000000..715b8df77 --- /dev/null +++ b/packages/booking-flow/lib/components/SelectRate/SelectRateSkeleton.tsx @@ -0,0 +1,12 @@ +import { HotelInfoCardSkeleton } from "@scandic-hotels/design-system/HotelInfoCard" + +import { RoomsContainerSkeleton } from "./RoomsContainer/RoomsContainerSkeleton" + +export function SelectRateSkeleton() { + return ( + <> + + + + ) +} diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/Tracking/tracking.ts b/packages/booking-flow/lib/components/SelectRate/Tracking/tracking.ts similarity index 97% rename from apps/scandic-web/components/HotelReservation/SelectRate/Tracking/tracking.ts rename to packages/booking-flow/lib/components/SelectRate/Tracking/tracking.ts index 8ab41e2f5..1c298f6e4 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/Tracking/tracking.ts +++ b/packages/booking-flow/lib/components/SelectRate/Tracking/tracking.ts @@ -8,10 +8,11 @@ import { import { ChildBedMapEnum } from "@scandic-hotels/trpc/enums/childBedMapEnum" import { RoomPackageCodeEnum } from "@scandic-hotels/trpc/enums/roomFilter" -import type { Room } from "@scandic-hotels/booking-flow/types/components/selectRate/selectRate" import type { Lang } from "@scandic-hotels/common/constants/language" import type { Child } from "@scandic-hotels/trpc/types/child" +import type { Room } from "../../../types/components/selectRate/selectRate" + type ChildrenInRoom = (Child[] | null)[] | null type SelectRateTrackingInput = { diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/getValidDates.test.ts b/packages/booking-flow/lib/components/SelectRate/getValidDates.test.ts similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/getValidDates.test.ts rename to packages/booking-flow/lib/components/SelectRate/getValidDates.test.ts diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/getValidDates.ts b/packages/booking-flow/lib/components/SelectRate/getValidDates.ts similarity index 100% rename from apps/scandic-web/components/HotelReservation/SelectRate/getValidDates.ts rename to packages/booking-flow/lib/components/SelectRate/getValidDates.ts diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/index.tsx b/packages/booking-flow/lib/components/SelectRate/index.tsx similarity index 70% rename from apps/scandic-web/components/HotelReservation/SelectRate/index.tsx rename to packages/booking-flow/lib/components/SelectRate/index.tsx index 329b23297..0bc4ffb70 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/index.tsx @@ -1,30 +1,30 @@ import { cookies } from "next/headers" -import FnFNotAllowedAlert from "@scandic-hotels/booking-flow/components/FnFNotAllowedAlert" -import { HotelDetailsSidePeek } from "@scandic-hotels/booking-flow/components/HotelDetailsSidePeek" -import { hasOverlappingDates } from "@scandic-hotels/booking-flow/utils/SelectRate" import { FamilyAndFriendsCodes } from "@scandic-hotels/common/constants/familyAndFriends" import { dt } from "@scandic-hotels/common/dt" +import { hasOverlappingDates } from "@scandic-hotels/common/dt/utils/hasOverlappingDates" import { HotelInfoCard } from "@scandic-hotels/design-system/HotelInfoCard" -import { RoomsContainer } from "@/components/HotelReservation/SelectRate/RoomsContainer" -import { getIntl } from "@/i18n" -import { mapApiImagesToGalleryImages } from "@/utils/imageGallery" - +import { mapApiImagesToGalleryImages } from "../../misc/imageGallery" +import FnFNotAllowedAlert from "../FnFNotAllowedAlert" +import { HotelDetailsSidePeek } from "../HotelDetailsSidePeek" +import { AmenitiesSidePeekLabel } from "./AmenititesSidePeekLabel" import AvailabilityError from "./AvailabilityError" -import Tracking from "./Tracking" +import { RoomsContainer } from "./RoomsContainer" -import type { SelectRateBooking } from "@scandic-hotels/booking-flow/types/components/selectRate/selectRate" import type { RouterOutput } from "@scandic-hotels/trpc/client" -export default async function SelectRatePage({ +import type { SelectRateBooking } from "../../types/components/selectRate/selectRate" + +export { SelectRateSkeleton } from "./SelectRateSkeleton" + +export async function SelectRate({ booking, hotelData, }: { hotelData: NonNullable booking: SelectRateBooking }) { - const intl = await getIntl() const bookingCode = booking.bookingCode let isInValidFNF = false @@ -71,9 +71,7 @@ export default async function SelectRatePage({ }} restaurants={hotelData.restaurants} additionalHotelData={hotelData.additionalData} - triggerLabel={intl.formatMessage({ - defaultMessage: "See all amenities", - })} + triggerLabel={} buttonVariant="primary" /> } @@ -89,13 +87,6 @@ export default async function SelectRatePage({ /> )} - - ) diff --git a/apps/scandic-web/components/HotelReservation/SignupPromo/Desktop.tsx b/packages/booking-flow/lib/components/SignupPromo/Desktop.tsx similarity index 92% rename from apps/scandic-web/components/HotelReservation/SignupPromo/Desktop.tsx rename to packages/booking-flow/lib/components/SignupPromo/Desktop.tsx index 0d5f9ea36..a7748e706 100644 --- a/apps/scandic-web/components/HotelReservation/SignupPromo/Desktop.tsx +++ b/packages/booking-flow/lib/components/SignupPromo/Desktop.tsx @@ -8,7 +8,14 @@ import Footnote from "@scandic-hotels/design-system/Footnote" import styles from "./signupPromo.module.css" -import type { SignupPromoProps } from "@/types/components/hotelReservation/signupPromo" +type SignupPromoProps = { + memberPrice: { + amount: number + currency: string + } + badgeContent?: string + isEnterDetailsPage?: boolean +} export default function SignupPromoDesktop({ memberPrice, diff --git a/apps/scandic-web/components/HotelReservation/SignupPromo/Mobile.tsx b/packages/booking-flow/lib/components/SignupPromo/Mobile.tsx similarity index 100% rename from apps/scandic-web/components/HotelReservation/SignupPromo/Mobile.tsx rename to packages/booking-flow/lib/components/SignupPromo/Mobile.tsx diff --git a/apps/scandic-web/components/HotelReservation/SignupPromo/signupPromo.module.css b/packages/booking-flow/lib/components/SignupPromo/signupPromo.module.css similarity index 100% rename from apps/scandic-web/components/HotelReservation/SignupPromo/signupPromo.module.css rename to packages/booking-flow/lib/components/SignupPromo/signupPromo.module.css diff --git a/apps/scandic-web/hooks/useBreakpoint.ts b/packages/booking-flow/lib/hooks/useBreakpoint.ts similarity index 100% rename from apps/scandic-web/hooks/useBreakpoint.ts rename to packages/booking-flow/lib/hooks/useBreakpoint.ts diff --git a/packages/booking-flow/lib/pages/SelectRatePage.tsx b/packages/booking-flow/lib/pages/SelectRatePage.tsx new file mode 100644 index 000000000..42bae3caa --- /dev/null +++ b/packages/booking-flow/lib/pages/SelectRatePage.tsx @@ -0,0 +1,114 @@ +import { notFound } from "next/navigation" + +import { logger } from "@scandic-hotels/common/logger" +import { SEARCH_TYPE_REDEMPTION } from "@scandic-hotels/trpc/constants/booking" + +import { SelectRate } from "../components/SelectRate" +import { getValidDates } from "../components/SelectRate/getValidDates" +import { getSelectRateTracking } from "../components/SelectRate/Tracking/tracking" +import { SelectRateProvider } from "../contexts/SelectRate/SelectRateContext" +import { getHotel } from "../trpc/memoizedRequests" +import { parseSelectRateSearchParams } from "../utils/url" + +import type { Lang } from "@scandic-hotels/common/constants/language" +import type { + TrackingSDKHotelInfo, + TrackingSDKPageData, +} from "@scandic-hotels/common/tracking/types" + +import type { NextSearchParams } from "../types" + +const rateTypeRegex = { + ARB: /(^B[a-z]{3}\d{6}$)/, + VOUCHER: /(^VO[0-9a-z]*$)/, +} + +const singleRoomRateTypes = combineRegExps( + [rateTypeRegex.ARB, rateTypeRegex.VOUCHER], + "i" +) + +export async function SelectRatePage({ + lang, + searchParams, + renderTracking, +}: { + lang: Lang + searchParams: NextSearchParams + renderTracking: (trackingProps: { + hotelsTrackingData: TrackingSDKHotelInfo + pageTrackingData: TrackingSDKPageData + }) => React.ReactNode +}) { + const booking = parseSelectRateSearchParams(searchParams) + + if (!booking) { + logger.debug("Invalid search params", searchParams) + notFound() + } + + const isMultiRoom = booking.rooms.length > 1 + const isRedemption = booking.searchType === SEARCH_TYPE_REDEMPTION + const isArbOrVoucher = booking.bookingCode + ? singleRoomRateTypes.test(booking.bookingCode) + : false + + if ((isMultiRoom && isRedemption) || (isMultiRoom && isArbOrVoucher)) { + logger.debug( + "Invalid search params, can't have multiroom and redemption/voucher", + { isMultiRoom, isRedemption, isArbOrVoucher } + ) + notFound() + } + + // If someone tries to update the url with + // a bookingCode also, then we need to remove it + if (isRedemption && searchParams.bookingCode) { + delete searchParams.bookingCode + } + + const hotelData = await getHotel({ + hotelId: booking.hotelId, + isCardOnlyPayment: false, + language: lang, + }) + + if (!hotelData) { + logger.debug("Unable to find hotel data") + notFound() + } + + const { fromDate, toDate } = getValidDates(booking.fromDate, booking.toDate) + + const { rooms, searchType, bookingCode, city: paramCity } = booking + + const arrivalDate = fromDate.toDate() + const departureDate = toDate.toDate() + + const { hotelsTrackingData, pageTrackingData } = getSelectRateTracking({ + lang, + arrivalDate, + departureDate, + hotelId: hotelData.hotel.id, + hotelName: hotelData.hotel.name, + country: hotelData.hotel.address.country, + hotelCity: hotelData.hotel.address.city, + paramCity, + bookingCode, + isRedemption: searchType === SEARCH_TYPE_REDEMPTION, + rooms, + }) + + return ( + <> + + + + {renderTracking({ hotelsTrackingData, pageTrackingData })} + + ) +} + +function combineRegExps(regexps: RegExp[], flags = "") { + return new RegExp(regexps.map((r) => r.source).join("|"), flags) +} diff --git a/packages/booking-flow/lib/types/price.ts b/packages/booking-flow/lib/types/price.ts new file mode 100644 index 000000000..8376abfcf --- /dev/null +++ b/packages/booking-flow/lib/types/price.ts @@ -0,0 +1,15 @@ +import type { CurrencyEnum } from "@scandic-hotels/common/constants/currency" + +interface TPrice { + additionalPrice?: number + additionalPriceCurrency?: CurrencyEnum + currency: CurrencyEnum + price: number + regularPrice?: number +} + +// TODO after migration, check this type for duplicates and maybe move to better location +export interface Price { + requested?: TPrice + local: TPrice +} diff --git a/packages/booking-flow/lib/utils/SelectRate/index.tsx b/packages/booking-flow/lib/utils/SelectRate/index.tsx index 79f055c97..dd70a7bdf 100644 --- a/packages/booking-flow/lib/utils/SelectRate/index.tsx +++ b/packages/booking-flow/lib/utils/SelectRate/index.tsx @@ -1,4 +1,5 @@ import { type Dayjs, dt } from "@scandic-hotels/common/dt" +import { hasOverlappingDates } from "@scandic-hotels/common/dt/utils/hasOverlappingDates" import { MaterialIcon, type MaterialIconSetIconProps, @@ -100,44 +101,3 @@ export function filterOverlappingDates< hasOverlappingDates(item, startDate, endDate) ) } - -export function hasOverlappingDates( - dateRangeItem: { - startDate: Date | Dayjs | string | undefined | null - endDate: Date | Dayjs | string | undefined | null - }, - fromDate: Date | Dayjs, - toDate: Date | Dayjs -) { - const startDate = dt(fromDate) - const endDate = dt(toDate) - - if (dateRangeItem.endDate && dateRangeItem.startDate) { - const itemStartDate = dt(dateRangeItem.startDate) - const itemEndDate = dt(dateRangeItem.endDate) - - const fromDateIsBetweenItemDates = startDate.isBetween( - itemStartDate, - itemEndDate, - "date", - "[]" - ) - const toDateIsBetweenItemDates = endDate.isBetween( - itemStartDate, - itemEndDate, - "date", - "[]" - ) - - const itemFullyContained = - startDate.isSameOrBefore(itemStartDate, "date") && - endDate.isSameOrAfter(itemEndDate, "date") - - return ( - fromDateIsBetweenItemDates || - toDateIsBetweenItemDates || - itemFullyContained - ) - } - return true -} diff --git a/packages/booking-flow/lib/utils/nuqs.ts b/packages/booking-flow/lib/utils/nuqs.ts new file mode 100644 index 000000000..a73cb90e1 --- /dev/null +++ b/packages/booking-flow/lib/utils/nuqs.ts @@ -0,0 +1,9 @@ +// We re-export the NuqsAdapter here to work around issues +// with the consuming apps using nuqs from another module. +// See: https://github.com/47ng/nuqs/issues/798 + +// We should fix this another way, but moving it to peerDeps +// didn't seem to work so the next solution would be to move +// nuqs to a custom workspace package. + +export { NuqsAdapter } from "nuqs/adapters/next/app" diff --git a/packages/booking-flow/package.json b/packages/booking-flow/package.json index 851165af2..d99034772 100644 --- a/packages/booking-flow/package.json +++ b/packages/booking-flow/package.json @@ -25,13 +25,19 @@ "./components/HotelDetailsSidePeek": "./lib/components/HotelDetailsSidePeek/index.tsx", "./components/HotelReservationSidePeek": "./lib/components/HotelReservationSidePeek/index.tsx", "./components/OpenSidePeekButton": "./lib/components/OpenSidePeekButton/index.tsx", + "./components/PriceDetailsModal": "./lib/components/PriceDetailsModal/index.tsx", "./components/RoomCardSkeleton": "./lib/components/RoomCardSkeleton/RoomCardSkeleton.tsx", + "./components/RoomDetailsSidePeek": "./lib/components/RoomDetailsSidePeek/index.tsx", "./components/RoomSidePeekContent": "./lib/components/RoomSidePeek/RoomSidePeekContent/index.tsx", "./components/SelectHotel": "./lib/components/SelectHotel/index.tsx", "./components/SelectHotelMap": "./lib/components/SelectHotel/SelectHotelMap/index.tsx", + "./components/SelectRate": "./lib/components/SelectRate/index.tsx", + "./components/SelectRate/RoomsContainer/RateSummary/utils": "./lib/components/SelectRate/RoomsContainer/RateSummary/utils.ts", "./components/SidePeekAccordions/BreakfastAccordionItem": "./lib/components/SidePeekAccordions/BreakfastAccordionItem.tsx", "./components/SidePeekAccordions/CheckInCheckOutAccordionItem": "./lib/components/SidePeekAccordions/CheckInCheckOutAccordionItem.tsx", "./components/SidePeekAccordions/ParkingAccordionItem": "./lib/components/SidePeekAccordions/ParkingAccordionItem.tsx", + "./components/SignupPromoDesktop": "./lib/components/SignupPromo/Desktop.tsx", + "./components/SignupPromoMobile": "./lib/components/SignupPromo/Mobile.tsx", "./components/TripAdvisorChip": "./lib/components/TripAdvisorChip/index.tsx", "./contexts/SelectRate/getTotalPrice": "./lib/contexts/SelectRate/getTotalPrice.ts", "./contexts/SelectRate/SelectRateContext": "./lib/contexts/SelectRate/SelectRateContext.tsx", @@ -46,16 +52,20 @@ "./types/stores/rates": "./lib/types/stores/rates.ts", "./utils/isSameBooking": "./lib/utils/isSameBooking.ts", "./utils/url": "./lib/utils/url.ts", - "./utils/SelectRate": "./lib/utils/SelectRate/index.tsx" + "./utils/SelectRate": "./lib/utils/SelectRate/index.tsx", + "./utils/nuqs": "./lib/utils/nuqs.ts" }, "dependencies": { "@hookform/resolvers": "^5.0.1", "@scandic-hotels/common": "workspace:*", "@scandic-hotels/design-system": "workspace:*", "@scandic-hotels/trpc": "workspace:*", + "@sentry/nextjs": "^8.41.0", + "@trpc/client": "^11.1.2", "@vis.gl/react-google-maps": "^1.5.2", "class-variance-authority": "^0.7.1", "date-fns": "^4.1.0", + "dayjs": "^1.11.13", "downshift": "^9.0.9", "fast-deep-equal": "^3.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", diff --git a/packages/common/dt/utils/hasOverlappingDates.ts b/packages/common/dt/utils/hasOverlappingDates.ts new file mode 100644 index 000000000..fa506cd57 --- /dev/null +++ b/packages/common/dt/utils/hasOverlappingDates.ts @@ -0,0 +1,44 @@ +import { dt } from "../dt" + +import type { Dayjs } from "../dt" + +export function hasOverlappingDates( + dateRangeItem: { + startDate: Date | Dayjs | string | undefined | null + endDate: Date | Dayjs | string | undefined | null + }, + fromDate: Date | Dayjs, + toDate: Date | Dayjs +) { + const startDate = dt(fromDate) + const endDate = dt(toDate) + + if (dateRangeItem.endDate && dateRangeItem.startDate) { + const itemStartDate = dt(dateRangeItem.startDate) + const itemEndDate = dt(dateRangeItem.endDate) + + const fromDateIsBetweenItemDates = startDate.isBetween( + itemStartDate, + itemEndDate, + "date", + "[]" + ) + const toDateIsBetweenItemDates = endDate.isBetween( + itemStartDate, + itemEndDate, + "date", + "[]" + ) + + const itemFullyContained = + startDate.isSameOrBefore(itemStartDate, "date") && + endDate.isSameOrAfter(itemEndDate, "date") + + return ( + fromDateIsBetweenItemDates || + toDateIsBetweenItemDates || + itemFullyContained + ) + } + return true +} diff --git a/packages/common/package.json b/packages/common/package.json index 982b86209..c33991066 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -27,6 +27,7 @@ "./constants/signatureHotels": "./constants/signatureHotels.ts", "./dataCache": "./dataCache/index.ts", "./dt": "./dt/dt.ts", + "./dt/utils/hasOverlappingDates": "./dt/utils/hasOverlappingDates.ts", "./global.d.ts": "./global.d.ts", "./hooks/*": "./hooks/*.ts", "./logger": "./logger/index.ts", diff --git a/packages/trpc/lib/routers/hotels/output.ts b/packages/trpc/lib/routers/hotels/output.ts index 52df0890b..91cb34566 100644 --- a/packages/trpc/lib/routers/hotels/output.ts +++ b/packages/trpc/lib/routers/hotels/output.ts @@ -503,6 +503,8 @@ export const breakfastPackagesSchema = z .transform(({ data }) => data.attributes.packages.filter((pkg) => pkg.code?.match(/^(BRF\d+)$/gm)) ) +export interface BreakfastPackages + extends z.output {} export const ancillaryPackagesSchema = z .object({ diff --git a/packages/trpc/lib/routers/hotels/schemas/packages.ts b/packages/trpc/lib/routers/hotels/schemas/packages.ts index 83ebe03cc..770f394cf 100644 --- a/packages/trpc/lib/routers/hotels/schemas/packages.ts +++ b/packages/trpc/lib/routers/hotels/schemas/packages.ts @@ -61,6 +61,8 @@ export const breakfastPackageSchema = z.object({ PackageTypeEnum.BreakfastChildren, ]), }) +export interface BreakfastPackage + extends z.output {} export const ancillaryPackageSchema = z.object({ categoryName: z.string(), diff --git a/yarn.lock b/yarn.lock index 1aa84853e..b258edfd4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2781,13 +2781,6 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.3.3": - version: 15.3.3 - resolution: "@next/env@npm:15.3.3" - checksum: 10c0/b47ef78c4194900f52a274270932a633ba21f39377fc6ad478839c3c1e3fffccb8ad25b286a1beb11f91fe9d09a299087ccb9c205a4e610ad95af65f24e49e5a - languageName: node - linkType: hard - "@next/env@npm:15.3.4": version: 15.3.4 resolution: "@next/env@npm:15.3.4" @@ -2811,13 +2804,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-darwin-arm64@npm:15.3.3" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@next/swc-darwin-arm64@npm:15.3.4": version: 15.3.4 resolution: "@next/swc-darwin-arm64@npm:15.3.4" @@ -2825,13 +2811,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-darwin-x64@npm:15.3.3" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@next/swc-darwin-x64@npm:15.3.4": version: 15.3.4 resolution: "@next/swc-darwin-x64@npm:15.3.4" @@ -2839,13 +2818,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-linux-arm64-gnu@npm:15.3.3" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - "@next/swc-linux-arm64-gnu@npm:15.3.4": version: 15.3.4 resolution: "@next/swc-linux-arm64-gnu@npm:15.3.4" @@ -2853,13 +2825,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-linux-arm64-musl@npm:15.3.3" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - "@next/swc-linux-arm64-musl@npm:15.3.4": version: 15.3.4 resolution: "@next/swc-linux-arm64-musl@npm:15.3.4" @@ -2867,13 +2832,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-linux-x64-gnu@npm:15.3.3" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - "@next/swc-linux-x64-gnu@npm:15.3.4": version: 15.3.4 resolution: "@next/swc-linux-x64-gnu@npm:15.3.4" @@ -2881,13 +2839,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-linux-x64-musl@npm:15.3.3" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - "@next/swc-linux-x64-musl@npm:15.3.4": version: 15.3.4 resolution: "@next/swc-linux-x64-musl@npm:15.3.4" @@ -2895,13 +2846,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-win32-arm64-msvc@npm:15.3.3" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@next/swc-win32-arm64-msvc@npm:15.3.4": version: 15.3.4 resolution: "@next/swc-win32-arm64-msvc@npm:15.3.4" @@ -2909,13 +2853,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-win32-x64-msvc@npm:15.3.3" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@next/swc-win32-x64-msvc@npm:15.3.4": version: 15.3.4 resolution: "@next/swc-win32-x64-msvc@npm:15.3.4" @@ -6109,7 +6046,9 @@ __metadata: "@scandic-hotels/design-system": "workspace:*" "@scandic-hotels/trpc": "workspace:*" "@scandic-hotels/typescript-config": "workspace:*" + "@sentry/nextjs": "npm:^8.41.0" "@t3-oss/env-nextjs": "npm:^0.13.4" + "@trpc/client": "npm:^11.1.2" "@types/lodash-es": "npm:^4" "@types/react": "npm:19.1.0" "@typescript-eslint/eslint-plugin": "npm:^8.32.0" @@ -6117,6 +6056,7 @@ __metadata: "@vis.gl/react-google-maps": "npm:^1.5.2" class-variance-authority: "npm:^0.7.1" date-fns: "npm:^4.1.0" + dayjs: "npm:^1.11.13" dotenv: "npm:^16.5.0" downshift: "npm:^9.0.9" eslint: "npm:^9" @@ -6344,8 +6284,10 @@ __metadata: "@radix-ui/react-slot": "npm:^1.2.2" "@react-aria/ssr": "npm:^3.9.8" "@react-aria/test-utils": "npm:1.0.0-alpha.8" + "@scandic-hotels/booking-flow": "workspace:*" "@scandic-hotels/common": "workspace:*" "@scandic-hotels/design-system": "workspace:*" + "@scandic-hotels/trpc": "workspace:*" "@scandic-hotels/typescript-config": "workspace:*" "@sentry/nextjs": "npm:^8.41.0" "@svgr/webpack": "npm:^8.1.0" @@ -6412,9 +6354,8 @@ __metadata: motion: "npm:^12.10.0" nanoid: "npm:^5.1.5" netlify-plugin-cypress: "npm:^2.2.1" - next: "npm:15.3.3" + next: "npm:15.3.4" next-auth: "npm:5.0.0-beta.27" - nuqs: "npm:^2.4.3" prettier: "npm:^3.5.3" react: "npm:19.1.0" react-aria-components: "npm:^1.8.0" @@ -15794,67 +15735,6 @@ __metadata: languageName: node linkType: hard -"next@npm:15.3.3": - version: 15.3.3 - resolution: "next@npm:15.3.3" - dependencies: - "@next/env": "npm:15.3.3" - "@next/swc-darwin-arm64": "npm:15.3.3" - "@next/swc-darwin-x64": "npm:15.3.3" - "@next/swc-linux-arm64-gnu": "npm:15.3.3" - "@next/swc-linux-arm64-musl": "npm:15.3.3" - "@next/swc-linux-x64-gnu": "npm:15.3.3" - "@next/swc-linux-x64-musl": "npm:15.3.3" - "@next/swc-win32-arm64-msvc": "npm:15.3.3" - "@next/swc-win32-x64-msvc": "npm:15.3.3" - "@swc/counter": "npm:0.1.3" - "@swc/helpers": "npm:0.5.15" - busboy: "npm:1.6.0" - caniuse-lite: "npm:^1.0.30001579" - postcss: "npm:8.4.31" - sharp: "npm:^0.34.1" - styled-jsx: "npm:5.1.6" - peerDependencies: - "@opentelemetry/api": ^1.1.0 - "@playwright/test": ^1.41.2 - babel-plugin-react-compiler: "*" - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - dependenciesMeta: - "@next/swc-darwin-arm64": - optional: true - "@next/swc-darwin-x64": - optional: true - "@next/swc-linux-arm64-gnu": - optional: true - "@next/swc-linux-arm64-musl": - optional: true - "@next/swc-linux-x64-gnu": - optional: true - "@next/swc-linux-x64-musl": - optional: true - "@next/swc-win32-arm64-msvc": - optional: true - "@next/swc-win32-x64-msvc": - optional: true - sharp: - optional: true - peerDependenciesMeta: - "@opentelemetry/api": - optional: true - "@playwright/test": - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true - bin: - next: dist/bin/next - checksum: 10c0/b519d348efd905ac63b2e5cb1e5a3d8e5d11d992aba436f4eef28c66f4555f155bb2bd489d0d029867e926539b31a3f14dd81b0ebca54ce9f3d65a883fb94d4b - languageName: node - linkType: hard - "no-case@npm:^3.0.4": version: 3.0.4 resolution: "no-case@npm:3.0.4"