"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((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 })), }))