UNPKG

hotel-ai-widget

Version:

A customizable hotel chat widget for React and vanilla HTML

296 lines (262 loc) 5.56 kB
/* eslint-disable @typescript-eslint/no-explicit-any */ /* CHAT TYPES */ export type Marker = { id: number; lat: number; lng: number; label: string; }; export type InclusionType = | { type: "attraction"; time: string; metadata: { name: string; description: string; payment: string; time: string; }[]; } | { type: "transport"; time: string; metadata: { payment: string; time: string; "transport-type": string; type: string; }[]; payment: string; // "Card/Cash" "transport-type": string; // "Taxi/Careem" }; export type Attraction = { date: string; time: string; metadata: Array<{ name: string; description: string; payment: string; time: string; }>; }; export type Flight = { date: string; time: string; metadata: Array<{ airline: string; "dep-airport": string; "des-airport": string; from: string; to: string; departure: string; arrival: string | null; "seat-type": string; }>; }; export type Transport = { date: string; time: string; metadata: Array<{ payment: string; time: string; "transport-type": string; type: string; }>; }; export type Hotel = { "check-in": string; // e.g., "2025-06-04" "check-out": string | null; "checkin-time": string; "checkout-time": string | null; name: string; rooms: Array<{ room_type: string; smoking_type: string; breakfast?: string; cancellation?: string[]; }>; }; export type Itinerary = { type: "data"; data: { itinerarySummary: [ { "view-type": "itinerary"; itinerary: { days: { day: string; date: any; inclusions: InclusionType[]; }[]; }; }, { "view-type": "inclusions"; inclusions: { inclusions: Array<{ attractions?: Attraction[]; flights?: Flight[]; hotels?: Hotel[]; transport?: Transport[]; }>; }; } ]; }; metadata: { category: string; messageType: string; }; }; export type HotelImage = { hotel_id: string; image_url: string; description: string; image_type: string; image_name: string; kind: string; section: string; }; export type HotelImagesData = { type: "data"; data: { images: { // category: string; description: string; hotel_id:string; image_location:string; image_name:string; image_type:string; fileName: string; image_url: string; }[]; }; metadata: { messageType: string; category: string; agent: string; }; }; export type ChatHeaderTabs = "map" | "inclusion" | "itinerary" | "hotel-images"; export interface UserSession { sessionId: string; sessionName: string; createdAt: string; lastUpdated: string; messageCount: number; } export interface ConversationPart { type: 'text' | 'place' | 'data'; text?: string; start?: number; end?: number; place?: { name: string; [key: string]: any; }; [key: string]: any; } export interface ConversationMessage { role: 'user' | 'agent'; parts: ConversationPart[]; } export interface ConversationHistory { sessionId: string; userId: string; messages: ConversationMessage[]; } export interface Amenity { type: string; amenityName: string; amenityDescription: string; } export interface Room { id: string; roomName: string; "roomDescription-short": string; "roomDescription-long": string; maxOccupancy: number; "max-adults": number; "max-child": number; size: string; bedConfiguration: string; amenities: RoomAmenity[]; } export interface Image { imageType: string; imageLocation: string; imageName: string; imageURL: string; description: string; } export interface HotelDataResponse { id: string; hotelName: string; officialHotelName: string; affiliation: string; chainName: string; starRating: string; "no-of-rooms": number; hotelWebsiteURL: string; address: string; "address-line-2": string; lat: string; lon: string; "pet-friendly": string; "kid-friendly": string; simpleDescription: string; longDescription: string; "check-in-time": string; "check-out-time": string; timezone: string; "front-desk-time-start": string; "front-desk-time-end": string; hotelAmenities: Amenity[]; rooms: Room[]; images?: Image[]; status:'success'|'initial'|'failed' } export interface RoomAmenity { type: string; amenityName: string; amenityDescription: string; } export interface RoomImage { imageType: string; imageContext: string; imageName: string; imageURL: string; description: string; sourceURL: string; _id: string; } export interface RoomDetailsResponse { roomName: string; "roomDescription-short": string | null; "roomDescription-long": string | null; maxOccupancy: number; "max-adults": number; "max-child": number; size: string; amenities: RoomAmenity[]; _id: string; images: RoomImage[]; } export type UserMessage = { id: string; type: "user"; content: string; timestamp: number; }; export type AIUnifiedMessage = { id: string; type: "ai_unified"; timestamp: number; statusContent: string; mainContent: string; places: any[]; itineraryData: any | null; hotelImagesData: any | null; isStreaming: boolean; }; export type UnifiedMessage = UserMessage | AIUnifiedMessage;