mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-30 08:48:11 +00:00
150 lines
4.3 KiB
TypeScript
150 lines
4.3 KiB
TypeScript
import { create } from 'zustand';
|
|
import { persist, createJSONStorage } from 'zustand/middleware';
|
|
|
|
export interface SearchCriteria {
|
|
originStationId: string;
|
|
destinationStationId: string;
|
|
departureDate: string;
|
|
returnDate?: string;
|
|
tripType: 'ONE_WAY' | 'ROUND_TRIP';
|
|
adultCount: number;
|
|
childCount: number;
|
|
nationality: 'ETHIOPIAN' | 'DJIBOUTIAN' | 'OTHER';
|
|
promoCode?: string;
|
|
}
|
|
|
|
export interface PassengerDetail {
|
|
name: string;
|
|
dateOfBirth: string;
|
|
nationality: string;
|
|
faydaVerified?: boolean;
|
|
nationalId?: string;
|
|
faydaSub?: string;
|
|
passportNumber?: string;
|
|
passportCountry?: string;
|
|
passportIssueDate?: string;
|
|
passportExpiryDate?: string;
|
|
passportIssuingAuthority?: string;
|
|
idDocumentType?: string;
|
|
isPrimaryPassenger: boolean;
|
|
seatId?: string;
|
|
seatNumber?: string;
|
|
phone?: string;
|
|
email?: string;
|
|
gender?: string;
|
|
// Round-trip specific seat assignments
|
|
outboundSeatId?: string;
|
|
outboundSeatNumber?: string;
|
|
inboundSeatId?: string;
|
|
inboundSeatNumber?: string;
|
|
returnSeatId?: string;
|
|
returnSeatNumber?: string;
|
|
}
|
|
|
|
export interface SelectedSchedule {
|
|
id: string;
|
|
trainNumber: string;
|
|
origin: string;
|
|
destination: string;
|
|
departureTime: string;
|
|
arrivalTime: string;
|
|
duration: string;
|
|
baseFareAdult: number;
|
|
baseFareChild: number;
|
|
displayCurrency: string;
|
|
selectedSeatClass?: string;
|
|
selectedSeatClassName?: string;
|
|
seatClassName?: string;
|
|
selectedCoachTypeId?: string;
|
|
selectedCoachTypeCode?: string;
|
|
selectedCoachTypeName?: string;
|
|
}
|
|
|
|
export interface SeatHold {
|
|
holdId: string;
|
|
expiresAt: string;
|
|
returnHoldId?: string;
|
|
returnExpiresAt?: string;
|
|
}
|
|
|
|
interface BookingState {
|
|
searchCriteria: SearchCriteria | null;
|
|
selectedSchedule: SelectedSchedule | null;
|
|
outboundSchedule: SelectedSchedule | null;
|
|
inboundSchedule: SelectedSchedule | null;
|
|
passengers: PassengerDetail[];
|
|
seatHold: SeatHold | null;
|
|
bookingId: string | null;
|
|
pnr: string | null;
|
|
selectedPaymentMethod: string | null;
|
|
createAccount: boolean;
|
|
passengerId: string | null;
|
|
|
|
setSearchCriteria: (criteria: SearchCriteria) => void;
|
|
setSelectedSchedule: (schedule: SelectedSchedule) => void;
|
|
setOutboundSchedule: (schedule: SelectedSchedule) => void;
|
|
setInboundSchedule: (schedule: SelectedSchedule) => void;
|
|
setPassengers: (passengers: PassengerDetail[]) => void;
|
|
setSeatHold: (hold: SeatHold | null) => void;
|
|
setBookingId: (id: string) => void;
|
|
setPNR: (pnr: string) => void;
|
|
setPaymentMethod: (method: string) => void;
|
|
setCreateAccount: (create: boolean) => void;
|
|
setPassengerId: (id: string | null) => void;
|
|
clearBooking: () => void;
|
|
}
|
|
|
|
export const useBookingStore = create<BookingState>()(persist(
|
|
(set) => (({
|
|
searchCriteria: null,
|
|
selectedSchedule: null,
|
|
outboundSchedule: null,
|
|
inboundSchedule: null,
|
|
passengers: [],
|
|
seatHold: null,
|
|
bookingId: null,
|
|
pnr: null,
|
|
selectedPaymentMethod: null,
|
|
createAccount: false,
|
|
passengerId: null,
|
|
|
|
setSearchCriteria: (criteria) => set({ searchCriteria: criteria }),
|
|
setSelectedSchedule: (schedule) => set({ selectedSchedule: schedule }),
|
|
setOutboundSchedule: (schedule) => set({ outboundSchedule: schedule }),
|
|
setInboundSchedule: (schedule) => set({ inboundSchedule: schedule }),
|
|
setPassengers: (passengers) => set({ passengers }),
|
|
setSeatHold: (hold) => set({ seatHold: hold }),
|
|
setBookingId: (id) => set({ bookingId: id }),
|
|
setPNR: (pnr) => set({ pnr }),
|
|
setPaymentMethod: (method) => set({ selectedPaymentMethod: method }),
|
|
setCreateAccount: (create) => set({ createAccount: create }),
|
|
setPassengerId: (id) => set({ passengerId: id }),
|
|
clearBooking: () => set({
|
|
searchCriteria: null,
|
|
selectedSchedule: null,
|
|
outboundSchedule: null,
|
|
inboundSchedule: null,
|
|
passengers: [],
|
|
seatHold: null,
|
|
bookingId: null,
|
|
pnr: null,
|
|
selectedPaymentMethod: null,
|
|
createAccount: false,
|
|
passengerId: null,
|
|
}),
|
|
} as BookingState)),
|
|
{
|
|
name: 'booking-storage',
|
|
storage: createJSONStorage(() => {
|
|
if (typeof window !== 'undefined') {
|
|
return localStorage;
|
|
}
|
|
return {
|
|
getItem: () => null,
|
|
setItem: () => {},
|
|
removeItem: () => {},
|
|
};
|
|
}),
|
|
}
|
|
));
|