hotel-ai-widget
Version:
A customizable hotel chat widget for React and vanilla HTML
296 lines (262 loc) • 5.56 kB
text/typescript
/* 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;