feat: SW-276 Implemented Store usage
This commit is contained in:
143
stores/guests-rooms.ts
Normal file
143
stores/guests-rooms.ts
Normal file
@@ -0,0 +1,143 @@
|
||||
"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 })),
|
||||
}))
|
||||
Reference in New Issue
Block a user