Feat(SW-1279) mystay multirum cancelling * feat(SW-1279) Cancelation text if non-user on room 2-4 * feat(SW-1279) cancel mystay multiroom * feat(SW-1279): Added cancellation for multiroom on mystay Approved-by: Niclas Edenvin
147 lines
4.3 KiB
TypeScript
147 lines
4.3 KiB
TypeScript
import { dt } from "@/lib/dt"
|
|
|
|
import type { UseFormReturn } from "react-hook-form"
|
|
import type { IntlShape } from "react-intl"
|
|
|
|
import type { FormValues } from "@/types/components/hotelReservation/myStay/cancelStay"
|
|
import type { BookingConfirmation } from "@/types/trpc/routers/booking/confirmation"
|
|
|
|
export function getDefaultRooms(booking: BookingConfirmation["booking"]) {
|
|
const { multiRoom, confirmationNumber, linkedReservations = [] } = booking
|
|
|
|
if (!multiRoom) {
|
|
return [{ id: "1", checked: true, confirmationNumber }]
|
|
}
|
|
|
|
const mainRoom = { id: "1", checked: false, confirmationNumber }
|
|
const linkedRooms = linkedReservations.map((reservation, index) => ({
|
|
id: `${index + 2}`,
|
|
checked: false,
|
|
confirmationNumber: reservation.confirmationNumber,
|
|
}))
|
|
|
|
return [mainRoom, ...linkedRooms]
|
|
}
|
|
|
|
export function formatStayDetails({
|
|
booking,
|
|
lang,
|
|
intl,
|
|
}: {
|
|
booking: BookingConfirmation["booking"]
|
|
lang: string
|
|
intl: IntlShape
|
|
}) {
|
|
const { multiRoom } = booking
|
|
const totalAdults = multiRoom
|
|
? (booking.adults ?? 0) +
|
|
(booking.linkedReservations ?? []).reduce((acc, reservation) => {
|
|
return acc + (reservation.adults ?? 0)
|
|
}, 0)
|
|
: (booking.adults ?? 0)
|
|
const totalChildren = multiRoom
|
|
? booking.childrenAges?.length +
|
|
(booking.linkedReservations ?? []).reduce((acc, reservation) => {
|
|
return acc + reservation.children
|
|
}, 0)
|
|
: booking.childrenAges?.length
|
|
|
|
const checkInDate = dt(booking.checkInDate)
|
|
.locale(lang)
|
|
.format("dddd D MMM YYYY")
|
|
const checkOutDate = dt(booking.checkOutDate)
|
|
.locale(lang)
|
|
.format("dddd D MMM YYYY")
|
|
const diff = dt(checkOutDate).diff(checkInDate, "days")
|
|
|
|
const nightsText = intl.formatMessage(
|
|
{ id: "{totalNights, plural, one {# night} other {# nights}}" },
|
|
{ totalNights: diff }
|
|
)
|
|
const adultsText = intl.formatMessage(
|
|
{ id: "{totalAdults, plural, one {# adult} other {# adults}}" },
|
|
{ totalAdults: totalAdults }
|
|
)
|
|
const childrenText = intl.formatMessage(
|
|
{ id: "{totalChildren, plural, one {# child} other {# children}}" },
|
|
{ totalChildren: totalChildren }
|
|
)
|
|
|
|
return {
|
|
checkInDate,
|
|
checkOutDate,
|
|
nightsText,
|
|
adultsText,
|
|
childrenText,
|
|
}
|
|
}
|
|
|
|
function getMatchedRooms(
|
|
booking: BookingConfirmation["booking"],
|
|
checkedConfirmationNumbers: string[]
|
|
) {
|
|
let matchedRooms = []
|
|
|
|
// Main booking
|
|
if (checkedConfirmationNumbers.includes(booking.confirmationNumber ?? "")) {
|
|
matchedRooms.push({
|
|
adults: booking.adults ?? 0,
|
|
children: booking.childrenAges?.length ?? 0,
|
|
})
|
|
}
|
|
|
|
// Linked reservations
|
|
if (booking.linkedReservations) {
|
|
const matchedLinkedRooms = booking.linkedReservations
|
|
.filter((reservation) =>
|
|
checkedConfirmationNumbers.includes(reservation.confirmationNumber)
|
|
)
|
|
.map((reservation) => ({
|
|
adults: reservation.adults ?? 0,
|
|
children: reservation.children ?? 0,
|
|
}))
|
|
|
|
matchedRooms = [...matchedRooms, ...matchedLinkedRooms]
|
|
}
|
|
|
|
return matchedRooms
|
|
}
|
|
|
|
function calculateTotals(matchedRooms: { adults: number; children: number }[]) {
|
|
const totalAdults = matchedRooms.reduce((sum, room) => sum + room.adults, 0)
|
|
const totalChildren = matchedRooms.reduce(
|
|
(sum, room) => sum + room.children,
|
|
0
|
|
)
|
|
return { totalAdults, totalChildren }
|
|
}
|
|
|
|
export const getCheckedRoomsCounts = (
|
|
booking: BookingConfirmation["booking"],
|
|
getValues: UseFormReturn<FormValues>["getValues"],
|
|
intl: IntlShape
|
|
) => {
|
|
const formRooms = getValues("rooms")
|
|
const checkedFormRooms = formRooms.filter((room) => room.checked)
|
|
const checkedConfirmationNumbers = checkedFormRooms
|
|
.map((room) => room.confirmationNumber)
|
|
.filter(
|
|
(confirmationNumber): confirmationNumber is string =>
|
|
confirmationNumber !== null && confirmationNumber !== undefined
|
|
)
|
|
|
|
const matchedRooms = getMatchedRooms(booking, checkedConfirmationNumbers)
|
|
const { totalAdults, totalChildren } = calculateTotals(matchedRooms)
|
|
|
|
const adultsText = intl.formatMessage(
|
|
{ id: "{totalAdults, plural, one {# adult} other {# adults}}" },
|
|
{ totalAdults: totalAdults }
|
|
)
|
|
const childrenText = intl.formatMessage(
|
|
{ id: "{totalChildren, plural, one {# child} other {# children}}" },
|
|
{ totalChildren: totalChildren }
|
|
)
|
|
|
|
return { adultsText, childrenText, totalChildren }
|
|
}
|