73 lines
2.1 KiB
TypeScript
73 lines
2.1 KiB
TypeScript
import { create } from "zustand"
|
|
|
|
import { calculateRoomSummary } from "./helper"
|
|
|
|
import type {
|
|
RoomPackageCodeEnum,
|
|
RoomPackages,
|
|
} from "@/types/components/hotelReservation/selectRate/roomFilter"
|
|
import type {
|
|
Rate,
|
|
RateCode,
|
|
} from "@/types/components/hotelReservation/selectRate/selectRate"
|
|
import type { RoomConfiguration } from "@/types/trpc/routers/hotel/roomAvailability"
|
|
|
|
export interface RateSummaryParams {
|
|
getFilteredRooms: (roomIndex: number) => RoomConfiguration[]
|
|
availablePackages: RoomPackages
|
|
roomCategories: Array<{ name: string; roomTypes: Array<{ code: string }> }>
|
|
selectedPackagesByRoom: Record<number, RoomPackageCodeEnum[]>
|
|
}
|
|
|
|
interface RateSelectionState {
|
|
selectedRates: (RateCode | undefined)[]
|
|
rateSummary: (Rate | null)[]
|
|
modifyRate: (index: number) => void
|
|
selectRate: (index: number, rate: RateCode | undefined) => void
|
|
initializeRates: (count: number) => void
|
|
calculateRateSummary: ({
|
|
getFilteredRooms,
|
|
availablePackages,
|
|
roomCategories,
|
|
}: RateSummaryParams) => void
|
|
getSelectedRateSummary: () => Rate[]
|
|
}
|
|
|
|
export const useRateSelectionStore = create<RateSelectionState>((set, get) => ({
|
|
selectedRates: [],
|
|
rateSummary: [],
|
|
modifyRate: (index) =>
|
|
set((state) => {
|
|
const newRates = [...state.selectedRates]
|
|
newRates[index] = undefined
|
|
return { selectedRates: newRates }
|
|
}),
|
|
selectRate: (index, rate) =>
|
|
set((state) => {
|
|
const newRates = [...state.selectedRates]
|
|
newRates[index] = rate
|
|
return { selectedRates: newRates }
|
|
}),
|
|
initializeRates: (count) =>
|
|
set({ selectedRates: new Array(count).fill(undefined) }),
|
|
calculateRateSummary: (params) => {
|
|
const { selectedRates } = get()
|
|
|
|
const summaries = selectedRates.map((selectedRate, roomIndex) => {
|
|
if (!selectedRate) return null
|
|
|
|
return calculateRoomSummary({
|
|
selectedRate,
|
|
roomIndex,
|
|
...params,
|
|
})
|
|
})
|
|
|
|
set({ rateSummary: summaries })
|
|
},
|
|
getSelectedRateSummary: () => {
|
|
const { rateSummary } = get()
|
|
return rateSummary.filter((summary): summary is Rate => summary !== null)
|
|
},
|
|
}))
|