Files
web/stores/guests-rooms.ts
2024-10-15 12:00:20 +02:00

144 lines
4.2 KiB
TypeScript

"use client"
import { produce } from "immer"
import { create } from "zustand"
import { BedTypeEnum } from "@/types/components/bookingWidget/enums"
import { Child } from "@/types/components/bookingWidget/guestsRoomsPicker"
interface GuestsRooms {
rooms: [
{
adults: number
children: Child[]
childrenInAdultsBed: number
},
]
adultCount: number
childCount: number
isValidated: boolean
increaseAdults: (roomIndex: number) => void
decreaseAdults: (roomIndex: number) => void
increaseChildren: (roomIndex: number) => void
decreaseChildren: (roomIndex: number) => void
updateChildAge: (age: number, roomIndex: number, childIndex: number) => void
updateChildBed: (bed: number, roomIndex: number, childIndex: number) => void
increaseChildInAdultsBed: (roomIndex: number) => void
decreaseChildInAdultsBed: (roomIndex: number) => void
increaseRoom: () => void
decreaseRoom: (roomIndex: number) => void
setIsValidated: (status: boolean) => void
}
export const guestsRoomsStore = create<GuestsRooms>((set, get) => ({
rooms: [
{
adults: 1,
children: [],
childrenInAdultsBed: 0,
},
],
adultCount: 1,
childCount: 0,
isValidated: false,
increaseAdults: (roomIndex) =>
set(
produce((state: GuestsRooms) => {
state.rooms[roomIndex].adults = state.rooms[roomIndex].adults + 1
state.adultCount = state.adultCount + 1
})
),
decreaseAdults: (roomIndex) =>
set(
produce((state: GuestsRooms) => {
state.rooms[roomIndex].adults = state.rooms[roomIndex].adults - 1
state.adultCount = state.adultCount - 1
let childrenInAdultsBed = 0
state.rooms[roomIndex].children = state.rooms[roomIndex].children.map(
(child) => {
if (child.bed == BedTypeEnum["In adults bed"]) {
childrenInAdultsBed = childrenInAdultsBed + 1
if (childrenInAdultsBed > state.rooms[roomIndex].adults)
child.bed =
child.age < 3
? BedTypeEnum["In crib"]
: BedTypeEnum["In extra bed"]
}
return child
}
)
state.rooms[roomIndex].childrenInAdultsBed =
state.rooms[roomIndex].adults
})
),
increaseChildren: (roomIndex) =>
set(
produce((state: GuestsRooms) => {
state.rooms[roomIndex].children.push({
age: -1,
bed: -1,
})
state.childCount = state.childCount + 1
})
),
decreaseChildren: (roomIndex) =>
set(
produce((state: GuestsRooms) => {
const roomChildren = state.rooms[roomIndex].children
if (
roomChildren.length &&
roomChildren[roomChildren.length - 1].bed ==
BedTypeEnum["In adults bed"]
) {
state.rooms[roomIndex].childrenInAdultsBed =
state.rooms[roomIndex].childrenInAdultsBed - 1
}
state.rooms[roomIndex].children.pop()
state.childCount = state.childCount - 1
})
),
updateChildAge: (age, roomIndex, childIndex) =>
set(
produce((state: GuestsRooms) => {
state.rooms[roomIndex].children[childIndex].age = age
})
),
updateChildBed: (bed, roomIndex, childIndex) =>
set(
produce((state: GuestsRooms) => {
state.rooms[roomIndex].children[childIndex].bed = bed
})
),
increaseChildInAdultsBed: (roomIndex) =>
set(
produce((state: GuestsRooms) => {
state.rooms[roomIndex].childrenInAdultsBed =
state.rooms[roomIndex].childrenInAdultsBed + 1
})
),
decreaseChildInAdultsBed: (roomIndex) =>
set(
produce((state: GuestsRooms) => {
state.rooms[roomIndex].childrenInAdultsBed =
state.rooms[roomIndex].childrenInAdultsBed - 1
})
),
increaseRoom: () =>
set(
produce((state: GuestsRooms) => {
state.rooms.push({
adults: 1,
children: [],
childrenInAdultsBed: 0,
})
})
),
decreaseRoom: (roomIndex) =>
set(
produce((state: GuestsRooms) => {
state.rooms.splice(roomIndex, 1)
})
),
setIsValidated: (status) => set(() => ({ isValidated: status })),
}))