@sartech/ai-chat-agent 0.1.0
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.
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +11074 -0
- package/dist/index.js.map +1 -0
- package/dist/style.css +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/context/SocketContext.jsx","../src/components/flight-results/helpers.js","../src/components/flight-results/CancellationPolicy.jsx","../src/components/flight-results/FlightResultCardBase.jsx","../src/components/flight-results/FlightResultCardOneWay.jsx","../src/components/flight-results/FlightResultCardOnward.jsx","../src/components/flight-results/FlightResultCardReturn.jsx","../src/components/flight-results/FlightFarePanels.jsx","../src/components/flight-results/FlightResultCardRoundTripCombined.jsx","../src/components/flight-results/FlightResultCards.jsx","../src/components/flight-results/FlightResultsOneWay.jsx","../src/components/flight-results/FlightResultsRoundTripSplit.jsx","../src/components/flight-results/FlightResultsRoundTripCombined.jsx","../src/components/flight-results/SmartFiltersUtils.js","../src/components/FlightResults.jsx","../src/components/TravelerDetailsForm.jsx","../src/components/PaymentConfirmationCard.jsx","../src/components/FlightSummary.jsx","../src/components/PaymentGatewayOptions.jsx","../src/components/MessageList.jsx","../src/utils/dateFormats.js","../src/components/MessageInput.jsx","../src/services/speechService.js","../src/hooks/useConversation.js","../src/components/VoiceAssistant.jsx","../src/components/ChatWindow.jsx","../src/AIChatAgent.jsx","../src/utils/prebookPayload.js"],"sourcesContent":["import { createContext, useContext } from 'react';\r\n\r\nexport const SocketContext = createContext(null);\r\n\r\nexport function useSocket() {\r\n const socket = useContext(SocketContext);\r\n if (socket == null) {\r\n throw new Error(\r\n '[@sartech/ai-chat-agent] Missing socket. Wrap the tree with <AIChatAgent socket={yourSocketIoClient}> (or set SocketContext.Provider).',\r\n );\r\n }\r\n return socket;\r\n}\r\n","import airlinesData from '../../constants/airlinesData.json';\r\n\r\nexport function normalizeRmkeyList(value) {\r\n if (Array.isArray(value)) {\r\n return value.map((item) => String(item || '').trim()).filter(Boolean);\r\n }\r\n const single = String(value || '').trim();\r\n return single ? [single] : [];\r\n}\r\n\r\nexport function getCurrencySymbol(currencyCode) {\r\n const code =\r\n String(currencyCode || 'INR')\r\n .trim()\r\n .toUpperCase() || 'INR';\r\n const currencySymbols = {\r\n INR: '₹',\r\n USD: '$',\r\n EUR: '€',\r\n GBP: '£',\r\n AED: 'د.إ',\r\n SAR: '﷼',\r\n JPY: '¥',\r\n CNY: '¥',\r\n AUD: 'A$',\r\n CAD: 'C$',\r\n SGD: 'S$',\r\n };\r\n return currencySymbols[code] || code;\r\n}\r\n\r\n/**\r\n * Fare-availability payload for split round-trip after user picks one onward\r\n * and one return card from the same search item (same payloadIndex).\r\n */\r\nexport function buildSplitPairedFareAvailabilityPayload(\r\n onwardFlight,\r\n returnFlight,\r\n) {\r\n if (!onwardFlight || !returnFlight) return null;\r\n if (Number(onwardFlight.payloadIndex) !== Number(returnFlight.payloadIndex)) {\r\n return null;\r\n }\r\n const onwardRmkeyList = normalizeRmkeyList(onwardFlight?.rmkey);\r\n const returnRmkeyList = normalizeRmkeyList(returnFlight?.rmkey);\r\n const rmkeyList = [...onwardRmkeyList, ...returnRmkeyList].filter(\r\n (item, idx, arr) => item && arr.indexOf(item) === idx,\r\n );\r\n const rukey = String(onwardFlight?.rukey || returnFlight?.rukey || '').trim();\r\n const onwardApcoup = String(onwardFlight?.apcoup ?? '0');\r\n const returnApcoup = String(\r\n returnFlight?.apcoup ??\r\n returnFlight?.rtapcoup ??\r\n onwardFlight?.rtapcoup ??\r\n '0',\r\n );\r\n return {\r\n ukey: String(onwardFlight?.ukey || '').trim(),\r\n rukey,\r\n rmkey: rmkeyList,\r\n rtrmkey: returnRmkeyList,\r\n styp: String(onwardFlight?.styp || 'Normal').trim(),\r\n apcoup: onwardApcoup,\r\n rtapcoup: returnApcoup,\r\n };\r\n}\r\n\r\nexport function getAirlinesMap() {\r\n const map = {};\r\n airlinesData.forEach((item) => {\r\n if (item?.code) {\r\n map[String(item.code).toUpperCase()] = item.english;\r\n }\r\n });\r\n return map;\r\n}\r\n\r\nfunction pickAirportCode(mappingItem = {}) {\r\n const candidate = [\r\n mappingItem?.code,\r\n mappingItem?.iata,\r\n mappingItem?.airportCode,\r\n mappingItem?.ac,\r\n ].find((value) => String(value || '').trim());\r\n return String(candidate || '')\r\n .trim()\r\n .toUpperCase();\r\n}\r\n\r\nfunction pickAirportName(mappingItem = {}) {\r\n const candidate = [\r\n mappingItem?.name,\r\n mappingItem?.airportName,\r\n mappingItem?.airport,\r\n mappingItem?.label,\r\n mappingItem?.value,\r\n mappingItem?.nm,\r\n mappingItem?.english,\r\n ].find((value) => String(value || '').trim());\r\n return String(candidate || '').trim();\r\n}\r\n\r\nexport function buildAirportMappings(rawMappings) {\r\n const map = {};\r\n if (!Array.isArray(rawMappings)) return map;\r\n rawMappings.forEach((mappingItem) => {\r\n if (!mappingItem || typeof mappingItem !== 'object') return;\r\n const code = pickAirportCode(mappingItem);\r\n const name = pickAirportName(mappingItem);\r\n if (code && name) {\r\n map[code] = name;\r\n }\r\n });\r\n return map;\r\n}\r\n\r\nexport function getAirportNameFromMappings(airportMappings = {}, code) {\r\n const normalizedCode = String(code || '')\r\n .trim()\r\n .toUpperCase();\r\n if (!normalizedCode) return '';\r\n return String(airportMappings?.[normalizedCode] || '').trim();\r\n}\r\n\r\nexport function buildTravellerSkeletons({\r\n adt = 1,\r\n chd = 0,\r\n inf = 0,\r\n passportRequired = false,\r\n}) {\r\n const pax = [];\r\n for (let i = 1; i <= Number(adt); i += 1) {\r\n pax.push({\r\n sno: i,\r\n tl: '',\r\n typ: 'ADT',\r\n ldpax: i === 1,\r\n fn: '',\r\n ln: '',\r\n dob: null,\r\n nat: passportRequired ? '' : '',\r\n isc: passportRequired ? '' : '',\r\n num: passportRequired ? '' : '',\r\n expdt: passportRequired ? null : null,\r\n issdt: passportRequired ? null : null,\r\n dtyp: 'P',\r\n extbag: [],\r\n meal: [],\r\n seat: [],\r\n });\r\n }\r\n for (let i = 1; i <= Number(chd); i += 1) {\r\n pax.push({\r\n sno: Number(adt) + i,\r\n tl: '',\r\n typ: 'CHD',\r\n ldpax: false,\r\n fn: '',\r\n ln: '',\r\n dob: null,\r\n nat: passportRequired ? '' : '',\r\n isc: passportRequired ? '' : '',\r\n num: passportRequired ? '' : '',\r\n expdt: passportRequired ? null : null,\r\n issdt: passportRequired ? null : null,\r\n dtyp: 'P',\r\n extbag: [],\r\n meal: [],\r\n seat: [],\r\n });\r\n }\r\n for (let i = 1; i <= Number(inf); i += 1) {\r\n pax.push({\r\n sno: Number(adt) + Number(chd) + i,\r\n tl: '',\r\n typ: 'INF',\r\n ldpax: false,\r\n fn: '',\r\n ln: '',\r\n dob: null,\r\n nat: passportRequired ? '' : '',\r\n isc: passportRequired ? '' : '',\r\n num: passportRequired ? '' : '',\r\n expdt: passportRequired ? null : null,\r\n issdt: passportRequired ? null : null,\r\n dtyp: 'P',\r\n });\r\n }\r\n return pax;\r\n}\r\n\r\nfunction buildFallbackSectorFromCard(card = {}) {\r\n return {\r\n from: card?.origin || '',\r\n to: card?.destination || '',\r\n departureDate: card?.departureDate || '',\r\n arrivalDate: card?.arrivalDate || '',\r\n departureTime: card?.departureTime || '',\r\n arrivalTime: card?.arrivalTime || '',\r\n duration: card?.duration || '',\r\n flightNumber: card?.flightNumber || '',\r\n stops: Number(card?.stops || 0),\r\n };\r\n}\r\n\r\nfunction buildFallbackSelectedFlight(card = {}) {\r\n return {\r\n airlineCode: card?.airlineCode || '',\r\n airlineName: card?.airline || card?.airlineCode || 'N/A',\r\n sectors: [buildFallbackSectorFromCard(card)],\r\n fare: {\r\n baseFare: Number(card?.price || 0) || 0,\r\n totalFare: Number(card?.price || 0) || 0,\r\n surcharges: 0,\r\n currency: card?.currency || 'INR',\r\n },\r\n };\r\n}\r\n\r\nexport function buildFallbackPrebookPayloadFromCard(card = {}) {\r\n const passportRequired = Boolean(card?.passportRequired);\r\n const isRoundTrip =\r\n Number(card?.tt || 1) === 2 || Boolean(card?.returnLeg);\r\n const totalFare = Number(card?.price || 0) || 0;\r\n const onwardFlight = card?.onwardLeg\r\n ? buildFallbackSelectedFlight({\r\n ...card.onwardLeg,\r\n airline: card?.airline,\r\n airlineCode: card?.onwardLeg?.airlineCode || card?.airlineCode,\r\n currency: card?.currency,\r\n price: totalFare,\r\n })\r\n : buildFallbackSelectedFlight(card);\r\n const returnFlight =\r\n isRoundTrip && card?.returnLeg\r\n ? {\r\n ...buildFallbackSelectedFlight({\r\n ...card.returnLeg,\r\n airline: card?.airline,\r\n airlineCode: card?.returnLeg?.airlineCode || card?.airlineCode,\r\n currency: card?.currency,\r\n price: 0,\r\n }),\r\n fare: {\r\n baseFare: 0,\r\n totalFare: 0,\r\n surcharges: 0,\r\n currency: card?.currency || 'INR',\r\n },\r\n }\r\n : null;\r\n\r\n return {\r\n ukey: String(card?.ukey || '').trim(),\r\n ptyp: 'CD',\r\n prd: 'F',\r\n em: 'radha.k@sartecheasy.com',\r\n ph: '8888888888',\r\n adt: String(card?.adt ?? 1),\r\n chd: String(card?.chd ?? 0),\r\n inf: String(card?.inf ?? 0),\r\n rukey: String(card?.rukey || '').trim() || null,\r\n tt: isRoundTrip ? '2' : '1',\r\n styp: String(card?.styp || '').trim(),\r\n chnl: 'B2C',\r\n passportRequired,\r\n selectedFlight: onwardFlight,\r\n selectedReturnFlight: returnFlight,\r\n trvlrs: buildTravellerSkeletons({\r\n adt: card?.adt,\r\n chd: card?.chd,\r\n inf: card?.inf,\r\n passportRequired,\r\n }),\r\n };\r\n}\r\n\r\nexport function buildPrebookPayload(availability, airlinesMap) {\r\n const avail = availability?.payload || availability || {};\r\n const trpsRaw = avail?.trps || {};\r\n const trps = Array.isArray(trpsRaw) ? trpsRaw[0] || {} : trpsRaw;\r\n const depsRaw = trps?.deps || {};\r\n const deps = Array.isArray(depsRaw) ? depsRaw[0] || {} : depsRaw;\r\n const segs = Array.isArray(deps?.seg) ? deps.seg : [];\r\n const rttrpsRaw = avail?.rttrps || {};\r\n const rttrps = Array.isArray(rttrpsRaw) ? rttrpsRaw[0] || {} : rttrpsRaw;\r\n const rtdepsRaw = rttrps?.deps || {};\r\n const rtdeps = Array.isArray(rtdepsRaw) ? rtdepsRaw[0] || {} : rtdepsRaw;\r\n const rtSegsFromSplit = Array.isArray(rtdeps?.seg) ? rtdeps.seg : [];\r\n const arrsRaw = trps?.arrs || {};\r\n const arrs = Array.isArray(arrsRaw) ? arrsRaw[0] || {} : arrsRaw;\r\n const rtSegsFromCombined = Array.isArray(arrs?.seg) ? arrs.seg : [];\r\n const rtSegs = rtSegsFromSplit.length ? rtSegsFromSplit : rtSegsFromCombined;\r\n const fare = trps?.pr || {};\r\n const returnFare = rttrps?.pr || {};\r\n const onwardTaxTotal = Array.isArray(fare?.taxs)\r\n ? fare.taxs.reduce((acc, tax) => acc + Number(tax?.pr || 0), 0)\r\n : 0;\r\n const returnTaxTotal = Array.isArray(returnFare?.taxs)\r\n ? returnFare.taxs.reduce((acc, tax) => acc + Number(tax?.pr || 0), 0)\r\n : 0;\r\n const passportRequired =\r\n String(avail?.ps || '').toUpperCase() === 'Y' ||\r\n String(avail?.sectyp || '').toLowerCase() === 'int';\r\n const hasReturnRef = Boolean(String(avail?.rukey || '').trim());\r\n const hasReturnSegs = rtSegs.length > 0;\r\n const isRoundTrip =\r\n Number(avail?.tt || 1) === 2 || hasReturnRef || hasReturnSegs;\r\n const ttValue = isRoundTrip ? '2' : '1';\r\n\r\n return {\r\n ukey: avail?.ukey || '',\r\n ptyp: 'CD',\r\n prd: 'F',\r\n em: 'radha.k@sartecheasy.com',\r\n ph: '8888888888',\r\n adt: String(avail?.adt ?? 1),\r\n chd: String(avail?.chd ?? 0),\r\n inf: String(avail?.inf ?? 0),\r\n rukey: String(avail?.rukey || '').trim() || null,\r\n tt: ttValue,\r\n styp: avail?.styp || '',\r\n rmkey: fare?.rmkey || '',\r\n chnl: 'B2C',\r\n fareBreakup: {\r\n onwardSt: Number(fare?.st ?? 0),\r\n returnSt: Number(returnFare?.st ?? 0),\r\n onwardTax: Number(onwardTaxTotal || 0),\r\n returnTax: Number(returnTaxTotal || 0),\r\n },\r\n selectedFlight: {\r\n airlineCode: segs?.[0]?.ma || segs?.[0]?.ac || '',\r\n airlineName:\r\n airlinesMap[\r\n String(segs?.[0]?.ma || segs?.[0]?.ac || '').toUpperCase()\r\n ] ||\r\n String(segs?.[0]?.ma || segs?.[0]?.ac || '').toUpperCase() ||\r\n 'N/A',\r\n sectors: segs.map((seg) => ({\r\n from: seg?.da || '',\r\n to: seg?.ar || '',\r\n departureDate: seg?.dd || '',\r\n arrivalDate: seg?.ad || '',\r\n departureTime: seg?.dt || '',\r\n arrivalTime: seg?.at || '',\r\n duration: seg?.fdur || '',\r\n flightNumber: seg?.fn || '',\r\n stops: Number(seg?.st ?? 0),\r\n })),\r\n fare: {\r\n baseFare: Number(fare?.bf ?? 0),\r\n totalFare: Number(fare?.tf ?? 0),\r\n surcharges: Number(fare?.st ?? 0),\r\n currency: avail?.cur || 'INR',\r\n },\r\n },\r\n selectedReturnFlight:\r\n isRoundTrip && rtSegs.length\r\n ? {\r\n airlineCode: rtSegs?.[0]?.ma || rtSegs?.[0]?.ac || '',\r\n airlineName:\r\n airlinesMap[\r\n String(rtSegs?.[0]?.ma || rtSegs?.[0]?.ac || '').toUpperCase()\r\n ] ||\r\n String(rtSegs?.[0]?.ma || rtSegs?.[0]?.ac || '').toUpperCase() ||\r\n 'N/A',\r\n sectors: rtSegs.map((seg) => ({\r\n from: seg?.da || '',\r\n to: seg?.ar || '',\r\n departureDate: seg?.dd || '',\r\n arrivalDate: seg?.ad || '',\r\n departureTime: seg?.dt || '',\r\n arrivalTime: seg?.at || '',\r\n duration: seg?.fdur || '',\r\n flightNumber: seg?.fn || '',\r\n stops: Number(seg?.st ?? 0),\r\n })),\r\n fare: {\r\n baseFare: Number(returnFare?.bf ?? 0),\r\n totalFare: Number(returnFare?.tf ?? 0),\r\n surcharges: Number(returnFare?.st ?? 0),\r\n currency: avail?.cur || 'INR',\r\n },\r\n }\r\n : null,\r\n uid: avail?.uid ?? null,\r\n agid: avail?.agid ?? null,\r\n trvlrs: buildTravellerSkeletons({\r\n adt: avail?.adt,\r\n chd: avail?.chd,\r\n inf: avail?.inf,\r\n passportRequired,\r\n }),\r\n };\r\n}\r\n\r\n","/**\n * CancellationPolicy\n * Reusable Fare Rules / Cancellation Policy display component.\n * Adapted from the B2C CancellationPolicy pattern using fdRules* classes.\n *\n * Props:\n * isNonRefundable {boolean} - whether the fare is non-refundable\n * policyRows {Array} - optional dynamic rows: [{ timeline, penalty }]\n * showServiceFee {boolean} - show the \"Service fee: 300/pax\" pill (default true)\n * loading {boolean} - show a loading spinner\n */\nimport React from 'react';\n\nconst SERVICE_FEE_TEXT = 'Service fee : 300/pax';\n\nfunction CancellationPolicy({\n isNonRefundable = false,\n policyRows = null,\n showServiceFee = true,\n loading = false,\n}) {\n const penaltyText = isNonRefundable\n ? 'Non Refundable'\n : 'Refer to Airline Policy';\n\n if (loading) {\n return (\n <div className=\"fdContent\">\n <div className=\"cpLoading\">\n <div className=\"cpSpinner\" />\n </div>\n </div>\n );\n }\n\n // If dynamic rows are provided, render each one\n const rows =\n Array.isArray(policyRows) && policyRows.length > 0\n ? policyRows\n : [{ timeline: '0 to 365 days', penalty: penaltyText }];\n\n return (\n <div className=\"fdContent\">\n <div className=\"frRulesBlock\">\n <div className=\"frRulesHeader\">Cancellation Changes Per Pax</div>\n\n {rows.map((row, idx) => (\n <div className=\"frRulesRow\" key={idx}>\n <div className=\"frRulesCol\">\n <div className=\"lbl\">Timeline</div>\n <div className=\"val\">{row.timeline}</div>\n </div>\n <div className=\"frRulesDivider\" aria-hidden=\"true\" />\n <div className=\"frRulesCol\">\n <div className=\"lbl\">Penalty</div>\n <div className=\"val\">{row.penalty}</div>\n </div>\n </div>\n ))}\n\n {showServiceFee && (\n <div className=\"frRulespill\">{SERVICE_FEE_TEXT}</div>\n )}\n </div>\n </div>\n );\n}\n\nexport default CancellationPolicy;\n","import React, { useEffect, useState } from 'react';\r\nimport { getAirportNameFromMappings, getCurrencySymbol } from './helpers';\r\nimport { IoChevronDown, IoChevronUp } from 'react-icons/io5';\r\nimport { FiBriefcase, FiLock } from 'react-icons/fi';\r\nimport { MdStar } from 'react-icons/md';\r\nimport { RxCross2 } from 'react-icons/rx';\r\nimport CancellationPolicy from './CancellationPolicy';\r\nimport { BsArrowRight } from 'react-icons/bs';\r\nimport { FaArrowRightLong } from 'react-icons/fa6';\r\n\r\nfunction FlightResultCardBase({\r\n card,\r\n isCheapest = false,\r\n isRecommended = false,\r\n disableBook,\r\n bookingFlightId,\r\n hoveredBookId,\r\n onHoverChange = () => {},\r\n onBookClick = () => {},\r\n legTagText = null,\r\n selectionMode = false,\r\n isSelected = false,\r\n onSelectClick = () => {},\r\n dimmed = false,\r\n displayMode = 'compact',\r\n isDetailsOpen = false,\r\n onToggleDetails = () => {},\r\n onBookFlight = null,\r\n cardPositionIndex = 0,\r\n}) {\r\n const [isFarePanelOpen, setIsFarePanelOpen] = useState(false);\r\n const [isMoreFaresOpen, setIsMoreFaresOpen] = useState(false);\r\n const [isFareRulesOpen, setIsFareRulesOpen] = useState(false);\r\n const [selectedFareForRules, setSelectedFareForRules] = useState(null);\r\n const currency = getCurrencySymbol(card?.currency);\r\n const formattedPrice = Number.isFinite(Number(card?.price))\r\n ? new Intl.NumberFormat('en-IN', { maximumFractionDigits: 0 }).format(\r\n Number(card.price),\r\n )\r\n : card?.price || '--';\r\n const stopLabel =\r\n Number(card?.stops) === 0\r\n ? 'Non-stop'\r\n : Number(card?.stops) === 1\r\n ? '1 stop'\r\n : `${card?.stops} stops`;\r\n const cardClasses = [\r\n 'flight-card',\r\n displayMode === 'expanded' ? 'flight-card--expanded' : '',\r\n dimmed ? 'flight-card--dimmed' : '',\r\n isSelected ? 'flight-card--selected' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n const travelClass = card?.travelClass || 'Economy';\r\n const cabinBaggage = card?.cabinBaggage || '7 Kg per adult';\r\n const checkInBaggage =\r\n card?.checkInBaggage || '15 Kg (1 Piece only) per adult';\r\n const fareType = card?.fareType || 'Published';\r\n const fareTypeLower = String(fareType).toLowerCase();\r\n const isNonRefundable = /non[-\\s]?refund|no\\s*refund|nonrefund/i.test(\r\n fareTypeLower,\r\n );\r\n const hasRefundableHint = /\\brefund/.test(fareTypeLower);\r\n const refundBadgeLabel = isNonRefundable\r\n ? 'Non-refundable'\r\n : hasRefundableHint\r\n ? 'Refundable'\r\n : 'As per fare rules';\r\n const refundStatusType = isNonRefundable\r\n ? 'negative'\r\n : hasRefundableHint\r\n ? 'positive'\r\n : 'neutral';\r\n const handleBookFlight = (flight) => {\r\n if (disableBook) return;\r\n if (typeof onBookFlight === 'function') {\r\n onBookFlight(flight);\r\n return;\r\n }\r\n onBookClick(flight);\r\n };\r\n\r\n const visibleMoreFares = Array.isArray(card?.moreFares)\r\n ? card.moreFares.filter((f) => f?.pr?.dis === 1)\r\n : [];\r\n const viaStopsText = (() => {\r\n if (Number(card?.stops) <= 0) return '';\r\n const segments = Array.isArray(card?.segments) ? card.segments : [];\r\n if (segments.length > 1) {\r\n const connectionCodes = segments\r\n .slice(0, -1)\r\n .map((segment) => String(segment?.destination || '').trim().toUpperCase())\r\n .filter(Boolean);\r\n const uniqueCodes = [...new Set(connectionCodes)];\r\n if (uniqueCodes.length > 0) {\r\n return `via ${uniqueCodes.join(', ')}`;\r\n }\r\n }\r\n return '';\r\n })();\r\n\r\n useEffect(() => {\r\n if (!isFarePanelOpen) return;\r\n const onKeyDown = (event) => {\r\n if (event.key === 'Escape') setIsFarePanelOpen(false);\r\n };\r\n window.addEventListener('keydown', onKeyDown);\r\n return () => window.removeEventListener('keydown', onKeyDown);\r\n }, [isFarePanelOpen]);\r\n\r\n useEffect(() => {\r\n if (!isMoreFaresOpen) return;\r\n const onKeyDown = (event) => {\r\n if (event.key === 'Escape') setIsMoreFaresOpen(false);\r\n };\r\n window.addEventListener('keydown', onKeyDown);\r\n return () => window.removeEventListener('keydown', onKeyDown);\r\n }, [isMoreFaresOpen]);\r\n\r\n useEffect(() => {\r\n if (!isFareRulesOpen) return;\r\n const onKeyDown = (event) => {\r\n if (event.key === 'Escape') setIsFareRulesOpen(false);\r\n };\r\n window.addEventListener('keydown', onKeyDown);\r\n return () => window.removeEventListener('keydown', onKeyDown);\r\n }, [isFareRulesOpen]);\r\n\r\n const [activeTab, setActiveTab] = useState('fare'); // 'fare', 'breakup', 'rules'\r\n\r\n const renderPriceBreakup = () => {\r\n const paxPrices = card?.paxPrices || [];\r\n if (!paxPrices.length)\r\n return <div className=\"fare-panel__empty\">No breakup data available</div>;\r\n\r\n const adtPrice = paxPrices.find((p) => p.ptyp === 'ADT');\r\n const chdPrice = paxPrices.find((p) => p.ptyp === 'CHD');\r\n const infPrice = paxPrices.find((p) => p.ptyp === 'INF');\r\n\r\n const totalBaseFare = Number(card.baseFare || 0);\r\n const totalTaxes = Number(card.taxAmount || 0);\r\n\r\n return (\r\n <div className=\"fare-details-content\">\r\n <div className=\"fare-details-price-container\">\r\n <div className=\"price-breackup-row\">\r\n <span className=\"lbl\">Base Fare</span>\r\n <span className=\"val\">\r\n {currency} {new Intl.NumberFormat('en-IN').format(totalBaseFare)}\r\n </span>\r\n </div>\r\n\r\n {card.adt > 0 && adtPrice && (\r\n <div className=\"price-breackup-row\">\r\n <span className=\"lbl\">\r\n Adults ({card.adt} X {currency}\r\n {new Intl.NumberFormat('en-IN').format(\r\n Number(adtPrice.bf) - Number(adtPrice.madisc || 0),\r\n )}\r\n )\r\n </span>\r\n <span className=\"val\">\r\n {currency}{' '}\r\n {new Intl.NumberFormat('en-IN').format(\r\n card.adt *\r\n (Number(adtPrice.bf) - Number(adtPrice.madisc || 0)),\r\n )}\r\n </span>\r\n </div>\r\n )}\r\n\r\n {card.chd > 0 && chdPrice && (\r\n <div className=\"price-breackup-row\">\r\n <span className=\"lbl\">\r\n Child ({card.chd} X {currency}\r\n {new Intl.NumberFormat('en-IN').format(\r\n Number(chdPrice.bf) - Number(chdPrice.madisc || 0),\r\n )}\r\n )\r\n </span>\r\n <span className=\"val\">\r\n {currency}{' '}\r\n {new Intl.NumberFormat('en-IN').format(\r\n card.chd *\r\n (Number(chdPrice.bf) - Number(chdPrice.madisc || 0)),\r\n )}\r\n </span>\r\n </div>\r\n )}\r\n\r\n {card.inf > 0 && infPrice && (\r\n <div className=\"price-breackup-row\">\r\n <span className=\"lbl\">\r\n Infant ({card.inf} X {currency}\r\n {new Intl.NumberFormat('en-IN').format(Number(infPrice.bf))})\r\n </span>\r\n <span className=\"val\">\r\n {currency}{' '}\r\n {new Intl.NumberFormat('en-IN').format(\r\n card.inf * Number(infPrice.bf),\r\n )}\r\n </span>\r\n </div>\r\n )}\r\n\r\n <div className=\"price-breackup-row\">\r\n <span className=\"lbl\">Taxes & Surcharges</span>\r\n <span className=\"val\">\r\n {currency} {new Intl.NumberFormat('en-IN').format(totalTaxes)}\r\n </span>\r\n </div>\r\n\r\n <div className=\"fare-details-price-total\">\r\n <span className=\"lbl\">Total Payable</span>\r\n <span className=\"val\">\r\n {currency} {formattedPrice}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderFareRules = () => {\r\n const rulesFare = selectedFareForRules || card;\r\n const fareIsNonRefundable =\r\n /\\bnon[-\\s]?refund|no\\s*refund|nonrefund\\b/i.test(\r\n String(rulesFare?.fareType || rulesFare?.pr?.re || '').toLowerCase(),\r\n );\r\n\r\n return (\r\n <CancellationPolicy\r\n isNonRefundable={fareIsNonRefundable}\r\n policyRows={rulesFare?.policyRows || undefined}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n <div\r\n className={cardClasses}\r\n data-ui-flight-card=\"true\"\r\n data-flight-id={card?.id || ''}\r\n data-flight-leg={card?.legType || ''}\r\n data-flight-airline={String(card?.airline || '').trim()}\r\n data-flight-number={String(card?.flightNumber || '').trim()}\r\n data-flight-departure-date={String(card?.departureDate || '').trim()}\r\n data-flight-arrival-date={String(card?.arrivalDate || '').trim()}\r\n data-flight-departure-time={String(card?.departureTime || '').trim()}\r\n data-flight-arrival-time={String(card?.arrivalTime || '').trim()}\r\n data-flight-price={String(card?.price ?? '').trim()}\r\n data-flight-position={String(Number(cardPositionIndex) + 1)}\r\n data-flight-payload-index={String(card?.payloadIndex ?? '').trim()}\r\n >\r\n <div className=\"flight-card__inner\">\r\n {' '}\r\n <div className=\"flight-card__left\">\r\n <div className=\"flight-card__airline-row\">\r\n {card.airlineLogo ? (\r\n <img\r\n src={card.airlineLogo}\r\n alt={card.airline}\r\n className=\"flight-card__logo\"\r\n onError={(e) => {\r\n e.currentTarget.style.display = 'none';\r\n }}\r\n />\r\n ) : (\r\n <div className=\"flight-card__logo-fallback\">\r\n {card.airlineCode}\r\n </div>\r\n )}\r\n <div className=\"flight-card__airline-name\">\r\n {card.airline}\r\n <span className=\"flight-card__airline-flight-number\">\r\n {card.flightNumber || 'N/A'}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flight-card__time\">\r\n {card.departureTime} - {card.arrivalTime}\r\n </div>\r\n <div className=\"flight-card__date\">\r\n <span className=\"flight-card__date-pill\">\r\n {card.departureDate || '--'}\r\n {card.arrivalDate ? ` | ${card.arrivalDate}` : ''}\r\n </span>\r\n </div>\r\n\r\n {legTagText ? (\r\n <div className=\"flight-card__leg-tag\">{legTagText}</div>\r\n ) : null}\r\n </div>\r\n <div className=\"flight-card__mid\">\r\n <div className=\"flight-card__duration\">{card.duration}</div>\r\n <div className=\"flight-card__route\">\r\n {card.origin} → {card.destination}\r\n </div>\r\n </div>\r\n <div className=\"flight-card__mid flight-card__mid--stops\">\r\n <div className=\"flight-card__stop-count\">{stopLabel}</div>\r\n <div className=\"flight-card__stop-city\">\r\n {viaStopsText}\r\n </div>\r\n </div>\r\n <div className=\"flight-card__right\">\r\n <div className=\"flight-card__price\">\r\n {currency} {formattedPrice}\r\n </div>\r\n {isCheapest ? (\r\n <div className=\"flight-card__cheapest-tag\">CHEAPEST</div>\r\n ) : null}\r\n {isRecommended ? (\r\n <div className=\"flight-card__recommended-tag\">\r\n <MdStar /> RECOMMENDED\r\n </div>\r\n ) : null}\r\n {card?.moreFares?.length > 1 && (\r\n <button\r\n type=\"button\"\r\n className=\"flight-card__more-fares-btn\"\r\n data-ui-action=\"more-fares\"\r\n data-flight-id={card?.id || ''}\r\n onClick={(e) => {\r\n if (disableBook) return;\r\n e.stopPropagation();\r\n setIsMoreFaresOpen(true);\r\n }}\r\n disabled={disableBook}\r\n >\r\n + More Fares\r\n </button>\r\n )}\r\n </div>\r\n <div className=\"flight-card__action\">\r\n {selectionMode ? (\r\n <div className=\"flight-card__action-content flight-card__action-content--selection\">\r\n <div className=\"flight-card__action-buttons\">\r\n <button\r\n type=\"button\"\r\n className={`flight-card__book-btn ${isSelected ? 'flight-card__book-btn--selected' : ''}`}\r\n data-ui-action=\"select-flight\"\r\n data-voice-action=\"select-flight\"\r\n data-flight-id={card.id}\r\n data-flight-leg={card?.legType || ''}\r\n data-recommended={isRecommended ? 'true' : 'false'}\r\n data-cheapest={isCheapest ? 'true' : 'false'}\r\n onMouseEnter={() => onHoverChange(card.id)}\r\n onMouseLeave={() => onHoverChange(null)}\r\n onClick={() => {\r\n if (dimmed || disableBook) return;\r\n onSelectClick(card);\r\n }}\r\n disabled={dimmed || disableBook}\r\n >\r\n {isSelected ? 'Selected' : 'Select'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={`flight-card__details-toggle ${isDetailsOpen ? 'flight-card__details-toggle--open' : ''}`}\r\n data-ui-action=\"toggle-details\"\r\n onClick={onToggleDetails}\r\n aria-label={\r\n isDetailsOpen\r\n ? 'Hide flight details'\r\n : 'Show flight details'\r\n }\r\n >\r\n {isDetailsOpen ? (\r\n <IoChevronUp\r\n className=\"flight-card__details-chevron\"\r\n aria-hidden=\"true\"\r\n />\r\n ) : (\r\n <IoChevronDown\r\n className=\"flight-card__details-chevron\"\r\n aria-hidden=\"true\"\r\n />\r\n )}\r\n </button>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"flight-card__fare-type-btn\"\r\n data-ui-action=\"open-fare-details\"\r\n onClick={() => setIsFarePanelOpen(true)}\r\n aria-expanded={isFarePanelOpen}\r\n aria-controls={`fare-panel-${card?.id || 'flight'}`}\r\n disabled={disableBook}\r\n >\r\n <span className=\"flight-card__fare-type\">Fare details</span>\r\n </button>\r\n </div>\r\n ) : (\r\n <div className=\"flight-card__action-content\">\r\n <div className=\"flight-card__action-buttons\">\r\n <button\r\n type=\"button\"\r\n className={`flight-card__book-btn ${hoveredBookId === card.id ? 'flight-card__book-btn--hover' : ''}`}\r\n data-ui-action=\"book-flight\"\r\n data-voice-action=\"book-flight\"\r\n data-flight-id={card.id}\r\n data-flight-leg={card?.legType || ''}\r\n data-recommended={isRecommended ? 'true' : 'false'}\r\n data-cheapest={isCheapest ? 'true' : 'false'}\r\n onMouseEnter={() => onHoverChange(card.id)}\r\n onMouseLeave={() => onHoverChange(null)}\r\n onClick={() => {\r\n handleBookFlight(card);\r\n }}\r\n disabled={disableBook || bookingFlightId === card.id}\r\n >\r\n {bookingFlightId === card.id ? 'Loading...' : 'Book'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={`flight-card__details-toggle ${isDetailsOpen ? 'flight-card__details-toggle--open' : ''}`}\r\n data-ui-action=\"toggle-details\"\r\n onClick={onToggleDetails}\r\n aria-label={\r\n isDetailsOpen\r\n ? 'Hide flight details'\r\n : 'Show flight details'\r\n }\r\n >\r\n {isDetailsOpen ? (\r\n <IoChevronUp\r\n className=\"flight-card__details-chevron\"\r\n aria-hidden=\"true\"\r\n />\r\n ) : (\r\n <IoChevronDown\r\n className=\"flight-card__details-chevron\"\r\n aria-hidden=\"true\"\r\n />\r\n )}\r\n </button>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"flight-card__fare-type-btn\"\r\n data-ui-action=\"open-fare-details\"\r\n onClick={() => setIsFarePanelOpen(true)}\r\n aria-expanded={isFarePanelOpen}\r\n aria-controls={`fare-panel-${card?.id || 'flight'}`}\r\n disabled={disableBook}\r\n >\r\n <span className=\"flight-card__fare-type\">Fare details</span>\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n {isFarePanelOpen ? (\r\n <div\r\n className=\"flight-card__fare-panel-overlay\"\r\n onClick={() => setIsFarePanelOpen(false)}\r\n role=\"presentation\"\r\n >\r\n <aside\r\n className={`flight-card__fare-panel fare-details-drawer flight-card__fare-panel--${activeTab}`}\r\n onClick={(event) => event.stopPropagation()}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-label=\"Fare type details\"\r\n id={`fare-panel-${card?.id || 'flight'}`}\r\n >\r\n <div className=\"fare-details-tabs\">\r\n {/* Tab Header */}\r\n <div className=\"fare-details-tabs-bar\">\r\n <div className=\"fare-details-tabs-list\">\r\n {[\r\n { key: 'fare', label: 'Flight Details' },\r\n { key: 'breakup', label: 'Price Breakup' },\r\n { key: 'rules', label: 'Fare Rules' },\r\n ].map((tab) => (\r\n <button\r\n key={tab.key}\r\n type=\"button\"\r\n className={`fare-details-tab-btn${\r\n activeTab === tab.key\r\n ? ' fare-details-tab-btn--active'\r\n : ''\r\n }`}\r\n onClick={() => setActiveTab(tab.key)}\r\n >\r\n {tab.label}\r\n {activeTab === tab.key && (\r\n <span\r\n className=\"fare-details-tab-btn-line\"\r\n aria-hidden=\"true\"\r\n />\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n className=\"fare-details-drawer-close\"\r\n onClick={() => setIsFarePanelOpen(false)}\r\n aria-label=\"Close fare details panel\"\r\n >\r\n <RxCross2 size={20} />\r\n </button>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div\r\n className={`fare-details-tab-content fare-details-tab-content--${activeTab}`}\r\n >\r\n <div\r\n className={`fare-details-tab-panel${\r\n activeTab === 'fare'\r\n ? ' fare-details-tab-panel--active'\r\n : ''\r\n }`}\r\n >\r\n {activeTab === 'fare' && (\r\n <div className=\"fare-details-content\">\r\n <div className=\"fare-details-leg\">\r\n {/* Header */}\r\n <div className=\"fare-details-leg-header-block\">\r\n <div className=\"fare-details-flight-route\">\r\n <span className=\"fare-details-route-city\">\r\n {card.origin || '--'}\r\n </span>\r\n <BsArrowRight size={18} weight=\"bold\" />\r\n <span className=\"fare-details-route-city\">\r\n {card.destination || '--'}\r\n </span>\r\n </div>\r\n <div className=\"fare-details-flight-meta-row\">\r\n <span className=\"fare-details-meta-text\">\r\n {formatDateForCard(\r\n card.segments?.[0]?.departureDate,\r\n ) || '-'}\r\n </span>\r\n <span className=\"fare-details-meta-dot\">・</span>\r\n <span className=\"fare-details-meta-text\">\r\n {travelClass || '-'}\r\n </span>\r\n <span className=\"fare-details-meta-dot\">・</span>\r\n <span\r\n className={\r\n refundStatusType === 'positive'\r\n ? 'fare-details-meta-text fare-details-refund-status fare-details-refundable'\r\n : 'fare-details-meta-text fare-details-refund-status fare-details-non-refundable'\r\n }\r\n >\r\n {refundBadgeLabel}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Segments */}\r\n <div className=\"fare-details-flight-details-container\">\r\n {card.segments?.map((segment, idx) => {\r\n const isLast = idx === card.segments.length - 1;\r\n\r\n return (\r\n <React.Fragment\r\n key={segment.id || segment.flightNumber || idx}\r\n >\r\n <div className=\"fare-details-flight-segment\">\r\n <div className=\"fare-details-airline-info\">\r\n {segment.airlineLogo ? (\r\n <img\r\n src={segment.airlineLogo}\r\n alt={segment.airline}\r\n className=\"fare-details-airline-logo\"\r\n onError={(e) => {\r\n e.currentTarget.style.display =\r\n 'none';\r\n }}\r\n />\r\n ) : (\r\n <div className=\"fare-details-airline-logo-fallback\">\r\n {segment.airlineCode}\r\n </div>\r\n )}\r\n <div className=\"fare-details-airline-details\">\r\n <span className=\"fare-details-airline-name\">\r\n {segment.airline}\r\n </span>\r\n <span className=\"fare-details-flight-number\">\r\n {segment.flightNumber}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"fare-details-flight-timeline-wrapper\">\r\n <div className=\"fare-details-flight-timeline\">\r\n <div className=\"fare-details-timeline-block fare-details-departure\">\r\n <div className=\"fare-details-timeline-date\">\r\n {formatDateForCard(\r\n segment.departureDate,\r\n )}\r\n </div>\r\n <div className=\"fare-details-timeline-time\">\r\n {segment.departureTime}\r\n </div>\r\n <div className=\"fare-details-timeline-location\">\r\n {segment.originName || segment.origin}{' '}\r\n ({segment.origin})\r\n </div>\r\n <div className=\"fare-details-timeline-airport\">\r\n {getAirportDisplayName(\r\n segment.origin,\r\n segment.departureAirportName,\r\n segment.airportMappings ||\r\n card?.airportMappings,\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"fare-details-timeline-duration\">\r\n <div className=\"fare-details-duration-text\">\r\n {segment.duration}\r\n </div>\r\n <div\r\n className=\"fare-details-duration-line\"\r\n aria-hidden=\"true\"\r\n >\r\n <svg\r\n className=\"fare-details-duration-svg\"\r\n viewBox=\"0 0 212 12\"\r\n width=\"100%\"\r\n height=\"6\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <line\r\n x1=\"6\"\r\n y1=\"6\"\r\n x2=\"206\"\r\n y2=\"6\"\r\n stroke=\"#E3E4E6\"\r\n strokeWidth=\"1.2\"\r\n vectorEffect=\"non-scaling-stroke\"\r\n />\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"6\"\r\n fill=\"#E3E4E6\"\r\n />\r\n <circle\r\n cx=\"206\"\r\n cy=\"6\"\r\n r=\"6\"\r\n fill=\"#E3E4E6\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div className=\"fare-details-timeline-block fare-details-arrival\">\r\n <div className=\"fare-details-timeline-date\">\r\n {formatDateForCard(\r\n segment.arrivalDate,\r\n )}\r\n </div>\r\n <div className=\"fare-details-timeline-time\">\r\n {segment.arrivalTime}\r\n </div>\r\n <div className=\"fare-details-timeline-location\">\r\n {segment.destinationName ||\r\n segment.destination}{' '}\r\n ({segment.destination})\r\n </div>\r\n <div className=\"fare-details-timeline-airport\">\r\n {getAirportDisplayName(\r\n segment.destination,\r\n segment.arrivalAirportName,\r\n segment.airportMappings ||\r\n card?.airportMappings,\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"fare-details-baggage-divider\" />\r\n {/* Baggage Info */}\r\n <div className=\"fare-details-baggage-info\">\r\n <div className=\"fare-details-baggage-item\">\r\n <span\r\n className=\"fare-details-baggage-icon fare-details-icon-cabin\"\r\n aria-hidden=\"true\"\r\n />\r\n <div className=\"fare-details-baggage-details\">\r\n <div className=\"fare-details-baggage-label\">\r\n Cabin:\r\n </div>\r\n <div className=\"fare-details-baggage-value\">\r\n {cabinBaggage}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"fare-details-baggage-item\">\r\n <span\r\n className=\"fare-details-baggage-icon fare-details-icon-checkin\"\r\n aria-hidden=\"true\"\r\n />\r\n <div className=\"fare-details-baggage-details\">\r\n <div className=\"fare-details-baggage-label\">\r\n Check-in:\r\n </div>\r\n <div className=\"fare-details-baggage-value\">\r\n {checkInBaggage}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {!isLast && (\r\n <div className=\"fare-details-layover-container\">\r\n <div className=\"fare-details-layover-timeline\">\r\n <div className=\"fare-details-layover-line\" />\r\n <div className=\"fare-details-layover-badge\">\r\n <span className=\"fare-details-layover-type\">\r\n Change of planes\r\n </span>\r\n <span className=\"fare-details-layover-dot\">\r\n ・\r\n </span>\r\n <span className=\"fare-details-layover-duration\">\r\n {segment.layoverDuration\r\n ? `${segment.layoverDuration} layover in `\r\n : 'Layover in '}\r\n {segment.destinationName ||\r\n segment.destination}\r\n </span>\r\n </div>\r\n <div className=\"fare-details-layover-line\" />\r\n </div>\r\n <div\r\n className=\"fare-details-layover-baggage-spacer\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n )}\r\n </React.Fragment>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div\r\n className={`fare-details-tab-panel${\r\n activeTab === 'breakup'\r\n ? ' fare-details-tab-panel--active'\r\n : ''\r\n }`}\r\n >\r\n {activeTab === 'breakup' && renderPriceBreakup()}\r\n </div>\r\n\r\n <div\r\n className={`fare-details-tab-panel${\r\n activeTab === 'rules'\r\n ? ' fare-details-tab-panel--active'\r\n : ''\r\n }`}\r\n >\r\n {activeTab === 'rules' && renderFareRules()}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Footer: Total + Book Now */}\r\n <div className=\"fare-details-footer\">\r\n <div className=\"fare-details-drawer-fare\">\r\n <div className=\"fare-details-drawer-fare-label\">\r\n Total Amount\r\n </div>\r\n <div className=\"fare-details-drawer-fare-value\">\r\n {currency} {formattedPrice}\r\n </div>\r\n </div>\r\n {/* {onBookFlight && ( */}\r\n <button\r\n type=\"button\"\r\n className=\"fare-details-drawer-proceed\"\r\n onClick={() => {\r\n setIsFarePanelOpen(false);\r\n handleBookFlight(card);\r\n }}\r\n disabled={disableBook || bookingFlightId === card.id}\r\n >\r\n {bookingFlightId === card.id ? 'Loading...' : 'Book Now'}\r\n </button>\r\n </div>\r\n </aside>\r\n </div>\r\n ) : null}\r\n\r\n {isFareRulesOpen ? (\r\n <div\r\n className=\"flight-card__fare-panel-overlay fare-rules-overlay\"\r\n onClick={() => {\r\n setIsFareRulesOpen(false);\r\n setSelectedFareForRules(null);\r\n }}\r\n role=\"presentation\"\r\n >\r\n <aside\r\n className=\"flight-card__fare-panel fare-rules-modal\"\r\n onClick={(event) => event.stopPropagation()}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-label=\"Fare rules\"\r\n >\r\n <div className=\"fare-details-tabs-bar\">\r\n <div className=\"fare-details-tabs-list\">\r\n <div className=\"fare-details-tab-btn fare-details-tab-btn--active\">\r\n Fare Rules\r\n <span\r\n className=\"fare-details-tab-btn-line\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"fare-details-drawer-close\"\r\n onClick={() => {\r\n setIsFareRulesOpen(false);\r\n setSelectedFareForRules(null);\r\n }}\r\n aria-label=\"Close fare rules\"\r\n >\r\n <RxCross2 size={20} />\r\n </button>\r\n </div>\r\n\r\n <div className=\"fare-rules-modal-body\">{renderFareRules()}</div>\r\n </aside>\r\n </div>\r\n ) : null}\r\n\r\n {isMoreFaresOpen ? (\r\n <div\r\n className=\"flight-card__fare-panel-overlay\"\r\n onClick={() => setIsMoreFaresOpen(false)}\r\n role=\"presentation\"\r\n >\r\n <aside\r\n className=\"flight-card__fare-panel fare-details-drawer more-fares-drawer\"\r\n onClick={(event) => event.stopPropagation()}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-label=\"More fare options\"\r\n >\r\n <div className=\"fare-details-tabs-bar\">\r\n <div className=\"fare-details-tabs-list\">\r\n <div className=\"fare-details-tab-btn fare-details-tab-btn--active\">\r\n More Fare Options\r\n <span\r\n className=\"fare-details-tab-btn-line\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"fare-details-drawer-close\"\r\n onClick={() => setIsMoreFaresOpen(false)}\r\n aria-label=\"Close more fares panel\"\r\n >\r\n <RxCross2 size={20} />\r\n </button>\r\n </div>\r\n\r\n <div className=\"more-fares-panel-header\">\r\n <div>\r\n <div className=\"flight-card__fare-panel-title\">\r\n More Fare Options\r\n </div>\r\n <div className=\"airlData\">\r\n {card?.origin && card?.destination ? (\r\n <div className=\"more-fares-panel-subtitle\">\r\n {card.originName || card.origin} <FaArrowRightLong />{' '}\r\n {card.destinationName || card.destination}\r\n </div>\r\n ) : null}\r\n <div className=\"more-fares-panel-flight-meta\">\r\n {card.airlineLogo ? (\r\n <img\r\n src={card.airlineLogo}\r\n alt={card.airline || 'Airline'}\r\n className=\"more-fares-panel-airline-logo\"\r\n onError={(e) => {\r\n e.currentTarget.style.display = 'none';\r\n }}\r\n />\r\n ) : null}\r\n <span className=\"more-fares-panel-airline-text\">\r\n {card.airline || 'Airline'} {card.flightNumber || ''}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"more-fares-content\">\r\n <div className=\"more-fares-list\">\r\n {visibleMoreFares.map((fareOption, idx) => {\r\n const optionPrice =\r\n Number(fareOption?.pr?.tf || 0) -\r\n Number(fareOption?.pr?.madisc || 0);\r\n const optionFareType =\r\n fareOption?.pr?.altftyp ||\r\n fareOption?.pr?.fareType ||\r\n 'Published';\r\n const isSelected = fareOption?.pr?.selpr === true;\r\n\r\n const bag0 = fareOption?.bag?.[0];\r\n const bag1 = fareOption?.bag?.[1];\r\n const refundableText =\r\n fareOption?.pr?.re === 'Non-Refundable'\r\n ? 'Non-Refundable'\r\n : 'Refundable';\r\n const isRefundable = fareOption?.pr?.re !== 'Non-Refundable';\r\n\r\n return (\r\n <div\r\n key={idx}\r\n className={`more-fare-option-card ${\r\n isSelected ? 'more-fare-option-card--selected' : ''\r\n }`}\r\n >\r\n <div className=\"more-fare-option-top\">\r\n <div className=\"more-fare-option-price\">\r\n {currency}{' '}\r\n {new Intl.NumberFormat('en-IN').format(optionPrice)}\r\n </div>\r\n <div className=\"more-fare-option-type\">\r\n {optionFareType}\r\n </div>\r\n </div>\r\n\r\n <div className=\"more-fare-option-section\">\r\n <div className=\"more-fare-option-section-title\">\r\n Baggage\r\n </div>\r\n {bag0 ? (\r\n <div className=\"more-fare-option-item\">\r\n <span className=\"more-fare-option-check\">✓</span>\r\n {bag0.adt} {bag0.typ}\r\n </div>\r\n ) : null}\r\n {bag1 ? (\r\n <div className=\"more-fare-option-item\">\r\n <span className=\"more-fare-option-check\">✓</span>\r\n {bag1.adt} {bag1.typ}\r\n </div>\r\n ) : null}\r\n </div>\r\n\r\n <div className=\"more-fare-option-section\">\r\n <div className=\"more-fare-option-section-title\">\r\n Cancellation & Date Change\r\n </div>\r\n <div\r\n className={`more-fare-option-item ${\r\n !isRefundable ? 'more-fare-option-item--non' : ''\r\n }`}\r\n >\r\n <span className=\"more-fare-option-check\">\r\n {isRefundable ? '✓' : '✕'}\r\n </span>\r\n {refundableText}\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"more-fare-option-fare-rules\"\r\n data-ui-action=\"open-fare-rules\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setSelectedFareForRules(fareOption);\r\n setIsFareRulesOpen(true);\r\n }}\r\n >\r\n Fare Rules\r\n </button>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n className=\"more-fare-option-book-btn\"\r\n data-ui-action=\"book-more-fare\"\r\n onClick={() => {\r\n setIsMoreFaresOpen(false);\r\n handleBookFlight({\r\n ...card,\r\n price: optionPrice,\r\n fareType: optionFareType,\r\n rmkey: fareOption?.pr?.rmkey || card.rmkey,\r\n paxPrices: fareOption?.paxpr || card.paxPrices,\r\n baseFare: fareOption?.pr?.bf || card.baseFare,\r\n taxAmount:\r\n Number(fareOption?.pr?.tf || 0) -\r\n Number(fareOption?.pr?.bf || 0),\r\n discount: fareOption?.pr?.madisc || 0,\r\n });\r\n }}\r\n disabled={disableBook}\r\n >\r\n Select & Book\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </aside>\r\n </div>\r\n ) : null}\r\n {isDetailsOpen\r\n ? card.segments.map((segment) => (\r\n <div\r\n className=\"flight-card__details\"\r\n key={segment.id || segment.flightNumber}\r\n >\r\n <div className=\"flight-card__details-top\">\r\n <div className=\"flight-card__details-airline\">\r\n {segment.airlineLogo ? (\r\n <img\r\n src={segment.airlineLogo}\r\n alt={segment.airline}\r\n className=\"flight-card__details-logo\"\r\n onError={(e) => {\r\n e.currentTarget.style.display = 'none';\r\n }}\r\n />\r\n ) : (\r\n <div className=\"flight-card__logo-fallback\">\r\n {segment.airlineCode}\r\n </div>\r\n )}\r\n <div className=\"flight-card__details-airline-meta\">\r\n <div className=\"flight-card__details-airline-name\">\r\n {segment.airline}\r\n </div>\r\n <div className=\"flight-card__details-airline-sub\">\r\n <span>{segment.flightNumber}</span>{' '}\r\n <span>{travelClass}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flight-card__details-itinerary\">\r\n <div className=\"flight-card__details-itinerary-top\">\r\n {' '}\r\n <div className=\"flight-card__details-leg flight-card__details-leg--left\">\r\n <div className=\"flight-card__details-date\">\r\n {formatDateForCard(segment.departureDate)}\r\n </div>\r\n <div className=\"flight-card__details-time\">\r\n {segment.departureTime}\r\n </div>\r\n <div className=\"flight-card__details-code\">\r\n {segment.origin}\r\n </div>\r\n <div className=\"flight-card__details-airport\">\r\n {getAirportDisplayName(\r\n segment.origin,\r\n segment.departureAirportName,\r\n segment.airportMappings || card?.airportMappings,\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flight-card__details-duration\">\r\n <div className=\"flight-card__details-duration-text\">\r\n {segment.duration}\r\n </div>\r\n <div className=\"flight-card__details-duration-line\" />\r\n </div>\r\n <div className=\"flight-card__details-leg flight-card__details-leg--right\">\r\n <div className=\"flight-card__details-date\">\r\n {formatDateForCard(segment.arrivalDate)}\r\n </div>\r\n <div className=\"flight-card__details-time\">\r\n {segment.arrivalTime}\r\n </div>\r\n <div className=\"flight-card__details-code\">\r\n {segment.destination}\r\n </div>\r\n <div className=\"flight-card__details-airport\">\r\n {getAirportDisplayName(\r\n segment.destination,\r\n segment.arrivalAirportName,\r\n segment.airportMappings || card?.airportMappings,\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flight-card__details-bottom\">\r\n <div className=\"flight-card__details-bottom-chips\">\r\n <span className=\"flight-card__details-chip\">\r\n <FiLock\r\n className=\"flight-card__details-chip-icon\"\r\n aria-hidden=\"true\"\r\n />\r\n Cabin: <span>{cabinBaggage}</span>\r\n </span>\r\n <span className=\"flight-card__details-chip\">\r\n <FiBriefcase\r\n className=\"flight-card__details-chip-icon\"\r\n aria-hidden=\"true\"\r\n />\r\n Check-in: <span>{checkInBaggage}</span>\r\n </span>\r\n </div>\r\n <span className=\"flight-card__details-refund-badge\">\r\n {refundBadgeLabel}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n ))\r\n : null}\r\n </div>\r\n );\r\n}\r\n\r\nfunction formatDateForCard(rawValue) {\r\n const value = String(rawValue || '').trim();\r\n if (!value) return '--';\r\n const date = /^\\d{2}-\\d{2}-\\d{4}$/.test(value)\r\n ? new Date(value.split('-').reverse().join('-'))\r\n : new Date(value);\r\n if (Number.isNaN(date.getTime())) return value;\r\n const day = date.getDate();\r\n const month = date.toLocaleString('en-US', { month: 'short' });\r\n const suffix =\r\n day % 10 === 1 && day % 100 !== 11\r\n ? 'st'\r\n : day % 10 === 2 && day % 100 !== 12\r\n ? 'nd'\r\n : day % 10 === 3 && day % 100 !== 13\r\n ? 'rd'\r\n : 'th';\r\n return `${day}${suffix} ${month}`;\r\n}\r\n\r\nfunction getAirportDisplayName(code, providedName, airportMappings) {\r\n const mappedAirportName = getAirportNameFromMappings(airportMappings, code);\r\n if (mappedAirportName) return mappedAirportName;\r\n const preferred = String(providedName || '').trim();\r\n if (preferred) return preferred;\r\n const iata = String(code || '')\r\n .trim()\r\n .toUpperCase();\r\n return iata ? `${iata} Airport` : 'Origin Airport';\r\n}\r\n\r\nexport default FlightResultCardBase;\r\n","import React from 'react';\r\nimport FlightResultCardBase from './FlightResultCardBase';\r\n\r\nfunction FlightResultCardOneWay(props) {\r\n return <FlightResultCardBase {...props} legTagText={null} />;\r\n}\r\n\r\nexport default FlightResultCardOneWay;\r\n\r\n","import React from 'react';\r\nimport FlightResultCardBase from './FlightResultCardBase';\r\n\r\nfunction FlightResultCardOnward(props) {\r\n return <FlightResultCardBase {...props} legTagText=\"Onward\" />;\r\n}\r\n\r\nexport default FlightResultCardOnward;\r\n\r\n","import React from 'react';\r\nimport FlightResultCardBase from './FlightResultCardBase';\r\n\r\nfunction FlightResultCardReturn(props) {\r\n return <FlightResultCardBase {...props} legTagText=\"Return\" />;\r\n}\r\n\r\nexport default FlightResultCardReturn;\r\n\r\n","import React, { useEffect, useState } from 'react';\r\nimport { RxCross2 } from 'react-icons/rx';\r\nimport { FaArrowRightLong } from 'react-icons/fa6';\r\nimport { getCurrencySymbol } from './helpers';\r\nimport CancellationPolicy from './CancellationPolicy';\r\n\r\nfunction FlightFarePanels({\r\n card,\r\n disableBook = false,\r\n bookingFlightId = null,\r\n onBookFlight = () => {},\r\n renderFareDetails = () => null,\r\n children,\r\n}) {\r\n const [isFarePanelOpen, setIsFarePanelOpen] = useState(false);\r\n const [isMoreFaresOpen, setIsMoreFaresOpen] = useState(false);\r\n const [isFareRulesOpen, setIsFareRulesOpen] = useState(false);\r\n const [selectedFareForRules, setSelectedFareForRules] = useState(null);\r\n const [activeTab, setActiveTab] = useState('fare');\r\n const currency = getCurrencySymbol(card?.currency);\r\n const formattedPrice = Number.isFinite(Number(card?.price))\r\n ? new Intl.NumberFormat('en-IN', { maximumFractionDigits: 0 }).format(\r\n Number(card?.price),\r\n )\r\n : card?.price || '--';\r\n const visibleMoreFares = Array.isArray(card?.moreFares)\r\n ? card.moreFares.filter((f) => f?.pr?.dis === 1)\r\n : [];\r\n const fareType = card?.fareType || 'Published';\r\n const fareTypeLower = String(fareType).toLowerCase();\r\n\r\n useEffect(() => {\r\n if (!isFarePanelOpen && !isMoreFaresOpen && !isFareRulesOpen) return;\r\n const onKeyDown = (event) => {\r\n if (event.key !== 'Escape') return;\r\n setIsFarePanelOpen(false);\r\n setIsMoreFaresOpen(false);\r\n setIsFareRulesOpen(false);\r\n setSelectedFareForRules(null);\r\n };\r\n window.addEventListener('keydown', onKeyDown);\r\n return () => window.removeEventListener('keydown', onKeyDown);\r\n }, [isFarePanelOpen, isMoreFaresOpen, isFareRulesOpen]);\r\n\r\n const renderPriceBreakup = () => {\r\n const paxPrices = card?.paxPrices || [];\r\n if (!paxPrices.length) {\r\n return <div className=\"fare-panel__empty\">No breakup data available</div>;\r\n }\r\n\r\n const adtPrice = paxPrices.find((p) => p.ptyp === 'ADT');\r\n const chdPrice = paxPrices.find((p) => p.ptyp === 'CHD');\r\n const infPrice = paxPrices.find((p) => p.ptyp === 'INF');\r\n const totalBaseFare = Number(card?.baseFare || 0);\r\n const totalTaxes = Number(card?.taxAmount || 0);\r\n\r\n return (\r\n <div className=\"fare-details-content\">\r\n <div className=\"fare-details-price-container\">\r\n <div className=\"price-breackup-row\">\r\n <span className=\"lbl\">Base Fare</span>\r\n <span className=\"val\">\r\n {currency} {new Intl.NumberFormat('en-IN').format(totalBaseFare)}\r\n </span>\r\n </div>\r\n\r\n {card?.adt > 0 && adtPrice ? (\r\n <div className=\"price-breackup-row\">\r\n <span className=\"lbl\">\r\n Adults ({card.adt} X {currency}\r\n {new Intl.NumberFormat('en-IN').format(\r\n Number(adtPrice.bf) - Number(adtPrice.madisc || 0),\r\n )}\r\n )\r\n </span>\r\n <span className=\"val\">\r\n {currency}{' '}\r\n {new Intl.NumberFormat('en-IN').format(\r\n card.adt *\r\n (Number(adtPrice.bf) - Number(adtPrice.madisc || 0)),\r\n )}\r\n </span>\r\n </div>\r\n ) : null}\r\n\r\n {card?.chd > 0 && chdPrice ? (\r\n <div className=\"price-breackup-row\">\r\n <span className=\"lbl\">\r\n Child ({card.chd} X {currency}\r\n {new Intl.NumberFormat('en-IN').format(\r\n Number(chdPrice.bf) - Number(chdPrice.madisc || 0),\r\n )}\r\n )\r\n </span>\r\n <span className=\"val\">\r\n {currency}{' '}\r\n {new Intl.NumberFormat('en-IN').format(\r\n card.chd *\r\n (Number(chdPrice.bf) - Number(chdPrice.madisc || 0)),\r\n )}\r\n </span>\r\n </div>\r\n ) : null}\r\n\r\n {card?.inf > 0 && infPrice ? (\r\n <div className=\"price-breackup-row\">\r\n <span className=\"lbl\">\r\n Infant ({card.inf} X {currency}\r\n {new Intl.NumberFormat('en-IN').format(Number(infPrice.bf))})\r\n </span>\r\n <span className=\"val\">\r\n {currency}{' '}\r\n {new Intl.NumberFormat('en-IN').format(\r\n card.inf * Number(infPrice.bf),\r\n )}\r\n </span>\r\n </div>\r\n ) : null}\r\n\r\n <div className=\"price-breackup-row\">\r\n <span className=\"lbl\">Taxes & Surcharges</span>\r\n <span className=\"val\">\r\n {currency} {new Intl.NumberFormat('en-IN').format(totalTaxes)}\r\n </span>\r\n </div>\r\n\r\n <div className=\"fare-details-price-total\">\r\n <span className=\"lbl\">Total Payable</span>\r\n <span className=\"val\">\r\n {currency} {formattedPrice}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderFareRules = () => {\r\n const rulesFare = selectedFareForRules || card;\r\n const fareIsNonRefundable =\r\n /\\bnon[-\\s]?refund|no\\s*refund|nonrefund\\b/i.test(\r\n String(rulesFare?.fareType || rulesFare?.pr?.re || '').toLowerCase(),\r\n );\r\n\r\n return (\r\n <CancellationPolicy\r\n isNonRefundable={fareIsNonRefundable}\r\n policyRows={rulesFare?.policyRows || undefined}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n {children({\r\n openFareDetails: () => {\r\n if (disableBook) return;\r\n setIsFarePanelOpen(true);\r\n },\r\n openMoreFares: () => {\r\n if (disableBook) return;\r\n setIsMoreFaresOpen(true);\r\n },\r\n fareType,\r\n hasMoreFares: card?.moreFares?.length > 1,\r\n })}\r\n\r\n {isFarePanelOpen ? (\r\n <div\r\n className=\"flight-card__fare-panel-overlay\"\r\n onClick={() => setIsFarePanelOpen(false)}\r\n role=\"presentation\"\r\n >\r\n <aside\r\n className={`flight-card__fare-panel fare-details-drawer flight-card__fare-panel--${activeTab}`}\r\n onClick={(event) => event.stopPropagation()}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-label=\"Fare type details\"\r\n id={`fare-panel-${card?.id || 'flight'}`}\r\n >\r\n <div className=\"fare-details-tabs\">\r\n <div className=\"fare-details-tabs-bar\">\r\n <div className=\"fare-details-tabs-list\">\r\n {[\r\n { key: 'fare', label: 'Flight Details' },\r\n { key: 'breakup', label: 'Price Breakup' },\r\n { key: 'rules', label: 'Fare Rules' },\r\n ].map((tab) => (\r\n <button\r\n key={tab.key}\r\n type=\"button\"\r\n className={`fare-details-tab-btn${\r\n activeTab === tab.key\r\n ? ' fare-details-tab-btn--active'\r\n : ''\r\n }`}\r\n onClick={() => setActiveTab(tab.key)}\r\n >\r\n {tab.label}\r\n {activeTab === tab.key ? (\r\n <span\r\n className=\"fare-details-tab-btn-line\"\r\n aria-hidden=\"true\"\r\n />\r\n ) : null}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n className=\"fare-details-drawer-close\"\r\n onClick={() => setIsFarePanelOpen(false)}\r\n aria-label=\"Close fare details panel\"\r\n >\r\n <RxCross2 size={20} />\r\n </button>\r\n </div>\r\n\r\n <div\r\n className={`fare-details-tab-content fare-details-tab-content--${activeTab}`}\r\n >\r\n <div\r\n className={`fare-details-tab-panel${\r\n activeTab === 'fare'\r\n ? ' fare-details-tab-panel--active'\r\n : ''\r\n }`}\r\n >\r\n {activeTab === 'fare' ? renderFareDetails() : null}\r\n </div>\r\n\r\n <div\r\n className={`fare-details-tab-panel${\r\n activeTab === 'breakup'\r\n ? ' fare-details-tab-panel--active'\r\n : ''\r\n }`}\r\n >\r\n {activeTab === 'breakup' ? renderPriceBreakup() : null}\r\n </div>\r\n\r\n <div\r\n className={`fare-details-tab-panel${\r\n activeTab === 'rules'\r\n ? ' fare-details-tab-panel--active'\r\n : ''\r\n }`}\r\n >\r\n {activeTab === 'rules' ? renderFareRules() : null}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"fare-details-footer\">\r\n <div className=\"fare-details-drawer-fare\">\r\n <div className=\"fare-details-drawer-fare-label\">\r\n Total Amount\r\n </div>\r\n <div className=\"fare-details-drawer-fare-value\">\r\n {currency} {formattedPrice}\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"fare-details-drawer-proceed\"\r\n onClick={() => {\r\n if (disableBook) return;\r\n setIsFarePanelOpen(false);\r\n onBookFlight(card);\r\n }}\r\n disabled={disableBook || bookingFlightId === card.id}\r\n >\r\n {bookingFlightId === card.id ? 'Loading...' : 'Book Now'}\r\n </button>\r\n </div>\r\n </aside>\r\n </div>\r\n ) : null}\r\n\r\n {isFareRulesOpen ? (\r\n <div\r\n className=\"flight-card__fare-panel-overlay fare-rules-overlay\"\r\n onClick={() => {\r\n setIsFareRulesOpen(false);\r\n setSelectedFareForRules(null);\r\n }}\r\n role=\"presentation\"\r\n >\r\n <aside\r\n className=\"flight-card__fare-panel fare-rules-modal\"\r\n onClick={(event) => event.stopPropagation()}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-label=\"Fare rules\"\r\n >\r\n <div className=\"fare-details-tabs-bar\">\r\n <div className=\"fare-details-tabs-list\">\r\n <div className=\"fare-details-tab-btn fare-details-tab-btn--active\">\r\n Fare Rules\r\n <span\r\n className=\"fare-details-tab-btn-line\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"fare-details-drawer-close\"\r\n onClick={() => {\r\n setIsFareRulesOpen(false);\r\n setSelectedFareForRules(null);\r\n }}\r\n aria-label=\"Close fare rules\"\r\n >\r\n <RxCross2 size={20} />\r\n </button>\r\n </div>\r\n\r\n <div className=\"fare-rules-modal-body\">{renderFareRules()}</div>\r\n </aside>\r\n </div>\r\n ) : null}\r\n\r\n {isMoreFaresOpen ? (\r\n <div\r\n className=\"flight-card__fare-panel-overlay\"\r\n onClick={() => setIsMoreFaresOpen(false)}\r\n role=\"presentation\"\r\n >\r\n <aside\r\n className=\"flight-card__fare-panel fare-details-drawer more-fares-drawer\"\r\n onClick={(event) => event.stopPropagation()}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-label=\"More fare options\"\r\n >\r\n <div className=\"fare-details-tabs-bar\">\r\n <div className=\"fare-details-tabs-list\">\r\n <div className=\"fare-details-tab-btn fare-details-tab-btn--active\">\r\n More Fare Options\r\n <span\r\n className=\"fare-details-tab-btn-line\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"fare-details-drawer-close\"\r\n onClick={() => setIsMoreFaresOpen(false)}\r\n aria-label=\"Close more fares panel\"\r\n >\r\n <RxCross2 size={20} />\r\n </button>\r\n </div>\r\n\r\n <div className=\"more-fares-panel-header\">\r\n <div>\r\n <div className=\"flight-card__fare-panel-title\">\r\n More Fare Options\r\n </div>\r\n <div className=\"airlData\">\r\n {card?.origin && card?.destination ? (\r\n <div className=\"more-fares-panel-subtitle\">\r\n {card.originName || card.origin} <FaArrowRightLong />{' '}\r\n {card.destinationName || card.destination}\r\n </div>\r\n ) : null}\r\n <div className=\"more-fares-panel-flight-meta\">\r\n {card.airlineLogo ? (\r\n <img\r\n src={card.airlineLogo}\r\n alt={card.airline || 'Airline'}\r\n className=\"more-fares-panel-airline-logo\"\r\n onError={(e) => {\r\n e.currentTarget.style.display = 'none';\r\n }}\r\n />\r\n ) : null}\r\n <span className=\"more-fares-panel-airline-text\">\r\n {card.airline || 'Airline'} {card.flightNumber || ''}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"more-fares-content\">\r\n <div className=\"more-fares-list\">\r\n {visibleMoreFares.map((fareOption, idx) => {\r\n const optionPrice =\r\n Number(fareOption?.pr?.tf || 0) -\r\n Number(fareOption?.pr?.madisc || 0);\r\n const optionFareType =\r\n fareOption?.pr?.altftyp ||\r\n fareOption?.pr?.fareType ||\r\n 'Published';\r\n const isSelected = fareOption?.pr?.selpr === true;\r\n const bag0 = fareOption?.bag?.[0];\r\n const bag1 = fareOption?.bag?.[1];\r\n const refundableText =\r\n fareOption?.pr?.re === 'Non-Refundable'\r\n ? 'Non-Refundable'\r\n : 'Refundable';\r\n const isRefundable = fareOption?.pr?.re !== 'Non-Refundable';\r\n\r\n return (\r\n <div\r\n key={idx}\r\n className={`more-fare-option-card ${\r\n isSelected ? 'more-fare-option-card--selected' : ''\r\n }`}\r\n >\r\n <div className=\"more-fare-option-top\">\r\n <div className=\"more-fare-option-price\">\r\n {currency}{' '}\r\n {new Intl.NumberFormat('en-IN').format(optionPrice)}\r\n </div>\r\n <div className=\"more-fare-option-type\">\r\n {optionFareType}\r\n </div>\r\n </div>\r\n\r\n <div className=\"more-fare-option-section\">\r\n <div className=\"more-fare-option-section-title\">\r\n Baggage\r\n </div>\r\n {bag0 ? (\r\n <div className=\"more-fare-option-item\">\r\n <span className=\"more-fare-option-check\">✓</span>\r\n {bag0.adt} {bag0.typ}\r\n </div>\r\n ) : null}\r\n {bag1 ? (\r\n <div className=\"more-fare-option-item\">\r\n <span className=\"more-fare-option-check\">✓</span>\r\n {bag1.adt} {bag1.typ}\r\n </div>\r\n ) : null}\r\n </div>\r\n\r\n <div className=\"more-fare-option-section\">\r\n <div className=\"more-fare-option-section-title\">\r\n Cancellation & Date Change\r\n </div>\r\n <div\r\n className={`more-fare-option-item ${\r\n !isRefundable ? 'more-fare-option-item--non' : ''\r\n }`}\r\n >\r\n <span className=\"more-fare-option-check\">\r\n {isRefundable ? '✓' : '✕'}\r\n </span>\r\n {refundableText}\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"more-fare-option-fare-rules\"\r\n data-ui-action=\"open-fare-rules\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setSelectedFareForRules(fareOption);\r\n setIsFareRulesOpen(true);\r\n }}\r\n >\r\n Fare Rules\r\n </button>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n className=\"more-fare-option-book-btn\"\r\n data-ui-action=\"book-more-fare\"\r\n onClick={() => {\r\n if (disableBook) return;\r\n setIsMoreFaresOpen(false);\r\n onBookFlight({\r\n ...card,\r\n price: optionPrice,\r\n fareType: optionFareType,\r\n rmkey: fareOption?.pr?.rmkey || card.rmkey,\r\n paxPrices: fareOption?.paxpr || card.paxPrices,\r\n baseFare: fareOption?.pr?.bf || card.baseFare,\r\n taxAmount:\r\n Number(fareOption?.pr?.tf || 0) -\r\n Number(fareOption?.pr?.bf || 0),\r\n discount: fareOption?.pr?.madisc || 0,\r\n });\r\n }}\r\n disabled={disableBook}\r\n >\r\n Select & Book\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </aside>\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n}\r\n\r\nexport default FlightFarePanels;\r\n","import React, { useMemo } from 'react';\r\nimport { getAirportNameFromMappings, getCurrencySymbol } from './helpers';\r\nimport { MdStar } from 'react-icons/md';\r\nimport { FaPlane } from 'react-icons/fa';\r\nimport { BsArrowRight } from 'react-icons/bs';\r\nimport { IoChevronDown, IoChevronUp } from 'react-icons/io5';\r\nimport FlightFarePanels from './FlightFarePanels';\r\n\r\nfunction FlightResultCardRoundTripCombined({\r\n card,\r\n cardPositionIndex = 0,\r\n isCheapest = false,\r\n isRecommended = false,\r\n disableBook,\r\n bookingFlightId,\r\n hoveredBookId,\r\n onHoverChange = () => {},\r\n onBookClick = () => {},\r\n displayMode = 'compact',\r\n isDetailsOpen = false,\r\n onToggleDetails = () => {},\r\n}) {\r\n const currency = getCurrencySymbol(card?.currency);\r\n const formattedPrice = Number.isFinite(Number(card?.price))\r\n ? new Intl.NumberFormat('en-IN', { maximumFractionDigits: 0 }).format(\r\n Number(card?.price),\r\n )\r\n : card?.price || '--';\r\n const travelClass = card?.travelClass || 'Economy';\r\n const cabinBaggage = card?.cabinBaggage || '7 Kg per adult';\r\n const checkInBaggage =\r\n card?.checkInBaggage || '15 Kg (1 Piece only) per adult';\r\n const fareType = card?.fareType || 'Published';\r\n const fareTypeLower = String(fareType).toLowerCase();\r\n const isNonRefundable = /non[-\\s]?refund|no\\s*refund|nonrefund/i.test(\r\n fareTypeLower,\r\n );\r\n const hasRefundableHint = /\\brefund/.test(fareTypeLower);\r\n const refundBadgeLabel = isNonRefundable\r\n ? 'Non-refundable'\r\n : hasRefundableHint\r\n ? 'Refundable'\r\n : 'As per fare rules';\r\n const refundStatusType = isNonRefundable\r\n ? 'negative'\r\n : hasRefundableHint\r\n ? 'positive'\r\n : 'neutral';\r\n const allSegments = useMemo(\r\n () => [\r\n ...(Array.isArray(card?.onwardLeg?.segments) ? card.onwardLeg.segments : []),\r\n ...(Array.isArray(card?.returnLeg?.segments) ? card.returnLeg.segments : []),\r\n ],\r\n [card],\r\n );\r\n\r\n const renderFareDetails = () => (\r\n <div className=\"fare-details-content\">\r\n <div className=\"fare-details-leg\">\r\n <div className=\"fare-details-leg-header-block\">\r\n <div className=\"fare-details-flight-route\">\r\n <span className=\"fare-details-route-city\">{card?.origin || '--'}</span>\r\n <BsArrowRight size={18} />\r\n <span className=\"fare-details-route-city\">\r\n {card?.returnLeg?.destination || card?.destination || '--'}\r\n </span>\r\n </div>\r\n <div className=\"fare-details-flight-meta-row\">\r\n <span className=\"fare-details-meta-text\">{travelClass || '-'}</span>\r\n <span className=\"fare-details-meta-dot\">•</span>\r\n <span\r\n className={\r\n refundStatusType === 'positive'\r\n ? 'fare-details-meta-text fare-details-refund-status fare-details-refundable'\r\n : 'fare-details-meta-text fare-details-refund-status fare-details-non-refundable'\r\n }\r\n >\r\n {refundBadgeLabel}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"fare-details-flight-details-container\">\r\n {allSegments.map((segment, idx) => {\r\n const isLast = idx === allSegments.length - 1;\r\n return (\r\n <React.Fragment key={segment.id || segment.flightNumber || idx}>\r\n <div className=\"fare-details-flight-segment\">\r\n <div className=\"fare-details-airline-info\">\r\n {segment.airlineLogo ? (\r\n <img\r\n src={segment.airlineLogo}\r\n alt={segment.airline}\r\n className=\"fare-details-airline-logo\"\r\n onError={(e) => {\r\n e.currentTarget.style.display = 'none';\r\n }}\r\n />\r\n ) : (\r\n <div className=\"fare-details-airline-logo-fallback\">\r\n {segment.airlineCode}\r\n </div>\r\n )}\r\n <div className=\"fare-details-airline-details\">\r\n <span className=\"fare-details-airline-name\">\r\n {segment.airline}\r\n </span>\r\n <span className=\"fare-details-flight-number\">\r\n {segment.flightNumber}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"fare-details-flight-timeline-wrapper\">\r\n <div className=\"fare-details-flight-timeline\">\r\n <div className=\"fare-details-timeline-block fare-details-departure\">\r\n <div className=\"fare-details-timeline-date\">\r\n {formatDateForCard(segment.departureDate)}\r\n </div>\r\n <div className=\"fare-details-timeline-time\">\r\n {segment.departureTime}\r\n </div>\r\n <div className=\"fare-details-timeline-location\">\r\n {segment.originName || segment.origin} ({segment.origin})\r\n </div>\r\n <div className=\"fare-details-timeline-airport\">\r\n {getAirportDisplayName(\r\n segment.origin,\r\n segment.departureAirportName,\r\n segment.airportMappings || card?.airportMappings,\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"fare-details-timeline-duration\">\r\n <div className=\"fare-details-duration-text\">\r\n {segment.duration}\r\n </div>\r\n <div\r\n className=\"fare-details-duration-line\"\r\n aria-hidden=\"true\"\r\n >\r\n <svg\r\n className=\"fare-details-duration-svg\"\r\n viewBox=\"0 0 212 12\"\r\n width=\"100%\"\r\n height=\"6\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <line\r\n x1=\"6\"\r\n y1=\"6\"\r\n x2=\"206\"\r\n y2=\"6\"\r\n stroke=\"#E3E4E6\"\r\n strokeWidth=\"1.2\"\r\n vectorEffect=\"non-scaling-stroke\"\r\n />\r\n <circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#E3E4E6\" />\r\n <circle cx=\"206\" cy=\"6\" r=\"6\" fill=\"#E3E4E6\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div className=\"fare-details-timeline-block fare-details-arrival\">\r\n <div className=\"fare-details-timeline-date\">\r\n {formatDateForCard(segment.arrivalDate)}\r\n </div>\r\n <div className=\"fare-details-timeline-time\">\r\n {segment.arrivalTime}\r\n </div>\r\n <div className=\"fare-details-timeline-location\">\r\n {segment.destinationName || segment.destination} (\r\n {segment.destination})\r\n </div>\r\n <div className=\"fare-details-timeline-airport\">\r\n {getAirportDisplayName(\r\n segment.destination,\r\n segment.arrivalAirportName,\r\n segment.airportMappings || card?.airportMappings,\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"fare-details-baggage-divider\" />\r\n <div className=\"fare-details-baggage-info\">\r\n <div className=\"fare-details-baggage-item\">\r\n <span\r\n className=\"fare-details-baggage-icon fare-details-icon-cabin\"\r\n aria-hidden=\"true\"\r\n />\r\n <div className=\"fare-details-baggage-details\">\r\n <div className=\"fare-details-baggage-label\">Cabin:</div>\r\n <div className=\"fare-details-baggage-value\">\r\n {cabinBaggage}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"fare-details-baggage-item\">\r\n <span\r\n className=\"fare-details-baggage-icon fare-details-icon-checkin\"\r\n aria-hidden=\"true\"\r\n />\r\n <div className=\"fare-details-baggage-details\">\r\n <div className=\"fare-details-baggage-label\">\r\n Check-in:\r\n </div>\r\n <div className=\"fare-details-baggage-value\">\r\n {checkInBaggage}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {!isLast ? (\r\n <div className=\"fare-details-layover-container\">\r\n <div className=\"fare-details-layover-timeline\">\r\n <div className=\"fare-details-layover-line\" />\r\n <div className=\"fare-details-layover-badge\">\r\n <span className=\"fare-details-layover-type\">\r\n Change of planes\r\n </span>\r\n <span className=\"fare-details-layover-dot\">•</span>\r\n <span className=\"fare-details-layover-duration\">\r\n Layover in {segment.destinationName || segment.destination}\r\n </span>\r\n </div>\r\n <div className=\"fare-details-layover-line\" />\r\n </div>\r\n <div\r\n className=\"fare-details-layover-baggage-spacer\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n ) : null}\r\n </React.Fragment>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n const renderLeg = (label, leg, rotatedPlane = false) => {\r\n const stopCount = Number(leg?.stops || 0);\r\n const stopText =\r\n stopCount === 0\r\n ? 'Non-stop'\r\n : stopCount === 1\r\n ? '1 stop'\r\n : `${stopCount} stops`;\r\n return (\r\n <div className=\"flight-card__combined-leg\">\r\n <div className=\"flight-card__combined-leg-header\">\r\n <div className=\"flight-card__combined-leg-title\">\r\n <FaPlane\r\n className={`flight-card__combined-plane ${rotatedPlane ? 'flight-card__combined-plane--return' : ''}`}\r\n />\r\n {label}:\r\n </div>\r\n <div className=\"flight-card__combined-date-chip\">\r\n {leg?.departureDate || '--'}\r\n </div>\r\n </div>\r\n <div className=\"flight-card__combined-leg-route\">\r\n <span className=\"flight-card__combined-leg-route-text\">\r\n {leg?.origin || 'N/A'} → {leg?.destination || 'N/A'}\r\n </span>\r\n </div>\r\n <div className=\"flight-card__combined-leg-body\">\r\n <div className=\"flight-card__combined-airline-block\">\r\n {card.airlineLogo ? (\r\n <img\r\n src={card.airlineLogo}\r\n alt={card.airline}\r\n className=\"flight-card__logo\"\r\n onError={(e) => {\r\n e.currentTarget.style.display = 'none';\r\n }}\r\n />\r\n ) : (\r\n <div className=\"flight-card__logo-fallback\">\r\n {leg?.airlineCode || card.airlineCode}\r\n </div>\r\n )}\r\n <div>\r\n <div className=\"flight-card__combined-airline-name\">\r\n {card.airline || leg?.airlineCode || 'N/A'}\r\n </div>\r\n <div className=\"flight-card__combined-flight-meta\">\r\n {leg?.flightNumber || 'N/A'}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"flight-card__combined-time-block\">\r\n <div className=\"flight-card__combined-time-text\">\r\n {leg?.departureTime || '--:--'} <BsArrowRight />{' '}\r\n {leg?.arrivalTime || '--:--'}\r\n </div>\r\n <div className=\"flight-card__combined-date-text\">\r\n {leg?.arrivalDate ? `Arrival: ${leg.arrivalDate}` : ''}\r\n </div>\r\n </div>\r\n <div className=\"flight-card__combined-duration-block\">\r\n <div className=\"flight-card__combined-duration-text\">\r\n {leg?.duration || 'N/A'}\r\n </div>\r\n <div className=\"flight-card__combined-stop-text\">{stopText}</div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderDetailLeg = (title, leg) => {\r\n const legSegments = Array.isArray(leg?.segments) ? leg.segments : [];\r\n return (\r\n <div className=\"flight-card__combined-segment\">\r\n <div className=\"flight-card__combined-segment-title\">{title}</div>\r\n {legSegments.length ? (\r\n legSegments.map((segment) => (\r\n <div\r\n className=\"flight-card__combined-segment-row\"\r\n key={`${title}-${segment.id}`}\r\n >\r\n <div className=\"flight-card__combined-segment-route\">\r\n {segment.origin} → {segment.destination}\r\n </div>\r\n <div className=\"flight-card__combined-segment-time\">\r\n {segment.departureTime} - {segment.arrivalTime}\r\n </div>\r\n <div className=\"flight-card__combined-segment-meta\">\r\n {segment.flightNumber} | {segment.duration}\r\n </div>\r\n </div>\r\n ))\r\n ) : (\r\n <div className=\"flight-card__combined-segment-empty\">\r\n No segment details available\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <FlightFarePanels\r\n card={card}\r\n disableBook={disableBook}\r\n bookingFlightId={bookingFlightId}\r\n onBookFlight={onBookClick}\r\n renderFareDetails={renderFareDetails}\r\n >\r\n {({ openFareDetails, openMoreFares, hasMoreFares }) => (\r\n <div\r\n className={`flight-card flight-card--combined ${displayMode === 'expanded' ? 'flight-card--expanded' : ''}`}\r\n data-ui-flight-card=\"true\"\r\n data-flight-id={card?.id || ''}\r\n data-flight-leg={card?.legType || ''}\r\n data-flight-airline={String(card?.airline || '').trim()}\r\n data-flight-number={String(card?.flightNumber || '').trim()}\r\n data-flight-departure-date={String(card?.departureDate || '').trim()}\r\n data-flight-arrival-date={String(card?.arrivalDate || '').trim()}\r\n data-flight-departure-time={String(card?.departureTime || '').trim()}\r\n data-flight-arrival-time={String(card?.arrivalTime || '').trim()}\r\n data-flight-price={String(card?.price ?? '').trim()}\r\n data-flight-position={String(Number(cardPositionIndex) + 1)}\r\n >\r\n <div className=\"flight-card__inner flight-card__inner--combined\">\r\n <div className=\"flight-card__combined-content\">\r\n {renderLeg('Onward', card?.onwardLeg || {})}\r\n {renderLeg('Return', card?.returnLeg || {}, true)}\r\n </div>\r\n <div className=\"flight-card__combined-total\">\r\n <div className=\"flight-card__combined-total-price\">\r\n <div className=\"flight-card__price\">\r\n {currency} {formattedPrice}\r\n </div>\r\n {isRecommended ? (\r\n <div className=\"flight-card__recommended-tag\">\r\n <MdStar /> RECOMMENDED\r\n </div>\r\n ) : (\r\n ''\r\n )}\r\n {isCheapest ? (\r\n <div className=\"flight-card__cheapest-tag\">CHEAPEST</div>\r\n ) : null}\r\n {hasMoreFares ? (\r\n <button\r\n type=\"button\"\r\n className=\"flight-card__more-fares-btn\"\r\n data-ui-action=\"more-fares\"\r\n data-flight-id={card?.id || ''}\r\n onClick={() => openMoreFares()}\r\n disabled={disableBook}\r\n >\r\n + More Fares\r\n </button>\r\n ) : null}\r\n </div>\r\n <div className=\"flight-card__combined-total-actions\">\r\n <button\r\n type=\"button\"\r\n className={`flight-card__book-btn ${hoveredBookId === card.id ? 'flight-card__book-btn--hover' : ''}`}\r\n data-ui-action=\"book-flight\"\r\n data-voice-action=\"book-flight\"\r\n data-flight-id={card.id}\r\n data-recommended={isRecommended ? 'true' : 'false'}\r\n data-cheapest={isCheapest ? 'true' : 'false'}\r\n onMouseEnter={() => onHoverChange(card.id)}\r\n onMouseLeave={() => onHoverChange(null)}\r\n onClick={() => {\r\n if (disableBook) return;\r\n onBookClick(card);\r\n }}\r\n disabled={disableBook || bookingFlightId === card.id}\r\n >\r\n {bookingFlightId === card.id ? 'Loading...' : 'Book'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={`flight-card__details-toggle flight-card__details-toggle--combined ${isDetailsOpen ? 'flight-card__details-toggle--open' : ''}`}\r\n onClick={onToggleDetails}\r\n aria-label={\r\n isDetailsOpen ? 'Hide flight details' : 'Show flight details'\r\n }\r\n >\r\n {isDetailsOpen ? (\r\n <IoChevronUp\r\n className=\"flight-card__details-chevron\"\r\n aria-hidden=\"true\"\r\n />\r\n ) : (\r\n <IoChevronDown\r\n className=\"flight-card__details-chevron\"\r\n aria-hidden=\"true\"\r\n />\r\n )}\r\n </button>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"flight-card__fare-type-btn\"\r\n data-ui-action=\"open-fare-details\"\r\n onClick={openFareDetails}\r\n aria-controls={`fare-panel-${card?.id || 'flight'}`}\r\n disabled={disableBook}\r\n >\r\n <span className=\"flight-card__fare-type\">Fare Details</span>\r\n </button>\r\n </div>\r\n </div>\r\n {isDetailsOpen ? (\r\n <div className=\"flight-card__combined-segments\">\r\n {renderDetailLeg('Onward Details', card?.onwardLeg)}\r\n {renderDetailLeg('Return Details', card?.returnLeg)}\r\n </div>\r\n ) : null}\r\n </div>\r\n )}\r\n </FlightFarePanels>\r\n );\r\n}\r\n\r\nfunction formatDateForCard(rawValue) {\r\n const value = String(rawValue || '').trim();\r\n if (!value) return '--';\r\n const date = /^\\d{2}-\\d{2}-\\d{4}$/.test(value)\r\n ? new Date(value.split('-').reverse().join('-'))\r\n : new Date(value);\r\n if (Number.isNaN(date.getTime())) return value;\r\n const day = date.getDate();\r\n const month = date.toLocaleString('en-US', { month: 'short' });\r\n const suffix =\r\n day % 10 === 1 && day % 100 !== 11\r\n ? 'st'\r\n : day % 10 === 2 && day % 100 !== 12\r\n ? 'nd'\r\n : day % 10 === 3 && day % 100 !== 13\r\n ? 'rd'\r\n : 'th';\r\n return `${day}${suffix} ${month}`;\r\n}\r\n\r\nfunction getAirportDisplayName(code, providedName, airportMappings) {\r\n const mappedAirportName = getAirportNameFromMappings(airportMappings, code);\r\n if (mappedAirportName) return mappedAirportName;\r\n const preferred = String(providedName || '').trim();\r\n if (preferred) return preferred;\r\n const iata = String(code || '')\r\n .trim()\r\n .toUpperCase();\r\n return iata ? `${iata} Airport` : 'Origin Airport';\r\n}\r\n\r\nexport default FlightResultCardRoundTripCombined;\r\n","import React, { useEffect, useMemo, useState } from 'react';\r\nimport { normalizeRmkeyList } from './helpers';\r\nimport FlightResultCardOneWay from './FlightResultCardOneWay';\r\nimport FlightResultCardOnward from './FlightResultCardOnward';\r\nimport FlightResultCardReturn from './FlightResultCardReturn';\r\nimport FlightResultCardRoundTripCombined from './FlightResultCardRoundTripCombined';\r\n\r\nfunction FlightResultCards({\r\n cards = [],\r\n airlinesMap = {},\r\n disableBook = false,\r\n disableViewAll = false,\r\n recommendationCriteria = null,\r\n onAvailabilitySuccess = () => {},\r\n onAvailabilityReset = () => {},\r\n sectionTitle = '',\r\n cardVariant = 'oneway',\r\n sectionClassName = '',\r\n selectionMode = false,\r\n selectedId = null,\r\n onSelectCard = () => {},\r\n peerSelectedPayloadIndex = null,\r\n}) {\r\n const [showAll, setShowAll] = useState(false);\r\n const [hoveredBookId, setHoveredBookId] = useState(null);\r\n const [bookError, setBookError] = useState('');\r\n const [expandedDetailIds, setExpandedDetailIds] = useState(() => ({}));\r\n\r\n const cheapestPrice = useMemo(\r\n () =>\r\n cards.reduce((min, card) => {\r\n const value = Number(card?.price);\r\n if (!Number.isFinite(value)) return min;\r\n return value < min ? value : min;\r\n }, Number.POSITIVE_INFINITY),\r\n [cards],\r\n );\r\n const cheapestCardId = useMemo(() => {\r\n if (!Number.isFinite(cheapestPrice)) return null;\r\n const cheapestCard = cards.find(\r\n (card) => Number(card?.price) === cheapestPrice,\r\n );\r\n return cheapestCard?.id || null;\r\n }, [cards, cheapestPrice]);\r\n const recommendedCardId = useMemo(() => {\r\n if (!cards.length) return null;\r\n const matched = cards.find((card) =>\r\n isCardMatchingRecommendation(card, recommendationCriteria),\r\n );\r\n return matched?.id || null;\r\n }, [cards, recommendationCriteria]);\r\n\r\n useEffect(() => {\r\n if (!showAll) return undefined;\r\n const previousOverflow = document.body.style.overflow;\r\n const onKeyDown = (event) => {\r\n if (event.key === 'Escape') setShowAll(false);\r\n };\r\n document.body.style.overflow = 'hidden';\r\n window.addEventListener('keydown', onKeyDown);\r\n return () => {\r\n document.body.style.overflow = previousOverflow;\r\n window.removeEventListener('keydown', onKeyDown);\r\n };\r\n }, [showAll]);\r\n\r\n const toLegSummary = (leg, fallback = {}) => ({\r\n airline:\r\n String(leg?.airline || fallback?.airline || '').trim() || 'Unknown airline',\r\n flightNumber:\r\n String(leg?.flightNumber || fallback?.flightNumber || '').trim() || 'N/A',\r\n departureTime:\r\n String(leg?.departureTime || fallback?.departureTime || '').trim() || '--:--',\r\n arrivalTime:\r\n String(leg?.arrivalTime || fallback?.arrivalTime || '').trim() || '--:--',\r\n stops: Number(\r\n leg?.stops !== undefined && leg?.stops !== null\r\n ? leg.stops\r\n : fallback?.stops || 0,\r\n ),\r\n });\r\n\r\n const handleBookClick = (flight) => {\r\n if (disableBook) {\r\n return;\r\n }\r\n if (showAll) {\r\n closeExpandedView();\r\n }\r\n\r\n const rmkeyList = normalizeRmkeyList(flight?.rmkey);\r\n const rtRmkeyList = normalizeRmkeyList(flight?.rtrmkey);\r\n const fareAvailabilityPayload = buildFareAvailabilityPayload({\r\n flight,\r\n cardVariant,\r\n rmkeyList,\r\n rtRmkeyList,\r\n });\r\n\r\n if (\r\n !String(fareAvailabilityPayload?.ukey || '').trim() ||\r\n !Array.isArray(fareAvailabilityPayload?.rmkey) ||\r\n fareAvailabilityPayload.rmkey.length === 0 ||\r\n !String(fareAvailabilityPayload?.styp || '').trim()\r\n ) {\r\n setBookError('Grip key missing for selected flight.');\r\n return;\r\n }\r\n\r\n setBookError('');\r\n const isCombinedRoundTripCard =\r\n cardVariant === 'combined' ||\r\n (flight?.onwardLeg && flight?.returnLeg) ||\r\n Number(flight?.tt || 0) === 2;\r\n const bookingSummary = isCombinedRoundTripCard\r\n ? {\r\n type: 'split_roundtrip',\r\n onward: toLegSummary(flight?.onwardLeg, flight),\r\n return: toLegSummary(flight?.returnLeg, {}),\r\n }\r\n : toLegSummary(flight);\r\n window.dispatchEvent(\r\n new CustomEvent('flight-booking:confirm-request', {\r\n detail: {\r\n flightId: String(flight?.id || ''),\r\n cardVariant,\r\n fareAvailabilityPayload,\r\n summary: bookingSummary,\r\n },\r\n }),\r\n );\r\n };\r\n\r\n const visibleCards = cards.slice(0, 3);\r\n const CardComponent =\r\n cardVariant === 'onward'\r\n ? FlightResultCardOnward\r\n : cardVariant === 'return'\r\n ? FlightResultCardReturn\r\n : cardVariant === 'combined'\r\n ? FlightResultCardRoundTripCombined\r\n : FlightResultCardOneWay;\r\n\r\n const closeExpandedView = () => setShowAll(false);\r\n const toggleCardDetails = (cardId) => {\r\n setExpandedDetailIds((prev) => ({\r\n ...prev,\r\n [cardId]: !prev[cardId],\r\n }));\r\n };\r\n const handleSelectCard = (card) => {\r\n if (disableBook) {\r\n return;\r\n }\r\n onSelectCard(card);\r\n if (showAll) {\r\n closeExpandedView();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <div\r\n className={`flight-results__section ${sectionClassName}`.trim()}\r\n >\r\n {sectionTitle ? (\r\n <div className=\"flight-results__section-title\">{sectionTitle}</div>\r\n ) : null}\r\n <div\r\n className={`flight-results__cards-scroll ${showAll ? 'flight-results__cards-scroll--expanded' : ''}`.trim()}\r\n >\r\n {(showAll ? cards : visibleCards).map((item, itemIndex) => {\r\n const dimmed =\r\n peerSelectedPayloadIndex != null &&\r\n Number(item.payloadIndex) !== Number(peerSelectedPayloadIndex);\r\n return (\r\n <CardComponent\r\n key={item.id}\r\n card={item}\r\n cardPositionIndex={itemIndex}\r\n cheapestPrice={cheapestPrice}\r\n isCheapest={item.id === cheapestCardId}\r\n isRecommended={item.id === recommendedCardId}\r\n disableBook={disableBook}\r\n bookingFlightId={null}\r\n hoveredBookId={hoveredBookId}\r\n onHoverChange={setHoveredBookId}\r\n onBookClick={handleBookClick}\r\n selectionMode={selectionMode}\r\n isSelected={selectionMode && item.id === selectedId}\r\n onSelectClick={handleSelectCard}\r\n dimmed={selectionMode && dimmed}\r\n displayMode=\"compact\"\r\n isDetailsOpen={Boolean(expandedDetailIds[item.id])}\r\n onToggleDetails={() => toggleCardDetails(item.id)}\r\n />\r\n );\r\n })}\r\n </div>\r\n {!selectionMode && bookError ? (\r\n <div className=\"flight-results__error-text\">{bookError}</div>\r\n ) : null}\r\n {cards.length > 3 && !showAll ? (\r\n <button\r\n type=\"button\"\r\n className=\"flight-results__toggle-btn\"\r\n data-flight-leg={\r\n cardVariant === 'onward' || cardVariant === 'return'\r\n ? cardVariant\r\n : undefined\r\n }\r\n disabled={disableViewAll}\r\n onClick={() => {\r\n if (disableViewAll) return;\r\n setShowAll(true);\r\n }}\r\n >\r\n {`View All (${cards.length})`}\r\n </button>\r\n ) : null}\r\n </div>\r\n {showAll ? (\r\n <div className=\"flight-results__inline-expanded-footer\">\r\n <button\r\n type=\"button\"\r\n className=\"flight-results__inline-expanded-close\"\r\n onClick={closeExpandedView}\r\n aria-label=\"Collapse flight list\"\r\n >\r\n View Less\r\n </button>\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n}\r\n\r\nfunction buildFareAvailabilityPayload({\r\n flight,\r\n cardVariant,\r\n rmkeyList,\r\n rtRmkeyList,\r\n}) {\r\n const tt = Number(flight?.tt || 1);\r\n const styp = String(flight?.styp || '')\r\n .trim()\r\n .toLowerCase();\r\n const basePayload = {\r\n ukey: String(flight?.ukey || '').trim(),\r\n rmkey: rmkeyList,\r\n rtrmkey: rtRmkeyList,\r\n rukey: String(flight?.rukey || '').trim(),\r\n apcoup: String(flight?.apcoup ?? '0'),\r\n styp: String(flight?.styp || '').trim(),\r\n };\r\n\r\n if (tt !== 2) {\r\n return basePayload;\r\n }\r\n\r\n if (styp === 'split') {\r\n if (cardVariant === 'return') {\r\n return {\r\n ...basePayload,\r\n ukey: String(flight?.ukey || flight?.rukey || '').trim(),\r\n rmkey: rmkeyList,\r\n apcoup: String(flight?.rtapcoup ?? flight?.apcoup ?? '0'),\r\n };\r\n }\r\n return {\r\n ...basePayload,\r\n apcoup: String(flight?.apcoup ?? '0'),\r\n };\r\n }\r\n\r\n if (styp === 'combined') {\r\n const mergedRmkey = [...rmkeyList, ...rtRmkeyList].filter(\r\n (item, idx, arr) => item && arr.indexOf(item) === idx,\r\n );\r\n return {\r\n ukey: String(flight?.ukey || '').trim(),\r\n rmkey: mergedRmkey,\r\n rukey: '',\r\n apcoup: String(flight?.apcoup ?? '0'),\r\n rtapcoup: String(flight?.rtapcoup ?? '0'),\r\n styp: String(flight?.styp || '').trim(),\r\n };\r\n }\r\n\r\n return basePayload;\r\n}\r\n\r\nfunction isCardMatchingRecommendation(card, criteria) {\r\n if (!card || !criteria) return false;\r\n const hasAnyHint = [\r\n criteria.airlineCode,\r\n criteria.departureTime,\r\n criteria.origin,\r\n criteria.destination,\r\n criteria.departureDate,\r\n criteria.price,\r\n ].some((value) => value !== '' && value !== null && value !== undefined);\r\n if (!hasAnyHint) return false;\r\n\r\n const airlineMatches = criteria.airlineCode\r\n ? String(card?.airlineCode || '')\r\n .trim()\r\n .toUpperCase() === String(criteria.airlineCode).trim().toUpperCase()\r\n : true;\r\n const departureTimeMatches = criteria.departureTime\r\n ? normalizeTime(card?.departureTime) ===\r\n normalizeTime(criteria.departureTime)\r\n : true;\r\n const originMatches = criteria.origin\r\n ? String(card?.origin || '')\r\n .trim()\r\n .toUpperCase() === String(criteria.origin).trim().toUpperCase()\r\n : true;\r\n const destinationMatches = criteria.destination\r\n ? String(card?.destination || '')\r\n .trim()\r\n .toUpperCase() === String(criteria.destination).trim().toUpperCase()\r\n : true;\r\n const dateMatches = criteria.departureDate\r\n ? normalizeDateToIso(card?.departureDate) ===\r\n normalizeDateToIso(criteria.departureDate)\r\n : true;\r\n const priceMatches =\r\n typeof criteria.price === 'number'\r\n ? Number.isFinite(Number(card?.price)) &&\r\n Math.abs(Number(card?.price) - criteria.price) < 0.01\r\n : true;\r\n\r\n return (\r\n airlineMatches &&\r\n departureTimeMatches &&\r\n originMatches &&\r\n destinationMatches &&\r\n dateMatches &&\r\n priceMatches\r\n );\r\n}\r\n\r\nfunction normalizeTime(value) {\r\n const raw = String(value || '').trim();\r\n if (!raw) return '';\r\n const match = raw.match(/^([0-2]?\\d):([0-5]\\d)$/);\r\n if (!match) return '';\r\n return `${String(Number(match[1])).padStart(2, '0')}:${match[2]}`;\r\n}\r\n\r\nfunction normalizeDateToIso(value) {\r\n const raw = String(value || '').trim();\r\n if (!raw) return '';\r\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(raw)) return raw;\r\n if (/^\\d{2}-\\d{2}-\\d{4}$/.test(raw)) {\r\n const [dd, mm, yyyy] = raw.split('-');\r\n return `${yyyy}-${mm}-${dd}`;\r\n }\r\n const date = new Date(raw);\r\n if (Number.isNaN(date.getTime())) return '';\r\n return date.toISOString().slice(0, 10);\r\n}\r\n\r\nexport default FlightResultCards;\r\n","import React, { useMemo } from 'react';\r\nimport FlightResultCards from './FlightResultCards';\r\nimport { buildAirportMappings } from './helpers';\r\n\r\nfunction FlightResultsOneWay({\r\n payload = [],\r\n airlinesMap = {},\r\n flightImagesBaseUrl = '',\r\n recommendationCriteria = null,\r\n onAvailabilitySuccess,\r\n onAvailabilityReset,\r\n disableBook,\r\n}) {\r\n const cards = useMemo(() => {\r\n return payload.flatMap((item, payloadIndex) => {\r\n const trips = Array.isArray(item?.trps) ? item.trps : [];\r\n return trips.map((trip, tripIndex) => {\r\n const airportMappings = buildAirportMappings(item?.mappings);\r\n const dep = trip?.deps?.[0];\r\n const segments = Array.isArray(dep?.seg) ? dep.seg : [];\r\n const firstSeg = segments[0] || {};\r\n const lastSeg = segments[segments.length - 1] || firstSeg;\r\n const fare = trip?.prc?.[0]?.pr || {};\r\n const cabinBag = fare?.cbn || fare?.cabin || fare?.cabinBag || '';\r\n const checkinBag =\r\n fare?.checkin || fare?.checkIn || fare?.checkinBag || '';\r\n const refundableFlag = String(\r\n fare?.fareType || fare?.ft || fare?.refundable || fare?.rfnd || '',\r\n ).trim();\r\n const fareType = refundableFlag\r\n ? refundableFlag\r\n : Number(fare?.rf || 0) === 1\r\n ? 'Refundable'\r\n : 'Published';\r\n const airlineCode = String(\r\n firstSeg?.ma || firstSeg?.ac || 'N/A',\r\n ).toUpperCase();\r\n const airlineName =\r\n airlinesMap[airlineCode] || firstSeg?.airlineName || airlineCode;\r\n const logoBase = flightImagesBaseUrl.endsWith('/')\r\n ? flightImagesBaseUrl\r\n : `${flightImagesBaseUrl}/`;\r\n\r\n return {\r\n id: `${item?.ukey || payloadIndex}-oneway-${tripIndex}`,\r\n ukey: item?.ukey || '',\r\n rmkey: fare?.rmkey || [],\r\n apcoup: fare?.apcoup ?? item?.apcoup ?? '0',\r\n styp: item?.styp || '',\r\n tt: Number(item?.tt || 1),\r\n legType: 'onward',\r\n isCombinedRoundTrip: false,\r\n airline: airlineName,\r\n airlineCode,\r\n flightNumber: firstSeg?.fn || 'N/A',\r\n airlineLogo: flightImagesBaseUrl\r\n ? `${logoBase}${airlineCode}.png`\r\n : '',\r\n origin: firstSeg?.da || 'N/A',\r\n destination: lastSeg?.ar || 'N/A',\r\n departureTime: String(firstSeg?.dt || '').trim() || '--:--',\r\n arrivalTime: String(lastSeg?.at || '').trim() || '--:--',\r\n departureDate: firstSeg?.dd || '',\r\n arrivalDate: lastSeg?.ad || '',\r\n duration: dep?.tdur || firstSeg?.fdur || 'N/A',\r\n stops: Math.max(segments.length - 1, 0),\r\n price: fare?.tf ?? 'N/A',\r\n departureAirportName:\r\n firstSeg?.dap ||\r\n firstSeg?.dnam ||\r\n firstSeg?.dnm ||\r\n `${firstSeg?.da || 'Origin'} Airport`,\r\n arrivalAirportName:\r\n lastSeg?.aap ||\r\n lastSeg?.anam ||\r\n lastSeg?.anm ||\r\n `${lastSeg?.ar || 'Destination'} Airport`,\r\n travelClass: firstSeg?.cc || firstSeg?.cls || item?.cls || 'Economy',\r\n cabinBaggage: String(cabinBag || '7 Kg per adult'),\r\n checkInBaggage: String(\r\n checkinBag || '15 Kg (1 Piece only) per adult',\r\n ),\r\n fareType,\r\n airportMappings,\r\n segments: segments.map((seg, idx) => {\r\n const segmentAirlineCode = String(\r\n seg?.ma || seg?.ac || airlineCode,\r\n ).toUpperCase();\r\n return {\r\n id: `${item?.ukey || payloadIndex}-${tripIndex}-seg-${idx}`,\r\n airlineCode: segmentAirlineCode,\r\n airline:\r\n airlinesMap[segmentAirlineCode] ||\r\n seg?.airlineName ||\r\n segmentAirlineCode,\r\n airlineLogo: flightImagesBaseUrl\r\n ? `${logoBase}${segmentAirlineCode}.png`\r\n : '',\r\n origin: seg?.da || '',\r\n destination: seg?.ar || '',\r\n departureAirportName:\r\n seg?.dap || seg?.dnam || seg?.dnm || `${seg?.da || 'Origin'} Airport`,\r\n arrivalAirportName:\r\n seg?.aap ||\r\n seg?.anam ||\r\n seg?.anm ||\r\n `${seg?.ar || 'Destination'} Airport`,\r\n departureDate: seg?.dd || '',\r\n arrivalDate: seg?.ad || '',\r\n departureTime: seg?.dt || '',\r\n arrivalTime: seg?.at || '',\r\n duration: seg?.fdur || '',\r\n flightNumber: seg?.fn || '',\r\n airportMappings,\r\n layoverDuration: seg?.ldur || '',\r\n };\r\n }),\r\n currency:\r\n String(item?.cur || trip?.cur || 'INR')\r\n .trim()\r\n .toUpperCase() || 'INR',\r\n adt: Number(item?.adt ?? 1),\r\n chd: Number(item?.chd ?? 0),\r\n inf: Number(item?.inf ?? 0),\r\n paxPrices: trip?.prc?.[0]?.paxpr || [],\r\n baseFare: fare?.bf || 0,\r\n taxAmount: Number(fare?.tf || 0) - Number(fare?.bf || 0),\r\n discount: fare?.madisc || 0,\r\n passportRequired:\r\n String(item?.ps || '').toUpperCase() === 'Y' ||\r\n String(item?.sectyp || '').toLowerCase() === 'int',\r\n payloadIndex,\r\n moreFares: Array.isArray(trip?.prc) ? trip.prc : [],\r\n };\r\n });\r\n });\r\n }, [payload, airlinesMap, flightImagesBaseUrl]);\r\n\r\n return (\r\n <FlightResultCards\r\n cards={cards}\r\n airlinesMap={airlinesMap}\r\n disableBook={disableBook}\r\n disableViewAll={disableBook}\r\n recommendationCriteria={recommendationCriteria}\r\n onAvailabilitySuccess={onAvailabilitySuccess}\r\n onAvailabilityReset={onAvailabilityReset}\r\n cardVariant=\"oneway\"\r\n />\r\n );\r\n}\r\n\r\nexport default FlightResultsOneWay;\r\n","import React, { useMemo, useState } from 'react';\r\nimport FlightResultCards from './FlightResultCards';\r\nimport {\r\n buildAirportMappings,\r\n buildSplitPairedFareAvailabilityPayload,\r\n getCurrencySymbol,\r\n} from './helpers';\r\n\r\nfunction mapTripCard({\r\n trip,\r\n tripIndex,\r\n legType,\r\n item,\r\n payloadIndex,\r\n airlinesMap,\r\n flightImagesBaseUrl,\r\n}) {\r\n const airportMappings = buildAirportMappings(item?.mappings);\r\n const dep = trip?.deps?.[0];\r\n const segments = Array.isArray(dep?.seg) ? dep.seg : [];\r\n const firstSeg = segments[0] || {};\r\n const lastSeg = segments[segments.length - 1] || firstSeg;\r\n const fare = trip?.prc?.[0]?.pr || {};\r\n const cabinBag = fare?.cbn || fare?.cabin || fare?.cabinBag || '';\r\n const checkinBag = fare?.checkin || fare?.checkIn || fare?.checkinBag || '';\r\n const refundableFlag = String(\r\n fare?.fareType || fare?.ft || fare?.refundable || fare?.rfnd || '',\r\n ).trim();\r\n const fareType = refundableFlag\r\n ? refundableFlag\r\n : Number(fare?.rf || 0) === 1\r\n ? 'Refundable'\r\n : 'Published';\r\n const airlineCode = String(\r\n firstSeg?.ma || firstSeg?.ac || 'N/A',\r\n ).toUpperCase();\r\n const airlineName =\r\n airlinesMap[airlineCode] || firstSeg?.airlineName || airlineCode;\r\n const logoBase = flightImagesBaseUrl.endsWith('/')\r\n ? flightImagesBaseUrl\r\n : `${flightImagesBaseUrl}/`;\r\n\r\n return {\r\n id: `${item?.ukey || payloadIndex}-${legType}-${tripIndex}`,\r\n ukey:\r\n legType === 'return' ? item?.rukey || item?.ukey || '' : item?.ukey || '',\r\n rukey: item?.rukey || '',\r\n rmkey: fare?.rmkey || [],\r\n rtrmkey: fare?.rtrmkey || [],\r\n apcoup: fare?.apcoup ?? item?.apcoup ?? '0',\r\n rtapcoup: fare?.rtcoup ?? item?.rtapcoup ?? '0',\r\n styp: item?.styp || '',\r\n tt: Number(item?.tt || 1),\r\n legType,\r\n isCombinedRoundTrip: false,\r\n airline: airlineName,\r\n airlineCode,\r\n flightNumber: firstSeg?.fn || 'N/A',\r\n airlineLogo: flightImagesBaseUrl ? `${logoBase}${airlineCode}.png` : '',\r\n origin: firstSeg?.da || 'N/A',\r\n destination: lastSeg?.ar || 'N/A',\r\n departureTime: String(firstSeg?.dt || '').trim() || '--:--',\r\n arrivalTime: String(lastSeg?.at || '').trim() || '--:--',\r\n departureDate: firstSeg?.dd || '',\r\n arrivalDate: lastSeg?.ad || '',\r\n duration: dep?.tdur || firstSeg?.fdur || 'N/A',\r\n stops: Math.max(segments.length - 1, 0),\r\n price: fare?.tf ?? 'N/A',\r\n departureAirportName:\r\n firstSeg?.dap ||\r\n firstSeg?.dnam ||\r\n firstSeg?.dnm ||\r\n `${firstSeg?.da || 'Origin'} Airport`,\r\n arrivalAirportName:\r\n lastSeg?.aap ||\r\n lastSeg?.anam ||\r\n lastSeg?.anm ||\r\n `${lastSeg?.ar || 'Destination'} Airport`,\r\n travelClass: firstSeg?.cc || firstSeg?.cls || item?.cls || 'Economy',\r\n cabinBaggage: String(cabinBag || '7 Kg per adult'),\r\n checkInBaggage: String(checkinBag || '15 Kg (1 Piece only) per adult'),\r\n fareType,\r\n airportMappings,\r\n segments: segments.map((seg, idx) => {\r\n const segmentAirlineCode = String(\r\n seg?.ma || seg?.ac || airlineCode,\r\n ).toUpperCase();\r\n return {\r\n id: `${item?.ukey || payloadIndex}-${legType}-${tripIndex}-seg-${idx}`,\r\n airlineCode: segmentAirlineCode,\r\n airline:\r\n airlinesMap[segmentAirlineCode] ||\r\n seg?.airlineName ||\r\n segmentAirlineCode,\r\n airlineLogo: flightImagesBaseUrl\r\n ? `${logoBase}${segmentAirlineCode}.png`\r\n : '',\r\n origin: seg?.da || '',\r\n destination: seg?.ar || '',\r\n departureAirportName:\r\n seg?.dap || seg?.dnam || seg?.dnm || `${seg?.da || 'Origin'} Airport`,\r\n arrivalAirportName:\r\n seg?.aap ||\r\n seg?.anam ||\r\n seg?.anm ||\r\n `${seg?.ar || 'Destination'} Airport`,\r\n departureDate: seg?.dd || '',\r\n arrivalDate: seg?.ad || '',\r\n departureTime: seg?.dt || '',\r\n arrivalTime: seg?.at || '',\r\n duration: seg?.fdur || '',\r\n flightNumber: seg?.fn || '',\r\n airportMappings,\r\n layoverDuration: seg?.ldur || '',\r\n };\r\n }),\r\n currency:\r\n String(item?.cur || trip?.cur || 'INR')\r\n .trim()\r\n .toUpperCase() || 'INR',\r\n adt: Number(item?.adt ?? 1),\r\n chd: Number(item?.chd ?? 0),\r\n inf: Number(item?.inf ?? 0),\r\n paxPrices: trip?.prc?.[0]?.paxpr || [],\r\n baseFare: fare?.bf || 0,\r\n taxAmount: Number(fare?.tf || 0) - Number(fare?.bf || 0),\r\n discount: fare?.madisc || 0,\r\n moreFares: Array.isArray(trip?.prc) ? trip.prc : [],\r\n payloadIndex,\r\n };\r\n}\r\n\r\nfunction FlightResultsRoundTripSplit({\r\n payload = [],\r\n airlinesMap = {},\r\n flightImagesBaseUrl = '',\r\n recommendationCriteria = null,\r\n onAvailabilitySuccess,\r\n onAvailabilityReset,\r\n disableBook,\r\n}) {\r\n const [selectedOnward, setSelectedOnward] = useState(null);\r\n const [selectedReturn, setSelectedReturn] = useState(null);\r\n const [bookError, setBookError] = useState('');\r\n const [bookingSplit, setBookingSplit] = useState(false);\r\n const resolveUserUid = () => {\r\n try {\r\n const rawUser = localStorage.getItem('user');\r\n if (rawUser) {\r\n const parsed = JSON.parse(rawUser);\r\n const fromStore = String(parsed?.uid || parsed?.user?.uid || '').trim();\r\n if (fromStore) return fromStore;\r\n }\r\n } catch (error) {\r\n // ignore\r\n }\r\n const fromEnv = String(\r\n process.env.REACT_APP_FREQUENT_TRAVELLER_UID ||\r\n process.env.REACT_APP_USER_UID ||\r\n '',\r\n ).trim();\r\n if (fromEnv) return fromEnv;\r\n return '1058';\r\n };\r\n const toErrorText = (value, fallback) => {\r\n if (typeof value === 'string') return value;\r\n if (typeof value === 'number' || typeof value === 'boolean')\r\n return String(value);\r\n if (value && typeof value === 'object') {\r\n const preferred =\r\n value?.message || value?.error || value?.details || value?.msg;\r\n if (preferred) return String(preferred);\r\n try {\r\n return JSON.stringify(value);\r\n } catch (error) {\r\n return fallback;\r\n }\r\n }\r\n return fallback;\r\n };\r\n\r\n const onwardCards = useMemo(() => {\r\n return payload.flatMap((item, payloadIndex) => {\r\n const trips = Array.isArray(item?.trps) ? item.trps : [];\r\n return trips.map((trip, tripIndex) =>\r\n mapTripCard({\r\n trip,\r\n tripIndex,\r\n legType: 'onward',\r\n item,\r\n payloadIndex,\r\n airlinesMap,\r\n flightImagesBaseUrl,\r\n }),\r\n );\r\n });\r\n }, [payload, airlinesMap, flightImagesBaseUrl]);\r\n\r\n const returnCards = useMemo(() => {\r\n return payload.flatMap((item, payloadIndex) => {\r\n const trips = Array.isArray(item?.rttrps) ? item.rttrps : [];\r\n return trips.map((trip, tripIndex) =>\r\n mapTripCard({\r\n trip,\r\n tripIndex,\r\n legType: 'return',\r\n item,\r\n payloadIndex,\r\n airlinesMap,\r\n flightImagesBaseUrl,\r\n }),\r\n );\r\n });\r\n }, [payload, airlinesMap, flightImagesBaseUrl]);\r\n\r\n const handleSelectOnward = (card) => {\r\n setSelectedOnward(card);\r\n setSelectedReturn((prev) =>\r\n prev && Number(prev.payloadIndex) !== Number(card.payloadIndex)\r\n ? null\r\n : prev,\r\n );\r\n setBookError('');\r\n };\r\n\r\n const handleSelectReturn = (card) => {\r\n setSelectedReturn(card);\r\n setSelectedOnward((prev) =>\r\n prev && Number(prev.payloadIndex) !== Number(card.payloadIndex)\r\n ? null\r\n : prev,\r\n );\r\n setBookError('');\r\n };\r\n\r\n const handleSplitBook = () => {\r\n if (disableBook) {\r\n return;\r\n }\r\n const fareAvailabilityPayload = buildSplitPairedFareAvailabilityPayload(\r\n selectedOnward,\r\n selectedReturn,\r\n );\r\n if (!fareAvailabilityPayload) {\r\n setBookError(\r\n 'Select an onward and a return flight from the same result group (matching row).',\r\n );\r\n return;\r\n }\r\n if (\r\n !String(fareAvailabilityPayload.ukey || '').trim() ||\r\n !Array.isArray(fareAvailabilityPayload.rmkey) ||\r\n fareAvailabilityPayload.rmkey.length === 0 ||\r\n !String(fareAvailabilityPayload.styp || '').trim()\r\n ) {\r\n setBookError('Grip key missing for selected flights.');\r\n return;\r\n }\r\n setBookError('');\r\n window.dispatchEvent(\r\n new CustomEvent('flight-booking:confirm-request', {\r\n detail: {\r\n fareAvailabilityPayload,\r\n summary: {\r\n type: 'split_roundtrip',\r\n onward: selectedOnward\r\n ? {\r\n airline: String(selectedOnward?.airline || '').trim(),\r\n flightNumber: String(\r\n selectedOnward?.flightNumber || '',\r\n ).trim(),\r\n departureTime: String(\r\n selectedOnward?.departureTime || '',\r\n ).trim(),\r\n arrivalTime: String(selectedOnward?.arrivalTime || '').trim(),\r\n stops: Number(selectedOnward?.stops || 0),\r\n }\r\n : null,\r\n return: selectedReturn\r\n ? {\r\n airline: String(selectedReturn?.airline || '').trim(),\r\n flightNumber: String(\r\n selectedReturn?.flightNumber || '',\r\n ).trim(),\r\n departureTime: String(\r\n selectedReturn?.departureTime || '',\r\n ).trim(),\r\n arrivalTime: String(selectedReturn?.arrivalTime || '').trim(),\r\n stops: Number(selectedReturn?.stops || 0),\r\n }\r\n : null,\r\n },\r\n },\r\n }),\r\n );\r\n };\r\n\r\n const splitBookDisabled = disableBook || !selectedOnward || !selectedReturn;\r\n const showSplitSelectionBar = Boolean(selectedOnward || selectedReturn);\r\n const onwardPrice = Number(selectedOnward?.price);\r\n const returnPrice = Number(selectedReturn?.price);\r\n const totalPrice =\r\n Number.isFinite(onwardPrice) && Number.isFinite(returnPrice)\r\n ? onwardPrice + returnPrice\r\n : null;\r\n const displayCurrency = getCurrencySymbol(\r\n selectedOnward?.currency || selectedReturn?.currency || 'INR',\r\n );\r\n\r\n const formatAmount = (value) =>\r\n Number.isFinite(value)\r\n ? new Intl.NumberFormat('en-IN', { maximumFractionDigits: 0 }).format(\r\n value,\r\n )\r\n : '--';\r\n\r\n return (\r\n <div>\r\n <FlightResultCards\r\n cards={onwardCards}\r\n airlinesMap={airlinesMap}\r\n disableBook={disableBook}\r\n disableViewAll={disableBook}\r\n recommendationCriteria={recommendationCriteria}\r\n onAvailabilitySuccess={onAvailabilitySuccess}\r\n onAvailabilityReset={onAvailabilityReset}\r\n sectionTitle=\"Round Trip - Onward\"\r\n sectionClassName=\"flight-results__section--split\"\r\n cardVariant=\"onward\"\r\n selectionMode\r\n selectedId={selectedOnward?.id || null}\r\n onSelectCard={handleSelectOnward}\r\n peerSelectedPayloadIndex={\r\n selectedReturn != null ? selectedReturn.payloadIndex : null\r\n }\r\n />\r\n <FlightResultCards\r\n cards={returnCards}\r\n airlinesMap={airlinesMap}\r\n disableBook={disableBook}\r\n disableViewAll={disableBook}\r\n recommendationCriteria={recommendationCriteria}\r\n onAvailabilitySuccess={onAvailabilitySuccess}\r\n onAvailabilityReset={onAvailabilityReset}\r\n sectionTitle=\"Round Trip - Return\"\r\n sectionClassName=\"flight-results__section--split\"\r\n cardVariant=\"return\"\r\n selectionMode\r\n selectedId={selectedReturn?.id || null}\r\n onSelectCard={handleSelectReturn}\r\n peerSelectedPayloadIndex={\r\n selectedOnward != null ? selectedOnward.payloadIndex : null\r\n }\r\n />\r\n {showSplitSelectionBar ? (\r\n <div className=\"flight-split__sticky-wrap\">\r\n <div className=\"flight-split__book-bar\">\r\n <div className=\"flight-split__selection-card\">\r\n <div className=\"flight-split__leg-label\">Onward</div>\r\n <div className=\"flight-split__selection-route\">\r\n {selectedOnward\r\n ? `${selectedOnward.origin} -> ${selectedOnward.destination}`\r\n : '--'}\r\n </div>\r\n <div className=\"flight-split__selection-time\">\r\n {selectedOnward\r\n ? `${selectedOnward.departureTime} -> ${selectedOnward.arrivalTime}`\r\n : 'Select onward flight'}\r\n </div>\r\n <div className=\"flight-split__selection-fare\">\r\n {selectedOnward\r\n ? `${displayCurrency} ${formatAmount(onwardPrice)}`\r\n : `${displayCurrency} --`}\r\n </div>\r\n </div>\r\n <div className=\"flight-split__selection-card\">\r\n <div className=\"flight-split__leg-label\">Return</div>\r\n <div className=\"flight-split__selection-route\">\r\n {selectedReturn\r\n ? `${selectedReturn.origin} -> ${selectedReturn.destination}`\r\n : '--'}\r\n </div>\r\n <div className=\"flight-split__selection-time\">\r\n {selectedReturn\r\n ? `${selectedReturn.departureTime} -> ${selectedReturn.arrivalTime}`\r\n : 'Select return flight'}\r\n </div>\r\n <div className=\"flight-split__selection-fare\">\r\n {selectedReturn\r\n ? `${displayCurrency} ${formatAmount(returnPrice)}`\r\n : `${displayCurrency} --`}\r\n </div>\r\n </div>\r\n <div className=\"flight-split__total-card\">\r\n <div className=\"flight-split__total-amount\">\r\n {displayCurrency} {formatAmount(totalPrice)}\r\n </div>\r\n <div className=\"flight-split__book-hint\">\r\n Select one onward and one return from the same row, then\r\n continue.\r\n </div>\r\n <button\r\n type=\"button\"\r\n className={`flight-split__book-btn ${splitBookDisabled ? 'flight-split__book-btn--disabled' : ''}`}\r\n data-voice-action=\"book-split-flight\"\r\n disabled={splitBookDisabled}\r\n onClick={handleSplitBook}\r\n >\r\n Book Now\r\n </button>\r\n </div>\r\n </div>\r\n {bookError ? (\r\n <div className=\"flight-results__error-text\">{bookError}</div>\r\n ) : null}\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nexport default FlightResultsRoundTripSplit;\r\n","import React, { useMemo } from 'react';\r\nimport FlightResultCards from './FlightResultCards';\r\n\r\nfunction FlightResultsRoundTripCombined({\r\n payload = [],\r\n airlinesMap = {},\r\n flightImagesBaseUrl = '',\r\n recommendationCriteria = null,\r\n onAvailabilitySuccess,\r\n onAvailabilityReset,\r\n disableBook,\r\n}) {\r\n const toTripList = (value) => {\r\n if (Array.isArray(value)) return value;\r\n if (value && typeof value === 'object') return [value];\r\n return [];\r\n };\r\n\r\n const normalizeCombinedStyp = (item, tripFare = {}) => {\r\n return String(item?.styp || tripFare?.styp || '')\r\n .trim()\r\n .toLowerCase();\r\n };\r\n\r\n const cards = useMemo(() => {\r\n const buildLeg = (segments = [], fallbackLabel = '') => {\r\n const firstSeg = segments[0] || {};\r\n const lastSeg = segments[segments.length - 1] || firstSeg;\r\n const logoBase = flightImagesBaseUrl.endsWith('/')\r\n ? flightImagesBaseUrl\r\n : `${flightImagesBaseUrl}/`;\r\n return {\r\n airlineCode: String(\r\n firstSeg?.ma || firstSeg?.ac || fallbackLabel || 'N/A',\r\n ).toUpperCase(),\r\n airline:\r\n airlinesMap[\r\n String(\r\n firstSeg?.ma || firstSeg?.ac || fallbackLabel || 'N/A',\r\n ).toUpperCase()\r\n ] ||\r\n String(\r\n firstSeg?.ma || firstSeg?.ac || fallbackLabel || 'N/A',\r\n ).toUpperCase(),\r\n flightNumber: firstSeg?.fn || 'N/A',\r\n origin: firstSeg?.da || 'N/A',\r\n destination: lastSeg?.ar || 'N/A',\r\n departureTime: String(firstSeg?.dt || '').trim() || '--:--',\r\n arrivalTime: String(lastSeg?.at || '').trim() || '--:--',\r\n departureDate: firstSeg?.dd || '',\r\n arrivalDate: lastSeg?.ad || '',\r\n departureAirportName:\r\n firstSeg?.dap ||\r\n firstSeg?.dnam ||\r\n firstSeg?.dnm ||\r\n `${firstSeg?.da || 'Origin'} Airport`,\r\n arrivalAirportName:\r\n lastSeg?.aap ||\r\n lastSeg?.anam ||\r\n lastSeg?.anm ||\r\n `${lastSeg?.ar || 'Destination'} Airport`,\r\n duration: firstSeg?.fdur || 'N/A',\r\n stops: Math.max(segments.length - 1, 0),\r\n segments: segments.map((segment, segmentIndex) => ({\r\n id: `${segment?.ma || 'XX'}-${segment?.fn || segmentIndex}`,\r\n airlineCode: String(\r\n segment?.ma || segment?.ac || fallbackLabel || 'N/A',\r\n ).toUpperCase(),\r\n airline:\r\n airlinesMap[\r\n String(\r\n segment?.ma || segment?.ac || fallbackLabel || 'N/A',\r\n ).toUpperCase()\r\n ] ||\r\n String(\r\n segment?.ma || segment?.ac || fallbackLabel || 'N/A',\r\n ).toUpperCase(),\r\n airlineLogo: flightImagesBaseUrl\r\n ? `${logoBase}${String(\r\n segment?.ma || segment?.ac || fallbackLabel || 'N/A',\r\n ).toUpperCase()}.png`\r\n : '',\r\n flightNumber: segment?.fn || 'N/A',\r\n origin: segment?.da || 'N/A',\r\n destination: segment?.ar || 'N/A',\r\n departureTime: String(segment?.dt || '').trim() || '--:--',\r\n arrivalTime: String(segment?.at || '').trim() || '--:--',\r\n departureDate: segment?.dd || '',\r\n arrivalDate: segment?.ad || '',\r\n departureAirportName:\r\n segment?.dap ||\r\n segment?.dnam ||\r\n segment?.dnm ||\r\n `${segment?.da || 'Origin'} Airport`,\r\n arrivalAirportName:\r\n segment?.aap ||\r\n segment?.anam ||\r\n segment?.anm ||\r\n `${segment?.ar || 'Destination'} Airport`,\r\n duration: segment?.fdur || 'N/A',\r\n layoverDuration: segment?.ldur || '',\r\n })),\r\n };\r\n };\r\n\r\n return payload.flatMap((item, payloadIndex) => {\r\n const trips = toTripList(item?.trps);\r\n const returnTrips = toTripList(item?.rttrps);\r\n return trips\r\n .map((trip, tripIndex) => {\r\n const dep = trip?.deps?.[0];\r\n const onwardSegments = Array.isArray(dep?.seg) ? dep.seg : [];\r\n const returnFromTrps = Array.isArray(trip?.arrs?.[0]?.seg)\r\n ? trip.arrs[0].seg\r\n : Array.isArray(trip?.arrs?.seg)\r\n ? trip.arrs.seg\r\n : [];\r\n const returnFromRtTrps = Array.isArray(\r\n returnTrips?.[tripIndex]?.deps?.[0]?.seg,\r\n )\r\n ? returnTrips[tripIndex].deps[0].seg\r\n : [];\r\n const returnSegments = returnFromTrps.length\r\n ? returnFromTrps\r\n : returnFromRtTrps;\r\n const fare = trip?.prc?.[0]?.pr || trip?.pr || {};\r\n const returnFare =\r\n returnTrips?.[tripIndex]?.prc?.[0]?.pr ||\r\n returnTrips?.[tripIndex]?.pr ||\r\n {};\r\n const cabinBag =\r\n fare?.cbn ||\r\n fare?.cabin ||\r\n fare?.cabinBag ||\r\n returnFare?.cbn ||\r\n returnFare?.cabin ||\r\n returnFare?.cabinBag ||\r\n '';\r\n const checkinBag =\r\n fare?.checkin ||\r\n fare?.checkIn ||\r\n fare?.checkinBag ||\r\n returnFare?.checkin ||\r\n returnFare?.checkIn ||\r\n returnFare?.checkinBag ||\r\n '';\r\n const refundableFlag = String(\r\n fare?.fareType || fare?.ft || fare?.refundable || fare?.rfnd || '',\r\n ).trim();\r\n const fareType = refundableFlag\r\n ? refundableFlag\r\n : Number(fare?.rf || 0) === 1\r\n ? 'Refundable'\r\n : 'Published';\r\n const onwardTf = Number(fare?.tf);\r\n const returnTf = Number(returnFare?.tf);\r\n const totalFare = Number.isFinite(onwardTf)\r\n ? onwardTf\r\n : Number.isFinite(returnTf)\r\n ? returnTf\r\n : 'N/A';\r\n const onwardLeg = buildLeg(onwardSegments);\r\n const returnLeg = buildLeg(returnSegments);\r\n const airlineName =\r\n airlinesMap[onwardLeg.airlineCode] ||\r\n onwardLeg.airlineCode ||\r\n 'N/A';\r\n const logoBase = flightImagesBaseUrl.endsWith('/')\r\n ? flightImagesBaseUrl\r\n : `${flightImagesBaseUrl}/`;\r\n const normalizedStyp = normalizeCombinedStyp(item, fare);\r\n const returnRmkey = returnFare?.rmkey || fare?.rtrmkey || [];\r\n const returnCoupon =\r\n returnFare?.apcoup ?? fare?.rtcoup ?? item?.rtapcoup ?? '0';\r\n\r\n if (normalizedStyp !== 'combined') {\r\n return null;\r\n }\r\n\r\n return {\r\n id: `${item?.ukey || payloadIndex}-round-combined-${tripIndex}`,\r\n ukey: item?.ukey || '',\r\n rukey: item?.rukey || '',\r\n rmkey: fare?.rmkey || [],\r\n rtrmkey: returnRmkey,\r\n apcoup: fare?.apcoup ?? item?.apcoup ?? '0',\r\n rtapcoup: returnCoupon,\r\n styp: item?.styp || '',\r\n tt: Number(item?.tt || 1),\r\n legType: 'round-trip',\r\n isCombinedRoundTrip: true,\r\n airline: airlineName,\r\n airlineCode: onwardLeg.airlineCode,\r\n flightNumber: onwardLeg.flightNumber,\r\n airlineLogo: flightImagesBaseUrl\r\n ? `${logoBase}${onwardLeg.airlineCode}.png`\r\n : '',\r\n origin: onwardLeg.origin,\r\n destination: onwardLeg.destination,\r\n departureTime: onwardLeg.departureTime,\r\n arrivalTime: onwardLeg.arrivalTime,\r\n duration: onwardLeg.duration,\r\n stops: onwardLeg.stops,\r\n price: totalFare,\r\n currency:\r\n String(item?.cur || trip?.cur || 'INR')\r\n .trim()\r\n .toUpperCase() || 'INR',\r\n adt: Number(item?.adt ?? 1),\r\n chd: Number(item?.chd ?? 0),\r\n inf: Number(item?.inf ?? 0),\r\n paxPrices: trip?.prc?.[0]?.paxpr || [],\r\n baseFare: fare?.bf || 0,\r\n taxAmount: Number(fare?.tf || 0) - Number(fare?.bf || 0),\r\n discount: fare?.madisc || 0,\r\n travelClass:\r\n onwardSegments?.[0]?.cc ||\r\n onwardSegments?.[0]?.cls ||\r\n item?.cls ||\r\n 'Economy',\r\n cabinBaggage: String(cabinBag || '7 Kg per adult'),\r\n checkInBaggage: String(\r\n checkinBag || '15 Kg (1 Piece only) per adult',\r\n ),\r\n fareType,\r\n passportRequired:\r\n String(item?.ps || '').toUpperCase() === 'Y' ||\r\n String(item?.sectyp || '').toLowerCase() === 'int',\r\n onwardLeg,\r\n returnLeg,\r\n moreFares: Array.isArray(trip?.prc) ? trip.prc : [],\r\n };\r\n })\r\n .filter(Boolean);\r\n });\r\n }, [payload, airlinesMap, flightImagesBaseUrl]);\r\n\r\n return (\r\n <FlightResultCards\r\n cards={cards}\r\n airlinesMap={airlinesMap}\r\n disableBook={disableBook}\r\n disableViewAll={disableBook}\r\n recommendationCriteria={recommendationCriteria}\r\n onAvailabilitySuccess={onAvailabilitySuccess}\r\n onAvailabilityReset={onAvailabilityReset}\r\n sectionTitle=\"Round Trip (Combined)\"\r\n cardVariant=\"combined\"\r\n />\r\n );\r\n}\r\n\r\nexport default FlightResultsRoundTripCombined;\r\n","import airlinesDataJson from '../../constants/airlinesData.json';\r\n\r\n// Enhanced natural language processing for flight filters\r\nexport const parseFlightFilters = (text, isRoundTrip = false) => {\r\n const normalizedText = text.toLowerCase().trim();\r\n const doc = null;\r\n const filters = {\r\n stops: [],\r\n rtStops: [],\r\n price: null,\r\n airlines: [],\r\n rtAirlines: [],\r\n depTimes: [],\r\n arrTimes: [],\r\n rDepTimes: [],\r\n rArrTimes: [],\r\n clearAll: false,\r\n sortBy: null,\r\n layover: [],\r\n rLayover: [],\r\n layoverDuration: null,\r\n rLayoverDuration: null,\r\n };\r\n\r\n // Check for clear commands first\r\n parseClearCommands(normalizedText, filters);\r\n\r\n // If clear command detected, return early\r\n if (filters.clearAll) {\r\n return filters;\r\n }\r\n\r\n // Parse sort commands\r\n parseSortCommands(normalizedText, filters);\r\n\r\n // Enhanced stops parsing\r\n parseStops(doc, normalizedText, filters, isRoundTrip);\r\n\r\n // Enhanced price parsing\r\n parsePrice(doc, normalizedText, filters);\r\n\r\n // Enhanced airline parsing\r\n parseAirlines(doc, text, normalizedText, filters, isRoundTrip);\r\n\r\n // Enhanced time parsing\r\n parseTimes(doc, normalizedText, filters, isRoundTrip);\r\n\r\n // Parse layover airport and layover duration constraints.\r\n parseLayoverConstraints(normalizedText, filters, isRoundTrip);\r\n\r\n // Parse refundable and total journey duration constraints.\r\n parseAdvancedConstraints(normalizedText, filters);\r\n\r\n // In mixed round-trip commands (e.g. \"onward X and return Y\"),\r\n // apply side-aware overrides for stops/airlines/times so each clause\r\n // maps to the intended leg instead of being merged globally.\r\n applyClauseAwareRoundTripOverrides(text, normalizedText, filters, isRoundTrip);\r\n\r\n return filters;\r\n};\r\n\r\nconst parseLayoverConstraints = (text, filters, isRoundTrip) => {\r\n const hasReturnContext =\r\n isRoundTrip &&\r\n /\\b(return|returning|inbound|back|roundtrip|round trip|rt)\\b/i.test(text);\r\n const hasOnwardContext =\r\n /\\b(onward|outbound|oneway|one-way|one way|outward)\\b/i.test(text);\r\n const targetLayoverKey = hasReturnContext && !hasOnwardContext ? 'rLayover' : 'layover';\r\n const targetDurationKey =\r\n hasReturnContext && !hasOnwardContext ? 'rLayoverDuration' : 'layoverDuration';\r\n const invalidCodeTokens = new Set([\r\n 'for',\r\n 'and',\r\n 'the',\r\n 'all',\r\n 'any',\r\n 'with',\r\n 'via',\r\n 'lay',\r\n 'way',\r\n 'one',\r\n 'two',\r\n 'rt',\r\n ]);\r\n\r\n const layoverCodeMatches = text.match(/\\b(?:via|layover|stopover)\\s+(?:(?:in|at)\\s+)?([a-z]{3})\\b/gi) || [];\r\n layoverCodeMatches.forEach((match) => {\r\n const code = String(match.split(/\\s+/).pop() || '').trim().toUpperCase();\r\n if (\r\n code &&\r\n /^[A-Z]{3}$/.test(code) &&\r\n !invalidCodeTokens.has(code.toLowerCase()) &&\r\n !filters[targetLayoverKey].includes(code)\r\n ) {\r\n filters[targetLayoverKey].push(code);\r\n }\r\n });\r\n\r\n const cityToCode = {\r\n hyderabad: 'HYD',\r\n bangalore: 'BLR',\r\n bengaluru: 'BLR',\r\n delhi: 'DEL',\r\n mumbai: 'BOM',\r\n chennai: 'MAA',\r\n kolkata: 'CCU',\r\n ahmedabad: 'AMD',\r\n cochin: 'COK',\r\n kochi: 'COK',\r\n goa: 'GOI',\r\n pune: 'PNQ',\r\n };\r\n const returnContextPattern =\r\n /\\b(return|returning|inbound|back|roundtrip|round trip|rt)\\b/i;\r\n const onwardContextPattern =\r\n /\\b(onward|outbound|oneway|one-way|one way|outward)\\b/i;\r\n const splitRegex = /\\b(?:and|,|;)\\b/i;\r\n const hasGlobalLayoverIntent = /\\b(layover|stopover|via)\\b/i.test(text);\r\n const hasBothLegsContext =\r\n isRoundTrip &&\r\n /\\bboth\\b/i.test(text) &&\r\n /\\b(onward|outbound|oneway|one-way|one way|outward)\\b/i.test(text) &&\r\n /\\b(return|returning|inbound|back|roundtrip|round trip|rt)\\b/i.test(text);\r\n const clauses = String(text || '')\r\n .split(splitRegex)\r\n .map((clause) => clause.trim())\r\n .filter(Boolean);\r\n\r\n const normalizeToAirportCode = (rawValue) => {\r\n const token = String(rawValue || '')\r\n .toLowerCase()\r\n .replace(/\\s+airport\\b/g, '')\r\n .trim();\r\n if (!token) return '';\r\n if (/^[a-z]{3}$/.test(token)) {\r\n if (invalidCodeTokens.has(token)) return '';\r\n return token.toUpperCase();\r\n }\r\n return cityToCode[token] || '';\r\n };\r\n\r\n const collectLayoverCodes = (clauseText) => {\r\n const codes = [];\r\n const addCode = (rawValue) => {\r\n const code = normalizeToAirportCode(rawValue);\r\n if (code && !codes.includes(code)) codes.push(code);\r\n };\r\n\r\n // Supports: \"layover with DEL\", \"via DEL\", \"layover in chennai\"\r\n const keywordFirstMatches = clauseText.match(\r\n /\\b(?:via|layover|stopover|stop)\\s+(?:in|at|with)?\\s*([a-z][a-z .'-]{1,30}?)(?=\\s+(?:for|under|over|between|onward|outbound|oneway|return|roundtrip|inbound|back)\\b|[,.!?]|$)/gi,\r\n );\r\n (keywordFirstMatches || []).forEach((match) => {\r\n const captured = match.replace(\r\n /\\b(?:via|layover|stopover|stop)\\s+(?:in|at|with)?\\s*/i,\r\n '',\r\n );\r\n addCode(captured);\r\n });\r\n\r\n // Supports: \"BOM in layover\", \"chennai with layover\"\r\n const codeFirstMatches = clauseText.match(\r\n /\\b([a-z][a-z .'-]{1,30}?)\\s+(?:in|at|with)\\s+(?:layover|stopover)\\b/gi,\r\n );\r\n (codeFirstMatches || []).forEach((match) => {\r\n const captured = match.replace(\r\n /\\s+(?:in|at|with)\\s+(?:layover|stopover)\\b/i,\r\n '',\r\n );\r\n addCode(captured);\r\n });\r\n\r\n // Supports shorthand in mixed clauses when layover intent is already present:\r\n // \"MAA in oneway and BOM in return\"\r\n if (hasGlobalLayoverIntent) {\r\n const sideScopedMatches = clauseText.match(\r\n /\\b([a-z][a-z .'-]{1,30}?)\\s+(?:in|for)\\s+(?:onward|outbound|oneway|one-way|one way|outward|return|returning|roundtrip|round trip|inbound|back)\\b/gi,\r\n );\r\n (sideScopedMatches || []).forEach((match) => {\r\n const captured = match.replace(\r\n /\\s+(?:in|for)\\s+(?:onward|outbound|oneway|one-way|one way|outward|return|returning|roundtrip|round trip|inbound|back)\\b/i,\r\n '',\r\n );\r\n addCode(captured);\r\n });\r\n }\r\n\r\n // Fallback for phrasing like:\r\n // \"layover bom flight in both onward and return\"\r\n // where airport code appears standalone without \"in/with layover\".\r\n if (hasGlobalLayoverIntent) {\r\n const standaloneCodeMatches = clauseText.match(/\\b([a-z]{3})\\b/gi) || [];\r\n standaloneCodeMatches.forEach((token) => {\r\n addCode(token);\r\n });\r\n }\r\n\r\n return codes;\r\n };\r\n\r\n if (hasBothLegsContext) {\r\n collectLayoverCodes(text).forEach((code) => {\r\n if (!filters.layover.includes(code)) {\r\n filters.layover.push(code);\r\n }\r\n if (!filters.rLayover.includes(code)) {\r\n filters.rLayover.push(code);\r\n }\r\n });\r\n } else if (isRoundTrip && hasReturnContext && hasOnwardContext && clauses.length > 1) {\r\n clauses.forEach((clause) => {\r\n const clauseHasReturn = returnContextPattern.test(clause);\r\n const clauseHasOnward = onwardContextPattern.test(clause);\r\n const targetKeys =\r\n clauseHasReturn && clauseHasOnward\r\n ? ['layover', 'rLayover']\r\n : clauseHasReturn\r\n ? ['rLayover']\r\n : ['layover'];\r\n const clauseCodes = collectLayoverCodes(clause);\r\n clauseCodes.forEach((code) => {\r\n targetKeys.forEach((key) => {\r\n if (!filters[key].includes(code)) {\r\n filters[key].push(code);\r\n }\r\n });\r\n });\r\n });\r\n } else {\r\n collectLayoverCodes(text).forEach((code) => {\r\n if (!filters[targetLayoverKey].includes(code)) {\r\n filters[targetLayoverKey].push(code);\r\n }\r\n });\r\n }\r\n\r\n const underMatch = text.match(/\\blayover(?:\\s+duration)?(?:\\s+with)?\\s+(?:under|below|less than|max(?:imum)?)\\s+(\\d+)\\s*(h|hr|hrs|hour|hours|m|min|mins|minute|minutes)?\\b/i);\r\n const overMatch = text.match(/\\blayover(?:\\s+duration)?(?:\\s+with)?\\s+(?:over|above|more than|min(?:imum)?)\\s+(\\d+)\\s*(h|hr|hrs|hour|hours|m|min|mins|minute|minutes)?\\b/i);\r\n const betweenMatch = text.match(/\\blayover(?:\\s+duration)?(?:\\s+with)?\\s+(?:between|from)\\s+(\\d+)\\s*(h|hr|hrs|hour|hours|m|min|mins|minute|minutes)?\\s+(?:and|to)\\s+(\\d+)\\s*(h|hr|hrs|hour|hours|m|min|mins|minute|minutes)?\\b/i);\r\n\r\n const toMinutes = (value, unit) => {\r\n const n = Number(value);\r\n if (!Number.isFinite(n)) return null;\r\n const normalizedUnit = String(unit || 'm').toLowerCase();\r\n return /h|hr|hour/.test(normalizedUnit) ? Math.round(n * 60) : Math.round(n);\r\n };\r\n\r\n if (betweenMatch) {\r\n const min = toMinutes(betweenMatch[1], betweenMatch[2]);\r\n const max = toMinutes(betweenMatch[3], betweenMatch[4]);\r\n if (min !== null && max !== null) {\r\n const durationRange = {\r\n min: Math.min(min, max),\r\n max: Math.max(min, max),\r\n };\r\n if (hasBothLegsContext) {\r\n filters.layoverDuration = durationRange;\r\n filters.rLayoverDuration = durationRange;\r\n } else {\r\n filters[targetDurationKey] = durationRange;\r\n }\r\n }\r\n return;\r\n }\r\n if (underMatch) {\r\n const max = toMinutes(underMatch[1], underMatch[2]);\r\n if (max !== null) {\r\n const durationMax = { max };\r\n if (hasBothLegsContext) {\r\n filters.layoverDuration = durationMax;\r\n filters.rLayoverDuration = durationMax;\r\n } else {\r\n filters[targetDurationKey] = durationMax;\r\n }\r\n }\r\n return;\r\n }\r\n if (overMatch) {\r\n const min = toMinutes(overMatch[1], overMatch[2]);\r\n if (min !== null) {\r\n const durationMin = { min };\r\n if (hasBothLegsContext) {\r\n filters.layoverDuration = durationMin;\r\n filters.rLayoverDuration = durationMin;\r\n } else {\r\n filters[targetDurationKey] = durationMin;\r\n }\r\n }\r\n }\r\n};\r\n\r\nconst parseAdvancedConstraints = (text, filters) => {\r\n if (/\\b(refundable only|only refundable|refundable flights?)\\b/i.test(text)) {\r\n filters.refundable = true;\r\n }\r\n if (/\\b(non refundable|non-refundable)\\b/i.test(text)) {\r\n filters.refundable = false;\r\n }\r\n\r\n const durationMatch = text.match(/\\b(?:duration|journey|flight time)\\s*(?:under|below|less than|max(?:imum)?)\\s*(\\d+)\\s*(h|hr|hrs|hour|hours|m|min|mins|minute|minutes)\\b/i);\r\n if (durationMatch) {\r\n const value = Number(durationMatch[1]);\r\n const unit = String(durationMatch[2] || '').toLowerCase();\r\n if (Number.isFinite(value)) {\r\n filters.maxDuration = /h|hr|hour/.test(unit)\r\n ? Math.round(value * 60)\r\n : Math.round(value);\r\n }\r\n }\r\n};\r\n\r\nconst applyClauseAwareRoundTripOverrides = (\r\n originalText,\r\n normalizedText,\r\n filters,\r\n isRoundTrip\r\n) => {\r\n if (!isRoundTrip) return;\r\n\r\n const hasReturnContext = /\\b(return|returning|inbound|back|roundtrip|round trip|rt)\\b/i.test(\r\n normalizedText\r\n );\r\n const hasOnwardContext =\r\n /\\b(onward|outbound|oneway|one-way|one way|outward)\\b/i.test(normalizedText);\r\n if (!hasReturnContext || !hasOnwardContext) return;\r\n\r\n const splitRegex = /\\b(?:and|,|;)\\b/i;\r\n const normalizedClauses = normalizedText\r\n .split(splitRegex)\r\n .map(s => s.trim())\r\n .filter(Boolean);\r\n const originalClauses = originalText\r\n .split(splitRegex)\r\n .map(s => s.trim())\r\n .filter(Boolean);\r\n if (!normalizedClauses.length) return;\r\n\r\n const getSide = clause => {\r\n if (/\\b(return|returning|inbound|back|roundtrip|round trip|rt)\\b/i.test(clause))\r\n return 'return';\r\n if (/\\b(onward|outbound|oneway|one-way|one way|outward)\\b/i.test(clause))\r\n return 'onward';\r\n return null;\r\n };\r\n\r\n const stopRules = {\r\n nonStop: [\r\n 'non stop',\r\n 'nonstop',\r\n 'non-stop',\r\n 'direct',\r\n 'no stops',\r\n 'zero stops',\r\n ],\r\n oneStop: ['one stop', '1 stop', '1-stop', 'single stop', '1stop'],\r\n twoPlus: [\r\n 'two stop',\r\n 'two stops',\r\n '2 stop',\r\n '2 stops',\r\n '2-stop',\r\n '2+ stops',\r\n 'multiple stops',\r\n 'many stops',\r\n '2stop',\r\n ],\r\n };\r\n\r\n const timeSlotPatterns = [\r\n { pattern: /\\bbefore\\s*6\\s*am\\b/i, slot: '0-6' },\r\n { pattern: /\\b6\\s*am\\s*(?:to|-)\\s*12\\s*pm\\b/i, slot: '6-12' },\r\n { pattern: /\\b12\\s*pm\\s*(?:to|-)\\s*6\\s*pm\\b/i, slot: '12-18' },\r\n { pattern: /\\bafter\\s*6\\s*pm\\b/i, slot: '18-24' },\r\n { pattern: /\\bearly morning\\b/i, slot: '0-6' },\r\n { pattern: /\\bmorning\\b/i, slot: '6-12' },\r\n { pattern: /\\bafternoon\\b/i, slot: '12-18' },\r\n { pattern: /\\bevening|night|late night\\b/i, slot: '18-24' },\r\n ];\r\n\r\n const airlinesData = airlinesDataJson;\r\n const airlineCodeByName = {};\r\n const validAirlineCodes = new Set();\r\n airlinesData.forEach(airline => {\r\n const code = String(airline?.code || '').toUpperCase().trim();\r\n const name = String(airline?.english || '').toLowerCase().trim();\r\n if (code) validAirlineCodes.add(code);\r\n if (name && code) airlineCodeByName[name] = code;\r\n });\r\n\r\n const hasClauseStopIntent = normalizedClauses.some(\r\n clause =>\r\n /\\bstop|stops|nonstop|non-stop|direct\\b/i.test(clause) &&\r\n getSide(clause)\r\n );\r\n const hasClauseAirlineIntent = normalizedClauses.some(\r\n clause => /\\bairline|airlines|flight|flights\\b/i.test(clause) && getSide(clause)\r\n );\r\n const hasClauseTimeIntent = normalizedClauses.some(\r\n clause => /\\bdeparture|depart|arrival|arrive|am|pm|morning|afternoon|evening|night|before|after\\b/i.test(clause) && getSide(clause)\r\n );\r\n\r\n if (hasClauseStopIntent) {\r\n filters.stops = [];\r\n filters.rtStops = [];\r\n }\r\n if (hasClauseAirlineIntent) {\r\n filters.airlines = [];\r\n filters.rtAirlines = [];\r\n }\r\n if (hasClauseTimeIntent) {\r\n filters.depTimes = [];\r\n filters.arrTimes = [];\r\n filters.rDepTimes = [];\r\n filters.rArrTimes = [];\r\n }\r\n\r\n normalizedClauses.forEach((clause, idx) => {\r\n const side = getSide(clause);\r\n if (!side) return;\r\n const originalClause = originalClauses[idx] || clause;\r\n\r\n // Stops\r\n const targetStops = side === 'return' ? filters.rtStops : filters.stops;\r\n const addStop = stop => {\r\n if (!targetStops.includes(stop)) targetStops.push(stop);\r\n };\r\n if (stopRules.nonStop.some(p => clause.includes(p))) addStop(0);\r\n if (stopRules.oneStop.some(p => clause.includes(p))) addStop(1);\r\n if (stopRules.twoPlus.some(p => clause.includes(p))) addStop(2);\r\n\r\n // Airlines (names + valid codes only)\r\n const targetAirlines =\r\n side === 'return' ? filters.rtAirlines : filters.airlines;\r\n const addAirline = code => {\r\n if (!targetAirlines.includes(code)) targetAirlines.push(code);\r\n };\r\n Object.entries(airlineCodeByName).forEach(([name, code]) => {\r\n if (clause.includes(name)) addAirline(code);\r\n });\r\n const codeMatches = originalClause.match(/\\b([A-Z0-9]{2,3})\\b/g) || [];\r\n codeMatches.forEach(code => {\r\n const normalizedCode = String(code).toUpperCase();\r\n if (validAirlineCodes.has(normalizedCode)) addAirline(normalizedCode);\r\n });\r\n\r\n // Times\r\n const isArrivalClause = /\\barrival|arrive\\b/i.test(clause);\r\n const targetTimes =\r\n side === 'return'\r\n ? isArrivalClause\r\n ? filters.rArrTimes\r\n : filters.rDepTimes\r\n : isArrivalClause\r\n ? filters.arrTimes\r\n : filters.depTimes;\r\n const addTime = slot => {\r\n if (!targetTimes.includes(slot)) targetTimes.push(slot);\r\n };\r\n timeSlotPatterns.forEach(({ pattern, slot }) => {\r\n if (pattern.test(clause)) addTime(slot);\r\n });\r\n });\r\n};\r\n\r\nconst parseClearCommands = (text, filters) => {\r\n const clearPatterns = [\r\n 'clear all',\r\n 'clear all filters',\r\n 'reset filters',\r\n 'reset all',\r\n 'clear filters',\r\n 'remove all filters',\r\n 'clear everything',\r\n 'reset everything',\r\n 'clear all filters',\r\n 'remove filters',\r\n 'clear',\r\n 'reset',\r\n ];\r\n\r\n clearPatterns.forEach(pattern => {\r\n if (text.includes(pattern)) {\r\n filters.clearAll = true;\r\n }\r\n });\r\n};\r\n\r\nconst parseSortCommands = (text, filters) => {\r\n const normalized = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!normalized) return;\r\n\r\n const isDescendingSort =\r\n /\\b(desc|dsc|descending|decending|high(?:est)?\\s+to\\s+low(?:est)?|reverse|highest first|max(?:imum)? first)\\b/.test(\r\n normalized,\r\n );\r\n const isAscendingSort =\r\n /\\b(asc|ascending|asending|low(?:est)?\\s+to\\s+high(?:est)?|lowest first|min(?:imum)? first)\\b/.test(\r\n normalized,\r\n );\r\n\r\n const hasPriceKeyword = /\\b(price|fare|cost|amount|budget)\\b/.test(normalized);\r\n const hasDurationKeyword = /\\b(duration|time|timing|journey|travel time)\\b/.test(\r\n normalized,\r\n );\r\n const hasDepartureKeyword = /\\b(departure|depart|takeoff)\\b/.test(normalized);\r\n const hasArrivalKeyword = /\\b(arrival|arrive|landing)\\b/.test(normalized);\r\n const hasFirstFlightPattern =\r\n /\\b(first|earliest)\\s+flight\\b/.test(normalized) ||\r\n /\\bflight\\s+first\\b/.test(normalized);\r\n\r\n if (hasFirstFlightPattern) {\r\n filters.sortBy = 'departure';\r\n return;\r\n }\r\n\r\n // Explicit sort-by clauses with direction take highest priority.\r\n if ((hasPriceKeyword || /\\bsort\\b/.test(normalized)) && isDescendingSort) {\r\n filters.sortBy = 'expensive';\r\n return;\r\n }\r\n if ((hasPriceKeyword || /\\bsort\\b/.test(normalized)) && isAscendingSort) {\r\n filters.sortBy = 'cheapest';\r\n return;\r\n }\r\n if (hasDurationKeyword && isDescendingSort) {\r\n filters.sortBy = 'slowest';\r\n return;\r\n }\r\n if (hasDurationKeyword && isAscendingSort) {\r\n filters.sortBy = 'quickest';\r\n return;\r\n }\r\n if (hasDepartureKeyword && isDescendingSort) {\r\n filters.sortBy = 'lateDeparture';\r\n return;\r\n }\r\n if (hasDepartureKeyword && isAscendingSort) {\r\n filters.sortBy = 'departure';\r\n return;\r\n }\r\n if (hasArrivalKeyword && isDescendingSort) {\r\n filters.sortBy = 'lateArrival';\r\n return;\r\n }\r\n if (hasArrivalKeyword && isAscendingSort) {\r\n filters.sortBy = 'arrival';\r\n return;\r\n }\r\n\r\n const sortPatterns = {\r\n // Price\r\n cheapest: 'cheapest',\r\n 'lowest price': 'cheapest',\r\n 'sort by price': 'cheapest',\r\n 'price low to high': 'cheapest',\r\n 'sort by cheapest': 'cheapest',\r\n expensive: 'expensive',\r\n 'highest price': 'expensive',\r\n 'high to low': 'expensive',\r\n 'price high to low': 'expensive',\r\n 'sort by expensive': 'expensive',\r\n 'most expensive': 'expensive',\r\n\r\n // Recommendation\r\n best: 'best',\r\n quickest: 'quickest',\r\n fastest: 'quickest',\r\n 'shortest flight': 'quickest',\r\n 'sort by duration': 'quickest',\r\n slowest: 'slowest',\r\n 'longest flight': 'slowest',\r\n 'duration high to low': 'slowest',\r\n\r\n // Departure time\r\n earliest: 'departure',\r\n 'earliest departure': 'departure',\r\n 'earliest flight': 'departure',\r\n 'sort by departure': 'departure',\r\n 'morning first': 'departure',\r\n 'early departure': 'departure',\r\n latest: 'lateDeparture',\r\n 'latest departure': 'lateDeparture',\r\n 'latest flight': 'lateDeparture',\r\n 'evening first': 'lateDeparture',\r\n 'late departure': 'lateDeparture',\r\n\r\n // Arrival time\r\n 'earliest arrival': 'arrival',\r\n 'early arrival': 'arrival',\r\n 'sort by arrival': 'arrival',\r\n 'latest arrival': 'lateArrival',\r\n 'late arrival': 'lateArrival',\r\n };\r\n\r\n Object.entries(sortPatterns).forEach(([pattern, sortValue]) => {\r\n if (normalized.includes(pattern)) {\r\n filters.sortBy = sortValue;\r\n }\r\n });\r\n};\r\n\r\nconst parseStops = (doc, text, filters, isRoundTrip) => {\r\n const hasReturnContext =\r\n isRoundTrip &&\r\n /\\b(return|returning|inbound|back|roundtrip|round trip|rt)\\b/i.test(text);\r\n const hasOnwardContext =\r\n /\\b(onward|outbound|oneway|one-way|one way|outward)\\b/i.test(text);\r\n const targetStopsKeys = isRoundTrip\r\n ? hasReturnContext\r\n ? ['rtStops']\r\n : hasOnwardContext\r\n ? ['stops']\r\n : ['stops', 'rtStops']\r\n : ['stops'];\r\n const addStopToTargets = stop => {\r\n targetStopsKeys.forEach(key => {\r\n if (!filters[key].includes(stop)) {\r\n filters[key].push(stop);\r\n }\r\n });\r\n };\r\n // Non-stop patterns\r\n const nonStopPatterns = [\r\n 'non stop',\r\n 'nonstop',\r\n 'direct',\r\n 'no stops',\r\n 'zero stops',\r\n 'non-stop',\r\n 'direct flight',\r\n 'straight flight',\r\n ];\r\n\r\n // One stop patterns\r\n const oneStopPatterns = [\r\n 'one stop',\r\n '1 stop',\r\n '1 stops',\r\n '1-stop',\r\n '1-stop flights',\r\n '1 stop flight',\r\n '1 stop flights',\r\n 'single stop',\r\n 'one connection',\r\n '1 connection',\r\n 'one layover',\r\n '1 layover',\r\n 'one stopover',\r\n '1 stopover',\r\n 'filter all 1-stop',\r\n 'show 1-stop',\r\n '1 stop flights',\r\n '1stop',\r\n ];\r\n\r\n // Two or more stops patterns\r\n const multiStopPatterns = [\r\n 'two stop',\r\n 'two stops',\r\n '2 stop',\r\n '2 stops',\r\n '2-stop',\r\n '2-stop flight',\r\n '2-stop flights',\r\n '2 stop flight',\r\n '2 stop flights',\r\n 'multiple stops',\r\n 'many stops',\r\n '2+ stops',\r\n 'two connections',\r\n 'multiple connections',\r\n '2stop',\r\n ];\r\n\r\n // Handle natural-language negation:\r\n // \"all stops except non stop\", \"avoid 1 stop\", \"without 2 stops\"\r\n const hasStopNegationIntent =\r\n /\\b(except|avoid|without|exclude|not)\\b/i.test(text) &&\r\n /\\bstop|stops|flight|flights\\b/i.test(text);\r\n\r\n if (hasStopNegationIntent) {\r\n const excludedStops = [];\r\n const hasNonStop = nonStopPatterns.some(pattern => text.includes(pattern));\r\n const hasOneStop = oneStopPatterns.some(pattern => text.includes(pattern));\r\n const hasMultiStop = multiStopPatterns.some(pattern =>\r\n text.includes(pattern)\r\n );\r\n\r\n if (hasNonStop) excludedStops.push(0);\r\n if (hasOneStop) excludedStops.push(1);\r\n if (hasMultiStop) excludedStops.push(2);\r\n\r\n if (excludedStops.length > 0) {\r\n targetStopsKeys.forEach(key => {\r\n filters[key] = [0, 1, 2].filter(stop => !excludedStops.includes(stop));\r\n });\r\n return;\r\n }\r\n }\r\n\r\n // Check for non-stop patterns first (more specific)\r\n nonStopPatterns.forEach(pattern => {\r\n if (text.includes(pattern)) {\r\n addStopToTargets(0);\r\n }\r\n });\r\n\r\n // Check for one-stop patterns\r\n oneStopPatterns.forEach(pattern => {\r\n if (text.includes(pattern)) {\r\n addStopToTargets(1);\r\n }\r\n });\r\n\r\n // Check for multi-stop patterns\r\n multiStopPatterns.forEach(pattern => {\r\n if (text.includes(pattern)) {\r\n addStopToTargets(2);\r\n }\r\n });\r\n\r\n // Removed doc.match calls to avoid compromise dependency. Regex logic above handles these.\r\n\r\n // Handle combined requests like \"one stop and non stop\"\r\n if (text.includes('and')) {\r\n const andParts = text.split('and');\r\n andParts.forEach(part => {\r\n const trimmedPart = part.trim();\r\n\r\n // Check for non-stop in this part\r\n nonStopPatterns.forEach(pattern => {\r\n if (trimmedPart.includes(pattern)) {\r\n addStopToTargets(0);\r\n }\r\n });\r\n\r\n // Check for one-stop in this part\r\n oneStopPatterns.forEach(pattern => {\r\n if (trimmedPart.includes(pattern)) {\r\n addStopToTargets(1);\r\n }\r\n });\r\n\r\n // Check for multi-stop in this part\r\n multiStopPatterns.forEach(pattern => {\r\n if (trimmedPart.includes(pattern)) {\r\n addStopToTargets(2);\r\n }\r\n });\r\n });\r\n }\r\n};\r\n\r\nconst parsePrice = (doc, text, filters) => {\r\n const sanitizedText = text.replace(/,/g, '');\r\n const hasLayoverContext = /\\b(layover|stopover|via)\\b/i.test(sanitizedText);\r\n const hasDurationUnit = /\\b(h|hr|hrs|hour|hours|m|min|mins|minute|minutes)\\b/i.test(\r\n sanitizedText,\r\n );\r\n const hasDurationComparator =\r\n /\\b(under|below|less than|over|above|more than|min|minimum|max|maximum|between|from)\\b/i.test(\r\n sanitizedText,\r\n );\r\n\r\n // Avoid mapping layover duration phrases (e.g. \"layover more than 4 hours\")\r\n // into price filters.\r\n if (hasLayoverContext && (hasDurationUnit || hasDurationComparator)) {\r\n return;\r\n }\r\n\r\n // Enhanced price parsing with currency symbols and ranges\r\n const pricePatterns = [\r\n // Patterns with currency symbols\r\n /under\\s*[₹$]\\s*(\\d+)/i,\r\n /below\\s*[₹$]\\s*(\\d+)/i,\r\n /less\\s*than\\s*[₹$]\\s*(\\d+)/i,\r\n /maximum\\s*[₹$]\\s*(\\d+)/i,\r\n /max\\s*[₹$]\\s*(\\d+)/i,\r\n /over\\s*[₹$]\\s*(\\d+)/i,\r\n /above\\s*[₹$]\\s*(\\d+)/i,\r\n /more\\s*than\\s*[₹$]\\s*(\\d+)/i,\r\n /minimum\\s*[₹$]\\s*(\\d+)/i,\r\n /min\\s*[₹$]\\s*(\\d+)/i,\r\n /between\\s*[₹$]\\s*(\\d+)\\s*and\\s*[₹$]\\s*(\\d+)/i,\r\n /[₹$]\\s*(\\d+)\\s*to\\s*[₹$]\\s*(\\d+)/i,\r\n /[₹$]\\s*(\\d+)\\s*-\\s*[₹$]\\s*(\\d+)/i,\r\n\r\n // Patterns without currency symbols (numbers only)\r\n /under\\s*(\\d+)/i,\r\n /below\\s*(\\d+)/i,\r\n /less\\s*than\\s*(\\d+)/i,\r\n /maximum\\s*(\\d+)/i,\r\n /max\\s*(\\d+)/i,\r\n /over\\s*(\\d+)/i,\r\n /above\\s*(\\d+)/i,\r\n /more\\s*than\\s*(\\d+)/i,\r\n /minimum\\s*(\\d+)/i,\r\n /min\\s*(\\d+)/i,\r\n /between\\s*(\\d+)\\s*and\\s*(\\d+)/i,\r\n /from\\s*(\\d+)\\s*to\\s*(\\d+)/i,\r\n /(\\d+)\\s*to\\s*(\\d+)/i,\r\n /(\\d+)\\s*-\\s*(\\d+)/i,\r\n /(\\d+)\\s*and\\s*(\\d+)/i,\r\n ];\r\n\r\n pricePatterns.forEach(pattern => {\r\n const match = sanitizedText.match(pattern);\r\n if (match) {\r\n if (\r\n pattern.source.includes('under') ||\r\n pattern.source.includes('below') ||\r\n pattern.source.includes('less') ||\r\n pattern.source.includes('maximum') ||\r\n pattern.source.includes('max')\r\n ) {\r\n filters.price = { max: parseInt(match[1]) };\r\n } else if (\r\n pattern.source.includes('over') ||\r\n pattern.source.includes('above') ||\r\n pattern.source.includes('more') ||\r\n pattern.source.includes('minimum') ||\r\n pattern.source.includes('min')\r\n ) {\r\n filters.price = { min: parseInt(match[1]) };\r\n } else if (\r\n pattern.source.includes('between') ||\r\n pattern.source.includes('to') ||\r\n pattern.source.includes('-') ||\r\n pattern.source.includes('and')\r\n ) {\r\n filters.price = {\r\n min: parseInt(match[1]),\r\n max: parseInt(match[2]),\r\n };\r\n }\r\n }\r\n });\r\n\r\n // Intent-based natural language fallback:\r\n // Handles phrases like \"find 2000 price flights\", \"show flights for 4500\", etc.\r\n if (!filters.price) {\r\n if (hasLayoverContext) {\r\n return;\r\n }\r\n const genericPriceIntentPattern =\r\n /(?:find|show|get|search|need|want|with|for)?\\s*(?:flights?)?(?:\\s*(?:of|under|below|around|near|about|upto|up to|max|maximum|price))?\\s*[₹$]?\\s*(\\d{3,7})\\s*(?:price|budget|fare|rs|rupees)?/i;\r\n const genericMatch = sanitizedText.match(genericPriceIntentPattern);\r\n\r\n if (genericMatch) {\r\n const parsedPrice = parseInt(genericMatch[1], 10);\r\n const hasUpperBoundIntent =\r\n /\\b(under|below|less than|max|maximum|upto|up to)\\b/i.test(\r\n sanitizedText\r\n );\r\n const hasLowerBoundIntent =\r\n /\\b(over|above|more than|min|minimum)\\b/i.test(sanitizedText);\r\n\r\n if (hasUpperBoundIntent) {\r\n filters.price = { max: parsedPrice };\r\n } else if (hasLowerBoundIntent) {\r\n filters.price = { min: parsedPrice };\r\n } else {\r\n // If no directional keyword is present, treat it as an exact price request.\r\n filters.price = { min: parsedPrice, max: parsedPrice };\r\n }\r\n }\r\n }\r\n\r\n // Removed money recognition to avoid compromise dependency. Price regexes above are robust.\r\n};\r\n\r\nconst parseAirlines = (doc, originalText, text, filters, isRoundTrip) => {\r\n const hasReturnContext =\r\n isRoundTrip &&\r\n /\\b(return|returning|inbound|back|roundtrip|round trip|rt)\\b/i.test(text);\r\n const hasOnwardContext =\r\n /\\b(onward|outbound|oneway|one-way|one way|outward)\\b/i.test(text);\r\n const targetAirlinesKeys = isRoundTrip\r\n ? hasReturnContext\r\n ? ['rtAirlines']\r\n : hasOnwardContext\r\n ? ['airlines']\r\n : ['airlines', 'rtAirlines']\r\n : ['airlines'];\r\n const addAirlineToTargets = code => {\r\n targetAirlinesKeys.forEach(key => {\r\n if (!filters[key].includes(code)) {\r\n filters[key].push(code);\r\n }\r\n });\r\n };\r\n // Prevent time words from being interpreted as airline codes\r\n // in phrases like \"before 6 am flights\".\r\n const nonAirlineCodeTokens = new Set([\r\n 'AM',\r\n 'PM',\r\n 'HR',\r\n 'HRS',\r\n 'MIN',\r\n 'MINS',\r\n ]);\r\n const airlinesData = airlinesDataJson;\r\n\r\n // Create mappings from airline data\r\n const airlineMappings = {};\r\n const airlineCodes = [];\r\n\r\n // Build comprehensive mappings from JSON data\r\n airlinesData.forEach(airline => {\r\n if (airline.code && airline.english) {\r\n const code = airline.code;\r\n const name = airline.english.toLowerCase();\r\n\r\n // Add full name to mappings (support multiple carrier codes per display name).\r\n if (!Array.isArray(airlineMappings[name])) {\r\n airlineMappings[name] = [];\r\n }\r\n if (!airlineMappings[name].includes(code)) {\r\n airlineMappings[name].push(code);\r\n }\r\n airlineCodes.push(code);\r\n\r\n // Create variations for common airlines\r\n const variations = [];\r\n\r\n // Air India variations\r\n if (name.includes('air india')) {\r\n variations.push('air india', 'airindia');\r\n }\r\n\r\n // IndiGo variations\r\n if (name.includes('indigo')) {\r\n variations.push('indigo');\r\n }\r\n\r\n // SpiceJet variations\r\n if (name.includes('spicejet')) {\r\n variations.push('spicejet', 'spice jet');\r\n }\r\n\r\n // Vistara variations\r\n if (name.includes('vistara')) {\r\n variations.push('vistara', 'vistara airlines');\r\n }\r\n\r\n // Go Air variations\r\n if (name.includes('go air') || name.includes('goair')) {\r\n variations.push('go air', 'goair');\r\n }\r\n\r\n // Air Asia variations\r\n if (name.includes('air asia') || name.includes('airasia')) {\r\n variations.push('air asia', 'airasia');\r\n }\r\n\r\n // Jet Airways variations\r\n if (name.includes('jet airways') || name.includes('jetairways')) {\r\n variations.push('jet airways', 'jetairways');\r\n }\r\n\r\n // Add all variations to mappings\r\n variations.forEach(variation => {\r\n if (!Array.isArray(airlineMappings[variation])) {\r\n airlineMappings[variation] = [];\r\n }\r\n if (!airlineMappings[variation].includes(code)) {\r\n airlineMappings[variation].push(code);\r\n }\r\n });\r\n }\r\n });\r\n\r\n // Check for airline names in text\r\n Object.entries(airlineMappings).forEach(([name, codes]) => {\r\n if (text.length > 2 && text.includes(name) && name.length > 2) {\r\n (Array.isArray(codes) ? codes : [codes]).forEach(addAirlineToTargets);\r\n }\r\n });\r\n\r\n // Also check for airline codes directly\r\n airlineCodes.forEach(code => {\r\n if (text.length > 2 && text.includes(code) && code.length > 2) {\r\n addAirlineToTargets(code);\r\n }\r\n });\r\n\r\n // Handle airline code patterns only when the code exists in airlinesData.\r\n const airlineCodePattern =\r\n /\\b([A-Z0-9]{2,3})\\s+(?:airline|airlines|flights|flight|code|codes)\\b/gi;\r\n const matches = text.match(airlineCodePattern);\r\n\r\n if (matches) {\r\n matches.forEach(match => {\r\n const code = match.split(/\\s+/)[0].toUpperCase();\r\n if (\r\n code.length >= 2 &&\r\n !nonAirlineCodeTokens.has(code) &&\r\n airlineCodes.includes(code)\r\n ) {\r\n addAirlineToTargets(code);\r\n }\r\n });\r\n }\r\n\r\n // Also look for standalone airline codes (2-3 characters, uppercase),\r\n // but apply only if the code exists in airlinesData.\r\n const standaloneCodePattern = /\\b([A-Z]{2,3})\\b/g;\r\n const standaloneMatches = originalText.match(standaloneCodePattern);\r\n\r\n if (standaloneMatches) {\r\n standaloneMatches.forEach(code => {\r\n // Only add valid airline codes from airlinesData.\r\n if (\r\n !targetAirlinesKeys.some(key => filters[key].includes(code)) &&\r\n !nonAirlineCodeTokens.has(code) &&\r\n airlineCodes.includes(code) &&\r\n code.length >= 2 &&\r\n code.length <= 3\r\n ) {\r\n addAirlineToTargets(code);\r\n }\r\n });\r\n }\r\n};\r\n\r\nconst parseTimes = (doc, text, filters, isRoundTrip) => {\r\n const allTimeSlots = ['0-6', '6-12', '12-18', '18-24'];\r\n const hasReturnContext = /\\b(return|returning|inbound|back|roundtrip|round trip|rt)\\b/i.test(\r\n text,\r\n );\r\n const hasArrivalContext = /\\b(arrival|arrive)\\b/i.test(text);\r\n const hasDepartureContext = /\\b(departure|depart)\\b/i.test(text);\r\n const hasOnwardContext = /\\b(onward|outbound|oneway|one-way|one way|outward)\\b/i.test(\r\n text,\r\n );\r\n\r\n const getTimeTargetKeys = () => {\r\n if (isRoundTrip && hasReturnContext && hasArrivalContext) {\r\n return ['rArrTimes'];\r\n }\r\n if (isRoundTrip && hasReturnContext) {\r\n return ['rDepTimes'];\r\n }\r\n if (isRoundTrip && hasOnwardContext && hasArrivalContext) {\r\n return ['arrTimes'];\r\n }\r\n if (isRoundTrip && hasOnwardContext) {\r\n return ['depTimes'];\r\n }\r\n if (hasArrivalContext) {\r\n return ['arrTimes'];\r\n }\r\n if (hasDepartureContext) {\r\n return isRoundTrip ? ['depTimes', 'rDepTimes'] : ['depTimes'];\r\n }\r\n // In round-trip split flow, generic time intent should apply to both legs.\r\n return isRoundTrip ? ['depTimes', 'rDepTimes'] : ['depTimes'];\r\n };\r\n\r\n const addUniqueTimeSlot = (targetKey, slot) => {\r\n if (!filters[targetKey].includes(slot)) {\r\n filters[targetKey].push(slot);\r\n }\r\n };\r\n const addSlotToTargets = slot => {\r\n getTimeTargetKeys().forEach(targetKey =>\r\n addUniqueTimeSlot(targetKey, slot)\r\n );\r\n };\r\n const mapHourToSlot = (hour) => {\r\n if (!Number.isFinite(hour)) return null;\r\n if (hour < 6) return '0-6';\r\n if (hour < 12) return '6-12';\r\n if (hour < 18) return '12-18';\r\n return '18-24';\r\n };\r\n\r\n // Handle threshold phrasing like:\r\n // \"first flight after 12:00\", \"flights after 6 pm\", \"before 10:30 am\".\r\n const thresholdMatch = text.match(\r\n /\\b(after|before)\\s+(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)?\\b/i\r\n );\r\n if (thresholdMatch) {\r\n const comparator = String(thresholdMatch[1] || '').toLowerCase();\r\n let hour = Number(thresholdMatch[2]);\r\n const minute = Number(thresholdMatch[3] || 0);\r\n const meridiem = String(thresholdMatch[4] || '').toLowerCase();\r\n\r\n if (Number.isFinite(hour) && hour >= 0 && hour <= 24) {\r\n if (meridiem === 'pm' && hour < 12) hour += 12;\r\n if (meridiem === 'am' && hour === 12) hour = 0;\r\n // If user says \"after 12:30\", treat threshold into the next slot when needed.\r\n if (minute > 0 && comparator === 'after' && hour < 24) {\r\n hour += 1;\r\n }\r\n\r\n if (comparator === 'after') {\r\n const slots = [];\r\n if (hour < 6) slots.push('0-6', '6-12', '12-18', '18-24');\r\n else if (hour < 12) slots.push('6-12', '12-18', '18-24');\r\n else if (hour < 18) slots.push('12-18', '18-24');\r\n else slots.push('18-24');\r\n slots.forEach((slot) => addSlotToTargets(slot));\r\n } else if (comparator === 'before') {\r\n const slots = [];\r\n if (hour <= 6) slots.push('0-6');\r\n else if (hour <= 12) slots.push('0-6', '6-12');\r\n else if (hour <= 18) slots.push('0-6', '6-12', '12-18');\r\n else slots.push('0-6', '6-12', '12-18', '18-24');\r\n slots.forEach((slot) => addSlotToTargets(slot));\r\n }\r\n }\r\n }\r\n\r\n // Do not treat large numeric ranges as time ranges.\r\n // Example: \"from 200 to 4000\" is a price range, not time.\r\n const isLikelyPriceContext =\r\n /\\b(price|fare|budget|cost|amount|rs|rupees|inr|₹|under|below|above|over|between|from|to)\\b/i.test(\r\n text\r\n );\r\n const hasMeridiemHint = /\\b(am|pm)\\b/i.test(text);\r\n const hasLargeNumericRange = /\\b\\d{3,}\\s*(?:to|-|and)\\s*\\d{3,}\\b/i.test(text);\r\n\r\n // If query clearly looks like a price range (e.g. \"from 200 to 4000\"),\r\n // skip time parsing entirely to avoid accidental dep-time selection.\r\n if (isLikelyPriceContext && hasLargeNumericRange && !hasMeridiemHint) {\r\n return;\r\n }\r\n\r\n const hasNegationIntent =\r\n /\\b(avoid|exclude|except|not|without|skip|no)\\b/i.test(text);\r\n const isDepartureContext =\r\n /\\b(departure|depart|onward departure)\\b/i.test(text) ||\r\n (!/\\b(arrival|arrive|return)\\b/i.test(text) &&\r\n /\\bflight|flights|time|before|after|morning|afternoon|evening|night\\b/i.test(\r\n text\r\n ));\r\n const isReturnDepartureContext =\r\n isRoundTrip && hasReturnContext && !hasArrivalContext;\r\n const isReturnArrivalContext =\r\n isRoundTrip && hasReturnContext && hasArrivalContext;\r\n\r\n // Handle negative departure-time intent like:\r\n // \"avoid departure flights before 6 am\"\r\n if (\r\n hasNegationIntent &&\r\n (isDepartureContext || isReturnDepartureContext || isReturnArrivalContext)\r\n ) {\r\n const excludedSlots = [];\r\n\r\n if (/\\bbefore\\s*6\\s*am\\b/i.test(text)) {\r\n excludedSlots.push('0-6');\r\n }\r\n if (/\\b6\\s*am\\s*(?:to|-)\\s*12\\s*pm\\b/i.test(text)) {\r\n excludedSlots.push('6-12');\r\n }\r\n if (/\\b12\\s*pm\\s*(?:to|-)\\s*6\\s*pm\\b/i.test(text)) {\r\n excludedSlots.push('12-18');\r\n }\r\n if (/\\bafter\\s*6\\s*pm\\b/i.test(text)) {\r\n excludedSlots.push('18-24');\r\n }\r\n\r\n if (\r\n (text.includes('early morning') || text.includes('before 6')) &&\r\n !excludedSlots.includes('0-6')\r\n ) {\r\n excludedSlots.push('0-6');\r\n }\r\n\r\n if (excludedSlots.length > 0) {\r\n const targetKeys = getTimeTargetKeys();\r\n targetKeys.forEach(targetKey => {\r\n filters[targetKey] = allTimeSlots.filter(\r\n slot => !excludedSlots.includes(slot)\r\n );\r\n });\r\n return;\r\n }\r\n }\r\n\r\n // Enhanced time parsing with more natural language patterns\r\n const timeMappings = {\r\n 'early morning': '0-6',\r\n morning: '6-12',\r\n afternoon: '12-18',\r\n evening: '18-24',\r\n night: '18-24',\r\n 'late night': '18-24',\r\n 'before 6': '0-6',\r\n 'before 6 am': '0-6',\r\n '6 am to 12 pm': '6-12',\r\n '6 am - 12 pm': '6-12',\r\n '12 pm to 6 pm': '12-18',\r\n '12 pm - 6 pm': '12-18',\r\n 'after 6 pm': '18-24',\r\n 'after 6': '18-24',\r\n };\r\n\r\n // Parse specific time ranges (e.g., \"6 to 7\", \"departure from 6 to 7\")\r\n const specificTimePatterns = [\r\n // Simple pattern for \"6 am to 7 am\" - most common case\r\n /(\\d{1,2})\\s*am\\s*to\\s*(\\d{1,2})\\s*am/i,\r\n /(\\d{1,2})\\s*pm\\s*to\\s*(\\d{1,2})\\s*pm/i,\r\n // Patterns like \"6 am to 7 am\", \"6 pm to 7 pm\"\r\n /(\\d{1,2})\\s*(?:am|pm)\\s*(?:to|-|until)\\s*(\\d{1,2})\\s*(?:am|pm)/i,\r\n // Patterns like \"departure from 6 am to 7 am\", \"arrival between 6 pm and 7 pm\"\r\n /(?:departure|depart)\\s*(?:from|at)?\\s*(\\d{1,2})\\s*(?:am|pm)\\s*(?:to|-|until)\\s*(\\d{1,2})\\s*(?:am|pm)/i,\r\n /(?:arrival|arrive)\\s*(?:from|at)?\\s*(\\d{1,2})\\s*(?:am|pm)\\s*(?:to|-|until)\\s*(\\d{1,2})\\s*(?:am|pm)/i,\r\n // Patterns like \"between 6 am and 7 am\", \"from 6 pm to 7 pm\"\r\n /(?:between|from)\\s*(\\d{1,2})\\s*(?:am|pm)\\s*(?:and|to)\\s*(\\d{1,2})\\s*(?:am|pm)/i,\r\n // Patterns like \"6 to 7\", \"6-7\", \"6:00 to 7:00\" (without AM/PM)\r\n /(\\d{1,2})\\s*(?:to|-|until)\\s*(\\d{1,2})(?:\\s*(?:am|pm))?/i,\r\n // Patterns like \"departure from 6 to 7\", \"arrival between 6 and 7\"\r\n /(?:departure|depart)\\s*(?:from|at)?\\s*(\\d{1,2})\\s*(?:to|-|until)\\s*(\\d{1,2})(?:\\s*(?:am|pm))?/i,\r\n /(?:arrival|arrive)\\s*(?:from|at)?\\s*(\\d{1,2})\\s*(?:to|-|until)\\s*(\\d{1,2})(?:\\s*(?:am|pm))?/i,\r\n // Patterns like \"between 6 and 7\", \"from 6 to 7\"\r\n /(?:between|from)\\s*(\\d{1,2})\\s*(?:and|to)\\s*(\\d{1,2})(?:\\s*(?:am|pm))?/i,\r\n ];\r\n\r\n specificTimePatterns.forEach((pattern, index) => {\r\n const match = text.match(pattern);\r\n if (match) {\r\n const startHour = parseInt(match[1]);\r\n const endHour = parseInt(match[2]);\r\n\r\n // Guard: skip non-time numeric ranges (e.g. 200 to 4000 price).\r\n if (\r\n Number.isNaN(startHour) ||\r\n Number.isNaN(endHour) ||\r\n startHour > 24 ||\r\n endHour > 24\r\n ) {\r\n return;\r\n }\r\n\r\n // Convert to 24-hour format if needed\r\n let start24 = startHour;\r\n let end24 = endHour;\r\n\r\n // Handle AM/PM - check the full match to see which times have AM/PM\r\n const fullMatch = match[0];\r\n\r\n // Check if start time has PM\r\n const startTimePart = fullMatch.split(/\\s*(?:to|-|until|and)\\s*/i)[0];\r\n if (startTimePart.includes('pm') && startHour < 12) {\r\n start24 = startHour + 12;\r\n }\r\n\r\n // Check if end time has PM\r\n const endTimePart = fullMatch.split(/\\s*(?:to|-|until|and)\\s*/i)[1];\r\n if (endTimePart && endTimePart.includes('pm') && endHour < 12) {\r\n end24 = endHour + 12;\r\n }\r\n\r\n // Map specific times to existing time slots\r\n let mappedTimeSlot = null;\r\n\r\n // Map to existing time slots: 0-6, 6-12, 12-18, 18-24\r\n if (start24 >= 0 && end24 <= 6) {\r\n mappedTimeSlot = '0-6';\r\n } else if (start24 >= 6 && end24 <= 12) {\r\n mappedTimeSlot = '6-12';\r\n } else if (start24 >= 12 && end24 <= 18) {\r\n mappedTimeSlot = '12-18';\r\n } else if (start24 >= 18 && end24 <= 24) {\r\n mappedTimeSlot = '18-24';\r\n } else {\r\n // For times that span multiple slots, use the primary slot\r\n if (start24 < 6) {\r\n mappedTimeSlot = '0-6';\r\n } else if (start24 < 12) {\r\n mappedTimeSlot = '6-12';\r\n } else if (start24 < 18) {\r\n mappedTimeSlot = '12-18';\r\n } else {\r\n mappedTimeSlot = '18-24';\r\n }\r\n }\r\n\r\n addSlotToTargets(mappedTimeSlot);\r\n }\r\n });\r\n\r\n // Parse single specific times (e.g., \"departure at 6\", \"arrival at 7 pm\")\r\n const singleTimePatterns = [\r\n /(?:departure|depart)\\s*(?:at|from)\\s*(\\d{1,2})(?:\\s*(?:am|pm))?/i,\r\n /(?:arrival|arrive)\\s*(?:at|from)\\s*(\\d{1,2})(?:\\s*(?:am|pm))?/i,\r\n /(?:at|from)\\s*(\\d{1,2})(?:\\s*(?:am|pm))?/i,\r\n ];\r\n\r\n singleTimePatterns.forEach(pattern => {\r\n const match = text.match(pattern);\r\n if (match) {\r\n let hour = parseInt(match[1]);\r\n\r\n // Guard: skip large numeric values that are not valid hour values.\r\n if (Number.isNaN(hour) || hour > 24) {\r\n return;\r\n }\r\n\r\n // Handle AM/PM if present\r\n if (text.includes('pm') && hour < 12) {\r\n hour = hour + 12;\r\n }\r\n\r\n // Map single time to existing time slots\r\n let mappedTimeSlot = null;\r\n\r\n // Map to existing time slots: 0-6, 6-12, 12-18, 18-24\r\n if (hour >= 0 && hour < 6) {\r\n mappedTimeSlot = '0-6';\r\n } else if (hour >= 6 && hour < 12) {\r\n mappedTimeSlot = '6-12';\r\n } else if (hour >= 12 && hour < 18) {\r\n mappedTimeSlot = '12-18';\r\n } else {\r\n mappedTimeSlot = '18-24';\r\n }\r\n\r\n addSlotToTargets(mappedTimeSlot);\r\n }\r\n });\r\n\r\n // Parse departure/return-departure times\r\n Object.entries(timeMappings).forEach(([pattern, timeSlot]) => {\r\n if (text.includes(pattern) && !hasArrivalContext) {\r\n addSlotToTargets(timeSlot);\r\n }\r\n });\r\n\r\n // Parse arrival/return-arrival times\r\n Object.entries(timeMappings).forEach(([pattern, timeSlot]) => {\r\n if (\r\n text.includes(`arrive ${pattern}`) ||\r\n text.includes(`arrival ${pattern}`)\r\n ) {\r\n addSlotToTargets(timeSlot);\r\n }\r\n });\r\n\r\n // Additional time slot detection\r\n const timeSlots = [\r\n { pattern: /before\\s*6\\s*am/i, slot: '0-6' },\r\n { pattern: /6\\s*am\\s*to\\s*12\\s*pm/i, slot: '6-12' },\r\n { pattern: /12\\s*pm\\s*to\\s*6\\s*pm/i, slot: '12-18' },\r\n { pattern: /after\\s*6\\s*pm/i, slot: '18-24' },\r\n ];\r\n\r\n timeSlots.forEach(({ pattern, slot }) => {\r\n if (pattern.test(text)) {\r\n if (!hasMeridiemHint && isLikelyPriceContext) {\r\n return;\r\n }\r\n const targetKeys = getTimeTargetKeys();\r\n if (\r\n !hasArrivalContext ||\r\n targetKeys.includes('arrTimes') ||\r\n targetKeys.includes('rArrTimes')\r\n ) {\r\n addSlotToTargets(slot);\r\n }\r\n }\r\n });\r\n};\r\n\r\n// Function to apply parsed filters to existing filter components\r\nexport const applySmartFilters = parsedFilters => {\r\n // Always clear all existing filters first (except for clear all command itself)\r\n if (!parsedFilters.clearAll) {\r\n // Clear all checkboxes with more specific selectors\r\n const allCheckboxes = document.querySelectorAll('input[type=\"checkbox\"]');\r\n\r\n allCheckboxes.forEach(checkbox => {\r\n if (checkbox.checked) {\r\n checkbox.checked = false;\r\n const event = new Event('change', { bubbles: true });\r\n Object.defineProperty(event, 'target', {\r\n value: checkbox,\r\n enumerable: true,\r\n });\r\n checkbox.dispatchEvent(event);\r\n }\r\n });\r\n\r\n // Also uncheck sort buttons\r\n const allSortButtons = document.querySelectorAll(\r\n 'input[id=\"departure\"], input[id=\"arrival\"], input[id=\"price\"]'\r\n );\r\n allSortButtons.forEach(btn => {\r\n if (btn.checked) {\r\n btn.checked = false;\r\n const event = new Event('change', { bubbles: true });\r\n Object.defineProperty(event, 'target', {\r\n value: btn,\r\n enumerable: true,\r\n });\r\n btn.dispatchEvent(event);\r\n }\r\n });\r\n }\r\n\r\n // Handle clear all command\r\n if (parsedFilters.clearAll) {\r\n // Clear all checkboxes (including sort buttons)\r\n const allCheckboxes = document.querySelectorAll('input[type=\"checkbox\"]');\r\n allCheckboxes.forEach(checkbox => {\r\n checkbox.checked = false;\r\n // Trigger change event\r\n const event = new Event('change', { bubbles: true });\r\n Object.defineProperty(event, 'target', {\r\n value: checkbox,\r\n enumerable: true,\r\n });\r\n checkbox.dispatchEvent(event);\r\n });\r\n\r\n // Specifically clear sort buttons to ensure they're unchecked\r\n const sortButtons = document.querySelectorAll(\r\n 'input[id=\"departure\"], input[id=\"arrival\"], input[id=\"price\"]'\r\n );\r\n sortButtons.forEach(btn => {\r\n btn.checked = false;\r\n const event = new Event('change', { bubbles: true });\r\n Object.defineProperty(event, 'target', {\r\n value: btn,\r\n enumerable: true,\r\n });\r\n btn.dispatchEvent(event);\r\n });\r\n\r\n return { clearAll: true };\r\n }\r\n\r\n // Handle sorting - return the sort information to be handled by the parent component\r\n if (parsedFilters.sortBy) {\r\n return { sortBy: parsedFilters.sortBy };\r\n }\r\n\r\n // Apply stops - clear all stops first, then check only the selected ones\r\n if (parsedFilters.stops.length > 0) {\r\n // First, uncheck all stop checkboxes\r\n const allStopCheckboxes = document.querySelectorAll(\r\n 'input[name=\"stops\"][value=\"0\"], input[name=\"stops\"][value=\"1\"], input[name=\"stops\"][value=\"2\"]'\r\n );\r\n\r\n allStopCheckboxes.forEach(checkbox => {\r\n checkbox.checked = false;\r\n const event = new Event('change', { bubbles: true });\r\n Object.defineProperty(event, 'target', {\r\n value: checkbox,\r\n enumerable: true,\r\n });\r\n checkbox.dispatchEvent(event);\r\n });\r\n\r\n // Then check only the selected stops\r\n parsedFilters.stops.forEach(stop => {\r\n const checkbox = document.querySelector(\r\n `input[name=\"stops\"][value=\"${stop}\"]`\r\n );\r\n if (checkbox) {\r\n checkbox.checked = true;\r\n // Create a synthetic event that mimics the real change event\r\n const event = new Event('change', { bubbles: true });\r\n Object.defineProperty(event, 'target', {\r\n value: checkbox,\r\n enumerable: true,\r\n });\r\n checkbox.dispatchEvent(event);\r\n }\r\n });\r\n }\r\n\r\n // Apply airlines\r\n if (parsedFilters.airlines.length > 0) {\r\n parsedFilters.airlines.forEach(airline => {\r\n const checkbox = document.querySelector(\r\n `input[name=\"airlines\"][value=\"${airline}\"]`\r\n );\r\n if (checkbox) {\r\n checkbox.checked = true;\r\n const event = new Event('change', { bubbles: true });\r\n Object.defineProperty(event, 'target', {\r\n value: checkbox,\r\n enumerable: true,\r\n });\r\n checkbox.dispatchEvent(event);\r\n } else {\r\n }\r\n });\r\n }\r\n\r\n // Apply departure times\r\n if (parsedFilters.depTimes.length > 0) {\r\n parsedFilters.depTimes.forEach(time => {\r\n const checkbox = document.querySelector(\r\n `input[name=\"depTime\"][value=\"${time}\"]`\r\n );\r\n if (checkbox) {\r\n checkbox.checked = true;\r\n const event = new Event('change', { bubbles: true });\r\n Object.defineProperty(event, 'target', {\r\n value: checkbox,\r\n enumerable: true,\r\n });\r\n checkbox.dispatchEvent(event);\r\n } else {\r\n // Try to find all depTime checkboxes to see what's available\r\n const allDepTimeCheckboxes = document.querySelectorAll(\r\n 'input[name=\"depTime\"]'\r\n );\r\n allDepTimeCheckboxes.forEach(cb => {\r\n console.log(\r\n 'Available depTime checkbox:',\r\n cb.name,\r\n cb.value,\r\n cb.checked\r\n );\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Apply arrival times\r\n if (parsedFilters.arrTimes.length > 0) {\r\n parsedFilters.arrTimes.forEach(time => {\r\n const checkbox = document.querySelector(\r\n `input[name=\"arlTime\"][value=\"${time}\"]`\r\n );\r\n if (checkbox) {\r\n checkbox.checked = true;\r\n const event = new Event('change', { bubbles: true });\r\n Object.defineProperty(event, 'target', {\r\n value: checkbox,\r\n enumerable: true,\r\n });\r\n checkbox.dispatchEvent(event);\r\n }\r\n });\r\n }\r\n\r\n // Apply return departure times (for round trip)\r\n if (parsedFilters.rDepTimes.length > 0) {\r\n parsedFilters.rDepTimes.forEach(time => {\r\n const checkbox = document.querySelector(\r\n `input[name=\"rdepTime\"][value=\"${time}\"]`\r\n );\r\n if (checkbox) {\r\n checkbox.checked = true;\r\n const event = new Event('change', { bubbles: true });\r\n Object.defineProperty(event, 'target', {\r\n value: checkbox,\r\n enumerable: true,\r\n });\r\n checkbox.dispatchEvent(event);\r\n }\r\n });\r\n }\r\n\r\n // Apply return arrival times (for round trip)\r\n if (parsedFilters.rArrTimes.length > 0) {\r\n parsedFilters.rArrTimes.forEach(time => {\r\n const checkbox = document.querySelector(\r\n `input[name=\"rarlTime\"][value=\"${time}\"]`\r\n );\r\n if (checkbox) {\r\n checkbox.checked = true;\r\n const event = new Event('change', { bubbles: true });\r\n Object.defineProperty(event, 'target', {\r\n value: checkbox,\r\n enumerable: true,\r\n });\r\n checkbox.dispatchEvent(event);\r\n }\r\n });\r\n }\r\n\r\n // Apply price range (this would need to be handled by the parent component)\r\n if (parsedFilters.price) {\r\n // Trigger price range update - this would need to be passed to the parent component\r\n return { priceUpdate: parsedFilters.price };\r\n }\r\n\r\n // Apply sorting (this would need to be handled by the parent component)\r\n if (parsedFilters.sortBy) {\r\n return { sortBy: parsedFilters.sortBy };\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst isInTimeSlot = (timeStr, slots) => {\r\n if (!slots || slots.length === 0) return true;\r\n \r\n let hour = null;\r\n timeStr = String(timeStr || '').trim();\r\n \r\n if (timeStr.includes(':')) {\r\n const parts = timeStr.split(':');\r\n if (parts[0].includes('T')) {\r\n hour = parseInt(parts[0].split('T')[1], 10);\r\n } else if (parts[0].includes(' ')) {\r\n hour = parseInt(parts[0].split(' ').pop(), 10);\r\n } else {\r\n hour = parseInt(parts[0], 10);\r\n }\r\n } else if (timeStr.length === 4 && !isNaN(timeStr)) {\r\n hour = parseInt(timeStr.substring(0, 2), 10);\r\n } else {\r\n hour = parseInt(timeStr, 10);\r\n }\r\n\r\n if (hour === null || isNaN(hour)) return true;\r\n\r\n return slots.some(slot => {\r\n // Handle specific slots\r\n if (slot === '0-6') return hour >= 0 && hour < 6;\r\n if (slot === '6-12') return hour >= 6 && hour < 12;\r\n if (slot === '12-18') return hour >= 12 && hour < 18;\r\n if (slot === '18-24') return hour >= 18 && hour <= 24;\r\n\r\n // Handle dynamic ranges like \"6-8\" or \"10-14\"\r\n if (slot.includes('-')) {\r\n const [start, end] = slot.split('-').map(s => parseInt(s, 10));\r\n if (!isNaN(start) && !isNaN(end)) {\r\n return hour >= start && hour < end;\r\n }\r\n }\r\n return false;\r\n });\r\n};\r\n\r\nexport const filterFlightData = (payload, filters) => {\r\n if (!filters || filters.clearAll) return payload;\r\n\r\n const {\r\n stops = [],\r\n rtStops = [],\r\n price = null,\r\n airlines: rawAirlines = [],\r\n rtAirlines: rawRtAirlines = [],\r\n depTimes = [],\r\n arrTimes = [],\r\n rDepTimes = [],\r\n rArrTimes = [],\r\n layover: rawLayover = [],\r\n rLayover: rawReturnLayover = [],\r\n layoverDuration = null,\r\n rLayoverDuration = null,\r\n } = filters;\r\n\r\n // Normalize airline names to codes\r\n const airlinesMap = {}; \r\n try {\r\n const rawData = airlinesDataJson;\r\n if (Array.isArray(rawData)) {\r\n rawData.forEach(a => {\r\n if (a.code && a.english) {\r\n const nameKey = a.english.toLowerCase();\r\n const codeValue = a.code.toUpperCase();\r\n if (!Array.isArray(airlinesMap[nameKey])) {\r\n airlinesMap[nameKey] = [];\r\n }\r\n if (!airlinesMap[nameKey].includes(codeValue)) {\r\n airlinesMap[nameKey].push(codeValue);\r\n }\r\n airlinesMap[a.code.toLowerCase()] = [codeValue];\r\n }\r\n });\r\n }\r\n } catch (e) {\r\n console.error('Failed to load airline data:', e);\r\n }\r\n\r\n const normalizeAirlines = (list) => {\r\n return list.flatMap(a => {\r\n const val = String(a).toLowerCase().trim();\r\n const mapped = airlinesMap[val];\r\n if (Array.isArray(mapped) && mapped.length > 0) return mapped;\r\n return [val.toUpperCase()];\r\n }).filter(Boolean);\r\n };\r\n\r\n const airlines = normalizeAirlines(rawAirlines);\r\n const rtAirlines = normalizeAirlines(rawRtAirlines);\r\n const airlineCodeSet = new Set(airlines.map((code) => String(code).toUpperCase()));\r\n const rtAirlineCodeSet = new Set(\r\n rtAirlines.map((code) => String(code).toUpperCase()),\r\n );\r\n const resolveCarrierCodes = (segment = {}) => {\r\n const rawCarrier = String(segment?.ma || segment?.ac || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!rawCarrier) return [];\r\n const mapped = airlinesMap[rawCarrier];\r\n if (Array.isArray(mapped) && mapped.length > 0) {\r\n return mapped.map((code) => String(code).toUpperCase());\r\n }\r\n return [rawCarrier.toUpperCase()];\r\n };\r\n const normalizeLayoverFilter = (value) => {\r\n if (Array.isArray(value)) {\r\n return value\r\n .flatMap(entry => String(entry || '').split(','))\r\n .map(entry => entry.trim().toUpperCase())\r\n .filter(Boolean);\r\n }\r\n const single = String(value || '').trim();\r\n if (!single) return [];\r\n return single\r\n .split(',')\r\n .map(entry => entry.trim().toUpperCase())\r\n .filter(Boolean);\r\n };\r\n\r\n const layover = normalizeLayoverFilter(rawLayover);\r\n const rLayover = normalizeLayoverFilter(rawReturnLayover);\r\n\r\n const hasAnyFilter =\r\n stops.length > 0 || price || airlines.length > 0 ||\r\n depTimes.length > 0 ||\r\n arrTimes.length > 0 ||\r\n layover.length > 0 ||\r\n layoverDuration;\r\n\r\n if (\r\n !hasAnyFilter &&\r\n rtStops.length === 0 &&\r\n rtAirlines.length === 0 &&\r\n rDepTimes.length === 0 &&\r\n rArrTimes.length === 0 &&\r\n rLayover.length === 0 &&\r\n !rLayoverDuration\r\n ) {\r\n return payload;\r\n }\r\n\r\n const toAirportCodes = (input) => {\r\n if (input === null || input === undefined) return [];\r\n if (Array.isArray(input)) {\r\n return input.flatMap(item => toAirportCodes(item));\r\n }\r\n if (typeof input === 'object') {\r\n return [\r\n input?.code,\r\n input?.airportCode,\r\n input?.iata,\r\n input?.ar,\r\n input?.da,\r\n input?.via,\r\n input?.lyovr,\r\n input?.layover,\r\n input?.stop,\r\n ]\r\n .flatMap(item => toAirportCodes(item))\r\n .filter(Boolean);\r\n }\r\n const text = String(input || '')\r\n .trim()\r\n .toUpperCase();\r\n if (!text) return [];\r\n const matched = text.match(/\\b[A-Z]{3}\\b/g);\r\n return matched && matched.length ? matched : [text];\r\n };\r\n\r\n const uniqueCodes = (values = []) =>\r\n Array.from(\r\n new Set(\r\n values\r\n .map(value => String(value || '').trim().toUpperCase())\r\n .filter(Boolean),\r\n ),\r\n );\r\n\r\n const getLayoverCodes = (trip = {}, dep = {}, segments = []) => {\r\n const fromSegments = segments\r\n .slice(0, Math.max(segments.length - 1, 0))\r\n .flatMap(seg => toAirportCodes(seg?.ar));\r\n const fromSegmentStopFields = segments.flatMap(seg =>\r\n toAirportCodes([\r\n seg?.stp,\r\n seg?.stops,\r\n seg?.stopover,\r\n seg?.layover,\r\n seg?.lyovr,\r\n seg?.via,\r\n ]),\r\n );\r\n const fromDepLevel = toAirportCodes([\r\n dep?.stp,\r\n dep?.stops,\r\n dep?.stopover,\r\n dep?.layover,\r\n dep?.lyovr,\r\n dep?.via,\r\n dep?.cnx,\r\n dep?.conn,\r\n dep?.connections,\r\n ]);\r\n const fromTripLevel = toAirportCodes([\r\n trip?.stp,\r\n trip?.stops,\r\n trip?.stopover,\r\n trip?.layover,\r\n trip?.lyovr,\r\n trip?.via,\r\n trip?.cnx,\r\n trip?.conn,\r\n trip?.connections,\r\n ]);\r\n return uniqueCodes([\r\n ...fromSegments,\r\n ...fromSegmentStopFields,\r\n ...fromDepLevel,\r\n ...fromTripLevel,\r\n ]);\r\n };\r\n\r\n const parseDateParts = (dateValue, timeValue) => {\r\n const rawDate = String(dateValue || '').trim();\r\n const rawTime = String(timeValue || '').trim();\r\n if (!rawDate || !rawTime) return null;\r\n const dateMatch = rawDate.match(/^(\\d{2})-(\\d{2})-(\\d{4})$/);\r\n const timeMatch = rawTime.match(/^(\\d{1,2}):(\\d{2})$/);\r\n if (!dateMatch || !timeMatch) return null;\r\n const dd = Number(dateMatch[1]);\r\n const mm = Number(dateMatch[2]);\r\n const yyyy = Number(dateMatch[3]);\r\n const hh = Number(timeMatch[1]);\r\n const min = Number(timeMatch[2]);\r\n const dt = new Date(yyyy, mm - 1, dd, hh, min, 0, 0);\r\n if (Number.isNaN(dt.getTime())) return null;\r\n return dt;\r\n };\r\n\r\n const getLayoverDurationsInMinutes = (segments = []) => {\r\n const values = [];\r\n for (let index = 0; index < segments.length - 1; index += 1) {\r\n const current = segments[index] || {};\r\n const next = segments[index + 1] || {};\r\n const arrivalDate = current?.ad || current?.dd || '';\r\n const departureDate = next?.dd || next?.ad || '';\r\n const arrivalTime = current?.at || '';\r\n const departureTime = next?.dt || '';\r\n const arrival = parseDateParts(arrivalDate, arrivalTime);\r\n const departure = parseDateParts(departureDate, departureTime);\r\n if (!arrival || !departure) continue;\r\n const diffMinutes = Math.round((departure.getTime() - arrival.getTime()) / 60000);\r\n if (Number.isFinite(diffMinutes) && diffMinutes >= 0) {\r\n values.push(diffMinutes);\r\n }\r\n }\r\n return values;\r\n };\r\n\r\n const isLayoverDurationMatch = (durations, constraint) => {\r\n if (!constraint || typeof constraint !== 'object') return true;\r\n const min = constraint?.min !== undefined ? Number(constraint.min) : null;\r\n const max = constraint?.max !== undefined ? Number(constraint.max) : null;\r\n if (!Number.isFinite(min) && !Number.isFinite(max)) {\r\n return true;\r\n }\r\n // If user requested layover duration, there must be at least one computed layover.\r\n if (!Array.isArray(durations) || durations.length === 0) {\r\n return false;\r\n }\r\n return durations.some((duration) => {\r\n if (Number.isFinite(min) && duration < min) return false;\r\n if (Number.isFinite(max) && duration > max) return false;\r\n return true;\r\n });\r\n };\r\n\r\n return payload.map(item => {\r\n const trips = Array.isArray(item.trps) ? item.trps : [];\r\n \r\n // Filter the trips within this flight item\r\n const filteredTrips = trips.filter((trip, tipIdx) => {\r\n const dep = trip.deps?.[0];\r\n const segments = Array.isArray(dep?.seg) ? dep.seg : [];\r\n const firstSeg = segments[0] || {};\r\n const lastSeg = segments[segments.length - 1] || firstSeg;\r\n const fare = trip.prc?.[0]?.pr || {};\r\n const tripPrice = fare.tf;\r\n\r\n // Stops filter\r\n const numStops = Math.max(segments.length - 1, 0);\r\n if (stops.length > 0 && !stops.map(Number).includes(numStops)) return false;\r\n\r\n // Price filter\r\n if (price) {\r\n const p = Number(tripPrice);\r\n if (!isNaN(p)) {\r\n if (price.min !== undefined && p < Number(price.min)) return false;\r\n if (price.max !== undefined && p > Number(price.max)) return false;\r\n }\r\n }\r\n\r\n // Airline filter\r\n const carrierCodes = resolveCarrierCodes(firstSeg);\r\n if (\r\n airlines.length > 0 &&\r\n !carrierCodes.some((carrierCode) => airlineCodeSet.has(carrierCode))\r\n ) {\r\n return false;\r\n }\r\n\r\n // Departure time filter\r\n if (depTimes.length > 0 && !isInTimeSlot(firstSeg.dt || '', depTimes)) return false;\r\n\r\n // Arrival time filter\r\n if (arrTimes.length > 0 && !isInTimeSlot(lastSeg.at || '', arrTimes)) return false;\r\n\r\n // Layover filter (onward): all requested layovers must exist in connection points.\r\n if (layover.length > 0) {\r\n const segmentLayovers = getLayoverCodes(trip, dep, segments);\r\n const hasAllLayovers = layover.every(code => segmentLayovers.includes(code));\r\n if (!hasAllLayovers) return false;\r\n }\r\n\r\n if (layoverDuration) {\r\n const layoverDurations = getLayoverDurationsInMinutes(segments);\r\n if (!isLayoverDurationMatch(layoverDurations, layoverDuration)) return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n // Handle Round Trip return leg if applicable\r\n let filteredRtTrips = item.rttrps;\r\n if (\r\n Number(item.tt) === 2 &&\r\n (\r\n rtStops.length > 0 ||\r\n rtAirlines.length > 0 ||\r\n rDepTimes.length > 0 ||\r\n rArrTimes.length > 0 ||\r\n rLayover.length > 0 ||\r\n rLayoverDuration\r\n )\r\n ) {\r\n const rtTrips = Array.isArray(item.rttrps) ? item.rttrps : [];\r\n filteredRtTrips = rtTrips.filter(trip => {\r\n const dep = trip.deps?.[0];\r\n const segments = Array.isArray(dep?.seg) ? dep.seg : [];\r\n const firstSeg = segments[0] || {};\r\n const lastSeg = segments[segments.length - 1] || firstSeg;\r\n\r\n const numStops = Math.max(segments.length - 1, 0);\r\n if (rtStops.length > 0 && !rtStops.map(Number).includes(numStops)) return false;\r\n\r\n const carrierCodes = resolveCarrierCodes(firstSeg);\r\n if (\r\n rtAirlines.length > 0 &&\r\n !carrierCodes.some((carrierCode) =>\r\n rtAirlineCodeSet.has(carrierCode),\r\n )\r\n ) {\r\n return false;\r\n }\r\n\r\n if (rDepTimes.length > 0 && !isInTimeSlot(firstSeg.dt || '', rDepTimes)) return false;\r\n if (rArrTimes.length > 0 && !isInTimeSlot(lastSeg.at || '', rArrTimes)) return false;\r\n // Refundable filter\r\n if (filters.refundable === true) {\r\n const fare = trip.prc?.[0]?.pr || {};\r\n const isRefundable = Number(fare.rf || 0) === 1 || /refundable/i.test(fare.ft || '');\r\n if (!isRefundable) return false;\r\n }\r\n\r\n // Max Duration filter\r\n if (filters.maxDuration) {\r\n const totalDuration = Number(dep?.tdur || firstSeg.fdur || 0);\r\n if (totalDuration > filters.maxDuration) return false;\r\n }\r\n \r\n\r\n if (rLayover.length > 0) {\r\n const segmentLayovers = getLayoverCodes(trip, dep, segments);\r\n const hasAllLayovers = rLayover.every(code => segmentLayovers.includes(code));\r\n if (!hasAllLayovers) return false;\r\n }\r\n if (rLayoverDuration) {\r\n const layoverDurations = getLayoverDurationsInMinutes(segments);\r\n if (!isLayoverDurationMatch(layoverDurations, rLayoverDuration)) return false;\r\n }\r\n\r\n\r\n return true;\r\n });\r\n }\r\n\r\n // If no trips match, this flight item should be removed (we'll filter it out in the next step)\r\n if (filteredTrips.length === 0) return null;\r\n if (Number(item.tt) === 2 && Array.isArray(item.rttrps) && item.rttrps.length > 0 && filteredRtTrips.length === 0) return null;\r\n\r\n return {\r\n ...item,\r\n trps: filteredTrips,\r\n rttrps: filteredRtTrips\r\n };\r\n }).filter(Boolean);\r\n};\r\n\r\nexport const sortFlightData = (payload, sortBy) => {\r\n if (!sortBy) return payload;\r\n\r\n const getPrice = (trip) => {\r\n const p = trip.prc?.[0]?.pr?.tf;\r\n return isNaN(p) ? Infinity : Number(p);\r\n };\r\n\r\n const getDepTime = (trip) => {\r\n return trip.deps?.[0]?.seg?.[0]?.dt || '99:99';\r\n };\r\n\r\n const getArrTime = (trip) => {\r\n const segments = trip.deps?.[0]?.seg || [];\r\n const lastSeg = segments[segments.length - 1] || {};\r\n return lastSeg.at || '99:99';\r\n };\r\n\r\n const getDuration = (trip) => {\r\n return Number(trip.deps?.[0]?.td) || Infinity;\r\n };\r\n\r\n // Step 1: Sort trips INSIDE each item first\r\n const itemsWithSortedTrips = payload.map(item => {\r\n const trips = [...(item.trps || [])];\r\n const rtTrips = [...(item.rttrps || [])];\r\n\r\n const sortFn = (a, b) => {\r\n if (sortBy === 'cheapest') return getPrice(a) - getPrice(b);\r\n if (sortBy === 'expensive') return getPrice(b) - getPrice(a);\r\n if (sortBy === 'departure') return getDepTime(a).localeCompare(getDepTime(b));\r\n if (sortBy === 'lateDeparture') return getDepTime(b).localeCompare(getDepTime(a));\r\n if (sortBy === 'arrival') return getArrTime(a).localeCompare(getArrTime(b));\r\n if (sortBy === 'lateArrival') return getArrTime(b).localeCompare(getArrTime(a));\r\n if (sortBy === 'quickest') return getDuration(a) - getDuration(b);\r\n if (sortBy === 'slowest') return getDuration(b) - getDuration(a);\r\n return 0;\r\n };\r\n\r\n trips.sort(sortFn);\r\n rtTrips.sort(sortFn);\r\n\r\n return { ...item, trps: trips, rttrps: rtTrips };\r\n });\r\n\r\n // Step 2: Sort the top-level items globally based on their first (best) trip\r\n itemsWithSortedTrips.sort((a, b) => {\r\n const tripA = a.trps?.[0];\r\n const tripB = b.trps?.[0];\r\n \r\n if (!tripA) return 1;\r\n if (!tripB) return -1;\r\n\r\n if (sortBy === 'cheapest') return getPrice(tripA) - getPrice(tripB);\r\n if (sortBy === 'expensive') return getPrice(tripB) - getPrice(tripA);\r\n if (sortBy === 'departure') return getDepTime(tripA).localeCompare(getDepTime(tripB));\r\n if (sortBy === 'lateDeparture') return getDepTime(tripB).localeCompare(getDepTime(tripA));\r\n if (sortBy === 'arrival') return getArrTime(tripA).localeCompare(getArrTime(tripB));\r\n if (sortBy === 'lateArrival') return getArrTime(tripB).localeCompare(getArrTime(tripA));\r\n if (sortBy === 'quickest') return getDuration(tripA) - getDuration(tripB);\r\n if (sortBy === 'slowest') return getDuration(tripB) - getDuration(tripA);\r\n return 0;\r\n });\r\n\r\n return itemsWithSortedTrips;\r\n};\r\n\r\n","import React, { useMemo, useState, useEffect, useRef } from 'react';\r\nimport FlightResultsOneWay from './flight-results/FlightResultsOneWay';\r\nimport FlightResultsRoundTripSplit from './flight-results/FlightResultsRoundTripSplit';\r\nimport FlightResultsRoundTripCombined from './flight-results/FlightResultsRoundTripCombined';\r\nimport {\r\n filterFlightData,\r\n sortFlightData,\r\n} from './flight-results/SmartFiltersUtils';\r\nimport { getAirlinesMap } from './flight-results/helpers';\r\nimport './flight-results/FlightResults.scss';\r\n\r\nfunction FlightResults({\r\n results = [],\r\n emptyMessage = '',\r\n recommendationCriteria = null,\r\n onAvailabilitySuccess = () => {},\r\n onAvailabilityReset = () => {},\r\n disableBook = false,\r\n extractedFilters = null,\r\n latestUserText = '',\r\n isLatestResultsMessage = false,\r\n onFilterCountChange = () => {},\r\n onRecommendationChange = () => {},\r\n}) {\r\n const payload = useMemo(\r\n () => (Array.isArray(results) ? results : results?.payload || []),\r\n [results],\r\n );\r\n const flightImagesBaseUrl =\r\n process.env.REACT_APP_FLIGHT_IMAGES || process.env.FLIGHT_IMAGES || '';\r\n const airlinesMap = useMemo(() => getAirlinesMap(), []);\r\n\r\n const [activeFilters, setActiveFilters] = useState(extractedFilters);\r\n const [hasAutoSelected, setHasAutoSelected] = useState(false);\r\n const [hasAutoShownAll, setHasAutoShownAll] = useState(false);\r\n const rootRef = useRef(null);\r\n\r\n useEffect(() => {\r\n setActiveFilters(extractedFilters);\r\n }, [extractedFilters]);\r\n\r\n const filteredPayload = useMemo(() => {\r\n let data = filterFlightData(payload, activeFilters);\r\n if (activeFilters?.sortBy) {\r\n data = sortFlightData(data, activeFilters.sortBy);\r\n }\r\n return data;\r\n }, [payload, activeFilters]);\r\n\r\n const resultContextBadges = useMemo(() => {\r\n const source = filteredPayload[0] || payload[0] || {};\r\n if (!source || typeof source !== 'object') return [];\r\n\r\n const badges = [];\r\n const tripType = Number(source?.tt || 1) === 2 ? 'Round Trip' : 'One Way';\r\n badges.push(`Trip: ${tripType}`);\r\n\r\n const cabinRaw = String(source?.cl || '').trim().toLowerCase();\r\n const cabinMap = {\r\n ec: 'Economy',\r\n bc: 'Business',\r\n fc: 'First',\r\n pc: 'Premium Economy',\r\n };\r\n const cabinLabel = cabinMap[cabinRaw] || (cabinRaw ? cabinRaw.toUpperCase() : 'Economy');\r\n badges.push(`Cabin: ${cabinLabel}`);\r\n\r\n const adt = Number(source?.adt || 1);\r\n const chd = Number(source?.chd || 0);\r\n const inf = Number(source?.inf || 0);\r\n badges.push(`Travellers: ${Math.max(adt + chd + inf, 1)}`);\r\n\r\n const agtyp = String(source?.agtyp || '').trim().toLowerCase();\r\n const utyp = String(source?.utyp || '').trim().toLowerCase();\r\n const isCorporateUser = ['employee', 'manager', 'admin'].includes(utyp);\r\n const isCorporateFlow = agtyp.includes('corporate');\r\n if (isCorporateFlow && isCorporateUser) {\r\n badges.push(`Corporate: ${utyp.charAt(0).toUpperCase()}${utyp.slice(1)}`);\r\n }\r\n\r\n return badges;\r\n }, [filteredPayload, payload]);\r\n\r\n useEffect(() => {\r\n onFilterCountChange(filteredPayload.length);\r\n }, [filteredPayload, onFilterCountChange]);\r\n\r\n useEffect(() => {\r\n onRecommendationChange(\r\n buildDynamicRecommendationText(filteredPayload, activeFilters, airlinesMap),\r\n );\r\n }, [filteredPayload, activeFilters, airlinesMap, onRecommendationChange]);\r\n\r\n useEffect(() => {\r\n if (disableBook || hasAutoSelected || filteredPayload.length !== 1) return;\r\n\r\n const items = filteredPayload[0];\r\n const totalFlights = (Array.isArray(items?.trps) ? items.trps.length : 0);\r\n // If it's a one-way flight and there's exactly one trip option\r\n // Or if it's a combined round trip and there's exactly one flight provider\r\n if (totalFlights !== 1) return;\r\n if (!isLatestResultsMessage || hasAutoShownAll || filteredPayload.length <= 3)\r\n return;\r\n\r\n const normalizedText = String(latestUserText || '').toLowerCase();\r\n const wantsViewAll =\r\n /\\b(view all|show all|show more|more options|expand results)\\b/i.test(\r\n normalizedText,\r\n );\r\n if (!wantsViewAll) return;\r\n\r\n const viewAllButton = rootRef.current?.querySelector(\r\n '.flight-results__toggle-btn',\r\n );\r\n if (!viewAllButton) return;\r\n\r\n setHasAutoShownAll(true);\r\n setTimeout(() => {\r\n viewAllButton.click();\r\n }, 200);\r\n const isBookIntent = /\\b(book|reserve|take|select|choose|pick)\\b/i.test(normalizedText);\r\n \r\n if (isBookIntent) {\r\n setHasAutoSelected(true);\r\n // Find the book button in the DOM and click it\r\n setTimeout(() => {\r\n const bookButton = document.querySelector('[data-voice-action=\"book-flight\"]');\r\n if (bookButton) {\r\n bookButton.click();\r\n }\r\n }, 500);\r\n }\r\n\r\n }, [filteredPayload, latestUserText, hasAutoShownAll, isLatestResultsMessage,disableBook, hasAutoSelected]);\r\n\r\n if (!payload.length) {\r\n return emptyMessage ? (\r\n <div className=\"flight-results__empty\">{emptyMessage}</div>\r\n ) : null;\r\n }\r\n\r\n const getStyp = (item = {}) => {\r\n const directStyp = String(item?.styp || '').trim();\r\n if (directStyp) return directStyp;\r\n const trps = Array.isArray(item?.trps)\r\n ? item.trps\r\n : [item?.trps].filter(Boolean);\r\n const firstTrip = trps[0] || {};\r\n const tripFare = firstTrip?.prc?.[0]?.pr || firstTrip?.pr || {};\r\n return String(tripFare?.styp || '').trim();\r\n };\r\n\r\n const roundTripPayload = filteredPayload.filter(\r\n (item) => Number(item?.tt || 1) === 2,\r\n );\r\n const combinedPayload = roundTripPayload.filter(\r\n (item) => String(getStyp(item)).toLowerCase() === 'combined',\r\n );\r\n const splitPayload = roundTripPayload.filter(\r\n (item) => String(getStyp(item)).toLowerCase() !== 'combined',\r\n );\r\n const isRoundTrip =\r\n roundTripPayload.length > 0 ||\r\n (payload.some((item) => Number(item.tt) === 2) &&\r\n filteredPayload.length === 0);\r\n const isCombined =\r\n combinedPayload.length > 0 ||\r\n (payload.some(\r\n (item) => String(getStyp(item)).toLowerCase() === 'combined',\r\n ) &&\r\n filteredPayload.length === 0);\r\n\r\n return (\r\n <div className=\"flight-results-container\" ref={rootRef}>\r\n {resultContextBadges.length ? (\r\n <div className=\"flight-results__context-bar\">\r\n {resultContextBadges.map((badge) => (\r\n <span key={badge} className=\"flight-results__context-chip\">\r\n {badge}\r\n </span>\r\n ))}\r\n </div>\r\n ) : null}\r\n {filteredPayload.length === 0 ? (\r\n <div className=\"flight-results__empty\">\r\n No flights match your filters.\r\n </div>\r\n ) : (\r\n <>\r\n {isRoundTrip ? (\r\n isCombined ? (\r\n <FlightResultsRoundTripCombined\r\n payload={combinedPayload}\r\n airlinesMap={airlinesMap}\r\n flightImagesBaseUrl={flightImagesBaseUrl}\r\n recommendationCriteria={recommendationCriteria}\r\n onAvailabilitySuccess={onAvailabilitySuccess}\r\n onAvailabilityReset={onAvailabilityReset}\r\n disableBook={disableBook}\r\n />\r\n ) : (\r\n <FlightResultsRoundTripSplit\r\n payload={splitPayload}\r\n airlinesMap={airlinesMap}\r\n flightImagesBaseUrl={flightImagesBaseUrl}\r\n recommendationCriteria={recommendationCriteria}\r\n onAvailabilitySuccess={onAvailabilitySuccess}\r\n onAvailabilityReset={onAvailabilityReset}\r\n disableBook={disableBook}\r\n />\r\n )\r\n ) : (\r\n <FlightResultsOneWay\r\n payload={filteredPayload}\r\n airlinesMap={airlinesMap}\r\n flightImagesBaseUrl={flightImagesBaseUrl}\r\n recommendationCriteria={recommendationCriteria}\r\n onAvailabilitySuccess={onAvailabilitySuccess}\r\n onAvailabilityReset={onAvailabilityReset}\r\n disableBook={disableBook}\r\n />\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default FlightResults;\r\n\r\nfunction buildDynamicRecommendationText(\r\n payload = [],\r\n activeFilters = null,\r\n airlinesMap = {},\r\n) {\r\n const flights = extractFlights(payload, airlinesMap);\r\n if (!flights.length) return '';\r\n\r\n const byPrice = flights.filter((item) => Number.isFinite(item.price));\r\n const cheapest = (byPrice.length ? byPrice : flights).reduce((best, current) =>\r\n Number(current.price || Number.MAX_SAFE_INTEGER) <\r\n Number(best.price || Number.MAX_SAFE_INTEGER)\r\n ? current\r\n : best,\r\n );\r\n\r\n const nonStop = flights.filter((item) => item.stops === 0);\r\n const fastestNonStop = nonStop.reduce((best, current) => {\r\n if (!best) return current;\r\n const bestDur = Number(best.durationMins || Number.MAX_SAFE_INTEGER);\r\n const currDur = Number(current.durationMins || Number.MAX_SAFE_INTEGER);\r\n return currDur < bestDur ? current : best;\r\n }, null);\r\n\r\n const suggested = fastestNonStop || cheapest;\r\n const route = `${suggested.origin} to ${suggested.destination}`;\r\n const date = suggested.departureDate || 'selected date';\r\n const displayCurrency =\r\n suggested.currency || cheapest.currency || flights[0]?.currency || 'INR';\r\n const baseText =\r\n suggested === cheapest\r\n ? `${suggested.airline} ${suggested.flightNumber} at ${suggested.departureTime} is currently the best pick for ${route} on ${date} (lowest fare ${formatMoney(suggested.price, displayCurrency)}).`\r\n : `${suggested.airline} ${suggested.flightNumber} at ${suggested.departureTime} is the best convenience option for ${route} on ${date}, while ${cheapest.airline} ${cheapest.flightNumber} is cheapest at ${formatMoney(cheapest.price, displayCurrency)}.`;\r\n\r\n const filterNotes = [];\r\n if (activeFilters?.sortBy) {\r\n filterNotes.push(`sorted by ${String(activeFilters.sortBy)}`);\r\n }\r\n if (Array.isArray(activeFilters?.depTimes) && activeFilters.depTimes.length > 0) {\r\n filterNotes.push(`departure window ${activeFilters.depTimes.join(', ')}`);\r\n }\r\n if (Array.isArray(activeFilters?.stops) && activeFilters.stops.length > 0) {\r\n filterNotes.push(`stops ${activeFilters.stops.join(', ')}`);\r\n }\r\n\r\n return filterNotes.length\r\n ? `${baseText} (Applied filters: ${filterNotes.join(' | ')}.)`\r\n : baseText;\r\n}\r\n\r\nfunction extractFlights(payload = [], airlinesMap = {}) {\r\n const flights = [];\r\n const list = Array.isArray(payload) ? payload : [];\r\n\r\n list.forEach((item) => {\r\n const trips = Array.isArray(item?.trps) ? item.trps : [];\r\n trips.forEach((trip) => {\r\n const dep = trip?.deps?.[0];\r\n const segs = Array.isArray(dep?.seg) ? dep.seg : [];\r\n const first = segs[0];\r\n const last = segs[segs.length - 1] || first;\r\n if (!first || !last) return;\r\n\r\n const fare = trip?.prc?.[0]?.pr || trip?.pr || {};\r\n const airlineCode = String(first?.ma || first?.ac || '').trim().toUpperCase();\r\n const airlineName =\r\n String(first?.an || '').trim() ||\r\n airlinesMap?.[airlineCode] ||\r\n airlineCode ||\r\n 'Airline';\r\n flights.push({\r\n origin: String(first?.da || '').toUpperCase() || 'origin',\r\n destination: String(last?.ar || '').toUpperCase() || 'destination',\r\n departureDate: String(first?.dd || '').trim(),\r\n departureTime: String(first?.dt || '').trim() || '--:--',\r\n airline: airlineName,\r\n flightNumber: String(first?.fn || '').trim(),\r\n stops: Math.max(segs.length - 1, 0),\r\n durationMins: toDurationMins(first?.fdur || dep?.tdur || ''),\r\n price: Number(fare?.tf),\r\n currency:\r\n String(\r\n item?.cur ||\r\n fare?.cur ||\r\n fare?.currency ||\r\n trip?.cur ||\r\n trip?.currency ||\r\n '',\r\n )\r\n .trim()\r\n .toUpperCase() || 'INR',\r\n });\r\n });\r\n });\r\n\r\n return flights;\r\n}\r\n\r\nfunction toDurationMins(value) {\r\n const text = String(value || '').toLowerCase();\r\n if (!text) return null;\r\n if (/^\\d+$/.test(text)) return Number(text);\r\n const h = text.match(/(\\d+)\\s*h/);\r\n const m = text.match(/(\\d+)\\s*m/);\r\n const hours = h ? Number(h[1]) : 0;\r\n const mins = m ? Number(m[1]) : 0;\r\n const total = hours * 60 + mins;\r\n return total > 0 ? total : null;\r\n}\r\n\r\nfunction formatMoney(value, currencyCode = 'INR') {\r\n const amount = Number(value);\r\n const currency = String(currencyCode || 'INR').trim().toUpperCase() || 'INR';\r\n return Number.isFinite(amount) ? `${currency} ${amount.toFixed(2)}` : 'N/A';\r\n}\r\n","import React, {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport DatePicker from 'react-datepicker';\r\nimport ReactSelect from 'react-select';\r\nimport 'react-datepicker/dist/react-datepicker.css';\r\nimport { isValid, parse } from 'date-fns';\r\nimport { useSocket } from '../context/SocketContext';\r\n\r\nconst EMPTY_PAYLOAD = {\r\n passportRequired: false,\r\n trvlrs: [],\r\n};\r\n\r\nfunction TravelerDetailsForm({\r\n prebookPayload,\r\n sessionId,\r\n isReadOnly = false,\r\n onGoBack = () => {},\r\n onVoiceAssistantMessage = () => { },\r\n onPaymentSuccess = () => { },\r\n onViewStateChange = () => {},\r\n}) {\r\n const socket = useSocket();\r\n const [payload, setPayload] = useState(prebookPayload || EMPTY_PAYLOAD);\r\n const [isSaving, setIsSaving] = useState(false);\r\n const [isSubmittingPrebook, setIsSubmittingPrebook] = useState(false);\r\n const [statusText, setStatusText] = useState('');\r\n const [fieldErrors, setFieldErrors] = useState({});\r\n const [bookingId, setBookingId] = useState('');\r\n const [prebookResponse, setPrebookResponse] = useState(null);\r\n const [confirmedPayload, setConfirmedPayload] = useState(null);\r\n const [confirmedRequestPayload, setConfirmedRequestPayload] = useState(null);\r\n const [showProceedToBook, setShowProceedToBook] = useState(false);\r\n const [isDetailsConfirmed, setIsDetailsConfirmed] = useState(false);\r\n const [paymentSummary, setPaymentSummary] = useState({\r\n charges: [],\r\n gateways: [],\r\n customerPg: [],\r\n promoCodes: [],\r\n });\r\n const [appliedPromocode, setAppliedPromocode] = useState(null);\r\n const [promocodeDiscount, setPromocodeDiscount] = useState(null);\r\n const [isApplyingPromo, setIsApplyingPromo] = useState(false);\r\n const [selectedGateway, setSelectedGateway] = useState('');\r\n const [selectedPaymentMode, setSelectedPaymentMode] = useState('');\r\n const [isPaying, setIsPaying] = useState(false);\r\n const [isSubmittingApprovalRequest, setIsSubmittingApprovalRequest] =\r\n useState(false);\r\n const [tripReason, setTripReason] = useState('');\r\n const [showPayNow, setShowPayNow] = useState(true);\r\n const [sdkWarning, setSdkWarning] = useState('');\r\n const [selectedFrequentTravellerByIndex, setSelectedFrequentTravellerByIndex] =\r\n useState({});\r\n const hasAnnouncedPromptRef = useRef(false);\r\n const paymentSectionRef = useRef(null);\r\n const shouldScrollToPaymentRef = useRef(false);\r\n const emitActionLoader = useCallback((status, text = '') => {\r\n window.dispatchEvent(\r\n new CustomEvent('chat:action-loader', {\r\n detail: {\r\n status: Boolean(status),\r\n text: String(text || '').trim(),\r\n },\r\n }),\r\n );\r\n }, []);\r\n const scrollToPaymentSection = useCallback(() => {\r\n let firstFrame = null;\r\n let secondFrame = null;\r\n firstFrame = window.requestAnimationFrame(() => {\r\n secondFrame = window.requestAnimationFrame(() => {\r\n paymentSectionRef.current?.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n });\r\n });\r\n });\r\n return () => {\r\n if (firstFrame) window.cancelAnimationFrame(firstFrame);\r\n if (secondFrame) window.cancelAnimationFrame(secondFrame);\r\n };\r\n }, []);\r\n const setActionLoading = useCallback((isLoading, text = '') => {\r\n window.dispatchEvent(\r\n new CustomEvent('chat:ui-loading', {\r\n detail: {\r\n isLoading,\r\n text: String(text || '').trim(),\r\n },\r\n }),\r\n );\r\n }, []);\r\n const prebookBookingId =\r\n String(bookingId || '').trim() ||\r\n String(\r\n prebookResponse?.bookingId ||\r\n prebookResponse?.bookingid ||\r\n prebookResponse?.bkid ||\r\n prebookResponse?.payload?.bookingId ||\r\n prebookResponse?.payload?.bookingid ||\r\n prebookResponse?.payload?.bkid ||\r\n '',\r\n ).trim();\r\n const isPrebookSuccessStatus =\r\n String(prebookResponse?.status || '').trim().toLowerCase() === 'success';\r\n const isPrebookDone = Boolean(prebookBookingId || isPrebookSuccessStatus);\r\n const canInteractWithBlock = !isReadOnly;\r\n const canEditTraveller = !isPrebookDone && canInteractWithBlock;\r\n\r\n const normalizedUtyp = String(payload?.utyp || '').trim().toLowerCase();\r\n const normalizedAgtyp = String(payload?.agtyp || '').trim().toLowerCase();\r\n const normalizedChannel = String(\r\n payload?.cha ||\r\n payload?.chnl ||\r\n confirmedRequestPayload?.cha ||\r\n confirmedRequestPayload?.chnl ||\r\n confirmedPayload?.cha ||\r\n confirmedPayload?.chnl ||\r\n prebookResponse?.payload?.cha ||\r\n prebookResponse?.payload?.chnl ||\r\n prebookResponse?.cha ||\r\n prebookResponse?.chnl ||\r\n '',\r\n )\r\n .trim()\r\n .toLowerCase();\r\n const isCorporateFlow =\r\n (normalizedAgtyp === 'corporate flow' ||\r\n normalizedAgtyp === 'corporate' ||\r\n normalizedChannel === 'corp') &&\r\n ['employee', 'manager', 'admin'].includes(normalizedUtyp);\r\n const isB2bAgency = normalizedAgtyp === 'b2b';\r\n const isB2bLikeChannel = normalizedChannel === 'b2b';\r\n const allowBalancePaymentOption =\r\n isCorporateFlow || isB2bAgency || isB2bLikeChannel;\r\n const parsePolicyList = (value) => {\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((item) => String(item || '').trim().toLowerCase())\r\n .filter(Boolean);\r\n }\r\n if (typeof value === 'string' && value.trim()) {\r\n return [value.trim().toLowerCase()];\r\n }\r\n return [];\r\n };\r\n const corporatePolicy = paymentSummary?.corporate || null;\r\n const corporateOutboundPolicy = parsePolicyList(\r\n corporatePolicy?.outbound?.ptyp ||\r\n corporatePolicy?.onward?.ptyp ||\r\n corporatePolicy?.ob?.ptyp,\r\n );\r\n const corporateInboundPolicy = parsePolicyList(\r\n corporatePolicy?.inbound?.ptyp ||\r\n corporatePolicy?.return?.ptyp ||\r\n corporatePolicy?.ib?.ptyp,\r\n );\r\n const hasCorporateInboundJourney = Boolean(corporatePolicy?.journey?.hasInbound);\r\n const corporateApprovalRequired = toBooleanFlag(\r\n payload?.isaprv ??\r\n prebookPayload?.isaprv ??\r\n prebookResponse?.payload?.isaprv ??\r\n prebookResponse?.isaprv ??\r\n corporatePolicy?.isaprv,\r\n );\r\n const shouldShowInboundApprovalRequest =\r\n isCorporateFlow &&\r\n normalizedUtyp === 'employee' &&\r\n corporateApprovalRequired &&\r\n (hasCorporateInboundJourney || corporateInboundPolicy.includes('cl') || corporateOutboundPolicy.includes('cl'));\r\n\r\n const selectedChargeForFee = resolveSelectedChargeForFee({\r\n charges: paymentSummary?.charges,\r\n selectedGateway,\r\n selectedPaymentMode,\r\n });\r\n const convenienceFee = getGatewayFeeAmount(selectedChargeForFee);\r\n const fareCurrency =\r\n confirmedPayload?.selectedFlight?.fare?.currency ||\r\n prebookResponse?.payload?.cur ||\r\n prebookResponse?.payload?.currency ||\r\n 'INR';\r\n const onwardFareAmount =\r\n Number(confirmedPayload?.selectedFlight?.fare?.totalFare || 0) || 0;\r\n const returnFareAmount =\r\n Number(confirmedPayload?.selectedReturnFlight?.fare?.totalFare || 0) || 0;\r\n const baseFareAmount = Number(\r\n (onwardFareAmount + returnFareAmount).toFixed(2),\r\n );\r\n const discountAmount = promocodeDiscount\r\n ? (Number(promocodeDiscount.ondis) || 0) +\r\n (Number(promocodeDiscount.rtdis) || 0)\r\n : 0;\r\n const totalPayableAmount = Number(\r\n (baseFareAmount + convenienceFee - discountAmount).toFixed(2),\r\n );\r\n\r\n useEffect(() => {\r\n const restoredState =\r\n prebookPayload?.__formState && typeof prebookPayload.__formState === 'object'\r\n ? prebookPayload.__formState\r\n : null;\r\n setPayload(restoredState?.payload || prebookPayload || EMPTY_PAYLOAD);\r\n setStatusText('');\r\n setFieldErrors({});\r\n setBookingId(String(restoredState?.bookingId || ''));\r\n setPrebookResponse(restoredState?.prebookResponse || null);\r\n setConfirmedPayload(restoredState?.confirmedPayload || null);\r\n setConfirmedRequestPayload(restoredState?.confirmedRequestPayload || null);\r\n setShowProceedToBook(Boolean(restoredState?.showProceedToBook));\r\n setIsDetailsConfirmed(Boolean(restoredState?.isDetailsConfirmed));\r\n const initialPaymentSummary = prebookPayload?.initialPaymentSummary || {};\r\n const restoredPaymentSummary = restoredState?.paymentSummary || null;\r\n setPaymentSummary({\r\n charges: normalizeCollection(\r\n restoredPaymentSummary?.charges ?? initialPaymentSummary?.charges,\r\n ),\r\n gateways: normalizeCollection(\r\n restoredPaymentSummary?.gateways ?? initialPaymentSummary?.gateways,\r\n ),\r\n customerPg: normalizeCollection(\r\n restoredPaymentSummary?.customerPg ?? initialPaymentSummary?.customerPg,\r\n ),\r\n promoCodes: normalizeCollection(\r\n restoredPaymentSummary?.promoCodes ?? initialPaymentSummary?.promoCodes,\r\n ),\r\n corporate:\r\n restoredPaymentSummary?.corporate ?? initialPaymentSummary?.corporate ?? null,\r\n });\r\n const initialGateways = normalizeCollection(\r\n restoredPaymentSummary?.gateways ?? initialPaymentSummary?.gateways,\r\n );\r\n setSelectedGateway(\r\n String(restoredState?.selectedGateway || '').trim() ||\r\n (initialGateways.length > 0 ? String(initialGateways[0] || '').trim() : ''),\r\n );\r\n setSelectedPaymentMode(String(restoredState?.selectedPaymentMode || '').trim());\r\n setAppliedPromocode(restoredState?.appliedPromocode || null);\r\n setPromocodeDiscount(restoredState?.promocodeDiscount || null);\r\n setIsPaying(false);\r\n setShowPayNow(\r\n restoredState?.showPayNow === undefined\r\n ? true\r\n : Boolean(restoredState.showPayNow),\r\n );\r\n setTripReason(String(restoredState?.tripReason || ''));\r\n setSdkWarning('');\r\n setSelectedFrequentTravellerByIndex({});\r\n hasAnnouncedPromptRef.current = false;\r\n }, [prebookPayload]);\r\n\r\n useEffect(() => {\r\n const snapshot = {\r\n ...(payload || {}),\r\n __formState: {\r\n payload,\r\n bookingId,\r\n prebookResponse,\r\n confirmedPayload,\r\n confirmedRequestPayload,\r\n showProceedToBook,\r\n isDetailsConfirmed,\r\n paymentSummary,\r\n appliedPromocode,\r\n promocodeDiscount,\r\n selectedGateway,\r\n selectedPaymentMode,\r\n showPayNow,\r\n tripReason,\r\n },\r\n };\r\n window.dispatchEvent(\r\n new CustomEvent('traveler-form:state-updated', {\r\n detail: {\r\n prebookPayload: snapshot,\r\n },\r\n }),\r\n );\r\n }, [\r\n payload,\r\n bookingId,\r\n prebookResponse,\r\n confirmedPayload,\r\n confirmedRequestPayload,\r\n showProceedToBook,\r\n isDetailsConfirmed,\r\n paymentSummary,\r\n appliedPromocode,\r\n promocodeDiscount,\r\n selectedGateway,\r\n selectedPaymentMode,\r\n showPayNow,\r\n tripReason,\r\n ]);\r\n\r\n useEffect(() => {\r\n const gateways = getGatewayNamesFromSummary(paymentSummary);\r\n if (!gateways.length) return;\r\n\r\n gateways.forEach((gatewayName) => {\r\n const gateway = String(gatewayName || '').toLowerCase();\r\n if (gateway.includes('razor')) {\r\n const razorCheckoutUrl =\r\n process.env.REACT_APP_RAZOR_CHECKOUT ||\r\n 'https://checkout.razorpay.com/v1/checkout.js';\r\n loadExternalScript('razorpay-checkout-sdk', razorCheckoutUrl);\r\n }\r\n if (gateway.includes('atom')) {\r\n const atomSdkUrl =\r\n process.env.REACT_APP_ATOM_SDK_URL || process.env.ATOM_SDK_URL || '';\r\n if (atomSdkUrl) {\r\n loadExternalScript('atom-checkout-sdk', atomSdkUrl);\r\n }\r\n }\r\n if (gateway.includes('ease')) {\r\n const easeSdkUrl =\r\n process.env.REACT_APP_EASE_BUZZ_CHECKOUT ||\r\n process.env.EASE_BUZZ_CHECKOUT ||\r\n '';\r\n if (easeSdkUrl) {\r\n loadExternalScript('easebuzz-checkout-sdk', easeSdkUrl);\r\n }\r\n }\r\n });\r\n }, [paymentSummary]);\r\n\r\n useEffect(() => {\r\n if (!prebookBookingId || !paymentSectionRef.current) return;\r\n if (!shouldScrollToPaymentRef.current) return;\r\n\r\n const cancelScroll = scrollToPaymentSection();\r\n shouldScrollToPaymentRef.current = false;\r\n\r\n return () => {\r\n cancelScroll();\r\n };\r\n }, [prebookBookingId, paymentSummary, scrollToPaymentSection]);\r\n\r\n useEffect(() => {\r\n if (!sessionId || !prebookBookingId || !isCorporateFlow) return;\r\n if (!payload?.agid) return;\r\n\r\n emitActionLoader(true, 'Fetching payment options...');\r\n socket.emit(\r\n 'chat:retrieve-payment-options',\r\n {\r\n sessionId,\r\n agid: payload?.agid,\r\n trmd: payload?.trmd,\r\n utyp: payload?.utyp,\r\n agtyp: payload?.agtyp,\r\n },\r\n (response) => {\r\n emitActionLoader(false);\r\n if (!response?.ok) return;\r\n const corporateFromApi =\r\n response?.data?.payload ||\r\n response?.data ||\r\n null;\r\n if (!corporateFromApi || typeof corporateFromApi !== 'object') return;\r\n setPaymentSummary((prev) => ({\r\n ...prev,\r\n corporate: {\r\n ...(prev?.corporate || {}),\r\n ...corporateFromApi,\r\n },\r\n }));\r\n },\r\n );\r\n }, [\r\n emitActionLoader,\r\n isCorporateFlow,\r\n payload?.agid,\r\n payload?.agtyp,\r\n payload?.trmd,\r\n payload?.utyp,\r\n prebookBookingId,\r\n sessionId,\r\n ]);\r\n\r\n const handleApprovalRequest = useCallback(() => {\r\n if (!sessionId || !prebookBookingId) {\r\n setStatusText('Missing booking reference. Please pre-book again.');\r\n return;\r\n }\r\n if (!tripReason.trim()) {\r\n setStatusText('Please enter trip reason before sending approval request.');\r\n return;\r\n }\r\n\r\n setIsSubmittingApprovalRequest(true);\r\n emitActionLoader(true, 'Sending approval request...');\r\n socket.emit(\r\n 'chat:approval-request',\r\n {\r\n sessionId,\r\n approvalPayload: {\r\n bkid: prebookBookingId,\r\n pnr: '',\r\n fkempid: payload?.empid,\r\n fkuid: payload?.uid,\r\n noofaprl: 1,\r\n sts: 0,\r\n crby: payload?.uid,\r\n ukey: confirmedRequestPayload?.ukey || payload?.ukey,\r\n rukey: confirmedRequestPayload?.rukey || payload?.rukey,\r\n tt: payload?.tt || confirmedRequestPayload?.tt || 1,\r\n typ: 'Book',\r\n prdt: 'F',\r\n fkapdsgid: payload?.fkapdsgid,\r\n fkagid: payload?.agid,\r\n rsn: tripReason.trim(),\r\n },\r\n },\r\n (response) => {\r\n setIsSubmittingApprovalRequest(false);\r\n emitActionLoader(false);\r\n if (!response?.ok) {\r\n setStatusText(\r\n response?.error || 'Unable to create approval request right now.',\r\n );\r\n return;\r\n }\r\n setShowPayNow(false);\r\n setStatusText(\r\n 'Approval request sent to manager successfully. Please wait for approval.',\r\n );\r\n },\r\n );\r\n }, [\r\n emitActionLoader,\r\n confirmedRequestPayload?.rukey,\r\n confirmedRequestPayload?.tt,\r\n confirmedRequestPayload?.ukey,\r\n payload?.agid,\r\n payload?.empid,\r\n payload?.fkapdsgid,\r\n payload?.rukey,\r\n payload?.tt,\r\n payload?.uid,\r\n payload?.ukey,\r\n prebookBookingId,\r\n sessionId,\r\n tripReason,\r\n ]);\r\n\r\n useEffect(() => {\r\n const gateway = String(selectedGateway || '').toLowerCase();\r\n if (!gateway) return;\r\n\r\n if (gateway.includes('razor')) {\r\n const razorCheckoutUrl =\r\n process.env.REACT_APP_RAZOR_CHECKOUT ||\r\n 'https://checkout.razorpay.com/v1/checkout.js';\r\n loadExternalScript('razorpay-checkout-sdk', razorCheckoutUrl).then(\r\n (ok) => {\r\n if (!ok) {\r\n setSdkWarning(\r\n 'Razorpay SDK failed to load. Please refresh and retry.',\r\n );\r\n } else {\r\n setSdkWarning('');\r\n }\r\n },\r\n );\r\n }\r\n\r\n if (gateway.includes('atom')) {\r\n const atomSdkUrl =\r\n process.env.REACT_APP_ATOM_SDK_URL || process.env.ATOM_SDK_URL || '';\r\n if (atomSdkUrl) {\r\n loadExternalScript('atom-checkout-sdk', atomSdkUrl).then((ok) => {\r\n if (!ok) {\r\n setSdkWarning('Atom SDK failed to load. Please refresh and retry.');\r\n } else {\r\n setSdkWarning('');\r\n }\r\n });\r\n } else {\r\n setSdkWarning('Atom SDK URL is missing. Set REACT_APP_ATOM_SDK_URL.');\r\n }\r\n }\r\n\r\n if (gateway.includes('ease')) {\r\n const easeSdkUrl =\r\n process.env.REACT_APP_EASE_BUZZ_CHECKOUT ||\r\n process.env.EASE_BUZZ_CHECKOUT ||\r\n '';\r\n if (easeSdkUrl) {\r\n loadExternalScript('easebuzz-checkout-sdk', easeSdkUrl);\r\n }\r\n }\r\n }, [selectedGateway]);\r\n\r\n const firstTraveller = useMemo(() => {\r\n return payload?.trvlrs?.[0] || null;\r\n }, [payload]);\r\n const travellers = useMemo(\r\n () => (Array.isArray(payload?.trvlrs) ? payload.trvlrs : []),\r\n [payload],\r\n );\r\n const frequentTravellers = useMemo(\r\n () => normalizeFrequentTravellerList(prebookPayload?.frequentTravellers),\r\n [prebookPayload],\r\n );\r\n\r\n const updateTraveller = (travellerIndex, field, value) => {\r\n setPayload((prev) => {\r\n const next = { ...prev, trvlrs: [...(prev.trvlrs || [])] };\r\n if (!next.trvlrs[travellerIndex]) return prev;\r\n next.trvlrs[travellerIndex] = {\r\n ...next.trvlrs[travellerIndex],\r\n [field]: value,\r\n };\r\n return next;\r\n });\r\n setSelectedFrequentTravellerByIndex((prev) => {\r\n if (!Object.prototype.hasOwnProperty.call(prev, travellerIndex)) {\r\n return prev;\r\n }\r\n const next = { ...prev };\r\n delete next[travellerIndex];\r\n return next;\r\n });\r\n setFieldErrors((prev) => {\r\n const errorKey = `${travellerIndex}.${field}`;\r\n if (!prev[errorKey]) return prev;\r\n const next = { ...prev };\r\n delete next[errorKey];\r\n return next;\r\n });\r\n };\r\n\r\n const applyFrequentTravellerToIndex = useCallback(\r\n (travellerIndex, selectedTraveller) => {\r\n if (!canEditTraveller || !selectedTraveller) return;\r\n const selectedKey = getFrequentTravellerKey(selectedTraveller);\r\n const alreadyTaken = Object.entries(selectedFrequentTravellerByIndex).find(\r\n ([idx, key]) =>\r\n Number(idx) !== Number(travellerIndex) && key === selectedKey,\r\n );\r\n if (alreadyTaken) {\r\n setStatusText(\r\n 'This frequent traveller is already selected for another traveler.',\r\n );\r\n return;\r\n }\r\n setPayload((prev) => {\r\n const next = { ...prev, trvlrs: [...(prev?.trvlrs || [])] };\r\n const current = next.trvlrs?.[travellerIndex];\r\n if (!current) return prev;\r\n const merged = {\r\n ...current,\r\n fn: String(selectedTraveller?.fn || '').trim(),\r\n ln: String(selectedTraveller?.ln || '').trim(),\r\n tl: String(selectedTraveller?.tl || '').trim() || current.tl,\r\n dob: selectedTraveller?.dob || null,\r\n };\r\n if (Boolean(next?.passportRequired)) {\r\n merged.nat = String(selectedTraveller?.nat || '').trim();\r\n merged.num = String(selectedTraveller?.num || '').trim();\r\n merged.isc = String(\r\n selectedTraveller?.isc || selectedTraveller?.country || '',\r\n ).trim();\r\n merged.issdt = selectedTraveller?.issdt || null;\r\n merged.expdt = selectedTraveller?.expdt || null;\r\n }\r\n next.trvlrs[travellerIndex] = merged;\r\n return next;\r\n });\r\n setSelectedFrequentTravellerByIndex((prev) => ({\r\n ...prev,\r\n [travellerIndex]: selectedKey,\r\n }));\r\n setFieldErrors((prev) => {\r\n const next = { ...prev };\r\n ['fn', 'ln', 'tl', 'dob', 'nat', 'num', 'isc', 'issdt', 'expdt'].forEach(\r\n (field) => delete next[`${travellerIndex}.${field}`],\r\n );\r\n return next;\r\n });\r\n },\r\n [canEditTraveller, selectedFrequentTravellerByIndex],\r\n );\r\n\r\n const handleCancel = () => {\r\n onGoBack();\r\n };\r\n\r\n const validateTravellers = useCallback(() => {\r\n const errors = {};\r\n const showPassport = Boolean(payload?.passportRequired);\r\n const list = Array.isArray(payload?.trvlrs) ? payload.trvlrs : [];\r\n\r\n list.forEach((traveller, index) => {\r\n if (!String(traveller?.fn || '').trim())\r\n errors[`${index}.fn`] = 'First name is required.';\r\n if (!String(traveller?.ln || '').trim())\r\n errors[`${index}.ln`] = 'Last name is required.';\r\n if (!['M', 'F'].includes(String(traveller?.tl || '').trim())) {\r\n errors[`${index}.tl`] = 'Please select gender.';\r\n }\r\n\r\n const dob = toDateInput(traveller?.dob);\r\n if (!dob) {\r\n errors[`${index}.dob`] = 'Date of birth is required.';\r\n } else {\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n const dobDate = new Date(dob);\r\n if (dobDate > today) {\r\n errors[`${index}.dob`] = 'Date of birth cannot be in the future.';\r\n } else {\r\n const ageError = validateAgeByTravellerType(traveller?.typ, dob);\r\n if (ageError) errors[`${index}.dob`] = ageError;\r\n }\r\n }\r\n\r\n if (showPassport) {\r\n if (!String(traveller?.nat || '').trim()) {\r\n errors[`${index}.nat`] = 'Nationality is required.';\r\n }\r\n if (!String(traveller?.num || '').trim()) {\r\n errors[`${index}.num`] = 'Passport number is required.';\r\n }\r\n\r\n const issue = toDateInput(traveller?.issdt);\r\n const expiry = toDateInput(traveller?.expdt);\r\n if (!issue) errors[`${index}.issdt`] = 'Issue date is required.';\r\n if (!expiry) errors[`${index}.expdt`] = 'Expiry date is required.';\r\n if (issue && expiry && new Date(expiry) <= new Date(issue)) {\r\n errors[`${index}.expdt`] = 'Expiry date must be after issue date.';\r\n }\r\n }\r\n });\r\n\r\n return errors;\r\n }, [payload]);\r\n\r\n const handleApplyPromocode = useCallback(\r\n (code) => {\r\n if (!canInteractWithBlock) return;\r\n if (!sessionId || !prebookResponse || !code) return;\r\n\r\n const dataPayload = prebookResponse?.payload || prebookResponse || {};\r\n const trips = dataPayload?.trps;\r\n const onwardTrip = Array.isArray(trips) ? trips[0] : trips;\r\n const returnTrip = dataPayload?.rttrps;\r\n\r\n // styp: preserve original case from confirmedPayload (API needs e.g. \"Combined\", not \"combined\")\r\n const styp =\r\n confirmedPayload?.styp ||\r\n prebookResponse?.payload?.styp ||\r\n confirmedRequestPayload?.styp ||\r\n '';\r\n\r\n // uid from confirmedPayload (set during fare availability)\r\n const uid =\r\n confirmedPayload?.uid || prebookResponse?.payload?.uid || null;\r\n\r\n // rmkey: prebook response trps.pr → confirmedPayload original rmkey\r\n const rmkeyFromResponse =\r\n styp === 'combined'\r\n ? [onwardTrip?.pr?.rmkey, onwardTrip?.pr?.rtrmkey].filter(Boolean)\r\n : [onwardTrip?.pr?.rmkey, returnTrip?.pr?.rmkey].filter(Boolean);\r\n\r\n const confirmedRmkey = confirmedPayload?.rmkey\r\n ? [confirmedPayload.rmkey].flat().filter(Boolean)\r\n : [];\r\n\r\n const rmkey =\r\n rmkeyFromResponse.length > 0 ? rmkeyFromResponse : confirmedRmkey;\r\n\r\n setIsApplyingPromo(true);\r\n emitActionLoader(true, 'Applying promo code...');\r\n setActionLoading(true, 'Loading promo code details...');\r\n socket.emit(\r\n 'chat:apply-promocode',\r\n {\r\n sessionId,\r\n code,\r\n ukey:\r\n dataPayload?.ukey ||\r\n confirmedPayload?.ukey ||\r\n confirmedRequestPayload?.ukey,\r\n rukey:\r\n dataPayload?.rukey ||\r\n confirmedPayload?.rukey ||\r\n confirmedRequestPayload?.rukey ||\r\n '',\r\n rmkey,\r\n em: confirmedPayload?.em || confirmedRequestPayload?.em,\r\n ph: confirmedPayload?.ph || confirmedRequestPayload?.ph,\r\n uid,\r\n styp,\r\n },\r\n (response) => {\r\n setActionLoading(false);\r\n setIsApplyingPromo(false);\r\n emitActionLoader(false);\r\n if (response?.ok) {\r\n setAppliedPromocode(code);\r\n setPromocodeDiscount(response.data);\r\n const msg = `Promo code ${code} applied successfully!`;\r\n setStatusText(msg);\r\n onVoiceAssistantMessage(msg);\r\n } else {\r\n const error = response?.error || 'Failed to apply promo code.';\r\n setStatusText(error);\r\n onVoiceAssistantMessage(error);\r\n }\r\n },\r\n );\r\n },\r\n [\r\n emitActionLoader,\r\n canInteractWithBlock,\r\n sessionId,\r\n prebookResponse,\r\n confirmedPayload,\r\n confirmedRequestPayload,\r\n onVoiceAssistantMessage,\r\n ],\r\n );\r\n\r\n const handleRemovePromocode = useCallback(\r\n (requestedCode = '') => {\r\n if (!canInteractWithBlock) return;\r\n const targetCode = String(requestedCode || appliedPromocode || '')\r\n .trim()\r\n .toUpperCase();\r\n if (!sessionId || !prebookResponse || !targetCode) {\r\n const reply = 'No promo code is currently applied.';\r\n setStatusText(reply);\r\n onVoiceAssistantMessage(reply);\r\n return;\r\n }\r\n\r\n const dataPayload = prebookResponse?.payload || prebookResponse || {};\r\n const trips = dataPayload?.trps;\r\n const onwardTrip = Array.isArray(trips) ? trips[0] : trips;\r\n const returnTrip = dataPayload?.rttrps;\r\n\r\n // styp: preserve original case (API needs e.g. \"Combined\" not \"combined\")\r\n const styp =\r\n confirmedPayload?.styp ||\r\n prebookResponse?.payload?.styp ||\r\n confirmedRequestPayload?.styp ||\r\n '';\r\n\r\n const uid = confirmedPayload?.uid || prebookResponse?.payload?.uid || null;\r\n\r\n const rmkeyFromResponse =\r\n styp === 'combined'\r\n ? [onwardTrip?.pr?.rmkey, onwardTrip?.pr?.rtrmkey].filter(Boolean)\r\n : [onwardTrip?.pr?.rmkey, returnTrip?.pr?.rmkey].filter(Boolean);\r\n\r\n const confirmedRmkey = confirmedPayload?.rmkey\r\n ? [confirmedPayload.rmkey].flat().filter(Boolean)\r\n : [];\r\n\r\n const rmkey =\r\n rmkeyFromResponse.length > 0 ? rmkeyFromResponse : confirmedRmkey;\r\n\r\n setIsApplyingPromo(true);\r\n emitActionLoader(true, 'Removing promo code...');\r\n setActionLoading(true, 'Loading promo code details...');\r\n socket.emit(\r\n 'chat:remove-promocode',\r\n {\r\n sessionId,\r\n code: targetCode,\r\n ukey:\r\n dataPayload?.ukey ||\r\n confirmedPayload?.ukey ||\r\n confirmedRequestPayload?.ukey,\r\n rukey:\r\n dataPayload?.rukey ||\r\n confirmedPayload?.rukey ||\r\n confirmedRequestPayload?.rukey ||\r\n '',\r\n rmkey,\r\n uid,\r\n styp,\r\n },\r\n (response) => {\r\n setActionLoading(false);\r\n setIsApplyingPromo(false);\r\n emitActionLoader(false);\r\n const isSuccess =\r\n response?.ok === true ||\r\n String(response?.status || '').toLowerCase() === 'success';\r\n if (isSuccess) {\r\n setAppliedPromocode(null);\r\n setPromocodeDiscount(null);\r\n const msg = `Promo code ${targetCode} removed.`;\r\n setStatusText(msg);\r\n onVoiceAssistantMessage(msg);\r\n } else {\r\n const error = String(\r\n response?.error || 'Failed to remove promo code.',\r\n ).trim();\r\n const normalizedAppliedCode = String(appliedPromocode || '')\r\n .trim()\r\n .toUpperCase();\r\n const shouldClearLocalState =\r\n normalizedAppliedCode &&\r\n normalizedAppliedCode === targetCode &&\r\n /(not applied|already removed|not found|invalid promo|promo.*does not exist)/i.test(\r\n error,\r\n );\r\n\r\n if (shouldClearLocalState) {\r\n setAppliedPromocode(null);\r\n setPromocodeDiscount(null);\r\n const msg = `Promo code ${targetCode} removed.`;\r\n setStatusText(msg);\r\n onVoiceAssistantMessage(msg);\r\n return;\r\n }\r\n\r\n setStatusText(error);\r\n onVoiceAssistantMessage(error);\r\n }\r\n },\r\n );\r\n },\r\n [\r\n emitActionLoader,\r\n canInteractWithBlock,\r\n sessionId,\r\n prebookResponse,\r\n appliedPromocode,\r\n confirmedPayload,\r\n confirmedRequestPayload,\r\n onVoiceAssistantMessage,\r\n ],\r\n );\r\n\r\n const handleProceedToBook = useCallback(\r\n (requestPayloadOverride = null) => {\r\n if (!canEditTraveller) {\r\n setStatusText('Already pre-booked. Payment options are now available.');\r\n scrollToPaymentSection();\r\n return false;\r\n }\r\n const isLikelyDomEvent =\r\n requestPayloadOverride &&\r\n typeof requestPayloadOverride === 'object' &&\r\n (typeof requestPayloadOverride.preventDefault === 'function' ||\r\n typeof requestPayloadOverride.stopPropagation === 'function' ||\r\n requestPayloadOverride.nativeEvent);\r\n const requestPayload = isLikelyDomEvent\r\n ? confirmedRequestPayload\r\n : requestPayloadOverride || confirmedRequestPayload;\r\n if (!sessionId || !requestPayload) {\r\n setStatusText('Unable to continue. Please save details again.');\r\n return false;\r\n }\r\n\r\n shouldScrollToPaymentRef.current = true;\r\n setIsSubmittingPrebook(true);\r\n setStatusText('Continuing to the next step...');\r\n emitActionLoader(true, 'Pre-booking traveler details...');\r\n setActionLoading(true, 'Loading pre-book details...');\r\n\r\n socket.emit(\r\n 'chat:prebook',\r\n {\r\n sessionId,\r\n prebookPayload: requestPayload,\r\n },\r\n (response) => {\r\n setActionLoading(false);\r\n setIsSubmittingPrebook(false);\r\n emitActionLoader(false);\r\n if (!response?.ok) {\r\n const errorMessage =\r\n response?.error || 'Failed to pre-book traveler details.';\r\n setStatusText(errorMessage);\r\n onVoiceAssistantMessage(errorMessage);\r\n return;\r\n }\r\n\r\n const apiData = response?.data || null;\r\n const responsePayload =\r\n response?.payload && typeof response.payload === 'object'\r\n ? response.payload\r\n : {};\r\n const bkid =\r\n response?.bookingId ||\r\n apiData?.payload?.bookingid ||\r\n apiData?.payload?.bkid ||\r\n apiData?.payload?.bookingId ||\r\n '';\r\n\r\n setBookingId(String(bkid || ''));\r\n setPrebookResponse(apiData);\r\n setPayload((prev) => ({\r\n ...(prev || {}),\r\n cha:\r\n responsePayload?.cha !== undefined\r\n ? responsePayload.cha\r\n : prev?.cha,\r\n chnl:\r\n responsePayload?.chnl !== undefined\r\n ? responsePayload.chnl\r\n : prev?.chnl,\r\n agid:\r\n responsePayload?.agid !== undefined\r\n ? responsePayload.agid\r\n : prev?.agid,\r\n utyp:\r\n responsePayload?.utyp !== undefined\r\n ? responsePayload.utyp\r\n : prev?.utyp,\r\n agtyp:\r\n responsePayload?.agtyp !== undefined\r\n ? responsePayload.agtyp\r\n : prev?.agtyp,\r\n trmd:\r\n responsePayload?.trmd !== undefined\r\n ? responsePayload.trmd\r\n : prev?.trmd,\r\n }));\r\n setConfirmedRequestPayload((prev) => ({\r\n ...(prev || {}),\r\n cha:\r\n responsePayload?.cha !== undefined\r\n ? responsePayload.cha\r\n : prev?.cha,\r\n chnl:\r\n responsePayload?.chnl !== undefined\r\n ? responsePayload.chnl\r\n : prev?.chnl,\r\n agid:\r\n responsePayload?.agid !== undefined\r\n ? responsePayload.agid\r\n : prev?.agid,\r\n utyp:\r\n responsePayload?.utyp !== undefined\r\n ? responsePayload.utyp\r\n : prev?.utyp,\r\n agtyp:\r\n responsePayload?.agtyp !== undefined\r\n ? responsePayload.agtyp\r\n : prev?.agtyp,\r\n trmd:\r\n responsePayload?.trmd !== undefined\r\n ? responsePayload.trmd\r\n : prev?.trmd,\r\n }));\r\n setPaymentSummary({\r\n charges: normalizeCollection(response?.payment?.charges),\r\n gateways: normalizeCollection(response?.payment?.gateways),\r\n customerPg: normalizeCollection(response?.payment?.customerPg),\r\n promoCodes: normalizeCollection(response?.payment?.promoCodes),\r\n corporate: response?.payment?.corporate || null,\r\n });\r\n const normalizedCharges = normalizeCollection(\r\n response?.payment?.charges,\r\n );\r\n if (normalizedCharges.length > 0) {\r\n const first = normalizedCharges[0];\r\n setSelectedGateway(String(first?.gatetyp || '').trim());\r\n setSelectedPaymentMode(String(first?.pm || '').trim());\r\n } else {\r\n setSelectedGateway('');\r\n setSelectedPaymentMode('');\r\n }\r\n setShowProceedToBook(false);\r\n const successMessage =\r\n 'Pre-book successful. Payment options are now available.';\r\n setStatusText(successMessage);\r\n onVoiceAssistantMessage(successMessage);\r\n // Ensure payment section is visible immediately after successful pre-book.\r\n scrollToPaymentSection();\r\n },\r\n );\r\n\r\n return true;\r\n },\r\n [\r\n canEditTraveller,\r\n confirmedRequestPayload,\r\n emitActionLoader,\r\n onVoiceAssistantMessage,\r\n scrollToPaymentSection,\r\n sessionId,\r\n ],\r\n );\r\n\r\n const handleSave = useCallback(\r\n ({ continueAfterSave = false } = {}) => {\r\n if (!canEditTraveller) {\r\n setStatusText(\r\n 'Traveler details are locked after pre-booking. Click Cancel to edit again.',\r\n );\r\n return;\r\n }\r\n if (!sessionId) {\r\n setStatusText('Session missing. Please refresh and try again.');\r\n return;\r\n }\r\n\r\n const errors = validateTravellers();\r\n if (Object.keys(errors).length > 0) {\r\n setFieldErrors(errors);\r\n setStatusText('Please fix validation errors before saving.');\r\n return;\r\n }\r\n\r\n setIsSaving(true);\r\n setStatusText('');\r\n\r\n const normalizedPrebookPayload = buildPrebookRequest(payload, {\r\n fallbackPayload: prebookPayload,\r\n confirmedRequestPayload,\r\n });\r\n setIsSaving(false);\r\n setConfirmedPayload(payload);\r\n setConfirmedRequestPayload(normalizedPrebookPayload);\r\n setShowProceedToBook(true);\r\n setIsDetailsConfirmed(true);\r\n setPrebookResponse({\r\n status: 'pending',\r\n message:\r\n 'Traveler details confirmed. Click Proceed to Book to continue.',\r\n });\r\n const confirmationMessage = continueAfterSave\r\n ? 'Traveler details confirmed. Continuing to the next step.'\r\n : 'Traveler details confirmed.';\r\n setStatusText(confirmationMessage);\r\n\r\n if (continueAfterSave) {\r\n handleProceedToBook(normalizedPrebookPayload);\r\n }\r\n setStatusText('Traveler details confirmed.');\r\n },\r\n [\r\n canEditTraveller,\r\n confirmedRequestPayload,\r\n handleProceedToBook,\r\n payload,\r\n prebookPayload,\r\n sessionId,\r\n validateTravellers,\r\n ],\r\n );\r\n\r\n const showPassport = Boolean(payload?.passportRequired);\r\n // const handleSave = ({ continueAfterSave = false } = {}) => {\r\n // if (!canEditTraveller) {\r\n // setStatusText(\r\n // 'Traveler details are locked after pre-booking. Click Cancel to edit again.',\r\n // );\r\n // return false;\r\n // }\r\n // if (!sessionId) {\r\n // setStatusText('Session missing. Please refresh and try again.');\r\n // return false;\r\n // }\r\n\r\n // const errors = validateTraveller();\r\n // if (Object.keys(errors).length > 0) {\r\n // setFieldErrors(errors);\r\n // setStatusText('Please fix validation errors before saving.');\r\n // return false;\r\n // }\r\n\r\n // setIsSaving(true);\r\n // setStatusText('');\r\n\r\n // const normalizedPrebookPayload = buildPrebookRequest(payload);\r\n // setIsSaving(false);\r\n // setConfirmedPayload(payload);\r\n // setConfirmedRequestPayload(normalizedPrebookPayload);\r\n // setShowProceedToBook(true);\r\n // setIsDetailsConfirmed(true);\r\n // setPrebookResponse({\r\n // status: 'pending',\r\n // message: 'Traveler details confirmed. Click Proceed to Book to continue.',\r\n // });\r\n // const confirmationMessage = continueAfterSave\r\n // ? 'Traveler details confirmed. Continuing to the next step.'\r\n // : 'Traveler details confirmed.';\r\n // setStatusText(confirmationMessage);\r\n\r\n // if (continueAfterSave) {\r\n // handleProceedToBook(normalizedPrebookPayload);\r\n // }\r\n\r\n // return true;\r\n // };\r\n\r\n // const showPassport = Boolean(payload?.passportRequired);\r\n\r\n useEffect(() => {\r\n if (!canEditTraveller || !firstTraveller || hasAnnouncedPromptRef.current) {\r\n return;\r\n }\r\n\r\n const initialPrompt = `Please fill traveler details. ${buildNextTravelerPrompt(firstTraveller, showPassport)} You can also paste fixed format: TRAVELLER 1; FN:John; LN:Doe; TL:M; DOB:1992-08-14; TYP:ADT; NAT:IN; NUM:K1234567; ISSDT:2018-01-01; EXPDT:2028-01-01`;\r\n setStatusText(initialPrompt);\r\n onVoiceAssistantMessage(initialPrompt);\r\n hasAnnouncedPromptRef.current = true;\r\n }, [canEditTraveller, firstTraveller, onVoiceAssistantMessage, showPassport]);\r\n\r\n const handlePayNow = useCallback(() => {\r\n if (!canInteractWithBlock) return;\r\n if (!sessionId || !prebookBookingId) {\r\n setStatusText('Missing booking reference. Please pre-book again.');\r\n return;\r\n }\r\n if (!selectedGateway || !selectedPaymentMode) {\r\n setStatusText('Please select payment gateway and mode.');\r\n return;\r\n }\r\n\r\n const onwardAmount =\r\n Number(confirmedPayload?.selectedFlight?.fare?.totalFare || 0) || 0;\r\n const returnAmount =\r\n Number(confirmedPayload?.selectedReturnFlight?.fare?.totalFare || 0) || 0;\r\n const baseAmount = Number((onwardAmount + returnAmount).toFixed(2));\r\n // Try to find matching charge for fee — optional since all gateways are always shown\r\n const selectedCharge = resolveSelectedChargeForFee({\r\n charges: paymentSummary?.charges,\r\n selectedGateway,\r\n selectedPaymentMode,\r\n });\r\n const gatewayFee = getGatewayFeeAmount(selectedCharge);\r\n const discountAmount = promocodeDiscount\r\n ? (Number(promocodeDiscount.ondis) || 0) +\r\n (Number(promocodeDiscount.rtdis) || 0)\r\n : 0;\r\n const amount = Number(\r\n (baseAmount + gatewayFee - discountAmount).toFixed(2),\r\n );\r\n const normalizedGateway = String(selectedGateway || '').toLowerCase();\r\n const normalizedMode = String(selectedPaymentMode || '')\r\n .toUpperCase()\r\n .trim();\r\n const isRazorPay =\r\n normalizedGateway.includes('razor') || normalizedMode === 'RP';\r\n const isEaseBuzz = normalizedGateway.includes('ease');\r\n const isAtom = normalizedGateway.includes('atom');\r\n const isPhonePe = normalizedGateway.includes('phone');\r\n const isCCAvenue =\r\n normalizedMode === 'CA' ||\r\n normalizedGateway.includes('ccavenue') ||\r\n normalizedGateway.includes('ccav');\r\n const isBalancePayment =\r\n normalizedMode === 'BL' || normalizedGateway.includes('balance');\r\n const isCrypto =\r\n normalizedMode === 'CR' ||\r\n normalizedGateway.includes('crypto') ||\r\n normalizedGateway.includes('blockchain');\r\n const leadTraveller = travellers[0] || {};\r\n const travelerName =\r\n `${leadTraveller?.fn || ''} ${leadTraveller?.ln || ''}`.trim() ||\r\n 'Traveler';\r\n\r\n let bookingPayload = {\r\n ukey: confirmedRequestPayload?.ukey,\r\n amt: amount,\r\n chnl: confirmedRequestPayload?.chnl || 'B2C',\r\n tt: confirmedRequestPayload?.tt,\r\n typ: 'book',\r\n em: confirmedRequestPayload?.em,\r\n bkid: prebookBookingId,\r\n styp: confirmedPayload?.styp || '',\r\n agid: confirmedPayload?.agid ?? null,\r\n uid: confirmedPayload?.uid ?? null,\r\n };\r\n\r\n if (isBalancePayment) {\r\n bookingPayload = {\r\n ...bookingPayload,\r\n paytyp: 'CL',\r\n paymd: 'BL',\r\n pm: 'BL',\r\n gatetyp: 'Balance',\r\n };\r\n } else if (isRazorPay) {\r\n bookingPayload = {\r\n ...bookingPayload,\r\n phno: confirmedRequestPayload?.ph,\r\n paymd: String(selectedPaymentMode || '').trim(),\r\n };\r\n } else if (isAtom) {\r\n bookingPayload = {\r\n ...bookingPayload,\r\n phno: confirmedRequestPayload?.ph,\r\n pc: String(selectedPaymentMode || '').trim(),\r\n };\r\n } else if (isEaseBuzz) {\r\n bookingPayload = {\r\n ...bookingPayload,\r\n ph: confirmedRequestPayload?.ph,\r\n nm: travelerName,\r\n prdinf: 'MagicFares',\r\n rmks: '',\r\n trnskey: new Date().toISOString(),\r\n show_payment_mode: String(selectedPaymentMode || '').trim(),\r\n skey: String(\r\n selectedCharge?.skey || confirmedPayload?.skey || '',\r\n ).trim(),\r\n uid:\r\n confirmedPayload?.uid === undefined || confirmedPayload?.uid === null\r\n ? ''\r\n : String(confirmedPayload?.uid),\r\n };\r\n } else if (isPhonePe) {\r\n bookingPayload = {\r\n ...bookingPayload,\r\n amt: String(amount.toFixed(2)),\r\n ph: confirmedRequestPayload?.ph,\r\n nm: travelerName,\r\n prdinf: 'Book N Travel',\r\n rmks: '',\r\n trnskey: new Date().toISOString(),\r\n uid:\r\n confirmedPayload?.uid === undefined || confirmedPayload?.uid === null\r\n ? 'null'\r\n : String(confirmedPayload?.uid),\r\n };\r\n } else if (isCCAvenue) {\r\n const ccMode = String(selectedPaymentMode || '')\r\n .trim()\r\n .toUpperCase();\r\n const ccAvenuePtyp =\r\n ccMode === 'CC'\r\n ? 'OPTCRDC'\r\n : ccMode === 'DC'\r\n ? 'OPTDBCRD'\r\n : ccMode === 'NB'\r\n ? 'OPTNBK'\r\n : ccMode === 'UP' || ccMode === 'UPI'\r\n ? 'OPTMOBP'\r\n : '';\r\n bookingPayload = {\r\n ...bookingPayload,\r\n ph: confirmedRequestPayload?.ph,\r\n nm: travelerName,\r\n paymd: 'CA',\r\n pm: String(selectedPaymentMode || '').trim(),\r\n ptyp: ccAvenuePtyp,\r\n gatetyp: selectedGateway,\r\n prdinf: 'MagicFares',\r\n rmks: '',\r\n trnskey: new Date().toISOString(),\r\n };\r\n } else if (isCrypto) {\r\n bookingPayload = {\r\n ...bookingPayload,\r\n ph: confirmedRequestPayload?.ph,\r\n nm: travelerName,\r\n pm: 'CR',\r\n gatetyp: 'Crypto',\r\n prdinf: 'MagicFares',\r\n rmks: '',\r\n trnskey: new Date().toISOString(),\r\n };\r\n } else {\r\n bookingPayload = {\r\n ...bookingPayload,\r\n ph: confirmedRequestPayload?.ph,\r\n nm: travelerName,\r\n prdinf: 'Book N Travel',\r\n rmks: '',\r\n trnskey: new Date().toISOString(),\r\n gatetyp: selectedGateway,\r\n pm: String(selectedPaymentMode || '').trim(),\r\n };\r\n }\r\n\r\n setIsPaying(true);\r\n setStatusText('');\r\n emitActionLoader(true, 'Processing payment...');\r\n setActionLoading(true, 'Loading payment gateway...');\r\n socket.emit(\r\n 'chat:pay',\r\n {\r\n sessionId,\r\n bookingId: prebookBookingId,\r\n paymentGateway: selectedGateway,\r\n paymentMode: selectedPaymentMode,\r\n bookingPayload,\r\n },\r\n async (response) => {\r\n setActionLoading(false);\r\n setIsPaying(false);\r\n emitActionLoader(false);\r\n if (!response?.ok) {\r\n setStatusText(\r\n response?.error || 'Unable to start payment right now.',\r\n );\r\n return;\r\n }\r\n if (isBalancePayment) {\r\n const confirmationMessage =\r\n response?.data?.message ||\r\n 'Booking confirmed successfully. Please check the confirmation details.';\r\n setShowPayNow(false);\r\n setStatusText(confirmationMessage);\r\n onVoiceAssistantMessage(confirmationMessage);\r\n onPaymentSuccess({\r\n ukey:\r\n confirmedRequestPayload?.ukey ||\r\n bookingPayload?.ukey ||\r\n payload?.ukey ||\r\n '',\r\n bookingId: prebookBookingId,\r\n confirmation:\r\n response?.data?.payload ||\r\n response?.data ||\r\n null,\r\n });\r\n return;\r\n }\r\n const launchResult = await launchGatewayFlow({\r\n gateway: selectedGateway,\r\n paymentMode: selectedPaymentMode,\r\n apiData: response?.data,\r\n bookingPayload,\r\n onGatewayCallback: () => {\r\n // Hide Pay Now after we notify backend (callback) for success.\r\n setShowPayNow(false);\r\n const paymentCompletedMessage = 'Payment got Completed.';\r\n setStatusText(paymentCompletedMessage);\r\n onVoiceAssistantMessage(paymentCompletedMessage);\r\n },\r\n onGatewayDismiss: () => {\r\n // If user closes checkout without completing, allow retry.\r\n setShowPayNow(true);\r\n },\r\n });\r\n if (launchResult?.launched) {\r\n const paymentCompletedMessage =\r\n 'Payment got Completed. Please check the confirmation page details.';\r\n setStatusText(paymentCompletedMessage);\r\n onVoiceAssistantMessage(paymentCompletedMessage);\r\n onPaymentSuccess({\r\n ukey:\r\n confirmedRequestPayload?.ukey ||\r\n bookingPayload?.ukey ||\r\n payload?.ukey ||\r\n '',\r\n bookingId: prebookBookingId,\r\n });\r\n return;\r\n }\r\n if (launchResult?.reason) {\r\n setStatusText(\r\n `Payment initiated but checkout did not open: ${launchResult.reason}`,\r\n );\r\n return;\r\n }\r\n setStatusText('Payment booking initiated successfully.');\r\n },\r\n );\r\n }, [\r\n canInteractWithBlock,\r\n confirmedPayload,\r\n confirmedRequestPayload,\r\n emitActionLoader,\r\n onPaymentSuccess,\r\n onVoiceAssistantMessage,\r\n paymentSummary,\r\n payload?.ukey,\r\n prebookBookingId,\r\n promocodeDiscount,\r\n selectedGateway,\r\n selectedPaymentMode,\r\n sessionId,\r\n travellers,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (isReadOnly) {\r\n return undefined;\r\n }\r\n\r\n const handleVoiceInput = (event) => {\r\n const spokenText = String(event?.detail?.text || '').trim();\r\n if (!spokenText) return;\r\n\r\n const travellerNumMatch = String(spokenText || '')\r\n .trim()\r\n .match(/\\b(?:traveller|traveler)\\s*(\\d+)\\b/i);\r\n const defaultTypIndex = Math.min(\r\n travellerNumMatch ? Math.max(Number(travellerNumMatch[1]) - 1, 0) : 0,\r\n Math.max(travellers.length - 1, 0),\r\n );\r\n const fixedFormatCommand = parseFixedTravelerInput(spokenText, {\r\n passportRequired: showPassport,\r\n defaultTyp: travellers[defaultTypIndex]?.typ,\r\n });\r\n if (fixedFormatCommand?.isFixedFormat && !fixedFormatCommand?.isValid) {\r\n event.detail?.appendUserMessage?.(spokenText);\r\n event.detail?.markHandled?.();\r\n const reply = `Invalid traveller format: ${fixedFormatCommand.error}. Use: ${buildFixedTravellerFormatTemplate(showPassport)}`;\r\n setStatusText(reply);\r\n onVoiceAssistantMessage(reply);\r\n return;\r\n }\r\n if (fixedFormatCommand?.isFixedFormat && fixedFormatCommand?.isValid) {\r\n event.detail?.appendUserMessage?.(spokenText);\r\n event.detail?.markHandled?.();\r\n\r\n const targetIndex = Math.max(\r\n 0,\r\n Math.min(\r\n Number(fixedFormatCommand?.travellerIndex || 0),\r\n Math.max(travellers.length - 1, 0),\r\n ),\r\n );\r\n if (!canEditTraveller || !travellers[targetIndex]) return;\r\n\r\n const safeFixedUpdates = removeImmutableTravelerFields(\r\n fixedFormatCommand?.updates,\r\n );\r\n\r\n setPayload((prev) => {\r\n const next = { ...prev, trvlrs: [...(prev?.trvlrs || [])] };\r\n if (!next.trvlrs[targetIndex]) return prev;\r\n next.trvlrs[targetIndex] = {\r\n ...next.trvlrs[targetIndex],\r\n ...safeFixedUpdates,\r\n };\r\n return next;\r\n });\r\n\r\n setFieldErrors((prev) => {\r\n const next = { ...prev };\r\n Object.keys(safeFixedUpdates || {}).forEach((field) => {\r\n delete next[`${targetIndex}.${field}`];\r\n });\r\n return next;\r\n });\r\n\r\n const reply = `Updated Traveler ${targetIndex + 1} from chat format.`;\r\n setStatusText(reply);\r\n onVoiceAssistantMessage(reply);\r\n return;\r\n }\r\n\r\n const voiceCommand = parseTravelerVoiceCommand(spokenText, {\r\n passportRequired: showPassport,\r\n traveller: firstTraveller,\r\n });\r\n if (!voiceCommand) return;\r\n\r\n event.detail?.appendUserMessage?.(spokenText);\r\n event.detail?.markHandled?.();\r\n\r\n if (voiceCommand?.blockedReason) {\r\n setStatusText(voiceCommand.blockedReason);\r\n onVoiceAssistantMessage(voiceCommand.blockedReason);\r\n return;\r\n }\r\n\r\n if (voiceCommand.intent === 'confirm_payment') {\r\n if (!prebookBookingId) {\r\n const reply =\r\n 'Please complete traveller details and pre-book before paying.';\r\n setStatusText(reply);\r\n onVoiceAssistantMessage(reply);\r\n return;\r\n }\r\n window.dispatchEvent(\r\n new CustomEvent('traveler-form:confirm-payment-request'),\r\n );\r\n return;\r\n }\r\n\r\n if (voiceCommand.intent === 'select_payment_mode') {\r\n const mode = String(voiceCommand?.updates?.paymentMode || '')\r\n .trim()\r\n .toUpperCase();\r\n const gateway = getGatewayForPaymentMode(mode);\r\n if (mode && gateway) {\r\n setSelectedGateway(gateway);\r\n setSelectedPaymentMode(mode);\r\n const reply = `Selected payment mode as ${getPaymentModeLabel(mode)}.`;\r\n setStatusText(reply);\r\n onVoiceAssistantMessage(reply);\r\n }\r\n return;\r\n }\r\n\r\n if (voiceCommand.intent === 'apply_promo') {\r\n if (voiceCommand.updates.code) {\r\n handleApplyPromocode(voiceCommand.updates.code);\r\n } else {\r\n const reply = 'Please specify the promo code you want to apply.';\r\n setStatusText(reply);\r\n onVoiceAssistantMessage(reply);\r\n }\r\n return;\r\n }\r\n\r\n if (voiceCommand.intent === 'remove_promo') {\r\n handleRemovePromocode(voiceCommand?.updates?.code);\r\n return;\r\n }\r\n\r\n if (!firstTraveller) return;\r\n\r\n if (voiceCommand.intent === 'save_details') {\r\n handleSave({ continueAfterSave: false });\r\n return;\r\n }\r\n\r\n if (voiceCommand.intent === 'proceed_to_book') {\r\n window.dispatchEvent(\r\n new CustomEvent('traveler-form:confirm-proceed-request'),\r\n );\r\n return;\r\n }\r\n\r\n if (voiceCommand.intent === 'edit_details') {\r\n setIsDetailsConfirmed(false);\r\n setShowProceedToBook(false);\r\n const reply = 'Form unlocked for editing.';\r\n setStatusText(reply);\r\n onVoiceAssistantMessage(reply);\r\n return;\r\n }\r\n\r\n if (voiceCommand.intent === 'go_back') {\r\n const reply = 'Going back to your previous flight results.';\r\n setStatusText(reply);\r\n onVoiceAssistantMessage(reply);\r\n onGoBack();\r\n return;\r\n }\r\n\r\n if (!canEditTraveller) {\r\n return;\r\n }\r\n\r\n if (\r\n !voiceCommand.updates ||\r\n Object.keys(voiceCommand.updates).length === 0\r\n ) {\r\n const fallbackReply = buildNextTravelerPrompt(\r\n firstTraveller,\r\n showPassport,\r\n );\r\n setStatusText(fallbackReply);\r\n onVoiceAssistantMessage(fallbackReply);\r\n return;\r\n }\r\n\r\n // Auto-unlock if confirmed\r\n if (isDetailsConfirmed) {\r\n setIsDetailsConfirmed(false);\r\n setShowProceedToBook(false);\r\n }\r\n const safeVoiceUpdates = removeImmutableTravelerFields(\r\n voiceCommand.updates,\r\n );\r\n if (!Object.keys(safeVoiceUpdates).length) {\r\n const immutableReply =\r\n 'Traveler type cannot be changed. Please update other traveler details only.';\r\n setStatusText(immutableReply);\r\n onVoiceAssistantMessage(immutableReply);\r\n return;\r\n }\r\n\r\n const typedTarget = resolveTypedTravelerTarget(spokenText, travellers);\r\n if (typedTarget?.error) {\r\n setStatusText(typedTarget.error);\r\n onVoiceAssistantMessage(typedTarget.error);\r\n return;\r\n }\r\n const targetIndex =\r\n typedTarget?.index !== null && typedTarget?.index !== undefined\r\n ? typedTarget.index\r\n : voiceCommand.targetIndex !== null &&\r\n voiceCommand.targetIndex !== undefined\r\n ? Math.max(\r\n 0,\r\n Math.min(voiceCommand.targetIndex, travellers.length - 1),\r\n )\r\n : travellers.findIndex((t) => !String(t.fn || '').trim());\r\n\r\n const safeTargetIndex = targetIndex === -1 ? 0 : targetIndex;\r\n const targetTraveller =\r\n travellers[safeTargetIndex] || firstTraveller || {};\r\n\r\n setPayload((prev) => {\r\n const next = { ...prev, trvlrs: [...(prev?.trvlrs || [])] };\r\n if (!next.trvlrs[safeTargetIndex]) return prev;\r\n next.trvlrs[safeTargetIndex] = {\r\n ...next.trvlrs[safeTargetIndex],\r\n ...safeVoiceUpdates,\r\n };\r\n return next;\r\n });\r\n\r\n setFieldErrors((prev) => {\r\n const next = { ...prev };\r\n Object.keys(safeVoiceUpdates).forEach((field) => {\r\n delete next[`${safeTargetIndex}.${field}`];\r\n });\r\n return next;\r\n });\r\n\r\n const nextTraveller = {\r\n ...(targetTraveller || {}),\r\n ...safeVoiceUpdates,\r\n };\r\n const reply = buildTravelerVoiceReply({\r\n traveller: nextTraveller,\r\n updates: safeVoiceUpdates,\r\n passportRequired: showPassport,\r\n });\r\n\r\n setStatusText(reply);\r\n onVoiceAssistantMessage(reply);\r\n };\r\n\r\n window.addEventListener('traveler-form:voice-input', handleVoiceInput);\r\n return () => {\r\n window.removeEventListener('traveler-form:voice-input', handleVoiceInput);\r\n };\r\n }, [\r\n canEditTraveller,\r\n isReadOnly,\r\n firstTraveller,\r\n handleApplyPromocode,\r\n handleRemovePromocode,\r\n handleProceedToBook,\r\n handleSave,\r\n isDetailsConfirmed,\r\n onVoiceAssistantMessage,\r\n showPassport,\r\n handlePayNow,\r\n onGoBack,\r\n isPrebookDone,\r\n prebookBookingId,\r\n travellers,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (!canEditTraveller) return undefined;\r\n const handleProceedBook = () => {\r\n handleProceedToBook();\r\n };\r\n window.addEventListener('traveler-form:proceed-book', handleProceedBook);\r\n return () => {\r\n window.removeEventListener('traveler-form:proceed-book', handleProceedBook);\r\n };\r\n }, [canEditTraveller, handleProceedToBook]);\r\n\r\n useEffect(() => {\r\n const handleExecutePayNow = () => {\r\n handlePayNow();\r\n };\r\n window.addEventListener('traveler-form:execute-pay-now', handleExecutePayNow);\r\n return () => {\r\n window.removeEventListener(\r\n 'traveler-form:execute-pay-now',\r\n handleExecutePayNow,\r\n );\r\n };\r\n }, [handlePayNow]);\r\n\r\n useEffect(() => {\r\n const handleApplySaved = (event) => {\r\n const savedIndex = event.detail?.index;\r\n if (typeof savedIndex !== 'number' || !frequentTravellers[savedIndex])\r\n return;\r\n\r\n const selected = frequentTravellers[savedIndex];\r\n // Find the first traveller index that has no first name\r\n const targetIndex = travellers.findIndex(\r\n (t) => !String(t.fn || '').trim(),\r\n );\r\n\r\n if (targetIndex !== -1) {\r\n applyFrequentTravellerToIndex(targetIndex, selected);\r\n } else {\r\n // Fallback to first if all have names (or maybe do nothing)\r\n applyFrequentTravellerToIndex(0, selected);\r\n }\r\n };\r\n\r\n window.addEventListener('traveler-form:apply-saved', handleApplySaved);\r\n return () => {\r\n window.removeEventListener('traveler-form:apply-saved', handleApplySaved);\r\n };\r\n }, [frequentTravellers, travellers, applyFrequentTravellerToIndex]);\r\n\r\n useEffect(() => {\r\n if (isDetailsConfirmed || !canEditTraveller) {\r\n window.dispatchEvent(\r\n new CustomEvent('traveler-form:update-options', {\r\n detail: { options: [] },\r\n }),\r\n );\r\n return;\r\n }\r\n // Find the first traveller index that has no first name\r\n const nextIndex = travellers.findIndex((t) => !String(t.fn || '').trim());\r\n if (nextIndex === -1) {\r\n window.dispatchEvent(\r\n new CustomEvent('traveler-form:update-options', {\r\n detail: { options: [] },\r\n }),\r\n );\r\n return;\r\n }\r\n\r\n const targetType = travellers[nextIndex]?.typ;\r\n const matching = frequentTravellers.filter((f) =>\r\n isSavedTravellerTypeMatch(f, targetType),\r\n );\r\n\r\n const travelerOptions = matching.slice(0, 3).map((f) => {\r\n const origIndex = frequentTravellers.indexOf(f);\r\n return {\r\n label: `${f.fn || ''} ${f.ln || ''}`.trim(),\r\n value: `APPLY_SAVED_TRAVELLER:${origIndex}`,\r\n };\r\n });\r\n\r\n window.dispatchEvent(\r\n new CustomEvent('traveler-form:update-options', {\r\n detail: { options: travelerOptions },\r\n }),\r\n );\r\n }, [travellers, frequentTravellers, isDetailsConfirmed, canEditTraveller]);\r\n\r\n useEffect(() => {\r\n onViewStateChange({\r\n showSummary: Boolean((isDetailsConfirmed || isPrebookDone) && canInteractWithBlock),\r\n showPayment: Boolean(prebookBookingId && canInteractWithBlock),\r\n showPayNow: Boolean(\r\n prebookBookingId &&\r\n canInteractWithBlock &&\r\n showPayNow &&\r\n !shouldShowInboundApprovalRequest,\r\n ),\r\n summary: {\r\n payload: confirmedPayload,\r\n prebookResponse,\r\n convenienceFee,\r\n appliedPromocode,\r\n promocodeDiscount,\r\n },\r\n proceed: {\r\n showProceedActions: Boolean(\r\n showProceedToBook && isDetailsConfirmed && canInteractWithBlock,\r\n ),\r\n showEditButton: !prebookBookingId,\r\n proceedButtonText: isSubmittingPrebook ? 'Processing...' : 'Proceed to Book',\r\n disableEditButton: Boolean(\r\n isSubmittingPrebook || isPrebookDone || isReadOnly,\r\n ),\r\n disableProceedButton: Boolean(\r\n isSubmittingPrebook || isPrebookDone || isReadOnly || !canEditTraveller,\r\n ),\r\n onEditDetails: () => {\r\n setIsDetailsConfirmed(false);\r\n setShowProceedToBook(false);\r\n },\r\n onProceedToBook: () =>\r\n window.dispatchEvent(\r\n new CustomEvent('traveler-form:confirm-proceed-request'),\r\n ),\r\n },\r\n payment: {\r\n paymentSummary,\r\n appliedPromocode,\r\n isApplyingPromo,\r\n handleRemovePromocode,\r\n handleApplyPromocode,\r\n shouldShowInboundApprovalRequest,\r\n tripReason,\r\n setTripReason,\r\n handleApprovalRequest,\r\n isSubmittingApprovalRequest,\r\n selectedGateway,\r\n selectedPaymentMode,\r\n sdkWarning,\r\n fareCurrency,\r\n allowBalancePaymentOption,\r\n combineOnlineOptions: isCorporateFlow || isB2bAgency || isB2bLikeChannel,\r\n setSelectedGateway,\r\n setSelectedPaymentMode,\r\n totalPayableAmount,\r\n handlePayNow,\r\n isPaying,\r\n },\r\n });\r\n }, [\r\n onViewStateChange,\r\n isDetailsConfirmed,\r\n isPrebookDone,\r\n canInteractWithBlock,\r\n showProceedToBook,\r\n isSubmittingPrebook,\r\n isReadOnly,\r\n canEditTraveller,\r\n prebookBookingId,\r\n showPayNow,\r\n shouldShowInboundApprovalRequest,\r\n confirmedPayload,\r\n prebookResponse,\r\n convenienceFee,\r\n appliedPromocode,\r\n promocodeDiscount,\r\n paymentSummary,\r\n isApplyingPromo,\r\n handleRemovePromocode,\r\n handleApplyPromocode,\r\n tripReason,\r\n setTripReason,\r\n handleApprovalRequest,\r\n isSubmittingApprovalRequest,\r\n selectedGateway,\r\n selectedPaymentMode,\r\n sdkWarning,\r\n fareCurrency,\r\n allowBalancePaymentOption,\r\n isCorporateFlow,\r\n isB2bAgency,\r\n isB2bLikeChannel,\r\n setSelectedGateway,\r\n setSelectedPaymentMode,\r\n totalPayableAmount,\r\n handlePayNow,\r\n isPaying,\r\n ]);\r\n\r\n useEffect(() => () => onViewStateChange(null), [onViewStateChange]);\r\n\r\n if (!firstTraveller) return null;\r\n\r\n return (\r\n <>\r\n {!isPrebookDone ? (\r\n <div\r\n className=\"traveler-form\"\r\n data-voice-traveler-form=\"active\"\r\n data-prebook-done={isPrebookDone ? 'true' : 'false'}\r\n >\r\n <div className=\"traveler-form__header-row\">\r\n <h3 className=\"traveler-form__header\">Travellers Details</h3>\r\n </div>\r\n <p className=\"traveler-form__subtext\">\r\n Ensure traveler details accurately match their official ID.\r\n </p>\r\n {travellers.map((traveller, index) => {\r\n const travellerTypeLabel = getTravellerTypeLabel(traveller?.typ);\r\n const excludedFrequentTravellerKeys = Object.entries(\r\n selectedFrequentTravellerByIndex,\r\n )\r\n .filter(([idx]) => Number(idx) !== Number(index))\r\n .map(([, key]) => key);\r\n return (\r\n <div\r\n key={`traveller-${index}`}\r\n className=\"traveler-form__traveller-block\"\r\n >\r\n <div className=\"traveler-form__header-row\">\r\n <h3 className=\"traveler-form__header\">Traveler {index + 1}</h3>\r\n <span className=\"traveler-form__type-chip\">\r\n ({travellerTypeLabel})\r\n </span>\r\n </div>\r\n <div className=\"traveler-form__section-card\">\r\n <div className=\"traveler-form__grid traveler-form__grid--4\">\r\n <FormSelect\r\n label=\"Gender *\"\r\n value={traveller?.tl || ''}\r\n onChange={(value) => updateTraveller(index, 'tl', value)}\r\n options={[\r\n { value: '', label: 'Select Gender' },\r\n { value: 'M', label: 'Male' },\r\n { value: 'F', label: 'Female' },\r\n ]}\r\n error={fieldErrors[`${index}.tl`]}\r\n disabled={!canEditTraveller}\r\n />\r\n <FrequentTravellerFirstNameSelect\r\n label=\"First Name *\"\r\n value={traveller?.fn || ''}\r\n onChange={(value) => updateTraveller(index, 'fn', value)}\r\n onSelectFrequentTraveller={(selectedTraveller) =>\r\n applyFrequentTravellerToIndex(index, selectedTraveller)\r\n }\r\n frequentTravellers={frequentTravellers.filter((saved) =>\r\n isSavedTravellerTypeMatch(saved, traveller?.typ),\r\n )}\r\n excludedFrequentTravellerKeys={excludedFrequentTravellerKeys}\r\n placeholder=\"First Name\"\r\n error={fieldErrors[`${index}.fn`]}\r\n disabled={!canEditTraveller}\r\n type={traveller?.typ || 'ADT'}\r\n />\r\n <Input\r\n label=\"Last Name *\"\r\n value={traveller?.ln || ''}\r\n onChange={(e) =>\r\n updateTraveller(index, 'ln', e.target.value)\r\n }\r\n placeholder=\"Last Name\"\r\n error={fieldErrors[`${index}.ln`]}\r\n disabled={!canEditTraveller}\r\n />\r\n <DateInput\r\n label=\"Date of Birth *\"\r\n value={traveller?.dob}\r\n onChange={(value) => updateTraveller(index, 'dob', value)}\r\n error={fieldErrors[`${index}.dob`]}\r\n disabled={!canEditTraveller}\r\n minDate={getDobCalendarBounds(traveller?.typ).minDate}\r\n maxDate={getDobCalendarBounds(traveller?.typ).maxDate}\r\n />\r\n </div>\r\n\r\n </div>\r\n\r\n {showPassport && (\r\n <>\r\n <h3 className=\"traveler-form__header\">\r\n Passport Details - Traveler {index + 1}\r\n </h3>\r\n <p className=\"traveler-form__subtext\">\r\n Required for international travel\r\n </p>\r\n <div className=\"traveler-form__section-card\">\r\n <div className=\"traveler-form__grid traveler-form__grid--4\">\r\n <Input\r\n label=\"Nationality\"\r\n value={traveller?.nat || ''}\r\n onChange={(e) =>\r\n updateTraveller(index, 'nat', e.target.value)\r\n }\r\n placeholder=\"Nationality\"\r\n error={fieldErrors[`${index}.nat`]}\r\n disabled={!canEditTraveller}\r\n />\r\n <Input\r\n label=\"Passport Number\"\r\n value={traveller?.num || ''}\r\n onChange={(e) =>\r\n updateTraveller(index, 'num', e.target.value)\r\n }\r\n placeholder=\"Passport Number\"\r\n error={fieldErrors[`${index}.num`]}\r\n disabled={!canEditTraveller}\r\n />\r\n <DateInput\r\n label=\"Issue Date\"\r\n value={traveller?.issdt}\r\n onChange={(value) =>\r\n updateTraveller(index, 'issdt', value)\r\n }\r\n error={fieldErrors[`${index}.issdt`]}\r\n disabled={!canEditTraveller}\r\n maxDate={new Date()}\r\n />\r\n <DateInput\r\n label=\"Expiry Date\"\r\n value={traveller?.expdt}\r\n onChange={(value) =>\r\n updateTraveller(index, 'expdt', value)\r\n }\r\n error={fieldErrors[`${index}.expdt`]}\r\n disabled={!canEditTraveller}\r\n minDate={new Date()}\r\n />\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n })}\r\n {!isPrebookDone ? (\r\n <div className=\"traveler-form__footer-actions\">\r\n <button\r\n type=\"button\"\r\n className=\"traveler-form__btn traveler-form__btn--cancel\"\r\n onClick={handleCancel}\r\n disabled={isSaving || isSubmittingPrebook || isReadOnly}\r\n >\r\n Go Back\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"traveler-form__btn traveler-form__btn--save\"\r\n onClick={handleSave}\r\n disabled={isSaving || isSubmittingPrebook || !canEditTraveller}\r\n >\r\n {isSaving ? 'Saving...' : 'Save Details'}\r\n </button>\r\n </div>\r\n ) : null}\r\n {statusText ? (\r\n <div className=\"traveler-form__status-text\">\r\n {toDisplayText(statusText)}\r\n </div>\r\n ) : null}\r\n </div>\r\n ) : null}\r\n\r\n </>\r\n );\r\n}\r\n\r\nfunction normalizeCollection(value) {\r\n if (Array.isArray(value)) return value;\r\n if (value && Array.isArray(value.payload)) return value.payload;\r\n if (value && typeof value === 'object') return [value];\r\n return [];\r\n}\r\n\r\nfunction toBooleanFlag(value) {\r\n if (typeof value === 'boolean') return value;\r\n const text = String(value || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!text) return false;\r\n return ['true', '1', 'y', 'yes'].includes(text);\r\n}\r\n\r\nfunction normalizeFrequentTravellerList(value) {\r\n if (!Array.isArray(value)) return [];\r\n return value.filter((item) => item && typeof item === 'object');\r\n}\r\n\r\nfunction isSavedTravellerTypeMatch(savedTraveller, currentType) {\r\n const savedType = String(savedTraveller?.typ || '')\r\n .trim()\r\n .toUpperCase();\r\n const travellerType = String(currentType || '')\r\n .trim()\r\n .toUpperCase();\r\n if (!travellerType) return false;\r\n if (!savedType) return false;\r\n return savedType === travellerType;\r\n}\r\n\r\nfunction getFrequentTravellerKey(savedTraveller = {}) {\r\n const fn = String(savedTraveller?.fn || '')\r\n .trim()\r\n .toLowerCase();\r\n const ln = String(savedTraveller?.ln || '')\r\n .trim()\r\n .toLowerCase();\r\n const dob = String(savedTraveller?.dob || '').trim();\r\n const typ = String(savedTraveller?.typ || '')\r\n .trim()\r\n .toUpperCase();\r\n const passport = String(savedTraveller?.num || '')\r\n .trim()\r\n .toUpperCase();\r\n return [fn, ln, dob, typ, passport].join('|');\r\n}\r\n\r\nfunction toEngineDate(value) {\r\n if (!value) return null;\r\n const parsed = new Date(value);\r\n if (Number.isNaN(parsed.getTime())) return null;\r\n const yyyy = parsed.getUTCFullYear();\r\n const mm = String(parsed.getUTCMonth() + 1).padStart(2, '0');\r\n const dd = String(parsed.getUTCDate()).padStart(2, '0');\r\n return `${yyyy}-${mm}-${dd}`;\r\n}\r\n\r\nfunction normalizeTraveller(traveller = {}) {\r\n const typ = String(traveller?.typ || 'ADT')\r\n .trim()\r\n .toUpperCase();\r\n const normalized = {\r\n sno: Number(traveller?.sno || 0),\r\n tl: String(traveller?.tl || '').trim(),\r\n typ,\r\n ldpax: Boolean(traveller?.ldpax),\r\n fn: String(traveller?.fn || '').trim(),\r\n ln: String(traveller?.ln || '').trim(),\r\n dob: toEngineDate(traveller?.dob),\r\n nat: String(traveller?.nat || '').trim(),\r\n isc: String(traveller?.isc || '').trim(),\r\n num: String(traveller?.num || '').trim(),\r\n expdt: toEngineDate(traveller?.expdt),\r\n issdt: toEngineDate(traveller?.issdt),\r\n dtyp: String(traveller?.dtyp || 'P').trim() || 'P',\r\n };\r\n\r\n if (typ !== 'INF') {\r\n normalized.extbag = Array.isArray(traveller?.extbag)\r\n ? traveller.extbag\r\n : [];\r\n normalized.meal = Array.isArray(traveller?.meal) ? traveller.meal : [];\r\n normalized.seat = Array.isArray(traveller?.seat) ? traveller.seat : [];\r\n }\r\n\r\n return normalized;\r\n}\r\n\r\nfunction buildPrebookRequest(payload = {}, context = {}) {\r\n const fallbackPayload =\r\n context?.fallbackPayload && typeof context.fallbackPayload === 'object'\r\n ? context.fallbackPayload\r\n : {};\r\n const confirmedRequestPayload =\r\n context?.confirmedRequestPayload &&\r\n typeof context.confirmedRequestPayload === 'object'\r\n ? context.confirmedRequestPayload\r\n : {};\r\n\r\n const resolvedAgtyp = String(\r\n payload?.agtyp ||\r\n fallbackPayload?.agtyp ||\r\n confirmedRequestPayload?.agtyp ||\r\n '',\r\n ).trim();\r\n const normalizedAgtyp = resolvedAgtyp\r\n .trim()\r\n .toLowerCase();\r\n const rawChannel = String(payload?.chnl || payload?.cha || '')\r\n .trim()\r\n .toLowerCase();\r\n const fallbackChannel = String(\r\n fallbackPayload?.chnl ||\r\n fallbackPayload?.cha ||\r\n confirmedRequestPayload?.chnl ||\r\n confirmedRequestPayload?.cha ||\r\n '',\r\n )\r\n .trim()\r\n .toLowerCase();\r\n const finalRawChannel = rawChannel || fallbackChannel;\r\n const resolvedChannel =\r\n finalRawChannel === 'b2b' ||\r\n finalRawChannel === 'corp' ||\r\n normalizedAgtyp.includes('b2b') ||\r\n normalizedAgtyp.includes('corporate')\r\n ? 'B2B'\r\n : 'B2C';\r\n\r\n const travellers = Array.isArray(payload?.trvlrs) ? payload.trvlrs : [];\r\n const normalizedTravellers = travellers.map((traveller, index) => {\r\n const normalized = normalizeTraveller(traveller);\r\n normalized.sno = normalized.sno > 0 ? normalized.sno : index + 1;\r\n return normalized;\r\n });\r\n\r\n const adults = [];\r\n const nonInfNonAdults = [];\r\n const infants = [];\r\n normalizedTravellers.forEach((traveller) => {\r\n const typ = String(traveller?.typ || '').toUpperCase();\r\n if (typ === 'INF') {\r\n infants.push(traveller);\r\n return;\r\n }\r\n if (typ === 'ADT') {\r\n adults.push(traveller);\r\n return;\r\n }\r\n nonInfNonAdults.push(traveller);\r\n });\r\n\r\n // Map infants to adults in sequence: first infant -> first adult, etc.\r\n // If infants exceed adults, they remain as top-level fallback to avoid data loss.\r\n const adultsWithInfants = adults.map((adult, idx) => {\r\n const mappedInf = infants[idx] || null;\r\n if (!mappedInf) return adult;\r\n return {\r\n ...adult,\r\n inf: {\r\n ...mappedInf,\r\n sno: Number(adult?.sno || idx + 1),\r\n },\r\n };\r\n });\r\n const remainingInfants =\r\n infants.length > adults.length ? infants.slice(adults.length) : [];\r\n const framedTravellers = [\r\n ...adultsWithInfants,\r\n ...nonInfNonAdults,\r\n ...remainingInfants,\r\n ].map((traveller, index) => ({\r\n ...traveller,\r\n sno: index + 1,\r\n }));\r\n\r\n const requestPayload = {\r\n ukey: String(payload?.ukey || '').trim(),\r\n ptyp: String(payload?.ptyp || 'CD').trim() || 'CD',\r\n prd: String(payload?.prd || 'F').trim() || 'F',\r\n em: String(payload?.em || '').trim(),\r\n ph: String(payload?.ph || '').trim(),\r\n trvlrs: framedTravellers,\r\n tt: String(payload?.tt ?? '1').trim() || '1',\r\n chnl: resolvedChannel,\r\n cha: resolvedChannel,\r\n agid:\r\n payload?.agid ??\r\n fallbackPayload?.agid ??\r\n confirmedRequestPayload?.agid ??\r\n null,\r\n trmd: String(\r\n payload?.trmd ||\r\n fallbackPayload?.trmd ||\r\n confirmedRequestPayload?.trmd ||\r\n '',\r\n ).trim(),\r\n utyp: String(\r\n payload?.utyp ||\r\n fallbackPayload?.utyp ||\r\n confirmedRequestPayload?.utyp ||\r\n '',\r\n ).trim(),\r\n agtyp: resolvedAgtyp,\r\n };\r\n\r\n if (payload?.cd !== undefined && payload?.cd !== null) {\r\n requestPayload.cd = String(payload.cd || '').trim();\r\n }\r\n if (payload?.rukey !== undefined && payload?.rukey !== null) {\r\n requestPayload.rukey = String(payload.rukey || '').trim();\r\n }\r\n if (payload?.gst !== undefined && payload?.gst !== null) {\r\n requestPayload.gst = payload.gst;\r\n }\r\n\r\n return requestPayload;\r\n}\r\n\r\nfunction Input({ label, error, ...props }) {\r\n const inputClassNames = [\r\n 'traveler-form__input',\r\n error ? 'traveler-form__input--error' : '',\r\n props.disabled ? 'traveler-form__input--disabled' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n return (\r\n <label className=\"traveler-form__label-wrap\">\r\n <span className=\"traveler-form__label\">{label}</span>\r\n <input className={inputClassNames} {...props} />\r\n {error ? (\r\n <span className=\"traveler-form__error-text\">{toDisplayText(error)}</span>\r\n ) : null}\r\n </label>\r\n );\r\n}\r\n\r\nfunction FrequentTravellerFirstNameSelect({\r\n label,\r\n value,\r\n onChange,\r\n onSelectFrequentTraveller,\r\n frequentTravellers = [],\r\n excludedFrequentTravellerKeys = [],\r\n placeholder = 'First Name',\r\n error,\r\n disabled = false,\r\n type\r\n}) {\r\n const inputClassNames = [\r\n 'traveler-form__input',\r\n error ? 'traveler-form__input--error' : '',\r\n disabled ? 'traveler-form__input--disabled' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [query, setQuery] = useState(String(value || ''));\r\n\r\n useEffect(() => {\r\n setQuery(String(value || ''));\r\n }, [value]);\r\n\r\n const options = frequentTravellers\r\n .map((item, idx) => {\r\n const uniqueKey = getFrequentTravellerKey(item);\r\n if (excludedFrequentTravellerKeys.includes(uniqueKey)) return null;\r\n const firstName = String(item?.fn || '').trim();\r\n const lastName = String(item?.ln || '').trim();\r\n const fullName = `${firstName} ${lastName}`.trim();\r\n return {\r\n value: `saved-${idx}`,\r\n label: fullName || firstName || `Traveller ${idx + 1}`,\r\n firstName,\r\n savedTraveller: item,\r\n };\r\n })\r\n .filter(Boolean);\r\n\r\n const filteredOptions = options.filter((item) => {\r\n const q = String(query || '').trim().toLowerCase() && item.savedTraveller.typ === type;\r\n if (!q) return true;\r\n return (\r\n String(item?.firstName || '')\r\n .toLowerCase()\r\n .includes(q) || String(item?.label || '').toLowerCase().includes(q)\r\n );\r\n });\r\n\r\n return (\r\n <div className=\"traveler-form__label-wrap\">\r\n <span className=\"traveler-form__label\">{label}</span>\r\n <div style={{ position: 'relative' }}>\r\n <input\r\n className={inputClassNames}\r\n value={query}\r\n onChange={(event) => {\r\n const nextValue = event.target.value;\r\n setQuery(nextValue);\r\n onChange(nextValue);\r\n if (!disabled) setIsOpen(true);\r\n }}\r\n onFocus={() => {\r\n if (!disabled) setIsOpen(true);\r\n }}\r\n onBlur={() => {\r\n window.setTimeout(() => setIsOpen(false), 120);\r\n }}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n autoComplete=\"off\"\r\n />\r\n {isOpen && filteredOptions.length > 0 ? (\r\n <div\r\n style={{\r\n position: 'absolute',\r\n top: '100%',\r\n left: 0,\r\n right: 0,\r\n zIndex: 8,\r\n background: '#fff',\r\n border: '1px solid #d4d9e6',\r\n borderRadius: 10,\r\n boxShadow: '0 8px 18px rgba(15, 23, 42, 0.08)',\r\n maxHeight: 220,\r\n overflowY: 'auto',\r\n marginTop: 4,\r\n }}\r\n >\r\n {filteredOptions.map((option) => (\r\n <button\r\n type=\"button\"\r\n key={option.value}\r\n onMouseDown={(event) => event.preventDefault()}\r\n onClick={() => {\r\n setQuery(option.firstName);\r\n onSelectFrequentTraveller(option.savedTraveller);\r\n setIsOpen(false);\r\n }}\r\n style={{\r\n width: '100%',\r\n textAlign: 'left',\r\n border: 0,\r\n background: 'transparent',\r\n padding: '10px 12px',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {option.label}\r\n </button>\r\n ))}\r\n </div>\r\n ) : null}\r\n </div>\r\n {error ? (\r\n <span className=\"traveler-form__error-text\">{toDisplayText(error)}</span>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nfunction FormSelect({\r\n label,\r\n options,\r\n error,\r\n value,\r\n onChange,\r\n disabled = false,\r\n}) {\r\n const selectClassNames = [\r\n 'traveler-form__react-select',\r\n error ? 'traveler-form__react-select--error' : '',\r\n disabled ? 'traveler-form__react-select--disabled' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n const selectedOption =\r\n options.find((item) => String(item.value) === String(value ?? '')) || null;\r\n return (\r\n <label className=\"traveler-form__label-wrap\">\r\n <span className=\"traveler-form__label\">{label}</span>\r\n <ReactSelect\r\n className={selectClassNames}\r\n classNamePrefix=\"traveler-form__react-select\"\r\n value={selectedOption}\r\n onChange={(option) => onChange(option?.value ?? '')}\r\n options={options}\r\n isDisabled={disabled}\r\n isSearchable={false}\r\n menuPlacement=\"auto\"\r\n />\r\n {error ? (\r\n <span className=\"traveler-form__error-text\">{toDisplayText(error)}</span>\r\n ) : null}\r\n </label>\r\n );\r\n}\r\n\r\nfunction DateInput({\r\n label,\r\n error,\r\n value,\r\n onChange,\r\n disabled = false,\r\n minDate = null,\r\n maxDate = null,\r\n}) {\r\n const inputClassNames = [\r\n 'traveler-form__input',\r\n error ? 'traveler-form__input--error' : '',\r\n disabled ? 'traveler-form__input--disabled' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n return (\r\n <label className=\"traveler-form__label-wrap\">\r\n <span className=\"traveler-form__label\">{label}</span>\r\n <DatePicker\r\n selected={toDateObject(value)}\r\n onChange={(date) => onChange(fromDateInput(date))}\r\n dateFormat=\"dd-MM-yyyy\"\r\n placeholderText=\"Please select a date\"\r\n disabled={disabled}\r\n className={inputClassNames}\r\n wrapperClassName=\"traveler-form__datepicker-wrap\"\r\n popperClassName=\"traveler-form__datepicker-popper\"\r\n calendarClassName=\"traveler-form__datepicker-calendar\"\r\n showPopperArrow={false}\r\n popperPlacement=\"bottom-start\"\r\n showMonthDropdown\r\n showYearDropdown\r\n dropdownMode=\"select\"\r\n yearDropdownItemNumber={100}\r\n scrollableYearDropdown\r\n autoComplete=\"off\"\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n />\r\n {error ? (\r\n <span className=\"traveler-form__error-text\">{toDisplayText(error)}</span>\r\n ) : null}\r\n </label>\r\n );\r\n}\r\n\r\nfunction toDateInput(value) {\r\n if (!value) return '';\r\n const parsed = new Date(value);\r\n if (Number.isNaN(parsed.getTime())) return '';\r\n const yyyy = parsed.getFullYear();\r\n const mm = String(parsed.getMonth() + 1).padStart(2, '0');\r\n const dd = String(parsed.getDate()).padStart(2, '0');\r\n return `${yyyy}-${mm}-${dd}`;\r\n}\r\n\r\nfunction addYears(date, years) {\r\n const d = new Date(date);\r\n d.setFullYear(d.getFullYear() + years);\r\n return d;\r\n}\r\n\r\nfunction addDays(date, days) {\r\n const d = new Date(date);\r\n d.setDate(d.getDate() + days);\r\n return d;\r\n}\r\n\r\nfunction getDobCalendarBounds(travellerType) {\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n const type = String(travellerType || 'ADT')\r\n .trim()\r\n .toUpperCase();\r\n\r\n if (type === 'INF') {\r\n // Infant: age < 2 years.\r\n return {\r\n minDate: addDays(addYears(today, -2), 1),\r\n maxDate: today,\r\n };\r\n }\r\n if (type === 'CHD') {\r\n // Child: age 2-11 years.\r\n return {\r\n minDate: addDays(addYears(today, -12), 1),\r\n maxDate: addYears(today, -2),\r\n };\r\n }\r\n // Adult: age >= 12 years (cap to 120 years old).\r\n return {\r\n minDate: addYears(today, -120),\r\n maxDate: addYears(today, -12),\r\n };\r\n}\r\n\r\nfunction getAgeInYears(dobValue) {\r\n const dob = new Date(dobValue);\r\n if (Number.isNaN(dob.getTime())) return null;\r\n const today = new Date();\r\n let age = today.getFullYear() - dob.getFullYear();\r\n const monthDiff = today.getMonth() - dob.getMonth();\r\n const dayDiff = today.getDate() - dob.getDate();\r\n if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) age -= 1;\r\n return age;\r\n}\r\n\r\nfunction validateAgeByTravellerType(travellerType, dobValue) {\r\n const age = getAgeInYears(dobValue);\r\n if (age === null) return null;\r\n const typ = String(travellerType || 'ADT')\r\n .trim()\r\n .toUpperCase();\r\n if (typ === 'INF' && age >= 2) {\r\n return 'Infant age must be below 2 years.';\r\n }\r\n if (typ === 'CHD' && (age < 2 || age >= 12)) {\r\n return 'Child age must be between 2 and 11 years.';\r\n }\r\n if (typ === 'ADT' && age < 12) {\r\n return 'Adult age must be 12 years or above.';\r\n }\r\n return null;\r\n}\r\n\r\nfunction toDateObject(value) {\r\n if (!value) return null;\r\n const parsed = new Date(value);\r\n if (Number.isNaN(parsed.getTime())) return null;\r\n return parsed;\r\n}\r\n\r\nfunction fromDateInput(value) {\r\n if (!value) return null;\r\n return new Date(value).toISOString();\r\n}\r\n\r\nasync function launchGatewayFlow({\r\n gateway,\r\n paymentMode,\r\n apiData,\r\n bookingPayload,\r\n onGatewayCallback,\r\n onGatewayDismiss,\r\n}) {\r\n const normalizedGateway = String(gateway || '').toLowerCase();\r\n const normalizedMode = String(paymentMode || '').trim().toUpperCase();\r\n const payload = apiData?.payload || {};\r\n\r\n // Razorpay: use order id returned by auth API.\r\n if (normalizedGateway.includes('razor')) {\r\n const ordid = payload?.ordid || payload?.order_id || payload?.orderId;\r\n const razorKey =\r\n process.env.REACT_APP_RAZOR_KEY ||\r\n process.env.REACT_APP_RAZORPAY_KEY ||\r\n process.env.razor_key ||\r\n '';\r\n if (!ordid) {\r\n return { launched: false, reason: 'order id missing in response' };\r\n }\r\n if (!razorKey) {\r\n return {\r\n launched: false,\r\n reason: 'Razorpay key missing in frontend env',\r\n };\r\n }\r\n if (typeof window?.Razorpay !== 'function') {\r\n const razorCheckoutUrl =\r\n process.env.REACT_APP_RAZOR_CHECKOUT ||\r\n 'https://checkout.razorpay.com/v1/checkout.js';\r\n const sdkLoaded = await loadExternalScript(\r\n 'razorpay-checkout-sdk',\r\n razorCheckoutUrl,\r\n );\r\n if (!sdkLoaded || typeof window?.Razorpay !== 'function') {\r\n return { launched: false, reason: 'Razorpay SDK not loaded' };\r\n }\r\n }\r\n const amount = Math.round(Number(bookingPayload?.amt || 0)) * 100;\r\n const razorCallbackUrl =\r\n process.env.REACT_APP_PAYMENT_GATEWAY_BASE_URL ||\r\n process.env.REACT_APP_PG_BASE_URL ||\r\n 'http://localhost:3049';\r\n\r\n const options = {\r\n key: razorKey,\r\n amount,\r\n currency: 'INR',\r\n order_id: ordid,\r\n name: 'Book N Travel',\r\n description: `Booking ${bookingPayload?.bkid || ''}`.trim(),\r\n prefill: {\r\n email: bookingPayload?.em || '',\r\n contact: bookingPayload?.phno || bookingPayload?.ph || '',\r\n },\r\n\r\n theme: { color: '#2563eb' },\r\n modal: {},\r\n };\r\n\r\n return await new Promise((resolve) => {\r\n let resolved = false;\r\n let callbackInvoked = false;\r\n const finalize = (result) => {\r\n if (resolved) return;\r\n resolved = true;\r\n resolve(result);\r\n };\r\n\r\n options.modal.ondismiss = () => {\r\n // If payment success callback already invoked, keep Pay Now hidden.\r\n if (!callbackInvoked && typeof onGatewayDismiss === 'function') {\r\n onGatewayDismiss();\r\n }\r\n finalize({\r\n launched: false,\r\n reason: 'Checkout closed by user.',\r\n });\r\n };\r\n\r\n options.handler = (resp) => {\r\n callbackInvoked = true;\r\n if (typeof onGatewayCallback === 'function') onGatewayCallback();\r\n postRazorpayPaymentResponse({\r\n callbackBaseUrl: razorCallbackUrl,\r\n payload: {\r\n razorpay_payment_id: resp?.razorpay_payment_id || '',\r\n razorpay_order_id: resp?.razorpay_order_id || ordid,\r\n razorpay_signature: resp?.razorpay_signature || '',\r\n bkid: bookingPayload?.bkid || '',\r\n },\r\n })\r\n .catch(() => {\r\n // Ignore callback reporting errors to avoid blocking successful payment UX.\r\n })\r\n .finally(() => {\r\n finalize({ launched: true, reason: 'Payment completed.' });\r\n });\r\n };\r\n\r\n try {\r\n const rzp = new window.Razorpay(options);\r\n rzp.on('payment.failed', (failure) => {\r\n const message =\r\n failure?.error?.description ||\r\n failure?.error?.reason ||\r\n failure?.error?.code ||\r\n 'Payment failed.';\r\n finalize({ launched: false, reason: message });\r\n });\r\n rzp.open();\r\n } catch (error) {\r\n finalize({\r\n launched: false,\r\n reason: `Razorpay open failed: ${error?.message || 'unknown error'}`,\r\n });\r\n }\r\n });\r\n }\r\n\r\n // EaseBuzz: API usually returns token/data to append with hosted pay URL.\r\n const isCcAvenueMode =\r\n normalizedGateway.includes('ccavenue') ||\r\n normalizedGateway.includes('ccav') ||\r\n ['CC', 'DC', 'NB', 'UP', 'UPI', 'CA'].includes(normalizedMode);\r\n if (isCcAvenueMode) {\r\n const ccAvenueBase =\r\n process.env.REACT_APP_CCAVENUE_URL || process.env.CCAVENUE_URL || '';\r\n const ccPayload =\r\n payload?.payload && typeof payload.payload === 'object'\r\n ? payload.payload\r\n : payload;\r\n const encryptedKey =\r\n ccPayload?.encryptedKey ||\r\n ccPayload?.encRequest ||\r\n ccPayload?.encReq ||\r\n '';\r\n const accessCode = ccPayload?.accessCode || ccPayload?.access_code || '';\r\n if (!ccAvenueBase || !encryptedKey) {\r\n return {\r\n launched: false,\r\n reason: 'CCAvenue URL/encryptedKey missing in response',\r\n };\r\n }\r\n const base = String(ccAvenueBase).replace(/\\/$/, '');\r\n const paymentUrl =\r\n `${base}/transaction/transaction.do?command=initiateTransaction` +\r\n `&encRequest=${encodeURIComponent(encryptedKey)}` +\r\n (accessCode ? `&access_code=${encodeURIComponent(accessCode)}` : '');\r\n\r\n const width = 460;\r\n const height = 720;\r\n const left = Math.max(Math.round((window.screen.width - width) / 2), 0);\r\n const top = Math.max(Math.round((window.screen.height - height) / 2), 0);\r\n const popup = window.open(\r\n paymentUrl,\r\n 'ccavenuePayment',\r\n `popup=yes,width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes`,\r\n );\r\n if (!popup) {\r\n window.location.href = paymentUrl;\r\n }\r\n return { launched: true };\r\n }\r\n\r\n // EaseBuzz: API usually returns token/data to append with hosted pay URL.\r\n if (normalizedGateway.includes('ease')) {\r\n const easePayBase =\r\n process.env.REACT_APP_EASE_BUZZ_PAY || process.env.EASE_BUZZ_PAY || '';\r\n const easeRedirectFallback =\r\n process.env.REACT_APP_EASE_BUZZ_REDIRECT_URL ||\r\n process.env.EASE_BUZZ_REDIRECT_URL ||\r\n '';\r\n const token = payload?.data || payload?.token || payload?.key;\r\n const redirectUrl =\r\n payload?.redirectUrl ||\r\n payload?.redirect_url ||\r\n payload?.url ||\r\n easeRedirectFallback;\r\n if (redirectUrl) {\r\n window.location.href = redirectUrl;\r\n return { launched: true };\r\n }\r\n if (easePayBase && token) {\r\n window.location.href = `${easePayBase}${token}`;\r\n return { launched: true };\r\n }\r\n if (!easePayBase && !redirectUrl) {\r\n return {\r\n launched: false,\r\n reason: 'EaseBuzz pay URL missing in frontend env',\r\n };\r\n }\r\n return { launched: false, reason: 'EaseBuzz token/url missing' };\r\n }\r\n\r\n // PhonePe: backend may return a redirect URL directly.\r\n if (normalizedGateway.includes('phone')) {\r\n const phonePeRedirectFallback =\r\n process.env.REACT_APP_PHONEPE_REDIRECT_URL ||\r\n process.env.PHONEPE_REDIRECT_URL ||\r\n '';\r\n const redirectUrl =\r\n payload?.redirectUrl ||\r\n payload?.redirect_url ||\r\n apiData?.redirectUrl ||\r\n phonePeRedirectFallback;\r\n if (redirectUrl) {\r\n window.location.href = redirectUrl;\r\n return { launched: true };\r\n }\r\n return { launched: false, reason: 'PhonePe redirect URL missing' };\r\n }\r\n\r\n // Atom: most integrations return token/URL; redirect if available.\r\n if (normalizedGateway.includes('atom')) {\r\n const atomRedirectFallback =\r\n process.env.REACT_APP_ATOM_REDIRECT_URL ||\r\n process.env.ATOM_REDIRECT_URL ||\r\n '';\r\n const redirectUrl =\r\n payload?.redirectUrl ||\r\n payload?.redirect_url ||\r\n payload?.url ||\r\n atomRedirectFallback;\r\n if (redirectUrl) {\r\n window.location.href = redirectUrl;\r\n return { launched: true };\r\n }\r\n\r\n const atomToken =\r\n payload?.[0] ||\r\n payload?.token ||\r\n payload?.atomTokenId ||\r\n payload?.atomToken;\r\n if (atomToken) {\r\n const atomSdkUrl =\r\n process.env.REACT_APP_ATOM_SDK_URL || process.env.ATOM_SDK_URL || '';\r\n if (typeof window?.AtomPaynetz !== 'function' && atomSdkUrl) {\r\n const atomLoaded = await loadExternalScript(\r\n 'atom-checkout-sdk',\r\n atomSdkUrl,\r\n );\r\n if (!atomLoaded || typeof window?.AtomPaynetz !== 'function') {\r\n return { launched: false, reason: 'Atom SDK not loaded' };\r\n }\r\n }\r\n if (typeof window?.AtomPaynetz !== 'function') {\r\n return { launched: false, reason: 'Atom SDK missing in browser' };\r\n }\r\n const atomMerchantId =\r\n process.env.REACT_APP_ATOM_MERCHANT_ID || process.env.MERCHENT_ID || '';\r\n const atomReturnBase =\r\n process.env.REACT_APP_PAYMENT_REDIRECT_URL ||\r\n process.env.REDIRECTION_URL ||\r\n '';\r\n if (!atomMerchantId || !atomReturnBase) {\r\n return {\r\n launched: false,\r\n reason: 'Atom merchant/redirect env missing',\r\n };\r\n }\r\n const options = {\r\n atomTokenId: atomToken,\r\n merchId: atomMerchantId,\r\n custEmail: bookingPayload?.em || '',\r\n custMobile: bookingPayload?.phno || bookingPayload?.ph || '',\r\n returnUrl: `${atomReturnBase}/api/v1/atom/payment-response`,\r\n userAgent: 'mobile_webView',\r\n };\r\n // eslint-disable-next-line no-new\r\n new window.AtomPaynetz(options, 'uat');\r\n return { launched: true };\r\n }\r\n\r\n return {\r\n launched: false,\r\n reason: 'Atom token/redirect missing in response',\r\n };\r\n }\r\n\r\n return { launched: false, reason: 'Unsupported gateway launch flow' };\r\n}\r\n\r\nasync function postRazorpayPaymentResponse({ callbackBaseUrl, payload }) {\r\n const baseUrl = String(callbackBaseUrl || '').replace(/\\/$/, '');\r\n if (!baseUrl) return;\r\n const endpoint = `${baseUrl}/api/v1/razorpay/payment-response`;\r\n await fetch(endpoint, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(payload || {}),\r\n keepalive: true,\r\n });\r\n}\r\n\r\nfunction loadExternalScript(id, src) {\r\n if (!src) return Promise.resolve(false);\r\n const existing = document.getElementById(id);\r\n if (existing) return Promise.resolve(true);\r\n\r\n return new Promise((resolve) => {\r\n const script = document.createElement('script');\r\n script.id = id;\r\n script.src = src;\r\n script.async = true;\r\n script.onload = () => resolve(true);\r\n script.onerror = () => resolve(false);\r\n document.body.appendChild(script);\r\n });\r\n}\r\n\r\nfunction getGatewayNamesFromSummary(summary) {\r\n const names = new Set();\r\n const gateways = normalizeCollection(summary?.gateways);\r\n gateways.forEach((item) => {\r\n if (typeof item === 'string' && item.trim()) {\r\n names.add(item.trim());\r\n return;\r\n }\r\n if (Array.isArray(item?.nm)) {\r\n item.nm.forEach((nm) => {\r\n const value = String(nm || '').trim();\r\n if (value) names.add(value);\r\n });\r\n return;\r\n }\r\n const value = String(item?.nm || item?.name || '').trim();\r\n if (value) names.add(value);\r\n });\r\n const charges = normalizeCollection(summary?.charges);\r\n charges.forEach((item) => {\r\n const value = String(item?.gatetyp || '').trim();\r\n if (value) names.add(value);\r\n });\r\n return Array.from(names);\r\n}\r\n\r\nfunction resolveSelectedChargeForFee({\r\n charges,\r\n selectedGateway,\r\n selectedPaymentMode,\r\n}) {\r\n const normalizedCharges = normalizeCollection(charges);\r\n const normalizedGateway = String(selectedGateway || '').trim();\r\n const normalizedMode = String(selectedPaymentMode || '')\r\n .trim()\r\n .toUpperCase();\r\n\r\n // For combined Card/Net Banking/UPI mode, use only Debit Card fee when available.\r\n if (normalizedMode === 'CA') {\r\n return (\r\n normalizedCharges.find(\r\n (item) =>\r\n String(item?.gatetyp || '').trim() === normalizedGateway &&\r\n String(item?.pm || '')\r\n .trim()\r\n .toUpperCase() === 'DC',\r\n ) || null\r\n );\r\n }\r\n\r\n return (\r\n normalizedCharges.find(\r\n (item) =>\r\n String(item?.gatetyp || '').trim() === normalizedGateway &&\r\n String(item?.pm || '')\r\n .trim()\r\n .toUpperCase() === normalizedMode,\r\n ) || null\r\n );\r\n}\r\n\r\nfunction getGatewayFeeAmount(selectedCharge = {}) {\r\n const feeKeys = [\r\n 'cf',\r\n 'convFee',\r\n 'convenienceFee',\r\n 'gatewayFee',\r\n 'gwFee',\r\n 'fee',\r\n 'chg',\r\n 'charge',\r\n ];\r\n for (const key of feeKeys) {\r\n const value = Number(selectedCharge?.[key]);\r\n if (Number.isFinite(value)) return value;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction getTravellerTypeLabel(typeValue) {\r\n const normalized = String(typeValue || 'ADT')\r\n .trim()\r\n .toUpperCase();\r\n if (normalized === 'CHD') return 'Child';\r\n if (normalized === 'INF') return 'Infant';\r\n return 'Adult';\r\n}\r\n\r\nfunction parseTravelerVoiceCommand(\r\n text,\r\n { passportRequired = false, traveller = {} } = {},\r\n) {\r\n const normalizedText = String(text || '').trim();\r\n const lower = normalizedText.toLowerCase();\r\n if (!lower) return null;\r\n\r\n if (\r\n /\\b(save details|save traveler details|save traveller details|save)\\b/.test(\r\n lower,\r\n )\r\n ) {\r\n return { intent: 'save_details', updates: {} };\r\n }\r\n if (/^\\s*back\\s*$/.test(lower) || /\\b(go back|back to results|show previous results|previous results)\\b/.test(lower)) {\r\n return { intent: 'go_back', updates: {} };\r\n }\r\n if (/\\b(proceed to book|continue to book|continue booking)\\b/.test(lower)) {\r\n return { intent: 'proceed_to_book', updates: {} };\r\n }\r\n if (\r\n /^\\s*pay\\s*$/i.test(normalizedText) ||\r\n /^\\s*paye\\s*$/i.test(normalizedText) ||\r\n /^\\s*payment\\s*$/i.test(normalizedText) ||\r\n /\\b(pay now|make payment|complete payment)\\b/.test(lower)\r\n ) {\r\n return { intent: 'confirm_payment', updates: {} };\r\n }\r\n if (\r\n /\\b(edit details|edit traveler details|edit traveller details|modify details)\\b/.test(\r\n lower,\r\n )\r\n ) {\r\n return { intent: 'edit_details', updates: {} };\r\n }\r\n if (\r\n /\\b(select|choose|set|use)\\b.*\\b(credit card|debit card|net banking|upi|razor ?pay|crypto)\\b/.test(\r\n lower,\r\n ) ||\r\n /\\b(credit card|debit card|net banking|upi|razor ?pay|crypto)\\b/.test(lower)\r\n ) {\r\n return {\r\n intent: 'select_payment_mode',\r\n updates: { paymentMode: parsePaymentModeFromText(lower) },\r\n };\r\n }\r\n\r\n const applyPromoMatch = lower.match(\r\n /\\b(?:apply|use|add)\\s+(?:promo|promocode|promocde|coupon|discount)\\s+(?:code\\s+)?(\\w+)\\b/,\r\n );\r\n const applyPromoCodeBeforeKeywordMatch = lower.match(\r\n /\\b(?:apply|use|add)\\s+(\\w+)\\s+(?:promo|promocode|promocde|coupon|discount)\\b/,\r\n );\r\n const applyPromoCode =\r\n applyPromoMatch?.[1] || applyPromoCodeBeforeKeywordMatch?.[1] || '';\r\n if (applyPromoCode) {\r\n return {\r\n intent: 'apply_promo',\r\n updates: { code: applyPromoCode.toUpperCase() },\r\n };\r\n }\r\n\r\n const removePromoSimpleMatch = lower.match(\r\n /\\b(remove promo|remove promocode|remove promocde|remove coupon|clear promo|clear promocode|clear promocde|clear coupon|delete promo|delete promocode|delete promocde|delete coupon)\\b/,\r\n );\r\n if (removePromoSimpleMatch) {\r\n return { intent: 'remove_promo', updates: {} };\r\n }\r\n const removePromoWithCodeMatch = lower.match(\r\n /\\b(?:remove|clear|delete)\\s+([a-z0-9_-]+)\\s+(?:promo|promocode|promocde|coupon)\\b/i,\r\n );\r\n if (removePromoWithCodeMatch?.[1]) {\r\n return {\r\n intent: 'remove_promo',\r\n updates: { code: removePromoWithCodeMatch[1].toUpperCase() },\r\n };\r\n }\r\n\r\n const travelerIndexMatch = lower.match(\r\n /\\b(?:traveler|traveller|person)\\s+(\\d+)\\b/,\r\n );\r\n const ordinalMatch = lower.match(\r\n /\\b(first|second|third|fourth|fifth|sixth|seventh|eighth|ninth|tenth)\\s+(?:traveler|traveller|person)\\b/,\r\n );\r\n\r\n let targetedIndex = null;\r\n if (travelerIndexMatch) {\r\n targetedIndex = parseInt(travelerIndexMatch[1], 10) - 1;\r\n } else if (ordinalMatch) {\r\n const ordMap = {\r\n first: 0,\r\n second: 1,\r\n third: 2,\r\n fourth: 3,\r\n fifth: 4,\r\n sixth: 5,\r\n seventh: 6,\r\n eighth: 7,\r\n ninth: 8,\r\n tenth: 9,\r\n };\r\n targetedIndex = ordMap[ordinalMatch[1].toLowerCase()];\r\n }\r\n\r\n const updates = {};\r\n const nextMissingField = getNextTravelerField(traveller, passportRequired);\r\n const isTravellerTypeChangeAttempt =\r\n /\\b(?:change|set|update|make)\\b/.test(lower) &&\r\n /\\b(?:traveler|traveller|passenger)\\b/.test(lower) &&\r\n /\\b(?:adult|child|infant)\\b/.test(lower);\r\n\r\n // Handle \"change X to Y\" or \"update X to Y\"\r\n const changeToMatch = lower.match(\r\n /\\b(?:change|update|set|edit)\\s+(.+?)\\s+(?:to|is|as|=)\\s+(.+)\\b/,\r\n );\r\n if (changeToMatch) {\r\n const fieldPart = changeToMatch[1];\r\n const valuePart = stripLeadingConnector(changeToMatch[2]);\r\n\r\n if (/\\b(first name|given name)\\b/.test(fieldPart)) {\r\n updates.fn = capitalizeWord(valuePart);\r\n } else if (/\\b(last name|surname|family name)\\b/.test(fieldPart)) {\r\n updates.ln = capitalizeWord(valuePart);\r\n } else if (/\\b(gender|sex)\\b/.test(fieldPart)) {\r\n if (/\\bfemale\\b/.test(valuePart)) updates.tl = 'F';\r\n else if (/\\bmale\\b/.test(valuePart)) updates.tl = 'M';\r\n } else if (/\\b(date of birth|dob)\\b/.test(fieldPart)) {\r\n const parsed = parseSpokenDate(valuePart);\r\n if (parsed) updates.dob = parsed;\r\n } else if (/\\b(nationality|citizenship)\\b/.test(fieldPart)) {\r\n updates.nat = valuePart.toUpperCase();\r\n } else if (/\\b(passport number|passport)\\b/.test(fieldPart)) {\r\n updates.num = valuePart.toUpperCase();\r\n }\r\n }\r\n\r\n const isLikelyNamePhrase =\r\n /\\b(first name|last name|surname|family name|given name)\\b/i.test(\r\n normalizedText,\r\n );\r\n const fullNameMatch = normalizedText.match(\r\n /\\b(?:my name is|traveler name is|traveller name is|name is)\\s+([A-Za-z]+)(?:\\s+([A-Za-z]+))?\\b/i,\r\n );\r\n if (fullNameMatch && !isLikelyNamePhrase) {\r\n if (fullNameMatch[1]) updates.fn = capitalizeWord(fullNameMatch[1]);\r\n if (fullNameMatch[2]) updates.ln = capitalizeWord(fullNameMatch[2]);\r\n }\r\n\r\n const firstNameMatch = normalizedText.match(\r\n /\\b(?:first name|given name)\\s+(?:is|as|to|=)\\s+([A-Za-z]+)\\b/i,\r\n );\r\n if (firstNameMatch) {\r\n updates.fn = capitalizeWord(stripLeadingConnector(firstNameMatch[1]));\r\n }\r\n\r\n const lastNameMatch = normalizedText.match(\r\n /\\b(?:last name|surname|family name)\\s+(?:is|as|to|=)\\s+([A-Za-z]+)\\b/i,\r\n );\r\n if (lastNameMatch) {\r\n updates.ln = capitalizeWord(stripLeadingConnector(lastNameMatch[1]));\r\n }\r\n\r\n if (/\\b(female|woman|girl)\\b/i.test(lower)) {\r\n updates.tl = 'F';\r\n } else if (/\\b(male|man|boy)\\b/i.test(lower)) {\r\n updates.tl = 'M';\r\n }\r\n\r\n const explicitTypeMatch = lower.match(\r\n /\\b(?:traveler type|traveller type|passenger type|type)\\s+(?:is|as|to|=)\\s+(adult|child|infant)\\b/,\r\n );\r\n if (explicitTypeMatch) {\r\n const value = explicitTypeMatch[1];\r\n if (value === 'adult') updates.typ = 'ADT';\r\n if (value === 'child') updates.typ = 'CHD';\r\n if (value === 'infant') updates.typ = 'INF';\r\n }\r\n\r\n const dobMatch = normalizedText.match(\r\n /\\b(?:date of birth|dob|born on)\\s+(?:is|as|to|=)?\\s*(.+)$/i,\r\n );\r\n if (dobMatch) {\r\n const dobText = stripLeadingConnector(dobMatch[1]);\r\n const parsedDob =\r\n parseSpokenDate(extractDatePhrase(dobText) || dobText) ||\r\n parseSpokenDate(extractDatePhrase(normalizedText) || '');\r\n if (parsedDob) updates.dob = parsedDob;\r\n }\r\n\r\n if (passportRequired) {\r\n const nationalityMatch = normalizedText.match(\r\n /\\b(?:nationality|citizenship)\\s+(?:is|as|to|=)\\s+([A-Za-z ]+)\\b/i,\r\n );\r\n if (nationalityMatch) {\r\n updates.nat = stripLeadingConnector(nationalityMatch[1]);\r\n }\r\n\r\n const passportMatch = normalizedText.match(\r\n /\\b(?:passport number|passport)\\s+(?:is|as|to|=)\\s+([A-Za-z0-9]+)\\b/i,\r\n );\r\n if (passportMatch) {\r\n updates.num = stripLeadingConnector(passportMatch[1]).toUpperCase();\r\n }\r\n\r\n const issueMatch = normalizedText.match(\r\n /\\b(?:issue date)\\s+(?:is|as|to|=)?\\s*(.+)$/i,\r\n );\r\n if (issueMatch) {\r\n const parsedIssueDate = parseSpokenDate(stripLeadingConnector(issueMatch[1]));\r\n if (parsedIssueDate) updates.issdt = parsedIssueDate;\r\n }\r\n\r\n const expiryMatch = normalizedText.match(\r\n /\\b(?:expiry date|expiration date)\\s+(?:is|as|to|=)?\\s*(.+)$/i,\r\n );\r\n if (expiryMatch) {\r\n const parsedExpiryDate = parseSpokenDate(\r\n stripLeadingConnector(expiryMatch[1]),\r\n );\r\n if (parsedExpiryDate) updates.expdt = parsedExpiryDate;\r\n }\r\n }\r\n\r\n if (isTravellerTypeChangeAttempt) {\r\n return {\r\n intent: 'fill_details',\r\n updates: {},\r\n targetIndex: targetedIndex,\r\n blockedReason:\r\n 'Traveler type cannot be changed. Please update other traveler details only.',\r\n };\r\n }\r\n\r\n if (Object.keys(updates).length === 0) {\r\n applyContextualTravelerFallback(updates, normalizedText, nextMissingField);\r\n }\r\n\r\n return { intent: 'fill_details', updates, targetIndex: targetedIndex };\r\n}\r\n\r\nfunction buildTravelerVoiceReply({\r\n traveller,\r\n updates = {},\r\n passportRequired = false,\r\n}) {\r\n const updatedLabels = [];\r\n if (updates.fn) updatedLabels.push(`first name as ${updates.fn}`);\r\n if (updates.ln) updatedLabels.push(`last name as ${updates.ln}`);\r\n if (updates.tl) {\r\n updatedLabels.push(`gender as ${updates.tl === 'F' ? 'female' : 'male'}`);\r\n }\r\n if (updates.dob) {\r\n updatedLabels.push(`date of birth as ${formatVoiceDate(updates.dob)}`);\r\n }\r\n if (updates.typ) {\r\n updatedLabels.push(\r\n `traveler type as ${getTravellerTypeLabel(updates.typ)}`,\r\n );\r\n }\r\n if (updates.nat) updatedLabels.push(`nationality as ${updates.nat}`);\r\n if (updates.num) updatedLabels.push('passport number');\r\n if (updates.issdt)\r\n updatedLabels.push(\r\n `passport issue date as ${formatVoiceDate(updates.issdt)}`,\r\n );\r\n if (updates.expdt)\r\n updatedLabels.push(\r\n `passport expiry date as ${formatVoiceDate(updates.expdt)}`,\r\n );\r\n\r\n const nextPrompt = buildNextTravelerPrompt(traveller, passportRequired);\r\n if (!updatedLabels.length) return nextPrompt;\r\n return `Updated ${joinWithAnd(updatedLabels)}. ${nextPrompt}`;\r\n}\r\n\r\nfunction buildNextTravelerPrompt(traveller = {}, passportRequired = false) {\r\n const nextMissingField = getNextTravelerField(traveller, passportRequired);\r\n if (nextMissingField === 'fn') return 'What is the first name?';\r\n if (nextMissingField === 'ln') return 'What is the last name?';\r\n if (nextMissingField === 'tl') return 'What is the gender?';\r\n if (nextMissingField === 'dob') return 'What is the date of birth?';\r\n if (nextMissingField === 'typ') return 'What is the traveler type?';\r\n if (nextMissingField === 'nat') return 'What is the nationality?';\r\n if (nextMissingField === 'num') return 'What is the passport number?';\r\n if (nextMissingField === 'issdt') return 'What is the passport issue date?';\r\n if (nextMissingField === 'expdt') return 'What is the passport expiry date?';\r\n return 'All required traveler details are filled. You can say save details, or provide a correction.';\r\n}\r\n\r\nfunction getNextTravelerField(traveller = {}, passportRequired = false) {\r\n if (!String(traveller.fn || '').trim()) return 'fn';\r\n if (!String(traveller.ln || '').trim()) return 'ln';\r\n if (!['M', 'F'].includes(String(traveller.tl || '').trim())) return 'tl';\r\n if (!toDateInput(traveller.dob)) return 'dob';\r\n if (!String(traveller.typ || '').trim()) return 'typ';\r\n if (passportRequired) {\r\n if (!String(traveller.nat || '').trim()) return 'nat';\r\n if (!String(traveller.num || '').trim()) return 'num';\r\n if (!toDateInput(traveller.issdt)) return 'issdt';\r\n if (!toDateInput(traveller.expdt)) return 'expdt';\r\n }\r\n return null;\r\n}\r\n\r\nfunction resolveTypedTravelerTarget(text, travellers = []) {\r\n const normalized = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!normalized) return { index: null, error: '' };\r\n\r\n const typedMatch = normalized.match(\r\n /\\b(?:(first|second|third|fourth|fifth|1st|2nd|3rd|4th|5th|1|2|3|4|5)\\s+)?(adult|child|infant)\\b/,\r\n );\r\n if (!typedMatch) return { index: null, error: '' };\r\n\r\n const orderMap = {\r\n first: 1,\r\n second: 2,\r\n third: 3,\r\n fourth: 4,\r\n fifth: 5,\r\n '1st': 1,\r\n '2nd': 2,\r\n '3rd': 3,\r\n '4th': 4,\r\n '5th': 5,\r\n '1': 1,\r\n '2': 2,\r\n '3': 3,\r\n '4': 4,\r\n '5': 5,\r\n };\r\n const requestedOrder = orderMap[typedMatch[1]] || 1;\r\n const requestedType =\r\n typedMatch[2] === 'adult'\r\n ? 'ADT'\r\n : typedMatch[2] === 'child'\r\n ? 'CHD'\r\n : 'INF';\r\n const indices = travellers\r\n .map((item, index) => ({ item, index }))\r\n .filter(\r\n ({ item }) =>\r\n String(item?.typ || '')\r\n .trim()\r\n .toUpperCase() === requestedType,\r\n )\r\n .map(({ index }) => index);\r\n\r\n if (!indices.length) {\r\n const typeLabel =\r\n requestedType === 'CHD'\r\n ? 'child'\r\n : requestedType === 'INF'\r\n ? 'infant'\r\n : 'adult';\r\n return { index: null, error: `No ${typeLabel} travelers available.` };\r\n }\r\n\r\n const target = indices[requestedOrder - 1];\r\n if (target === undefined) {\r\n const typeLabel =\r\n requestedType === 'CHD'\r\n ? 'child'\r\n : requestedType === 'INF'\r\n ? 'infant'\r\n : 'adult';\r\n return {\r\n index: null,\r\n error: `Requested ${typedMatch[1] || 'first'} ${typeLabel} traveler is not available.`,\r\n };\r\n }\r\n return { index: target, error: '' };\r\n}\r\n\r\nfunction applyContextualTravelerFallback(\r\n updates,\r\n normalizedText,\r\n nextMissingField,\r\n) {\r\n if (!nextMissingField) return;\r\n\r\n if (nextMissingField === 'fn' || nextMissingField === 'ln') {\r\n const nameValue = extractSimpleNameValue(normalizedText);\r\n if (nameValue) {\r\n updates[nextMissingField] = nameValue;\r\n }\r\n return;\r\n }\r\n\r\n if (\r\n nextMissingField === 'dob' ||\r\n nextMissingField === 'issdt' ||\r\n nextMissingField === 'expdt'\r\n ) {\r\n const parsedDate = parseSpokenDate(normalizedText);\r\n if (parsedDate) {\r\n updates[nextMissingField] = parsedDate;\r\n }\r\n return;\r\n }\r\n\r\n if (nextMissingField === 'nat') {\r\n const nationality = extractSimpleTextValue(normalizedText);\r\n if (nationality) {\r\n updates.nat = nationality;\r\n }\r\n return;\r\n }\r\n\r\n if (nextMissingField === 'num') {\r\n const passportNumber = normalizedText.match(/\\b([A-Za-z0-9]{5,})\\b/);\r\n if (passportNumber) {\r\n updates.num = passportNumber[1].toUpperCase();\r\n }\r\n }\r\n}\r\n\r\nfunction extractSimpleNameValue(text) {\r\n const cleaned = String(text || '')\r\n .replace(\r\n /\\b(my|the|is|it's|it is|this is|name|first|last|given|family|surname)\\b/gi,\r\n ' ',\r\n )\r\n .replace(/[^A-Za-z\\s'-]/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n if (!cleaned) return '';\r\n const [firstWord] = cleaned.split(' ');\r\n return capitalizeWord(firstWord);\r\n}\r\n\r\nfunction extractSimpleTextValue(text) {\r\n const cleaned = String(text || '')\r\n .replace(/\\b(my|the|is|it's|it is|this is)\\b/gi, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n return cleaned;\r\n}\r\n\r\nfunction parseSpokenDate(value) {\r\n const text = String(value || '')\r\n .replace(/\\b(\\d{1,2})(st|nd|rd|th)\\b/gi, '$1')\r\n .replace(/,/g, ' ')\r\n .trim();\r\n if (!text) return null;\r\n\r\n const patterns = [\r\n 'd MMMM yyyy',\r\n 'd MMM yyyy',\r\n 'MMMM d yyyy',\r\n 'MMM d yyyy',\r\n 'd MMMM yy',\r\n 'd MMM yy',\r\n 'MMMM d yy',\r\n 'MMM d yy',\r\n 'yyyy-MM-dd',\r\n 'MM/dd/yyyy',\r\n 'dd/MM/yyyy',\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n const parsed = parse(text, pattern, new Date());\r\n if (!isValid(parsed)) continue;\r\n return parsed.toISOString();\r\n }\r\n\r\n const fallback = new Date(text);\r\n if (Number.isNaN(fallback.getTime())) return null;\r\n return fallback.toISOString();\r\n}\r\n\r\nfunction parseFixedTravelerInput(\r\n text,\r\n { passportRequired = false, defaultTyp = '' } = {},\r\n) {\r\n const raw = String(text || '').trim();\r\n if (!raw) return { isFixedFormat: false, isValid: false };\r\n const normalized = raw.replace(/\\|/g, ';');\r\n if (!/(traveller|traveler)/i.test(normalized) || !/[;:]/.test(normalized)) {\r\n return { isFixedFormat: false, isValid: false };\r\n }\r\n\r\n const travellerMatch = normalized.match(\r\n /\\b(?:traveller|traveler)\\s*(\\d+)\\b/i,\r\n );\r\n const travellerIndex = travellerMatch\r\n ? Math.max(Number(travellerMatch[1]) - 1, 0)\r\n : 0;\r\n\r\n const afterIndex = normalized.replace(\r\n /^\\s*(?:traveller|traveler)\\s*\\d+\\s*[:;]?\\s*/i,\r\n '',\r\n );\r\n\r\n const updates = {};\r\n let invalidDate = false;\r\n const pairs = afterIndex\r\n .split(';')\r\n .map((item) => item.trim())\r\n .filter(Boolean);\r\n\r\n pairs.forEach((pair) => {\r\n const [rawKey, ...rest] = pair.split(':');\r\n if (!rawKey || rest.length === 0) return;\r\n const key = String(rawKey || '')\r\n .trim()\r\n .toLowerCase();\r\n const value = rest.join(':').trim();\r\n if (!value) return;\r\n\r\n if (['fn', 'firstname', 'first_name'].includes(key)) {\r\n updates.fn = value;\r\n return;\r\n }\r\n if (['ln', 'lastname', 'last_name', 'surname'].includes(key)) {\r\n updates.ln = value;\r\n return;\r\n }\r\n if (['tl', 'title', 'gender'].includes(key)) {\r\n const gender = String(value).trim().toUpperCase();\r\n if (gender === 'M' || gender === 'F') updates.tl = gender;\r\n return;\r\n }\r\n if (['dob', 'dateofbirth', 'date_of_birth'].includes(key)) {\r\n const parsed = parseFlexibleDateToIso(value);\r\n if (parsed) updates.dob = parsed;\r\n else invalidDate = true;\r\n return;\r\n }\r\n if (['typ', 'type', 'travellertype', 'travelertype'].includes(key)) {\r\n const typeValue = String(value).trim().toUpperCase();\r\n if (['ADT', 'CHD', 'INF'].includes(typeValue)) updates.typ = typeValue;\r\n return;\r\n }\r\n if (['nat', 'nationality'].includes(key)) {\r\n updates.nat = value;\r\n return;\r\n }\r\n if (['num', 'passport', 'passportno', 'passportnumber'].includes(key)) {\r\n updates.num = value;\r\n return;\r\n }\r\n if (['isc', 'issuecountry', 'issue_country', 'country'].includes(key)) {\r\n updates.isc = value;\r\n return;\r\n }\r\n if (['issdt', 'issuedate', 'issue_date'].includes(key)) {\r\n const parsed = parseFlexibleDateToIso(value);\r\n if (parsed) updates.issdt = parsed;\r\n else invalidDate = true;\r\n return;\r\n }\r\n if (['expdt', 'expirydate', 'expiry_date', 'expdate'].includes(key)) {\r\n const parsed = parseFlexibleDateToIso(value);\r\n if (parsed) updates.expdt = parsed;\r\n else invalidDate = true;\r\n }\r\n });\r\n\r\n const typFallback = String(defaultTyp || '')\r\n .trim()\r\n .toUpperCase();\r\n if (!updates.typ && ['ADT', 'CHD', 'INF'].includes(typFallback)) {\r\n updates.typ = typFallback;\r\n }\r\n\r\n if (Object.keys(updates).length === 0) {\r\n return {\r\n isFixedFormat: true,\r\n isValid: false,\r\n error:\r\n 'No supported fields found. Include FN, LN, TL, DOB, and TYP at minimum.',\r\n };\r\n }\r\n\r\n const requiredFields = ['fn', 'ln', 'tl', 'dob', 'typ'];\r\n const missingRequired = requiredFields.filter((field) => !updates[field]);\r\n if (missingRequired.length > 0) {\r\n return {\r\n isFixedFormat: true,\r\n isValid: false,\r\n error: `Missing required field(s): ${missingRequired\r\n .map((item) => item.toUpperCase())\r\n .join(', ')}`,\r\n };\r\n }\r\n\r\n if (invalidDate) {\r\n return {\r\n isFixedFormat: true,\r\n isValid: false,\r\n error:\r\n 'Invalid date value. Use YYYY-MM-DD or MM/DD/YYYY for DOB/ISSDT/EXPDT.',\r\n };\r\n }\r\n\r\n if (passportRequired) {\r\n const missingPassportFields = ['nat', 'num', 'issdt', 'expdt'].filter(\r\n (field) => !updates[field],\r\n );\r\n if (missingPassportFields.length > 0) {\r\n return {\r\n isFixedFormat: true,\r\n isValid: false,\r\n error: `Passport details required: ${missingPassportFields\r\n .map((item) => item.toUpperCase())\r\n .join(', ')}`,\r\n };\r\n }\r\n }\r\n\r\n const hasTravellerToken = /(traveller|traveler)\\s*\\d+/i.test(normalized);\r\n if (!hasTravellerToken) {\r\n return {\r\n isFixedFormat: true,\r\n isValid: false,\r\n error: 'Traveller index missing. Start with TRAVELLER 1',\r\n };\r\n }\r\n\r\n return {\r\n isFixedFormat: true,\r\n isValid: true,\r\n intent: 'fill_details',\r\n travellerIndex,\r\n updates,\r\n };\r\n}\r\n\r\nfunction buildFixedTravellerFormatTemplate(passportRequired = false) {\r\n if (passportRequired) {\r\n return 'TRAVELLER 1; FN:John; LN:Doe; TL:M; DOB:1992-08-14; TYP:ADT; NAT:IN; NUM:K1234567; ISSDT:2018-01-01; EXPDT:2028-01-01';\r\n }\r\n return 'TRAVELLER 1; FN:John; LN:Doe; TL:M; DOB:1992-08-14; TYP:ADT';\r\n}\r\n\r\nfunction parseFlexibleDateToIso(value) {\r\n const text = String(value || '').trim();\r\n if (!text) return null;\r\n const patterns = [\r\n 'yyyy-MM-dd',\r\n 'MM/dd/yyyy',\r\n 'dd/MM/yyyy',\r\n 'd MMM yyyy',\r\n 'd MMMM yyyy',\r\n ];\r\n for (const pattern of patterns) {\r\n const parsed = parse(text, pattern, new Date());\r\n if (isValid(parsed)) return parsed.toISOString();\r\n }\r\n const fallback = new Date(text);\r\n if (Number.isNaN(fallback.getTime())) return null;\r\n return fallback.toISOString();\r\n}\r\n\r\nfunction formatVoiceDate(value) {\r\n const parsed = new Date(value);\r\n if (Number.isNaN(parsed.getTime())) return 'the provided date';\r\n return parsed.toLocaleDateString('en-US', {\r\n month: 'long',\r\n day: 'numeric',\r\n year: 'numeric',\r\n });\r\n}\r\n\r\nfunction capitalizeWord(value) {\r\n const text = String(value || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!text) return '';\r\n return text.charAt(0).toUpperCase() + text.slice(1);\r\n}\r\n\r\nfunction stripLeadingConnector(value) {\r\n return String(value || '')\r\n .replace(/^\\s*(?:is|as|to|=)\\s+/i, '')\r\n .trim();\r\n}\r\n\r\nfunction extractDatePhrase(value) {\r\n const text = String(value || '');\r\n if (!text.trim()) return '';\r\n const phraseMatch = text.match(\r\n /\\b\\d{1,2}(?:st|nd|rd|th)?\\s+[A-Za-z]{3,9}\\s+\\d{2,4}\\b/i,\r\n );\r\n if (phraseMatch?.[0]) return phraseMatch[0];\r\n\r\n const isoMatch = text.match(/\\b\\d{4}-\\d{2}-\\d{2}\\b/);\r\n if (isoMatch?.[0]) return isoMatch[0];\r\n\r\n const slashMatch = text.match(/\\b\\d{1,2}[/-]\\d{1,2}[/-]\\d{2,4}\\b/);\r\n if (slashMatch?.[0]) return slashMatch[0];\r\n\r\n return '';\r\n}\r\n\r\nfunction removeImmutableTravelerFields(updates = {}) {\r\n if (!updates || typeof updates !== 'object') return {};\r\n const next = { ...updates };\r\n delete next.typ;\r\n return next;\r\n}\r\n\r\nfunction parsePaymentModeFromText(text) {\r\n const lower = String(text || '').toLowerCase();\r\n if (/\\bcredit card\\b/.test(lower)) return 'CC';\r\n if (/\\bdebit card\\b/.test(lower)) return 'DC';\r\n if (/\\bnet banking\\b/.test(lower)) return 'NB';\r\n if (/\\bupi\\b/.test(lower)) return 'UP';\r\n if (/\\brazor ?pay\\b/.test(lower)) return 'RP';\r\n if (/\\bcrypto\\b/.test(lower)) return 'CR';\r\n return '';\r\n}\r\n\r\nfunction getGatewayForPaymentMode(mode) {\r\n const normalized = String(mode || '')\r\n .trim()\r\n .toUpperCase();\r\n if (normalized === 'RP') return 'Razorpay';\r\n if (normalized === 'CR') return 'Crypto';\r\n if (['CC', 'DC', 'NB', 'UP'].includes(normalized)) return 'Default';\r\n return '';\r\n}\r\n\r\nfunction getPaymentModeLabel(mode) {\r\n const normalized = String(mode || '')\r\n .trim()\r\n .toUpperCase();\r\n if (normalized === 'CC') return 'Credit Card';\r\n if (normalized === 'DC') return 'Debit Card';\r\n if (normalized === 'NB') return 'Net Banking';\r\n if (normalized === 'UP') return 'UPI';\r\n if (normalized === 'RP') return 'Pay with Razor Pay';\r\n if (normalized === 'CR') return 'Pay with Crypto';\r\n return normalized || 'payment mode';\r\n}\r\n\r\nfunction joinWithAnd(values = []) {\r\n if (values.length <= 1) return values[0] || '';\r\n if (values.length === 2) return `${values[0]} and ${values[1]}`;\r\n return `${values.slice(0, -1).join(', ')}, and ${values[values.length - 1]}`;\r\n}\r\n\r\nfunction toDisplayText(value, fallback = '') {\r\n if (typeof value === 'string') return value;\r\n if (typeof value === 'number' || typeof value === 'boolean') {\r\n return String(value);\r\n }\r\n if (value && typeof value === 'object') {\r\n const preferred = value?.message || value?.error || value?.details || value?.msg;\r\n if (preferred) return String(preferred);\r\n try {\r\n return JSON.stringify(value);\r\n } catch (error) {\r\n return fallback;\r\n }\r\n }\r\n return fallback;\r\n}\r\n\r\nexport default TravelerDetailsForm;\r\n","import React from 'react';\r\nimport { AiOutlineInfoCircle } from 'react-icons/ai';\r\nimport { BsCheckCircleFill } from 'react-icons/bs';\r\nimport './PaymentConfirmationCard.scss';\r\n\r\nfunction PaymentConfirmationCard({ confirmation }) {\r\n if (!confirmation || typeof confirmation !== 'object') {\r\n return (\r\n <p className=\"payment-confirmation__muted-text\">\r\n Confirmation details are unavailable.\r\n </p>\r\n );\r\n }\r\n\r\n const root = normalizeRootConfirmation(confirmation);\r\n const bookingId = pickFirstValue(root, ['bkid', 'bookingid', 'bookingId']);\r\n const status =\r\n pickFirstValue(root, ['bksts', 'status', 'bookingStatus']) || '-';\r\n const pnr = pickFirstValue(root, ['pnr', 'airlinePnr', 'gdsPnr']) || '-';\r\n const amount = pickFirstValue(root, ['trps.pr.tf', 'tf', 'amount', 'amt']);\r\n const currency = pickFirstValue(root, ['cur', 'currency']) || 'INR';\r\n const flightImagesBaseUrl =\r\n process.env.REACT_APP_FLIGHT_IMAGES || process.env.FLIGHT_IMAGES || '';\r\n\r\n const travellers = extractTravellers(root);\r\n const sectors = extractSectors(root);\r\n const returnSectors = extractReturnSectors(root);\r\n const styp = getTripStyle(root);\r\n const tt = getTripType(root);\r\n const isRoundTrip = isRoundTripBooking(root, returnSectors);\r\n const contact = extractContact(root);\r\n const bookingMessage = getBookingMessage(status);\r\n const statusTagClass = getStatusTagClass(status);\r\n\r\n return (\r\n <div className=\"payment-confirmation\">\r\n {bookingMessage ? (\r\n <div\r\n className={`payment-confirmation__banner ${bookingMessage.bannerClass}`}\r\n >\r\n <div className=\"payment-confirmation__banner-icon\">\r\n {String(status || '')\r\n .toLowerCase()\r\n .includes('confirm') ? (\r\n <BsCheckCircleFill />\r\n ) : (\r\n <AiOutlineInfoCircle />\r\n )}\r\n </div>\r\n <div className=\"payment-confirmation__banner-content\">\r\n <div className=\"payment-confirmation__banner-title\">\r\n {bookingMessage.title}\r\n </div>\r\n <div className=\"payment-confirmation__banner-text\">\r\n {bookingMessage.text}\r\n </div>\r\n </div>\r\n </div>\r\n ) : null}\r\n\r\n <h3 className=\"payment-confirmation__summary-header\">Booking details</h3>\r\n <p className=\"payment-confirmation__summary-subtext\">\r\n Flight itinerary and traveler details for this booking\r\n </p>\r\n {isRoundTrip ? (\r\n <div className=\"payment-confirmation__roundtrip-badge\">\r\n Round Trip Confirmed ({styp || 'combined'} / TT {tt || 2})\r\n </div>\r\n ) : null}\r\n\r\n <div className=\"payment-confirmation__details-list\">\r\n <MetaLine label=\"Booking ID\" value={bookingId || '-'} />\r\n <MetaLine\r\n label=\"Status\"\r\n value={status || '-'}\r\n valueClassName={statusTagClass}\r\n valueAsTag\r\n />\r\n <MetaLine label=\"PNR\" value={pnr} />\r\n <MetaLine\r\n label=\"Total\"\r\n value={\r\n amount !== '' ? `${currency} ${toNumber(amount).toFixed(2)}` : '-'\r\n }\r\n />\r\n </div>\r\n\r\n <div className=\"payment-confirmation__itinerary-card\">\r\n <p className=\"payment-confirmation__info-title\">Flight Details</p>\r\n <p className=\"payment-confirmation__info-subtext\">\r\n Itinerary and fare details for this booking\r\n </p>\r\n <div className=\"payment-confirmation__trip-label\">Onward Flight</div>\r\n\r\n {sectors.length ? (\r\n sectors.map((sector, index) => {\r\n const airlineLogo = buildAirlineLogoUrl(\r\n flightImagesBaseUrl,\r\n sector.airlineCode,\r\n );\r\n return (\r\n <div\r\n key={`${sector.from}-${sector.to}-${index}`}\r\n className=\"payment-confirmation__sector-block\"\r\n >\r\n <div className=\"payment-confirmation__route-title\">\r\n {sector.from || 'N/A'} {'\\u2192'} {sector.to || 'N/A'}\r\n </div>\r\n\r\n <div className=\"payment-confirmation__leg-grid\">\r\n <div className=\"payment-confirmation__airline-col\">\r\n {airlineLogo ? (\r\n <img\r\n src={airlineLogo}\r\n alt={sector.airlineName}\r\n className=\"payment-confirmation__logo-image\"\r\n onError={(e) => {\r\n e.currentTarget.style.display = 'none';\r\n }}\r\n />\r\n ) : (\r\n <div className=\"payment-confirmation__logo-badge\">\r\n {(sector.airlineCode || sector.airlineName || 'FL')\r\n .slice(0, 2)\r\n .toUpperCase()}\r\n </div>\r\n )}\r\n <div className=\"payment-confirmation__airline-text\">\r\n {sector.airlineName || '-'}\r\n </div>\r\n <div className=\"payment-confirmation__flight-code\">\r\n {sector.flightNumber || '-'}\r\n </div>\r\n </div>\r\n\r\n <div className=\"payment-confirmation__time-col\">\r\n <div className=\"payment-confirmation__date-text\">\r\n {toFriendlyDate(sector.departureDate)}\r\n </div>\r\n <div className=\"payment-confirmation__time-text\">\r\n {safeTime(sector.departureTime)}\r\n </div>\r\n <div className=\"payment-confirmation__airport-text\">\r\n {sector.from || '-'}\r\n </div>\r\n </div>\r\n\r\n <div className=\"payment-confirmation__mid-col\">\r\n <div className=\"payment-confirmation__duration-text\">\r\n {sector.duration || 'N/A'}\r\n </div>\r\n <div className=\"payment-confirmation__line-wrap\">\r\n <span className=\"payment-confirmation__dot\" />\r\n <span className=\"payment-confirmation__line\" />\r\n <span className=\"payment-confirmation__dot\" />\r\n </div>\r\n <div className=\"payment-confirmation__stop-text\">\r\n {sector.stopLabel}\r\n </div>\r\n </div>\r\n\r\n <div className=\"payment-confirmation__time-col-right\">\r\n <div className=\"payment-confirmation__date-text\">\r\n {toFriendlyDate(sector.arrivalDate)}\r\n </div>\r\n <div className=\"payment-confirmation__time-text\">\r\n {safeTime(sector.arrivalTime)}\r\n </div>\r\n <div className=\"payment-confirmation__airport-text\">\r\n {sector.to || '-'}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })\r\n ) : (\r\n <div className=\"payment-confirmation__muted-text\">\r\n Flight details unavailable.\r\n </div>\r\n )}\r\n\r\n {isRoundTrip ? (\r\n <>\r\n <div className=\"payment-confirmation__trip-label\">\r\n Return Flight\r\n </div>\r\n {returnSectors.length ? (\r\n returnSectors.map((sector, index) => {\r\n const airlineLogo = buildAirlineLogoUrl(\r\n flightImagesBaseUrl,\r\n sector.airlineCode,\r\n );\r\n return (\r\n <div\r\n key={`${sector.from}-${sector.to}-return-${index}`}\r\n className=\"payment-confirmation__sector-block\"\r\n >\r\n <div className=\"payment-confirmation__route-title\">\r\n {sector.from || 'N/A'} {'\\u2192'} {sector.to || 'N/A'}\r\n </div>\r\n\r\n <div className=\"payment-confirmation__leg-grid\">\r\n <div className=\"payment-confirmation__airline-col\">\r\n {airlineLogo ? (\r\n <img\r\n src={airlineLogo}\r\n alt={sector.airlineName}\r\n className=\"payment-confirmation__logo-image\"\r\n onError={(e) => {\r\n e.currentTarget.style.display = 'none';\r\n }}\r\n />\r\n ) : (\r\n <div className=\"payment-confirmation__logo-badge\">\r\n {(sector.airlineCode || sector.airlineName || 'FL')\r\n .slice(0, 2)\r\n .toUpperCase()}\r\n </div>\r\n )}\r\n <div className=\"payment-confirmation__airline-text\">\r\n {sector.airlineName || '-'}\r\n </div>\r\n <div className=\"payment-confirmation__flight-code\">\r\n {sector.flightNumber || '-'}\r\n </div>\r\n </div>\r\n\r\n <div className=\"payment-confirmation__time-col\">\r\n <div className=\"payment-confirmation__date-text\">\r\n {toFriendlyDate(sector.departureDate)}\r\n </div>\r\n <div className=\"payment-confirmation__time-text\">\r\n {safeTime(sector.departureTime)}\r\n </div>\r\n <div className=\"payment-confirmation__airport-text\">\r\n {sector.from || '-'}\r\n </div>\r\n </div>\r\n\r\n <div className=\"payment-confirmation__mid-col\">\r\n <div className=\"payment-confirmation__duration-text\">\r\n {sector.duration || 'N/A'}\r\n </div>\r\n <div className=\"payment-confirmation__line-wrap\">\r\n <span className=\"payment-confirmation__dot\" />\r\n <span className=\"payment-confirmation__line\" />\r\n <span className=\"payment-confirmation__dot\" />\r\n </div>\r\n <div className=\"payment-confirmation__stop-text\">\r\n {sector.stopLabel}\r\n </div>\r\n </div>\r\n\r\n <div className=\"payment-confirmation__time-col-right\">\r\n <div className=\"payment-confirmation__date-text\">\r\n {toFriendlyDate(sector.arrivalDate)}\r\n </div>\r\n <div className=\"payment-confirmation__time-text\">\r\n {safeTime(sector.arrivalTime)}\r\n </div>\r\n <div className=\"payment-confirmation__airport-text\">\r\n {sector.to || '-'}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })\r\n ) : (\r\n <div className=\"payment-confirmation__muted-text\">\r\n Return flight details unavailable.\r\n </div>\r\n )}\r\n </>\r\n ) : null}\r\n </div>\r\n\r\n <div className=\"payment-confirmation__info-card\">\r\n <h4 className=\"payment-confirmation__info-title\">Traveler Details</h4>\r\n <p className=\"payment-confirmation__info-subtext\">\r\n Travelers booked on this trip\r\n </p>\r\n <div className=\"payment-confirmation__inner-panel\">\r\n {travellers.length ? (\r\n travellers.map((traveller, index) => (\r\n <div\r\n key={`traveler-${index}`}\r\n className=\"payment-confirmation__traveler-block\"\r\n >\r\n <div className=\"payment-confirmation__traveler-name\">\r\n {[traveller?.fn, traveller?.ln].filter(Boolean).join(' ') ||\r\n 'Traveler'}\r\n </div>\r\n <div className=\"payment-confirmation__traveler-grid\">\r\n <DetailItem\r\n label=\"Date of Birth\"\r\n value={toDisplayDate(traveller?.dob)}\r\n />\r\n <DetailItem\r\n label=\"Gender\"\r\n value={toGenderLabel(traveller?.tl)}\r\n />\r\n <DetailItem\r\n label=\"Nationality\"\r\n value={traveller?.nat || '-'}\r\n />\r\n <DetailItem\r\n label=\"Passport No.\"\r\n value={traveller?.num || '-'}\r\n />\r\n <DetailItem\r\n label=\"Issue Date\"\r\n value={toDisplayDate(traveller?.issdt)}\r\n />\r\n <DetailItem\r\n label=\"Expiry Date\"\r\n value={toDisplayDate(traveller?.expdt)}\r\n />\r\n </div>\r\n </div>\r\n ))\r\n ) : (\r\n <div className=\"payment-confirmation__muted-text\">\r\n No traveler details available.\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"payment-confirmation__info-card\">\r\n <h4 className=\"payment-confirmation__info-title\">Contact Details</h4>\r\n <p className=\"payment-confirmation__info-subtext\">\r\n Booking details and flight information will be sent here\r\n </p>\r\n <div className=\"payment-confirmation__inner-panel\">\r\n <div className=\"payment-confirmation__contact-grid\">\r\n <DetailItem label=\"Email\" value={contact.email || '-'} />\r\n <DetailItem label=\"Phone Number\" value={contact.phone || '-'} />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction normalizeRootConfirmation(confirmation) {\r\n if (confirmation?.payload && typeof confirmation.payload === 'object') {\r\n return confirmation.payload;\r\n }\r\n return confirmation;\r\n}\r\n\r\nfunction getBookingMessage(bksts) {\r\n const status = String(bksts || '').trim();\r\n if (!status) return null;\r\n\r\n if (status === 'Partially Confirmed') {\r\n return {\r\n bannerClass: 'payment-confirmation__banner--warning',\r\n title: 'Thank you, your booking is Partially Confirmed!',\r\n text: 'Your booking is currently in partially confirmed state.',\r\n };\r\n }\r\n\r\n if (status === 'Confirmed') {\r\n return {\r\n bannerClass: 'payment-confirmation__banner--success',\r\n title: 'Thank you, your booking is complete!',\r\n text: 'The booking confirmation has been sent to your email address.',\r\n };\r\n }\r\n\r\n if (status === 'Requested') {\r\n return {\r\n bannerClass: 'payment-confirmation__banner--warning',\r\n title:\r\n 'Your booking is currently being processed and may take up to 30 minutes for confirmation.',\r\n text: 'If the selected seats are unavailable or the fare is no longer applicable, your payment will be refunded to your online payment method. Please do not attempt to rebook during this time.',\r\n };\r\n }\r\n\r\n return {\r\n bannerClass: 'payment-confirmation__banner--info',\r\n title: 'Your booking is currently in a pending state.',\r\n text: 'We are checking the availability of the selected seats and you can expect an update from us within the next 15 minutes.',\r\n };\r\n}\r\n\r\nfunction pickFirstValue(source, keys = []) {\r\n if (!source || typeof source !== 'object' || !Array.isArray(keys)) return '';\r\n for (const key of keys) {\r\n if (key.includes('.')) {\r\n const deepValue = deepGet(source, key);\r\n if (isMeaningfulValue(deepValue)) return deepValue;\r\n continue;\r\n }\r\n const direct = source?.[key];\r\n if (isMeaningfulValue(direct)) return direct;\r\n }\r\n for (const key of keys) {\r\n const nested = deepFindKey(source, key);\r\n if (isMeaningfulValue(nested)) return nested;\r\n }\r\n return '';\r\n}\r\n\r\nfunction deepGet(source, path) {\r\n return String(path || '')\r\n .split('.')\r\n .reduce((acc, part) => {\r\n if (!acc || typeof acc !== 'object') return undefined;\r\n return acc?.[part];\r\n }, source);\r\n}\r\n\r\nfunction deepFindKey(source, targetKey) {\r\n if (!source || typeof source !== 'object') return '';\r\n if (Object.prototype.hasOwnProperty.call(source, targetKey)) {\r\n return source[targetKey];\r\n }\r\n for (const value of Object.values(source)) {\r\n if (!value || typeof value !== 'object') continue;\r\n const nested = deepFindKey(value, targetKey);\r\n if (isMeaningfulValue(nested)) return nested;\r\n }\r\n return '';\r\n}\r\n\r\nfunction isMeaningfulValue(value) {\r\n if (value === null || value === undefined) return false;\r\n if (typeof value === 'string') return Boolean(value.trim());\r\n return true;\r\n}\r\n\r\nfunction extractTravellers(source) {\r\n const candidates = [\r\n source?.trvlrs,\r\n source?.travellers,\r\n source?.travelerDetails,\r\n source?.pax,\r\n source?.passengers,\r\n source?.bkdtls?.trvlrs,\r\n source?.bkdtls?.travellers,\r\n ];\r\n for (const list of candidates) {\r\n if (Array.isArray(list) && list.length) return list;\r\n }\r\n return [];\r\n}\r\n\r\nfunction extractSectors(source) {\r\n const firstDep = Array.isArray(source?.trps?.deps)\r\n ? source.trps.deps[0]\r\n : source?.trps?.deps;\r\n const segments = firstDep?.seg;\r\n if (Array.isArray(segments) && segments.length) {\r\n return segments.map((seg) => ({\r\n from: String(seg?.da || '').trim(),\r\n to: String(seg?.ar || '').trim(),\r\n airlineName: String(seg?.ma || seg?.ac || '').trim() || 'Airline',\r\n airlineCode: String(seg?.ac || seg?.ma || '').trim(),\r\n flightNumber: String(seg?.fn || '').trim(),\r\n departureDate: String(seg?.dd || '').trim(),\r\n departureTime: String(seg?.dt || '').trim(),\r\n arrivalDate: String(seg?.ad || '').trim(),\r\n arrivalTime: String(seg?.at || '').trim(),\r\n duration: String(seg?.fdur || '').trim(),\r\n stopLabel: formatStopLabel(seg?.st),\r\n }));\r\n }\r\n return [];\r\n}\r\n\r\nfunction extractReturnSectors(source) {\r\n const firstRtDep = Array.isArray(source?.rttrps?.deps)\r\n ? source.rttrps.deps[0]\r\n : source?.rttrps?.deps;\r\n const firstArr = Array.isArray(source?.trps?.arrs)\r\n ? source.trps.arrs[0]\r\n : source?.trps?.arrs;\r\n const segments = firstRtDep?.seg || firstArr?.seg;\r\n if (Array.isArray(segments) && segments.length) {\r\n return segments.map((seg) => ({\r\n from: String(seg?.da || '').trim(),\r\n to: String(seg?.ar || '').trim(),\r\n airlineName: String(seg?.ma || seg?.ac || '').trim() || 'Airline',\r\n airlineCode: String(seg?.ac || seg?.ma || '').trim(),\r\n flightNumber: String(seg?.fn || '').trim(),\r\n departureDate: String(seg?.dd || '').trim(),\r\n departureTime: String(seg?.dt || '').trim(),\r\n arrivalDate: String(seg?.ad || '').trim(),\r\n arrivalTime: String(seg?.at || '').trim(),\r\n duration: String(seg?.fdur || '').trim(),\r\n stopLabel: formatStopLabel(seg?.st),\r\n }));\r\n }\r\n return [];\r\n}\r\n\r\nfunction isRoundTripBooking(source, returnSectors = []) {\r\n if (getTripType(source) === 2) return true;\r\n return Array.isArray(returnSectors) && returnSectors.length > 0;\r\n}\r\n\r\nfunction getTripType(source) {\r\n return Number(source?.tt || 0);\r\n}\r\n\r\nfunction getTripStyle(source) {\r\n return String(source?.styp || '')\r\n .trim()\r\n .toLowerCase();\r\n}\r\n\r\nfunction extractContact(source) {\r\n return {\r\n email: pickFirstValue(source, ['em', 'email']),\r\n phone: pickFirstValue(source, ['ph', 'phone', 'mobile']),\r\n };\r\n}\r\n\r\nfunction toNumber(value) {\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? parsed : 0;\r\n}\r\n\r\nfunction safeTime(value) {\r\n return String(value || '').trim() || '--:--';\r\n}\r\n\r\nfunction formatStopLabel(rawStops) {\r\n const stops = Number(rawStops);\r\n if (!Number.isFinite(stops) || stops <= 0) return 'Non-stop';\r\n if (stops === 1) return '1 stop';\r\n return `${stops} stops`;\r\n}\r\n\r\nfunction toFriendlyDate(value) {\r\n const raw = String(value || '').trim();\r\n if (!raw) return '';\r\n const parts = raw.split('-');\r\n if (parts.length === 3) {\r\n const [dd, mm, yyyy] = parts;\r\n const date = new Date(`${yyyy}-${mm}-${dd}`);\r\n if (!Number.isNaN(date.getTime())) {\r\n return date.toLocaleDateString('en-US', {\r\n weekday: 'short',\r\n day: '2-digit',\r\n month: 'short',\r\n });\r\n }\r\n }\r\n return raw;\r\n}\r\n\r\nfunction toDisplayDate(value) {\r\n const raw = String(value || '').trim();\r\n if (!raw) return '-';\r\n const parsed = new Date(raw);\r\n if (Number.isNaN(parsed.getTime())) return raw;\r\n const dd = String(parsed.getDate()).padStart(2, '0');\r\n const mm = String(parsed.getMonth() + 1).padStart(2, '0');\r\n const yyyy = parsed.getFullYear();\r\n return `${dd}/${mm}/${yyyy}`;\r\n}\r\n\r\nfunction toGenderLabel(value) {\r\n const gender = String(value || '').toUpperCase();\r\n if (gender === 'M') return 'M';\r\n if (gender === 'F') return 'F';\r\n return '-';\r\n}\r\n\r\nfunction buildAirlineLogoUrl(baseUrl, airlineCode) {\r\n const safeCode = String(airlineCode || '')\r\n .trim()\r\n .toUpperCase();\r\n if (!baseUrl || !safeCode) return '';\r\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;\r\n return `${normalizedBase}${safeCode}.png`;\r\n}\r\n\r\nfunction getStatusTagClass(statusValue) {\r\n const normalized = String(statusValue || '')\r\n .trim()\r\n .toLowerCase();\r\n\r\n if (!normalized) return '';\r\n if (normalized.includes('confirm'))\r\n return 'payment-confirmation__meta-value--success';\r\n if (normalized.includes('request') || normalized.includes('partial')) {\r\n return 'payment-confirmation__meta-value--warning';\r\n }\r\n if (\r\n normalized.includes('cancel') ||\r\n normalized.includes('fail') ||\r\n normalized.includes('reject') ||\r\n normalized.includes('void')\r\n ) {\r\n return 'payment-confirmation__meta-value--danger';\r\n }\r\n return 'payment-confirmation__meta-value--info';\r\n}\r\n\r\nfunction MetaLine({\r\n label,\r\n value,\r\n className = '',\r\n valueClassName = '',\r\n valueAsTag = false,\r\n}) {\r\n const lineClass = className\r\n ? `payment-confirmation__meta-line ${className}`\r\n : 'payment-confirmation__meta-line';\r\n const valueClass = valueAsTag\r\n ? `payment-confirmation__meta-value payment-confirmation__meta-value-tag ${valueClassName}`.trim()\r\n : `payment-confirmation__meta-value ${valueClassName}`.trim();\r\n return (\r\n <div className={lineClass}>\r\n <div className=\"payment-confirmation__meta-label\">{label}</div>\r\n <div className={valueClass}>{value}</div>\r\n </div>\r\n );\r\n}\r\n\r\n// Backward-compatible alias for any stale hot-reload references.\r\nfunction MetaPill(props) {\r\n return <MetaLine {...props} />;\r\n}\r\n\r\nfunction DetailItem({ label, value }) {\r\n return (\r\n <div className=\"payment-confirmation__detail-item\">\r\n <div className=\"payment-confirmation__detail-label\">{label}</div>\r\n <div className=\"payment-confirmation__detail-value\">{value || '-'}</div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default PaymentConfirmationCard;\r\n","import React from 'react';\r\n\r\nfunction FlightSummary({\r\n payload,\r\n prebookResponse,\r\n convenienceFee = 0,\r\n appliedPromocode = null,\r\n promocodeDiscount = null,\r\n}) {\r\n if (!payload) return null;\r\n\r\n const currency = getCurrency(prebookResponse, payload);\r\n const fareInfo = getFareInfo(\r\n prebookResponse,\r\n payload,\r\n convenienceFee,\r\n promocodeDiscount,\r\n );\r\n const sectors = getSectors(payload);\r\n const returnSectors = getReturnSectors(payload);\r\n const styp = getTripStyle(payload, prebookResponse);\r\n const tt = getTripType(payload, prebookResponse);\r\n const isRoundTrip = isRoundTripTrip(payload, prebookResponse);\r\n const airlineName =\r\n payload?.selectedFlight?.airlineName || 'Selected Airline';\r\n const airlineCode = payload?.selectedFlight?.airlineCode || '';\r\n const returnAirlineName =\r\n payload?.selectedReturnFlight?.airlineName || airlineName;\r\n const returnAirlineCode =\r\n payload?.selectedReturnFlight?.airlineCode || airlineCode;\r\n const flightImagesBaseUrl =\r\n process.env.REACT_APP_FLIGHT_IMAGES || process.env.FLIGHT_IMAGES || '';\r\n const airlineLogo = buildAirlineLogoUrl(flightImagesBaseUrl, airlineCode);\r\n const returnAirlineLogo = buildAirlineLogoUrl(\r\n flightImagesBaseUrl,\r\n returnAirlineCode,\r\n );\r\n\r\n return (\r\n <div className=\"flight-summary\">\r\n <h3 className=\"flight-summary__summary-header\">Flight & Fare Details</h3>\r\n <p className=\"flight-summary__summary-subtext\">\r\n Itinerary and fare breakdown for this trip\r\n </p>\r\n {isRoundTrip ? (\r\n <div className=\"flight-summary__roundtrip-badge\">\r\n Round Trip Confirmed ({styp || 'combined'} / TT {tt || 2})\r\n </div>\r\n ) : null}\r\n\r\n <div className=\"flight-summary__itinerary-card\">\r\n <div className=\"flight-summary__trip-label\">Onward Flight</div>\r\n {sectors.length ? (\r\n sectors.map((sector, index) => (\r\n <div\r\n key={`${sector.from}-${sector.to}-${index}`}\r\n className=\"flight-summary__sector-block\"\r\n >\r\n <div className=\"flight-summary__route-title\">\r\n {sector.from || 'N/A'} {'\\u2192'} {sector.to || 'N/A'}\r\n </div>\r\n <div className=\"flight-summary__leg-grid\">\r\n <div className=\"flight-summary__airline-col\">\r\n {airlineLogo ? (\r\n <img\r\n src={airlineLogo}\r\n alt={airlineName}\r\n className=\"flight-summary__logo-image\"\r\n onError={(e) => {\r\n e.currentTarget.style.display = 'none';\r\n }}\r\n />\r\n ) : (\r\n <div className=\"flight-summary__logo-badge\">\r\n {(airlineCode || airlineName).slice(0, 2).toUpperCase()}\r\n </div>\r\n )}\r\n <div className=\"flight-summary__airline-text\">\r\n {airlineName}\r\n </div>\r\n <div className=\"flight-summary__flight-code\">\r\n {sector.flightNumber || '-'}\r\n </div>\r\n </div>\r\n\r\n <div className=\"flight-summary__time-col\">\r\n <div className=\"flight-summary__date-text\">\r\n {toFriendlyDate(sector.departureDate)}\r\n </div>\r\n <div className=\"flight-summary__time-text\">\r\n {safeTime(sector.departureTime)}\r\n </div>\r\n <div className=\"flight-summary__airport-text\">\r\n {sector.from || '-'}\r\n </div>\r\n </div>\r\n\r\n <div className=\"flight-summary__mid-col\">\r\n <div className=\"flight-summary__duration-text\">\r\n {sector.duration || 'N/A'}\r\n </div>\r\n <div className=\"flight-summary__line-wrap\">\r\n <span className=\"flight-summary__dot\" />\r\n <span className=\"flight-summary__line\" />\r\n <span className=\"flight-summary__dot\" />\r\n </div>\r\n <div className=\"flight-summary__stop-text\">\r\n {sector.stops === 0\r\n ? 'Non Stop'\r\n : `${sector.stops} stop${sector.stops > 1 ? 's' : ''}`}\r\n </div>\r\n </div>\r\n\r\n <div className=\"flight-summary__time-col-right\">\r\n <div className=\"flight-summary__date-text\">\r\n {toFriendlyDate(sector.arrivalDate || sector.departureDate)}\r\n </div>\r\n <div className=\"flight-summary__time-text\">\r\n {safeTime(sector.arrivalTime)}\r\n </div>\r\n <div className=\"flight-summary__airport-text\">\r\n {sector.to || '-'}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n ))\r\n ) : (\r\n <div className=\"flight-summary__muted-text\">\r\n Flight details unavailable.\r\n </div>\r\n )}\r\n\r\n {isRoundTrip ? (\r\n <>\r\n <div className=\"flight-summary__trip-label\">Return Flight</div>\r\n {returnSectors.length ? (\r\n returnSectors.map((sector, index) => (\r\n <div\r\n key={`${sector.from}-${sector.to}-return-${index}`}\r\n className=\"flight-summary__sector-block\"\r\n >\r\n <div className=\"flight-summary__route-title\">\r\n {sector.from || 'N/A'} {'\\u2192'} {sector.to || 'N/A'}\r\n </div>\r\n\r\n <div className=\"flight-summary__leg-grid\">\r\n <div className=\"flight-summary__airline-col\">\r\n {returnAirlineLogo ? (\r\n <img\r\n src={returnAirlineLogo}\r\n alt={returnAirlineName}\r\n className=\"flight-summary__logo-image\"\r\n onError={(e) => {\r\n e.currentTarget.style.display = 'none';\r\n }}\r\n />\r\n ) : (\r\n <div className=\"flight-summary__logo-badge\">\r\n {(returnAirlineCode || returnAirlineName)\r\n .slice(0, 2)\r\n .toUpperCase()}\r\n </div>\r\n )}\r\n <div className=\"flight-summary__airline-text\">\r\n {returnAirlineName}\r\n </div>\r\n <div className=\"flight-summary__flight-code\">\r\n {sector.flightNumber || '-'}\r\n </div>\r\n </div>\r\n\r\n <div className=\"flight-summary__time-col\">\r\n <div className=\"flight-summary__date-text\">\r\n {toFriendlyDate(sector.departureDate)}\r\n </div>\r\n <div className=\"flight-summary__time-text\">\r\n {safeTime(sector.departureTime)}\r\n </div>\r\n <div className=\"flight-summary__airport-text\">\r\n {sector.from || '-'}\r\n </div>\r\n </div>\r\n\r\n <div className=\"flight-summary__mid-col\">\r\n <div className=\"flight-summary__duration-text\">\r\n {sector.duration || 'N/A'}\r\n </div>\r\n <div className=\"flight-summary__line-wrap\">\r\n <span className=\"flight-summary__dot\" />\r\n <span className=\"flight-summary__line\" />\r\n <span className=\"flight-summary__dot\" />\r\n </div>\r\n <div className=\"flight-summary__stop-text\">\r\n {sector.stops === 0\r\n ? 'Non Stop'\r\n : `${sector.stops} stop${sector.stops > 1 ? 's' : ''}`}\r\n </div>\r\n </div>\r\n\r\n <div className=\"flight-summary__time-col-right\">\r\n <div className=\"flight-summary__date-text\">\r\n {toFriendlyDate(\r\n sector.arrivalDate || sector.departureDate,\r\n )}\r\n </div>\r\n <div className=\"flight-summary__time-text\">\r\n {safeTime(sector.arrivalTime)}\r\n </div>\r\n <div className=\"flight-summary__airport-text\">\r\n {sector.to || '-'}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n ))\r\n ) : (\r\n <div className=\"flight-summary__muted-text\">\r\n Return flight details unavailable.\r\n </div>\r\n )}\r\n </>\r\n ) : null}\r\n </div>\r\n\r\n <div className=\"flight-summary__fare-card\">\r\n <h4 className=\"flight-summary__fare-title\">Fare Summary</h4>\r\n <FareRow\r\n label=\"Base Fare\"\r\n value={formatMoney(fareInfo.baseFare, currency)}\r\n />\r\n <FareRow\r\n label=\"Convenience Fee\"\r\n value={formatMoney(fareInfo.convenienceFee, currency)}\r\n />\r\n <FareRow\r\n label=\"Fees & Surcharges\"\r\n value={formatMoney(fareInfo.feesAndSurcharges, currency)}\r\n />\r\n {promocodeDiscount ? (\r\n <div className=\"flight-summary__fare-row flight-summary__fare-row--discount\">\r\n <span className=\"flight-summary__fare-row-label\">\r\n Promo Discount ({appliedPromocode})\r\n </span>\r\n <span className=\"flight-summary__fare-row-value\">\r\n -\r\n {formatMoney(\r\n toNumber(promocodeDiscount.ondis) +\r\n toNumber(promocodeDiscount.rtdis),\r\n currency,\r\n )}\r\n </span>\r\n </div>\r\n ) : null}\r\n <div className=\"flight-summary__total-row\">\r\n <span className=\"flight-summary__total-label\">Total Payable</span>\r\n <span className=\"flight-summary__total-value\">\r\n {formatMoney(fareInfo.totalPayable, currency)}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <div className=\"flight-summary__info-card\">\r\n <h4 className=\"flight-summary__info-title\">Traveler Details</h4>\r\n <p className=\"flight-summary__info-subtext\">\r\n Travelers booked on this trip\r\n </p>\r\n <div className=\"flight-summary__inner-panel\">\r\n {Array.isArray(payload?.trvlrs) && payload.trvlrs.length > 0 ? (\r\n payload.trvlrs.map((traveler, idx) => (\r\n <div\r\n key={`traveler-${idx}`}\r\n className=\"flight-summary__traveler-block\"\r\n >\r\n <div className=\"flight-summary__traveler-name\">\r\n {[traveler?.fn, traveler?.ln].filter(Boolean).join(' ') ||\r\n 'Traveler'}\r\n </div>\r\n <div className=\"flight-summary__traveler-grid\">\r\n <DetailItem\r\n label=\"Date of Birth\"\r\n value={toDisplayDate(traveler?.dob)}\r\n />\r\n <DetailItem\r\n label=\"Gender\"\r\n value={toGenderLabel(traveler?.tl)}\r\n />\r\n <DetailItem\r\n label=\"Nationality\"\r\n value={traveler?.nat || '-'}\r\n />\r\n <DetailItem\r\n label=\"Passport No.\"\r\n value={traveler?.num || '-'}\r\n />\r\n <DetailItem\r\n label=\"Issue Date\"\r\n value={toDisplayDate(traveler?.issdt)}\r\n />\r\n <DetailItem\r\n label=\"Expiry Date\"\r\n value={toDisplayDate(traveler?.expdt)}\r\n />\r\n </div>\r\n </div>\r\n ))\r\n ) : (\r\n <div className=\"flight-summary__muted-text\">\r\n No traveler details available.\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"flight-summary__info-card\">\r\n <h4 className=\"flight-summary__info-title\">Contact Details</h4>\r\n <p className=\"flight-summary__info-subtext\">\r\n Booking details and flight information will be sent here\r\n </p>\r\n <div className=\"flight-summary__inner-panel\">\r\n <div className=\"flight-summary__contact-grid\">\r\n <DetailItem label=\"Email\" value={payload?.em || '-'} />\r\n <DetailItem label=\"Phone Number\" value={payload?.ph || '-'} />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction FareRow({ label, value }) {\r\n return (\r\n <div className=\"flight-summary__fare-row\">\r\n <span className=\"flight-summary__fare-row-label\">{label}</span>\r\n <span className=\"flight-summary__fare-row-value\">{value}</span>\r\n </div>\r\n );\r\n}\r\n\r\nfunction DetailItem({ label, value }) {\r\n return (\r\n <div className=\"flight-summary__detail-item\">\r\n <div className=\"flight-summary__detail-label\">{label}</div>\r\n <div className=\"flight-summary__detail-value\">{value || '-'}</div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction getCurrency(prebookResponse, payload) {\r\n return (\r\n payload?.selectedFlight?.fare?.currency ||\r\n prebookResponse?.payload?.cur ||\r\n prebookResponse?.payload?.currency ||\r\n payload?.cur ||\r\n 'INR'\r\n );\r\n}\r\n\r\nfunction toNumber(value) {\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? parsed : 0;\r\n}\r\n\r\nfunction getFareInfo(\r\n prebookResponse,\r\n payload,\r\n convenienceFee = 0,\r\n promocodeDiscount = null,\r\n) {\r\n const data = prebookResponse?.payload || prebookResponse || {};\r\n const trps = data?.trps;\r\n const onwardTrip = Array.isArray(trps) ? trps[0] || {} : trps || {};\r\n const roundTrip = data?.rttrps || null;\r\n const payloadOnwardFare = payload?.selectedFlight?.fare || {};\r\n const payloadReturnFare = payload?.selectedReturnFlight?.fare || {};\r\n\r\n const adt = toNumber(data?.adt);\r\n const chd = toNumber(data?.chd);\r\n const inf = toNumber(data?.inf);\r\n\r\n const onwardTripPaxBase = getPaxBaseTotal(onwardTrip?.paxpr, { adt, chd, inf });\r\n const roundTripPaxBase = getPaxBaseTotal(roundTrip?.paxpr, { adt, chd, inf });\r\n const baseFareFromPax = onwardTripPaxBase + roundTripPaxBase;\r\n\r\n const baseFareFromTrip =\r\n toNumber(onwardTrip?.pr?.bf) + toNumber(roundTrip?.pr?.bf);\r\n\r\n const payloadBaseFare =\r\n toNumber(payloadOnwardFare?.baseFare) +\r\n toNumber(payloadReturnFare?.baseFare);\r\n const baseFare = baseFareFromPax || baseFareFromTrip || payloadBaseFare;\r\n\r\n const onwardTripTax = sumTaxes(onwardTrip?.pr?.taxs);\r\n const roundTripTax = sumTaxes(roundTrip?.pr?.taxs);\r\n const breakupTaxTotal =\r\n toNumber(payload?.fareBreakup?.onwardTax) +\r\n toNumber(payload?.fareBreakup?.returnTax);\r\n const pureTaxTotal = Math.max(onwardTripTax + roundTripTax, breakupTaxTotal);\r\n\r\n const onwardTripTotalFare = toNumber(onwardTrip?.pr?.tf);\r\n const roundTripTotalFare = toNumber(roundTrip?.pr?.tf);\r\n const totalFare = onwardTripTotalFare + roundTripTotalFare;\r\n const payloadTotalFare =\r\n toNumber(payloadOnwardFare?.totalFare) +\r\n toNumber(payloadReturnFare?.totalFare);\r\n\r\n const normalizedConvenienceFee = toNumber(convenienceFee);\r\n const feesAndSurcharges = pureTaxTotal;\r\n const supplierCombinedTotal = totalFare || payloadTotalFare;\r\n\r\n const discountAmount = promocodeDiscount\r\n ? toNumber(promocodeDiscount.ondis) + toNumber(promocodeDiscount.rtdis)\r\n : 0;\r\n\r\n const totalPayable = supplierCombinedTotal\r\n ? supplierCombinedTotal + normalizedConvenienceFee - discountAmount\r\n : baseFare +\r\n feesAndSurcharges +\r\n normalizedConvenienceFee -\r\n discountAmount;\r\n\r\n return {\r\n baseFare,\r\n convenienceFee: normalizedConvenienceFee,\r\n feesAndSurcharges,\r\n totalPayable,\r\n discountAmount,\r\n };\r\n}\r\n\r\nfunction getPaxBaseTotal(paxPrices, counts) {\r\n if (!Array.isArray(paxPrices) || paxPrices.length === 0) return 0;\r\n const adtBf = getPaxFareByType(paxPrices, 'ADT');\r\n const chdBf = getPaxFareByType(paxPrices, 'CHD');\r\n const infBf = getPaxFareByType(paxPrices, 'INF');\r\n return (\r\n adtBf * toNumber(counts?.adt) +\r\n chdBf * toNumber(counts?.chd) +\r\n infBf * toNumber(counts?.inf)\r\n );\r\n}\r\n\r\nfunction getPaxFareByType(paxPrices, type) {\r\n const match = paxPrices.find(\r\n (item) =>\r\n String(item?.ptyp || '').toUpperCase() ===\r\n String(type || '').toUpperCase(),\r\n );\r\n return toNumber(match?.bf);\r\n}\r\n\r\nfunction sumTaxes(taxs) {\r\n if (!Array.isArray(taxs)) return 0;\r\n return taxs.reduce((acc, tax) => acc + toNumber(tax?.pr), 0);\r\n}\r\n\r\nfunction getSectors(payload) {\r\n if (Array.isArray(payload?.selectedFlight?.sectors)) {\r\n return payload.selectedFlight.sectors;\r\n }\r\n return [];\r\n}\r\n\r\nfunction getReturnSectors(payload) {\r\n if (Array.isArray(payload?.selectedReturnFlight?.sectors)) {\r\n return payload.selectedReturnFlight.sectors;\r\n }\r\n return [];\r\n}\r\n\r\nfunction isRoundTripTrip(payload, prebookResponse) {\r\n const ttFromPayload = getTripType(payload, prebookResponse);\r\n if (ttFromPayload === 2) return true;\r\n return getReturnSectors(payload).length > 0;\r\n}\r\n\r\nfunction getTripType(payload, prebookResponse) {\r\n return Number(payload?.tt || prebookResponse?.payload?.tt || 0);\r\n}\r\n\r\nfunction getTripStyle(payload, prebookResponse) {\r\n return String(payload?.styp || prebookResponse?.payload?.styp || '')\r\n .trim()\r\n .toLowerCase();\r\n}\r\n\r\nfunction safeTime(value) {\r\n return String(value || '').trim() || '--:--';\r\n}\r\n\r\nfunction toFriendlyDate(value) {\r\n const raw = String(value || '').trim();\r\n if (!raw) return '';\r\n const parts = raw.split('-');\r\n if (parts.length !== 3) return raw;\r\n const [dd, mm, yyyy] = parts;\r\n const date = new Date(`${yyyy}-${mm}-${dd}`);\r\n if (Number.isNaN(date.getTime())) return raw;\r\n return date.toLocaleDateString('en-US', {\r\n weekday: 'short',\r\n day: '2-digit',\r\n month: 'short',\r\n });\r\n}\r\n\r\nfunction formatMoney(value, currency) {\r\n const amount = toNumber(value);\r\n const safeCurrency = String(currency || 'INR')\r\n .trim()\r\n .toUpperCase();\r\n return `${safeCurrency} ${amount.toFixed(2)}`;\r\n}\r\n\r\nfunction toDisplayDate(value) {\r\n const raw = String(value || '').trim();\r\n if (!raw) return '-';\r\n const parsed = new Date(raw);\r\n if (Number.isNaN(parsed.getTime())) return raw;\r\n const dd = String(parsed.getDate()).padStart(2, '0');\r\n const mm = String(parsed.getMonth() + 1).padStart(2, '0');\r\n const yyyy = parsed.getFullYear();\r\n return `${dd}-${mm}-${yyyy}`;\r\n}\r\n\r\nfunction toGenderLabel(value) {\r\n const gender = String(value || '').toUpperCase();\r\n if (gender === 'M') return 'M';\r\n if (gender === 'F') return 'F';\r\n return '-';\r\n}\r\n\r\nfunction buildAirlineLogoUrl(baseUrl, airlineCode) {\r\n const safeCode = String(airlineCode || '')\r\n .trim()\r\n .toUpperCase();\r\n if (!baseUrl || !safeCode) return '';\r\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;\r\n return `${normalizedBase}${safeCode}.png`;\r\n}\r\n\r\nexport default FlightSummary;\r\n","import React, { useMemo } from 'react';\r\nimport { FiCreditCard, FiSmartphone, FiGlobe, FiBriefcase } from 'react-icons/fi';\r\n\r\nconst ONLINE_SPLIT_GATEWAYS = [\r\n { pm: 'UP', label: 'UPI', gatetyp: 'Default', _kind: 'online' },\r\n { pm: 'NB', label: 'Net Banking', gatetyp: 'Default', _kind: 'online' },\r\n { pm: 'DC', label: 'Debit Card', gatetyp: 'Default', _kind: 'online' },\r\n { pm: 'CC', label: 'Credit Card', gatetyp: 'Default', _kind: 'online' },\r\n];\r\nconst ONLINE_COMBINED_GATEWAY = {\r\n pm: 'CA',\r\n label: 'Card/Net Banking/UPI',\r\n gatetyp: 'Default',\r\n _kind: 'online',\r\n};\r\nconst EXTRA_GATEWAYS = [\r\n { pm: 'BL', label: 'Balance', gatetyp: 'Balance', _kind: 'balance' },\r\n { pm: 'RP', label: 'Pay with Razor Pay', gatetyp: 'Razorpay', _kind: 'online' },\r\n { pm: 'CR', label: 'Pay with Crypto', gatetyp: 'Crypto', _kind: 'online' },\r\n];\r\n\r\nfunction normalizePolicyArray(value) {\r\n if (Array.isArray(value)) {\r\n return value.map((item) => String(item || '').trim().toLowerCase()).filter(Boolean);\r\n }\r\n if (typeof value === 'string' && value.trim()) {\r\n return [value.trim().toLowerCase()];\r\n }\r\n return [];\r\n}\r\n\r\nfunction getPaymentModeIcon(mode) {\r\n const m = String(mode || '').trim().toUpperCase();\r\n if (m === 'CC' || m === 'DC' || m === 'CA') return <FiCreditCard size={18} />;\r\n if (m === 'NB') return <FiGlobe size={18} />;\r\n if (m === 'UP' || m === 'UPI') return <FiSmartphone size={18} />;\r\n if (m === 'BL' || m === 'WL') return <FiBriefcase size={18} />;\r\n return <FiCreditCard size={18} />;\r\n}\r\n\r\nexport default function PaymentGatewayOptions({\r\n paymentSummary = {},\r\n selectedGateway,\r\n selectedPaymentMode,\r\n sdkWarning,\r\n onGatewayChange,\r\n currencyCode = 'INR',\r\n allowBalance = false,\r\n combineOnlineOptions = false,\r\n disabled = false,\r\n}) {\r\n const currency = String(currencyCode || 'INR').toUpperCase().trim();\r\n\r\n const visibleGateways = useMemo(() => {\r\n const online = combineOnlineOptions\r\n ? [ONLINE_COMBINED_GATEWAY]\r\n : ONLINE_SPLIT_GATEWAYS;\r\n const base = [\r\n ...online,\r\n ...EXTRA_GATEWAYS.filter((item) => item.pm !== 'BL' || allowBalance),\r\n ];\r\n const byCurrency = base.filter((gateway) => {\r\n if (currency !== 'INR' && (gateway.pm === 'UP' || gateway.pm === 'NB')) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n const corporate = paymentSummary?.corporate || null;\r\n const ptyp = normalizePolicyArray(corporate?.ptyp);\r\n const outboundPtyp = normalizePolicyArray(\r\n corporate?.outbound?.ptyp ||\r\n corporate?.onward?.ptyp ||\r\n corporate?.ob?.ptyp ||\r\n corporate?.ptypOutbound ||\r\n corporate?.outboundPtyp ||\r\n corporate?.ptyp_outbound,\r\n );\r\n const inboundPtyp = normalizePolicyArray(\r\n corporate?.inbound?.ptyp ||\r\n corporate?.return?.ptyp ||\r\n corporate?.ib?.ptyp ||\r\n corporate?.ptypInbound ||\r\n corporate?.inboundPtyp ||\r\n corporate?.ptyp_inbound,\r\n );\r\n const hasInbound =\r\n Boolean(corporate?.journey?.hasInbound) ||\r\n (outboundPtyp.length > 0 && inboundPtyp.length > 0);\r\n\r\n const effectivePtyp =\r\n hasInbound && outboundPtyp.length > 0 && inboundPtyp.length > 0\r\n ? outboundPtyp.filter((item) => inboundPtyp.includes(item))\r\n : hasInbound && inboundPtyp.length > 0\r\n ? inboundPtyp\r\n : outboundPtyp.length > 0\r\n ? outboundPtyp\r\n : ptyp;\r\n if (!effectivePtyp.length) return byCurrency;\r\n\r\n const allowsOnline = effectivePtyp.includes('online');\r\n const allowsCreditLine = effectivePtyp.includes('cl');\r\n\r\n return byCurrency.filter((gateway) => {\r\n if (gateway._kind === 'balance') return allowsCreditLine;\r\n return allowsOnline;\r\n });\r\n }, [allowBalance, combineOnlineOptions, currency, paymentSummary]);\r\n\r\n return (\r\n <div style={{ width: '100%', display: 'flex', flexDirection: 'column', gap: '16px' }}>\r\n <div style={{ background: '#fff', border: '1px solid #e5e7eb', borderRadius: '8px', padding: '16px' }}>\r\n <div style={{ marginBottom: '16px' }}>\r\n <h3 style={{ margin: 0, fontSize: '1.125rem', fontWeight: '600', color: '#1f2937' }}>\r\n Payment Method\r\n </h3>\r\n <p style={{ margin: '4px 0 0', fontSize: '0.875rem', color: '#6b7280' }}>\r\n Choose how you would like to pay for your booking\r\n </p>\r\n </div>\r\n\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>\r\n {visibleGateways.map((gateway) => {\r\n const isSelected =\r\n selectedPaymentMode === gateway.pm &&\r\n selectedGateway === gateway.gatetyp;\r\n\r\n return (\r\n <div\r\n key={gateway.pm}\r\n onClick={() => {\r\n if (disabled) return;\r\n onGatewayChange(gateway.gatetyp, gateway.pm);\r\n }}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '12px',\r\n border: `1px solid ${isSelected ? '#3b82f6' : '#d1d5db'}`,\r\n borderRadius: '6px',\r\n background: disabled ? '#f9fafb' : isSelected ? '#eff6ff' : '#fff',\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n opacity: disabled ? 0.6 : 1,\r\n transition: 'all 0.15s ease-in-out',\r\n }}\r\n >\r\n <label style={{ display: 'flex', alignItems: 'center', gap: '12px', cursor: disabled ? 'not-allowed' : 'pointer', margin: 0 }}>\r\n <input\r\n type=\"radio\"\r\n name=\"paymentGateway\"\r\n checked={isSelected}\r\n disabled={disabled}\r\n onChange={() => {\r\n if (disabled) return;\r\n onGatewayChange(gateway.gatetyp, gateway.pm);\r\n }}\r\n style={{ margin: 0, width: '16px', height: '16px', accentColor: '#3b82f6', cursor: disabled ? 'not-allowed' : 'pointer' }}\r\n />\r\n <span style={{ fontWeight: '500', color: '#1f2937', fontSize: '0.875rem' }}>\r\n {gateway.label}\r\n </span>\r\n </label>\r\n <div style={{ color: '#6b7280', display: 'flex', alignItems: 'center' }}>\r\n {getPaymentModeIcon(gateway.pm)}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n\r\n {sdkWarning ? (\r\n <div style={{\r\n color: '#ef4444', fontSize: '0.875rem', padding: '10px 12px',\r\n background: '#fef2f2', border: '1px solid #fee2e2', borderRadius: '6px',\r\n }}>\r\n {sdkWarning}\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport FlightResults from './FlightResults';\r\nimport TravelerDetailsForm from './TravelerDetailsForm';\r\nimport PaymentConfirmationCard from './PaymentConfirmationCard';\r\nimport FlightSummary from './FlightSummary';\r\nimport PaymentGatewayOptions from './PaymentGatewayOptions';\r\nimport { HiSparkles } from 'react-icons/hi';\r\nimport { FaUser } from 'react-icons/fa';\r\n\r\nfunction MessageList({\r\n messages,\r\n typing,\r\n typingText = '',\r\n onOptionClick,\r\n onAvailabilitySuccess,\r\n onAvailabilityReset,\r\n onTravelerGoBack = () => {},\r\n onVoiceAssistantMessage,\r\n onPaymentSuccess,\r\n sessionId,\r\n variant = 'default',\r\n}) {\r\n const containerRef = useRef(null);\r\n const endRef = useRef(null);\r\n const shouldStickToBottomRef = useRef(true);\r\n const [travelerUiByIndex, setTravelerUiByIndex] = useState({});\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return undefined;\r\n\r\n const handleScroll = () => {\r\n const threshold = 96;\r\n const distanceFromBottom =\r\n container.scrollHeight - (container.scrollTop + container.clientHeight);\r\n shouldStickToBottomRef.current = distanceFromBottom <= threshold;\r\n };\r\n\r\n handleScroll();\r\n container.addEventListener('scroll', handleScroll, { passive: true });\r\n return () => {\r\n container.removeEventListener('scroll', handleScroll);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n const endElement = endRef.current;\r\n if (!container || !endElement) return;\r\n\r\n const lastMessage = messages[messages.length - 1];\r\n const lastMessageType = String(lastMessage?.type || '');\r\n const shouldAutoScroll =\r\n shouldStickToBottomRef.current ||\r\n lastMessageType === 'flight_results' ||\r\n lastMessageType === 'traveler_details_form';\r\n if (!shouldAutoScroll) return;\r\n\r\n let frame = null;\r\n\r\n const scrollContainerToBlockTop = (targetBlock) => {\r\n if (!targetBlock) return;\r\n const containerRect = container.getBoundingClientRect();\r\n const blockRect = targetBlock.getBoundingClientRect();\r\n const topOffset =\r\n container.scrollTop + (blockRect.top - containerRect.top);\r\n container.scrollTo({\r\n top: Math.max(topOffset, 0),\r\n behavior: 'smooth',\r\n });\r\n };\r\n\r\n // Wait one frame so heavy cards have mounted before computing offsets.\r\n frame = window.requestAnimationFrame(() => {\r\n if (lastMessageType === 'flight_results') {\r\n const resultBlocks = container.querySelectorAll(\r\n '.message-list__bubble--flight-results',\r\n );\r\n const latestResultBlock = resultBlocks[resultBlocks.length - 1];\r\n if (latestResultBlock) {\r\n scrollContainerToBlockTop(latestResultBlock);\r\n return;\r\n }\r\n }\r\n\r\n if (lastMessageType === 'traveler_details_form') {\r\n const travelerBlocks = container.querySelectorAll(\r\n '.message-list__bubble--traveler',\r\n );\r\n const latestTravelerBlock = travelerBlocks[travelerBlocks.length - 1];\r\n const mainTravelerForm = latestTravelerBlock?.querySelector(\r\n '.traveler-form[data-voice-traveler-form=\"active\"]',\r\n );\r\n const hasPostPrebookInlineUi = Boolean(\r\n latestTravelerBlock?.querySelector(\r\n '.flight-summary, .traveler-form__payment-section',\r\n ),\r\n );\r\n const isPrebookDone =\r\n mainTravelerForm?.getAttribute('data-prebook-done') === 'true' ||\r\n (!mainTravelerForm && hasPostPrebookInlineUi);\r\n\r\n if (latestTravelerBlock && !isPrebookDone) {\r\n scrollContainerToBlockTop(latestTravelerBlock);\r\n }\r\n // After prebook, the inner form unmounts; avoid scrolling the card to the top\r\n // on every update (that was re-pinning the thread and hiding payment + pay Q&A).\r\n return;\r\n }\r\n\r\n // Default chat behavior: keep latest conversational message in view.\r\n endElement.scrollIntoView({ behavior: 'smooth', block: 'end' });\r\n });\r\n\r\n return () => {\r\n if (frame) window.cancelAnimationFrame(frame);\r\n };\r\n }, [messages, typing]);\r\n\r\n const lastFlightResultsIndex = [...messages]\r\n .map((m, idx) => ({ type: m?.type, idx }))\r\n .filter((x) => x.type === 'flight_results')\r\n .map((x) => x.idx)\r\n .pop();\r\n const lastTravelerFormIndex = [...messages]\r\n .map((m, idx) => ({ type: m?.type, idx }))\r\n .filter((x) => x.type === 'traveler_details_form')\r\n .map((x) => x.idx)\r\n .pop();\r\n const latestUserText = [...messages]\r\n .reverse()\r\n .find((item) => item?.type === 'user_message')?.text;\r\n const effectiveTypingText =\r\n String(typingText || '').trim() || buildSearchTypingText(latestUserText);\r\n const shouldDisableFlightBooking =\r\n Number.isInteger(lastTravelerFormIndex) &&\r\n (!Number.isInteger(lastFlightResultsIndex) ||\r\n lastTravelerFormIndex > lastFlightResultsIndex);\r\n const safeText = (value, fallback = '') => {\r\n if (typeof value === 'string') return value;\r\n if (typeof value === 'number' || typeof value === 'boolean')\r\n return String(value);\r\n if (value && typeof value === 'object') {\r\n const preferred =\r\n value?.message || value?.error || value?.details || value?.msg;\r\n if (preferred) return String(preferred);\r\n try {\r\n return JSON.stringify(value);\r\n } catch (error) {\r\n return fallback;\r\n }\r\n }\r\n return fallback;\r\n };\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={`message-list${variant === 'voice-page' ? ' message-list--voice-page' : ''}`}\r\n >\r\n {messages.map((msg, index) => {\r\n if (msg.type === 'flight_results') {\r\n const payload = msg?.data?.results?.payload || [];\r\n const flightsCount = payload.reduce(\r\n (acc, item) =>\r\n acc +\r\n (Array.isArray(item?.trps) ? item.trps.length : 0) +\r\n (Array.isArray(item?.rttrps) ? item.rttrps.length : 0),\r\n 0,\r\n );\r\n const hasFlights = flightsCount > 0;\r\n const displayText = hasFlights\r\n ? `Found ${flightsCount} flight option${flightsCount > 1 ? 's' : ''}.`\r\n : safeText(msg?.text, 'No flights found.');\r\n const tripSummary = hasFlights ? buildTripSummary(payload) : null;\r\n const recommendationText = hasFlights\r\n ? safeText(msg?._dynamicRecommendation || msg?.text, '')\r\n : '';\r\n\r\n return (\r\n <div\r\n key={index}\r\n className=\"message-list__bubble message-list__bubble--assistant message-list__bubble--flight-results\"\r\n >\r\n {tripSummary ? (\r\n <div className=\"message-list__results-summary\">\r\n <div className=\"message-list__results-summary-route\">\r\n {tripSummary.route}\r\n </div>\r\n <div className=\"message-list__results-summary-meta\">\r\n <div className=\"message-list__results-summary-date\">\r\n {tripSummary.date}\r\n </div>\r\n <div className=\"message-list__results-summary-travelers\">\r\n {tripSummary.travelerInfo}\r\n </div>\r\n </div>\r\n </div>\r\n ) : (\r\n <p className=\"message-list__text flight-results__count-text\">\r\n <span className=\"message-list__text-icon\">\r\n <HiSparkles />\r\n </span>\r\n {displayText}\r\n </p>\r\n )}\r\n <FlightResults\r\n results={msg?.data?.results}\r\n extractedFilters={msg?.filters || null}\r\n latestUserText={latestUserText}\r\n isLatestResultsMessage={index === lastFlightResultsIndex}\r\n recommendationCriteria={buildRecommendationCriteria(\r\n recommendationText,\r\n )}\r\n onAvailabilitySuccess={onAvailabilitySuccess}\r\n onAvailabilityReset={onAvailabilityReset}\r\n disableBook={\r\n shouldDisableFlightBooking || index !== lastFlightResultsIndex\r\n }\r\n onFilterCountChange={(count) => {\r\n msg._lastFilterCount = count;\r\n }}\r\n onRecommendationChange={(text) => {\r\n msg._dynamicRecommendation = text;\r\n }}\r\n />\r\n {recommendationText && msg._lastFilterCount !== 0 ? (\r\n <div className=\"message-list__recommendation\">\r\n <p className=\"message-list__recommendation-title\">\r\n Best Suggestion\r\n </p>\r\n <p className=\"message-list__recommendation-body\">\r\n {recommendationText}\r\n </p>\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n }\r\n\r\n if (msg.type === 'user_message') {\r\n if (\r\n shouldHideUserMessageAsInlinedTravelerSave(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n )\r\n ) {\r\n return <React.Fragment key={index} />;\r\n }\r\n if (\r\n shouldHideUserMessageAsInlinedProceedToBook(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n )\r\n ) {\r\n return <React.Fragment key={index} />;\r\n }\r\n if (\r\n shouldHideUserMessageAsInlinedProceedConfirmReply(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n )\r\n ) {\r\n return <React.Fragment key={index} />;\r\n }\r\n if (\r\n shouldHideUserMessageAsInlinedPayIntent(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n )\r\n ) {\r\n return <React.Fragment key={index} />;\r\n }\r\n if (\r\n shouldHideUserMessageAsInlinedPaymentConfirmReply(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n )\r\n ) {\r\n return <React.Fragment key={index} />;\r\n }\r\n return (\r\n <div\r\n key={index}\r\n className=\"message-list__bubble message-list__bubble--user\"\r\n >\r\n <p className=\"message-list__text\">\r\n <span className=\"message-list__text-icon\">\r\n <FaUser />\r\n </span>\r\n {safeText(msg?.text, '')}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n if (msg.type === 'traveler_details_form') {\r\n const travelerUi = travelerUiByIndex[index] || {};\r\n const isLatestTravelerBlock = index === lastTravelerFormIndex;\r\n const hasResultsAfterThisBlock = messages\r\n .slice(index + 1)\r\n .some((item) => item?.type === 'flight_results');\r\n const inlineSaveEchoText =\r\n index === lastTravelerFormIndex\r\n ? getInlinedTravelerSaveUserEchoText(messages, index)\r\n : '';\r\n const proceedToBookInline =\r\n index === lastTravelerFormIndex\r\n ? findProceedToBookInlineBundle(messages, index)\r\n : null;\r\n const proceedConfirmReplyEcho =\r\n index === lastTravelerFormIndex && proceedToBookInline\r\n ? findInlinedProceedConfirmReply(messages, proceedToBookInline)\r\n : null;\r\n const payIntentInline =\r\n index === lastTravelerFormIndex\r\n ? findPayIntentInlineBundle(messages, index)\r\n : null;\r\n const proceedConversationBlock = proceedToBookInline ? (\r\n <div\r\n className=\"message-list__traveler-inline-proceed-block\"\r\n style={{ margin: '12px 0' }}\r\n >\r\n {proceedToBookInline.userText ? (\r\n <div\r\n className=\"message-list__bubble message-list__bubble--user\"\r\n style={{ marginBottom: '8px' }}\r\n >\r\n <p className=\"message-list__text\">\r\n <span className=\"message-list__text-icon\">\r\n <FaUser />\r\n </span>\r\n {proceedToBookInline.userText}\r\n </p>\r\n </div>\r\n ) : null}\r\n <div className=\"message-list__bubble message-list__bubble--assistant\">\r\n <p className=\"message-list__text\">\r\n <span className=\"message-list__text-icon\">\r\n <HiSparkles />\r\n </span>\r\n {safeText(proceedToBookInline.assistantMessage?.text, '')}\r\n </p>\r\n </div>\r\n </div>\r\n ) : null;\r\n return (\r\n <div\r\n key={index}\r\n className=\"message-list__bubble message-list__bubble--assistant message-list__bubble--traveler\"\r\n >\r\n <TravelerDetailsForm\r\n prebookPayload={msg?.prebookPayload}\r\n isReadOnly={\r\n Boolean(msg?.readOnly) ||\r\n !isLatestTravelerBlock ||\r\n hasResultsAfterThisBlock\r\n }\r\n onGoBack={onTravelerGoBack}\r\n onVoiceAssistantMessage={onVoiceAssistantMessage}\r\n onPaymentSuccess={onPaymentSuccess}\r\n sessionId={sessionId}\r\n onViewStateChange={(next) => {\r\n setTravelerUiByIndex((prev) => {\r\n if (!next) {\r\n if (!(index in prev)) return prev;\r\n const copy = { ...prev };\r\n delete copy[index];\r\n return copy;\r\n }\r\n return { ...prev, [index]: next };\r\n });\r\n }}\r\n />\r\n {inlineSaveEchoText ? (\r\n <div\r\n className=\"message-list__traveler-inline-user-echo\"\r\n style={{ margin: '12px 0' }}\r\n >\r\n <div className=\"message-list__bubble message-list__bubble--user\">\r\n <p className=\"message-list__text\">\r\n <span className=\"message-list__text-icon\">\r\n <FaUser />\r\n </span>\r\n {inlineSaveEchoText}\r\n </p>\r\n </div>\r\n </div>\r\n ) : null}\r\n {travelerUi?.showSummary ? (\r\n <FlightSummary\r\n payload={travelerUi?.summary?.payload}\r\n prebookResponse={travelerUi?.summary?.prebookResponse}\r\n convenienceFee={travelerUi?.summary?.convenienceFee}\r\n appliedPromocode={travelerUi?.summary?.appliedPromocode}\r\n promocodeDiscount={travelerUi?.summary?.promocodeDiscount}\r\n />\r\n ) : null}\r\n {travelerUi?.proceed?.showProceedActions ? (\r\n <div className=\"traveler-form__proceed-wrap\">\r\n {travelerUi?.proceed?.showEditButton ? (\r\n <button\r\n type=\"button\"\r\n className=\"traveler-form__btn traveler-form__btn--edit\"\r\n onClick={() => travelerUi?.proceed?.onEditDetails?.()}\r\n disabled={travelerUi?.proceed?.disableEditButton}\r\n >\r\n Edit Details\r\n </button>\r\n ) : null}\r\n <button\r\n type=\"button\"\r\n className=\"traveler-form__btn traveler-form__btn--proceed\"\r\n onClick={() => travelerUi?.proceed?.onProceedToBook?.()}\r\n disabled={travelerUi?.proceed?.disableProceedButton}\r\n >\r\n {travelerUi?.proceed?.proceedButtonText ||\r\n 'Proceed to Book'}\r\n </button>\r\n </div>\r\n ) : null}\r\n {proceedConversationBlock}\r\n {proceedConfirmReplyEcho?.text ? (\r\n <div\r\n className=\"message-list__traveler-inline-user-echo\"\r\n style={{ margin: '12px 0' }}\r\n >\r\n <div className=\"message-list__bubble message-list__bubble--user\">\r\n <p className=\"message-list__text\">\r\n <span className=\"message-list__text-icon\">\r\n <FaUser />\r\n </span>\r\n {proceedConfirmReplyEcho.text}\r\n </p>\r\n </div>\r\n </div>\r\n ) : null}\r\n\r\n {travelerUi?.showPayment ? (\r\n <div\r\n className=\"traveler-form__payment-section\"\r\n data-voice-traveler-form=\"active\"\r\n data-prebook-done=\"true\"\r\n >\r\n {travelerUi?.payment?.paymentSummary?.promoCodes &&\r\n travelerUi.payment.paymentSummary.promoCodes.length > 0 ? (\r\n <div\r\n className=\"flight-summary__promo-card\"\r\n style={{ marginBottom: '16px' }}\r\n >\r\n <h4 className=\"flight-summary__promo-title\">\r\n Offers & Promo Codes\r\n </h4>\r\n <div className=\"flight-summary__promo-list\">\r\n {travelerUi.payment.paymentSummary.promoCodes.map(\r\n (promo) => {\r\n const isApplied =\r\n String(\r\n travelerUi?.payment?.appliedPromocode || '',\r\n )\r\n .trim()\r\n .toUpperCase() ===\r\n String(promo?.cd || '')\r\n .trim()\r\n .toUpperCase();\r\n return (\r\n <div\r\n key={promo.cd}\r\n className={`flight-summary__promo-item ${isApplied ? 'flight-summary__promo-item--applied' : ''}`}\r\n >\r\n <div className=\"flight-summary__promo-badge\">\r\n {promo.cd}\r\n </div>\r\n <div className=\"flight-summary__promo-details\">\r\n <div className=\"flight-summary__promo-desc\">\r\n {promo.desc ||\r\n 'Special discount for your trip'}\r\n </div>\r\n {isApplied ? (\r\n <button\r\n type=\"button\"\r\n className=\"flight-summary__promo-btn flight-summary__promo-btn--remove\"\r\n onClick={() =>\r\n travelerUi?.payment?.handleRemovePromocode?.()\r\n }\r\n disabled={\r\n travelerUi?.payment?.isApplyingPromo\r\n }\r\n >\r\n {travelerUi?.payment?.isApplyingPromo\r\n ? '...'\r\n : 'Remove'}\r\n </button>\r\n ) : (\r\n <button\r\n type=\"button\"\r\n className=\"flight-summary__promo-btn\"\r\n onClick={() =>\r\n travelerUi?.payment?.handleApplyPromocode?.(\r\n promo.cd,\r\n )\r\n }\r\n disabled={\r\n travelerUi?.payment?.isApplyingPromo ||\r\n !!travelerUi?.payment?.appliedPromocode\r\n }\r\n >\r\n {travelerUi?.payment?.isApplyingPromo\r\n ? '...'\r\n : 'Apply'}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n },\r\n )}\r\n </div>\r\n </div>\r\n ) : null}\r\n {travelerUi?.payment?.shouldShowInboundApprovalRequest ? (\r\n <div\r\n className=\"flight-summary__promo-card\"\r\n style={{ marginTop: '8px' }}\r\n >\r\n <h4 className=\"flight-summary__promo-title\">\r\n Approval Required\r\n </h4>\r\n <div\r\n className=\"flight-summary__promo-desc\"\r\n style={{ marginBottom: '10px' }}\r\n >\r\n To confirm this corporate inbound booking, send an\r\n approval request to your manager.\r\n </div>\r\n <input\r\n type=\"text\"\r\n className=\"traveler-form__input\"\r\n value={travelerUi?.payment?.tripReason || ''}\r\n onChange={(event) =>\r\n travelerUi?.payment?.setTripReason?.(\r\n event.target.value,\r\n )\r\n }\r\n placeholder=\"Enter trip reason\"\r\n disabled={\r\n travelerUi?.payment?.isSubmittingApprovalRequest\r\n }\r\n />\r\n <div style={{ marginTop: '10px' }}>\r\n <button\r\n type=\"button\"\r\n className=\"traveler-form__btn traveler-form__btn--proceed\"\r\n onClick={() =>\r\n travelerUi?.payment?.handleApprovalRequest?.()\r\n }\r\n disabled={\r\n travelerUi?.payment?.isSubmittingApprovalRequest\r\n }\r\n >\r\n {travelerUi?.payment?.isSubmittingApprovalRequest\r\n ? 'Sending Request...'\r\n : 'Send Approval Request'}\r\n </button>\r\n </div>\r\n </div>\r\n ) : (\r\n <PaymentGatewayOptions\r\n paymentSummary={travelerUi?.payment?.paymentSummary}\r\n selectedGateway={travelerUi?.payment?.selectedGateway}\r\n selectedPaymentMode={\r\n travelerUi?.payment?.selectedPaymentMode\r\n }\r\n sdkWarning={travelerUi?.payment?.sdkWarning}\r\n currencyCode={travelerUi?.payment?.fareCurrency}\r\n allowBalance={\r\n travelerUi?.payment?.allowBalancePaymentOption\r\n }\r\n combineOnlineOptions={\r\n travelerUi?.payment?.combineOnlineOptions\r\n }\r\n disabled={false}\r\n onGatewayChange={(gatewayName, mode) => {\r\n travelerUi?.payment?.setSelectedGateway?.(gatewayName);\r\n travelerUi?.payment?.setSelectedPaymentMode?.(mode);\r\n }}\r\n />\r\n )}\r\n </div>\r\n ) : null}\r\n {travelerUi?.showPayNow ? (\r\n <div className=\"traveler-form__proceed-wrap\">\r\n <div className=\"traveler-form__total-badge\">\r\n Total Payable:{' '}\r\n {String(\r\n travelerUi?.payment?.fareCurrency || '',\r\n ).toUpperCase()}{' '}\r\n {Number(\r\n travelerUi?.payment?.totalPayableAmount || 0,\r\n ).toFixed(2)}\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"traveler-form__btn traveler-form__btn--proceed\"\r\n onClick={() => travelerUi?.payment?.handlePayNow?.()}\r\n disabled={travelerUi?.payment?.isPaying}\r\n >\r\n {travelerUi?.payment?.isPaying\r\n ? 'Processing Payment...'\r\n : 'Pay Now'}\r\n </button>\r\n </div>\r\n ) : null}\r\n {(travelerUi?.showPayment || travelerUi?.showPayNow) &&\r\n (payIntentInline?.userText || payIntentInline?.assistantText) ? (\r\n <div\r\n className=\"message-list__traveler-inline-pay-block\"\r\n style={{ marginTop: '16px' }}\r\n >\r\n {payIntentInline.userText ? (\r\n <div\r\n className=\"message-list__traveler-inline-user-echo\"\r\n style={{ margin: '12px 0' }}\r\n >\r\n <div className=\"message-list__bubble message-list__bubble--user\">\r\n <p className=\"message-list__text\">\r\n <span className=\"message-list__text-icon\">\r\n <FaUser />\r\n </span>\r\n {payIntentInline.userText}\r\n </p>\r\n </div>\r\n </div>\r\n ) : null}\r\n {payIntentInline.assistantText ? (\r\n <div\r\n className=\"message-list__bubble message-list__bubble--assistant\"\r\n style={{ marginBottom: '8px' }}\r\n >\r\n <p className=\"message-list__text\">\r\n <span className=\"message-list__text-icon\">\r\n <HiSparkles />\r\n </span>\r\n {safeText(payIntentInline.assistantText, '')}\r\n </p>\r\n </div>\r\n ) : null}\r\n {payIntentInline.confirmReplyText ? (\r\n <div\r\n className=\"message-list__traveler-inline-user-echo\"\r\n style={{ margin: '12px 0 0' }}\r\n >\r\n <div className=\"message-list__bubble message-list__bubble--user\">\r\n <p className=\"message-list__text\">\r\n <span className=\"message-list__text-icon\">\r\n <FaUser />\r\n </span>\r\n {payIntentInline.confirmReplyText}\r\n </p>\r\n </div>\r\n </div>\r\n ) : null}\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n }\r\n\r\n if (msg.type === 'payment_confirmation') {\r\n return (\r\n <div\r\n key={index}\r\n className=\"message-list__bubble message-list__bubble--assistant\"\r\n >\r\n <p className=\"message-list__text message-list__text--payment-success\">\r\n <span className=\"message-list__text-icon\">\r\n <HiSparkles />\r\n </span>\r\n {safeText(msg?.text, 'Payment completed successfully.')}\r\n </p>\r\n <PaymentConfirmationCard confirmation={msg?.confirmation} />\r\n </div>\r\n );\r\n }\r\n\r\n if (msg.type === 'assistant_message') {\r\n if (\r\n shouldHideAssistantMessageAsInlinedProceedToBook(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n )\r\n ) {\r\n return <React.Fragment key={index} />;\r\n }\r\n if (\r\n shouldHideAssistantMessageAsInlinedPaymentConfirm(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n )\r\n ) {\r\n return <React.Fragment key={index} />;\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n key={index}\r\n className=\"message-list__bubble message-list__bubble--assistant\"\r\n >\r\n <p className=\"message-list__text\">\r\n <span className=\"message-list__text-icon\">\r\n <HiSparkles />\r\n </span>\r\n {safeText(msg?.text, '')}\r\n </p>\r\n </div>\r\n );\r\n })}\r\n\r\n {typing ? (\r\n <div className=\"message-list__typing\">\r\n <p className=\"loading-text\">{effectiveTypingText}</p>\r\n </div>\r\n ) : null}\r\n <div ref={endRef} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction buildSearchTypingText(userText) {\r\n const message = String(userText || '').trim();\r\n if (!message) return 'Processing your request...';\r\n const routeMatch = message.match(\r\n /\\b([A-Za-z]{3})\\s*(?:to|-)\\s*([A-Za-z]{3})\\b/i,\r\n );\r\n const dep = routeMatch?.[1] ? routeMatch[1].toUpperCase() : '';\r\n const arr = routeMatch?.[2] ? routeMatch[2].toUpperCase() : '';\r\n const dateMatch = message.match(\r\n /\\b(on|onward(?:\\s+is)?|departure(?:\\s+is)?)\\s+([A-Za-z0-9,\\-/ ]+)/i,\r\n );\r\n const dateText = String(dateMatch?.[2] || '')\r\n .trim()\r\n .replace(/\\s+(and|return|retrun|retun|rtn)\\b.*$/i, '');\r\n\r\n if (dep && arr && dateText) {\r\n return `Processing your request from ${dep} to ${arr} on ${dateText}...`;\r\n }\r\n if (dep && arr) {\r\n return `Processing your request from ${dep} to ${arr}...`;\r\n }\r\n return 'Processing your request...';\r\n}\r\n\r\nfunction buildTripSummary(payload = []) {\r\n const firstItem = Array.isArray(payload) ? payload[0] : null;\r\n const firstTrip = Array.isArray(firstItem?.trps) ? firstItem.trps[0] : null;\r\n const dep = firstTrip?.deps?.[0];\r\n const segments = Array.isArray(dep?.seg) ? dep.seg : [];\r\n const firstSeg = segments[0] || {};\r\n const lastSeg = segments[segments.length - 1] || firstSeg;\r\n\r\n const fromCode = String(firstSeg?.da || '')\r\n .trim()\r\n .toUpperCase();\r\n const toCode = String(lastSeg?.ar || '')\r\n .trim()\r\n .toUpperCase();\r\n const route = `${getCityLabel(fromCode)} → ${getCityLabel(toCode)}`;\r\n\r\n const adt = Number(firstItem?.adt ?? 1);\r\n const chd = Number(firstItem?.chd ?? 0);\r\n const inf = Number(firstItem?.inf ?? 0);\r\n const paxCount = Math.max(adt + chd + inf, 1);\r\n const classText = String(\r\n firstSeg?.cc || firstSeg?.cls || firstItem?.cls || 'Economy',\r\n ).trim();\r\n const travelerInfo = `${paxCount} traveler${paxCount > 1 ? 's' : ''}, ${classText}`;\r\n\r\n return {\r\n route,\r\n date: formatDateLabel(firstSeg?.dd),\r\n travelerInfo,\r\n };\r\n}\r\n\r\nfunction getCityLabel(iataCode) {\r\n const map = {\r\n HYD: 'Hyderabad',\r\n BLR: 'Bangalore',\r\n DEL: 'Delhi',\r\n BOM: 'Mumbai',\r\n MAA: 'Chennai',\r\n CCU: 'Kolkata',\r\n AMD: 'Ahmedabad',\r\n COK: 'Cochin',\r\n GOI: 'Goa',\r\n PNQ: 'Pune',\r\n };\r\n return map[iataCode] || iataCode || 'Route';\r\n}\r\n\r\nfunction formatDateLabel(rawDate) {\r\n const value = String(rawDate || '').trim();\r\n if (!value) return '--';\r\n const parsed = /^\\d{2}-\\d{2}-\\d{4}$/.test(value)\r\n ? new Date(value.split('-').reverse().join('-'))\r\n : new Date(value);\r\n if (Number.isNaN(parsed.getTime())) return value;\r\n const dd = String(parsed.getDate()).padStart(2, '0');\r\n const mm = String(parsed.getMonth() + 1).padStart(2, '0');\r\n const yyyy = parsed.getFullYear();\r\n return `${dd}-${mm}-${yyyy}`;\r\n}\r\n\r\nfunction buildRecommendationCriteria(text) {\r\n const value = String(text || '').trim();\r\n if (!value) return null;\r\n const routeDateMatch = value.match(\r\n /\\bfrom\\s+([A-Za-z]{3})\\s+to\\s+([A-Za-z]{3})\\s+on\\s+(\\d{4}-\\d{2}-\\d{2})\\b/i,\r\n );\r\n const airlineMatch = value.match(\r\n /\\bbest\\s+pick\\s+is\\s+([A-Za-z0-9]{2,3})\\b/i,\r\n );\r\n const timeMatch = value.match(/\\bat\\s+([0-2]?\\d:\\d{2})\\b/i);\r\n const priceMatch = value.match(\r\n /\\b(?:USD|INR|EUR|GBP|AED|SAR)\\s*([\\d,.]+)\\b/i,\r\n );\r\n\r\n return {\r\n origin: routeDateMatch?.[1]?.toUpperCase() || '',\r\n destination: routeDateMatch?.[2]?.toUpperCase() || '',\r\n departureDate: routeDateMatch?.[3] || '',\r\n airlineCode: airlineMatch?.[1]?.toUpperCase() || '',\r\n departureTime: normalizeTime(timeMatch?.[1] || ''),\r\n price: parseRecommendationAmount(priceMatch?.[1]),\r\n };\r\n}\r\n\r\nfunction normalizeTime(value) {\r\n const raw = String(value || '').trim();\r\n if (!raw) return '';\r\n const [hours, mins] = raw.split(':');\r\n if (!hours || !mins) return '';\r\n const h = Number(hours);\r\n const m = Number(mins);\r\n if (!Number.isFinite(h) || !Number.isFinite(m)) return '';\r\n if (h < 0 || h > 23 || m < 0 || m > 59) return '';\r\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`;\r\n}\r\n\r\nfunction parseRecommendationAmount(value) {\r\n const raw = String(value || '')\r\n .replace(/,/g, '')\r\n .trim();\r\n if (!raw) return null;\r\n const parsed = Number(raw);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n}\r\n\r\nfunction isTravelerDetailsSaveUserText(text) {\r\n const raw = String(text || '').trim();\r\n if (!raw) return false;\r\n const normalized = raw.toLowerCase();\r\n if (normalized === 'save') return true;\r\n return /\\b(save details|save traveler details|save traveller details)\\b/i.test(\r\n raw,\r\n );\r\n}\r\n\r\nfunction getInlinedTravelerSaveUserEchoText(messages, travelerFormIndex) {\r\n const next = messages[Number(travelerFormIndex) + 1];\r\n if (!next || next.type !== 'user_message') return '';\r\n if (next.hiddenFromChat) return '';\r\n if (!isTravelerDetailsSaveUserText(next.text)) return '';\r\n return String(next.text || '').trim();\r\n}\r\n\r\nfunction shouldHideUserMessageAsInlinedTravelerSave(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n) {\r\n if (!Number.isInteger(lastTravelerFormIndex)) return false;\r\n if (index < 1) return false;\r\n if (index - 1 !== lastTravelerFormIndex) return false;\r\n const prev = messages[index - 1];\r\n if (!prev || prev.type !== 'traveler_details_form') return false;\r\n const msg = messages[index];\r\n if (!msg || msg.type !== 'user_message') return false;\r\n if (msg.hiddenFromChat) return false;\r\n return isTravelerDetailsSaveUserText(msg.text);\r\n}\r\n\r\nfunction isProceedFlightBookPromptAssistant(m) {\r\n return (\r\n m?.type === 'assistant_message' &&\r\n String(m?.text || '').includes(\r\n 'Do you want to proceed to book this flight?',\r\n )\r\n );\r\n}\r\n\r\nfunction isProceedToBookUserText(text) {\r\n const normalized = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!normalized) return false;\r\n return /\\b(proceed to book|continue to book|continue booking|confirm booking|proceed booking)\\b/.test(\r\n normalized,\r\n );\r\n}\r\n\r\nfunction buildProceedToBookBundleAtAssistantIndex(messages, assistantIndex) {\r\n const m = messages[assistantIndex];\r\n if (!m || m.type !== 'assistant_message') return null;\r\n const prev = assistantIndex > 0 ? messages[assistantIndex - 1] : null;\r\n const hasProceedUserEcho =\r\n prev?.type === 'user_message' &&\r\n !prev?.hiddenFromChat &&\r\n isProceedToBookUserText(prev.text);\r\n return {\r\n assistantMessage: m,\r\n assistantIndex,\r\n userIndex: hasProceedUserEcho ? assistantIndex - 1 : -1,\r\n userText: hasProceedUserEcho ? String(prev.text || '').trim() : '',\r\n };\r\n}\r\n\r\nfunction findProceedToBookInlineBundleForward(messages, travelerFormIndex) {\r\n for (let i = travelerFormIndex + 1; i < messages.length; i++) {\r\n const m = messages[i];\r\n if (m.type === 'flight_results' || m.type === 'payment_confirmation') {\r\n break;\r\n }\r\n if (m.type === 'traveler_details_form') {\r\n continue;\r\n }\r\n if (isProceedFlightBookPromptAssistant(m)) {\r\n return buildProceedToBookBundleAtAssistantIndex(messages, i);\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction findProceedToBookInlineBundleBackward(messages, travelerFormIndex) {\r\n for (let i = travelerFormIndex - 1; i >= 0; i--) {\r\n const m = messages[i];\r\n if (m.type === 'flight_results') {\r\n break;\r\n }\r\n if (m.type === 'traveler_details_form') {\r\n continue;\r\n }\r\n if (isProceedFlightBookPromptAssistant(m)) {\r\n return buildProceedToBookBundleAtAssistantIndex(messages, i);\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction findProceedToBookInlineBundle(messages, travelerFormIndex) {\r\n return (\r\n findProceedToBookInlineBundleForward(messages, travelerFormIndex) ||\r\n findProceedToBookInlineBundleBackward(messages, travelerFormIndex)\r\n );\r\n}\r\n\r\nfunction shouldHideUserMessageAsInlinedProceedToBook(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n) {\r\n if (!Number.isInteger(lastTravelerFormIndex)) return false;\r\n const bundle = findProceedToBookInlineBundle(messages, lastTravelerFormIndex);\r\n if (!bundle || bundle.userIndex < 0) return false;\r\n return index === bundle.userIndex;\r\n}\r\n\r\nfunction shouldHideAssistantMessageAsInlinedProceedToBook(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n) {\r\n if (!Number.isInteger(lastTravelerFormIndex)) return false;\r\n const bundle = findProceedToBookInlineBundle(messages, lastTravelerFormIndex);\r\n if (!bundle) return false;\r\n return index === bundle.assistantIndex;\r\n}\r\n\r\nfunction isProceedConfirmReplyUserText(text) {\r\n const t = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!t) return false;\r\n if (isProceedToBookUserText(text)) return false;\r\n if (isTravelerDetailsSaveUserText(text)) return false;\r\n if (/^(yes|yeah|yep|yup)\\b/.test(t)) return true;\r\n if (/^(no|nope|nah)\\b/.test(t)) return true;\r\n if (/^(ok|okay|sure)\\b/.test(t)) return true;\r\n return false;\r\n}\r\n\r\nfunction findInlinedProceedConfirmReply(messages, proceedBundle) {\r\n if (!proceedBundle || !Number.isInteger(proceedBundle.assistantIndex)) {\r\n return null;\r\n }\r\n const start = proceedBundle.assistantIndex + 1;\r\n for (let i = start; i < messages.length; i++) {\r\n const m = messages[i];\r\n if (m.type === 'flight_results' || m.type === 'payment_confirmation') {\r\n break;\r\n }\r\n if (m.type === 'traveler_details_form') {\r\n continue;\r\n }\r\n if (m.type === 'assistant_message') {\r\n continue;\r\n }\r\n if (\r\n m.type === 'user_message' &&\r\n !m.hiddenFromChat &&\r\n isProceedConfirmReplyUserText(m.text)\r\n ) {\r\n return { text: String(m.text || '').trim(), messageIndex: i };\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction shouldHideUserMessageAsInlinedProceedConfirmReply(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n) {\r\n if (!Number.isInteger(lastTravelerFormIndex)) return false;\r\n const bundle = findProceedToBookInlineBundle(messages, lastTravelerFormIndex);\r\n if (!bundle) return false;\r\n const echo = findInlinedProceedConfirmReply(messages, bundle);\r\n if (!echo) return false;\r\n return index === echo.messageIndex;\r\n}\r\n\r\nfunction isPayIntentUserText(text) {\r\n const raw = String(text || '').trim();\r\n if (!raw) return false;\r\n const lower = raw.toLowerCase();\r\n if (isTravelerDetailsSaveUserText(text)) return false;\r\n if (isProceedToBookUserText(text)) return false;\r\n if (lower === 'pay' || lower === 'payment' || lower === 'paye') return true;\r\n return /\\b(pay now|make payment|complete payment)\\b/i.test(raw);\r\n}\r\n\r\nfunction isPaymentConfirmationPromptAssistant(m) {\r\n if (m?.type !== 'assistant_message') return false;\r\n const opts = Array.isArray(m.options) ? m.options : [];\r\n if (opts.some((o) => String(o?.value || '').startsWith('CONFIRM_PAYMENT:'))) {\r\n return true;\r\n }\r\n return String(m?.text || '').includes('Do you want to proceed with payment');\r\n}\r\n\r\nfunction findPreviousTravelerFormIndex(messages, travelerFormIndex) {\r\n for (let i = travelerFormIndex - 1; i >= 0; i--) {\r\n if (messages[i]?.type === 'traveler_details_form') return i;\r\n }\r\n return -1;\r\n}\r\n\r\nfunction findLastFlightResultsIndexBefore(messages, beforeIndex) {\r\n let last = -1;\r\n for (let i = 0; i < beforeIndex; i++) {\r\n if (messages[i]?.type === 'flight_results') {\r\n last = i;\r\n }\r\n }\r\n return last;\r\n}\r\n\r\nfunction paymentAssistantClearToTraveler(messages, assistantIdx, travelerIdx) {\r\n for (let k = assistantIdx + 1; k < travelerIdx; k++) {\r\n if (messages[k]?.type === 'payment_confirmation') {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nfunction findPaymentAssistantNearTraveler(messages, travelerFormIndex) {\r\n let bestBefore = -1;\r\n for (let j = 0; j < travelerFormIndex; j++) {\r\n const m = messages[j];\r\n if (\r\n m?.type === 'assistant_message' &&\r\n isPaymentConfirmationPromptAssistant(m) &&\r\n paymentAssistantClearToTraveler(messages, j, travelerFormIndex)\r\n ) {\r\n bestBefore = Math.max(bestBefore, j);\r\n }\r\n }\r\n if (bestBefore >= 0) {\r\n return bestBefore;\r\n }\r\n for (let j = travelerFormIndex + 1; j < messages.length; j++) {\r\n const m = messages[j];\r\n if (m.type === 'traveler_details_form') {\r\n continue;\r\n }\r\n if (m.type === 'flight_results') {\r\n continue;\r\n }\r\n if (m.type === 'payment_confirmation') {\r\n break;\r\n }\r\n if (\r\n m.type === 'assistant_message' &&\r\n isPaymentConfirmationPromptAssistant(m)\r\n ) {\r\n return j;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction collectPayUserIndicesForPaymentAssistant(\r\n messages,\r\n travelerFormIndex,\r\n assistantIndex,\r\n) {\r\n const indices = [];\r\n let lastText = '';\r\n const pushPay = (i) => {\r\n const m = messages[i];\r\n if (m?.type !== 'user_message' || m.hiddenFromChat) return;\r\n if (!isPayIntentUserText(m.text)) return;\r\n indices.push(i);\r\n lastText = String(m.text || '').trim();\r\n };\r\n\r\n if (assistantIndex < travelerFormIndex) {\r\n const afterFlight =\r\n findLastFlightResultsIndexBefore(messages, assistantIndex) + 1;\r\n const lo = Math.max(0, afterFlight);\r\n for (let i = lo; i < assistantIndex; i++) {\r\n pushPay(i);\r\n }\r\n } else {\r\n for (let i = travelerFormIndex + 1; i < assistantIndex; i++) {\r\n pushPay(i);\r\n }\r\n }\r\n\r\n return { indices, lastText };\r\n}\r\n\r\nfunction findPayIntentInlineBundle(messages, travelerFormIndex) {\r\n const prevFormIdx = findPreviousTravelerFormIndex(\r\n messages,\r\n travelerFormIndex,\r\n );\r\n let assistantIndex = findPaymentAssistantNearTraveler(\r\n messages,\r\n travelerFormIndex,\r\n );\r\n\r\n let payUserIndices = [];\r\n let userText = '';\r\n let assistantText = '';\r\n\r\n if (assistantIndex >= 0) {\r\n assistantText = String(messages[assistantIndex]?.text || '').trim();\r\n const payBlock = collectPayUserIndicesForPaymentAssistant(\r\n messages,\r\n travelerFormIndex,\r\n assistantIndex,\r\n );\r\n payUserIndices = payBlock.indices;\r\n userText = payBlock.lastText;\r\n }\r\n\r\n if (!payUserIndices.length && assistantIndex < 0) {\r\n const rangeStart = prevFormIdx >= 0 ? prevFormIdx + 1 : 0;\r\n for (let i = travelerFormIndex + 1; i < messages.length; i++) {\r\n const m = messages[i];\r\n if (m.type === 'payment_confirmation') {\r\n break;\r\n }\r\n if (m.type === 'traveler_details_form') {\r\n continue;\r\n }\r\n if (m.type === 'flight_results') {\r\n continue;\r\n }\r\n if (\r\n m.type === 'user_message' &&\r\n !m.hiddenFromChat &&\r\n isPayIntentUserText(m.text)\r\n ) {\r\n payUserIndices = [i];\r\n userText = String(m.text || '').trim();\r\n break;\r\n }\r\n }\r\n if (!payUserIndices.length) {\r\n for (let i = rangeStart; i < travelerFormIndex; i++) {\r\n const m = messages[i];\r\n if (m.type !== 'user_message' || m.hiddenFromChat) {\r\n continue;\r\n }\r\n if (!isPayIntentUserText(m.text)) {\r\n continue;\r\n }\r\n payUserIndices.push(i);\r\n userText = String(m.text || '').trim();\r\n }\r\n }\r\n if (!payUserIndices.length) {\r\n return null;\r\n }\r\n\r\n const scanFrom = Math.max(...payUserIndices) + 1;\r\n let foundAssistant = -1;\r\n let foundText = '';\r\n for (let j = scanFrom; j < messages.length; j++) {\r\n const m = messages[j];\r\n if (m.type === 'payment_confirmation') {\r\n break;\r\n }\r\n if (m.type === 'traveler_details_form') {\r\n continue;\r\n }\r\n if (m.type === 'flight_results') {\r\n continue;\r\n }\r\n if (\r\n m.type === 'assistant_message' &&\r\n isPaymentConfirmationPromptAssistant(m)\r\n ) {\r\n foundAssistant = j;\r\n foundText = String(m.text || '').trim();\r\n break;\r\n }\r\n }\r\n if (foundAssistant < 0) {\r\n return {\r\n payUserIndices,\r\n userText,\r\n assistantIndex: -1,\r\n assistantText: '',\r\n confirmReplyIndex: -1,\r\n confirmReplyText: '',\r\n };\r\n }\r\n assistantIndex = foundAssistant;\r\n assistantText = foundText;\r\n }\r\n\r\n let confirmReplyIndex = -1;\r\n let confirmReplyText = '';\r\n if (assistantIndex >= 0) {\r\n for (let k = assistantIndex + 1; k < messages.length; k++) {\r\n const m = messages[k];\r\n if (m.type === 'payment_confirmation') {\r\n break;\r\n }\r\n if (m.type === 'traveler_details_form') {\r\n continue;\r\n }\r\n if (m.type === 'flight_results') {\r\n continue;\r\n }\r\n if (m.type === 'assistant_message') {\r\n break;\r\n }\r\n if (\r\n m.type === 'user_message' &&\r\n !m.hiddenFromChat &&\r\n isProceedConfirmReplyUserText(m.text)\r\n ) {\r\n confirmReplyIndex = k;\r\n confirmReplyText = String(m.text || '').trim();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n payUserIndices,\r\n userText,\r\n assistantIndex,\r\n assistantText,\r\n confirmReplyIndex,\r\n confirmReplyText,\r\n };\r\n}\r\n\r\nfunction shouldHideUserMessageAsInlinedPayIntent(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n) {\r\n if (!Number.isInteger(lastTravelerFormIndex)) return false;\r\n const bundle = findPayIntentInlineBundle(messages, lastTravelerFormIndex);\r\n if (!bundle) return false;\r\n return bundle.payUserIndices.includes(index);\r\n}\r\n\r\nfunction shouldHideUserMessageAsInlinedPaymentConfirmReply(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n) {\r\n if (!Number.isInteger(lastTravelerFormIndex)) return false;\r\n const bundle = findPayIntentInlineBundle(messages, lastTravelerFormIndex);\r\n if (!bundle || bundle.confirmReplyIndex < 0) return false;\r\n return index === bundle.confirmReplyIndex;\r\n}\r\n\r\nfunction shouldHideAssistantMessageAsInlinedPaymentConfirm(\r\n messages,\r\n index,\r\n lastTravelerFormIndex,\r\n) {\r\n if (!Number.isInteger(lastTravelerFormIndex)) return false;\r\n const bundle = findPayIntentInlineBundle(messages, lastTravelerFormIndex);\r\n if (!bundle || bundle.assistantIndex < 0) return false;\r\n return index === bundle.assistantIndex;\r\n}\r\n\r\nexport default MessageList;\r\n","export function convertDateToDDMMYYYY(dateValue) {\r\n if (!dateValue) return '';\r\n const date = dateValue instanceof Date ? dateValue : new Date(dateValue);\r\n if (Number.isNaN(date.getTime())) return '';\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const year = date.getFullYear();\r\n return `${day}/${month}/${year}`;\r\n}\r\n\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { FiPaperclip } from 'react-icons/fi';\r\nimport { LuSend } from 'react-icons/lu';\r\nimport DatePicker from 'react-datepicker';\r\nimport 'react-datepicker/dist/react-datepicker.css';\r\nimport { convertDateToDDMMYYYY } from '../utils/dateFormats';\r\n\r\nfunction MicrophoneIcon() {\r\n return (\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M12 3a3 3 0 0 0-3 3v6a3 3 0 1 0 6 0V6a3 3 0 0 0-3-3Z\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.8\"\r\n />\r\n <path\r\n d=\"M5 11.5a7 7 0 1 0 14 0\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n />\r\n <path\r\n d=\"M12 18.5V21\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction MessageInput({\r\n onSend,\r\n disabled = false,\r\n onOpenVoiceAssistant = () => {},\r\n prefillMessage = '',\r\n onPrefillConsumed,\r\n options = [],\r\n isReturnDateSelection = false,\r\n knownOnwardDate = null,\r\n knownReturnDate = null,\r\n onOptionClick,\r\n}) {\r\n const [text, setText] = useState('');\r\n const [isCustomDateOpen, setIsCustomDateOpen] = useState(false);\r\n const [customOnwardDate, setCustomOnwardDate] = useState(null);\r\n const [customReturnDate, setCustomReturnDate] = useState(null);\r\n const [customTripType, setCustomTripType] = useState('oneway');\r\n const [calendarMonthsShown, setCalendarMonthsShown] = useState(2);\r\n const inputRef = useRef(null);\r\n\r\n const handleInputChange = (event) => {\r\n setText(event.target.value);\r\n };\r\n\r\n const sendCurrentText = () => {\r\n const nextText = String(text || '').trim();\r\n if (!nextText || disabled) return;\r\n onSend(nextText);\r\n setText('');\r\n };\r\n\r\n const handleInputKeyDown = (event) => {\r\n if (event.key !== 'Enter') return;\r\n event.preventDefault();\r\n sendCurrentText();\r\n };\r\n\r\n useEffect(() => {\r\n const nextText = String(prefillMessage || '').trim();\r\n if (!nextText) return;\r\n setText(nextText);\r\n requestAnimationFrame(() => {\r\n inputRef.current?.focus();\r\n inputRef.current?.setSelectionRange(nextText.length, nextText.length);\r\n });\r\n onPrefillConsumed?.();\r\n }, [prefillMessage, onPrefillConsumed]);\r\n\r\n useEffect(() => {\r\n const updateCalendarMonths = () => {\r\n setCalendarMonthsShown(window.innerWidth <= 1100 ? 1 : 2);\r\n };\r\n updateCalendarMonths();\r\n window.addEventListener('resize', updateCalendarMonths);\r\n return () => window.removeEventListener('resize', updateCalendarMonths);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!isCustomDateOpen) return undefined;\r\n const previousOverflow = document.body.style.overflow;\r\n document.body.style.overflow = 'hidden';\r\n return () => {\r\n document.body.style.overflow = previousOverflow;\r\n };\r\n }, [isCustomDateOpen]);\r\n\r\n const hasDateQuickOptions =\r\n Array.isArray(options) &&\r\n options.some((opt) => isDateQuickOption(opt?.label || opt?.value));\r\n const dateOptionsKey = Array.isArray(options)\r\n ? options.map((opt) => String(opt?.label || opt?.value || '')).join('|')\r\n : '';\r\n\r\n useEffect(() => {\r\n if (!hasDateQuickOptions) return;\r\n const knownOnward = toDateOrNull(knownOnwardDate);\r\n const knownReturn = toDateOrNull(knownReturnDate);\r\n\r\n if (!isReturnDateSelection) {\r\n setCustomTripType('oneway');\r\n if (!customOnwardDate) setCustomOnwardDate(toDateOrNull(knownOnwardDate));\r\n if (!customReturnDate) setCustomReturnDate(toDateOrNull(knownReturnDate));\r\n return;\r\n }\r\n\r\n setCustomTripType('roundtrip');\r\n if (!customOnwardDate) setCustomOnwardDate(toDateOrNull(knownOnwardDate));\r\n if (!customReturnDate) setCustomReturnDate(toDateOrNull(knownReturnDate));\r\n }, [\r\n dateOptionsKey,\r\n hasDateQuickOptions,\r\n isReturnDateSelection,\r\n knownOnwardDate,\r\n knownReturnDate,\r\n customOnwardDate,\r\n customReturnDate,\r\n ]);\r\n\r\n const handleOneWayDateSelect = (date) => {\r\n if (!date || disabled) return;\r\n setCustomOnwardDate(date);\r\n const selected = convertDateToDDMMYYYY(date);\r\n onSend(isReturnDateSelection ? `return ${selected}` : selected);\r\n setIsCustomDateOpen(false);\r\n };\r\n\r\n const handleRoundTripDateSelect = (date) => {\r\n if (disabled) return;\r\n const clickedDate = toDateOrNull(date);\r\n if (!clickedDate) return;\r\n\r\n const currentOnward = toDateOrNull(customOnwardDate);\r\n const currentReturn = toDateOrNull(customReturnDate);\r\n\r\n // Sequential behavior:\r\n // 1st click => onward, 2nd click => return.\r\n if (!currentOnward || currentReturn) {\r\n setCustomOnwardDate(clickedDate);\r\n setCustomReturnDate(null);\r\n return;\r\n }\r\n\r\n // While selecting return, enforce strictly greater than onward.\r\n if (!isDateAfter(clickedDate, currentOnward)) {\r\n setCustomReturnDate(null);\r\n return;\r\n }\r\n\r\n const nextOnward = currentOnward;\r\n const nextReturn = clickedDate;\r\n setCustomOnwardDate(nextOnward);\r\n setCustomReturnDate(nextReturn);\r\n const onward = convertDateToDDMMYYYY(nextOnward);\r\n const returned = convertDateToDDMMYYYY(nextReturn);\r\n onSend(`onward ${onward} return ${returned}`);\r\n setIsCustomDateOpen(false);\r\n };\r\n\r\n const handleCustomDateToggle = () => {\r\n if (disabled) return;\r\n if (!isCustomDateOpen) {\r\n // Start a fresh sequential selection every time user opens roundtrip picker.\r\n setCustomOnwardDate(null);\r\n setCustomReturnDate(null);\r\n }\r\n setCustomTripType(isReturnDateSelection ? 'roundtrip' : 'oneway');\r\n setIsCustomDateOpen((prev) => !prev);\r\n };\r\n\r\n return (\r\n <div className=\"message-input\">\r\n {Array.isArray(options) && options.length > 0 ? (\r\n <div className=\"message-input__options\">\r\n {options.map((opt, i) => (\r\n <button\r\n key={i}\r\n type=\"button\"\r\n className=\"message-input__option-button\"\r\n onClick={() => onOptionClick?.(opt)}\r\n disabled={disabled}\r\n >\r\n {opt?.label}\r\n </button>\r\n ))}\r\n {hasDateQuickOptions ? (\r\n <button\r\n type=\"button\"\r\n className=\"message-input__option-button\"\r\n onClick={handleCustomDateToggle}\r\n disabled={disabled}\r\n >\r\n Custom Date\r\n </button>\r\n ) : null}\r\n </div>\r\n ) : null}\r\n {isCustomDateOpen && typeof document !== 'undefined'\r\n ? createPortal(\r\n <div\r\n className=\"message-input__date-modal-overlay\"\r\n onClick={() => setIsCustomDateOpen(false)}\r\n >\r\n <div\r\n className=\"message-input__date-modal\"\r\n onClick={(event) => event.stopPropagation()}\r\n >\r\n <div className=\"message-input__calendar-summary\">\r\n {customTripType === 'roundtrip' ||\r\n customTripType === 'Combined' ||\r\n customTripType === 'Split' ? (\r\n <>\r\n <div className=\"message-input__calendar-chip\">\r\n <span className=\"message-input__calendar-chip-label\">\r\n Onward\r\n </span>\r\n <span className=\"message-input__calendar-chip-value\">\r\n {formatShortDate(customOnwardDate)}\r\n </span>\r\n </div>\r\n <div className=\"message-input__calendar-chip\">\r\n <span className=\"message-input__calendar-chip-label\">\r\n Return\r\n </span>\r\n <span className=\"message-input__calendar-chip-value\">\r\n {formatShortDate(customReturnDate)}\r\n </span>\r\n </div>\r\n </>\r\n ) : null}\r\n </div>\r\n {customTripType === 'roundtrip' ||\r\n customTripType === 'Combined' ||\r\n customTripType === 'Split' ? (\r\n <DatePicker\r\n inline\r\n selectsRange\r\n startDate={customOnwardDate}\r\n endDate={customReturnDate}\r\n minDate={\r\n customOnwardDate\r\n ? addDays(customOnwardDate, 1)\r\n : new Date()\r\n }\r\n monthsShown={calendarMonthsShown}\r\n onSelect={handleRoundTripDateSelect}\r\n calendarClassName=\"message-input__calendar\"\r\n />\r\n ) : (\r\n <DatePicker\r\n inline\r\n selected={customOnwardDate}\r\n minDate={new Date()}\r\n monthsShown={calendarMonthsShown}\r\n onChange={handleOneWayDateSelect}\r\n calendarClassName=\"message-input__calendar\"\r\n />\r\n )}\r\n </div>\r\n </div>,\r\n document.body,\r\n )\r\n : null}\r\n {/* <button\r\n type=\"button\"\r\n className={`message-input__icon-button${disabled ? ' message-input__icon-button--disabled' : ''}`}\r\n disabled={disabled}\r\n aria-label=\"Attach file\"\r\n title=\"Attach file\"\r\n >\r\n <FiPaperclip className=\"message-input__icon\" aria-hidden=\"true\" />\r\n </button> */}\r\n <input\r\n ref={inputRef}\r\n className=\"message-input__field\"\r\n disabled={disabled}\r\n value={text}\r\n onChange={handleInputChange}\r\n placeholder={\r\n disabled\r\n ? 'Session expired. Click Restart Chat to continue.'\r\n : 'Send a message.'\r\n }\r\n onKeyDown={handleInputKeyDown}\r\n />\r\n <button\r\n type=\"button\"\r\n className={`message-input__voice-button${disabled ? ' message-input__voice-button--disabled' : ''}`}\r\n onClick={onOpenVoiceAssistant}\r\n disabled={disabled}\r\n aria-label=\"Open voice assistant\"\r\n title=\"Open voice assistant\"\r\n >\r\n <MicrophoneIcon />\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n className={`message-input__send-button${disabled ? ' message-input__send-button--disabled' : ''}`}\r\n onClick={sendCurrentText}\r\n disabled={disabled}\r\n aria-label=\"Send message\"\r\n title=\"Send message\"\r\n >\r\n <LuSend className=\"message-input__send-icon\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nexport default MessageInput;\r\n\r\nfunction isDateQuickOption(value) {\r\n const normalized = String(value || '')\r\n .trim()\r\n .toLowerCase();\r\n return ['today', 'tomorrow', 'next weekend', 'next week'].includes(\r\n normalized,\r\n );\r\n}\r\nfunction formatShortDate(date) {\r\n if (!date) return '--';\r\n return convertDateToDDMMYYYY(date);\r\n}\r\n\r\nfunction toDateOrNull(value) {\r\n if (!value) return null;\r\n if (value instanceof Date) {\r\n return Number.isNaN(value.getTime()) ? null : value;\r\n }\r\n const raw = String(value || '').trim();\r\n if (!raw) return null;\r\n\r\n const dmyMatch = raw.match(/^([0-3]?\\d)[/-]([01]?\\d)[/-](\\d{4})$/);\r\n if (dmyMatch) {\r\n const day = Number(dmyMatch[1]);\r\n const monthIndex = Number(dmyMatch[2]) - 1;\r\n const year = Number(dmyMatch[3]);\r\n const parsedDmy = new Date(year, monthIndex, day);\r\n if (\r\n !Number.isNaN(parsedDmy.getTime()) &&\r\n parsedDmy.getFullYear() === year &&\r\n parsedDmy.getMonth() === monthIndex &&\r\n parsedDmy.getDate() === day\r\n ) {\r\n return parsedDmy;\r\n }\r\n }\r\n\r\n const ymdMatch = raw.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\r\n if (ymdMatch) {\r\n const year = Number(ymdMatch[1]);\r\n const monthIndex = Number(ymdMatch[2]) - 1;\r\n const day = Number(ymdMatch[3]);\r\n const parsedYmd = new Date(year, monthIndex, day);\r\n if (\r\n !Number.isNaN(parsedYmd.getTime()) &&\r\n parsedYmd.getFullYear() === year &&\r\n parsedYmd.getMonth() === monthIndex &&\r\n parsedYmd.getDate() === day\r\n ) {\r\n return parsedYmd;\r\n }\r\n }\r\n\r\n const parsed = new Date(raw);\r\n return Number.isNaN(parsed.getTime()) ? null : parsed;\r\n}\r\n\r\nfunction isSameCalendarDate(a, b) {\r\n const first = a instanceof Date && !Number.isNaN(a.getTime()) ? a : null;\r\n const second = b instanceof Date && !Number.isNaN(b.getTime()) ? b : null;\r\n if (!first && !second) return true;\r\n if (!first || !second) return false;\r\n return (\r\n first.getFullYear() === second.getFullYear() &&\r\n first.getMonth() === second.getMonth() &&\r\n first.getDate() === second.getDate()\r\n );\r\n}\r\nfunction isDateBefore(left, right) {\r\n const a = toDateOrNull(left);\r\n const b = toDateOrNull(right);\r\n if (!a || !b) return false;\r\n return stripTime(a).getTime() < stripTime(b).getTime();\r\n}\r\n\r\nfunction isDateAfter(left, right) {\r\n const a = toDateOrNull(left);\r\n const b = toDateOrNull(right);\r\n if (!a || !b) return false;\r\n return stripTime(a).getTime() > stripTime(b).getTime();\r\n}\r\n\r\nfunction stripTime(date) {\r\n const next = new Date(date);\r\n next.setHours(0, 0, 0, 0);\r\n return next;\r\n}\r\n\r\nfunction addDays(date, days) {\r\n const base = stripTime(date);\r\n const next = new Date(base);\r\n next.setDate(base.getDate() + Number(days || 0));\r\n return next;\r\n}\r\n","export function isSpeechRecognitionSupported() {\r\n if (typeof window === 'undefined') return false;\r\n return Boolean(window.SpeechRecognition || window.webkitSpeechRecognition);\r\n}\r\n\r\nexport function isTextToSpeechSupported() {\r\n if (typeof window === 'undefined') return false;\r\n return Boolean(window.speechSynthesis && window.SpeechSynthesisUtterance);\r\n}\r\n\r\nexport function createSpeechRecognition(options = {}) {\r\n if (!isSpeechRecognitionSupported()) return null;\r\n\r\n const SpeechRecognition =\r\n window.SpeechRecognition || window.webkitSpeechRecognition;\r\n const recognition = new SpeechRecognition();\r\n\r\n recognition.lang = options.lang || 'en-US';\r\n recognition.continuous = options.continuous ?? true;\r\n recognition.interimResults = options.interimResults ?? true;\r\n recognition.maxAlternatives = options.maxAlternatives ?? 1;\r\n\r\n return recognition;\r\n}\r\n\r\nexport function cancelSpeech() {\r\n if (!isTextToSpeechSupported()) return;\r\n if (window.speechSynthesis.speaking || window.speechSynthesis.pending) {\r\n window.speechSynthesis.cancel();\r\n }\r\n}\r\n\r\nexport function speakText(text, options = {}) {\r\n if (!isTextToSpeechSupported()) return null;\r\n\r\n const content = String(text || '').trim();\r\n if (!content) return null;\r\n\r\n cancelSpeech();\r\n\r\n const utterance = new window.SpeechSynthesisUtterance(content);\r\n utterance.lang = options.lang || 'en-US';\r\n utterance.rate = options.rate ?? 1;\r\n utterance.pitch = options.pitch ?? 1.08;\r\n\r\n const preferredVoice = getPreferredVoice(utterance.lang, options.voiceName);\r\n if (preferredVoice) {\r\n utterance.voice = preferredVoice;\r\n utterance.lang = preferredVoice.lang || utterance.lang;\r\n }\r\n\r\n if (typeof options.onstart === 'function') {\r\n utterance.onstart = options.onstart;\r\n }\r\n if (typeof options.onend === 'function') {\r\n utterance.onend = options.onend;\r\n }\r\n if (typeof options.onerror === 'function') {\r\n utterance.onerror = options.onerror;\r\n }\r\n\r\n window.speechSynthesis.speak(utterance);\r\n return utterance;\r\n}\r\n\r\nfunction getPreferredVoice(lang = 'en-US', explicitVoiceName = '') {\r\n if (!isTextToSpeechSupported()) return null;\r\n\r\n const voices = window.speechSynthesis.getVoices();\r\n if (!Array.isArray(voices) || voices.length === 0) return null;\r\n\r\n const normalizedLang = String(lang || 'en-US').toLowerCase();\r\n const normalizedVoiceName = String(explicitVoiceName || '').trim().toLowerCase();\r\n\r\n if (normalizedVoiceName) {\r\n const exactMatch = voices.find(\r\n (voice) => String(voice?.name || '').trim().toLowerCase() === normalizedVoiceName,\r\n );\r\n if (exactMatch) return exactMatch;\r\n }\r\n\r\n const sameLanguageVoices = voices.filter((voice) =>\r\n String(voice?.lang || '').toLowerCase().startsWith(normalizedLang.split('-')[0]),\r\n );\r\n const pool = sameLanguageVoices.length ? sameLanguageVoices : voices;\r\n\r\n const preferredNameMatch = pool.find((voice) => {\r\n const name = String(voice?.name || '').toLowerCase();\r\n return FEMALE_VOICE_HINTS.some((hint) => name.includes(hint));\r\n });\r\n if (preferredNameMatch) return preferredNameMatch;\r\n\r\n const defaultSameLanguageVoice =\r\n pool.find((voice) => voice?.default) || pool[0] || null;\r\n\r\n return defaultSameLanguageVoice;\r\n}\r\n\r\nconst FEMALE_VOICE_HINTS = [\r\n 'female',\r\n 'woman',\r\n 'zira',\r\n 'hazel',\r\n 'susan',\r\n 'samantha',\r\n 'victoria',\r\n 'karen',\r\n 'moira',\r\n 'ava',\r\n 'allison',\r\n 'aria',\r\n 'jenny',\r\n 'neural female',\r\n 'google us english',\r\n];\r\n","import { useEffect, useRef, useState } from 'react';\r\nimport {\r\n cancelSpeech,\r\n createSpeechRecognition,\r\n isSpeechRecognitionSupported,\r\n isTextToSpeechSupported,\r\n speakText,\r\n} from '../services/speechService';\r\n\r\nfunction useConversation({\r\n assistantText = '',\r\n disabled = false,\r\n isBackendTyping = false,\r\n onSend,\r\n}) {\r\n const [isListening, setIsListening] = useState(false);\r\n const [isSpeaking, setIsSpeaking] = useState(false);\r\n const [speakerEnabled, setSpeakerEnabled] = useState(true);\r\n const [transcript, setTranscript] = useState('');\r\n const [status, setStatus] = useState(\r\n 'Tap the mic and speak to the travel assistant.',\r\n );\r\n const [error, setError] = useState('');\r\n\r\n const recognitionRef = useRef(null);\r\n const finalTranscriptRef = useRef('');\r\n const latestTranscriptRef = useRef('');\r\n const silenceTimerRef = useRef(null);\r\n const mountedRef = useRef(true);\r\n const shouldResumeAfterReplyRef = useRef(false);\r\n const lastSpokenAssistantRef = useRef('');\r\n const awaitingReplyRef = useRef(false);\r\n const isStartingRef = useRef(false);\r\n const isRecognitionActiveRef = useRef(false);\r\n\r\n useEffect(() => {\r\n mountedRef.current = true;\r\n return () => {\r\n mountedRef.current = false;\r\n window.clearTimeout(silenceTimerRef.current);\r\n try {\r\n recognitionRef.current?.stop();\r\n } catch (_error) {\r\n // Ignore recognition teardown failures.\r\n }\r\n cancelSpeech();\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!disabled || !isListening) return;\r\n stopListening();\r\n }, [disabled, isListening]);\r\n\r\n useEffect(() => {\r\n if (!isBackendTyping || disabled) return;\r\n awaitingReplyRef.current = true;\r\n setStatus('Travel assistant is processing your request...');\r\n }, [disabled, isBackendTyping]);\r\n\r\n useEffect(() => {\r\n const nextAssistantText = String(assistantText || '').trim();\r\n if (!nextAssistantText) return;\r\n\r\n setStatus(nextAssistantText);\r\n if (nextAssistantText === lastSpokenAssistantRef.current) return;\r\n\r\n lastSpokenAssistantRef.current = nextAssistantText;\r\n const shouldResume = awaitingReplyRef.current;\r\n awaitingReplyRef.current = false;\r\n\r\n if (!speakerEnabled || !isTextToSpeechSupported()) {\r\n if (shouldResume && !disabled) {\r\n window.setTimeout(() => {\r\n if (!mountedRef.current) return;\r\n startListening();\r\n }, 300);\r\n }\r\n return;\r\n }\r\n\r\n shouldResumeAfterReplyRef.current = shouldResume;\r\n speakText(nextAssistantText, {\r\n onstart: () => {\r\n if (!mountedRef.current) return;\r\n setIsSpeaking(true);\r\n },\r\n onend: () => {\r\n if (!mountedRef.current) return;\r\n setIsSpeaking(false);\r\n if (shouldResumeAfterReplyRef.current && !disabled) {\r\n shouldResumeAfterReplyRef.current = false;\r\n startListening();\r\n }\r\n },\r\n onerror: () => {\r\n if (!mountedRef.current) return;\r\n setIsSpeaking(false);\r\n if (shouldResumeAfterReplyRef.current && !disabled) {\r\n shouldResumeAfterReplyRef.current = false;\r\n startListening();\r\n }\r\n },\r\n });\r\n }, [assistantText, disabled, speakerEnabled]);\r\n\r\n const handleResolvedTurn = (userText) => {\r\n const text = String(userText || '').trim();\r\n if (!text) return;\r\n\r\n setTranscript(text);\r\n setError('');\r\n setStatus('Sending your request to the travel assistant...');\r\n awaitingReplyRef.current = true;\r\n onSend?.(text);\r\n };\r\n\r\n const ensureRecognition = () => {\r\n if (recognitionRef.current || !isSpeechRecognitionSupported()) {\r\n return recognitionRef.current;\r\n }\r\n\r\n const recognition = createSpeechRecognition({\r\n continuous: true,\r\n interimResults: true,\r\n lang: 'en-US',\r\n });\r\n\r\n if (!recognition) return null;\r\n\r\n recognition.onstart = () => {\r\n if (!mountedRef.current) return;\r\n isStartingRef.current = false;\r\n isRecognitionActiveRef.current = true;\r\n setIsListening(true);\r\n setStatus('Listening...');\r\n setError('');\r\n };\r\n\r\n recognition.onresult = (event) => {\r\n let finalText = '';\r\n let interimText = '';\r\n\r\n for (\r\n let index = event.resultIndex;\r\n index < event.results.length;\r\n index += 1\r\n ) {\r\n const result = event.results[index];\r\n const chunk = String(result?.[0]?.transcript || '').trim();\r\n if (!chunk) continue;\r\n if (result.isFinal) {\r\n finalText = `${finalText} ${chunk}`.trim();\r\n } else {\r\n interimText = `${interimText} ${chunk}`.trim();\r\n }\r\n }\r\n\r\n if (finalText) {\r\n finalTranscriptRef.current =\r\n `${finalTranscriptRef.current} ${finalText}`.trim();\r\n }\r\n\r\n const combinedText =\r\n `${finalTranscriptRef.current} ${interimText}`.trim();\r\n if (combinedText) {\r\n latestTranscriptRef.current = combinedText;\r\n setTranscript(combinedText);\r\n }\r\n\r\n window.clearTimeout(silenceTimerRef.current);\r\n silenceTimerRef.current = window.setTimeout(() => {\r\n stopListening();\r\n }, 2400);\r\n };\r\n\r\n recognition.onerror = (event) => {\r\n if (!mountedRef.current) return;\r\n isStartingRef.current = false;\r\n isRecognitionActiveRef.current = false;\r\n setError(resolveRecognitionError(event?.error));\r\n setStatus('Voice input unavailable right now.');\r\n setIsListening(false);\r\n };\r\n\r\n recognition.onend = () => {\r\n if (!mountedRef.current) return;\r\n isStartingRef.current = false;\r\n isRecognitionActiveRef.current = false;\r\n setIsListening(false);\r\n window.clearTimeout(silenceTimerRef.current);\r\n\r\n const finalText = finalTranscriptRef.current.trim();\r\n const fallbackText = latestTranscriptRef.current.trim();\r\n finalTranscriptRef.current = '';\r\n latestTranscriptRef.current = '';\r\n\r\n if (finalText) {\r\n handleResolvedTurn(finalText);\r\n } else if (fallbackText) {\r\n handleResolvedTurn(fallbackText);\r\n } else if (!disabled) {\r\n setStatus('No speech detected. Tap the mic and try again.');\r\n }\r\n };\r\n\r\n recognitionRef.current = recognition;\r\n return recognition;\r\n };\r\n\r\n const startListening = () => {\r\n if (disabled || isListening || isStartingRef.current || isRecognitionActiveRef.current) {\r\n return;\r\n }\r\n\r\n cancelSpeech();\r\n setIsSpeaking(false);\r\n setError('');\r\n setTranscript('');\r\n finalTranscriptRef.current = '';\r\n latestTranscriptRef.current = '';\r\n window.clearTimeout(silenceTimerRef.current);\r\n\r\n const recognition = ensureRecognition();\r\n if (!recognition) {\r\n setError('Speech recognition is not supported in this browser.');\r\n return;\r\n }\r\n\r\n try {\r\n isStartingRef.current = true;\r\n recognition.start();\r\n } catch (_error) {\r\n isStartingRef.current = false;\r\n if (isRecognitionActiveRef.current || isListening) {\r\n setStatus('Listening...');\r\n return;\r\n }\r\n setError('Microphone is busy. Please wait a moment and retry.');\r\n }\r\n };\r\n\r\n const stopListening = () => {\r\n window.clearTimeout(silenceTimerRef.current);\r\n isStartingRef.current = false;\r\n try {\r\n recognitionRef.current?.stop();\r\n } catch (_error) {\r\n isRecognitionActiveRef.current = false;\r\n setIsListening(false);\r\n }\r\n };\r\n\r\n const resetConversation = () => {\r\n stopListening();\r\n cancelSpeech();\r\n setIsSpeaking(false);\r\n setTranscript('');\r\n setError('');\r\n setStatus('Voice assistant reset. Tap the mic and speak to the travel assistant.');\r\n latestTranscriptRef.current = '';\r\n finalTranscriptRef.current = '';\r\n awaitingReplyRef.current = false;\r\n shouldResumeAfterReplyRef.current = false;\r\n lastSpokenAssistantRef.current = '';\r\n isStartingRef.current = false;\r\n isRecognitionActiveRef.current = false;\r\n };\r\n\r\n return {\r\n error,\r\n isListening,\r\n isSpeaking,\r\n speakerEnabled,\r\n speechRecognitionSupported: isSpeechRecognitionSupported(),\r\n status,\r\n transcript,\r\n setSpeakerEnabled,\r\n resetConversation,\r\n startListening,\r\n stopListening,\r\n };\r\n}\r\n\r\nfunction resolveRecognitionError(code) {\r\n switch (code) {\r\n case 'audio-capture':\r\n return 'No microphone was found for voice input.';\r\n case 'not-allowed':\r\n case 'service-not-allowed':\r\n return 'Microphone permission was denied.';\r\n case 'network':\r\n return 'Speech recognition lost connection. Please retry.';\r\n default:\r\n return 'Voice input could not be completed.';\r\n }\r\n}\r\n\r\nexport default useConversation;\r\n","import React from 'react';\r\nimport { FiMic, FiMicOff, FiX } from 'react-icons/fi';\r\nimport useConversation from '../hooks/useConversation';\r\n\r\nfunction VoiceAssistant({\r\n assistantText = '',\r\n disabled = false,\r\n isBackendTyping = false,\r\n onSend,\r\n onClose = () => {},\r\n standalonePage = false,\r\n}) {\r\n const {\r\n error,\r\n isListening,\r\n isSpeaking,\r\n speechRecognitionSupported,\r\n status,\r\n transcript,\r\n resetConversation,\r\n startListening,\r\n stopListening,\r\n } = useConversation({\r\n assistantText,\r\n disabled,\r\n isBackendTyping,\r\n onSend,\r\n });\r\n\r\n const phaseLabel = error\r\n ? 'voice unavailable'\r\n : isSpeaking\r\n ? 'speaking...'\r\n : isListening\r\n ? 'listening...'\r\n : isBackendTyping\r\n ? 'thinking...'\r\n : 'tap to speak';\r\n const phaseClass = error\r\n ? 'voice-assistant__phase--error'\r\n : isSpeaking\r\n ? 'voice-assistant__phase--speaking'\r\n : isListening\r\n ? 'voice-assistant__phase--listening'\r\n : isBackendTyping\r\n ? 'voice-assistant__phase--thinking'\r\n : 'voice-assistant__phase--idle';\r\n\r\n return (\r\n <section\r\n className={`voice-assistant${standalonePage ? ' voice-assistant--page' : ''}`}\r\n aria-label=\"Voice assistant\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n >\r\n <div className=\"voice-assistant__canvas\">\r\n <div className=\"voice-assistant__center\">\r\n <button\r\n type=\"button\"\r\n className={`voice-assistant__orb${isListening ? ' voice-assistant__orb--listening' : ''}${isSpeaking ? ' voice-assistant__orb--speaking' : ''}`}\r\n onClick={isListening ? stopListening : startListening}\r\n disabled={disabled || !speechRecognitionSupported}\r\n aria-label={isListening ? 'Stop listening' : 'Start listening'}\r\n >\r\n <span className=\"voice-assistant__orb-ring\" aria-hidden=\"true\" />\r\n <span className=\"voice-assistant__bars\" aria-hidden=\"true\">\r\n <span className=\"voice-assistant__bar voice-assistant__bar--1\" />\r\n <span className=\"voice-assistant__bar voice-assistant__bar--2\" />\r\n <span className=\"voice-assistant__bar voice-assistant__bar--3\" />\r\n <span className=\"voice-assistant__bar voice-assistant__bar--4\" />\r\n <span className=\"voice-assistant__bar voice-assistant__bar--5\" />\r\n </span>\r\n </button>\r\n <p className={`voice-assistant__phase ${phaseClass}`}>{phaseLabel}</p>\r\n {!error && status ? (\r\n <p className=\"voice-assistant__caption\">{toDisplayText(status)}</p>\r\n ) : null}\r\n {transcript ? (\r\n <p className=\"voice-assistant__heard\">\"{transcript}\"</p>\r\n ) : null}\r\n {error ? (\r\n <p className=\"voice-assistant__error\">{toDisplayText(error)}</p>\r\n ) : null}\r\n </div>\r\n\r\n <div className=\"voice-assistant__dock\">\r\n <button\r\n type=\"button\"\r\n className=\"voice-assistant__dock-button\"\r\n onClick={() => {\r\n resetConversation();\r\n stopListening();\r\n onClose();\r\n }}\r\n title=\"Close voice assistant\"\r\n aria-label=\"Close voice assistant\"\r\n >\r\n <FiX />\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={`voice-assistant__dock-button voice-assistant__dock-button--primary${isListening ? ' voice-assistant__dock-button--active' : ''}`}\r\n onClick={isListening ? stopListening : startListening}\r\n disabled={disabled || !speechRecognitionSupported}\r\n title={isListening ? 'Stop listening' : 'Start listening'}\r\n aria-label={isListening ? 'Stop listening' : 'Start listening'}\r\n >\r\n {isListening ? <FiMicOff /> : <FiMic />}\r\n </button>\r\n </div>\r\n </div>\r\n </section>\r\n );\r\n}\r\n\r\nfunction toDisplayText(value, fallback = '') {\r\n if (typeof value === 'string') return value;\r\n if (typeof value === 'number' || typeof value === 'boolean') {\r\n return String(value);\r\n }\r\n if (value && typeof value === 'object') {\r\n const preferred = value?.message || value?.error || value?.details || value?.msg;\r\n if (preferred) return String(preferred);\r\n try {\r\n return JSON.stringify(value);\r\n } catch (_error) {\r\n return fallback;\r\n }\r\n }\r\n return fallback;\r\n}\r\n\r\nexport default VoiceAssistant;\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { FiPlus } from 'react-icons/fi';\r\nimport { useSocket } from '../context/SocketContext';\r\nimport MessageList from './MessageList';\r\nimport MessageInput from './MessageInput';\r\nimport VoiceAssistant from './VoiceAssistant';\r\nimport { LuPanelLeft } from 'react-icons/lu';\r\nimport {\r\n parseFlightFilters,\r\n filterFlightData,\r\n sortFlightData,\r\n} from './flight-results/SmartFiltersUtils';\r\nimport { buildPrebookPayload } from './flight-results/helpers';\r\nimport secureLocalStorage from 'react-secure-storage';\r\nconst IDLE_TIMEOUT_MS = 15 * 60 * 1000;\r\n\r\nfunction ChatWindow() {\r\n const socket = useSocket();\r\n const [sessionId, setSessionId] = useState('');\r\n const [messages, setMessages] = useState([]);\r\n const [typing, setTyping] = useState(false);\r\n const [typingText, setTypingText] = useState('');\r\n const [isSessionExpired, setIsSessionExpired] = useState(false);\r\n const [assistantInstanceKey, setAssistantInstanceKey] = useState(0);\r\n const [, setLatestAssistantText] = useState('');\r\n const [isVoiceAssistantOpen, setIsVoiceAssistantOpen] = useState(false);\r\n const [prefillMessage, setPrefillMessage] = useState('');\r\n const [dismissedOptionsKey, setDismissedOptionsKey] = useState('');\r\n const [activeTravelerOptions, setActiveTravelerOptions] = useState([]);\r\n const [lastSearchQuery, setLastSearchQuery] = useState('');\r\n const [pendingRedirectAction, setPendingRedirectAction] = useState(null);\r\n const [pendingBookingConfirmation, setPendingBookingConfirmation] =\r\n useState(null);\r\n const [\r\n pendingProceedToBookConfirmation,\r\n setPendingProceedToBookConfirmation,\r\n ] = useState(false);\r\n const [pendingPaymentConfirmation, setPendingPaymentConfirmation] =\r\n useState(false);\r\n const paymentConfirmPromptLatchRef = useRef(false);\r\n const latestTravelerFormPayloadRef = useRef(null);\r\n const loadedSessionRef = useRef('');\r\n const shouldShowWelcomeRef = useRef(false);\r\n const hasExpiryMessageRef = useRef(false);\r\n const pendingMessageSourcesRef = useRef([]);\r\n\r\n // Derived values for options handling\r\n const latestOptionsMatch = [...messages]\r\n .map((item, index) => ({ item, index }))\r\n .reverse()\r\n .find(\r\n ({ item }) => Array.isArray(item?.options) && item.options.length > 0,\r\n );\r\n const latestFlightResultsIndex = [...messages]\r\n .map((item, index) => ({ item, index }))\r\n .reverse()\r\n .find(({ item }) => item?.type === 'flight_results')?.index;\r\n const latestOptions = latestOptionsMatch?.item?.options || [];\r\n const latestOptionsKey = latestOptionsMatch\r\n ? `${latestOptionsMatch.index}-${latestOptions.length}`\r\n : '';\r\n\r\n const normalizeIncomingMessage = (incoming) => {\r\n const payload = Array.isArray(incoming) ? incoming[1] : incoming;\r\n\r\n if (payload === null || payload === undefined) return null;\r\n if (typeof payload === 'string') {\r\n return { type: 'assistant_message', text: payload };\r\n }\r\n if (typeof payload !== 'object') return null;\r\n\r\n return payload;\r\n };\r\n\r\n useEffect(() => {\r\n const existingSessionId =\r\n getSessionIdFromUrl() || localStorage.getItem('travel_session_id');\r\n if (existingSessionId) {\r\n const stored = getStoredMessages(existingSessionId);\r\n setMessages(stored);\r\n setLatestAssistantText(getLatestSpeakableMessage(stored));\r\n shouldShowWelcomeRef.current = stored.length === 0;\r\n loadedSessionRef.current = existingSessionId;\r\n // Do not treat a stale localStorage activity timestamp as \"expired\" on first\r\n // paint: users reopening the app after hours would always see expiry. Idle\r\n // should be measured from this page load; refresh the activity baseline here.\r\n markSessionActivity(existingSessionId);\r\n } else {\r\n shouldShowWelcomeRef.current = true;\r\n }\r\n\r\n const userContext = buildSearchUserContext();\r\n socket.emit('chat:join', {\r\n sessionId: existingSessionId || null,\r\n user: userContext,\r\n userContext,\r\n });\r\n\r\n socket.on('chat:joined', (data) => {\r\n setSessionId(data.sessionId);\r\n localStorage.setItem('travel_session_id', data.sessionId);\r\n setSessionIdInUrl(data.sessionId);\r\n markSessionActivity(data.sessionId);\r\n if (loadedSessionRef.current !== data.sessionId) {\r\n const stored = getStoredMessages(data.sessionId);\r\n setMessages(stored);\r\n setLatestAssistantText(getLatestSpeakableMessage(stored));\r\n shouldShowWelcomeRef.current = stored.length === 0;\r\n loadedSessionRef.current = data.sessionId;\r\n }\r\n\r\n if (shouldShowWelcomeRef.current) {\r\n const welcomeMessage =\r\n 'Hi! I can help you search, compare, and book flights. Share your route and travel date to get started.';\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'assistant_message',\r\n text: welcomeMessage,\r\n },\r\n ]);\r\n setLatestAssistantText(welcomeMessage);\r\n shouldShowWelcomeRef.current = false;\r\n }\r\n });\r\n\r\n socket.on('chat:typing', ({ status, text }) => {\r\n setTyping(status);\r\n setTypingText(status ? String(text || '').trim() : '');\r\n });\r\n const handleUiLoading = (event) => {\r\n const isLoading = Boolean(event?.detail?.isLoading);\r\n const text = String(event?.detail?.text || '').trim();\r\n setTyping(isLoading);\r\n setTypingText(isLoading ? text : '');\r\n };\r\n window.addEventListener('chat:ui-loading', handleUiLoading);\r\n\r\n socket.on('chat:response', (response) => {\r\n const normalizedResponse = normalizeIncomingMessage(response);\r\n if (!normalizedResponse) return;\r\n\r\n if (normalizedResponse.type === 'flight_results') {\r\n // We used to pin data here, but user wants it in message list only\r\n }\r\n\r\n const source = pendingMessageSourcesRef.current.shift() || 'chat';\r\n const nextMessage =\r\n source === 'voice'\r\n ? { ...normalizedResponse, hiddenFromChat: true }\r\n : normalizedResponse;\r\n if (nextMessage.type !== 'user_message' && nextMessage.text) {\r\n setLatestAssistantText(String(nextMessage.text));\r\n }\r\n setMessages((prev) => [...prev, nextMessage]);\r\n });\r\n\r\n return () => {\r\n socket.off('chat:joined');\r\n socket.off('chat:typing');\r\n socket.off('chat:response');\r\n window.removeEventListener('chat:ui-loading', handleUiLoading);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!sessionId || isSessionExpired) return undefined;\r\n const touchActivity = () => {\r\n markSessionActivity(sessionId);\r\n };\r\n window.addEventListener('click', touchActivity);\r\n window.addEventListener('keydown', touchActivity);\r\n window.addEventListener('touchstart', touchActivity);\r\n return () => {\r\n window.removeEventListener('click', touchActivity);\r\n window.removeEventListener('keydown', touchActivity);\r\n window.removeEventListener('touchstart', touchActivity);\r\n };\r\n }, [sessionId, isSessionExpired]);\r\n\r\n useEffect(() => {\r\n const handleUpdateOptions = (event) => {\r\n const nextOptions = Array.isArray(event.detail?.options)\r\n ? event.detail.options.filter(\r\n (opt) =>\r\n !String(opt?.value || '').startsWith('APPLY_SAVED_TRAVELLER:'),\r\n )\r\n : [];\r\n setActiveTravelerOptions(nextOptions);\r\n };\r\n window.addEventListener(\r\n 'traveler-form:update-options',\r\n handleUpdateOptions,\r\n );\r\n return () => {\r\n window.removeEventListener(\r\n 'traveler-form:update-options',\r\n handleUpdateOptions,\r\n );\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n const handleTravelerFormStateUpdated = (event) => {\r\n const nextPayload = event?.detail?.prebookPayload || null;\r\n if (nextPayload && typeof nextPayload === 'object') {\r\n latestTravelerFormPayloadRef.current =\r\n cloneTravelerPayload(nextPayload);\r\n }\r\n };\r\n window.addEventListener(\r\n 'traveler-form:state-updated',\r\n handleTravelerFormStateUpdated,\r\n );\r\n return () => {\r\n window.removeEventListener(\r\n 'traveler-form:state-updated',\r\n handleTravelerFormStateUpdated,\r\n );\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n const handleActionLoader = (event) => {\r\n const status = Boolean(event?.detail?.status);\r\n const text = String(event?.detail?.text || '').trim();\r\n setTyping(status);\r\n setTypingText(status ? text || 'Processing your request...' : '');\r\n };\r\n window.addEventListener('chat:action-loader', handleActionLoader);\r\n return () => {\r\n window.removeEventListener('chat:action-loader', handleActionLoader);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n const handleBookingConfirmationRequest = (event) => {\r\n const detail = event?.detail || {};\r\n const fareAvailabilityPayload = detail?.fareAvailabilityPayload || null;\r\n if (\r\n !fareAvailabilityPayload ||\r\n typeof fareAvailabilityPayload !== 'object'\r\n ) {\r\n return;\r\n }\r\n\r\n const summary = detail?.summary || {};\r\n const normalizedSummary = normalizeBookingSummary(\r\n summary,\r\n fareAvailabilityPayload,\r\n );\r\n const isSplitRoundTrip = normalizedSummary?.type === 'split_roundtrip';\r\n const confirmText = isSplitRoundTrip\r\n ? buildSplitRoundTripConfirmationText(normalizedSummary)\r\n : buildSingleFlightConfirmationText(normalizedSummary);\r\n\r\n setPendingBookingConfirmation({\r\n fareAvailabilityPayload,\r\n });\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'assistant_message',\r\n text: confirmText,\r\n options: [\r\n { label: 'Yes', value: 'CONFIRM_BOOKING:YES' },\r\n { label: 'No', value: 'CONFIRM_BOOKING:NO' },\r\n ],\r\n },\r\n ]);\r\n };\r\n\r\n window.addEventListener(\r\n 'flight-booking:confirm-request',\r\n handleBookingConfirmationRequest,\r\n );\r\n return () => {\r\n window.removeEventListener(\r\n 'flight-booking:confirm-request',\r\n handleBookingConfirmationRequest,\r\n );\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n const handleConfirmProceedRequest = () => {\r\n setPendingProceedToBookConfirmation(true);\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'assistant_message',\r\n text: 'Do you want to proceed to book this flight?',\r\n options: [\r\n { label: 'Yes', value: 'CONFIRM_PROCEED_BOOK:YES' },\r\n { label: 'No', value: 'CONFIRM_PROCEED_BOOK:NO' },\r\n ],\r\n },\r\n ]);\r\n };\r\n window.addEventListener(\r\n 'traveler-form:confirm-proceed-request',\r\n handleConfirmProceedRequest,\r\n );\r\n return () => {\r\n window.removeEventListener(\r\n 'traveler-form:confirm-proceed-request',\r\n handleConfirmProceedRequest,\r\n );\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n const handleConfirmPaymentRequest = () => {\r\n if (paymentConfirmPromptLatchRef.current) return;\r\n paymentConfirmPromptLatchRef.current = true;\r\n setPendingPaymentConfirmation(true);\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'assistant_message',\r\n text: 'Do you want to proceed with payment?',\r\n options: [\r\n { label: 'Yes', value: 'CONFIRM_PAYMENT:YES' },\r\n { label: 'No', value: 'CONFIRM_PAYMENT:NO' },\r\n ],\r\n },\r\n ]);\r\n };\r\n window.addEventListener(\r\n 'traveler-form:confirm-payment-request',\r\n handleConfirmPaymentRequest,\r\n );\r\n return () => {\r\n window.removeEventListener(\r\n 'traveler-form:confirm-payment-request',\r\n handleConfirmPaymentRequest,\r\n );\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!sessionId || isSessionExpired) return undefined;\r\n const timer = window.setInterval(() => {\r\n const lastActivityAt = getSessionLastActivity(sessionId);\r\n if (!Number.isFinite(lastActivityAt)) return;\r\n const isExpiredNow = Date.now() - lastActivityAt > IDLE_TIMEOUT_MS;\r\n if (!isExpiredNow) return;\r\n setIsSessionExpired(true);\r\n }, 15000);\r\n return () => window.clearInterval(timer);\r\n }, [sessionId, isSessionExpired]);\r\n\r\n useEffect(() => {\r\n if (!isSessionExpired || hasExpiryMessageRef.current) return;\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'assistant_message',\r\n text: 'Session expired due to 15 minutes of inactivity. Click Restart Chat to continue.',\r\n },\r\n ]);\r\n hasExpiryMessageRef.current = true;\r\n }, [isSessionExpired]);\r\n\r\n useEffect(() => {\r\n if (!sessionId) return;\r\n storeMessages(sessionId, messages);\r\n }, [sessionId, messages]);\r\n\r\n useEffect(() => {\r\n let isActive = true;\r\n const returnParams = getPaymentReturnParams();\r\n if (!returnParams?.bookingId) return undefined;\r\n\r\n const resolvedSessionId =\r\n returnParams.sessionId || localStorage.getItem('travel_session_id') || '';\r\n if (!resolvedSessionId) {\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'assistant_message',\r\n text: 'Payment return received, but session is missing. Please continue in the same browser session.',\r\n },\r\n ]);\r\n return undefined;\r\n }\r\n\r\n const apiBase = (\r\n process.env.REACT_APP_API_BASE_URL || 'http://localhost:5000'\r\n ).replace(/\\/$/, '');\r\n\r\n const fetchConfirmationDetails = async () => {\r\n try {\r\n setActionLoading(true, 'Loading confirmation details...');\r\n const response = await fetch(\r\n `${apiBase}/api/v1/payment/confirmation-details`,\r\n {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n sessionId: resolvedSessionId,\r\n bookingId: returnParams.bookingId,\r\n }),\r\n },\r\n );\r\n const result = await response.json();\r\n if (!isActive) return;\r\n\r\n if (!response.ok || !result?.ok) {\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'assistant_message',\r\n text:\r\n result?.error ||\r\n 'Payment completed, but we could not fetch booking confirmation details.',\r\n },\r\n ]);\r\n return;\r\n }\r\n\r\n const confirmationMessage =\r\n 'Payment got Completed. Please check the confirmation page details.';\r\n setLatestAssistantText(confirmationMessage);\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'payment_confirmation',\r\n text: confirmationMessage,\r\n confirmation: result?.data || null,\r\n },\r\n ]);\r\n } catch (error) {\r\n if (!isActive) return;\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'assistant_message',\r\n text:\r\n error?.message ||\r\n 'Payment completed, but confirmation details are unavailable right now.',\r\n },\r\n ]);\r\n } finally {\r\n if (isActive) {\r\n setActionLoading(false);\r\n }\r\n }\r\n };\r\n\r\n fetchConfirmationDetails();\r\n clearPaymentReturnQueryParams();\r\n return () => {\r\n isActive = false;\r\n };\r\n }, []);\r\n\r\n const requestRedirectConfirmation = (action) => {\r\n setPendingRedirectAction(action || null);\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'assistant_message',\r\n text: 'You will be redirected to the results page. Do you want to continue?',\r\n options: [\r\n { label: 'Yes', value: 'CONFIRM_REDIRECT:YES' },\r\n { label: 'No', value: 'CONFIRM_REDIRECT:NO' },\r\n ],\r\n },\r\n ]);\r\n };\r\n\r\n const executeResetFlow = ({\r\n refetchSearch = false,\r\n queryOverride = '',\r\n suppressUserEcho = false,\r\n } = {}) => {\r\n const queryToRefetch =\r\n String(queryOverride || '').trim() ||\r\n String(lastSearchQuery || '').trim() ||\r\n getLatestSearchQuery(messages);\r\n\r\n setMessages((prev) => {\r\n const baseThread = pruneReviewStageMessages(prev);\r\n if (!refetchSearch || !queryToRefetch) return baseThread;\r\n if (suppressUserEcho) return baseThread;\r\n\r\n const hasSameQueryAtEnd =\r\n baseThread.length > 0 &&\r\n baseThread[baseThread.length - 1]?.type === 'user_message' &&\r\n String(baseThread[baseThread.length - 1]?.text || '').trim() ===\r\n queryToRefetch;\r\n\r\n if (hasSameQueryAtEnd) return baseThread;\r\n return [\r\n ...baseThread,\r\n {\r\n type: 'user_message',\r\n text: queryToRefetch,\r\n },\r\n ];\r\n });\r\n setActiveTravelerOptions([]);\r\n\r\n if (!refetchSearch || !queryToRefetch || !sessionId) return;\r\n setLastSearchQuery(queryToRefetch);\r\n pendingMessageSourcesRef.current.push('chat');\r\n setActionLoading(true, 'Loading search results...');\r\n socket.emit('chat:message', {\r\n sessionId,\r\n message: queryToRefetch,\r\n currentSlots: getLatestSearchContextFromMessages(messages),\r\n timezone: getUserTimeZone(),\r\n });\r\n };\r\n\r\n const handleAvailabilityReset = ({\r\n requireConfirmation = false,\r\n refetchSearch = false,\r\n queryOverride = '',\r\n } = {}) => {\r\n const travelerFormElement = getLatestActiveTravelerFormElement();\r\n const isPrebookDone =\r\n travelerFormElement?.getAttribute('data-prebook-done') === 'true';\r\n if (requireConfirmation && isPrebookDone) {\r\n requestRedirectConfirmation({\r\n type: 'back_to_results',\r\n refetchSearch,\r\n query: queryOverride,\r\n });\r\n return;\r\n }\r\n executeResetFlow({ refetchSearch, queryOverride });\r\n };\r\n\r\n const resetBookingFlowForFreshSearch = () => {};\r\n\r\n const handleAvailabilitySuccess = (prebookPayload) => {\r\n latestTravelerFormPayloadRef.current = cloneTravelerPayload(prebookPayload);\r\n setMessages((prev) => {\r\n const withReadOnlyPreviousForms = prev.map((item) =>\r\n item?.type === 'traveler_details_form'\r\n ? { ...item, readOnly: true }\r\n : item,\r\n );\r\n return [\r\n ...withReadOnlyPreviousForms,\r\n {\r\n type: 'traveler_details_form',\r\n text: 'Please fill traveler details.',\r\n prebookPayload,\r\n readOnly: false,\r\n options: [],\r\n hiddenFromChat: isVoiceAssistantOpen,\r\n },\r\n ];\r\n });\r\n };\r\n\r\n const appendUserMessage = (text, options = {}) => {\r\n const content = String(text || '').trim();\r\n if (!content) return;\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'user_message',\r\n text: content,\r\n hiddenFromChat: Boolean(options.hiddenFromChat),\r\n },\r\n ]);\r\n };\r\n\r\n const appendAssistantMessage = (text, options = {}) => {\r\n const content = String(text || '').trim();\r\n if (!content) return;\r\n setLatestAssistantText(content);\r\n setMessages((prev) => {\r\n const lastMessage = prev[prev.length - 1];\r\n const hiddenFromChat = Boolean(options.hiddenFromChat);\r\n const isDuplicateAssistantPrompt =\r\n lastMessage?.type === 'assistant_message' &&\r\n String(lastMessage?.text || '').trim() === content &&\r\n Boolean(lastMessage?.hiddenFromChat) === hiddenFromChat;\r\n\r\n if (isDuplicateAssistantPrompt) {\r\n return prev;\r\n }\r\n\r\n return [\r\n ...prev,\r\n {\r\n type: 'assistant_message',\r\n text: content,\r\n hiddenFromChat,\r\n },\r\n ];\r\n });\r\n };\r\n\r\n const appendVoiceUserMessage = (text) => {\r\n appendUserMessage(text, { hiddenFromChat: true });\r\n };\r\n\r\n const appendVoiceAssistantMessage = (text) => {\r\n appendAssistantMessage(text, { hiddenFromChat: true });\r\n };\r\n\r\n const appendPaymentConfirmationDetails = (details = null) => {\r\n const confirmation =\r\n details?.confirmation || details?.data?.payload || details?.data || null;\r\n if (confirmation && typeof confirmation === 'object') {\r\n const confirmationMessage =\r\n 'Booking confirmed successfully. Please check the confirmation details.';\r\n setLatestAssistantText(confirmationMessage);\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'payment_confirmation',\r\n text: confirmationMessage,\r\n confirmation,\r\n },\r\n ]);\r\n return;\r\n }\r\n appendAssistantMessage(\r\n 'Payment is being processed. Confirmation will be shown automatically once backend pushes the details.',\r\n );\r\n };\r\n\r\n const setActionLoading = (isLoading, text = '') => {\r\n window.dispatchEvent(\r\n new CustomEvent('chat:ui-loading', {\r\n detail: {\r\n isLoading,\r\n text: String(text || '').trim(),\r\n },\r\n }),\r\n );\r\n };\r\n\r\n const triggerFlightAvailability = (pendingBooking) => {\r\n const fareAvailabilityPayload =\r\n pendingBooking?.fareAvailabilityPayload || {};\r\n const payloadHasKeys =\r\n String(fareAvailabilityPayload?.ukey || '').trim() &&\r\n Array.isArray(fareAvailabilityPayload?.rmkey) &&\r\n fareAvailabilityPayload.rmkey.length > 0 &&\r\n String(fareAvailabilityPayload?.styp || '').trim();\r\n if (!payloadHasKeys) {\r\n appendAssistantMessage('Selected flight details are incomplete.');\r\n return;\r\n }\r\n setActionLoading(true, 'Loading availability...');\r\n\r\n const resolveUserUid = () => {\r\n try {\r\n const rawUser = localStorage.getItem('user');\r\n if (rawUser) {\r\n const parsed = JSON.parse(rawUser);\r\n const fromStore = String(\r\n parsed?.uid || parsed?.user?.uid || '',\r\n ).trim();\r\n if (fromStore) return fromStore;\r\n }\r\n } catch (error) {\r\n // ignore\r\n }\r\n const fromEnv = String(\r\n process.env.REACT_APP_FREQUENT_TRAVELLER_UID ||\r\n process.env.REACT_APP_USER_UID ||\r\n '',\r\n ).trim();\r\n if (fromEnv) return fromEnv;\r\n return '1058';\r\n };\r\n\r\n setTyping(true);\r\n setTypingText('Checking latest fare and preparing booking options...');\r\n socket.emit(\r\n 'chat:book',\r\n {\r\n sessionId: localStorage.getItem('travel_session_id') || sessionId || '',\r\n action: 'fare_available',\r\n uid: resolveUserUid(),\r\n ...fareAvailabilityPayload,\r\n },\r\n (response) => {\r\n setActionLoading(false);\r\n if (!response?.ok) {\r\n appendAssistantMessage(\r\n buildAvailabilityErrorText(\r\n response?.error,\r\n 'Failed to fetch fare availability.',\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n const rawAvailability = response?.data;\r\n if (!rawAvailability || typeof rawAvailability !== 'object') {\r\n appendAssistantMessage('Selected flight is not available right now.');\r\n return;\r\n }\r\n\r\n const framedPrebook = buildPrebookPayload(rawAvailability, {});\r\n framedPrebook.frequentTravellers = Array.isArray(\r\n response?.frequentTravellers,\r\n )\r\n ? response.frequentTravellers\r\n : [];\r\n framedPrebook.initialPaymentSummary = {\r\n gateways: Array.isArray(response?.payment?.gateways)\r\n ? response.payment.gateways\r\n : [],\r\n charges: [],\r\n customerPg: [],\r\n };\r\n handleAvailabilitySuccess(framedPrebook);\r\n },\r\n );\r\n };\r\n\r\n const repeatTravelerFormAtBottom = () => {\r\n setMessages((prev) => {\r\n const lastForm = [...prev]\r\n .map((item, index) => ({ item, index }))\r\n .reverse()\r\n .find(({ item }) => item?.type === 'traveler_details_form')?.item;\r\n if (!lastForm) return prev;\r\n const latestPayload = latestTravelerFormPayloadRef.current;\r\n const next = prev.map((item) =>\r\n item?.type === 'traveler_details_form'\r\n ? { ...item, readOnly: true }\r\n : item,\r\n );\r\n next.push({\r\n ...lastForm,\r\n readOnly: false,\r\n prebookPayload:\r\n latestPayload && typeof latestPayload === 'object'\r\n ? cloneTravelerPayload(latestPayload)\r\n : lastForm.prebookPayload,\r\n });\r\n return next;\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (!messages.length) return;\r\n const lastMessage = messages[messages.length - 1];\r\n if (lastMessage?.type === 'traveler_details_form') return;\r\n\r\n const activeTravelerForm = getLatestActiveTravelerFormElement();\r\n if (!activeTravelerForm) return;\r\n const isPrebookDone =\r\n activeTravelerForm.getAttribute('data-prebook-done') === 'true';\r\n if (!isPrebookDone) return;\r\n\r\n const timer = window.setTimeout(() => {\r\n repeatTravelerFormAtBottom();\r\n }, 0);\r\n return () => {\r\n window.clearTimeout(timer);\r\n };\r\n }, [messages]);\r\n\r\n const tryHandleFilterLocally = (text) => {\r\n if (!text.trim()) return false;\r\n if (isSearchSlotUpdateCommand(text)) return false;\r\n\r\n const lastResultIdx = [...messages]\r\n .reverse()\r\n .findIndex((m) => m.type === 'flight_results');\r\n if (lastResultIdx === -1) return false;\r\n\r\n const actualIdx = messages.length - 1 - lastResultIdx;\r\n const lastMsg = messages[actualIdx];\r\n\r\n const normalized = text.toLowerCase();\r\n const isRoundTrip = isRoundTripResultsMessage(lastMsg);\r\n const newFilters = parseFlightFilters(text, isRoundTrip);\r\n\r\n const hasRealFilters = hasMeaningfulFlightFilters(newFilters);\r\n\r\n const wantsBookWithParsedFilters =\r\n hasRealFilters &&\r\n /\\b(book|reserve|buy|purchase|confirm booking|proceed to book)\\b/.test(\r\n normalized,\r\n );\r\n\r\n const shouldDeferFilterToBackend = (() => {\r\n const lower = String(normalized || '').trim();\r\n if (!lower) return false;\r\n if (wantsBookWithParsedFilters) return false;\r\n\r\n const hasQuestionForm =\r\n /\\b(what|which|who|can you|could you|please tell)\\b/.test(lower);\r\n const hasComparativeIntent =\r\n /\\b(highest|lowest|costliest|most expensive|cheapest|fastest|slowest)\\b/.test(\r\n lower,\r\n );\r\n const hasOrdinalIntent =\r\n /\\b(first|second|third|fourth|fifth|\\d+(st|nd|rd|th))\\b/.test(lower);\r\n const hasThresholdIntent =\r\n /\\b(after|before)\\s+\\d{1,2}(?::\\d{2})?\\s*(am|pm)?\\b/.test(lower);\r\n const hasMultiClauseIntent = /\\b(and|then|but|except|without)\\b/.test(\r\n lower,\r\n );\r\n const hasNaturalPhrase =\r\n /\\b(flight after|flight before|best flight|top flight|recommended)\\b/.test(\r\n lower,\r\n );\r\n\r\n // For complex/ambiguous natural-language requests, prefer backend LLM parsing.\r\n return Boolean(\r\n hasQuestionForm ||\r\n hasComparativeIntent ||\r\n hasOrdinalIntent ||\r\n hasThresholdIntent ||\r\n hasMultiClauseIntent ||\r\n hasNaturalPhrase,\r\n );\r\n })();\r\n if (shouldDeferFilterToBackend) return false;\r\n\r\n const mentionsSearch =\r\n /\\bfrom\\s+[a-z][a-z .'-]+\\s+to\\s+[a-z][a-z .'-]+\\b/i.test(normalized) ||\r\n /\\b[a-z]{3}\\s*(?:to|-)\\s*[a-z]{3}\\b/i.test(text) ||\r\n /\\b\\d{1,2}[-\\/]\\d{1,2}[-\\/]\\d{2,4}\\b/.test(normalized) ||\r\n /\\b(on|departure|departing|returning)\\s+\\d{1,2}(?:st|nd|rd|th)?\\b/i.test(\r\n normalized,\r\n ) ||\r\n /\\b(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec|tomorrow|today|next week)\\b/i.test(\r\n normalized,\r\n );\r\n if (mentionsSearch) return false;\r\n\r\n if (!hasRealFilters) return false;\r\n\r\n const basePayload = getFlightResultsPayload(lastMsg);\r\n const mergedFilters = newFilters.clearAll\r\n ? null\r\n : {\r\n ...(lastMsg?.filters || {}),\r\n ...newFilters,\r\n };\r\n\r\n const preview = computeFilteredPayloadForDisplay(\r\n basePayload,\r\n mergedFilters,\r\n );\r\n const baseHasFlights = Array.isArray(basePayload) && basePayload.length > 0;\r\n const noMatchingFlights =\r\n baseHasFlights &&\r\n mergedFilters &&\r\n !mergedFilters.clearAll &&\r\n preview.length === 0;\r\n\r\n if (noMatchingFlights) {\r\n setMessages((prev) => {\r\n const updated = [...prev];\r\n const latestResultIndexInPrev = [...updated]\r\n .map((item, index) => ({ item, index }))\r\n .reverse()\r\n .find(({ item }) => item?.type === 'flight_results')?.index;\r\n if (!Number.isInteger(latestResultIndexInPrev)) return prev;\r\n\r\n const sourceResultMsg = updated[latestResultIndexInPrev];\r\n updated.push({\r\n type: 'user_message',\r\n text,\r\n });\r\n updated.push({\r\n type: 'assistant_message',\r\n text: 'No flights matched your filters. Here are all results again — please pick another flight or adjust your criteria.',\r\n });\r\n updated[latestResultIndexInPrev] = {\r\n ...sourceResultMsg,\r\n filters: null,\r\n };\r\n return updated;\r\n });\r\n return true;\r\n }\r\n\r\n setMessages((prev) => {\r\n const updated = [...prev];\r\n const latestResultIndexInPrev = [...updated]\r\n .map((item, index) => ({ item, index }))\r\n .reverse()\r\n .find(({ item }) => item?.type === 'flight_results')?.index;\r\n if (!Number.isInteger(latestResultIndexInPrev)) return prev;\r\n\r\n const sourceResultMsg = updated[latestResultIndexInPrev];\r\n const mergedFromPrev = newFilters.clearAll\r\n ? null\r\n : {\r\n ...(sourceResultMsg?.filters || {}),\r\n ...newFilters,\r\n };\r\n\r\n updated.push({\r\n type: 'user_message',\r\n text,\r\n });\r\n updated[latestResultIndexInPrev] = {\r\n ...sourceResultMsg,\r\n filters: mergedFromPrev,\r\n };\r\n return updated;\r\n });\r\n\r\n if (shouldAutoBookFirstFilteredFlight(text)) {\r\n scheduleAutoBookFirstFilteredFlight();\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const sendMessage = (text, options = {}) => {\r\n if (isSessionExpired) return;\r\n const content = String(text || '').trim();\r\n if (!content) return;\r\n\r\n markSessionActivity(sessionId);\r\n const currentSearchContext = getLatestSearchContextFromMessages(messages);\r\n\r\n // Slot-update follow-ups should always go to backend intent parsing.\r\n // This avoids local smart-filter/card handlers from swallowing update commands.\r\n const isSlotUpdateFollowup = isSearchSlotUpdateCommand(content);\r\n\r\n const hasUndismissedProceedToBookOptions =\r\n latestOptionsKey !== dismissedOptionsKey &&\r\n latestOptions.some((opt) =>\r\n String(opt?.value || '').startsWith('CONFIRM_PROCEED_BOOK:'),\r\n );\r\n\r\n if (\r\n pendingProceedToBookConfirmation ||\r\n hasUndismissedProceedToBookOptions\r\n ) {\r\n const confirmationIntent = getConfirmationReplyIntent(content);\r\n const isPositive = confirmationIntent === 'yes';\r\n const isNegative = confirmationIntent === 'no';\r\n if (isPositive || isNegative) {\r\n const source = options.source === 'voice' ? 'voice' : 'chat';\r\n if (!options.skipEcho) {\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'user_message',\r\n text: content,\r\n hiddenFromChat: source === 'voice',\r\n },\r\n ]);\r\n }\r\n if (latestOptionsKey) setDismissedOptionsKey(latestOptionsKey);\r\n setPendingProceedToBookConfirmation(false);\r\n if (isPositive) {\r\n window.dispatchEvent(new CustomEvent('traveler-form:proceed-book'));\r\n } else {\r\n appendAssistantMessage('Okay, staying on traveler details form.');\r\n }\r\n return;\r\n }\r\n }\r\n\r\n const hasUndismissedPaymentOptions =\r\n latestOptionsKey !== dismissedOptionsKey &&\r\n latestOptions.some((opt) =>\r\n String(opt?.value || '').startsWith('CONFIRM_PAYMENT:'),\r\n );\r\n\r\n if (pendingPaymentConfirmation || hasUndismissedPaymentOptions) {\r\n const confirmationIntent = getConfirmationReplyIntent(content);\r\n const isPositive = confirmationIntent === 'yes';\r\n const isNegative = confirmationIntent === 'no';\r\n if (isPositive || isNegative) {\r\n const source = options.source === 'voice' ? 'voice' : 'chat';\r\n if (!options.skipEcho) {\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'user_message',\r\n text: content,\r\n hiddenFromChat: source === 'voice',\r\n },\r\n ]);\r\n }\r\n if (latestOptionsKey) setDismissedOptionsKey(latestOptionsKey);\r\n setPendingPaymentConfirmation(false);\r\n paymentConfirmPromptLatchRef.current = false;\r\n if (isPositive) {\r\n window.dispatchEvent(new CustomEvent('traveler-form:execute-pay-now'));\r\n } else {\r\n appendAssistantMessage('Okay, payment was not started.');\r\n }\r\n return;\r\n }\r\n }\r\n\r\n if (pendingBookingConfirmation) {\r\n const confirmationIntent = getConfirmationReplyIntent(content);\r\n const isPositive = confirmationIntent === 'yes';\r\n const isNegative = confirmationIntent === 'no';\r\n\r\n if (isPositive || isNegative) {\r\n const source = options.source === 'voice' ? 'voice' : 'chat';\r\n if (!options.skipEcho) {\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'user_message',\r\n text: content,\r\n hiddenFromChat: source === 'voice',\r\n },\r\n ]);\r\n }\r\n if (latestOptionsKey) {\r\n setDismissedOptionsKey(latestOptionsKey);\r\n }\r\n setPendingBookingConfirmation(null);\r\n if (isPositive) {\r\n triggerFlightAvailability(pendingBookingConfirmation);\r\n } else {\r\n executeResetFlow({ refetchSearch: true, suppressUserEcho: true });\r\n }\r\n return;\r\n }\r\n }\r\n\r\n // Automatically dismiss current options when a message is sent\r\n if (latestOptionsKey) {\r\n setDismissedOptionsKey(latestOptionsKey);\r\n }\r\n\r\n const travelerFormActive = Boolean(getLatestActiveTravelerFormElement());\r\n\r\n if (travelerFormActive && isProceedToBookCommand(content)) {\r\n const source = options.source === 'voice' ? 'voice' : 'chat';\r\n const appendLocal = (t) => {\r\n if (options.skipEcho) return;\r\n setMessages((prev) => [\r\n ...prev,\r\n { type: 'user_message', text: t, hiddenFromChat: source === 'voice' },\r\n ]);\r\n };\r\n if (tryHandleTravelerVoiceCommand(content, appendLocal)) {\r\n window.setTimeout(() => {\r\n repeatTravelerFormAtBottom();\r\n }, 0);\r\n return;\r\n }\r\n }\r\n\r\n const latestResultsMessage = [...messages]\r\n .reverse()\r\n .find((item) => item?.type === 'flight_results');\r\n const parsedIntentFilters = parseFlightFilters(\r\n content,\r\n isRoundTripResultsMessage(latestResultsMessage),\r\n );\r\n const flightMessageIntent = classifyFlightMessageIntent({\r\n text: content,\r\n parsedFilters: parsedIntentFilters,\r\n hasVisibleResults: hasVisibleFlightResults(),\r\n isSlotUpdateFollowup,\r\n });\r\n\r\n if (flightMessageIntent === 'selection' && !travelerFormActive) {\r\n const source = options.source === 'voice' ? 'voice' : 'chat';\r\n const appendLocal = (t) => {\r\n setMessages((prev) => [\r\n ...prev,\r\n { type: 'user_message', text: t, hiddenFromChat: source === 'voice' },\r\n ]);\r\n };\r\n if (tryHandleFlightVoiceCommand(content, appendLocal)) {\r\n return;\r\n }\r\n const debugText = buildFlightSelectionDebugText(content);\r\n appendLocal(content);\r\n appendAssistantMessage(\r\n `I could not find a selectable flight card in the current results. ${debugText}`,\r\n { hiddenFromChat: source === 'voice' },\r\n );\r\n return;\r\n }\r\n\r\n // If the traveler details form is visible and the user is entering a fresh search,\r\n // reset the booking flow and send the message directly.\r\n if (travelerFormActive && flightMessageIntent === 'search') {\r\n const travelerFormElement = getLatestActiveTravelerFormElement();\r\n const isPrebookDone =\r\n travelerFormElement?.getAttribute('data-prebook-done') === 'true';\r\n if (isPrebookDone) {\r\n requestRedirectConfirmation({\r\n type: 'fresh_search',\r\n refetchSearch: true,\r\n query: content,\r\n });\r\n return;\r\n }\r\n resetBookingFlowForFreshSearch();\r\n setLastSearchQuery(content);\r\n const source = options.source === 'voice' ? 'voice' : 'chat';\r\n if (!options.skipEcho) {\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'user_message',\r\n text: content,\r\n hiddenFromChat: source === 'voice',\r\n },\r\n ]);\r\n }\r\n pendingMessageSourcesRef.current.push(source);\r\n socket.emit('chat:message', {\r\n sessionId,\r\n message: content,\r\n currentSlots: currentSearchContext,\r\n timezone: getUserTimeZone(),\r\n });\r\n return;\r\n }\r\n\r\n if (!isSlotUpdateFollowup && options.source !== 'voice') {\r\n const appendLocal = (t) => {\r\n setMessages((prev) => [...prev, { type: 'user_message', text: t }]);\r\n };\r\n\r\n if (tryHandleBestSuggestionBooking(content, appendLocal)) {\r\n return;\r\n }\r\n\r\n const cardActionHandled = tryHandleFlightCardActionCommand(\r\n content,\r\n appendLocal,\r\n );\r\n if (cardActionHandled?.status === 'NO_FILTER_DATA') {\r\n appendLocal(content);\r\n appendAssistantMessage(cardActionHandled.message);\r\n return;\r\n }\r\n if (cardActionHandled?.status === 'HANDLED') {\r\n return;\r\n }\r\n\r\n if (tryHandleViewAllCommand(content, appendLocal)) {\r\n return;\r\n }\r\n if (isTravelerBackCommand(content) && travelerFormActive) {\r\n handleAvailabilityReset({\r\n requireConfirmation: true,\r\n refetchSearch: true,\r\n });\r\n return;\r\n }\r\n const handledTravelerCommand = tryHandleTravelerVoiceCommand(\r\n content,\r\n appendLocal,\r\n );\r\n if (handledTravelerCommand) {\r\n if (isSaveDetailsCommand(content) || isPromoCodeCommand(content)) {\r\n return;\r\n }\r\n window.setTimeout(() => {\r\n repeatTravelerFormAtBottom();\r\n }, 0);\r\n return;\r\n }\r\n if (\r\n (flightMessageIntent === 'filter' || flightMessageIntent === 'sort') &&\r\n tryHandleFilterLocally(content)\r\n ) {\r\n return;\r\n }\r\n if (\r\n flightMessageIntent === 'selection' &&\r\n tryHandleFlightVoiceCommand(content, appendLocal)\r\n ) {\r\n return;\r\n }\r\n if (flightMessageIntent === 'selection' && hasVisibleFlightResults()) {\r\n const debugText = buildFlightSelectionDebugText(content);\r\n appendLocal(content);\r\n appendAssistantMessage(\r\n `I could not find a selectable flight card in the current results. ${debugText}`,\r\n );\r\n return;\r\n }\r\n }\r\n\r\n if (flightMessageIntent === 'search') {\r\n resetBookingFlowForFreshSearch();\r\n setLastSearchQuery(content);\r\n }\r\n\r\n const source = options.source === 'voice' ? 'voice' : 'chat';\r\n if (!options.skipEcho) {\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n type: 'user_message',\r\n text: content,\r\n hiddenFromChat: source === 'voice',\r\n },\r\n ]);\r\n }\r\n // Show an immediate lightweight loader until backend sends detailed typing text.\r\n setTyping(true);\r\n setTypingText('Loading search results...');\r\n pendingMessageSourcesRef.current.push(source);\r\n console.log('Search API is calling...');\r\n const userContext = buildSearchUserContext();\r\n socket.emit('chat:message', {\r\n sessionId,\r\n message: content,\r\n userContext,\r\n currentSlots: currentSearchContext,\r\n timezone: getUserTimeZone(),\r\n });\r\n };\r\n\r\n const handleVoiceSend = (text) => {\r\n const content = String(text || '').trim();\r\n if (!content || isSessionExpired) return;\r\n\r\n const travelerFormActive = Boolean(getLatestActiveTravelerFormElement());\r\n const latestResultsMessage = [...messages]\r\n .reverse()\r\n .find((item) => item?.type === 'flight_results');\r\n const parsedIntentFilters = parseFlightFilters(\r\n content,\r\n isRoundTripResultsMessage(latestResultsMessage),\r\n );\r\n const voiceIntent = classifyFlightMessageIntent({\r\n text: content,\r\n parsedFilters: parsedIntentFilters,\r\n hasVisibleResults: hasVisibleFlightResults(),\r\n isSlotUpdateFollowup: isSearchSlotUpdateCommand(content),\r\n });\r\n\r\n if (travelerFormActive && voiceIntent === 'search') {\r\n sendMessage(content, { source: 'voice' });\r\n markSessionActivity(sessionId);\r\n return;\r\n }\r\n\r\n if (tryHandleTravelerVoiceCommand(content, appendVoiceUserMessage)) {\r\n if (isSaveDetailsCommand(content) || isPromoCodeCommand(content)) {\r\n markSessionActivity(sessionId);\r\n return;\r\n }\r\n window.setTimeout(() => {\r\n repeatTravelerFormAtBottom();\r\n }, 0);\r\n markSessionActivity(sessionId);\r\n return;\r\n }\r\n\r\n if (\r\n (voiceIntent === 'filter' || voiceIntent === 'sort') &&\r\n tryHandleFilterLocally(content)\r\n ) {\r\n markSessionActivity(sessionId);\r\n return;\r\n }\r\n\r\n if (tryHandleBestSuggestionBooking(content, appendVoiceUserMessage)) {\r\n markSessionActivity(sessionId);\r\n return;\r\n }\r\n\r\n if (\r\n voiceIntent === 'selection' &&\r\n tryHandleFlightVoiceCommand(content, appendVoiceUserMessage)\r\n ) {\r\n markSessionActivity(sessionId);\r\n return;\r\n }\r\n\r\n sendMessage(content, { source: 'voice' });\r\n };\r\n\r\n const handleStartNewChat = () => {\r\n const currentSessionId = String(sessionId || '').trim();\r\n if (currentSessionId) {\r\n clearStoredMessages(currentSessionId);\r\n clearSessionActivity(currentSessionId);\r\n }\r\n setTyping(false);\r\n setTypingText('');\r\n setMessages([]);\r\n setPrefillMessage('');\r\n setDismissedOptionsKey('');\r\n setPendingPaymentConfirmation(false);\r\n paymentConfirmPromptLatchRef.current = false;\r\n setSessionId('');\r\n setIsSessionExpired(false);\r\n setLatestAssistantText('');\r\n setIsVoiceAssistantOpen(false);\r\n hasExpiryMessageRef.current = false;\r\n loadedSessionRef.current = '';\r\n shouldShowWelcomeRef.current = true;\r\n setAssistantInstanceKey((current) => current + 1);\r\n localStorage.removeItem('travel_session_id');\r\n clearSessionIdFromUrl();\r\n const userContext = buildSearchUserContext();\r\n socket.emit('chat:join', {\r\n sessionId: null,\r\n user: userContext,\r\n userContext,\r\n });\r\n };\r\n\r\n const handleOptionClick = (opt) => {\r\n if (isSessionExpired) return;\r\n markSessionActivity(sessionId);\r\n const text = String(opt?.value ?? opt?.label ?? '').trim();\r\n if (!text) return;\r\n\r\n if (text.startsWith('APPLY_SAVED_TRAVELLER:')) {\r\n const index = parseInt(text.split(':')[1], 10);\r\n window.dispatchEvent(\r\n new CustomEvent('traveler-form:apply-saved', {\r\n detail: { index },\r\n }),\r\n );\r\n setDismissedOptionsKey(latestOptionsKey);\r\n return;\r\n }\r\n\r\n if (text === 'CONFIRM_REDIRECT:YES') {\r\n const action = pendingRedirectAction;\r\n setPendingRedirectAction(null);\r\n if (!action) return;\r\n executeResetFlow({\r\n refetchSearch: Boolean(action?.refetchSearch),\r\n queryOverride: String(action?.query || '').trim(),\r\n suppressUserEcho: action?.type === 'back_to_results',\r\n });\r\n setDismissedOptionsKey(latestOptionsKey);\r\n return;\r\n }\r\n\r\n if (text === 'CONFIRM_REDIRECT:NO') {\r\n setPendingRedirectAction(null);\r\n appendAssistantMessage('Stayed on the pre-booking page.');\r\n setDismissedOptionsKey(latestOptionsKey);\r\n return;\r\n }\r\n\r\n if (text === 'CONFIRM_BOOKING:YES') {\r\n const pending = pendingBookingConfirmation;\r\n setPendingBookingConfirmation(null);\r\n if (pending) {\r\n triggerFlightAvailability(pending);\r\n }\r\n setDismissedOptionsKey(latestOptionsKey);\r\n return;\r\n }\r\n\r\n if (text === 'CONFIRM_BOOKING:NO') {\r\n setPendingBookingConfirmation(null);\r\n executeResetFlow({ refetchSearch: true, suppressUserEcho: true });\r\n setDismissedOptionsKey(latestOptionsKey);\r\n return;\r\n }\r\n\r\n if (text === 'CONFIRM_PROCEED_BOOK:YES') {\r\n setPendingProceedToBookConfirmation(false);\r\n window.dispatchEvent(new CustomEvent('traveler-form:proceed-book'));\r\n setDismissedOptionsKey(latestOptionsKey);\r\n return;\r\n }\r\n\r\n if (text === 'CONFIRM_PROCEED_BOOK:NO') {\r\n setPendingProceedToBookConfirmation(false);\r\n appendAssistantMessage('Okay, staying on traveler details form.');\r\n setDismissedOptionsKey(latestOptionsKey);\r\n return;\r\n }\r\n\r\n if (text === 'CONFIRM_PAYMENT:YES') {\r\n setPendingPaymentConfirmation(false);\r\n paymentConfirmPromptLatchRef.current = false;\r\n window.dispatchEvent(new CustomEvent('traveler-form:execute-pay-now'));\r\n setDismissedOptionsKey(latestOptionsKey);\r\n return;\r\n }\r\n\r\n if (text === 'CONFIRM_PAYMENT:NO') {\r\n setPendingPaymentConfirmation(false);\r\n paymentConfirmPromptLatchRef.current = false;\r\n appendAssistantMessage('Okay, payment was not started.');\r\n setDismissedOptionsKey(latestOptionsKey);\r\n return;\r\n }\r\n\r\n sendMessage(text, {\r\n source: isVoiceAssistantOpen ? 'voice' : 'chat',\r\n });\r\n setDismissedOptionsKey(latestOptionsKey);\r\n setPrefillMessage('');\r\n };\r\n\r\n const chatMessages = getChatThreadMessages(messages);\r\n const voicePageMessages = getVoicePageMessages(messages);\r\n const latestVoiceAssistantText = getLatestVoiceSpeakableMessage(messages);\r\n\r\n if (isVoiceAssistantOpen) {\r\n return (\r\n <div className=\"voice-page\">\r\n <div className=\"voice-page__results\">\r\n {voicePageMessages.length ? (\r\n <MessageList\r\n messages={voicePageMessages}\r\n typing={false}\r\n onOptionClick={handleOptionClick}\r\n onAvailabilitySuccess={handleAvailabilitySuccess}\r\n onAvailabilityReset={handleAvailabilityReset}\r\n onTravelerGoBack={() =>\r\n handleAvailabilityReset({\r\n requireConfirmation: true,\r\n refetchSearch: true,\r\n })\r\n }\r\n onVoiceAssistantMessage={appendVoiceAssistantMessage}\r\n onPaymentSuccess={appendPaymentConfirmationDetails}\r\n sessionId={sessionId}\r\n variant=\"voice-page\"\r\n />\r\n ) : (\r\n <div className=\"voice-page__placeholder\">\r\n <p className=\"voice-page__placeholder-title\">\r\n Voice search is ready\r\n </p>\r\n <p className=\"voice-page__placeholder-copy\">\r\n Search results, traveler details, or payment blocks will appear\r\n here while you continue the conversation by voice.\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n <VoiceAssistant\r\n key={assistantInstanceKey}\r\n assistantText={latestVoiceAssistantText}\r\n disabled={isSessionExpired}\r\n isBackendTyping={typing}\r\n onSend={handleVoiceSend}\r\n onClose={() => setIsVoiceAssistantOpen(false)}\r\n standalonePage\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n const isTravelerFormVisible = [...messages]\r\n .reverse()\r\n .find((m) => m.type === 'traveler_details_form' && !m.hiddenFromChat);\r\n let currentOptions = latestOptions.filter(\r\n (opt) => !String(opt?.value || '').startsWith('APPLY_SAVED_TRAVELLER:'),\r\n );\r\n if (isTravelerFormVisible && activeTravelerOptions.length > 0) {\r\n currentOptions = activeTravelerOptions;\r\n }\r\n if (isTravelerFormVisible) {\r\n currentOptions = currentOptions.filter((opt) =>\r\n /^CONFIRM_(REDIRECT|PROCEED_BOOK|PAYMENT):/.test(String(opt?.value || '')),\r\n );\r\n }\r\n currentOptions = currentOptions.filter((opt) => {\r\n const value = String(opt?.value || '');\r\n if (value.startsWith('CONFIRM_REDIRECT:'))\r\n return Boolean(pendingRedirectAction);\r\n if (value.startsWith('CONFIRM_BOOKING:'))\r\n return Boolean(pendingBookingConfirmation);\r\n if (value.startsWith('CONFIRM_PROCEED_BOOK:'))\r\n return Boolean(pendingProceedToBookConfirmation);\r\n if (value.startsWith('CONFIRM_PAYMENT:'))\r\n return Boolean(pendingPaymentConfirmation);\r\n return true;\r\n });\r\n\r\n const optionsHiddenBecauseResultsMovedPastPrompt =\r\n Number.isInteger(latestFlightResultsIndex) &&\r\n Number.isInteger(latestOptionsMatch?.index) &&\r\n latestFlightResultsIndex > latestOptionsMatch.index;\r\n\r\n const forceFooterForBookingConfirmation =\r\n Boolean(pendingBookingConfirmation) &&\r\n currentOptions.some((o) =>\r\n String(o?.value || '').startsWith('CONFIRM_BOOKING:'),\r\n );\r\n\r\n const forceFooterForProceedConfirmation =\r\n Boolean(pendingProceedToBookConfirmation) &&\r\n currentOptions.some((o) =>\r\n String(o?.value || '').startsWith('CONFIRM_PROCEED_BOOK:'),\r\n );\r\n\r\n const forceFooterForPaymentConfirmation =\r\n Boolean(pendingPaymentConfirmation) &&\r\n currentOptions.some((o) =>\r\n String(o?.value || '').startsWith('CONFIRM_PAYMENT:'),\r\n );\r\n\r\n const shouldShowLatestOptions =\r\n currentOptions.length > 0 &&\r\n (!optionsHiddenBecauseResultsMovedPastPrompt ||\r\n forceFooterForBookingConfirmation ||\r\n forceFooterForProceedConfirmation ||\r\n forceFooterForPaymentConfirmation) &&\r\n latestOptionsKey !== dismissedOptionsKey;\r\n const activeOptions = shouldShowLatestOptions ? currentOptions : [];\r\n const dateSelectionContext = deriveDateSelectionContext(messages);\r\n const isReturnDateSelection = isReturnDatePrompt(latestOptionsMatch?.item);\r\n\r\n return (\r\n <div className=\"chat-window-container\">\r\n <header className=\"topbar\">\r\n <button type=\"button\" className=\"icon-btn\" aria-label=\"Open sidebar\">\r\n <LuPanelLeft />\r\n </button>\r\n <h1 className=\"title\">Chat with Zoe</h1>\r\n <div className=\"new-chat-btn-container\">\r\n {/* {sessionId ? (\r\n <span className=\"session-pill\">Session: {sessionId}</span>\r\n ) : null}\r\n {isSessionExpired ? (\r\n <button\r\n type=\"button\"\r\n className=\"expired-button\"\r\n title=\"Session expired\"\r\n disabled\r\n >\r\n Expired\r\n </button>\r\n ) : null} */}\r\n <button\r\n type=\"button\"\r\n onClick={handleStartNewChat}\r\n className=\"new-chat-btn\"\r\n >\r\n <FiPlus />\r\n <span>New Chat</span>\r\n </button>\r\n </div>\r\n </header>\r\n\r\n <div className=\"chat-window\">\r\n <MessageList\r\n messages={chatMessages}\r\n typing={typing}\r\n typingText={typingText}\r\n onOptionClick={handleOptionClick}\r\n onAvailabilitySuccess={handleAvailabilitySuccess}\r\n onAvailabilityReset={handleAvailabilityReset}\r\n onTravelerGoBack={() =>\r\n handleAvailabilityReset({\r\n requireConfirmation: true,\r\n refetchSearch: true,\r\n })\r\n }\r\n onVoiceAssistantMessage={() => {}}\r\n onPaymentSuccess={appendPaymentConfirmationDetails}\r\n sessionId={sessionId}\r\n />\r\n <MessageInput\r\n onSend={sendMessage}\r\n disabled={isSessionExpired}\r\n prefillMessage={prefillMessage}\r\n onPrefillConsumed={() => setPrefillMessage('')}\r\n options={activeOptions}\r\n isReturnDateSelection={isReturnDateSelection}\r\n knownOnwardDate={dateSelectionContext.onwardDate}\r\n knownReturnDate={dateSelectionContext.returnDate}\r\n onOptionClick={handleOptionClick}\r\n onOpenVoiceAssistant={() => {\r\n if (isSessionExpired) return;\r\n setIsVoiceAssistantOpen(true);\r\n }}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default ChatWindow;\r\n\r\nfunction isStructuredTravelerDetailsPaste(text) {\r\n const raw = String(text || '').trim();\r\n if (!raw) return false;\r\n if (!/\\b(?:traveller|traveler)\\s*\\d+/i.test(raw)) return false;\r\n // Semicolon/colon field list (FN:, LN:, DOB:, …) — not a flight search pax count.\r\n return /\\b(?:FN|LN|DOB|TYP|TL|NAT|NUM|ISSDT|EXPDT)\\s*:/i.test(raw);\r\n}\r\n\r\nfunction isSearchSlotUpdateCommand(text) {\r\n const raw = String(text || '').trim();\r\n const normalized = raw.toLowerCase();\r\n if (!normalized) return false;\r\n\r\n if (isStructuredTravelerDetailsPaste(raw)) return false;\r\n\r\n // When true, skip local-only filter handlers so the message hits the backend\r\n // (LLM + search). Includes common spelling mistakes on verbs and travel terms.\r\n\r\n const hasUpdateVerb =\r\n /\\b(change|chage|chnage|chang|chanage|chnge|updated?|updte|updae|updat|modify|modfy|modifiy|set|replace|repalce|replce|switch|swtich|swich|make\\s+it|switch\\s+to|fix|correct|corect|corrrect|reschedule|reshedule|rescheduel)\\b/.test(\r\n normalized,\r\n );\r\n const hasCasualRequest =\r\n /\\b(i\\s+need|i\\s+want|we\\s+need|we\\s+want|let\\s+us|let's|please|pls|plz)\\b/.test(\r\n normalized,\r\n );\r\n\r\n const hasSlotKeyword =\r\n /\\b(?:destination|destionation|destiantion|destinaton|destianton|destimation|destinatoin)\\b/.test(\r\n normalized,\r\n ) ||\r\n /\\b(?:arrival|arival|arrval|arriavl|arrive|arive|arriv|arrivee)(?:\\s+city)?\\b/.test(\r\n normalized,\r\n ) ||\r\n /\\b(?:source|souce|origin|orgin|origen)\\b/.test(normalized) ||\r\n /\\b(?:departure|departuer|deprature|depature|departture|deperture|depart|deprt|depatr)\\b/.test(\r\n normalized,\r\n ) ||\r\n /\\b(?:departing|depating|departng)\\b/.test(normalized) ||\r\n /\\b(?:route|rotue|airport|airprot|from)\\b/.test(normalized) ||\r\n /\\b(?:flying|fliyng|fling|returning|retruning|returnig|inbound|outbound)\\b/.test(\r\n normalized,\r\n ) ||\r\n /\\b(?:return\\s+date|retrun\\s+date|departure\\s+date|departue\\s+date|travel\\s+date|traval\\s+date|date)\\b/.test(\r\n normalized,\r\n );\r\n\r\n const hasExplicitDestinationToCity =\r\n /\\b(?:my\\s+)?(?:destination|destionation|destiantion|destinaton|destianton|destimation)\\s+to\\s+[a-z]/i.test(\r\n raw,\r\n );\r\n const hasExplicitOriginToCity =\r\n /\\b(?:my\\s+)?(?:source|souce|origin|orgin|origen)\\s+to\\s+[a-z]/i.test(raw);\r\n const hasArriveInCity =\r\n /\\b(?:arrival|arival|arrval|arrive|arive|landing|landng)\\s+in\\s+[a-z]/i.test(\r\n raw,\r\n );\r\n\r\n const hasFlyOrGoingToCity =\r\n /\\b(?:fly|fliy|flying|fliyng|fling|going|giong|heading|headng)\\s+to\\s+(?!the\\b|a\\b|an\\b)([a-z][a-z'`\\s-]{2,40})\\b/i.test(\r\n raw,\r\n );\r\n\r\n const hasCityRoutePhrase =\r\n /\\bfrom\\s+[a-z0-9][a-z0-9\\s.'-]{1,40}\\s+to\\s+[a-z0-9]/i.test(raw) ||\r\n /\\b[a-z]{3}\\s*(?:to|-|\\/)\\s*[a-z]{3}\\b/i.test(raw);\r\n\r\n const hasPaxKeyword =\r\n /\\b(?:adult|adults|aduls|adt|passenger|passangers|pasenger|traveller|travellers|travler|travllers|traveler|travelers|pax|people|persons|guests|child|children|chilren|chidren|chd|kid|kids|infant|infanat|infent|infants|inf|toddler|baby|babies|solo|couple|famliy|family\\s+of)\\b/.test(\r\n normalized,\r\n );\r\n\r\n const hasCabinOrClass =\r\n /\\b(?:economy|econom|econmy|econommy|premium\\s+economy|business|buisness|busines|busness|first(\\s+class)?|frist(\\s+class)?|frst(\\s+class)?|coach|cabin|seat\\s+class|upgrade|upgarde|downgrade|downgrad)\\b/.test(\r\n normalized,\r\n );\r\n\r\n const hasTripType =\r\n /\\b(?:one[\\s-]?way|oneway|round[\\s-]?trip|roundtrip|roud\\s+trip|retrun\\s+trip|return\\s+trip|return\\s+flight|reutrn\\s+flight|with\\s+return|add\\s+return|remove\\s+return)\\b/.test(\r\n normalized,\r\n );\r\n\r\n const hasDateRescheduleWord =\r\n /\\b(?:return\\s+date|retrun\\s+date|departure\\s+date|departue\\s+date|travel\\s+date|traval\\s+date|depart\\s+on|deprt\\s+on|leave\\s+on|fly\\s+on|travel\\s+on|traval\\s+on|coming\\s+back|comming\\s+back|move\\s+(the\\s+)?(trip|flight|date)|postpone|postopne|bump\\s+to)\\b/.test(\r\n normalized,\r\n );\r\n\r\n const hasCalendarHint =\r\n /\\b(?:today|tomorrow|tomorow|tommorrow|tommorow|tonight|next\\s+week|next\\s+weekend|this\\s+weekend|next\\s+month)\\b/.test(\r\n normalized,\r\n ) ||\r\n /\\b(?:monday|tuesday|wednesday|wensday|wednsday|thursday|thrusday|thusday|friday|fridy|saturday|satuday|sunday|sundey)\\b/.test(\r\n normalized,\r\n ) ||\r\n /\\b(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\\s+\\d{1,2}\\b/i.test(\r\n raw,\r\n ) ||\r\n /\\b\\d{1,2}[-\\/]\\d{1,2}[-\\/]\\d{2,4}\\b/.test(raw);\r\n\r\n const hasCorrection =\r\n /\\b(?:not\\s+that|i\\s+meant|actually|actully|acutally|wrong\\s+(city|date|airport|route)|instead\\s+of|insted\\s+of|correction|corrction)\\b/.test(\r\n normalized,\r\n );\r\n\r\n const filterOnlySort =\r\n /^\\s*(sort|order|rank|show|list)\\b.*\\b(price|fare|cost|duration|time|cheapest|cheepest|chepest|expensive|expensiv|fastest|fastes)\\b/i.test(\r\n normalized,\r\n ) &&\r\n !hasSlotKeyword &&\r\n !hasCityRoutePhrase;\r\n\r\n if (filterOnlySort) return false;\r\n\r\n if (\r\n hasExplicitDestinationToCity ||\r\n hasExplicitOriginToCity ||\r\n hasArriveInCity ||\r\n hasFlyOrGoingToCity\r\n ) {\r\n return true;\r\n }\r\n\r\n if (hasPaxKeyword) return true;\r\n\r\n if (hasCabinOrClass || hasTripType) {\r\n return hasUpdateVerb || hasCasualRequest || hasCorrection;\r\n }\r\n\r\n if (hasDateRescheduleWord || (hasCalendarHint && hasUpdateVerb)) {\r\n return true;\r\n }\r\n\r\n if (\r\n hasCorrection &&\r\n (hasSlotKeyword || hasCityRoutePhrase || hasCalendarHint)\r\n ) {\r\n return true;\r\n }\r\n\r\n if (\r\n hasCityRoutePhrase &&\r\n (hasUpdateVerb || hasCorrection || hasCasualRequest)\r\n ) {\r\n return true;\r\n }\r\n\r\n if (hasUpdateVerb && (hasSlotKeyword || hasPaxKeyword || hasCalendarHint)) {\r\n return true;\r\n }\r\n\r\n if (\r\n hasCasualRequest &&\r\n (hasSlotKeyword || hasCityRoutePhrase || hasFlyOrGoingToCity)\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction getLatestSearchContextFromMessages(messages = []) {\r\n const latestResultMessage = [...(Array.isArray(messages) ? messages : [])]\r\n .reverse()\r\n .find((item) => item?.type === 'flight_results');\r\n const params = latestResultMessage?.data?.params || {};\r\n const context = {\r\n dep: params?.dep || null,\r\n arr: params?.arr || null,\r\n dd: params?.dd || null,\r\n ad: params?.ad || null,\r\n adt: params?.adt || null,\r\n chd: params?.chd || null,\r\n inf: params?.inf || null,\r\n tt: params?.tt || null,\r\n cl: params?.cl || null,\r\n };\r\n const hasAnyValue = Object.values(context).some(\r\n (value) =>\r\n value !== null && value !== undefined && String(value).trim() !== '',\r\n );\r\n return hasAnyValue ? context : null;\r\n}\r\n\r\nfunction getUserTimeZone() {\r\n try {\r\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\r\n } catch (error) {\r\n return 'UTC';\r\n }\r\n}\r\n\r\nfunction getSessionIdFromUrl() {\r\n const search = new URLSearchParams(window.location.search || '');\r\n return (\r\n String(\r\n search.get('sessionId') ||\r\n search.get('sessionid') ||\r\n search.get('sid') ||\r\n '',\r\n ).trim() || ''\r\n );\r\n}\r\n\r\n/**\r\n * User context sent to backend with `chat:join` and `chat:message`.\r\n *\r\n * Fields:\r\n * - uid: user id\r\n * - agid: agency id\r\n * - grpid: group id (optional)\r\n * - dsgid: designation id (optional)\r\n * - utyp: user type (e.g. employee/manager/admin)\r\n * - agtyp: agency type (e.g. Corporate Flow/B2B/B2C)\r\n * - bt: business trip enabled flag\r\n * - pt: personal trip enabled flag\r\n * - trmd: selected trip mode (`bt` or `pt`) if already chosen\r\n * - cha: channel (`B2B`/`B2C`)\r\n *\r\n * Source priority:\r\n * 1) react-secure-storage keys\r\n * 2) localStorage keys\r\n */\r\nfunction buildSearchUserContext() {\r\n const rawContext = getStoredUserObject();\r\n\r\n const uid = toDefinedValue(rawContext?.uid ?? rawContext?.id);\r\n const agid = toDefinedValue(rawContext?.agid ?? rawContext?.agencyId);\r\n const grpid = toDefinedValue(rawContext?.grpid ?? rawContext?.groupId);\r\n const dsgid = toDefinedValue(rawContext?.dsgid ?? rawContext?.designationId);\r\n const utyp = toDefinedValue(rawContext?.utyp ?? rawContext?.userType);\r\n const agtyp = toDefinedValue(rawContext?.agtyp ?? rawContext?.agencyType);\r\n const bt = toBooleanOrUndefined(rawContext?.bt ?? rawContext?.businessTrip);\r\n const pt = toBooleanOrUndefined(rawContext?.pt ?? rawContext?.personalTrip);\r\n const trmd = toDefinedValue(rawContext?.trmd ?? rawContext?.tripMode);\r\n\r\n const fallbackChannel =\r\n String(agtyp || '')\r\n .trim()\r\n .toLowerCase()\r\n .includes('corporate') ||\r\n String(agtyp || '')\r\n .trim()\r\n .toLowerCase() === 'b2b'\r\n ? 'B2B'\r\n : 'B2C';\r\n const cha = toDefinedValue(\r\n rawContext?.cha ?? rawContext?.chnl ?? fallbackChannel,\r\n );\r\n\r\n return {\r\n uid: 194,\r\n agid: 156,\r\n grpid,\r\n dsgid,\r\n utyp,\r\n agtyp: 'Normal Flow',\r\n bt,\r\n pt,\r\n trmd,\r\n cha: 'B2B',\r\n };\r\n}\r\n\r\nfunction getStoredUserObject() {\r\n try {\r\n const secureValue = secureLocalStorage.getItem('user');\r\n const secureParsed = normalizeStoredContextValue(secureValue);\r\n if (secureParsed) return secureParsed;\r\n } catch (error) {\r\n // Ignore secure storage access errors and continue fallback.\r\n }\r\n\r\n try {\r\n const raw = localStorage.getItem('user');\r\n const parsed = normalizeStoredContextValue(raw);\r\n if (parsed) return parsed;\r\n } catch (error) {\r\n // Ignore malformed storage values.\r\n }\r\n\r\n return {};\r\n}\r\n\r\nfunction normalizeStoredContextValue(value) {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n let parsed = value;\r\n if (typeof value === 'string') {\r\n try {\r\n parsed = JSON.parse(value);\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\r\n return null;\r\n }\r\n if (parsed.user && typeof parsed.user === 'object') return parsed.user;\r\n if (parsed.payload && typeof parsed.payload === 'object')\r\n return parsed.payload;\r\n return parsed;\r\n}\r\n\r\nfunction toDefinedValue(value) {\r\n if (value === undefined || value === null) return undefined;\r\n const text = String(value).trim();\r\n return text ? value : undefined;\r\n}\r\n\r\nfunction toBooleanOrUndefined(value) {\r\n if (value === true || value === false) return value;\r\n const text = String(value || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!text) return undefined;\r\n if (['true', '1', 'yes', 'y'].includes(text)) return true;\r\n if (['false', '0', 'no', 'n'].includes(text)) return false;\r\n return undefined;\r\n}\r\n\r\nfunction setSessionIdInUrl(sessionId) {\r\n if (!window?.history?.replaceState) return;\r\n const sid = String(sessionId || '').trim();\r\n if (!sid) return;\r\n const url = new URL(window.location.href);\r\n url.searchParams.set('sid', sid);\r\n window.history.replaceState(\r\n {},\r\n document.title,\r\n `${url.pathname}${url.search}${url.hash}`,\r\n );\r\n}\r\n\r\nfunction clearSessionIdFromUrl() {\r\n if (!window?.history?.replaceState) return;\r\n const url = new URL(window.location.href);\r\n ['sid', 'sessionId', 'sessionid'].forEach((key) =>\r\n url.searchParams.delete(key),\r\n );\r\n window.history.replaceState(\r\n {},\r\n document.title,\r\n `${url.pathname}${url.search}${url.hash}`,\r\n );\r\n}\r\n\r\nfunction firstNonEmptyParam(search, keys) {\r\n for (const key of keys) {\r\n const value = String(search.get(key) || '').trim();\r\n if (value) return value;\r\n }\r\n return '';\r\n}\r\n\r\nfunction getPaymentReturnParams() {\r\n const search = new URLSearchParams(window.location.search || '');\r\n const bookingId = firstNonEmptyParam(search, [\r\n 'bookingId',\r\n 'bookingid',\r\n 'booking_id',\r\n 'bkid',\r\n 'order_booking_id',\r\n 'orderId',\r\n 'order_id',\r\n ]);\r\n const sessionId = firstNonEmptyParam(search, [\r\n 'sessionId',\r\n 'sessionid',\r\n 'sid',\r\n ]);\r\n\r\n return { bookingId, sessionId };\r\n}\r\n\r\nfunction clearPaymentReturnQueryParams() {\r\n if (!window?.history?.replaceState) return;\r\n const url = new URL(window.location.href);\r\n [\r\n 'bookingId',\r\n 'bookingid',\r\n 'booking_id',\r\n 'bkid',\r\n 'order_booking_id',\r\n 'orderId',\r\n 'order_id',\r\n 'sessionId',\r\n 'sessionid',\r\n 'sid',\r\n ].forEach((key) => url.searchParams.delete(key));\r\n window.history.replaceState(\r\n {},\r\n document.title,\r\n `${url.pathname}${url.search}${url.hash}`,\r\n );\r\n}\r\n\r\nfunction getMessagesStorageKey(sessionId) {\r\n return `travel_chat_messages_${String(sessionId || '').trim()}`;\r\n}\r\n\r\nfunction getStoredMessages(sessionId) {\r\n const key = getMessagesStorageKey(sessionId);\r\n if (!key || key.endsWith('_')) return [];\r\n try {\r\n const raw = localStorage.getItem(key);\r\n if (!raw) return [];\r\n const parsed = JSON.parse(raw);\r\n return Array.isArray(parsed) ? parsed : [];\r\n } catch (error) {\r\n return [];\r\n }\r\n}\r\n\r\nfunction storeMessages(sessionId, messages) {\r\n const key = getMessagesStorageKey(sessionId);\r\n if (!key || key.endsWith('_')) return;\r\n try {\r\n localStorage.setItem(\r\n key,\r\n JSON.stringify(Array.isArray(messages) ? messages : []),\r\n );\r\n } catch (error) {\r\n // Ignore quota/storage errors and keep chat running.\r\n }\r\n}\r\n\r\nfunction clearStoredMessages(sessionId) {\r\n const key = getMessagesStorageKey(sessionId);\r\n if (!key || key.endsWith('_')) return;\r\n localStorage.removeItem(key);\r\n}\r\n\r\nfunction getActivityStorageKey(sessionId) {\r\n return `travel_session_last_activity_${String(sessionId || '').trim()}`;\r\n}\r\n\r\nfunction markSessionActivity(sessionId) {\r\n const sid = String(sessionId || '').trim();\r\n if (!sid) return;\r\n localStorage.setItem(getActivityStorageKey(sid), String(Date.now()));\r\n}\r\n\r\nfunction getSessionLastActivity(sessionId) {\r\n const sid = String(sessionId || '').trim();\r\n if (!sid) return NaN;\r\n const raw = localStorage.getItem(getActivityStorageKey(sid));\r\n const parsed = Number(raw);\r\n // Reject 0 / negative (corrupt or placeholder) so we don't treat as ancient epoch.\r\n if (!Number.isFinite(parsed) || parsed <= 0) return NaN;\r\n return parsed;\r\n}\r\n\r\nfunction clearSessionActivity(sessionId) {\r\n const sid = String(sessionId || '').trim();\r\n if (!sid) return;\r\n localStorage.removeItem(getActivityStorageKey(sid));\r\n}\r\n\r\nfunction getLatestSpeakableMessage(messages = []) {\r\n const latest = [...messages]\r\n .reverse()\r\n .find(\r\n (item) =>\r\n item &&\r\n item.type !== 'user_message' &&\r\n typeof item.text === 'string' &&\r\n item.text.trim(),\r\n );\r\n\r\n return String(latest?.text || '').trim();\r\n}\r\n\r\nfunction tryHandleFlightVoiceCommand(text, appendUserMessage = () => {}) {\r\n if (tryHandleRoundTripDualSelectionCommand(text, appendUserMessage)) {\r\n return true;\r\n }\r\n\r\n const attemptHandleCommand = (command) => {\r\n if (!command) return false;\r\n const positionalTarget = getCommandButtonByPosition({\r\n ...command,\r\n rawText: text,\r\n });\r\n if (positionalTarget) {\r\n appendUserMessage(text);\r\n positionalTarget.click();\r\n return true;\r\n }\r\n\r\n const clickableButtons = getVoiceCommandButtons(\r\n command.intent,\r\n command.leg,\r\n );\r\n if (!clickableButtons.length) return false;\r\n\r\n const targetIndex = Math.max(\r\n 0,\r\n Math.min(command.index, clickableButtons.length - 1),\r\n );\r\n const targetButton = clickableButtons[targetIndex];\r\n if (!targetButton) return false;\r\n\r\n appendUserMessage(text);\r\n targetButton.click();\r\n return true;\r\n };\r\n\r\n const command = parseFlightVoiceCommand(text);\r\n if (attemptHandleCommand(command)) return true;\r\n\r\n // Keep \"select Nth flight\" behavior identical to \"book Nth flight\".\r\n const bookEquivalentText = String(text || '').replace(/\\bselect\\b/i, 'book');\r\n if (bookEquivalentText !== text) {\r\n const fallbackCommand = parseFlightVoiceCommand(bookEquivalentText);\r\n if (attemptHandleCommand(fallbackCommand)) return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction flightLegSortRank(legRaw) {\r\n const v = String(legRaw || '')\r\n .trim()\r\n .toLowerCase();\r\n if (v === 'onward') return 0;\r\n if (v === 'round-trip' || v === 'roundtrip') return 1;\r\n if (v === 'return') return 2;\r\n return 9;\r\n}\r\n\r\n/**\r\n * When the user does not name a leg, infer onward vs return from phrasing\r\n * (split round-trip). Returns '' if ambiguous.\r\n */\r\nfunction inferImplicitLegForBookingMessage(normalized) {\r\n const n = String(normalized || '').toLowerCase();\r\n const returnish =\r\n /\\b(return|inbound|back|homeward|reverse\\s+leg|second\\s+leg|return\\s+leg|returning\\s+leg|flight\\s+back)\\b/.test(\r\n n,\r\n );\r\n const onwardish =\r\n /\\b(onward|outbound|outward|first\\s+leg|departure\\s+leg|going\\s+leg|outbound\\s+leg)\\b/.test(\r\n n,\r\n );\r\n if (returnish && !onwardish) return 'return';\r\n if (onwardish && !returnish) return 'onward';\r\n return '';\r\n}\r\n\r\nfunction getCommandButtonByPosition(command = {}) {\r\n if (!command || command.intent === 'book-split-flight') return null;\r\n if (!Number.isFinite(command.index) || command.index < 0) return null;\r\n\r\n const wantsLast = command.index === Number.MAX_SAFE_INTEGER;\r\n const desiredPosition = wantsLast ? null : Number(command.index + 1);\r\n const latestScope = getLatestVisibleResultsScope();\r\n if (!latestScope) return null;\r\n\r\n const rawLower = String(command.rawText || '').toLowerCase();\r\n\r\n const allEntries = Array.from(\r\n latestScope.querySelectorAll('[data-ui-flight-card=\"true\"]'),\r\n )\r\n .filter((card) => isElementVisible(card))\r\n .map((card) => ({\r\n card,\r\n position: Number(card?.dataset?.flightPosition || NaN),\r\n legRaw: String(card?.dataset?.flightLeg || '').trim(),\r\n }))\r\n .filter((entry) => Number.isFinite(entry.position) && entry.position > 0);\r\n\r\n const visibleLegTypes = new Set(\r\n allEntries.map((e) => e.legRaw.toLowerCase()).filter(Boolean),\r\n );\r\n\r\n let legValue = normalizeLegValue(command.leg);\r\n if (legValue && !visibleLegTypes.has(legValue)) {\r\n legValue = '';\r\n }\r\n const disambigLeg =\r\n legValue || normalizeLegValue(inferImplicitLegForBookingMessage(rawLower));\r\n\r\n const cardSelector = legValue\r\n ? `[data-ui-flight-card=\"true\"][data-flight-leg=\"${legValue}\"]`\r\n : '[data-ui-flight-card=\"true\"]';\r\n const cards = Array.from(latestScope.querySelectorAll(cardSelector))\r\n .filter((card) => isElementVisible(card))\r\n .map((card) => ({\r\n card,\r\n position: Number(card?.dataset?.flightPosition || NaN),\r\n legRaw: String(card?.dataset?.flightLeg || '').trim(),\r\n }))\r\n .filter((entry) => Number.isFinite(entry.position) && entry.position > 0);\r\n if (!cards.length) return null;\r\n\r\n const airlineHint = extractAirlineHintFromFlightCommand(\r\n command.rawText || '',\r\n );\r\n const filteredCards = airlineHint\r\n ? cards.filter((entry) =>\r\n isAirlineMatch(\r\n normalizeSearchText(entry.card?.dataset?.flightAirline || ''),\r\n normalizeSearchText(airlineHint),\r\n ),\r\n )\r\n : cards;\r\n if (!filteredCards.length) return null;\r\n\r\n const sortedCards = [...filteredCards].sort((a, b) => {\r\n const lr = flightLegSortRank(a.legRaw) - flightLegSortRank(b.legRaw);\r\n if (lr !== 0) return lr;\r\n return a.position - b.position;\r\n });\r\n\r\n const pickButtonFromCard = (card) => {\r\n const selectors =\r\n command.intent === 'select-flight'\r\n ? [\r\n '[data-voice-action=\"select-flight\"]',\r\n '[data-ui-action=\"select-flight\"]',\r\n '[data-voice-action=\"book-flight\"]',\r\n '[data-ui-action=\"book-flight\"]',\r\n ]\r\n : [\r\n '[data-voice-action=\"book-flight\"]',\r\n '[data-ui-action=\"book-flight\"]',\r\n '[data-voice-action=\"select-flight\"]',\r\n '[data-ui-action=\"select-flight\"]',\r\n ];\r\n for (const selector of selectors) {\r\n const button = card.querySelector(selector);\r\n if (!button || button.disabled || !isElementVisible(button)) continue;\r\n return button;\r\n }\r\n return null;\r\n };\r\n\r\n const flightNorm = extractNormalizedFlightNumberFromBookText(\r\n command.rawText || '',\r\n );\r\n if (flightNorm) {\r\n const hits = sortedCards.filter(\r\n (entry) =>\r\n normalizeFlightNumber(entry.card?.dataset?.flightNumber || '') ===\r\n flightNorm,\r\n );\r\n if (hits.length === 1) return pickButtonFromCard(hits[0].card);\r\n if (hits.length > 1) {\r\n if (disambigLeg) {\r\n const hit = hits.find(\r\n (h) => normalizeLegValue(h.card?.dataset?.flightLeg) === disambigLeg,\r\n );\r\n if (hit?.card) return pickButtonFromCard(hit.card);\r\n }\r\n const onwardHit = hits.find(\r\n (h) => normalizeLegValue(h.card?.dataset?.flightLeg) === 'onward',\r\n );\r\n if (onwardHit?.card) return pickButtonFromCard(onwardHit.card);\r\n return pickButtonFromCard(hits[0].card);\r\n }\r\n }\r\n\r\n const pickByPosition = () => {\r\n if (wantsLast) return sortedCards[sortedCards.length - 1] || null;\r\n const matches = sortedCards.filter((e) => e.position === desiredPosition);\r\n if (matches.length === 1) return matches[0];\r\n if (matches.length > 1) {\r\n if (disambigLeg) {\r\n const hit = matches.find(\r\n (m) => normalizeLegValue(m.card?.dataset?.flightLeg) === disambigLeg,\r\n );\r\n if (hit) return hit;\r\n }\r\n const onward = matches.find(\r\n (m) => normalizeLegValue(m.card?.dataset?.flightLeg) === 'onward',\r\n );\r\n return onward || matches[0];\r\n }\r\n return null;\r\n };\r\n\r\n const targetCardEntry = airlineHint\r\n ? wantsLast\r\n ? sortedCards[sortedCards.length - 1]\r\n : sortedCards[Math.min(command.index, sortedCards.length - 1)]\r\n : wantsLast\r\n ? sortedCards[sortedCards.length - 1]\r\n : pickByPosition();\r\n if (!targetCardEntry?.card) return null;\r\n\r\n return pickButtonFromCard(targetCardEntry.card);\r\n}\r\n\r\nfunction extractAirlineHintFromFlightCommand(text) {\r\n const normalized = normalizeSearchText(text);\r\n if (!normalized) return '';\r\n const tokens = normalized.split(' ').filter(Boolean);\r\n if (!tokens.length) return '';\r\n\r\n const stopWords = new Set([\r\n 'book',\r\n 'booking',\r\n 'select',\r\n 'choose',\r\n 'pick',\r\n 'reserve',\r\n 'take',\r\n 'flight',\r\n 'flights',\r\n 'option',\r\n 'options',\r\n 'first',\r\n 'second',\r\n 'third',\r\n 'fourth',\r\n 'fifth',\r\n 'last',\r\n 'final',\r\n 'top',\r\n 'best',\r\n 'recommended',\r\n 'suggestion',\r\n 'cheapest',\r\n 'lowest',\r\n 'price',\r\n 'fare',\r\n 'the',\r\n 'a',\r\n 'an',\r\n 'please',\r\n 'pls',\r\n 'plz',\r\n ]);\r\n\r\n const airlineTokens = tokens.filter((token) => {\r\n if (stopWords.has(token)) return false;\r\n if (/^\\d+$/.test(token)) return false;\r\n if (/^\\d+(st|nd|rd|th)$/.test(token)) return false;\r\n return true;\r\n });\r\n return airlineTokens.join(' ').trim();\r\n}\r\n\r\n/**\r\n * User is describing a new trip (search), not choosing a row from current results.\r\n * Without this, phrases like \"book a flight AMD to DXB\" match \"book\" + \"flight\" and\r\n * are misclassified as explicit card selection.\r\n */\r\nfunction isLikelyNewFlightSearchQuery(text) {\r\n const n = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!n) return false;\r\n if (isLikelyFreshFlightSearch(text)) return true;\r\n\r\n if (/\\bbook\\s+(a|an)\\s+flights?\\b/.test(n)) return true;\r\n if (/\\bbook\\s+(a\\s+)?flights?\\s+(from|between)\\b/.test(n)) return true;\r\n if (\r\n /\\b(get|find|search|show)\\s+(a\\s+)?flights?\\s+(from|for|between)\\b/.test(n)\r\n ) {\r\n return true;\r\n }\r\n if (/\\b(book|get|find|search|show)\\b.*\\bflight\\b.*\\bto\\b/.test(n))\r\n return true;\r\n if (/\\bto\\s+[a-z][a-z .'-]+\\s+from\\s+[a-z][a-z .'-]+\\b/.test(n)) return true;\r\n\r\n // Route-style \"AAA to BBB\" (or \"from AAA to BBB\") without picking an ordinal from the list.\r\n if (/\\b[a-z]{3}\\s+to\\s+[a-z]{3}\\b/.test(n)) {\r\n const pickingListedFlight =\r\n /\\b(1st|2nd|3rd|4th|5th|first\\s+flight|second\\s+flight|third\\s+flight|fourth\\s+flight|flight\\s+one|flight\\s+1|option\\s*\\.?\\s*\\d)\\b/.test(\r\n n,\r\n );\r\n if (!pickingListedFlight) return true;\r\n }\r\n\r\n if (/\\bfrom\\s+[a-z0-9][a-z0-9 .'-]{0,40}\\s+to\\s+[a-z0-9]/.test(n)) {\r\n const pickingListedFlight =\r\n /\\b(1st|2nd|3rd|4th|5th|first\\s+flight|second\\s+flight|third\\s+flight)\\b/.test(\r\n n,\r\n );\r\n if (!pickingListedFlight) return true;\r\n }\r\n if (/\\b[a-z][a-z .'-]{1,30}\\s+to\\s+[a-z][a-z .'-]{1,30}\\b/.test(n)) {\r\n const pickingListedFlight =\r\n /\\b(1st|2nd|3rd|4th|5th|first|second|third|fourth|option\\s*\\.?\\s*\\d)\\b/.test(\r\n n,\r\n );\r\n if (!pickingListedFlight) return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction hasMeaningfulFlightFilters(filters = {}) {\r\n if (!filters || typeof filters !== 'object') return false;\r\n return Boolean(\r\n filters.clearAll ||\r\n filters.sortBy ||\r\n (Array.isArray(filters.stops) && filters.stops.length > 0) ||\r\n (Array.isArray(filters.rtStops) && filters.rtStops.length > 0) ||\r\n filters.price ||\r\n (Array.isArray(filters.airlines) && filters.airlines.length > 0) ||\r\n (Array.isArray(filters.rtAirlines) && filters.rtAirlines.length > 0) ||\r\n (Array.isArray(filters.depTimes) && filters.depTimes.length > 0) ||\r\n (Array.isArray(filters.arrTimes) && filters.arrTimes.length > 0) ||\r\n (Array.isArray(filters.rDepTimes) && filters.rDepTimes.length > 0) ||\r\n (Array.isArray(filters.rArrTimes) && filters.rArrTimes.length > 0) ||\r\n (Array.isArray(filters.layover) && filters.layover.length > 0) ||\r\n (Array.isArray(filters.rLayover) && filters.rLayover.length > 0) ||\r\n filters.layoverDuration ||\r\n filters.rLayoverDuration ||\r\n filters.refundable !== null ||\r\n filters.maxDuration,\r\n );\r\n}\r\n\r\nfunction hasExplicitSelectionSpecifier(text) {\r\n const normalized = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!normalized) return false;\r\n return /\\b(\\d+|1st|2nd|3rd|4th|5th|first|second|third|fourth|fifth|option|this|that|it)\\b/.test(\r\n normalized,\r\n );\r\n}\r\n\r\nfunction hasSearchLanguageHints(text) {\r\n const normalized = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!normalized) return false;\r\n return Boolean(\r\n /\\b(search|find|show|get|look|need|want)\\b.{0,30}\\b(flight|flights|ticket|tickets)\\b/.test(\r\n normalized,\r\n ) ||\r\n /\\b(book)\\s+(a|an)\\s+flight\\b/.test(normalized) ||\r\n /\\bfrom\\b.{0,40}\\bto\\b/.test(normalized) ||\r\n /\\b[a-z]{3}\\s*(?:to|-)\\s*[a-z]{3}\\b/.test(normalized),\r\n );\r\n}\r\n\r\nfunction hasSortLanguageHints(text) {\r\n const normalized = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!normalized) return false;\r\n return Boolean(\r\n /\\b(cheapest|lowest|low fare|low price|expensive|highest|costliest)\\b/.test(\r\n normalized,\r\n ) ||\r\n /\\b(fastest|quickest|shortest|slowest|longest)\\b/.test(normalized) ||\r\n /\\b(earliest|latest)\\b.{0,20}\\b(departure|arrival)\\b/.test(normalized),\r\n );\r\n}\r\n\r\nfunction hasFilterLanguageHints(text) {\r\n const normalized = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!normalized) return false;\r\n return Boolean(\r\n /\\b(non[\\s-]?stop|one[\\s-]?stop|two[\\s-]?stop|direct)\\b/.test(normalized) ||\r\n /\\b(under|below|less than|within|max|minimum|between)\\b.{0,20}\\b(\\d+|k|rs|inr)\\b/.test(\r\n normalized,\r\n ) ||\r\n /\\b(refundable|non[\\s-]?refundable)\\b/.test(normalized) ||\r\n /\\b(morning|afternoon|evening|night|before|after)\\b/.test(normalized) ||\r\n /\\b(airline|airlines|indigo|air india|vistara|spicejet|akasa)\\b/.test(\r\n normalized,\r\n ),\r\n );\r\n}\r\n\r\nfunction classifyFlightMessageIntent({\r\n text,\r\n parsedFilters,\r\n hasVisibleResults,\r\n isSlotUpdateFollowup,\r\n}) {\r\n if (isSlotUpdateFollowup) return 'backend';\r\n\r\n const searchSignals =\r\n isLikelyFreshFlightSearch(text) ||\r\n isLikelyNewFlightSearchQuery(text) ||\r\n hasSearchLanguageHints(text);\r\n\r\n const hasFilterOrSortIntent =\r\n hasMeaningfulFlightFilters(parsedFilters) ||\r\n hasSortLanguageHints(text) ||\r\n hasFilterLanguageHints(text);\r\n const hasSortIntent =\r\n Boolean(parsedFilters?.sortBy) || hasSortLanguageHints(text);\r\n const hasExplicitSelection = hasExplicitSelectionSpecifier(text);\r\n const hasSelectionIntent =\r\n hasVisibleResults &&\r\n (isExplicitFlightSelectionCommand(text) ||\r\n (/\\b(book|select|choose|pick|reserve|take)\\b/i.test(String(text || '')) &&\r\n hasExplicitSelection));\r\n\r\n // New-search language should win over local result manipulation.\r\n if (searchSignals) return 'search';\r\n\r\n if (hasFilterOrSortIntent && !hasExplicitSelection) {\r\n return hasSortIntent ? 'sort' : 'filter';\r\n }\r\n\r\n if (hasSelectionIntent) {\r\n return 'selection';\r\n }\r\n\r\n if (hasFilterOrSortIntent) {\r\n return hasSortIntent ? 'sort' : 'filter';\r\n }\r\n\r\n return 'backend';\r\n}\r\n\r\nfunction isExplicitFlightSelectionCommand(text) {\r\n const normalized = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!normalized) return false;\r\n if (isLikelyNewFlightSearchQuery(text)) return false;\r\n return (\r\n /\\b(book|select|choose|pick|reserve|take)\\b/.test(normalized) &&\r\n /\\b(\\d+|1st|2nd|3rd|4th|first|second|third|fourth|flight|option)\\b/.test(\r\n normalized,\r\n )\r\n );\r\n}\r\n\r\nfunction buildFlightSelectionDebugText(text) {\r\n const command = parseFlightVoiceCommand(text);\r\n if (!command) return '[debug: command_not_parsed]';\r\n\r\n const desiredPosition =\r\n Number.isFinite(command.index) && command.index !== Number.MAX_SAFE_INTEGER\r\n ? String(command.index + 1)\r\n : 'n/a';\r\n const legValue = normalizeLegValue(command.leg);\r\n const resultScopes = Array.from(\r\n document.querySelectorAll('.message-list__bubble--flight-results'),\r\n )\r\n .filter((node) => isElementVisible(node))\r\n .reverse();\r\n\r\n const latestScope = resultScopes[0] || null;\r\n const availableCards = latestScope\r\n ? Array.from(\r\n latestScope.querySelectorAll('[data-ui-flight-card=\"true\"]'),\r\n ).map((card) => {\r\n const pos = String(card?.dataset?.flightPosition || '').trim();\r\n const leg = normalizeLegValue(card?.dataset?.flightLeg || '');\r\n return leg ? `${pos}:${leg}` : pos;\r\n })\r\n : [];\r\n\r\n const resolvedButton = getCommandButtonByPosition(command);\r\n const resolvedCard = resolvedButton?.closest?.(\r\n '[data-ui-flight-card=\"true\"]',\r\n );\r\n const resolvedPosition = String(\r\n resolvedCard?.dataset?.flightPosition || '',\r\n ).trim();\r\n const resolvedLeg = normalizeLegValue(resolvedCard?.dataset?.flightLeg || '');\r\n const resolvedHint = resolvedPosition\r\n ? `${resolvedPosition}${resolvedLeg ? `:${resolvedLeg}` : ''}`\r\n : 'none';\r\n\r\n return `[debug: text=\"${String(text || '').trim()}\" intent=\"${command.intent}\" index=${command.index} desired=${desiredPosition}${legValue ? ` leg=${legValue}` : ''} available=[${availableCards.join(', ')}] resolved=${resolvedHint}]`;\r\n}\r\n\r\nfunction tryHandleRoundTripDualSelectionCommand(\r\n text,\r\n appendUserMessage = () => {},\r\n) {\r\n const command = parseRoundTripDualSelectionCommand(text);\r\n if (!command) return false;\r\n\r\n const onwardPosition = command.onwardIndex + 1;\r\n const returnPosition = command.returnIndex + 1;\r\n const onwardButton =\r\n getSelectButtonByLegAndPosition('onward', onwardPosition) ||\r\n getVoiceCommandButtons('select-flight', 'onward')[command.onwardIndex] ||\r\n null;\r\n if (!onwardButton || onwardButton.disabled) return false;\r\n\r\n appendUserMessage(text);\r\n onwardButton.click();\r\n const onwardPayloadIndex = resolveButtonPayloadIndex(onwardButton);\r\n window.setTimeout(() => {\r\n const preferredReturnButton =\r\n getSelectButtonByLegAndPosition('return', returnPosition) || null;\r\n if (preferredReturnButton && !preferredReturnButton.disabled) {\r\n preferredReturnButton.click();\r\n return;\r\n }\r\n\r\n const refreshedReturnButtons = getVoiceCommandButtons(\r\n 'select-flight',\r\n 'return',\r\n );\r\n if (!refreshedReturnButtons.length) return;\r\n\r\n const sameRowReturnButtons =\r\n onwardPayloadIndex == null\r\n ? refreshedReturnButtons\r\n : refreshedReturnButtons.filter(\r\n (button) =>\r\n resolveButtonPayloadIndex(button) === onwardPayloadIndex,\r\n );\r\n const candidateButtons = sameRowReturnButtons.length\r\n ? sameRowReturnButtons\r\n : refreshedReturnButtons;\r\n if (command.returnIndex >= candidateButtons.length) return;\r\n const targetReturnIndex = command.returnIndex;\r\n const returnButton = candidateButtons[targetReturnIndex];\r\n if (returnButton && !returnButton.disabled) {\r\n returnButton.click();\r\n }\r\n }, 90);\r\n return true;\r\n}\r\n\r\nfunction getSelectButtonByLegAndPosition(leg, position) {\r\n const latestScope = getLatestVisibleResultsScope();\r\n if (!latestScope) return null;\r\n\r\n const normalizedLeg = normalizeLegValue(leg);\r\n const normalizedPosition = String(Number(position) || 0);\r\n if (!normalizedLeg || !normalizedPosition || normalizedPosition === '0') {\r\n return null;\r\n }\r\n\r\n const selector = `[data-ui-flight-card=\"true\"][data-flight-leg=\"${normalizedLeg}\"][data-flight-position=\"${normalizedPosition}\"] [data-voice-action=\"select-flight\"], [data-ui-flight-card=\"true\"][data-flight-leg=\"${normalizedLeg}\"][data-flight-position=\"${normalizedPosition}\"] [data-ui-action=\"select-flight\"]`;\r\n const button = latestScope.querySelector(selector);\r\n if (!button || button.disabled || !isElementVisible(button)) return null;\r\n return button;\r\n}\r\n\r\nfunction tryHandleBestSuggestionBooking(text, appendUserMessage = () => {}) {\r\n const normalized = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!normalized) return false;\r\n\r\n const wantsBestSuggestionBooking =\r\n /\\b(best suggestion|recommended)\\b/.test(normalized) &&\r\n /\\b(book|booking|continue|select)\\b/.test(normalized);\r\n if (!wantsBestSuggestionBooking) return false;\r\n\r\n const recommendedButtons = Array.from(\r\n document.querySelectorAll(\r\n '[data-voice-action=\"book-flight\"][data-recommended=\"true\"]',\r\n ),\r\n ).filter((element) => !element.disabled && isElementVisible(element));\r\n\r\n const targetButton = recommendedButtons[0];\r\n if (!targetButton) return false;\r\n\r\n appendUserMessage(text);\r\n targetButton.click();\r\n return true;\r\n}\r\n\r\nfunction tryHandleTravelerVoiceCommand(text, appendUserMessage = () => {}) {\r\n const activeTravelerForm = getLatestActiveTravelerFormElement();\r\n if (!activeTravelerForm) return false;\r\n\r\n let handled = false;\r\n const event = new CustomEvent('traveler-form:voice-input', {\r\n detail: {\r\n text,\r\n appendUserMessage,\r\n markHandled: () => {\r\n handled = true;\r\n },\r\n },\r\n });\r\n\r\n window.dispatchEvent(event);\r\n return handled;\r\n}\r\n\r\nfunction getLatestActiveTravelerFormElement() {\r\n const activeForms = Array.from(\r\n document.querySelectorAll('[data-voice-traveler-form=\"active\"]'),\r\n );\r\n if (activeForms.length) {\r\n return activeForms[activeForms.length - 1];\r\n }\r\n return document.querySelector('.traveler-form');\r\n}\r\n\r\nfunction parseFlightVoiceCommand(text) {\r\n const normalized = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!normalized) return null;\r\n if (isLikelyNewFlightSearchQuery(text)) return null;\r\n const normalizedAction = normalized.replace(/\\bselect\\b/g, 'book');\r\n\r\n if (\r\n /\\b(book now|book selected|continue booking|confirm booking|proceed to book|proceed booking)\\b/.test(\r\n normalized,\r\n )\r\n ) {\r\n return { intent: 'book-split-flight', index: 0, leg: null };\r\n }\r\n\r\n const isBookIntent = /\\b(book|choose|pick|reserve|take)\\b/.test(\r\n normalizedAction,\r\n );\r\n const mentionsFlight =\r\n /\\b(flight|option|one|1st|2nd|3rd|4th|first|second|third|fourth|it|this|that)\\b/.test(\r\n normalized,\r\n );\r\n const numericOnly = /\\b\\d+\\b/.test(normalized);\r\n\r\n if (!isBookIntent || (!mentionsFlight && !numericOnly)) return null;\r\n\r\n let leg = extractLegType(normalized);\r\n if (!leg) {\r\n const guessed = inferImplicitLegForBookingMessage(normalized);\r\n if (guessed) leg = guessed;\r\n }\r\n const index = leg\r\n ? (extractLegScopedIndex(\r\n normalized,\r\n leg === 'onward'\r\n ? '(?:onward|outbound|outward|departure)'\r\n : '(?:return|inbound|back|homeward)',\r\n ) ?? extractOrdinalIndex(normalized))\r\n : extractOrdinalIndex(normalized);\r\n\r\n if (leg) {\r\n return { intent: 'select-flight', index, leg };\r\n }\r\n\r\n return { intent: 'book-or-select-flight', index, leg };\r\n}\r\n\r\nfunction parseRoundTripDualSelectionCommand(text) {\r\n const normalized = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!normalized) return null;\r\n\r\n const hasSelectIntent = /\\b(select|choose|pick|take|book)\\b/.test(normalized);\r\n if (!hasSelectIntent) return null;\r\n\r\n const onwardIndex = extractLegIndexFromSegments(\r\n normalized,\r\n '(?:onward|outbound|outward|departure)',\r\n );\r\n const returnIndex = extractLegIndexFromSegments(\r\n normalized,\r\n '(?:return|inbound|back|homeward)',\r\n );\r\n\r\n if (onwardIndex === null || returnIndex === null) return null;\r\n return { onwardIndex, returnIndex };\r\n}\r\n\r\nfunction extractLegIndexFromSegments(text, legPattern) {\r\n const allLegMatches = Array.from(\r\n text.matchAll(\r\n /\\b(onward|outbound|outward|departure|return|inbound|back|homeward)\\b/gi,\r\n ),\r\n );\r\n if (!allLegMatches.length) return null;\r\n\r\n const targetLegRegex = new RegExp(`^${legPattern}$`, 'i');\r\n for (let i = 0; i < allLegMatches.length; i += 1) {\r\n const legToken = String(allLegMatches[i]?.[1] || '');\r\n if (!targetLegRegex.test(legToken)) continue;\r\n\r\n const start = Number(allLegMatches[i]?.index || 0);\r\n const end =\r\n i + 1 < allLegMatches.length\r\n ? Number(allLegMatches[i + 1]?.index || text.length)\r\n : text.length;\r\n const segment = text.slice(start, end);\r\n const fromSegment = extractOrdinalIndex(segment);\r\n if (fromSegment !== 0 || /\\b(first|1st|1)\\b/.test(segment)) {\r\n return fromSegment;\r\n }\r\n }\r\n\r\n return extractLegScopedIndex(text, legPattern);\r\n}\r\n\r\nfunction extractLegScopedIndex(text, legPattern) {\r\n const ordinalsPattern =\r\n '(?:\\\\d+|1st|2nd|3rd|4th|5th|first|second|third|fourth|fifth|best|recommended|last)';\r\n const legThenOrdinal = text.match(\r\n new RegExp(\r\n `\\\\b${legPattern}\\\\b[^.\\\\n]{0,80}?\\\\b(${ordinalsPattern})\\\\b`,\r\n 'i',\r\n ),\r\n );\r\n if (legThenOrdinal?.[1]) {\r\n return extractOrdinalIndex(String(legThenOrdinal[1]).toLowerCase());\r\n }\r\n\r\n const ordinalThenLeg = text.match(\r\n new RegExp(\r\n `\\\\b(${ordinalsPattern})\\\\b[^.\\\\n]{0,40}?\\\\b${legPattern}\\\\b`,\r\n 'i',\r\n ),\r\n );\r\n if (ordinalThenLeg?.[1]) {\r\n return extractOrdinalIndex(String(ordinalThenLeg[1]).toLowerCase());\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction resolveButtonPayloadIndex(buttonElement) {\r\n const cardElement = buttonElement?.closest?.('[data-ui-flight-card=\"true\"]');\r\n if (!cardElement) return null;\r\n const rawValue = String(\r\n cardElement?.dataset?.flightPayloadIndex || '',\r\n ).trim();\r\n if (!rawValue) return null;\r\n const parsed = Number(rawValue);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n}\r\n\r\nfunction stripFlightNumberPhrasesForOrdinal(text) {\r\n return String(text || '').replace(/\\b[a-z]{1,3}\\s*-?\\s*\\d{2,5}\\b/gi, ' ');\r\n}\r\n\r\nfunction extractOrdinalIndex(text) {\r\n const normalized = String(text || '').toLowerCase();\r\n if (/\\b(last|final|bottom)\\b/.test(normalized))\r\n return Number.MAX_SAFE_INTEGER;\r\n\r\n const ordinalPatterns = [\r\n { pattern: /\\b1st\\b|\\bfirst\\b/, index: 0 },\r\n { pattern: /\\b2nd\\b|\\bsecond\\b/, index: 1 },\r\n { pattern: /\\b3rd\\b|\\bthird\\b/, index: 2 },\r\n { pattern: /\\b4th\\b|\\bfourth\\b/, index: 3 },\r\n { pattern: /\\b5th\\b|\\bfifth\\b/, index: 4 },\r\n { pattern: /\\bbest\\b|\\brecommended\\b/, index: 0 },\r\n ];\r\n\r\n const namedMatch = ordinalPatterns.find(({ pattern }) =>\r\n pattern.test(normalized),\r\n );\r\n if (namedMatch) return namedMatch.index;\r\n\r\n const withoutFlightCodes = stripFlightNumberPhrasesForOrdinal(normalized);\r\n const numericMatch = withoutFlightCodes.match(/\\b(\\d+)\\b/);\r\n if (numericMatch) {\r\n const parsed = Number(numericMatch[1]);\r\n if (Number.isFinite(parsed) && parsed > 0) return parsed - 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\nfunction getVoiceCommandButtons(intent, leg = null) {\r\n const latestScope = getLatestVisibleResultsScope();\r\n if (!latestScope) return [];\r\n const visibleEnabled = (selector) =>\r\n Array.from(latestScope.querySelectorAll(selector)).filter(\r\n (element) => !element.disabled && isElementVisible(element),\r\n );\r\n const normalizeLeg = (value) => {\r\n const next = String(value || '')\r\n .trim()\r\n .toLowerCase();\r\n return next === 'onward' || next === 'return' ? next : '';\r\n };\r\n const targetLeg = normalizeLeg(leg);\r\n const byLeg = (elements) =>\r\n targetLeg\r\n ? elements.filter(\r\n (element) => normalizeLeg(element?.dataset?.flightLeg) === targetLeg,\r\n )\r\n : elements;\r\n\r\n if (intent === 'book-split-flight') {\r\n return visibleEnabled(\r\n '[data-voice-action=\"book-split-flight\"], [data-ui-action=\"book-split-flight\"]',\r\n );\r\n }\r\n\r\n if (intent === 'select-flight') {\r\n return byLeg(\r\n visibleEnabled(\r\n '[data-voice-action=\"select-flight\"], [data-ui-action=\"select-flight\"]',\r\n ),\r\n );\r\n }\r\n\r\n const bookButtons = byLeg(\r\n visibleEnabled(\r\n '[data-voice-action=\"book-flight\"], [data-ui-action=\"book-flight\"]',\r\n ),\r\n );\r\n if (bookButtons.length) return bookButtons;\r\n\r\n const selectButtons = byLeg(\r\n visibleEnabled(\r\n '[data-voice-action=\"select-flight\"], [data-ui-action=\"select-flight\"]',\r\n ),\r\n );\r\n if (selectButtons.length) return selectButtons;\r\n\r\n return visibleEnabled(\r\n '[data-voice-action=\"book-split-flight\"], [data-ui-action=\"book-split-flight\"]',\r\n );\r\n}\r\n\r\nfunction getLatestVisibleResultsScope() {\r\n const allResultBubbles = Array.from(\r\n document.querySelectorAll('.message-list__bubble--flight-results'),\r\n ).filter((node) => isElementVisible(node));\r\n if (!allResultBubbles.length) return null;\r\n const latestActionable = [...allResultBubbles].reverse().find((scope) => {\r\n const hasEnabledAction = Array.from(\r\n scope.querySelectorAll(\r\n '[data-voice-action=\"book-flight\"], [data-ui-action=\"book-flight\"], [data-voice-action=\"select-flight\"], [data-ui-action=\"select-flight\"], [data-voice-action=\"book-split-flight\"], [data-ui-action=\"book-split-flight\"]',\r\n ),\r\n ).some((element) => !element.disabled && isElementVisible(element));\r\n return hasEnabledAction;\r\n });\r\n return latestActionable || allResultBubbles[allResultBubbles.length - 1];\r\n}\r\n\r\nfunction hasVisibleFlightResults() {\r\n return Array.from(\r\n document.querySelectorAll('.message-list__bubble--flight-results'),\r\n ).some((node) => isElementVisible(node));\r\n}\r\n\r\nfunction extractLegType(text) {\r\n const n = String(text || '').toLowerCase();\r\n if (\r\n /\\b(onward|outbound|outward|departure)(\\s+leg|\\s+flight|\\s+side|\\s+slice|\\s+sector)?\\b/.test(\r\n n,\r\n )\r\n ) {\r\n return 'onward';\r\n }\r\n if (\r\n /\\b(return|inbound|back|homeward)(\\s+leg|\\s+flight|\\s+side|\\s+slice|\\s+sector)?\\b/.test(\r\n n,\r\n )\r\n ) {\r\n return 'return';\r\n }\r\n return null;\r\n}\r\n\r\nfunction isElementVisible(element) {\r\n if (!element) return false;\r\n const style = window.getComputedStyle(element);\r\n if (style.display === 'none' || style.visibility === 'hidden') return false;\r\n const rect = element.getBoundingClientRect();\r\n return rect.width > 0 && rect.height > 0;\r\n}\r\n\r\nfunction shouldAutoBookFirstFilteredFlight(text) {\r\n const normalized = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!normalized) return false;\r\n return /\\b(book|reserve|buy|purchase|confirm booking|proceed to book)\\b/.test(\r\n normalized,\r\n );\r\n}\r\n\r\nfunction scheduleAutoBookFirstFilteredFlight() {\r\n const maxAttempts = 6;\r\n let attempts = 0;\r\n\r\n const clickFirstBookButton = () => {\r\n attempts += 1;\r\n const candidates = getVoiceCommandButtons('book-or-select-flight');\r\n const targetButton = candidates[0];\r\n\r\n if (targetButton) {\r\n targetButton.click();\r\n return;\r\n }\r\n\r\n if (attempts < maxAttempts) {\r\n window.setTimeout(clickFirstBookButton, 160);\r\n }\r\n };\r\n\r\n window.setTimeout(clickFirstBookButton, 120);\r\n}\r\n\r\nfunction isTravelerBackCommand(text) {\r\n const lower = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n return (\r\n /^\\s*back\\s*$/.test(lower) ||\r\n /\\b(go back|back to results|show previous results|previous results)\\b/.test(\r\n lower,\r\n )\r\n );\r\n}\r\n\r\nfunction isSaveDetailsCommand(text) {\r\n const lower = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!lower) return false;\r\n return /\\b(save details|save traveler details|save traveller details|save|proceed)\\b/.test(\r\n lower,\r\n );\r\n}\r\n\r\nfunction isProceedToBookCommand(text) {\r\n const lower = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!lower) return false;\r\n return /\\b(proceed to book|continue to book|continue booking)\\b/.test(lower);\r\n}\r\n\r\nfunction getConfirmationReplyIntent(text) {\r\n const normalized = String(text || '')\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[.!?,]+$/g, '');\r\n if (!normalized) return null;\r\n\r\n // Treat only concise, explicit replies as confirmations.\r\n const wordCount = normalized.split(/\\s+/).filter(Boolean).length;\r\n if (wordCount > 4) return null;\r\n\r\n const positivePattern =\r\n /^(yes|yep|yeah|ok|okay|sure|confirm|proceed|continue|go ahead|please proceed)$/i;\r\n const negativePattern =\r\n /^(no|nope|cancel|don['’]?t|do not|back|later|not now|stop)$/i;\r\n\r\n if (positivePattern.test(normalized)) return 'yes';\r\n if (negativePattern.test(normalized)) return 'no';\r\n return null;\r\n}\r\n\r\nfunction isPromoCodeCommand(text) {\r\n const lower = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!lower) return false;\r\n return /\\b(?:apply|use|add|remove|clear|delete)\\b.*\\b(?:promo|promocode|promocde|coupon|discount)\\b/.test(\r\n lower,\r\n );\r\n}\r\n\r\nfunction getFlightResultsPayload(message) {\r\n const rawResults = message?.data?.results;\r\n return Array.isArray(rawResults)\r\n ? rawResults\r\n : Array.isArray(rawResults?.payload)\r\n ? rawResults.payload\r\n : [];\r\n}\r\n\r\nfunction computeFilteredPayloadForDisplay(payload, filters) {\r\n const base = Array.isArray(payload) ? payload : [];\r\n if (!filters || filters.clearAll) return base;\r\n let data = filterFlightData(base, filters);\r\n if (filters?.sortBy) {\r\n data = sortFlightData(data, filters.sortBy);\r\n }\r\n return Array.isArray(data) ? data : [];\r\n}\r\n\r\nfunction isRoundTripResultsMessage(message) {\r\n const paramsTripType = Number(message?.data?.params?.tt || 0);\r\n if (paramsTripType === 2) return true;\r\n\r\n const payload = getFlightResultsPayload(message);\r\n\r\n if (!payload.length) return false;\r\n\r\n return payload.some((item) => {\r\n if (Number(item?.tt || 0) === 2) return true;\r\n if (Array.isArray(item?.rttrps) && item.rttrps.length > 0) return true;\r\n if (\r\n Array.isArray(item?.trps) &&\r\n item.trps.some((trip) => trip?.pr?.rtrmkey)\r\n )\r\n return true;\r\n return false;\r\n });\r\n}\r\n\r\nfunction isViewAllCommand(text) {\r\n const lower = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!lower) return false;\r\n return /\\b(view all|view all flights|show all|show more|more options|expand results)\\b/i.test(\r\n lower,\r\n );\r\n}\r\n\r\nfunction tryHandleFlightCardActionCommand(text, appendUserMessage = () => {}) {\r\n const actionConfig = getFlightCardActionConfig(text);\r\n if (!actionConfig) return false;\r\n const hints = parseMoreFaresCommandHints(text);\r\n const hasExplicitConstraint = hasMoreFaresExplicitConstraint(hints);\r\n\r\n const latestResultsScope = (() => {\r\n const allResultBubbles = Array.from(\r\n document.querySelectorAll('.message-list__bubble--flight-results'),\r\n ).filter((node) => isElementVisible(node));\r\n return allResultBubbles[allResultBubbles.length - 1] || document;\r\n })();\r\n\r\n const cards = Array.from(\r\n latestResultsScope.querySelectorAll('[data-ui-flight-card=\"true\"]'),\r\n ).filter((card) => isElementVisible(card));\r\n if (!cards.length) {\r\n const openedViewAll = tryHandleViewAllCommand(text, appendUserMessage, {\r\n force: true,\r\n preferredAction: actionConfig,\r\n actionHints: hints,\r\n });\r\n return openedViewAll ? { status: 'HANDLED' } : false;\r\n }\r\n\r\n const { matchedCards, hasExplicitConstraint: hasMatchedConstraint } =\r\n filterCardsByMoreFaresHints(cards, hints);\r\n\r\n // If user gave any identifying detail (airline/flight/date/time/price/leg),\r\n // first check inside expanded results before showing unavailable.\r\n if (hasMatchedConstraint && matchedCards.length === 0) {\r\n const openedViewAll = tryHandleViewAllCommand(text, appendUserMessage, {\r\n force: true,\r\n preferredAction: actionConfig,\r\n actionHints: hints,\r\n });\r\n if (openedViewAll) return { status: 'HANDLED' };\r\n return {\r\n status: 'NO_FILTER_DATA',\r\n message: actionConfig.unavailableMessage,\r\n };\r\n }\r\n\r\n const targetCards = matchedCards.length ? matchedCards : cards;\r\n const targetCard =\r\n hints.position === 'last'\r\n ? targetCards[targetCards.length - 1]\r\n : targetCards[0];\r\n if (!targetCard) return false;\r\n\r\n const actionButton = targetCard.querySelector(actionConfig.buttonSelector);\r\n if (!actionButton || !isElementVisible(actionButton)) {\r\n if (actionConfig?.key === 'fare-details') {\r\n const openedViewAll = tryHandleViewAllCommand(text, appendUserMessage, {\r\n force: true,\r\n preferredAction: actionConfig,\r\n actionHints: hints,\r\n });\r\n if (openedViewAll) return { status: 'HANDLED' };\r\n }\r\n if (hasExplicitConstraint) {\r\n return {\r\n status: 'NO_FILTER_DATA',\r\n message: actionConfig.unavailableMessage,\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n appendUserMessage(text);\r\n actionButton.click();\r\n return { status: 'HANDLED' };\r\n}\r\n\r\nfunction isMoreFaresCommand(text) {\r\n const lower = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!lower) return false;\r\n const mentionsAction = /\\b(open|show|click|select|choose)\\b/.test(lower);\r\n const mentionsMoreFaresPhrase = /\\b(more\\s*fares?|morefares)\\b/.test(lower);\r\n const mentionsFareOptions = /\\bfare\\s+options?\\b/.test(lower);\r\n return (\r\n mentionsMoreFaresPhrase ||\r\n (mentionsAction && mentionsFareOptions) ||\r\n (!mentionsAction && mentionsFareOptions)\r\n );\r\n}\r\n\r\nfunction isFareDetailsCommand(text) {\r\n const lower = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!lower) return false;\r\n const mentionsAction = /\\b(open|show|click|select|choose)\\b/.test(lower);\r\n const mentionsFareWord = /\\bfare\\b/.test(lower);\r\n const mentionsDetailsWord =\r\n /\\b(details?|deatails?|deatils?|detials?|detailes?)\\b/.test(lower);\r\n const mentionsFareDetailsPhrase =\r\n /\\b(fare\\s*details?|faredetails?|fare\\s*deatails?|fare\\s*deatils?|fare\\s*detials?)\\b/.test(\r\n lower,\r\n );\r\n return (\r\n mentionsFareDetailsPhrase ||\r\n (mentionsFareWord && mentionsDetailsWord) ||\r\n (mentionsAction && mentionsDetailsWord)\r\n );\r\n}\r\n\r\nfunction getFlightCardActionConfig(text) {\r\n if (isMoreFaresCommand(text)) {\r\n return {\r\n key: 'more-fares',\r\n buttonSelector: '[data-ui-action=\"more-fares\"]',\r\n unavailableMessage: 'No filter data available for the selected flight.',\r\n };\r\n }\r\n if (isFareDetailsCommand(text)) {\r\n return {\r\n key: 'fare-details',\r\n buttonSelector: '[data-ui-action=\"open-fare-details\"]',\r\n unavailableMessage: 'No fare details available for the selected flight.',\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nfunction tryHandleViewAllCommand(\r\n text,\r\n appendUserMessage = () => {},\r\n options = {},\r\n) {\r\n const force = Boolean(options?.force);\r\n const preferredAction =\r\n options?.preferredAction && typeof options.preferredAction === 'object'\r\n ? options.preferredAction\r\n : null;\r\n const actionHints =\r\n options?.actionHints && typeof options.actionHints === 'object'\r\n ? options.actionHints\r\n : parseMoreFaresCommandHints(text);\r\n if (!force && !isViewAllCommand(text)) return false;\r\n\r\n const targetLeg = extractViewAllLeg(text);\r\n const latestResultsScope = (() => {\r\n const allResultBubbles = Array.from(\r\n document.querySelectorAll('.message-list__bubble--flight-results'),\r\n ).filter((node) => isElementVisible(node));\r\n return allResultBubbles[allResultBubbles.length - 1] || document;\r\n })();\r\n\r\n const viewAllButtons = Array.from(\r\n latestResultsScope.querySelectorAll('.flight-results__toggle-btn'),\r\n ).filter((button) => isElementVisible(button));\r\n if (!viewAllButtons.length) return false;\r\n\r\n const legMatchedButton = targetLeg\r\n ? viewAllButtons.find(\r\n (button) =>\r\n normalizeLegValue(button?.dataset?.flightLeg) ===\r\n normalizeLegValue(targetLeg),\r\n )\r\n : null;\r\n const viewAllButton = legMatchedButton || viewAllButtons[0];\r\n if (!viewAllButton) return false;\r\n\r\n appendUserMessage(text);\r\n viewAllButton.click();\r\n if (preferredAction) {\r\n scheduleExpandedCardActionClick(preferredAction, actionHints);\r\n }\r\n return true;\r\n}\r\n\r\nfunction scheduleExpandedCardActionClick(actionConfig, hints) {\r\n let attempts = 0;\r\n const maxAttempts = 12;\r\n\r\n const tick = () => {\r\n attempts += 1;\r\n const clicked = tryClickActionInExpandedResults(actionConfig, hints);\r\n if (clicked || attempts >= maxAttempts) return;\r\n window.setTimeout(tick, 120);\r\n };\r\n\r\n window.setTimeout(tick, 80);\r\n}\r\n\r\nfunction tryClickActionInExpandedResults(actionConfig, hints) {\r\n const latestResultsScope = (() => {\r\n const allResultBubbles = Array.from(\r\n document.querySelectorAll('.message-list__bubble--flight-results'),\r\n ).filter((node) => isElementVisible(node));\r\n return allResultBubbles[allResultBubbles.length - 1] || document;\r\n })();\r\n\r\n const expandedCards = Array.from(\r\n latestResultsScope.querySelectorAll(\r\n '.flight-results__modal [data-ui-flight-card=\"true\"]',\r\n ),\r\n ).filter((card) => isElementVisible(card));\r\n if (!expandedCards.length) return false;\r\n\r\n const { matchedCards, hasExplicitConstraint } = filterCardsByMoreFaresHints(\r\n expandedCards,\r\n hints || {},\r\n );\r\n if (hasExplicitConstraint && matchedCards.length === 0) {\r\n window.dispatchEvent(\r\n new CustomEvent('chat:flight-card-action-unavailable', {\r\n detail: { message: actionConfig?.unavailableMessage || '' },\r\n }),\r\n );\r\n return true;\r\n }\r\n const targetCards = matchedCards.length ? matchedCards : expandedCards;\r\n const targetCard =\r\n hints?.position === 'last'\r\n ? targetCards[targetCards.length - 1]\r\n : targetCards[0];\r\n if (!targetCard) return false;\r\n\r\n const actionButton = targetCard.querySelector(\r\n actionConfig?.buttonSelector || '',\r\n );\r\n if (!actionButton || !isElementVisible(actionButton)) {\r\n if (hasExplicitConstraint) {\r\n window.dispatchEvent(\r\n new CustomEvent('chat:flight-card-action-unavailable', {\r\n detail: { message: actionConfig?.unavailableMessage || '' },\r\n }),\r\n );\r\n return true;\r\n }\r\n return false;\r\n }\r\n actionButton.click();\r\n return true;\r\n}\r\n\r\nfunction parseMoreFaresCommandHints(text) {\r\n const raw = String(text || '').trim();\r\n const lower = raw.toLowerCase();\r\n const flightNumberMatch = lower.match(/\\b([a-z]{1,3}\\s*-?\\s*\\d{2,5})\\b/i);\r\n const airlineMatchAfterKeyword = lower.match(\r\n /\\b(?:airline|airlines|operator)\\s+([a-z][a-z0-9 &.-]{1,40})\\b/i,\r\n );\r\n const airlineMatchBeforeKeyword = lower.match(\r\n /\\b([a-z][a-z0-9 &.-]{1,40})\\s+(?:airline|airlines|operator)\\b/i,\r\n );\r\n const normalizedRaw = normalizeSearchText(raw);\r\n const normalizedFlightNumber = normalizeFlightNumber(\r\n flightNumberMatch?.[1] || '',\r\n );\r\n const airlineFromFreeTextCandidate = normalizedRaw\r\n .replace(\r\n /\\b(click|open|show|select|choose|for|the|this|that|in|inside|more|fare|fares|morefares|details|detail|deatails|deatils|detials|detailes|options|option|airline|airlines|operator|first|last|block|results|result|onward|return|flight|flights)\\b/g,\r\n ' ',\r\n )\r\n .replace(/\\b([a-z]{1,3}\\s*-?\\s*\\d{2,5})\\b/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n const actionStopWords = new Set([\r\n 'me',\r\n 'my',\r\n 'mine',\r\n 'please',\r\n 'kindly',\r\n 'just',\r\n 'only',\r\n 'now',\r\n ]);\r\n const airlineFromFreeText = airlineFromFreeTextCandidate\r\n .split(' ')\r\n .filter(\r\n (token) =>\r\n token &&\r\n !/^\\d+$/.test(token) &&\r\n !actionStopWords.has(token.toLowerCase()),\r\n )\r\n .join(' ')\r\n .trim();\r\n const shouldUseFreeTextAirline =\r\n !airlineMatchAfterKeyword?.[1] &&\r\n !airlineMatchBeforeKeyword?.[1] &&\r\n !normalizedFlightNumber;\r\n const dateMatch = lower.match(\r\n /\\b(\\d{1,2}[/-]\\d{1,2}[/-]\\d{2,4}|\\d{4}-\\d{2}-\\d{2})\\b/,\r\n );\r\n const priceByKeywordMatch = lower.match(\r\n /\\b(?:price|fare|amount)\\s*(?:is|of|=|at)?\\s*(?:inr|usd|eur|aed|sar|rs|₹|\\$)?\\s*([0-9][0-9,]*(?:\\.\\d{1,2})?)\\b/i,\r\n );\r\n const priceByCurrencyMatch = lower.match(\r\n /(?:inr|usd|eur|aed|sar|rs|₹|\\$)\\s*([0-9][0-9,]*(?:\\.\\d{1,2})?)/i,\r\n );\r\n const timeMatches = lower.match(/\\b([0-2]?\\d:[0-5]\\d)\\b/g) || [];\r\n\r\n return {\r\n leg: extractLegType(lower) || '',\r\n position: /\\b(last|bottom|final)\\b/.test(lower) ? 'last' : 'first',\r\n flightNumber: flightNumberMatch?.[1] || '',\r\n airline:\r\n airlineMatchAfterKeyword?.[1] ||\r\n airlineMatchBeforeKeyword?.[1] ||\r\n (shouldUseFreeTextAirline ? airlineFromFreeText : '') ||\r\n '',\r\n date: dateMatch?.[1] || '',\r\n price: parseAmount(\r\n priceByKeywordMatch?.[1] || priceByCurrencyMatch?.[1] || '',\r\n ),\r\n times: timeMatches\r\n .map((value) => normalizeTimeToken(value))\r\n .filter(Boolean),\r\n };\r\n}\r\n\r\nfunction filterCardsByMoreFaresHints(cards = [], hints = {}) {\r\n let matchedCards = Array.isArray(cards) ? cards : [];\r\n let hasExplicitConstraint = false;\r\n\r\n if (hints.leg) {\r\n hasExplicitConstraint = true;\r\n matchedCards = matchedCards.filter(\r\n (card) =>\r\n normalizeLegValue(card?.dataset?.flightLeg) ===\r\n normalizeLegValue(hints.leg),\r\n );\r\n }\r\n if (hints.flightNumber) {\r\n hasExplicitConstraint = true;\r\n const expected = normalizeFlightNumber(hints.flightNumber);\r\n matchedCards = matchedCards.filter(\r\n (card) => normalizeFlightNumber(card?.dataset?.flightNumber) === expected,\r\n );\r\n }\r\n if (hints.airline) {\r\n hasExplicitConstraint = true;\r\n const airlineHint = normalizeSearchText(hints.airline);\r\n matchedCards = matchedCards.filter((card) =>\r\n isAirlineMatch(\r\n normalizeSearchText(card?.dataset?.flightAirline),\r\n airlineHint,\r\n ),\r\n );\r\n }\r\n if (hints.price != null) {\r\n hasExplicitConstraint = true;\r\n matchedCards = matchedCards.filter((card) => {\r\n const value = parseAmount(card?.dataset?.flightPrice);\r\n return value != null && Math.abs(value - hints.price) < 1;\r\n });\r\n }\r\n if (hints.date) {\r\n hasExplicitConstraint = true;\r\n const hintDate = normalizeDateToken(hints.date);\r\n matchedCards = matchedCards.filter((card) => {\r\n const dep = normalizeDateToken(card?.dataset?.flightDepartureDate);\r\n const arr = normalizeDateToken(card?.dataset?.flightArrivalDate);\r\n return dep === hintDate || arr === hintDate;\r\n });\r\n }\r\n if (Array.isArray(hints.times) && hints.times.length > 0) {\r\n hasExplicitConstraint = true;\r\n matchedCards = matchedCards.filter((card) => {\r\n const depTime = normalizeTimeToken(card?.dataset?.flightDepartureTime);\r\n const arrTime = normalizeTimeToken(card?.dataset?.flightArrivalTime);\r\n return hints.times.every(\r\n (hintTime) => hintTime === depTime || hintTime === arrTime,\r\n );\r\n });\r\n }\r\n\r\n return { matchedCards, hasExplicitConstraint };\r\n}\r\n\r\nfunction hasMoreFaresExplicitConstraint(hints = {}) {\r\n return Boolean(\r\n hints?.leg ||\r\n hints?.flightNumber ||\r\n hints?.airline ||\r\n hints?.date ||\r\n hints?.price != null ||\r\n (Array.isArray(hints?.times) && hints.times.length > 0),\r\n );\r\n}\r\n\r\nfunction normalizeLegValue(value) {\r\n const next = String(value || '')\r\n .trim()\r\n .toLowerCase();\r\n return next === 'onward' || next === 'return' ? next : '';\r\n}\r\n\r\nfunction extractViewAllLeg(text) {\r\n const lower = String(text || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!lower) return '';\r\n if (/\\b(return|inbound|back)\\b/.test(lower)) return 'return';\r\n if (/\\b(onward|outbound|departure)\\b/.test(lower)) return 'onward';\r\n return '';\r\n}\r\n\r\nfunction parseAmount(value) {\r\n const raw = String(value || '')\r\n .replace(/,/g, '')\r\n .trim();\r\n if (!raw) return null;\r\n const parsed = Number(raw);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n}\r\n\r\nfunction normalizeFlightNumber(value) {\r\n return String(value || '')\r\n .toUpperCase()\r\n .replace(/[^A-Z0-9]/g, '');\r\n}\r\n\r\n/**\r\n * Picks IATA-style + digits (e.g. ai 2559, 6e-1234) so \"book Air India AI 2559\"\r\n * does not fall through to ordinal index 2558 and clamp to the wrong card.\r\n */\r\nfunction extractNormalizedFlightNumberFromBookText(rawText) {\r\n const text = String(rawText || '');\r\n const re = /\\b([a-z]{1,3})\\s*-?\\s*(\\d{2,5})\\b/gi;\r\n let best = '';\r\n let bestScore = -1;\r\n let bestIndex = -1;\r\n let match = re.exec(text);\r\n while (match !== null) {\r\n const letters = String(match[1] || '').toLowerCase();\r\n const digits = String(match[2] || '');\r\n const combined = normalizeFlightNumber(`${letters}${digits}`);\r\n if (combined) {\r\n const digitLen = digits.length;\r\n const score =\r\n digitLen >= 4\r\n ? 120 + digitLen\r\n : digitLen >= 3\r\n ? 100 + digitLen\r\n : digitLen;\r\n const start = match.index || 0;\r\n if (score > bestScore || (score === bestScore && start >= bestIndex)) {\r\n bestScore = score;\r\n bestIndex = start;\r\n best = combined;\r\n }\r\n }\r\n match = re.exec(text);\r\n }\r\n return best;\r\n}\r\n\r\nfunction normalizeDateToken(value) {\r\n const raw = String(value || '').trim();\r\n if (!raw) return '';\r\n const dmy = raw.match(/^(\\d{1,2})[/-](\\d{1,2})[/-](\\d{2,4})$/);\r\n if (dmy) {\r\n const dd = dmy[1].padStart(2, '0');\r\n const mm = dmy[2].padStart(2, '0');\r\n const yyyy = dmy[3].length === 2 ? `20${dmy[3]}` : dmy[3];\r\n return `${yyyy}-${mm}-${dd}`;\r\n }\r\n const ymd = raw.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\r\n if (ymd) return `${ymd[1]}-${ymd[2]}-${ymd[3]}`;\r\n return raw.toLowerCase();\r\n}\r\n\r\nfunction normalizeTimeToken(value) {\r\n const raw = String(value || '').trim();\r\n const match = raw.match(/^([0-2]?\\d):([0-5]\\d)$/);\r\n if (!match) return '';\r\n const hours = Number(match[1]);\r\n if (!Number.isFinite(hours) || hours > 23) return '';\r\n return `${String(hours).padStart(2, '0')}:${match[2]}`;\r\n}\r\n\r\nfunction normalizeSearchText(value) {\r\n return String(value || '')\r\n .toLowerCase()\r\n .replace(/[^a-z0-9 ]/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n}\r\n\r\nfunction isAirlineMatch(cardAirline, airlineHint) {\r\n const cardValue = normalizeSearchText(cardAirline);\r\n const hintValue = normalizeSearchText(airlineHint);\r\n if (!cardValue || !hintValue) return false;\r\n if (cardValue.includes(hintValue) || hintValue.includes(cardValue))\r\n return true;\r\n\r\n const hintTokens = hintValue.split(' ').filter(Boolean);\r\n const cardTokens = cardValue.split(' ').filter(Boolean);\r\n if (!hintTokens.length || !cardTokens.length) return false;\r\n\r\n return hintTokens.every((hintToken) =>\r\n cardTokens.some(\r\n (cardToken) =>\r\n cardToken.includes(hintToken) ||\r\n hintToken.includes(cardToken) ||\r\n cardToken.startsWith(hintToken) ||\r\n hintToken.startsWith(cardToken),\r\n ),\r\n );\r\n}\r\n\r\nfunction isLikelyFreshFlightSearch(text) {\r\n const normalized = String(text || '').trim();\r\n if (!normalized) return false;\r\n\r\n const lower = normalized.toLowerCase();\r\n if (\r\n /\\b(save details|edit details|pay now|proceed to book|continue booking|payment|save)\\b/.test(\r\n lower,\r\n )\r\n ) {\r\n return false;\r\n }\r\n\r\n const routePattern = /\\bfrom\\s+[a-z][a-z .'-]+\\s+to\\s+[a-z][a-z .'-]+\\b/i;\r\n const destinationPattern = /\\b[a-z][a-z .'-]+\\s+to\\s+[a-z][a-z .'-]+\\b/i;\r\n const airportCodePattern = /\\b[a-z]{3}\\s*(?:to|-)\\s*[a-z]{3}\\b/i;\r\n const datePattern = /\\bon\\s+[a-z0-9,\\-/ ]+\\b/i;\r\n const explicitDatePattern =\r\n /\\b\\d{1,2}(?:st|nd|rd|th)?\\b.*\\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\b/i;\r\n\r\n const hasRoute =\r\n routePattern.test(normalized) ||\r\n destinationPattern.test(normalized) ||\r\n airportCodePattern.test(normalized);\r\n const hasDate =\r\n datePattern.test(normalized) || explicitDatePattern.test(normalized);\r\n\r\n return (\r\n (hasRoute && hasDate) || /\\b(search|find|show|get)\\b.*\\bflight/.test(lower)\r\n );\r\n}\r\n\r\nfunction getVoicePageMessages(messages = []) {\r\n const voiceMessages = messages.filter((item) => item?.hiddenFromChat);\r\n const latestPaymentConfirmation = [...messages]\r\n .reverse()\r\n .find((item) => item?.type === 'payment_confirmation');\r\n\r\n if (latestPaymentConfirmation) {\r\n return [latestPaymentConfirmation];\r\n }\r\n\r\n const actionableTypes = [\r\n 'payment_confirmation',\r\n 'traveler_details_form',\r\n 'flight_results',\r\n ];\r\n\r\n const lastActionable = [...voiceMessages]\r\n .reverse()\r\n .find((item) => actionableTypes.includes(item?.type));\r\n\r\n if (lastActionable) {\r\n return [lastActionable];\r\n }\r\n\r\n const latestAssistant = [...voiceMessages]\r\n .reverse()\r\n .find(\r\n (item) =>\r\n item?.type === 'assistant_message' && String(item?.text || '').trim(),\r\n );\r\n\r\n return latestAssistant ? [latestAssistant] : [];\r\n}\r\n\r\nfunction getChatThreadMessages(messages = []) {\r\n return messages.filter((item) => !item?.hiddenFromChat);\r\n}\r\n\r\nfunction getLatestVoiceSpeakableMessage(messages = []) {\r\n const latest = [...messages]\r\n .reverse()\r\n .find(\r\n (item) =>\r\n item?.hiddenFromChat &&\r\n item?.type !== 'user_message' &&\r\n typeof item?.text === 'string' &&\r\n item.text.trim(),\r\n );\r\n\r\n return String(latest?.text || '').trim();\r\n}\r\n\r\nfunction getLatestSearchQuery(messages = []) {\r\n const latestSearchMessage = [...messages]\r\n .reverse()\r\n .find(\r\n (item) =>\r\n item?.type === 'user_message' &&\r\n isLikelyFreshFlightSearch(String(item?.text || '')),\r\n );\r\n const explicitQuery = String(latestSearchMessage?.text || '').trim();\r\n if (explicitQuery) return explicitQuery;\r\n\r\n const latestResultsMessage = [...messages]\r\n .reverse()\r\n .find((item) => item?.type === 'flight_results');\r\n const params = latestResultsMessage?.data?.params || {};\r\n const dep = String(params?.dep || '').trim();\r\n const arr = String(params?.arr || '').trim();\r\n const dd = String(params?.dd || '').trim();\r\n const ad = String(params?.ad || '').trim();\r\n const adt = Number(params?.adt || 0);\r\n const tt = Number(params?.tt || 1);\r\n\r\n if (dep && arr && dd) {\r\n const paxText = adt > 0 ? ` with ${adt} adult${adt > 1 ? 's' : ''}` : '';\r\n const returnText = tt === 2 && ad ? ` return ${ad}` : '';\r\n return `book me a flight from ${dep} to ${arr} on ${dd}${returnText}${paxText}`;\r\n }\r\n\r\n return '';\r\n}\r\n\r\nfunction pruneReviewStageMessages(messages = []) {\r\n return messages.filter((item) => {\r\n if (!item) return false;\r\n if (item.type === 'traveler_details_form') return false;\r\n if (item.type === 'payment_confirmation') return false;\r\n\r\n const hasRedirectConfirmOptions = Array.isArray(item?.options)\r\n ? item.options.some((opt) =>\r\n String(opt?.value || '').startsWith('CONFIRM_REDIRECT:'),\r\n )\r\n : false;\r\n if (hasRedirectConfirmOptions) return false;\r\n\r\n return true;\r\n });\r\n}\r\n\r\nfunction buildAvailabilityErrorText(value, fallback) {\r\n if (typeof value === 'string') return value;\r\n if (typeof value === 'number' || typeof value === 'boolean') {\r\n return String(value);\r\n }\r\n if (value && typeof value === 'object') {\r\n const preferred =\r\n value?.message || value?.error || value?.details || value?.msg;\r\n if (preferred) return String(preferred);\r\n try {\r\n return JSON.stringify(value);\r\n } catch (error) {\r\n return fallback;\r\n }\r\n }\r\n return fallback;\r\n}\r\n\r\nfunction formatStopsLabel(stops) {\r\n const stopsCount = Number(stops || 0);\r\n if (stopsCount <= 0) return 'Non-stop';\r\n if (stopsCount === 1) return '1 stop';\r\n return `${stopsCount} stops`;\r\n}\r\n\r\nfunction buildSingleFlightConfirmationText(summary = {}) {\r\n const stopLabel = formatStopsLabel(summary?.stops);\r\n return `You have selected this flight: ${summary?.airline || 'Unknown airline'}, ${summary?.flightNumber || 'N/A'}, ${summary?.departureTime || '--:--'}-${summary?.arrivalTime || '--:--'}, ${stopLabel}. Do you want to proceed to availability?`;\r\n}\r\n\r\nfunction buildSplitRoundTripConfirmationText(summary = {}) {\r\n const onward = summary?.onward || {};\r\n const inbound = summary?.return || {};\r\n const onwardText = `Onward: ${onward?.airline || 'Unknown airline'} ${onward?.flightNumber || 'N/A'}, ${onward?.departureTime || '--:--'}-${onward?.arrivalTime || '--:--'}, ${formatStopsLabel(onward?.stops)}.`;\r\n const returnText = `Return: ${inbound?.airline || 'Unknown airline'} ${inbound?.flightNumber || 'N/A'}, ${inbound?.departureTime || '--:--'}-${inbound?.arrivalTime || '--:--'}, ${formatStopsLabel(inbound?.stops)}.`;\r\n return `You have selected these flights. ${onwardText} ${returnText} Do you want to proceed to availability?`;\r\n}\r\n\r\nfunction normalizeBookingSummary(summary = {}, fareAvailabilityPayload = null) {\r\n const baseSummary =\r\n summary && typeof summary === 'object' && !Array.isArray(summary)\r\n ? summary\r\n : {};\r\n const summaryLooksSplit =\r\n baseSummary?.type === 'split_roundtrip' ||\r\n Boolean(baseSummary?.onward) ||\r\n Boolean(baseSummary?.return);\r\n const payloadLooksRoundTrip =\r\n Boolean(String(fareAvailabilityPayload?.rukey || '').trim()) ||\r\n (Array.isArray(fareAvailabilityPayload?.rtrmkey) &&\r\n fareAvailabilityPayload.rtrmkey.length > 0) ||\r\n Number(fareAvailabilityPayload?.tt || 0) === 2 ||\r\n /split|combined/i.test(String(fareAvailabilityPayload?.styp || ''));\r\n\r\n if (!summaryLooksSplit && !payloadLooksRoundTrip) {\r\n return baseSummary;\r\n }\r\n\r\n const onwardFromSummary =\r\n baseSummary?.type === 'split_roundtrip'\r\n ? baseSummary?.onward || null\r\n : baseSummary?.onward || null;\r\n const returnFromSummary =\r\n baseSummary?.type === 'split_roundtrip'\r\n ? baseSummary?.return || null\r\n : baseSummary?.return || null;\r\n\r\n const onwardFromDom = getSelectedFlightSummaryFromDom('onward');\r\n const returnFromDom = getSelectedFlightSummaryFromDom('return');\r\n\r\n const onwardMerged = mergeFlightSummary(onwardFromSummary, onwardFromDom);\r\n const returnMerged = mergeFlightSummary(returnFromSummary, returnFromDom);\r\n\r\n if (\r\n !isFlightSummaryFilled(onwardMerged) &&\r\n !isFlightSummaryFilled(returnMerged)\r\n ) {\r\n // Keep legacy single summary only when we truly cannot resolve split details.\r\n return baseSummary;\r\n }\r\n\r\n return {\r\n type: 'split_roundtrip',\r\n onward: onwardMerged || null,\r\n return: returnMerged || null,\r\n };\r\n}\r\n\r\nfunction mergeFlightSummary(primary, fallback) {\r\n const p = primary && typeof primary === 'object' ? primary : {};\r\n const f = fallback && typeof fallback === 'object' ? fallback : {};\r\n const firstNonEmpty = (...values) => {\r\n for (const value of values) {\r\n const next = String(value || '').trim();\r\n if (next) return next;\r\n }\r\n return '';\r\n };\r\n const primaryStops = Number(p?.stops);\r\n const fallbackStops = Number(f?.stops);\r\n const mergedStops = Number.isFinite(primaryStops)\r\n ? primaryStops\r\n : Number.isFinite(fallbackStops)\r\n ? fallbackStops\r\n : 0;\r\n return {\r\n airline: firstNonEmpty(p?.airline, f?.airline),\r\n flightNumber: firstNonEmpty(p?.flightNumber, f?.flightNumber),\r\n departureTime: firstNonEmpty(p?.departureTime, f?.departureTime),\r\n arrivalTime: firstNonEmpty(p?.arrivalTime, f?.arrivalTime),\r\n stops: mergedStops,\r\n };\r\n}\r\n\r\nfunction isFlightSummaryFilled(summary) {\r\n if (!summary || typeof summary !== 'object') return false;\r\n const hasAirline = String(summary?.airline || '').trim();\r\n const hasFlightNumber = String(summary?.flightNumber || '').trim();\r\n const hasDeparture = String(summary?.departureTime || '').trim();\r\n const hasArrival = String(summary?.arrivalTime || '').trim();\r\n return Boolean(hasAirline || hasFlightNumber || hasDeparture || hasArrival);\r\n}\r\n\r\nfunction getSelectedFlightSummaryFromDom(leg) {\r\n const legValue = normalizeLegValue(leg);\r\n if (!legValue) return null;\r\n const selector = `.flight-card--selected[data-flight-leg=\"${legValue}\"]`;\r\n const cardElement = document.querySelector(selector);\r\n if (!cardElement) return null;\r\n return {\r\n airline: String(cardElement?.dataset?.flightAirline || '').trim(),\r\n flightNumber: String(cardElement?.dataset?.flightNumber || '').trim(),\r\n departureTime: String(\r\n cardElement?.dataset?.flightDepartureTime || '',\r\n ).trim(),\r\n arrivalTime: String(cardElement?.dataset?.flightArrivalTime || '').trim(),\r\n stops: deriveStopsFromFlightCardElement(cardElement),\r\n };\r\n}\r\n\r\nfunction deriveStopsFromFlightCardElement(cardElement) {\r\n if (!cardElement) return 0;\r\n const stopNode = cardElement.querySelector('.flight-card__stop-count');\r\n const stopText = String(stopNode?.textContent || '').toLowerCase();\r\n if (!stopText) return 0;\r\n if (stopText.includes('non-stop')) return 0;\r\n const match = stopText.match(/(\\d+)\\s*stop/);\r\n if (match?.[1]) {\r\n const parsed = Number(match[1]);\r\n return Number.isFinite(parsed) ? parsed : 0;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction isReturnDatePrompt(optionMessage) {\r\n const missingFields = Array.isArray(optionMessage?.meta?.missingFields)\r\n ? optionMessage.meta.missingFields\r\n : [];\r\n if (missingFields.includes('ad')) return true;\r\n const text = String(optionMessage?.text || '').toLowerCase();\r\n return /\\breturn date\\b|\\breturning\\b|\\bcoming back\\b/.test(text);\r\n}\r\n\r\nfunction deriveDateSelectionContext(messages = []) {\r\n const latestSearchStartIndex = findLatestSearchStartIndex(messages);\r\n const scopedMessages =\r\n latestSearchStartIndex >= 0\r\n ? messages.slice(latestSearchStartIndex)\r\n : messages;\r\n\r\n const context = {\r\n onwardDate: null,\r\n returnDate: null,\r\n awaitingField: '',\r\n };\r\n\r\n scopedMessages.forEach((message) => {\r\n if (!message) return;\r\n const type = String(message?.type || '').toLowerCase();\r\n\r\n if (type === 'assistant_message') {\r\n const missingFields = Array.isArray(message?.meta?.missingFields)\r\n ? message.meta.missingFields\r\n : [];\r\n if (missingFields.includes('dd')) context.awaitingField = 'dd';\r\n if (missingFields.includes('ad')) context.awaitingField = 'ad';\r\n\r\n const assistantText = String(message?.text || '').toLowerCase();\r\n if (/\\bwhat date are you flying\\b/.test(assistantText)) {\r\n context.awaitingField = 'dd';\r\n }\r\n if (/\\breturn date\\b/.test(assistantText)) {\r\n context.awaitingField = 'ad';\r\n }\r\n return;\r\n }\r\n\r\n if (type !== 'user_message') return;\r\n const userText = String(message?.text || '').trim();\r\n if (!userText) return;\r\n\r\n const explicitOnwardMatch = userText.match(\r\n /\\bonward(?:\\s+is)?\\s+([0-3]?\\d[\\/-][01]?\\d[\\/-]\\d{4}|\\d{4}-\\d{2}-\\d{2}|today|tomorrow|next weekend)\\b/i,\r\n );\r\n if (explicitOnwardMatch?.[1]) {\r\n const parsedOnward = parseDateFromChatText(explicitOnwardMatch[1]);\r\n if (parsedOnward) context.onwardDate = parsedOnward;\r\n }\r\n\r\n const explicitReturnMatch = userText.match(\r\n /\\breturn(?:\\s+is)?\\s+([0-3]?\\d[\\/-][01]?\\d[\\/-]\\d{4}|\\d{4}-\\d{2}-\\d{2}|today|tomorrow|next weekend)\\b/i,\r\n );\r\n if (explicitReturnMatch?.[1]) {\r\n const parsedReturn = parseDateFromChatText(explicitReturnMatch[1]);\r\n if (parsedReturn) context.returnDate = parsedReturn;\r\n }\r\n\r\n if (!context.awaitingField) return;\r\n const parsedFromFollowup = parseDateFromChatText(userText);\r\n if (!parsedFromFollowup) return;\r\n\r\n if (context.awaitingField === 'dd') {\r\n context.onwardDate = parsedFromFollowup;\r\n } else if (context.awaitingField === 'ad') {\r\n context.returnDate = parsedFromFollowup;\r\n }\r\n context.awaitingField = '';\r\n });\r\n\r\n return {\r\n onwardDate: context.onwardDate,\r\n returnDate: context.returnDate,\r\n };\r\n}\r\n\r\nfunction findLatestSearchStartIndex(messages = []) {\r\n for (let i = messages.length - 1; i >= 0; i -= 1) {\r\n const message = messages[i];\r\n if (message?.type !== 'user_message') continue;\r\n const text = String(message?.text || '');\r\n if (isLikelyFreshFlightSearch(text)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction parseDateFromChatText(value) {\r\n const raw = String(value || '')\r\n .trim()\r\n .toLowerCase();\r\n if (!raw) return null;\r\n\r\n const now = new Date();\r\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n if (raw === 'today') return today;\r\n if (raw === 'tomorrow') {\r\n const tomorrow = new Date(today);\r\n tomorrow.setDate(tomorrow.getDate() + 1);\r\n return tomorrow;\r\n }\r\n if (raw === 'next weekend') {\r\n const day = today.getDay();\r\n const daysUntilSaturday = (6 - day + 7) % 7 || 7;\r\n const weekend = new Date(today);\r\n weekend.setDate(weekend.getDate() + daysUntilSaturday);\r\n return weekend;\r\n }\r\n\r\n const dmyMatch = raw.match(/^([0-3]?\\d)[\\/-]([01]?\\d)[\\/-](\\d{4})$/);\r\n if (dmyMatch) {\r\n const day = Number(dmyMatch[1]);\r\n const monthIndex = Number(dmyMatch[2]) - 1;\r\n const year = Number(dmyMatch[3]);\r\n const parsed = new Date(year, monthIndex, day);\r\n if (Number.isNaN(parsed.getTime())) return null;\r\n return parsed;\r\n }\r\n\r\n const isoMatch = raw.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\r\n if (isoMatch) {\r\n const year = Number(isoMatch[1]);\r\n const monthIndex = Number(isoMatch[2]) - 1;\r\n const day = Number(isoMatch[3]);\r\n const parsed = new Date(year, monthIndex, day);\r\n if (Number.isNaN(parsed.getTime())) return null;\r\n return parsed;\r\n }\r\n\r\n return null;\r\n}\r\nfunction cloneTravelerPayload(value) {\r\n if (!value || typeof value !== 'object') return value;\r\n try {\r\n return JSON.parse(JSON.stringify(value));\r\n } catch (error) {\r\n return value;\r\n }\r\n}\r\n","import React from 'react';\r\nimport { SocketContext } from './context/SocketContext';\r\nimport ChatWindow from './components/ChatWindow';\r\nimport 'react-datepicker/dist/react-datepicker.css';\r\nimport './index.css';\r\nimport './App.scss';\r\n\r\n/**\r\n * Full-screen travel AI chat UI. Pass the same socket.io client instance your app uses for the backend.\r\n */\r\nexport default function AIChatAgent({ socket }) {\r\n return (\r\n <SocketContext.Provider value={socket}>\r\n <ChatWindow />\r\n </SocketContext.Provider>\r\n );\r\n}\r\n","function buildTravellerSkeletons({\r\n adt = 1,\r\n chd = 0,\r\n inf = 0,\r\n passportRequired = false,\r\n}) {\r\n const travellers = [];\r\n\r\n for (let i = 1; i <= Number(adt); i += 1) {\r\n travellers.push({\r\n sno: i,\r\n tl: '',\r\n typ: 'ADT',\r\n ldpax: i === 1,\r\n fn: '',\r\n ln: '',\r\n dob: null,\r\n nat: passportRequired ? '' : '',\r\n isc: passportRequired ? '' : '',\r\n num: passportRequired ? '' : '',\r\n expdt: passportRequired ? null : null,\r\n issdt: passportRequired ? null : null,\r\n dtyp: 'P',\r\n extbag: [],\r\n meal: [],\r\n seat: [],\r\n });\r\n }\r\n\r\n for (let i = 1; i <= Number(chd); i += 1) {\r\n travellers.push({\r\n sno: Number(adt) + i,\r\n tl: '',\r\n typ: 'CHD',\r\n ldpax: false,\r\n fn: '',\r\n ln: '',\r\n dob: null,\r\n nat: passportRequired ? '' : '',\r\n isc: passportRequired ? '' : '',\r\n num: passportRequired ? '' : '',\r\n expdt: passportRequired ? null : null,\r\n issdt: passportRequired ? null : null,\r\n dtyp: 'P',\r\n extbag: [],\r\n meal: [],\r\n seat: [],\r\n });\r\n }\r\n\r\n for (let i = 1; i <= Number(inf); i += 1) {\r\n travellers.push({\r\n sno: Number(adt) + Number(chd) + i,\r\n tl: '',\r\n typ: 'INF',\r\n ldpax: false,\r\n fn: '',\r\n ln: '',\r\n dob: null,\r\n nat: passportRequired ? '' : '',\r\n isc: passportRequired ? '' : '',\r\n num: passportRequired ? '' : '',\r\n expdt: passportRequired ? null : null,\r\n issdt: passportRequired ? null : null,\r\n dtyp: 'P',\r\n });\r\n }\r\n\r\n return travellers;\r\n}\r\n\r\nexport function buildPrebookPayloadFromAvailability(availabilityResponse) {\r\n const avail = availabilityResponse?.payload || availabilityResponse || {};\r\n const trps = avail?.trps || {};\r\n const fare = trps?.pr || {};\r\n\r\n const passportRequired =\r\n String(avail?.ps || '').toUpperCase() === 'Y' ||\r\n String(avail?.sectyp || '').toLowerCase() === 'int';\r\n\r\n return {\r\n ukey: avail?.ukey || '',\r\n ptyp: 'CD',\r\n prd: 'F',\r\n em: '',\r\n ph: '',\r\n adt: String(avail?.adt ?? 1),\r\n chd: String(avail?.chd ?? 0),\r\n inf: String(avail?.inf ?? 0),\r\n tt: String(avail?.tt ?? 1),\r\n styp: avail?.styp || '',\r\n rmkey: fare?.rmkey || '',\r\n chnl: 'B2C',\r\n passportRequired,\r\n trvlrs: buildTravellerSkeletons({\r\n adt: avail?.adt,\r\n chd: avail?.chd,\r\n inf: avail?.inf,\r\n passportRequired,\r\n }),\r\n };\r\n}\r\n\r\nexport default buildPrebookPayloadFromAvailability;\r\n"],"names":["SocketContext","createContext","useSocket","socket","useContext","normalizeRmkeyList","value","item","single","getCurrencySymbol","currencyCode","code","buildSplitPairedFareAvailabilityPayload","onwardFlight","returnFlight","onwardRmkeyList","returnRmkeyList","rmkeyList","idx","arr","rukey","onwardApcoup","returnApcoup","getAirlinesMap","map","airlinesData","pickAirportCode","mappingItem","candidate","pickAirportName","buildAirportMappings","rawMappings","name","getAirportNameFromMappings","airportMappings","normalizedCode","buildTravellerSkeletons","adt","chd","inf","passportRequired","pax","i","buildPrebookPayload","availability","airlinesMap","avail","trpsRaw","trps","depsRaw","deps","segs","rttrpsRaw","rttrps","rtdepsRaw","rtdeps","rtSegsFromSplit","arrsRaw","arrs","rtSegsFromCombined","rtSegs","fare","returnFare","onwardTaxTotal","acc","tax","returnTaxTotal","hasReturnRef","hasReturnSegs","isRoundTrip","ttValue","_a","_b","_c","_d","_e","_f","seg","_g","_h","_i","_j","_k","_l","SERVICE_FEE_TEXT","CancellationPolicy","isNonRefundable","policyRows","showServiceFee","loading","penaltyText","jsx","rows","jsxs","row","FlightResultCardBase","card","isCheapest","isRecommended","disableBook","bookingFlightId","hoveredBookId","onHoverChange","onBookClick","legTagText","selectionMode","isSelected","onSelectClick","dimmed","displayMode","isDetailsOpen","onToggleDetails","onBookFlight","cardPositionIndex","isFarePanelOpen","setIsFarePanelOpen","useState","isMoreFaresOpen","setIsMoreFaresOpen","isFareRulesOpen","setIsFareRulesOpen","selectedFareForRules","setSelectedFareForRules","currency","formattedPrice","stopLabel","cardClasses","travelClass","cabinBaggage","checkInBaggage","fareType","fareTypeLower","hasRefundableHint","refundBadgeLabel","refundStatusType","handleBookFlight","flight","visibleMoreFares","f","viaStopsText","segments","connectionCodes","segment","uniqueCodes","useEffect","onKeyDown","event","activeTab","setActiveTab","renderPriceBreakup","paxPrices","adtPrice","p","chdPrice","infPrice","totalBaseFare","totalTaxes","renderFareRules","rulesFare","fareIsNonRefundable","e","MdStar","IoChevronUp","IoChevronDown","tab","RxCross2","BsArrowRight","formatDateForCard","isLast","React","getAirportDisplayName","FaArrowRightLong","fareOption","optionPrice","optionFareType","bag0","bag1","refundableText","isRefundable","FiLock","FiBriefcase","rawValue","date","day","month","suffix","providedName","mappedAirportName","preferred","iata","FlightResultCardOneWay","props","FlightResultCardOnward","FlightResultCardReturn","FlightFarePanels","renderFareDetails","children","Fragment","FlightResultCardRoundTripCombined","allSegments","useMemo","renderLeg","label","leg","rotatedPlane","stopCount","stopText","FaPlane","renderDetailLeg","title","legSegments","openFareDetails","openMoreFares","hasMoreFares","FlightResultCards","cards","disableViewAll","recommendationCriteria","onAvailabilitySuccess","onAvailabilityReset","sectionTitle","cardVariant","sectionClassName","selectedId","onSelectCard","peerSelectedPayloadIndex","showAll","setShowAll","setHoveredBookId","bookError","setBookError","expandedDetailIds","setExpandedDetailIds","cheapestPrice","min","cheapestCardId","cheapestCard","recommendedCardId","matched","isCardMatchingRecommendation","previousOverflow","toLegSummary","fallback","handleBookClick","closeExpandedView","rtRmkeyList","fareAvailabilityPayload","buildFareAvailabilityPayload","bookingSummary","visibleCards","CardComponent","toggleCardDetails","cardId","prev","handleSelectCard","itemIndex","tt","styp","basePayload","mergedRmkey","criteria","airlineMatches","departureTimeMatches","normalizeTime","originMatches","destinationMatches","dateMatches","normalizeDateToIso","priceMatches","raw","match","dd","mm","yyyy","FlightResultsOneWay","payload","flightImagesBaseUrl","payloadIndex","trip","tripIndex","dep","firstSeg","lastSeg","cabinBag","checkinBag","refundableFlag","airlineCode","airlineName","logoBase","segmentAirlineCode","mapTripCard","legType","FlightResultsRoundTripSplit","selectedOnward","setSelectedOnward","selectedReturn","setSelectedReturn","bookingSplit","setBookingSplit","onwardCards","returnCards","handleSelectOnward","handleSelectReturn","handleSplitBook","splitBookDisabled","showSplitSelectionBar","onwardPrice","returnPrice","totalPrice","displayCurrency","formatAmount","FlightResultsRoundTripCombined","toTripList","normalizeCombinedStyp","tripFare","buildLeg","fallbackLabel","segmentIndex","trips","returnTrips","onwardSegments","returnFromTrps","returnFromRtTrps","returnSegments","_m","onwardTf","returnTf","totalFare","onwardLeg","returnLeg","normalizedStyp","returnRmkey","returnCoupon","_o","_n","_p","_q","parseFlightFilters","text","normalizedText","doc","filters","parseClearCommands","parseSortCommands","parseStops","parsePrice","parseAirlines","parseTimes","parseLayoverConstraints","parseAdvancedConstraints","applyClauseAwareRoundTripOverrides","hasReturnContext","hasOnwardContext","targetLayoverKey","targetDurationKey","invalidCodeTokens","cityToCode","returnContextPattern","onwardContextPattern","splitRegex","hasGlobalLayoverIntent","hasBothLegsContext","clauses","clause","normalizeToAirportCode","token","collectLayoverCodes","clauseText","codes","addCode","captured","clauseHasReturn","clauseHasOnward","targetKeys","key","underMatch","overMatch","betweenMatch","toMinutes","unit","n","normalizedUnit","max","durationRange","durationMax","durationMin","durationMatch","originalText","normalizedClauses","s","originalClauses","getSide","stopRules","timeSlotPatterns","airlinesDataJson","airlineCodeByName","validAirlineCodes","airline","hasClauseStopIntent","hasClauseAirlineIntent","hasClauseTimeIntent","side","originalClause","targetStops","addStop","stop","targetAirlines","addAirline","isArrivalClause","targetTimes","addTime","slot","pattern","normalized","isDescendingSort","isAscendingSort","hasPriceKeyword","hasDurationKeyword","hasDepartureKeyword","hasArrivalKeyword","sortValue","targetStopsKeys","addStopToTargets","nonStopPatterns","oneStopPatterns","multiStopPatterns","excludedStops","hasNonStop","hasOneStop","hasMultiStop","part","trimmedPart","sanitizedText","hasLayoverContext","hasDurationUnit","hasDurationComparator","genericPriceIntentPattern","genericMatch","parsedPrice","hasUpperBoundIntent","hasLowerBoundIntent","targetAirlinesKeys","addAirlineToTargets","nonAirlineCodeTokens","airlineMappings","airlineCodes","variations","variation","airlineCodePattern","matches","standaloneCodePattern","standaloneMatches","allTimeSlots","hasArrivalContext","hasDepartureContext","getTimeTargetKeys","addUniqueTimeSlot","targetKey","addSlotToTargets","thresholdMatch","comparator","hour","minute","meridiem","slots","isLikelyPriceContext","hasMeridiemHint","hasLargeNumericRange","hasNegationIntent","isDepartureContext","excludedSlots","timeMappings","index","startHour","endHour","start24","end24","fullMatch","endTimePart","mappedTimeSlot","timeSlot","isInTimeSlot","timeStr","parts","start","end","filterFlightData","stops","rtStops","price","rawAirlines","rawRtAirlines","depTimes","arrTimes","rDepTimes","rArrTimes","rawLayover","rawReturnLayover","layoverDuration","rLayoverDuration","rawData","a","nameKey","codeValue","normalizeAirlines","list","val","mapped","airlines","rtAirlines","airlineCodeSet","rtAirlineCodeSet","resolveCarrierCodes","rawCarrier","normalizeLayoverFilter","entry","layover","rLayover","toAirportCodes","input","values","getLayoverCodes","fromSegments","fromSegmentStopFields","fromDepLevel","fromTripLevel","parseDateParts","dateValue","timeValue","rawDate","rawTime","dateMatch","timeMatch","hh","dt","getLayoverDurationsInMinutes","current","next","arrivalDate","departureDate","arrivalTime","departureTime","arrival","departure","diffMinutes","isLayoverDurationMatch","durations","constraint","duration","filteredTrips","tipIdx","tripPrice","numStops","carrierCodes","carrierCode","segmentLayovers","layoverDurations","filteredRtTrips","sortFlightData","sortBy","getPrice","getDepTime","getArrTime","getDuration","itemsWithSortedTrips","rtTrips","sortFn","b","tripA","tripB","FlightResults","results","emptyMessage","extractedFilters","latestUserText","isLatestResultsMessage","onFilterCountChange","onRecommendationChange","activeFilters","setActiveFilters","hasAutoSelected","setHasAutoSelected","hasAutoShownAll","setHasAutoShownAll","rootRef","useRef","filteredPayload","data","resultContextBadges","source","badges","tripType","cabinRaw","cabinLabel","agtyp","utyp","isCorporateUser","buildDynamicRecommendationText","items","viewAllButton","bookButton","getStyp","directStyp","firstTrip","roundTripPayload","combinedPayload","splitPayload","isCombined","badge","flights","extractFlights","byPrice","cheapest","best","suggested","bestDur","route","baseText","formatMoney","filterNotes","first","last","toDurationMins","h","m","hours","mins","total","amount","EMPTY_PAYLOAD","TravelerDetailsForm","prebookPayload","sessionId","isReadOnly","onGoBack","onVoiceAssistantMessage","onPaymentSuccess","onViewStateChange","setPayload","isSaving","setIsSaving","isSubmittingPrebook","setIsSubmittingPrebook","statusText","setStatusText","fieldErrors","setFieldErrors","bookingId","setBookingId","prebookResponse","setPrebookResponse","confirmedPayload","setConfirmedPayload","confirmedRequestPayload","setConfirmedRequestPayload","showProceedToBook","setShowProceedToBook","isDetailsConfirmed","setIsDetailsConfirmed","paymentSummary","setPaymentSummary","appliedPromocode","setAppliedPromocode","promocodeDiscount","setPromocodeDiscount","isApplyingPromo","setIsApplyingPromo","selectedGateway","setSelectedGateway","selectedPaymentMode","setSelectedPaymentMode","isPaying","setIsPaying","isSubmittingApprovalRequest","setIsSubmittingApprovalRequest","tripReason","setTripReason","showPayNow","setShowPayNow","sdkWarning","setSdkWarning","selectedFrequentTravellerByIndex","setSelectedFrequentTravellerByIndex","hasAnnouncedPromptRef","paymentSectionRef","shouldScrollToPaymentRef","emitActionLoader","useCallback","status","scrollToPaymentSection","firstFrame","secondFrame","setActionLoading","isLoading","prebookBookingId","isPrebookSuccessStatus","isPrebookDone","canInteractWithBlock","canEditTraveller","normalizedUtyp","normalizedAgtyp","normalizedChannel","isCorporateFlow","isB2bAgency","isB2bLikeChannel","allowBalancePaymentOption","parsePolicyList","corporatePolicy","corporateOutboundPolicy","corporateInboundPolicy","hasCorporateInboundJourney","corporateApprovalRequired","toBooleanFlag","shouldShowInboundApprovalRequest","selectedChargeForFee","resolveSelectedChargeForFee","convenienceFee","getGatewayFeeAmount","fareCurrency","onwardFareAmount","_s","_r","returnFareAmount","_u","_t","baseFareAmount","discountAmount","totalPayableAmount","restoredState","initialPaymentSummary","restoredPaymentSummary","normalizeCollection","initialGateways","snapshot","gateways","getGatewayNamesFromSummary","gatewayName","gateway","razorCheckoutUrl","loadExternalScript","atomSdkUrl","easeSdkUrl","cancelScroll","response","corporateFromApi","handleApprovalRequest","ok","firstTraveller","travellers","frequentTravellers","normalizeFrequentTravellerList","updateTraveller","travellerIndex","field","errorKey","applyFrequentTravellerToIndex","selectedTraveller","selectedKey","getFrequentTravellerKey","merged","handleCancel","validateTravellers","errors","showPassport","traveller","dob","toDateInput","today","ageError","validateAgeByTravellerType","issue","expiry","handleApplyPromocode","dataPayload","onwardTrip","returnTrip","uid","rmkeyFromResponse","confirmedRmkey","rmkey","msg","error","handleRemovePromocode","requestedCode","targetCode","reply","normalizedAppliedCode","handleProceedToBook","requestPayloadOverride","requestPayload","errorMessage","apiData","responsePayload","bkid","normalizedCharges","successMessage","handleSave","continueAfterSave","normalizedPrebookPayload","buildPrebookRequest","initialPrompt","buildNextTravelerPrompt","handlePayNow","onwardAmount","returnAmount","baseAmount","selectedCharge","gatewayFee","normalizedGateway","normalizedMode","isRazorPay","isEaseBuzz","isAtom","isPhonePe","isCCAvenue","isBalancePayment","isCrypto","leadTraveller","travelerName","bookingPayload","ccMode","ccAvenuePtyp","confirmationMessage","launchResult","launchGatewayFlow","paymentCompletedMessage","handleVoiceInput","spokenText","travellerNumMatch","defaultTypIndex","fixedFormatCommand","parseFixedTravelerInput","buildFixedTravellerFormatTemplate","targetIndex","safeFixedUpdates","removeImmutableTravelerFields","voiceCommand","parseTravelerVoiceCommand","mode","getGatewayForPaymentMode","getPaymentModeLabel","fallbackReply","safeVoiceUpdates","immutableReply","typedTarget","resolveTypedTravelerTarget","t","safeTargetIndex","targetTraveller","nextTraveller","buildTravelerVoiceReply","handleProceedBook","handleExecutePayNow","handleApplySaved","savedIndex","selected","nextIndex","targetType","travelerOptions","isSavedTravellerTypeMatch","origIndex","travellerTypeLabel","getTravellerTypeLabel","excludedFrequentTravellerKeys","FormSelect","FrequentTravellerFirstNameSelect","saved","Input","DateInput","getDobCalendarBounds","toDisplayText","savedTraveller","currentType","savedType","travellerType","fn","ln","typ","passport","toEngineDate","parsed","normalizeTraveller","context","fallbackPayload","resolvedAgtyp","rawChannel","fallbackChannel","finalRawChannel","resolvedChannel","normalizedTravellers","adults","nonInfNonAdults","infants","adultsWithInfants","adult","mappedInf","remainingInfants","framedTravellers","inputClassNames","onChange","onSelectFrequentTraveller","placeholder","disabled","type","isOpen","setIsOpen","query","setQuery","filteredOptions","uniqueKey","firstName","lastName","fullName","q","nextValue","option","options","selectClassNames","selectedOption","ReactSelect","minDate","maxDate","DatePicker","toDateObject","fromDateInput","addYears","years","d","addDays","days","getAgeInYears","dobValue","age","monthDiff","dayDiff","paymentMode","onGatewayCallback","onGatewayDismiss","ordid","razorKey","razorCallbackUrl","resolve","resolved","callbackInvoked","finalize","result","resp","postRazorpayPaymentResponse","rzp","failure","message","ccAvenueBase","ccPayload","encryptedKey","accessCode","paymentUrl","width","height","left","top","easePayBase","easeRedirectFallback","redirectUrl","phonePeRedirectFallback","atomRedirectFallback","atomToken","atomMerchantId","atomReturnBase","callbackBaseUrl","baseUrl","endpoint","id","src","script","summary","names","nm","charges","feeKeys","typeValue","lower","parsePaymentModeFromText","applyPromoMatch","applyPromoCodeBeforeKeywordMatch","applyPromoCode","removePromoWithCodeMatch","travelerIndexMatch","ordinalMatch","targetedIndex","updates","nextMissingField","getNextTravelerField","isTravellerTypeChangeAttempt","changeToMatch","fieldPart","valuePart","stripLeadingConnector","capitalizeWord","parseSpokenDate","isLikelyNamePhrase","fullNameMatch","firstNameMatch","lastNameMatch","explicitTypeMatch","dobMatch","dobText","parsedDob","extractDatePhrase","nationalityMatch","passportMatch","issueMatch","parsedIssueDate","expiryMatch","parsedExpiryDate","applyContextualTravelerFallback","updatedLabels","formatVoiceDate","nextPrompt","joinWithAnd","typedMatch","requestedOrder","requestedType","indices","target","typeLabel","nameValue","extractSimpleNameValue","parsedDate","nationality","extractSimpleTextValue","passportNumber","cleaned","firstWord","patterns","parse","isValid","defaultTyp","travellerMatch","afterIndex","invalidDate","pair","rawKey","rest","gender","parseFlexibleDateToIso","typFallback","missingRequired","missingPassportFields","phraseMatch","isoMatch","slashMatch","PaymentConfirmationCard","confirmation","root","normalizeRootConfirmation","pickFirstValue","pnr","extractTravellers","sectors","extractSectors","returnSectors","extractReturnSectors","getTripStyle","getTripType","isRoundTripBooking","contact","extractContact","bookingMessage","getBookingMessage","statusTagClass","getStatusTagClass","BsCheckCircleFill","AiOutlineInfoCircle","MetaLine","toNumber","sector","airlineLogo","buildAirlineLogoUrl","toFriendlyDate","safeTime","DetailItem","toDisplayDate","toGenderLabel","bksts","keys","deepValue","deepGet","isMeaningfulValue","direct","nested","deepFindKey","path","candidates","firstDep","formatStopLabel","firstRtDep","firstArr","rawStops","safeCode","statusValue","className","valueClassName","valueAsTag","lineClass","valueClass","FlightSummary","getCurrency","fareInfo","getFareInfo","getSectors","getReturnSectors","isRoundTripTrip","returnAirlineName","returnAirlineCode","returnAirlineLogo","FareRow","traveler","roundTrip","payloadOnwardFare","payloadReturnFare","onwardTripPaxBase","getPaxBaseTotal","roundTripPaxBase","baseFareFromPax","baseFareFromTrip","payloadBaseFare","baseFare","onwardTripTax","sumTaxes","roundTripTax","breakupTaxTotal","pureTaxTotal","onwardTripTotalFare","roundTripTotalFare","payloadTotalFare","normalizedConvenienceFee","feesAndSurcharges","supplierCombinedTotal","totalPayable","counts","adtBf","getPaxFareByType","chdBf","infBf","taxs","ONLINE_SPLIT_GATEWAYS","ONLINE_COMBINED_GATEWAY","EXTRA_GATEWAYS","normalizePolicyArray","getPaymentModeIcon","FiCreditCard","FiGlobe","FiSmartphone","PaymentGatewayOptions","onGatewayChange","allowBalance","combineOnlineOptions","visibleGateways","byCurrency","corporate","ptyp","outboundPtyp","inboundPtyp","hasInbound","effectivePtyp","allowsOnline","allowsCreditLine","MessageList","messages","typing","typingText","onOptionClick","onTravelerGoBack","variant","containerRef","endRef","shouldStickToBottomRef","travelerUiByIndex","setTravelerUiByIndex","container","handleScroll","distanceFromBottom","endElement","lastMessage","lastMessageType","frame","scrollContainerToBlockTop","targetBlock","containerRect","blockRect","topOffset","resultBlocks","latestResultBlock","travelerBlocks","latestTravelerBlock","mainTravelerForm","hasPostPrebookInlineUi","lastFlightResultsIndex","x","lastTravelerFormIndex","effectiveTypingText","buildSearchTypingText","shouldDisableFlightBooking","safeText","flightsCount","hasFlights","displayText","tripSummary","buildTripSummary","recommendationText","HiSparkles","buildRecommendationCriteria","count","shouldHideUserMessageAsInlinedTravelerSave","shouldHideUserMessageAsInlinedProceedToBook","shouldHideUserMessageAsInlinedProceedConfirmReply","shouldHideUserMessageAsInlinedPayIntent","shouldHideUserMessageAsInlinedPaymentConfirmReply","FaUser","travelerUi","isLatestTravelerBlock","hasResultsAfterThisBlock","inlineSaveEchoText","getInlinedTravelerSaveUserEchoText","proceedToBookInline","findProceedToBookInlineBundle","proceedConfirmReplyEcho","findInlinedProceedConfirmReply","payIntentInline","findPayIntentInlineBundle","proceedConversationBlock","copy","promo","isApplied","_v","_w","_x","_y","_z","_A","_B","_C","_D","_E","_F","shouldHideAssistantMessageAsInlinedProceedToBook","shouldHideAssistantMessageAsInlinedPaymentConfirm","userText","routeMatch","dateText","firstItem","fromCode","toCode","getCityLabel","paxCount","classText","travelerInfo","formatDateLabel","iataCode","routeDateMatch","airlineMatch","priceMatch","parseRecommendationAmount","isTravelerDetailsSaveUserText","travelerFormIndex","isProceedFlightBookPromptAssistant","isProceedToBookUserText","buildProceedToBookBundleAtAssistantIndex","assistantIndex","hasProceedUserEcho","findProceedToBookInlineBundleForward","findProceedToBookInlineBundleBackward","bundle","isProceedConfirmReplyUserText","proceedBundle","echo","isPayIntentUserText","isPaymentConfirmationPromptAssistant","o","findPreviousTravelerFormIndex","findLastFlightResultsIndexBefore","beforeIndex","paymentAssistantClearToTraveler","assistantIdx","travelerIdx","k","findPaymentAssistantNearTraveler","bestBefore","j","collectPayUserIndicesForPaymentAssistant","lastText","pushPay","afterFlight","lo","prevFormIdx","payUserIndices","assistantText","payBlock","rangeStart","scanFrom","foundAssistant","foundText","confirmReplyIndex","confirmReplyText","convertDateToDDMMYYYY","year","MicrophoneIcon","MessageInput","onSend","onOpenVoiceAssistant","prefillMessage","onPrefillConsumed","isReturnDateSelection","knownOnwardDate","knownReturnDate","setText","isCustomDateOpen","setIsCustomDateOpen","customOnwardDate","setCustomOnwardDate","customReturnDate","setCustomReturnDate","customTripType","setCustomTripType","calendarMonthsShown","setCalendarMonthsShown","inputRef","handleInputChange","sendCurrentText","nextText","handleInputKeyDown","updateCalendarMonths","hasDateQuickOptions","opt","isDateQuickOption","dateOptionsKey","toDateOrNull","handleOneWayDateSelect","handleRoundTripDateSelect","clickedDate","currentOnward","currentReturn","isDateAfter","nextOnward","nextReturn","onward","returned","handleCustomDateToggle","createPortal","formatShortDate","LuSend","dmyMatch","monthIndex","parsedDmy","ymdMatch","parsedYmd","right","stripTime","base","isSpeechRecognitionSupported","isTextToSpeechSupported","createSpeechRecognition","SpeechRecognition","recognition","cancelSpeech","speakText","content","utterance","preferredVoice","getPreferredVoice","lang","explicitVoiceName","voices","normalizedLang","normalizedVoiceName","exactMatch","voice","sameLanguageVoices","pool","preferredNameMatch","FEMALE_VOICE_HINTS","hint","useConversation","isBackendTyping","isListening","setIsListening","isSpeaking","setIsSpeaking","speakerEnabled","setSpeakerEnabled","transcript","setTranscript","setStatus","setError","recognitionRef","finalTranscriptRef","latestTranscriptRef","silenceTimerRef","mountedRef","shouldResumeAfterReplyRef","lastSpokenAssistantRef","awaitingReplyRef","isStartingRef","isRecognitionActiveRef","stopListening","nextAssistantText","shouldResume","startListening","handleResolvedTurn","ensureRecognition","finalText","interimText","chunk","combinedText","resolveRecognitionError","fallbackText","resetConversation","VoiceAssistant","onClose","standalonePage","speechRecognitionSupported","phaseLabel","phaseClass","FiX","FiMicOff","FiMic","IDLE_TIMEOUT_MS","ChatWindow","setSessionId","setMessages","setTyping","setTypingText","isSessionExpired","setIsSessionExpired","assistantInstanceKey","setAssistantInstanceKey","setLatestAssistantText","isVoiceAssistantOpen","setIsVoiceAssistantOpen","setPrefillMessage","dismissedOptionsKey","setDismissedOptionsKey","activeTravelerOptions","setActiveTravelerOptions","lastSearchQuery","setLastSearchQuery","pendingRedirectAction","setPendingRedirectAction","pendingBookingConfirmation","setPendingBookingConfirmation","pendingProceedToBookConfirmation","setPendingProceedToBookConfirmation","pendingPaymentConfirmation","setPendingPaymentConfirmation","paymentConfirmPromptLatchRef","latestTravelerFormPayloadRef","loadedSessionRef","shouldShowWelcomeRef","hasExpiryMessageRef","pendingMessageSourcesRef","latestOptionsMatch","latestFlightResultsIndex","latestOptions","latestOptionsKey","normalizeIncomingMessage","incoming","existingSessionId","getSessionIdFromUrl","stored","getStoredMessages","getLatestSpeakableMessage","markSessionActivity","userContext","buildSearchUserContext","setSessionIdInUrl","welcomeMessage","handleUiLoading","normalizedResponse","nextMessage","touchActivity","handleUpdateOptions","nextOptions","handleTravelerFormStateUpdated","nextPayload","cloneTravelerPayload","handleActionLoader","handleBookingConfirmationRequest","detail","normalizedSummary","normalizeBookingSummary","confirmText","buildSplitRoundTripConfirmationText","buildSingleFlightConfirmationText","handleConfirmProceedRequest","handleConfirmPaymentRequest","timer","lastActivityAt","getSessionLastActivity","storeMessages","isActive","returnParams","getPaymentReturnParams","resolvedSessionId","apiBase","clearPaymentReturnQueryParams","requestRedirectConfirmation","action","executeResetFlow","refetchSearch","queryOverride","suppressUserEcho","queryToRefetch","getLatestSearchQuery","baseThread","pruneReviewStageMessages","getLatestSearchContextFromMessages","getUserTimeZone","handleAvailabilityReset","requireConfirmation","travelerFormElement","getLatestActiveTravelerFormElement","handleAvailabilitySuccess","appendUserMessage","appendAssistantMessage","hiddenFromChat","appendVoiceUserMessage","appendVoiceAssistantMessage","appendPaymentConfirmationDetails","details","triggerFlightAvailability","pendingBooking","resolveUserUid","rawUser","fromStore","fromEnv","buildAvailabilityErrorText","rawAvailability","framedPrebook","repeatTravelerFormAtBottom","lastForm","latestPayload","activeTravelerForm","tryHandleFilterLocally","isSearchSlotUpdateCommand","lastResultIdx","actualIdx","lastMsg","isRoundTripResultsMessage","newFilters","hasRealFilters","hasMeaningfulFlightFilters","wantsBookWithParsedFilters","hasQuestionForm","hasComparativeIntent","hasOrdinalIntent","hasThresholdIntent","hasMultiClauseIntent","hasNaturalPhrase","getFlightResultsPayload","mergedFilters","preview","computeFilteredPayloadForDisplay","updated","latestResultIndexInPrev","sourceResultMsg","mergedFromPrev","shouldAutoBookFirstFilteredFlight","scheduleAutoBookFirstFilteredFlight","sendMessage","currentSearchContext","isSlotUpdateFollowup","hasUndismissedProceedToBookOptions","confirmationIntent","getConfirmationReplyIntent","isPositive","hasUndismissedPaymentOptions","travelerFormActive","isProceedToBookCommand","tryHandleTravelerVoiceCommand","latestResultsMessage","parsedIntentFilters","flightMessageIntent","classifyFlightMessageIntent","hasVisibleFlightResults","appendLocal","tryHandleFlightVoiceCommand","debugText","buildFlightSelectionDebugText","tryHandleBestSuggestionBooking","cardActionHandled","tryHandleFlightCardActionCommand","tryHandleViewAllCommand","isTravelerBackCommand","isSaveDetailsCommand","isPromoCodeCommand","handleVoiceSend","voiceIntent","handleStartNewChat","currentSessionId","clearStoredMessages","clearSessionActivity","clearSessionIdFromUrl","handleOptionClick","pending","chatMessages","getChatThreadMessages","voicePageMessages","getVoicePageMessages","latestVoiceAssistantText","getLatestVoiceSpeakableMessage","isTravelerFormVisible","currentOptions","optionsHiddenBecauseResultsMovedPastPrompt","forceFooterForBookingConfirmation","forceFooterForProceedConfirmation","forceFooterForPaymentConfirmation","activeOptions","dateSelectionContext","deriveDateSelectionContext","isReturnDatePrompt","LuPanelLeft","FiPlus","isStructuredTravelerDetailsPaste","hasUpdateVerb","hasCasualRequest","hasSlotKeyword","hasExplicitDestinationToCity","hasExplicitOriginToCity","hasArriveInCity","hasFlyOrGoingToCity","hasCityRoutePhrase","hasPaxKeyword","hasCabinOrClass","hasTripType","hasDateRescheduleWord","hasCalendarHint","hasCorrection","latestResultMessage","params","search","rawContext","getStoredUserObject","toDefinedValue","grpid","dsgid","bt","toBooleanOrUndefined","pt","trmd","secureValue","secureLocalStorage","secureParsed","normalizeStoredContextValue","sid","url","firstNonEmptyParam","getMessagesStorageKey","getActivityStorageKey","latest","tryHandleRoundTripDualSelectionCommand","attemptHandleCommand","command","positionalTarget","getCommandButtonByPosition","clickableButtons","getVoiceCommandButtons","targetButton","parseFlightVoiceCommand","bookEquivalentText","fallbackCommand","flightLegSortRank","legRaw","v","inferImplicitLegForBookingMessage","returnish","onwardish","wantsLast","desiredPosition","latestScope","getLatestVisibleResultsScope","rawLower","allEntries","isElementVisible","visibleLegTypes","legValue","normalizeLegValue","disambigLeg","cardSelector","airlineHint","extractAirlineHintFromFlightCommand","filteredCards","isAirlineMatch","normalizeSearchText","sortedCards","lr","pickButtonFromCard","selectors","selector","button","flightNorm","extractNormalizedFlightNumberFromBookText","hits","normalizeFlightNumber","hit","onwardHit","targetCardEntry","tokens","stopWords","isLikelyNewFlightSearchQuery","isLikelyFreshFlightSearch","hasExplicitSelectionSpecifier","hasSearchLanguageHints","hasSortLanguageHints","hasFilterLanguageHints","parsedFilters","hasVisibleResults","searchSignals","hasFilterOrSortIntent","hasSortIntent","hasExplicitSelection","hasSelectionIntent","isExplicitFlightSelectionCommand","node","availableCards","pos","resolvedButton","resolvedCard","resolvedPosition","resolvedLeg","resolvedHint","parseRoundTripDualSelectionCommand","onwardPosition","returnPosition","onwardButton","getSelectButtonByLegAndPosition","onwardPayloadIndex","resolveButtonPayloadIndex","preferredReturnButton","refreshedReturnButtons","sameRowReturnButtons","candidateButtons","targetReturnIndex","returnButton","position","normalizedLeg","normalizedPosition","element","handled","activeForms","normalizedAction","isBookIntent","mentionsFlight","numericOnly","extractLegType","guessed","extractLegScopedIndex","extractOrdinalIndex","onwardIndex","extractLegIndexFromSegments","returnIndex","legPattern","allLegMatches","targetLegRegex","legToken","fromSegment","ordinalsPattern","legThenOrdinal","ordinalThenLeg","buttonElement","cardElement","stripFlightNumberPhrasesForOrdinal","namedMatch","numericMatch","intent","visibleEnabled","normalizeLeg","targetLeg","byLeg","elements","bookButtons","selectButtons","allResultBubbles","scope","style","rect","attempts","clickFirstBookButton","positivePattern","negativePattern","rawResults","isViewAllCommand","actionConfig","getFlightCardActionConfig","hints","parseMoreFaresCommandHints","hasExplicitConstraint","hasMoreFaresExplicitConstraint","latestResultsScope","matchedCards","hasMatchedConstraint","filterCardsByMoreFaresHints","targetCards","targetCard","actionButton","isMoreFaresCommand","mentionsAction","mentionsMoreFaresPhrase","mentionsFareOptions","isFareDetailsCommand","mentionsFareWord","mentionsDetailsWord","force","preferredAction","actionHints","extractViewAllLeg","viewAllButtons","scheduleExpandedCardActionClick","maxAttempts","tick","tryClickActionInExpandedResults","expandedCards","flightNumberMatch","airlineMatchAfterKeyword","airlineMatchBeforeKeyword","normalizedRaw","normalizedFlightNumber","airlineFromFreeTextCandidate","actionStopWords","airlineFromFreeText","shouldUseFreeTextAirline","priceByKeywordMatch","priceByCurrencyMatch","timeMatches","parseAmount","normalizeTimeToken","expected","hintDate","normalizeDateToken","depTime","arrTime","hintTime","rawText","re","bestScore","bestIndex","letters","digits","combined","digitLen","score","dmy","ymd","cardAirline","cardValue","hintValue","hintTokens","cardTokens","hintToken","cardToken","routePattern","destinationPattern","airportCodePattern","datePattern","explicitDatePattern","hasRoute","hasDate","voiceMessages","latestPaymentConfirmation","actionableTypes","lastActionable","latestAssistant","latestSearchMessage","explicitQuery","ad","paxText","returnText","formatStopsLabel","stopsCount","inbound","onwardText","baseSummary","summaryLooksSplit","payloadLooksRoundTrip","onwardFromSummary","returnFromSummary","onwardFromDom","getSelectedFlightSummaryFromDom","returnFromDom","onwardMerged","mergeFlightSummary","returnMerged","isFlightSummaryFilled","primary","firstNonEmpty","primaryStops","fallbackStops","mergedStops","hasAirline","hasFlightNumber","hasDeparture","hasArrival","deriveStopsFromFlightCardElement","stopNode","optionMessage","latestSearchStartIndex","findLatestSearchStartIndex","scopedMessages","missingFields","explicitOnwardMatch","parsedOnward","parseDateFromChatText","explicitReturnMatch","parsedReturn","parsedFromFollowup","now","tomorrow","daysUntilSaturday","weekend","AIChatAgent","buildPrebookPayloadFromAvailability","availabilityResponse"],"mappings":"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"}
|