@admin-layout/tailwind-design-pro 10.1.1-alpha.18 → 10.1.1-alpha.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../src/compute.ts"],"names":[],"mappings":"AAqCA,QAAA,MAAM,aAAa,0CAA0C,CAAC;AAG9D,QAAA,MAAM,cAAc,0CAA2C,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../src/compute.ts"],"names":[],"mappings":"AA2BA,QAAA,MAAM,aAAa,0CAA0C,CAAC;AAG9D,QAAA,MAAM,cAAc,0CAA2C,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC"}
package/lib/compute.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import { getFilteredMenus, getFilteredRoutes } from '@common-stack/client-react/lib/utils/filteredRoutes.js';
2
2
  import { config } from './config/env-config.js';
3
- import { IMenuPosition } from '@common-stack/client-react';
4
3
  const key = 'root-layout';
5
4
  const tailwindDesignProPage = [{
6
5
  key: key,
@@ -31,17 +30,6 @@ const tailwindDesignProPage = [{
31
30
  componentPath: "@admin-layout/tailwind-design-pro/lib/components/UpdateSettingsResource/UpdateSettingsResource.js",
32
31
  hasLoader: true,
33
32
  hasAction: true
34
- },
35
- // Add DeepLinkWaitingPage route
36
- {
37
- path: `//deep-link/property/:propertyId`,
38
- key: 'deep-link',
39
- exact: true,
40
- hideInMenu: true,
41
- clientOnly: true,
42
- position: IMenuPosition.Middle,
43
- componentPath: "@admin-layout/tailwind-design-pro/lib/components/DeepLinkWaitingPage/DeepLinkWaitingPage.js",
44
- hasComponent: true
45
33
  }];
46
34
  // get menus
47
35
  getFilteredMenus(tailwindDesignProPage);
@@ -1 +1 @@
1
- {"version":3,"file":"compute.js","sources":["../src/compute.ts"],"sourcesContent":[null],"names":[],"mappings":"2MAGA,MAAM,GAAG,GAAG,aAAa;AAEzB,MAAM,qBAAqB,GAAU,CAAA;AACjC,EAAA,GAAA,EAAA,GAAA;AACI,EAAA,IAAA,EAAA,aAAQ;AACR,EAAA,IAAA,EAAA,MAAM,CAAa,WAAA;QACnB,UAAY;AACZ,EAAA,gBAAgB,EAAA,CAAA,GAAA,CAAA;SACA,KAAA;AAChB,EAAA,SAAA,EAAK,MAAO,OAAA,0CAAA;AACZ,CAAA,EAAA;AACH,EAAA,GAAA,EAAA,0BAAA;AACD,EAAA,aAAA,EAAA,IAAA;AACI,EAAA,IAAA,EAAA,wBAA+B;AAC/B,EAAA,eAAA,EAAA,IAAe;AACf,EAAA,IAAA,EAAA;AACA,EAAA,SAAA,EAAA,MAAA,OAAqB,+DAAA,CAAA;AACrB,EAAA,IAAA,EAAA;AACA,CAAA;AACA;AACH;MAC+B,EAAA,CAAA,gCAAA,CAAA;AAChC,EAAA,GAAA,EAAA,WAAA;AACI,EAAA,KAAA,EAAA;AACA,EAAA,YAAgB,IAAA;AAChB,EAAA,UAAA,MAAW;AACX,EAAA,SAAA,EAAA,aAAgB,yDAAA,CAAA;AAChB,EAAA,QAAA,EAAA,aAAgB,CAAA;AAChB,CAAA,CAAA;;AAEH,gBAAA,CAAA,qBAAA;;AAGO,MAAA,cAAA,GAAA,iBAAA,CAAA,qBAAA"}
1
+ {"version":3,"file":"compute.js","sources":["../src/compute.ts"],"sourcesContent":[null],"names":[],"mappings":"oJAGA,MAAM,GAAG,GAAG,aAAa;AAEzB,MAAM,qBAAqB,GAAU,CAAA;AACjC,EAAA,GAAA,EAAA,GAAA;AACI,EAAA,IAAA,EAAA,aAAQ;AACR,EAAA,IAAA,EAAA,MAAM,CAAa,WAAA;QACnB,UAAY;AACZ,EAAA,gBAAgB,EAAA,CAAA,GAAA,CAAA;SACA,KAAA;AAChB,EAAA,SAAA,EAAK,MAAO,OAAA,0CAAA;AACZ,CAAA,EAAA;AACH,EAAA,GAAA,EAAA,0BAAA;AACD,EAAA,aAAA,EAAA,IAAA;AACI,EAAA,IAAA,EAAA,wBAA+B;AAC/B,EAAA,eAAA,EAAA,IAAe;AACf,EAAA,IAAA,EAAA;AACA,EAAA,SAAA,EAAA,MAAA,OAAqB,+DAAA,CAAA;AACrB,EAAA,IAAA,EAAA;AACA,CAAA,CAAA;AACA;AACH,gBAAA,CAAA,qBAAA;;AAGO,MAAA,cAAA,GAAA,iBAAA,CAAA,qBAAA"}
@@ -1,4 +1,3 @@
1
1
  export * from './env-config';
2
2
  export * from './analytics-config';
3
- export * from './api.config';
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC"}
package/lib/routes.json CHANGED
@@ -38,17 +38,5 @@
38
38
  "hasLoader": true,
39
39
  "hasAction": true
40
40
  }
41
- },
42
- {
43
- "//deep-link/property/:propertyId": {
44
- "path": "//deep-link/property/:propertyId",
45
- "key": "deep-link",
46
- "exact": true,
47
- "hideInMenu": true,
48
- "clientOnly": true,
49
- "position": "MIDDLE",
50
- "componentPath": "@admin-layout/tailwind-design-pro/lib/components/DeepLinkWaitingPage/DeepLinkWaitingPage.js",
51
- "hasComponent": true
52
- }
53
41
  }
54
42
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@admin-layout/tailwind-design-pro",
3
- "version": "10.1.1-alpha.18",
3
+ "version": "10.1.1-alpha.19",
4
4
  "description": "Sample core for higher packages to depend on",
5
5
  "license": "ISC",
6
6
  "author": "CDMBase LLC",
@@ -61,5 +61,5 @@
61
61
  "typescript": {
62
62
  "definition": "lib/index.d.ts"
63
63
  },
64
- "gitHead": "e6c290f722353dce3f56213329e25e5278b44f3d"
64
+ "gitHead": "275080f5df7c13fd81f9016a180b9d2a71ed24e4"
65
65
  }
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- interface DeepLinkWaitingPageProps {
3
- redirectDelay?: number;
4
- googleAnalyticsId?: string;
5
- }
6
- declare const DeepLinkWaitingPage: React.FC<DeepLinkWaitingPageProps>;
7
- export default DeepLinkWaitingPage;
8
- //# sourceMappingURL=DeepLinkWaitingPage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DeepLinkWaitingPage.d.ts","sourceRoot":"","sources":["../../../src/components/DeepLinkWaitingPage/DeepLinkWaitingPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAOnD,UAAU,wBAAwB;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,QAAA,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAgW3D,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -1,277 +0,0 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import {useState,useEffect}from'react';import {useSearchParams,useParams}from'react-router-dom';import {initGA,trackPageView,trackEvent}from'../../utils/analytics.js';import {config}from'../../config/env-config.js';import {ANALYTICS_CONFIG,EVENT_CATEGORIES,EVENT_ACTIONS}from'../../config/analytics-config.js';import {PARTNER_LOGOS}from'../../config/api.config.js';import {fetchBookingHotelDetails}from'../../utils/fetchBookingHotelDetails.js';import {fetchPricelineHotelDetails}from'../../utils/fetchPricelineHotelDetails.js';const DeepLinkWaitingPage = ({
2
- redirectDelay = 5,
3
- googleAnalyticsId = config.GOOGLE_ANALYTICS_ID
4
- }) => {
5
- const [searchParams] = useSearchParams();
6
- const {
7
- propertyId
8
- } = useParams();
9
- const [countdown, setCountdown] = useState(redirectDelay);
10
- const [redirectUrl, setRedirectUrl] = useState('');
11
- const [isPending, setIsPending] = useState(false);
12
- const [partnerName, setPartnerName] = useState('');
13
- const [partnerLogo, setPartnerLogo] = useState('');
14
- const [propertyName, setPropertyName] = useState('');
15
- // Partner logos from config
16
- const airbnbLogo = PARTNER_LOGOS.AIRBNB;
17
- const bookingLogo = PARTNER_LOGOS.BOOKING;
18
- const pricelineLogo = PARTNER_LOGOS.PRICELINE;
19
- useEffect(() => {
20
- // Initialize Google Analytics if enabled
21
- {
22
- initGA(googleAnalyticsId);
23
- }
24
- // Get the redirect URL from URL parameters
25
- const url = searchParams.get('redirectUrl');
26
- const name = searchParams.get('partnerName');
27
- const logo = searchParams.get('partnerLogo');
28
- const propName = searchParams.get('propertyName');
29
- if (propName) {
30
- setPropertyName(propName);
31
- }
32
- if (url === 'pending') {
33
- setIsPending(true);
34
- // Extract query parameters for API calls
35
- const propertyType = searchParams.get('propertyType');
36
- const checkIn = searchParams.get('checkIn');
37
- const checkOut = searchParams.get('checkOut');
38
- const adults = parseInt(searchParams.get('adults') || '1', 10);
39
- const children = parseInt(searchParams.get('children') || '0', 10);
40
- // Process API call in the background
41
- processRedirection(propertyId, propertyType, checkIn, checkOut, adults, children);
42
- } else if (url) {
43
- setRedirectUrl(url);
44
- setPartnerName(name || '');
45
- setPartnerLogo(logo || '');
46
- startCountdown(url);
47
- }
48
- // Track page view if enabled
49
- {
50
- trackPageView(window.location.pathname, `Deep Link Waiting Page - Property: ${propertyId || 'Unknown'}`);
51
- }
52
- }, [searchParams, redirectDelay, propertyId, googleAnalyticsId]);
53
- const processRedirection = async (propertyId, propertyType, checkIn, checkOut, adults, children) => {
54
- if (!propertyId || !propertyType) {
55
- console.error('Missing property ID or type');
56
- return;
57
- }
58
- try {
59
- let redirectUrl = '';
60
- let partnerName = '';
61
- let partnerLogo = '';
62
- let propertyName = '';
63
- // Handle different property types
64
- switch (propertyType) {
65
- case 'AirbnbProperty':
66
- try {
67
- // Airbnb doesn't need API call, construct URL directly
68
- redirectUrl = `https://www.airbnb.com/rooms/${propertyId}?check_in=${checkIn}&check_out=${checkOut}&guests=${adults + children || 1}`;
69
- partnerName = 'Airbnb.com';
70
- partnerLogo = airbnbLogo;
71
- } catch (error) {
72
- console.error('Error constructing Airbnb URL:', error);
73
- // Even though this is a direct URL construction, add a fallback just in case
74
- redirectUrl = `https://www.airbnb.com/rooms/${propertyId}`;
75
- partnerName = 'Airbnb.com';
76
- partnerLogo = airbnbLogo;
77
- }
78
- break;
79
- case 'BookingProperty':
80
- // Call Booking.com API
81
- const bookingDetails = await fetchBookingHotelDetails(propertyId, checkIn, checkOut, adults, children);
82
- console.log('bookingDetails---->', bookingDetails);
83
- if (bookingDetails && bookingDetails?.data?.url) {
84
- redirectUrl = bookingDetails.data.url;
85
- partnerName = 'Booking.com';
86
- partnerLogo = bookingLogo;
87
- if (bookingDetails.data.name) {
88
- propertyName = bookingDetails.data.name;
89
- }
90
- } else {
91
- // Fallback URL for Booking.com
92
- const checkInFormatted = typeof checkIn === 'string' ? checkIn : '';
93
- const checkOutFormatted = typeof checkOut === 'string' ? checkOut : '';
94
- const guestsCount = adults + children || 1;
95
- redirectUrl = `https://www.booking.com/hotel.html?aid=304142&label=gen173nr-1FCAEoggI46AdIM1gEaLYBiAEBmAEhuAEXyAEM2AEB6AEB-AELiAIBqAIDuALxt6-rBsACAdICJDI2NzI4ZDAwLTdhZWQtNDJjOS1iYzRjLTI3ZDRkMzk5MTRlZNgCBuACAQ&sid=d29e889897f5d24d00e4f8d55c8399bd&all_sr_blocks=${propertyId};checkin=${checkInFormatted};checkout=${checkOutFormatted};dest_id=;dest_type=;group_adults=${adults};group_children=${children};hapos=1;highlighted_blocks=${propertyId};no_rooms=1;req_adults=${adults};req_children=${children};room1=A%2CA;sb_price_type=total;sr_order=popularity;sr_pri_blocks=${propertyId};srepoch=1625097600;srpvid=e8c95a7a7f130034;type=total;ucfs=1&#hotelTmpl`;
96
- partnerName = 'Booking.com';
97
- partnerLogo = bookingLogo;
98
- }
99
- break;
100
- case 'PricelineProperty':
101
- // Call Priceline API
102
- const pricelineDetails = await fetchPricelineHotelDetails(propertyId);
103
- if (pricelineDetails && pricelineDetails.getHotelHotelDetails) {
104
- const hotelInfo = pricelineDetails.getHotelHotelDetails?.results?.hotel_data?.hotel_0;
105
- if (hotelInfo && hotelInfo.priceline_url) {
106
- redirectUrl = hotelInfo.priceline_url;
107
- partnerName = 'Priceline.com';
108
- partnerLogo = pricelineLogo;
109
- if (hotelInfo.name) {
110
- propertyName = hotelInfo.name;
111
- }
112
- } else {
113
- // Fallback URL for Priceline
114
- const cityId = '';
115
- const checkInDate = typeof checkIn === 'string' ? checkIn : '';
116
- const checkOutDate = typeof checkOut === 'string' ? checkOut : '';
117
- const roomCount = 1;
118
- const adultCount = adults || 1;
119
- redirectUrl = `https://www.priceline.com/relax/at/${propertyId}/from/${checkInDate}/to/${checkOutDate}/rooms/${roomCount}/adults/${adultCount}?cityId=${cityId}&cur=USD&psl=${propertyId}`;
120
- partnerName = 'Priceline.com';
121
- partnerLogo = pricelineLogo;
122
- }
123
- }
124
- break;
125
- default:
126
- redirectUrl = `/property/${propertyId}`;
127
- partnerName = 'Our Website';
128
- break;
129
- }
130
- // If we have a redirect URL, update the state
131
- if (redirectUrl) {
132
- if (ANALYTICS_CONFIG.enabled && ANALYTICS_CONFIG.trackEvents.redirections) {
133
- trackEvent(EVENT_CATEGORIES.REDIRECTION, EVENT_ACTIONS.AUTO_REDIRECT, `Property ID: ${propertyId}, Provider: ${partnerName}, URL: ${redirectUrl}${propertyName ? `, Property Name: ${propertyName}` : ''}`);
134
- }
135
- setRedirectUrl(redirectUrl);
136
- setPartnerName(partnerName);
137
- setPartnerLogo(partnerLogo);
138
- if (propertyName) {
139
- setPropertyName(propertyName);
140
- }
141
- setIsPending(false);
142
- // Start countdown after we have the URL
143
- startCountdown(redirectUrl);
144
- } else {
145
- console.error('Failed to generate redirect URL');
146
- }
147
- } catch (error) {
148
- console.error('Error in processing redirection:', error);
149
- {
150
- trackEvent(EVENT_CATEGORIES.ERROR, EVENT_ACTIONS.API_ERROR, `Property ID: ${propertyId}, Type: ${propertyType}`);
151
- }
152
- }
153
- };
154
- const startCountdown = url => {
155
- // Start countdown
156
- const timer = setInterval(() => {
157
- setCountdown(prev => {
158
- if (prev <= 1) {
159
- clearInterval(timer);
160
- // Track auto-redirect event if enabled
161
- {
162
- trackEvent(EVENT_CATEGORIES.REDIRECTION, EVENT_ACTIONS.AUTO_REDIRECT, `Property ID: ${propertyId}, Provider: ${partnerName}, URL: ${url}${propertyName ? `, Property Name: ${propertyName}` : ''}`);
163
- }
164
- // Redirect after countdown finishes
165
- window.location.href = url || '';
166
- return 0;
167
- }
168
- return prev - 1;
169
- });
170
- }, 1000);
171
- return () => clearInterval(timer);
172
- };
173
- const handleManualRedirect = () => {
174
- if (redirectUrl) {
175
- // Track manual click event if enabled
176
- {
177
- trackEvent(EVENT_CATEGORIES.REDIRECTION, EVENT_ACTIONS.MANUAL_CLICK, `Property ID: ${propertyId}, Provider: ${partnerName}, URL: ${redirectUrl}${propertyName ? `, Property Name: ${propertyName}` : ''}`, countdown);
178
- }
179
- window.location.href = redirectUrl;
180
- }
181
- };
182
- // Regular waiting page UI once we have the URL
183
- return jsx("div", {
184
- className: "flex flex-col items-center justify-center min-h-screen bg-gray-50 p-4",
185
- children: jsxs("div", {
186
- className: "max-w-3xl w-full bg-white rounded-lg shadow-lg p-8 text-center",
187
- children: [jsx("h1", {
188
- className: "text-2xl font-bold mb-6",
189
- children: "Thank you, almost there..."
190
- }), jsxs("div", {
191
- className: "flex justify-center items-center space-x-8 mb-10",
192
- children: [jsxs("div", {
193
- className: "text-center",
194
- children: [jsx("img", {
195
- src: "https://pbs.twimg.com/profile_images/1687470682165112833/egFUxwF-_400x400.jpg",
196
- alt: "Our Logo",
197
- className: "w-32 h-auto mb-2"
198
- }), jsx("p", {
199
- children: "You've found your property"
200
- })]
201
- }), jsxs("div", {
202
- className: "flex items-center",
203
- children: [jsx("div", {
204
- className: "w-12 h-12 bg-blue-500 rounded-full flex items-center justify-center text-white",
205
- children: jsx("svg", {
206
- xmlns: "http://www.w3.org/2000/svg",
207
- className: "h-6 w-6",
208
- fill: "none",
209
- viewBox: "0 0 24 24",
210
- stroke: "currentColor",
211
- children: jsx("path", {
212
- strokeLinecap: "round",
213
- strokeLinejoin: "round",
214
- strokeWidth: 2,
215
- d: "M14 5l7 7m0 0l-7 7m7-7H3"
216
- })
217
- })
218
- }), jsx("div", {
219
- className: "w-16 h-2 bg-gray-200",
220
- children: jsx("div", {
221
- className: "h-full bg-blue-500",
222
- style: {
223
- width: `${countdown / redirectDelay * 100}%`
224
- }
225
- })
226
- }), jsx("div", {
227
- className: "w-12 h-12 bg-gray-200 rounded-full flex items-center justify-center text-gray-500",
228
- children: jsx("svg", {
229
- xmlns: "http://www.w3.org/2000/svg",
230
- className: "h-6 w-6",
231
- fill: "none",
232
- viewBox: "0 0 24 24",
233
- stroke: "currentColor",
234
- children: jsx("path", {
235
- strokeLinecap: "round",
236
- strokeLinejoin: "round",
237
- strokeWidth: 2,
238
- d: "M14 5l7 7m0 0l-7 7m7-7H3"
239
- })
240
- })
241
- })]
242
- }), jsxs("div", {
243
- className: "text-center",
244
- children: [jsx("img", {
245
- src: partnerLogo || '/images/partner-logo.png',
246
- alt: "Partner Logo",
247
- className: "w-32 h-auto mb-2"
248
- }), jsxs("p", {
249
- children: ["Now complete your booking with", jsx("br", {}), "the property provider ", partnerName]
250
- })]
251
- })]
252
- }), jsxs("p", {
253
- className: "mb-4",
254
- children: ["You will be redirected in ", jsx("span", {
255
- className: "font-bold",
256
- children: countdown
257
- }), " seconds"]
258
- }), jsx("button", {
259
- onClick: handleManualRedirect,
260
- className: "px-6 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors",
261
- children: "Continue Now"
262
- }), jsxs("p", {
263
- className: "mt-8 text-sm text-gray-500",
264
- children: ["If you are not redirected to ", partnerName || 'the provider', " in a few seconds, please", ' ', jsx("a", {
265
- href: redirectUrl,
266
- className: "text-blue-600 hover:underline",
267
- onClick: () => {
268
- {
269
- trackEvent(EVENT_CATEGORIES.REDIRECTION, EVENT_ACTIONS.LINK_CLICK, `Property ID: ${propertyId}, Provider: ${partnerName}, URL: ${redirectUrl}${propertyName ? `, Property Name: ${propertyName}` : ''}`, countdown);
270
- }
271
- },
272
- children: "click here"
273
- }), "."]
274
- })]
275
- })
276
- });
277
- };export{DeepLinkWaitingPage as default};//# sourceMappingURL=DeepLinkWaitingPage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DeepLinkWaitingPage.js","sources":["../../../src/components/DeepLinkWaitingPage/DeepLinkWaitingPage.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"wjBAYA,MAAM,mBAAmB,GAAuC,CAAC;AAI7D,EAAA,aAAmB,GAAA,CAAA;AACnB,EAAA,iBAAkB,GAAA,MAAK,CAAA;MACjB;QACA,CAAA,YAAY,CAAA,GAAgB,iBAAI;QAChC;IACN;MACM,SAAY,EAAA;QACZ,CAAA,SAAa,EAAA,YAAiB,CAAA,GAAA,QAAI,CAAQ,aAAK,CAAA;QAEzB,CAAA,WAAA,EAAA,cAAA,CAAA,GAAA,QAAA,CAAA,EAAA,CAAA;AAC5B,EAAA,MAAA,CAAA,SAAgB,EAAA,YAAgB,CAAA,GAAA,QAAQ,CAAA,KAAA,CAAA;AACxC,EAAA,MAAA,CAAA,WAAiB,EAAA,cAAgB,CAAA,WAAS,CAAA,EAAA,CAAA;AAC1C,EAAA,MAAA,CAAA,WAAmB,EAAA,cAAgB,CAAA,GAAC,SAAS,EAAC,CAAA;QAEO,CAAA,YAAA,EAAA,eAAA,CAAA,GAAA,QAAA,CAAA,EAAA,CAAA;AACrD;QACI,UAAO,GAAA,aAAA,CAAA,MAAA;mBACG,GAAA,aAAA,CAAA,OAAA;qBACI,GAAA,aAAA,CAAA,SAAA;WAc6B,CAAA,MAAA;;IAEjB;YACpB,CAAA,iBAAmB,CAAA;;;aAIN,GAAA,YAAC,CAAQ,GAAA,CAAA,aAAE,CAAA;UAC7B,IAAA,GAAA,YAAA,CAAA,GAAA,CAAA,aAAA,CAAA;AAED,IAAA,MAAA,IAAO,GAAA,YAAc,CAAA,GAAG,CAAA,aAAA,CAAA;kBACR,GAAA,YAAO,CAAA,GAAA,CAAA,cAAA,CAAA;gBACsB,EAAA;qBACnC,CAAA,QAAY;;gBAEZ,SAAA;AACN,MAAA,YAAM,CAAM,IAAA,CAAA;AACZ;YAEA,YAAqC,GAAA,YAAA,CAAA,GAAA,CAAA,cAAA,CAAA;AACrC,MAAA,MAAA,OAAA,GAAA,YAAmB,CAAA,GAAA,CAAA,SAAY,CAAA;YAClC,QAAA,GAAA,YAAA,CAAA,GAAA,CAAA,UAAA,CAAA;kBAAU,WAAM,CAAA,YAAA,CAAA,GAAA,CAAA,QAAA,CAAA,IAAA,GAAA,EAAA,EAAA,CAAA;YACb,QAAc,GAAA,QAAK,CAAC,YAAA,CAAA,GAAA,CAAA,UAAA,CAAA,IAAA,GAAA,EAAA,EAAA,CAAA;AACpB;AACA,MAAA,kBAAA,CAAA,UAAuB,EAAE,YAAE,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA;eACb,GAAA,EAAA;oBACjB,CAAA,GAAA,CAAA;oBAE4B,CAAA,IAAA,IAAA,EAAA,CAAA;oBACzB,CAAA,IAAA,IAAiB,EAAA,CAAA;AACjB,MAAA,cAAA,CAAA,GAAA,CAAa;;;AAIrB;AACI,MAAA,aAAe,CAAA,MAAA,CAAI,QAAC,CAAA,QAAe,EAAA,CAAA,mCAAA,EAAA,UAAA,IAAA,SAAA,CAAA,CAAA,CAAA;AAC/B;kBACO,EAAA,aAAA,EAAA,UAAA,EAAA,iBAAA,CAAA,CAAA;QACX,kBAAC,GAAA,OAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,KAAA;AAED,IAAA,IAAA,CAAA,UAAK,IAAA,CAAA,YAAA,EAAA;aACG,CAAA,KAAA,CAAA,6BAAiB,CAAA;;;;qBAKa,GAAA,EAAA;qBAC1B,GAAA,EAAA;AACJ,MAAA,IAAA,WAAK,GAAgB,EAAA;AACjB,MAAA,IAAA,YAAA,GAAK,EAAA;;AAED,MAAA,QAAA,YAAA;6BAGW;;;uBAEN,GAAA,CAAA,6BAAQ,EAAA,UAAA,CAAA,UAAA,EAAA,OAAA,CAAA,WAAA,EAAA,QAAA,CAAA,QAAA,EAAA,MAAA,GAAA,QAAA,IAAA,CAAA,CAAA,CAAA;AACb,YAAA,WAAA,GAAA,YAAc;0BAC+D,UAAA;AAC7E,WAAA,CAAA,OAAA,KAAA,EAAA;yBACW,CAAA,gCAAgB,EAAA,KAAA,CAAA;;uBAE9B,GAAA,CAAA,6BAAA,EAAA,UAAA,CAAA,CAAA;uBACK,GAAA,YAAA;AAEV,YAAA,WAAsB,GAAA,UAAA;;AAElB,UAAA;AAQA,QAAA,KAAA,iBAAW;;AAEP,UAAA,MAAA,cAAA,GAAA,MAA4B,wBAAU,CAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA;2DACV,CAAA;4BACjB,IAAA,oBAAe,EAAA,GAAA,EAAA;AAC1B,YAAA,WAAA,GAAA,mBAAmB,CAAA,GAAK;AACpB,YAAA,WAAA,GAAA,aAAA;0BACH,WAAA;8BACJ,CAAA,IAAA,CAAA,IAAA,EAAA;0BAAO,GAAA,cAAA,CAAA,IAAA,CAAA,IAAA;;AAEJ,WAAA,MAAA;AACA;AACA,YAAA,MAAA,0BAAoB,YAAiB,QAAA,GAAM,OAAA,GAAA,EAAA;mCAEhC,GAAG;6BACH,GAAA,MAAG,eAAc,CAAA;0BACjB,CAAA,qPAAe,EAAA,UAAA,CAAA,SAAA,EAAA,gBAAA,CAAA,UAAA,EAAA,iBAAA,CAAA,kCAAA,EAAA,MAAA,CAAA,gBAAA,EAAA,QAAA,CAAA,4BAAA,EAAA,UAAA,CAAA,uBAAA,EAAA,MAAA,CAAA,cAAA,EAAA,QAAA,CAAA,mEAAA,EAAA,UAAA,CAAA,wEAAA,CAAA;uBAC7B,GAAA,aAAA;uBACK,GAAA,WAAA;AAEV;;AAEI,QAAA,KAAA;AACA;gCACU,GAAA,MAAY,0BAAiB,CAAA,UAAA,CAAoB;AACvD,UAAA,IAAA,oCAA0B,CAAC,oBAAgB,EAAA;AACvC,YAAA,MAAA,SAAA,GAAA,gBAAc,CAAA,oBAAwB,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA;6BAC3B,SAAA,CAAA;4BACX,SAAW,CAAA;AACX,cAAA,WAAA,GAAA,eAAkB;AACd,cAAA,WAAA,GAAA,aAAA;4BACJ,IAAC,EAAA;4BACJ,GAAA,SAAA,CAAA,IAAA;;;;AAGG,cAAA,MAAA,MAAA,GAAA,EAAA;AACA,cAAA,MAAA,WAAA,GAAM,OAAY,OAAA,KAAU,QAAA,GAAQ,OAAa,GAAA,EAAA;gCAC3C,GAAA,OAAA,QAAc,KAAA,QAAA,GAAA,QAAA,GAAA,EAAA;AACpB,cAAA,MAAA,SAAA,GAAA,CAAA;AAEA,cAAA,MAAA,UAAA,GAAA,MAAW,IAAyC,CAAA;4BACpD,CAAW,mCAAmB,EAAA,UAAA,CAAA,MAAA,EAAA,WAAA,CAAA,IAAA,EAAA,YAAA,CAAA,OAAA,EAAA,SAAA,CAAA,QAAA,EAAA,UAAA,CAAA,QAAA,EAAA,MAAA,CAAA,aAAA,EAAA,UAAA,CAAA,CAAA;4BAC9B;yBACH,GAAA,aAAA;;;AAIT,UAAA;AACI,QAAA;qBACW,GAAA,CAAA,sBAAgB,CAAC,CAAA;qBACtB,GAAA,aAAA;;;;qBAKN,EAAA;AACA,QAAA,IAAA,gBAAA,CAAA,OACI,IAAA,gBAAiB,CAAA,WACjB,CAAA,YAAc,EAAA;oBAKrB,CAAA,gBAAA,CAAA,WAAA,EAAA,aAAA,CAAA,aAAA,EAAA,CAAA,aAAA,EAAA,UAAA,CAAA,YAAA,EAAA,WAAA,CAAA,OAAA,EAAA,WAAA,CAAA,EAAA,YAAA,GAAA,CAAA,iBAAA,EAAA,YAAA,CAAA,CAAA,GAAA,EAAA,CAAA,CAAA,CAAA;;sBAGa,CAAA,WAAY,CAAA;sBACZ,CAAA,WAAY,CAAA;sBACtB,CAAA,WAAc,CAAC;wBACA,EAAA;yBAClB,CAAA,YAAA,CAAA;;oBAGuC,CAAA,KAAA,CAAA;;sBAE3C,CAAA,WAAA,CAAA;;AACG,QAAA,OAAA,CAAA,KAAA,CAAA,iCAAc,CAAA;;aAErB,KAAA,EAAA;aAAQ,CAAA,KAAA,CAAK,kCAAG,EAAA,KAAA,CAAA;AACb,MAAyD;kBACrD,CAAA,gBAAiB,CAAA,KAAW,EAAA,aAAA,CAAA,SAA4B,EAAA,CAAA,aAAU,EAAA,UAAA,CAAA,QAAA,EAAA,YAAA,CAAA,CAAA,CAAA;AAClE;;;AAOZ,EAAA,MAAE,cAAA,GAAA,GAAA,IAAA;AAEF;UACsB,KAAA,GAAA,WAAA,CAAA,MAAA;AAClB,MAAA,YAAW,CAAA,IAAc,IAAA;AACrB,QAAA,IAAA,IAAA,IAAA,CAAA,EAAA;AACI,UAAA,aAAQ,CAAA,KAAK,CAAA;;UAE8B;sBACnC,CAAA,gBAAA,CAAgB,WAAY,EAAA,aAAA,CAAA,aAA4B,EAAa,CAAA,aAAG,EAAA,UAAA,CAAA,YAAA,EAAA,WAAA,CAAA,OAAA,EAAA,GAAA,CAAA,EAAA,YAAA,GAAA,CAAA,iBAAA,EAAA,YAAA,CAAA,CAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AACxE;;yBAQgC,CAAA,IAAA,GAAA,GAAA,IAAA,EAAA;;AAEpC;mBACH,GAAA,CAAA;;AAEL,KAAA,EAAA,IAAA,CAAA;WACD,MAAM,aAAA,CAAA,KAAA,CAAA;AAET,GAAA;AACJ,EAAA,MAAE,oBAAA,GAAA,MAAA;IAEF,IAAM,WAAA,EAAA;;MAEwC;kBAClC,CAAA,gBAAiB,CAAA,WAAW,EAAA,aAA4B,CAAA,YAAO,EAAA,CAAA,aAAG,EAAA,UAAA,CAAA,YAAA,EAAA,WAAA,CAAA,OAAA,EAAA,WAAA,CAAA,EAAA,YAAA,GAAA,CAAA,iBAAA,EAAA,YAAA,CAAA,CAAA,GAAA,EAAA,CAAA,CAAA,EAAA,SAAA,CAAA;AAClE;YAQJ,CAAC,QAAA,CAAA,IAAA,GAAA,WAAA;AACD;;AAER;SAE+CA,GAAA,CAAA,KAAA,EAAA;IAC/C,SACS,EAAA,uEAAU;;AAuFS,MAAA,SAAA,EAAA,gEAEI;;AAOZ,QAAA,SAAA,EAAA,yBAGA;AAMxB,QAAE,QAAA,EAAA;AAEF,OAAA,CAAA,EAAAC,IAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,55 +0,0 @@
1
- import {config}from'./env-config.js';/**
2
- * Google Analytics Configuration
3
- */
4
- // Configuration for analytics tracking
5
- const ANALYTICS_CONFIG = {
6
- // Enable or disable analytics tracking
7
- enabled: true,
8
- // Enable or disable debugging messages in console
9
- debug: process.env.NODE_ENV === 'development',
10
- // GA4 Measurement ID
11
- GA4_MEASUREMENT_ID: config.GOOGLE_ANALYTICS_ID,
12
- // Configure what events to track
13
- trackEvents: {
14
- pageViews: true,
15
- clicks: true,
16
- redirections: true,
17
- errors: true
18
- },
19
- // Configure what user properties to track
20
- trackUserProperties: {
21
- userId: true,
22
- deviceInfo: true,
23
- location: false // Be careful with privacy regulations like GDPR
24
- }
25
- };
26
- // Analytics event categories
27
- const EVENT_CATEGORIES = {
28
- REDIRECTION: 'Redirection',
29
- USER_INTERACTION: 'User Interaction',
30
- SYSTEM: 'System',
31
- ERROR: 'Error'
32
- };
33
- // Analytics event actions
34
- const EVENT_ACTIONS = {
35
- // Redirections
36
- AUTO_REDIRECT: 'Auto Redirect',
37
- MANUAL_CLICK: 'Manual Click',
38
- LINK_CLICK: 'Link Click',
39
- // User interactions
40
- BUTTON_CLICK: 'Button Click',
41
- FORM_SUBMIT: 'Form Submit',
42
- SEARCH: 'Search',
43
- VIEW_ITEM: 'View Item',
44
- ADD_TO_CART: 'Add to Cart',
45
- REMOVE_FROM_CART: 'Remove from Cart',
46
- BEGIN_CHECKOUT: 'Begin Checkout',
47
- ADD_PAYMENT_INFO: 'Add Payment Info',
48
- PURCHASE: 'Purchase',
49
- // System
50
- LOAD: 'Load',
51
- INIT: 'Initialize',
52
- // Errors
53
- API_ERROR: 'API Error',
54
- CLIENT_ERROR: 'Client Error'
55
- };export{ANALYTICS_CONFIG,EVENT_ACTIONS,EVENT_CATEGORIES};//# sourceMappingURL=analytics-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analytics-config.js","sources":["../../src/config/analytics-config.ts"],"sourcesContent":[null],"names":[],"mappings":"qCAAA;;AAEG;AAIH;AACa,MAAA,gBAAgB,GAAG;;AAE5B,EAAA,OAAA,EAAO,IAAM;;AAGb,EAAA,KAAA,EAAK,OAAS,CAAA,YAAK,kBAA0B;;oBAG3B,EAAA,MAAQ,CAAA,mBAAoB;;AAG9C,EAAA,WAAA,EAAW;AACP,IAAA,SAAA,EAAA,IAAW;AACX,IAAA,MAAA,EAAA,IAAQ;AACR,IAAA,YAAA,EAAA,IAAc;AACd,IAAA,MAAA,EAAA;AACH,GAAA;;AAGD,EAAA,mBAAA,EAAmB;AACf,IAAA,MAAA,EAAA,IAAQ;AACR,IAAA,UAAA,EAAA,IAAY;YACJ,EAAA,KAAO;AAClB;;AAGL;AACa,MAAA,gBAAgB,GAAG;AAC5B,EAAA,WAAA,EAAW,aAAe;AAC1B,EAAA,gBAAA,EAAgB,kBAAoB;AACpC,EAAA,MAAA,EAAM,QAAU;AAChB,EAAA,KAAA,EAAK;;AAGT;AACa,MAAA,aAAa,GAAG;;AAEzB,EAAA,aAAA,EAAa,eAAiB;AAC9B,EAAA,YAAA,EAAY,cAAgB;AAC5B,EAAA,UAAA,EAAU,YAAc;;AAGxB,EAAA,YAAA,EAAY,cAAgB;AAC5B,EAAA,WAAA,EAAW,aAAe;AAC1B,EAAA,MAAA,EAAM,QAAU;AAChB,EAAA,SAAA,EAAS,WAAa;AACtB,EAAA,WAAA,EAAW,aAAe;AAC1B,EAAA,gBAAA,EAAgB,kBAAoB;AACpC,EAAA,cAAA,EAAc,gBAAkB;AAChC,EAAA,gBAAA,EAAgB,kBAAoB;AACpC,EAAA,QAAA,EAAQ,UAAY;;AAGpB,EAAA,IAAA,EAAI,MAAQ;AACZ,EAAA,IAAA,EAAI,YAAc;;AAGlB,EAAA,SAAA,EAAS,WAAa;AACtB,EAAA,YAAA,EAAY;"}
@@ -1,37 +0,0 @@
1
- /**
2
- * API Configuration
3
- * Centralized configuration for all API-related settings
4
- */
5
- export declare const RAPID_API_KEY: string;
6
- export declare const BOOKING_API: {
7
- BASE_URL: string;
8
- HOST: string;
9
- };
10
- export declare const PRICELINE_API: {
11
- BASE_URL: string;
12
- HOST: string;
13
- DEFAULT_PARAMS: {
14
- guest_score_breakdown: string;
15
- videos: string;
16
- important_info: string;
17
- sid: string;
18
- id_lookup: string;
19
- plugins: string;
20
- promo: string;
21
- nearby: string;
22
- recent: string;
23
- photos: string;
24
- reviews: string;
25
- };
26
- };
27
- export declare const PARTNER_LOGOS: {
28
- AIRBNB: string;
29
- BOOKING: string;
30
- PRICELINE: string;
31
- };
32
- export declare const formatDate: (date: Date) => string;
33
- export declare const getDefaultDates: () => {
34
- arrival: string;
35
- departure: string;
36
- };
37
- //# sourceMappingURL=api.config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.config.d.ts","sourceRoot":"","sources":["../../src/config/api.config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,eAAO,MAAM,aAAa,QAAuB,CAAC;AAGlD,eAAO,MAAM,WAAW;;;CAGvB,CAAC;AAGF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;CAgBzB,CAAC;AAGF,eAAO,MAAM,aAAa;;;;CAMzB,CAAC;AAGF,eAAO,MAAM,UAAU,GAAI,MAAM,IAAI,KAAG,MAKvC,CAAC;AAGF,eAAO,MAAM,eAAe;;;CAS3B,CAAC"}
@@ -1,52 +0,0 @@
1
- import {config}from'./env-config.js';/**
2
- * API Configuration
3
- * Centralized configuration for all API-related settings
4
- */
5
- // RapidAPI Key
6
- const RAPID_API_KEY = config.RAPID_API_KEY;
7
- // Booking.com API
8
- const BOOKING_API = {
9
- BASE_URL: 'https://booking-com15.p.rapidapi.com/api/v1/hotels/getHotelDetails',
10
- HOST: 'booking-com15.p.rapidapi.com'
11
- };
12
- // Priceline API
13
- const PRICELINE_API = {
14
- BASE_URL: 'https://priceline-com-provider.p.rapidapi.com/v2/hotels/details',
15
- HOST: 'priceline-com-provider.p.rapidapi.com',
16
- DEFAULT_PARAMS: {
17
- guest_score_breakdown: 'true',
18
- videos: 'true',
19
- important_info: 'true',
20
- sid: 'iSiX639',
21
- id_lookup: 'true',
22
- plugins: 'true',
23
- promo: 'true',
24
- nearby: 'true',
25
- recent: 'true',
26
- photos: 'true',
27
- reviews: 'true'
28
- }
29
- };
30
- // Partner Logos
31
- const PARTNER_LOGOS = {
32
- AIRBNB: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/69/Airbnb_Logo_B%C3%A9lo.svg/512px-Airbnb_Logo_B%C3%A9lo.svg.png',
33
- BOOKING: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Booking.com_logo.svg/1920px-Booking.com_logo.svg.png',
34
- PRICELINE: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Priceline.com_logo.svg/1920px-Priceline.com_logo.svg.png'
35
- };
36
- // Date formatting helper
37
- const formatDate = date => {
38
- const year = date.getFullYear();
39
- const month = String(date.getMonth() + 1).padStart(2, '0');
40
- const day = String(date.getDate()).padStart(2, '0');
41
- return `${year}-${month}-${day}`;
42
- };
43
- // Get default dates (today and today + 2 days)
44
- const getDefaultDates = () => {
45
- const today = new Date();
46
- const twoDaysLater = new Date(today);
47
- twoDaysLater.setDate(today.getDate() + 2);
48
- return {
49
- arrival: formatDate(today),
50
- departure: formatDate(twoDaysLater)
51
- };
52
- };export{BOOKING_API,PARTNER_LOGOS,PRICELINE_API,RAPID_API_KEY,formatDate,getDefaultDates};//# sourceMappingURL=api.config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.config.js","sources":["../../src/config/api.config.ts"],"sourcesContent":[null],"names":[],"mappings":"qCAAA;;;AAGG;AAIH;AACa,MAAA,aAAa,GAAG,MAAM,CAAC;AAEpC;AACa,MAAA,WAAW,GAAG;AACvB,EAAA,QAAA,EAAQ,oEAAsE;AAC9E,EAAA,IAAA,EAAI;;AAGR;AACa,MAAA,aAAa,GAAG;AACzB,EAAA,QAAA,EAAQ,iEAAmE;AAC3E,EAAA,IAAA,EAAI,uCAAyC;AAC7C,EAAA,cAAA,EAAc;AACV,IAAA,qBAAA,EAAA,MAA6B;AAC7B,IAAA,MAAA,EAAA,MAAc;AACd,IAAA,cAAA,EAAA,MAAsB;AACtB,IAAA,GAAA,EAAA,SAAc;AACd,IAAA,SAAA,EAAA,MAAiB;AACjB,IAAA,OAAA,EAAA,MAAe;AACf,IAAA,KAAA,EAAA,MAAa;AACb,IAAA,MAAA,EAAA,MAAc;AACd,IAAA,MAAA,EAAA,MAAc;AACd,IAAA,MAAA,EAAA,MAAc;AACd,IAAA,OAAA,EAAA;AACH;;AAGL;AACa,MAAA,aAAa,GAAG;AACzB,EAAA,MAAA,EAAM,yHAA2H;AACjI,EAAA,OAAA,EAAO,gHAC6G;AACpH,EAAA,SAAA,EAAS;;AAIb;AACa,MAAA,UAAU,GAAG,IAAC,IAAsB;AAC7C,EAAA,MAAA,OAAa,IAAA,CAAA,WAAK,EAAW;AAC7B,EAAA,MAAA,QAAc,MAAA,CAAA,IAAW,CAAA,UAAS,GAAE,CAAA,CAAG,CAAC,QAAU,CAAA,CAAA,EAAE,GAAE,CAAA;AACtD,EAAA,MAAA,MAAY,MAAA,CAAA,IAAO,CAAA,OAAY,EAAA,CAAA,CAAE,UAAU,EAAE,GAAE,CAAA;AAC/C,EAAA,OAAA,CAAA,MAAc,CAAA,CAAA,EAAA,OAAS,EAAI,GAAA,CAAA,CAAG;AAClC;AAEA;AACO,MAAM,eAAe,GAAG,MAAK;AAChC,EAAA,MAAA,KAAW,GAAA,IAAO,IAAA,EAAI;AACtB,EAAA,MAAA,eAAqB,IAAA,UAAS,CAAA;cAClB,CAAA,OAAQ,CAAA,KAAM,CAAA,SAAQ,GAAE,CAAA,CAAG;SAEhC;AACH,IAAA,OAAA,EAAA,UAAS,CAAA,KAAW,CAAA;AACpB,IAAA,SAAA,EAAA,UAAW,CAAA,YAAW;;AAE9B"}
@@ -1,169 +0,0 @@
1
- import ReactGA from'react-ga4';import {ANALYTICS_CONFIG}from'../config/analytics-config.js';let isInitialized = false;
2
- /**
3
- * Initialize Google Analytics
4
- * @param {string} measurementId - Google Analytics measurement ID (GA4)
5
- */
6
- const initGA = measurementId => {
7
- if (!measurementId) {
8
- console.warn('Google Analytics Measurement ID is missing');
9
- return;
10
- }
11
- if (isInitialized) {
12
- if (ANALYTICS_CONFIG.debug) {
13
- console.log('Google Analytics already initialized, skipping');
14
- }
15
- return;
16
- }
17
- try {
18
- ReactGA.initialize(measurementId, {
19
- gaOptions: {
20
- debug_mode: ANALYTICS_CONFIG.debug,
21
- send_page_view: false // We'll manually track the first page view
22
- }
23
- });
24
- isInitialized = true;
25
- if (ANALYTICS_CONFIG.debug) {
26
- console.log('Google Analytics initialized with ID:', measurementId);
27
- }
28
- // Track initial page view
29
- trackPageView(window.location.pathname, document.title);
30
- // Set user properties if enabled
31
- if (ANALYTICS_CONFIG.trackUserProperties.deviceInfo) {
32
- setDeviceInfo();
33
- }
34
- // Listen for analytics events from our XState machines
35
- window.addEventListener('analytics.event', e => {
36
- const analyticsEvent = e.detail;
37
- if (!analyticsEvent || !analyticsEvent.type) return;
38
- // Process the event based on its type
39
- switch (analyticsEvent.type) {
40
- case 'TRACK_EVENT':
41
- trackEvent(analyticsEvent.params?.event_category || 'User Interaction', analyticsEvent.name, analyticsEvent.params?.event_label, analyticsEvent.params?.value);
42
- break;
43
- case 'PAGE_VIEW':
44
- trackPageView(analyticsEvent.params?.page_path || window.location.pathname, analyticsEvent.page || analyticsEvent.params?.page_title);
45
- break;
46
- case 'SEARCH':
47
- trackGA4Event('search', analyticsEvent.params);
48
- break;
49
- case 'VIEW_ITEM':
50
- trackGA4Event('view_item', analyticsEvent.params);
51
- break;
52
- case 'USER_ENGAGEMENT':
53
- trackGA4Event('user_engagement', analyticsEvent.params);
54
- break;
55
- case 'BEGIN_CHECKOUT':
56
- trackGA4Event('begin_checkout', analyticsEvent.params);
57
- break;
58
- case 'ADD_PAYMENT_INFO':
59
- trackGA4Event('add_payment_info', analyticsEvent.params);
60
- break;
61
- case 'PURCHASE':
62
- trackGA4Event('purchase', analyticsEvent.params);
63
- break;
64
- default:
65
- // For other events, track as a custom event
66
- if (analyticsEvent.name) {
67
- trackEvent('Custom', analyticsEvent.name, undefined, undefined);
68
- }
69
- }
70
- });
71
- } catch (error) {
72
- console.error('Error initializing Google Analytics:', error);
73
- }
74
- };
75
- /**
76
- * Track a GA4 standard event
77
- * @param {string} eventName - GA4 event name
78
- * @param {GA4EventParams} eventParams - Event parameters
79
- */
80
- const trackGA4Event = (eventName, eventParams) => {
81
- if (!isInitialized) {
82
- if (ANALYTICS_CONFIG.debug) {
83
- console.warn(`Attempted to track GA4 event ${eventName} before initialization`);
84
- }
85
- return;
86
- }
87
- try {
88
- ReactGA.event(eventName, eventParams);
89
- if (ANALYTICS_CONFIG.debug) {
90
- console.log(`GA4 event tracked: ${eventName}`, eventParams);
91
- }
92
- } catch (error) {
93
- console.error(`Error tracking GA4 event ${eventName}:`, error);
94
- }
95
- };
96
- /**
97
- * Track page views
98
- * @param {string} path - URL path to track
99
- * @param {string} title - Page title
100
- */
101
- const trackPageView = (path, title) => {
102
- if (!isInitialized) {
103
- if (ANALYTICS_CONFIG.debug) {
104
- console.warn('Attempted to track page view before initialization:', path);
105
- }
106
- return;
107
- }
108
- try {
109
- ReactGA.send({
110
- hitType: 'pageview',
111
- page: path,
112
- title,
113
- location: window.location.href
114
- });
115
- if (ANALYTICS_CONFIG.debug) {
116
- console.log(`Page view tracked: ${path}${title ? ` (${title})` : ''}`);
117
- }
118
- } catch (error) {
119
- console.error('Error tracking page view:', error);
120
- }
121
- };
122
- /**
123
- * Track events
124
- * @param {string} category - Event category
125
- * @param {string} action - Event action
126
- * @param {string} label - Event label (optional)
127
- * @param {number} value - Event value (optional)
128
- */
129
- const trackEvent = (category, action, label, value) => {
130
- if (!isInitialized) {
131
- if (ANALYTICS_CONFIG.debug) {
132
- console.warn('Attempted to track event before initialization:', category, action);
133
- }
134
- return;
135
- }
136
- try {
137
- ReactGA.event({
138
- category,
139
- action,
140
- label,
141
- value
142
- });
143
- if (ANALYTICS_CONFIG.debug) {
144
- console.log(`Event tracked: ${category} - ${action}${label ? ` - ${label}` : ''}${value !== undefined ? ` (${value})` : ''}`);
145
- }
146
- } catch (error) {
147
- console.error('Error tracking event:', error);
148
- }
149
- };
150
- /**
151
- * Set device information as user properties
152
- */
153
- const setDeviceInfo = () => {
154
- if (!isInitialized) return;
155
- try {
156
- const deviceInfo = {
157
- screenResolution: `${window.screen.width}x${window.screen.height}`,
158
- viewportSize: `${window.innerWidth}x${window.innerHeight}`,
159
- userAgent: navigator.userAgent,
160
- language: navigator.language
161
- };
162
- ReactGA.set(deviceInfo);
163
- if (ANALYTICS_CONFIG.debug) {
164
- console.log('Device info set:', deviceInfo);
165
- }
166
- } catch (error) {
167
- console.error('Error setting device info:', error);
168
- }
169
- };export{initGA,trackEvent,trackGA4Event,trackPageView};//# sourceMappingURL=analytics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analytics.js","sources":["../../src/utils/analytics.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare const fetchBookingHotelDetails: (hotelId: any, checkIn: any, checkOut: any, adults: any, children: any) => Promise<any>;
2
- //# sourceMappingURL=fetchBookingHotelDetails.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetchBookingHotelDetails.d.ts","sourceRoot":"","sources":["../../src/utils/fetchBookingHotelDetails.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,wBAAwB,GAAU,YAAO,EAAE,YAAO,EAAE,aAAQ,EAAE,WAAM,EAAE,aAAQ,iBAiC1F,CAAC"}
@@ -1,30 +0,0 @@
1
- import'../config/env-config.js';import'../config/analytics-config.js';import {getDefaultDates,BOOKING_API,RAPID_API_KEY}from'../config/api.config.js';// Function to fetch hotel details from RapidAPI
2
- const fetchBookingHotelDetails = async (hotelId, checkIn, checkOut, adults, children) => {
3
- const url = BOOKING_API.BASE_URL;
4
- // Get default dates if not provided
5
- const defaultDates = getDefaultDates();
6
- const arrivalDate = checkIn || defaultDates.arrival;
7
- const departureDate = checkOut || defaultDates.departure;
8
- const params = new URLSearchParams({
9
- hotel_id: hotelId,
10
- arrival_date: arrivalDate,
11
- departure_date: departureDate
12
- });
13
- try {
14
- const response = await fetch(`${url}?${params.toString()}`, {
15
- method: 'GET',
16
- headers: {
17
- 'x-rapidapi-host': BOOKING_API.HOST,
18
- 'x-rapidapi-key': RAPID_API_KEY
19
- }
20
- });
21
- if (!response.ok) {
22
- throw new Error('Failed to fetch hotel details');
23
- }
24
- const data = await response.json();
25
- return data;
26
- } catch (error) {
27
- console.error('Error fetching hotel details:', error);
28
- return null;
29
- }
30
- };export{fetchBookingHotelDetails};//# sourceMappingURL=fetchBookingHotelDetails.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetchBookingHotelDetails.js","sources":["../../src/utils/fetchBookingHotelDetails.ts"],"sourcesContent":[null],"names":[],"mappings":"sJAEA;AACa,MAAA,wBAAwB,GAAG,OAAO,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,KAAI;AAC3F,EAAA,MAAA,GAAS,GAAA,WAAc,CAAA;;AAGvB,EAAA,MAAA,YAAkB,GAAA,eAAkB,EAAA;AACpC,EAAA,MAAA,cAAoB,OAAA,gBAAuB,CAAA;AAC3C,EAAA,MAAA,gBAAsB,QAAA,gBAAwB,CAAA;AAE9C,EAAA,MAAA,MAAY,GAAA,IAAO,eAAA,CAAA;AACf,IAAA,QAAA,EAAA,OAAiB;AACjB,IAAA,YAAA,EAAA,WAAyB;AACzB,IAAA,cAAA,EAAA;AACH,GAAA,CAAA;AAED,EAAA,IAAA;AACI,IAAA,MAAA,QAAc,GAAA,MAAS,KAAA,CAAA,CAAA,EAAK,GAAC,CAAG,CAAG,EAAA,MAAU,CAAA,QAAS,EAAA,CAAA,CAAA,EAAE;AACpD,MAAA,MAAA,EAAA;AACA,MAAA,OAAA,EAAA;yBACqB,EAAA,WAAa,CAAA,IAAA;AAC9B,QAAA,gBAAA,EAAA;AACH;AACJ,KAAA,CAAA;AAED,IAAA,IAAA,CAAA,QAAK,CAAA,EAAA,EAAS;AACV,MAAA,MAAA,IAAA,KAAU,CAAA,+BAAM,CAAA;;AAGpB,IAAA,MAAA,IAAM,SAAO,aAAe,EAAA;AAC5B,IAAA,OAAA,IAAO;IACX,OAAC,KAAA,EAAA;IAAC,OAAO,CAAA,MAAO,+BAAC,EAAA,KAAA,CAAA;AACb,IAAA,OAAA,IAAO;AACP;"}
@@ -1,2 +0,0 @@
1
- export declare const fetchPricelineHotelDetails: (hotelId: any) => Promise<any>;
2
- //# sourceMappingURL=fetchPricelineHotelDetails.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetchPricelineHotelDetails.d.ts","sourceRoot":"","sources":["../../src/utils/fetchPricelineHotelDetails.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,0BAA0B,GAAU,YAAO,iBA0BvD,CAAC"}
@@ -1,25 +0,0 @@
1
- import'../config/env-config.js';import'../config/analytics-config.js';import {PRICELINE_API,RAPID_API_KEY}from'../config/api.config.js';// Function to fetch Priceline property details
2
- const fetchPricelineHotelDetails = async hotelId => {
3
- const url = PRICELINE_API.BASE_URL;
4
- const params = new URLSearchParams({
5
- hotel_id: hotelId,
6
- ...PRICELINE_API.DEFAULT_PARAMS
7
- });
8
- try {
9
- const response = await fetch(`${url}?${params.toString()}`, {
10
- method: 'GET',
11
- headers: {
12
- 'x-rapidapi-host': PRICELINE_API.HOST,
13
- 'x-rapidapi-key': RAPID_API_KEY
14
- }
15
- });
16
- if (!response.ok) {
17
- throw new Error('Failed to fetch Priceline property details');
18
- }
19
- const data = await response.json();
20
- return data;
21
- } catch (error) {
22
- console.error('Error fetching Priceline property details:', error);
23
- return null;
24
- }
25
- };export{fetchPricelineHotelDetails};//# sourceMappingURL=fetchPricelineHotelDetails.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetchPricelineHotelDetails.js","sources":["../../src/utils/fetchPricelineHotelDetails.ts"],"sourcesContent":[null],"names":[],"mappings":"wIAEA;MACa,0BAA0B,GAAG,MAAO,OAAA,IAAW;AACxD,EAAA,MAAA,GAAS,GAAA,aAAgB,CAAA;AACzB,EAAA,MAAA,MAAY,GAAA,IAAO,eAAA,CAAA;AACf,IAAA,QAAA,EAAA,OAAiB;oBACd,CAAA;AACN,GAAA,CAAA;AAED,EAAA,IAAA;AACI,IAAA,MAAA,QAAc,GAAA,MAAS,KAAA,CAAA,CAAA,EAAK,GAAC,CAAG,CAAG,EAAA,MAAU,CAAA,QAAS,EAAA,CAAA,CAAA,EAAE;AACpD,MAAA,MAAA,EAAA;AACA,MAAA,OAAA,EAAA;yBACqB,EAAA,aAAe,CAAA,IAAA;AAChC,QAAA,gBAAA,EAAA;AACH;AACJ,KAAA,CAAA;AAED,IAAA,IAAA,CAAA,QAAK,CAAA,EAAA,EAAS;AACV,MAAA,MAAA,IAAA,KAAU,CAAA,4CAAM,CAAA;;AAGpB,IAAA,MAAA,IAAM,SAAO,aAAe,EAAA;AAC5B,IAAA,OAAA,IAAO;IACX,OAAC,KAAA,EAAA;IAAC,OAAO,CAAA,MAAO,4CAAC,EAAA,KAAA,CAAA;AACb,IAAA,OAAA,IAAO;AACP;"}