Files
web/apps/scandic-web/stores/my-stay/myStayRoomDetailsStore.ts

195 lines
5.1 KiB
TypeScript

import { create } from "zustand"
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 { PriceType } from "@/types/components/hotelReservation/myStay/myStay"
import type { Child } from "@/types/components/hotelReservation/selectRate/selectRate"
import { CurrencyEnum } from "@/types/enums/currency"
import type { Packages } from "@/types/requests/packages"
import type { BookingConfirmation } from "@/types/trpc/routers/booking/confirmation"
export type Room = Pick<
BookingConfirmation["booking"],
| "hotelId"
| "adults"
| "checkInDate"
| "checkOutDate"
| "childrenAges"
| "createDateTime"
| "rateDefinition"
| "guaranteeInfo"
| "linkedReservations"
| "confirmationNumber"
| "cancellationNumber"
| "bookingCode"
| "cheques"
| "vouchers"
| "isCancelable"
| "multiRoom"
| "canChangeDate"
| "guest"
| "roomTypeCode"
| "currencyCode"
| "vatPercentage"
| "roomPoints"
> & {
roomName: string
roomNumber: number | null
isCancelled: boolean
childrenInRoom: Child[]
childrenAsString: string
terms: string | null
packages: Packages | null
bedType: BedTypeSchema
roomPrice: RoomPrice
breakfast: BreakfastPackage | null
mainRoom: boolean
priceType: PriceType
}
interface MyStayRoomDetailsState {
bookedRoom: Room
linkedReservationRooms: Room[]
actions: {
addBookedRoom: (room: Room) => void
updateBookedRoom: (room: Room) => void
addLinkedReservationRoom: (room: Room) => void
updateLinkedReservationRoom: (room: Room) => void
}
}
export const useMyStayRoomDetailsStore = create<MyStayRoomDetailsState>(
(set) => ({
bookedRoom: {
hotelId: "",
roomTypeCode: "",
adults: 0,
childrenAges: [],
checkInDate: new Date(),
checkOutDate: new Date(),
confirmationNumber: "",
cancellationNumber: null,
bookingCode: null,
cheques: 0,
vouchers: 0,
currencyCode: CurrencyEnum.Unknown,
guest: {
email: "",
firstName: "",
lastName: "",
membershipNumber: "",
phoneNumber: "",
countryCode: "",
},
rateDefinition: {
breakfastIncluded: false,
cancellationRule: null,
cancellationText: null,
generalTerms: [],
isMemberRate: false,
mustBeGuaranteed: false,
rateCode: "",
title: null,
},
roomPoints: 0,
roomPrice: {
perNight: {
requested: {
price: 0,
currency: CurrencyEnum.Unknown,
},
local: {
price: 0,
currency: CurrencyEnum.Unknown,
},
},
perStay: {
requested: {
price: 0,
currency: CurrencyEnum.Unknown,
},
local: {
price: 0,
currency: CurrencyEnum.Unknown,
},
},
},
vatPercentage: 0,
vatAmount: 0,
totalPriceExVat: 0,
createDateTime: new Date(),
canChangeDate: false,
multiRoom: false,
mainRoom: false,
roomName: "",
roomNumber: null,
isCancelled: false,
childrenInRoom: [],
childrenAsString: "",
terms: null,
packages: null,
bedType: {
description: "",
roomTypeCode: "",
},
breakfast: null,
linkedReservations: [],
isCancelable: false,
priceType: "money",
},
linkedReservationRooms: [],
actions: {
addBookedRoom: (room) => {
set({ bookedRoom: room })
},
updateBookedRoom: (room) => {
set({ bookedRoom: room })
},
addLinkedReservationRoom: (room) => {
set((state) => {
// Check if room exists in bookedRooms
const existsInBookedRoom =
state.bookedRoom.confirmationNumber === room.confirmationNumber
if (existsInBookedRoom) {
return state
}
// Check if room with this ID already exists in linkedReservationRooms
const existingIndex = state.linkedReservationRooms.findIndex(
(r) => r.confirmationNumber === room.confirmationNumber
)
let newRooms = [...state.linkedReservationRooms]
if (existingIndex >= 0) {
// Update existing room
newRooms[existingIndex] = room
} else {
// Add new room
newRooms.push(room)
}
return {
linkedReservationRooms: newRooms,
}
})
},
updateLinkedReservationRoom: (room) => {
set((state) => {
const existingIndex = state.linkedReservationRooms.findIndex(
(r) => r.confirmationNumber === room.confirmationNumber
)
let newRooms = [...state.linkedReservationRooms]
if (existingIndex >= 0) {
newRooms[existingIndex] = room
}
return {
linkedReservationRooms: newRooms,
}
})
},
},
})
)