Merged in feat/book-425-optimize-campaign-rate-card (pull request #3015)

Feat/book 425 optimize campaign rate card

* feat(BOOK-425): design updates to RateCard

* feat(BOOK-425): design updates to campaign BookingCodeChip

* feat(BOOK-425): fixed breakfast message & booking code chips on select rate and enter detailss

* feat(BOOK-425): fixed booking code chip on Booking Confirmation page

* fixed draft comments

* fixed more comments

* feat(BOOK-425): removed fixed height from RateCard banner

* fixed another variable comment

* fixed more pr comments

* fixed more pr comments

* updated ratecard campaign standard rate title color

* removed deconstructed props


Approved-by: Bianca Widstam
Approved-by: Erik Tiekstra
This commit is contained in:
Matilda Haneling
2025-10-29 13:54:29 +00:00
parent 56b44c16d4
commit 2c6d9860e1
28 changed files with 272 additions and 83 deletions

View File

@@ -3,6 +3,7 @@ import { useIntl } from "react-intl"
import { CurrencyEnum } from "@scandic-hotels/common/constants/currency"
import { formatPrice } from "@scandic-hotels/common/utils/numberFormatting"
import { BookingCodeChip } from "@scandic-hotels/design-system/BookingCodeChip"
import { Button } from "@scandic-hotels/design-system/Button"
import { Divider } from "@scandic-hotels/design-system/Divider"
import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon"
@@ -24,6 +25,7 @@ interface RoomProps {
isUserLoggedIn: boolean
nightsCount: number
defaultCurrency: CurrencyEnum
showBookingCodeChip?: boolean
}
export default function Room({
@@ -33,6 +35,7 @@ export default function Room({
isUserLoggedIn,
nightsCount,
defaultCurrency,
showBookingCodeChip = false,
}: RoomProps) {
const intl = useIntl()
const adults = room.adults
@@ -68,6 +71,7 @@ export default function Room({
"member" in room.roomRate &&
room.roomRate.member
)
const isSpecialRate =
"corporateCheque" in room.roomRate ||
"redemption" in room.roomRate ||
@@ -344,7 +348,13 @@ export default function Room({
nights={nightsCount}
/>
</div>
{showBookingCodeChip && (
<BookingCodeChip
isCampaign={room.roomRate.rateDefinition.isCampaignRate}
bookingCode={room.roomRate.bookingCode}
alignCenter
/>
)}
<Divider color="Border/Divider/Subtle" />
</>
)

View File

@@ -84,10 +84,12 @@ export default function SummaryUI({
const isAllCampaignRate = rooms.every(
(room) => room.room.roomRate.rateDefinition.isCampaignRate
)
const containsBookingCodeRate = rooms.find(
(r) => r && isBookingCodeRate(r.room.roomRate)
)
const containsCampaignRate = rooms.find(
(r) => r && r.room.roomRate.rateDefinition.isCampaignRate
)
const showDiscounted = containsBookingCodeRate || isUserLoggedIn
const totalCurrency = isVoucherRate
@@ -136,6 +138,11 @@ export default function SummaryUI({
roomCount={rooms.length}
isUserLoggedIn={isUserLoggedIn}
nightsCount={nights}
showBookingCodeChip={
rooms.length !== 1 &&
(room.roomRate.rateDefinition.isCampaignRate ||
!!room.roomRate.bookingCode)
}
/>
))}
@@ -223,14 +230,17 @@ export default function SummaryUI({
toDate={booking.toDate}
totalPrice={totalPrice}
vat={vat}
isCampaignRate={!!containsCampaignRate}
/>
</div>
</div>
<BookingCodeChip
isCampaign={isAllCampaignRate}
bookingCode={booking.bookingCode}
alignCenter
/>
{rooms.length === 1 && (isAllCampaignRate || booking.bookingCode) && (
<BookingCodeChip
isCampaign={isAllCampaignRate}
bookingCode={booking.bookingCode}
alignCenter
/>
)}
<Divider className={styles.bottomDivider} color="Border/Divider/Subtle" />
{showSignupPromo && roomOneMemberPrice && !isUserLoggedIn ? (
<SignupPromoDesktop

View File

@@ -16,6 +16,7 @@ export function mapToPrice(rooms: RoomState[], isMember: boolean) {
...room,
packages: room.roomFeatures,
rateDefinition: {
...room.roomRate.rateDefinition,
isMemberRate: false,
},
}
@@ -86,6 +87,7 @@ export function mapToPrice(rooms: RoomState[], isMember: boolean) {
return {
...roomWithoutPrice,
rateDefinition: {
...roomWithoutPrice.rateDefinition,
isMemberRate: true,
},
price: {
@@ -104,6 +106,7 @@ export function mapToPrice(rooms: RoomState[], isMember: boolean) {
return {
...roomWithoutPrice,
rateDefinition: {
...roomWithoutPrice.rateDefinition,
isMemberRate: true,
},
price: {