@adminide-stack/yantra-mobile 12.0.69-alpha.9 → 12.0.70-alpha.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/lib/components/GatewayConnector/GatewayConnector.js +2 -2
- package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -1
- package/lib/components/KeyboardComposerDock.js +8 -1
- package/lib/components/KeyboardComposerDock.js.map +1 -1
- package/lib/components/NavigationHeader/NavigationHeader.js +2 -2
- package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
- package/lib/config/env-config.js +4 -0
- package/lib/config/env-config.js.map +1 -1
- package/lib/contexts/ChatLiveStreamContext.js +4 -1
- package/lib/contexts/ChatLiveStreamContext.js.map +1 -1
- package/lib/features/agent-chat/NativeAgentChat.js +2 -0
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +2 -2
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/audio-input/MicErrorBoundary.js +2 -2
- package/lib/features/audio-input/MicErrorBoundary.js.map +1 -1
- package/lib/features/canvas/AudioEditorExperience.js +308 -0
- package/lib/features/canvas/AudioEditorExperience.js.map +1 -0
- package/lib/features/canvas/CanvasAgentChatPane.js +310 -0
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -0
- package/lib/features/canvas/CanvasBoardsGrid.js +414 -0
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -0
- package/lib/features/canvas/CanvasChatResultCard.js +113 -0
- package/lib/features/canvas/CanvasChatResultCard.js.map +1 -0
- package/lib/features/canvas/CanvasEditToolsPanel.js +179 -0
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -0
- package/lib/features/canvas/CanvasExperience.js +859 -0
- package/lib/features/canvas/CanvasExperience.js.map +1 -0
- package/lib/features/canvas/CanvasGeneratePanel.js +514 -0
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -0
- package/lib/features/canvas/CanvasLibrarySheet.js +355 -0
- package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -0
- package/lib/features/canvas/CanvasLooksPanel.js +184 -0
- package/lib/features/canvas/CanvasLooksPanel.js.map +1 -0
- package/lib/features/canvas/CanvasTasksPanel.js +138 -0
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -0
- package/lib/features/canvas/CanvasTemplatesPanel.js +226 -0
- package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -0
- package/lib/features/canvas/CanvasToolDock.js +423 -0
- package/lib/features/canvas/CanvasToolDock.js.map +1 -0
- package/lib/features/canvas/FrameExtractorExperience.js +242 -0
- package/lib/features/canvas/FrameExtractorExperience.js.map +1 -0
- package/lib/features/canvas/ImageEditorExperience.js +491 -0
- package/lib/features/canvas/ImageEditorExperience.js.map +1 -0
- package/lib/features/canvas/InfluencerStudioExperience.js +288 -0
- package/lib/features/canvas/InfluencerStudioExperience.js.map +1 -0
- package/lib/features/canvas/MoodboardExperience.js +205 -0
- package/lib/features/canvas/MoodboardExperience.js.map +1 -0
- package/lib/features/canvas/NativeCanvasViewer.js +929 -0
- package/lib/features/canvas/NativeCanvasViewer.js.map +1 -0
- package/lib/features/canvas/PromoContextFields.js +150 -0
- package/lib/features/canvas/PromoContextFields.js.map +1 -0
- package/lib/features/canvas/SetStudioExperience.js +323 -0
- package/lib/features/canvas/SetStudioExperience.js.map +1 -0
- package/lib/features/canvas/VideoClipsExperience.js +175 -0
- package/lib/features/canvas/VideoClipsExperience.js.map +1 -0
- package/lib/features/canvas/VideoEditExperience.js +824 -0
- package/lib/features/canvas/VideoEditExperience.js.map +1 -0
- package/lib/features/canvas/VideoEditorExperience.js +3050 -0
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -0
- package/lib/features/canvas/VideoGeneratorExperience.js +415 -0
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -0
- package/lib/features/canvas/aiEdit.js +53 -0
- package/lib/features/canvas/aiEdit.js.map +1 -0
- package/lib/features/canvas/canvasAgentChat.js +76 -0
- package/lib/features/canvas/canvasAgentChat.js.map +1 -0
- package/lib/features/canvas/canvasBoardsCatalog.js +59 -0
- package/lib/features/canvas/canvasBoardsCatalog.js.map +1 -0
- package/lib/features/canvas/canvasBoardsSnapshot.js +14 -1
- package/lib/features/canvas/canvasBoardsSnapshot.js.map +1 -1
- package/lib/features/canvas/canvasChatDisplay.js +38 -0
- package/lib/features/canvas/canvasChatDisplay.js.map +1 -0
- package/lib/features/canvas/canvasChatTemplates.js +219 -0
- package/lib/features/canvas/canvasChatTemplates.js.map +1 -0
- package/lib/features/canvas/canvasCore.js +138 -1
- package/lib/features/canvas/canvasCore.js.map +1 -1
- package/lib/features/canvas/canvasEditOps.js +224 -0
- package/lib/features/canvas/canvasEditOps.js.map +1 -0
- package/lib/features/canvas/canvasTasks.js +187 -0
- package/lib/features/canvas/canvasTasks.js.map +1 -0
- package/lib/features/canvas/designPromptTemplates.js +3084 -0
- package/lib/features/canvas/designPromptTemplates.js.map +1 -0
- package/lib/features/canvas/editTools.js +54 -0
- package/lib/features/canvas/editTools.js.map +1 -0
- package/lib/features/canvas/extendVideo.js +5 -0
- package/lib/features/canvas/extendVideo.js.map +1 -0
- package/lib/features/canvas/frameExtract.js +33 -0
- package/lib/features/canvas/frameExtract.js.map +1 -0
- package/lib/features/canvas/generationModels.js +201 -0
- package/lib/features/canvas/generationModels.js.map +1 -0
- package/lib/features/canvas/influencer/influencerPipeline.js +170 -0
- package/lib/features/canvas/influencer/influencerPipeline.js.map +1 -0
- package/lib/features/canvas/influencer/productReel.js +72 -0
- package/lib/features/canvas/influencer/productReel.js.map +1 -0
- package/lib/features/canvas/influencer/reelPlan.js +159 -0
- package/lib/features/canvas/influencer/reelPlan.js.map +1 -0
- package/lib/features/canvas/moodboardCore.js +13 -0
- package/lib/features/canvas/moodboardCore.js.map +1 -0
- package/lib/features/canvas/promoProjectImport.js +99 -0
- package/lib/features/canvas/promoProjectImport.js.map +1 -0
- package/lib/features/canvas/promoVideo.js +312 -0
- package/lib/features/canvas/promoVideo.js.map +1 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js +109 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -0
- package/lib/features/canvas/sessionIdentity.js +28 -1
- package/lib/features/canvas/sessionIdentity.js.map +1 -1
- package/lib/features/canvas/set/SetViewportWebView.js +133 -0
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -0
- package/lib/features/canvas/set/cameraPath.js +194 -0
- package/lib/features/canvas/set/cameraPath.js.map +1 -0
- package/lib/features/canvas/set/setProject.js +24 -0
- package/lib/features/canvas/set/setProject.js.map +1 -0
- package/lib/features/canvas/storageLibrary.js +184 -0
- package/lib/features/canvas/storageLibrary.js.map +1 -0
- package/lib/features/canvas/studioCatalog.js +129 -0
- package/lib/features/canvas/studioCatalog.js.map +1 -0
- package/lib/features/canvas/studioLooks.js +189 -0
- package/lib/features/canvas/studioLooks.js.map +1 -0
- package/lib/features/canvas/surfaceIndex.js +63 -1
- package/lib/features/canvas/surfaceIndex.js.map +1 -1
- package/lib/features/canvas/templateImport/invideoNative.js +221 -0
- package/lib/features/canvas/templateImport/invideoNative.js.map +1 -0
- package/lib/features/canvas/templateImport/loadTemplate.js +43 -0
- package/lib/features/canvas/templateImport/loadTemplate.js.map +1 -0
- package/lib/features/canvas/templateImport/renderConfig.js +93 -0
- package/lib/features/canvas/templateImport/renderConfig.js.map +1 -0
- package/lib/features/canvas/useStudioCatalogTemplates.js +134 -0
- package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -0
- package/lib/features/canvas/video3d.js +109 -0
- package/lib/features/canvas/video3d.js.map +1 -0
- package/lib/features/canvas/videoClips.js +42 -0
- package/lib/features/canvas/videoClips.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +120 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/agentLoop.js +69 -0
- package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/brainClient.js +45 -0
- package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/cutTools.js +129 -0
- package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -0
- package/lib/features/canvas/videoEditor/editorModel.js +346 -0
- package/lib/features/canvas/videoEditor/editorModel.js.map +1 -0
- package/lib/features/canvas/videoEditor/exportRenderer.js +214 -0
- package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -0
- package/lib/features/canvas/videoEditor/filters.js +41 -0
- package/lib/features/canvas/videoEditor/filters.js.map +1 -0
- package/lib/features/canvas/videoEditor/mediaActions.js +57 -0
- package/lib/features/canvas/videoEditor/mediaActions.js.map +1 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js +129 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -0
- package/lib/features/canvas/videoEditor/solidColorPng.js +115 -0
- package/lib/features/canvas/videoEditor/solidColorPng.js.map +1 -0
- package/lib/features/canvas/videoEditor/videoEditOps.js +191 -0
- package/lib/features/canvas/videoEditor/videoEditOps.js.map +1 -0
- package/lib/features/canvas/videoEditor/videoProjectsStore.js +82 -0
- package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -0
- package/lib/features/canvas/videoRenderer.js +8 -0
- package/lib/features/canvas/videoRenderer.js.map +1 -0
- package/lib/features/canvas/withRemoteSafeArea.js +2 -2
- package/lib/features/canvas/withRemoteSafeArea.js.map +1 -1
- package/lib/features/characters/characterStudioProps.js +14 -0
- package/lib/features/characters/characterStudioProps.js.map +1 -0
- package/lib/features/chat/ChatCodeBlock.js +7 -3
- package/lib/features/chat/ChatCodeBlock.js.map +1 -1
- package/lib/features/chat/ChatTranscript.js +7 -3
- package/lib/features/chat/ChatTranscript.js.map +1 -1
- package/lib/features/chat/ChatWidgetCard.js +13 -0
- package/lib/features/chat/ChatWidgetCard.js.map +1 -0
- package/lib/features/chat/ConnectorConnectCard.js +166 -0
- package/lib/features/chat/ConnectorConnectCard.js.map +1 -0
- package/lib/features/chat/ConnectorConnectPrompt.js +272 -0
- package/lib/features/chat/ConnectorConnectPrompt.js.map +1 -0
- package/lib/features/chat/MessageActionBar.js.map +1 -1
- package/lib/features/chat/QueuedFollowUps.js +71 -0
- package/lib/features/chat/QueuedFollowUps.js.map +1 -0
- package/lib/features/chat/chatWidgets.js +37 -0
- package/lib/features/chat/chatWidgets.js.map +1 -0
- package/lib/features/chat/connectorConnect.js +207 -0
- package/lib/features/chat/connectorConnect.js.map +1 -0
- package/lib/features/chat/connectorConnectHandbacks.js +55 -0
- package/lib/features/chat/connectorConnectHandbacks.js.map +1 -0
- package/lib/features/design/DesignEditorExperience.js +643 -0
- package/lib/features/design/DesignEditorExperience.js.map +1 -0
- package/lib/features/design/DesignExperience.js +444 -0
- package/lib/features/design/DesignExperience.js.map +1 -0
- package/lib/features/design/designCore.js +298 -0
- package/lib/features/design/designCore.js.map +1 -0
- package/lib/features/design/designIndex.js +150 -0
- package/lib/features/design/designIndex.js.map +1 -0
- package/lib/features/design/exportDesign.js +133 -0
- package/lib/features/design/exportDesign.js.map +1 -0
- package/lib/features/job-search/ApplicationsPanel.js +907 -0
- package/lib/features/job-search/ApplicationsPanel.js.map +1 -0
- package/lib/features/job-search/ContactsPanel.js +627 -0
- package/lib/features/job-search/ContactsPanel.js.map +1 -0
- package/lib/features/job-search/InsightsPanel.js +299 -0
- package/lib/features/job-search/InsightsPanel.js.map +1 -0
- package/lib/features/job-search/InterviewPanel.js +637 -0
- package/lib/features/job-search/InterviewPanel.js.map +1 -0
- package/lib/features/job-search/JdPastePrompt.js +130 -0
- package/lib/features/job-search/JdPastePrompt.js.map +1 -0
- package/lib/features/job-search/JobCard.js +199 -0
- package/lib/features/job-search/JobCard.js.map +1 -0
- package/lib/features/job-search/JobDetailSheet.js +255 -0
- package/lib/features/job-search/JobDetailSheet.js.map +1 -0
- package/lib/features/job-search/JobSearchAgentChatPane.js +377 -0
- package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -0
- package/lib/features/job-search/JobSearchExperience.js +1324 -0
- package/lib/features/job-search/JobSearchExperience.js.map +1 -0
- package/lib/features/job-search/JobSearchLocationField.js +231 -0
- package/lib/features/job-search/JobSearchLocationField.js.map +1 -0
- package/lib/features/job-search/ProfilePanel.js +679 -0
- package/lib/features/job-search/ProfilePanel.js.map +1 -0
- package/lib/features/job-search/RepliesPanel.js +344 -0
- package/lib/features/job-search/RepliesPanel.js.map +1 -0
- package/lib/features/job-search/SavedPanel.js +297 -0
- package/lib/features/job-search/SavedPanel.js.map +1 -0
- package/lib/features/job-search/chat/widgetContent.js +29 -0
- package/lib/features/job-search/chat/widgetContent.js.map +1 -0
- package/lib/features/job-search/cvText.js +91 -0
- package/lib/features/job-search/cvText.js.map +1 -0
- package/lib/features/job-search/jobAgentSwipe.js +7 -0
- package/lib/features/job-search/jobAgentSwipe.js.map +1 -0
- package/lib/features/job-search/jobSearchClient.js +184 -0
- package/lib/features/job-search/jobSearchClient.js.map +1 -0
- package/lib/features/job-search/jobSearchExec.js +14 -0
- package/lib/features/job-search/jobSearchExec.js.map +1 -0
- package/lib/features/job-search/jobSearchRuntime.js +50 -0
- package/lib/features/job-search/jobSearchRuntime.js.map +1 -0
- package/lib/features/job-search/jobSearchTheme.js +44 -0
- package/lib/features/job-search/jobSearchTheme.js.map +1 -0
- package/lib/features/job-search/savedJobs.js +85 -0
- package/lib/features/job-search/savedJobs.js.map +1 -0
- package/lib/features/job-search/searchHistory.js +117 -0
- package/lib/features/job-search/searchHistory.js.map +1 -0
- package/lib/features/job-search/types.js +36 -0
- package/lib/features/job-search/types.js.map +1 -0
- package/lib/features/job-search/useJobSearchSession.js +558 -0
- package/lib/features/job-search/useJobSearchSession.js.map +1 -0
- package/lib/features/messaging/ChatComponents.js +529 -0
- package/lib/features/messaging/ChatComponents.js.map +1 -0
- package/lib/features/messaging/ChatInviteDeepLink.js +116 -0
- package/lib/features/messaging/ChatInviteDeepLink.js.map +1 -0
- package/lib/features/messaging/ContactsScreen.js +288 -0
- package/lib/features/messaging/ContactsScreen.js.map +1 -0
- package/lib/features/messaging/ConversationListScreen.js +147 -0
- package/lib/features/messaging/ConversationListScreen.js.map +1 -0
- package/lib/features/messaging/MessageActions.js +290 -0
- package/lib/features/messaging/MessageActions.js.map +1 -0
- package/lib/features/messaging/NativeChatExperience.js +189 -0
- package/lib/features/messaging/NativeChatExperience.js.map +1 -0
- package/lib/features/messaging/RegistrationScreen.js +11 -14
- package/lib/features/messaging/RegistrationScreen.js.map +1 -1
- package/lib/features/messaging/ThreadScreen.js +215 -0
- package/lib/features/messaging/ThreadScreen.js.map +1 -0
- package/lib/features/messaging/chatInviteLink.js +52 -0
- package/lib/features/messaging/chatInviteLink.js.map +1 -0
- package/lib/features/messaging/chatModel.js +278 -0
- package/lib/features/messaging/chatModel.js.map +1 -0
- package/lib/features/messaging/chatOperations.js +106 -1
- package/lib/features/messaging/chatOperations.js.map +1 -1
- package/lib/features/messaging/emojiCatalog.js +60 -0
- package/lib/features/messaging/emojiCatalog.js.map +1 -0
- package/lib/features/messaging/emojiKeywords.js +1592 -0
- package/lib/features/messaging/emojiKeywords.js.map +1 -0
- package/lib/features/messaging/nativeChatChannelQuery.js +27 -0
- package/lib/features/messaging/nativeChatChannelQuery.js.map +1 -0
- package/lib/features/messaging/phoneNumbers.js +52 -1
- package/lib/features/messaging/phoneNumbers.js.map +1 -1
- package/lib/features/messaging/sha256.js +68 -0
- package/lib/features/messaging/sha256.js.map +1 -0
- package/lib/features/messaging/useChatData.js +421 -0
- package/lib/features/messaging/useChatData.js.map +1 -0
- package/lib/features/messaging/useContactMatches.js +191 -0
- package/lib/features/messaging/useContactMatches.js.map +1 -0
- package/lib/features/messaging/usePhoneVerification.js +12 -12
- package/lib/features/messaging/usePhoneVerification.js.map +1 -1
- package/lib/features/messaging/yantraChatOrg.js +8 -3
- package/lib/features/messaging/yantraChatOrg.js.map +1 -1
- package/lib/features/resume/AnnotateModal.js +100 -0
- package/lib/features/resume/AnnotateModal.js.map +1 -0
- package/lib/features/resume/AnnotationBar.js +69 -0
- package/lib/features/resume/AnnotationBar.js.map +1 -0
- package/lib/features/resume/ExportSheet.js +105 -0
- package/lib/features/resume/ExportSheet.js.map +1 -0
- package/lib/features/resume/ResumeAgentChatPane.js +95 -0
- package/lib/features/resume/ResumeAgentChatPane.js.map +1 -0
- package/lib/features/resume/ResumeEditor.js +676 -0
- package/lib/features/resume/ResumeEditor.js.map +1 -0
- package/lib/features/resume/ResumeExperience.js +235 -0
- package/lib/features/resume/ResumeExperience.js.map +1 -0
- package/lib/features/resume/ResumeListPanel.js +262 -0
- package/lib/features/resume/ResumeListPanel.js.map +1 -0
- package/lib/features/resume/ResumeToolbar.js +236 -0
- package/lib/features/resume/ResumeToolbar.js.map +1 -0
- package/lib/features/resume/annotations.js +17 -0
- package/lib/features/resume/annotations.js.map +1 -0
- package/lib/features/resume/documentCss.js +52 -0
- package/lib/features/resume/documentCss.js.map +1 -0
- package/lib/features/resume/draft.js +89 -0
- package/lib/features/resume/draft.js.map +1 -0
- package/lib/features/resume/exportResume.js +43 -0
- package/lib/features/resume/exportResume.js.map +1 -0
- package/lib/features/resume/pickResumePhoto.js +22 -0
- package/lib/features/resume/pickResumePhoto.js.map +1 -0
- package/lib/features/resume/renderResume.js +121 -0
- package/lib/features/resume/renderResume.js.map +1 -0
- package/lib/features/resume/resumeClient.js +69 -0
- package/lib/features/resume/resumeClient.js.map +1 -0
- package/lib/features/resume/resumeExec.js +14 -0
- package/lib/features/resume/resumeExec.js.map +1 -0
- package/lib/features/resume/resumeIndex.js +244 -0
- package/lib/features/resume/resumeIndex.js.map +1 -0
- package/lib/features/resume/resumeRuntime.js +50 -0
- package/lib/features/resume/resumeRuntime.js.map +1 -0
- package/lib/features/resume/resumeTheme.js +34 -0
- package/lib/features/resume/resumeTheme.js.map +1 -0
- package/lib/features/resume/resumeToolbox.js +49 -0
- package/lib/features/resume/resumeToolbox.js.map +1 -0
- package/lib/features/resume/templates.js +90 -0
- package/lib/features/resume/templates.js.map +1 -0
- package/lib/features/resume/types.js +10 -0
- package/lib/features/resume/types.js.map +1 -0
- package/lib/features/resume/useResumeSession.js +183 -0
- package/lib/features/resume/useResumeSession.js.map +1 -0
- package/lib/features/shopping/DealsPanel.js +254 -0
- package/lib/features/shopping/DealsPanel.js.map +1 -0
- package/lib/features/shopping/HistoryPanel.js +147 -0
- package/lib/features/shopping/HistoryPanel.js.map +1 -0
- package/lib/features/shopping/OrdersPanel.js +157 -0
- package/lib/features/shopping/OrdersPanel.js.map +1 -0
- package/lib/features/shopping/ProductCard.js +326 -0
- package/lib/features/shopping/ProductCard.js.map +1 -0
- package/lib/features/shopping/ProductDetailSheet.js +313 -0
- package/lib/features/shopping/ProductDetailSheet.js.map +1 -0
- package/lib/features/shopping/ProductFilterBar.js +153 -0
- package/lib/features/shopping/ProductFilterBar.js.map +1 -0
- package/lib/features/shopping/ProductPhoto.js +27 -0
- package/lib/features/shopping/ProductPhoto.js.map +1 -0
- package/lib/features/shopping/SavedPanel.js +139 -0
- package/lib/features/shopping/SavedPanel.js.map +1 -0
- package/lib/features/shopping/ShoppingAgentChatPane.js +436 -0
- package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -0
- package/lib/features/shopping/ShoppingExperience.js +888 -0
- package/lib/features/shopping/ShoppingExperience.js.map +1 -0
- package/lib/features/shopping/TrendingSections.js +199 -0
- package/lib/features/shopping/TrendingSections.js.map +1 -0
- package/lib/features/shopping/WatchlistPanel.js +148 -0
- package/lib/features/shopping/WatchlistPanel.js.map +1 -0
- package/lib/features/shopping/catalog.js +238 -0
- package/lib/features/shopping/catalog.js.map +1 -0
- package/lib/features/shopping/chat/ShoppingChatResultCard.js +175 -0
- package/lib/features/shopping/chat/ShoppingChatResultCard.js.map +1 -0
- package/lib/features/shopping/chat/streamAssistantReply.js +34 -0
- package/lib/features/shopping/chat/streamAssistantReply.js.map +1 -0
- package/lib/features/shopping/chat/widgetContent.js +233 -0
- package/lib/features/shopping/chat/widgetContent.js.map +1 -0
- package/lib/features/shopping/hooks/useTrendingProducts.js +162 -0
- package/lib/features/shopping/hooks/useTrendingProducts.js.map +1 -0
- package/lib/features/shopping/productImage.js +42 -0
- package/lib/features/shopping/productImage.js.map +1 -0
- package/lib/features/shopping/savedProducts.js +84 -0
- package/lib/features/shopping/savedProducts.js.map +1 -0
- package/lib/features/shopping/services/catalogActions.js +166 -0
- package/lib/features/shopping/services/catalogActions.js.map +1 -0
- package/lib/features/shopping/services/parsePriceCheckIntent.js +58 -0
- package/lib/features/shopping/services/parsePriceCheckIntent.js.map +1 -0
- package/lib/features/shopping/services/parseShoppingIntent.js +67 -0
- package/lib/features/shopping/services/parseShoppingIntent.js.map +1 -0
- package/lib/features/shopping/services/productAvailability.js +25 -0
- package/lib/features/shopping/services/productAvailability.js.map +1 -0
- package/lib/features/shopping/services/productFilters.js +72 -0
- package/lib/features/shopping/services/productFilters.js.map +1 -0
- package/lib/features/shopping/services/retailerUrl.js +75 -0
- package/lib/features/shopping/services/retailerUrl.js.map +1 -0
- package/lib/features/shopping/services/shoppingChatReply.js +46 -0
- package/lib/features/shopping/services/shoppingChatReply.js.map +1 -0
- package/lib/features/shopping/services/shoppingProductSearch.js +336 -0
- package/lib/features/shopping/services/shoppingProductSearch.js.map +1 -0
- package/lib/features/shopping/services/shoppingSearchConnectorClient.js +41 -0
- package/lib/features/shopping/services/shoppingSearchConnectorClient.js.map +1 -0
- package/lib/features/shopping/shopAgentSwipe.js +7 -0
- package/lib/features/shopping/shopAgentSwipe.js.map +1 -0
- package/lib/features/shopping/shoppingCart.js +116 -0
- package/lib/features/shopping/shoppingCart.js.map +1 -0
- package/lib/features/shopping/shoppingExec.js +14 -0
- package/lib/features/shopping/shoppingExec.js.map +1 -0
- package/lib/features/shopping/shoppingHistoryStore.js +176 -0
- package/lib/features/shopping/shoppingHistoryStore.js.map +1 -0
- package/lib/features/shopping/shoppingRuntime.js +63 -0
- package/lib/features/shopping/shoppingRuntime.js.map +1 -0
- package/lib/features/shopping/timeAgo.js +14 -0
- package/lib/features/shopping/timeAgo.js.map +1 -0
- package/lib/features/shopping/useShoppingSearch.js +262 -0
- package/lib/features/shopping/useShoppingSearch.js.map +1 -0
- package/lib/features/travel/BookHeaderGlow.js +48 -0
- package/lib/features/travel/BookHeaderGlow.js.map +1 -0
- package/lib/features/travel/BookingsPanel.js +29 -0
- package/lib/features/travel/BookingsPanel.js.map +1 -0
- package/lib/features/travel/DiscoverPanel.js +155 -0
- package/lib/features/travel/DiscoverPanel.js.map +1 -0
- package/lib/features/travel/FlightCompareBar.js +86 -0
- package/lib/features/travel/FlightCompareBar.js.map +1 -0
- package/lib/features/travel/FlightDealsBoard.js +100 -0
- package/lib/features/travel/FlightDealsBoard.js.map +1 -0
- package/lib/features/travel/HistoryPanel.js +82 -0
- package/lib/features/travel/HistoryPanel.js.map +1 -0
- package/lib/features/travel/PopularDestinations.js +144 -0
- package/lib/features/travel/PopularDestinations.js.map +1 -0
- package/lib/features/travel/SavedPanel.js +27 -0
- package/lib/features/travel/SavedPanel.js.map +1 -0
- package/lib/features/travel/TravelAgentChatPane.js +303 -0
- package/lib/features/travel/TravelAgentChatPane.js.map +1 -0
- package/lib/features/travel/TravelBookHero.js +425 -0
- package/lib/features/travel/TravelBookHero.js.map +1 -0
- package/lib/features/travel/TravelDatesField.js +234 -0
- package/lib/features/travel/TravelDatesField.js.map +1 -0
- package/lib/features/travel/TravelDetailSheet.js +106 -0
- package/lib/features/travel/TravelDetailSheet.js.map +1 -0
- package/lib/features/travel/TravelExperience.js +624 -0
- package/lib/features/travel/TravelExperience.js.map +1 -0
- package/lib/features/travel/TravelGuestsField.js +85 -0
- package/lib/features/travel/TravelGuestsField.js.map +1 -0
- package/lib/features/travel/TravelLanding.js +318 -0
- package/lib/features/travel/TravelLanding.js.map +1 -0
- package/lib/features/travel/TravelLocationField.js +179 -0
- package/lib/features/travel/TravelLocationField.js.map +1 -0
- package/lib/features/travel/TravelPropertyCard.js +266 -0
- package/lib/features/travel/TravelPropertyCard.js.map +1 -0
- package/lib/features/travel/TravelPropertyPhoto.js +22 -0
- package/lib/features/travel/TravelPropertyPhoto.js.map +1 -0
- package/lib/features/travel/TravelRailFlyout.js +79 -0
- package/lib/features/travel/TravelRailFlyout.js.map +1 -0
- package/lib/features/travel/TravelResultsMap.js +126 -0
- package/lib/features/travel/TravelResultsMap.js.map +1 -0
- package/lib/features/travel/WorkspacePanel.js +148 -0
- package/lib/features/travel/WorkspacePanel.js.map +1 -0
- package/lib/features/travel/appNav.js +244 -0
- package/lib/features/travel/appNav.js.map +1 -0
- package/lib/features/travel/calendarDays.js +50 -0
- package/lib/features/travel/calendarDays.js.map +1 -0
- package/lib/features/travel/catalog.js +72 -0
- package/lib/features/travel/catalog.js.map +1 -0
- package/lib/features/travel/chat/TravelChatResultCard.js +107 -0
- package/lib/features/travel/chat/TravelChatResultCard.js.map +1 -0
- package/lib/features/travel/chat/widgetContent.js +107 -0
- package/lib/features/travel/chat/widgetContent.js.map +1 -0
- package/lib/features/travel/flightDeals.js +65 -0
- package/lib/features/travel/flightDeals.js.map +1 -0
- package/lib/features/travel/mapCoordinates.js +36 -0
- package/lib/features/travel/mapCoordinates.js.map +1 -0
- package/lib/features/travel/parseTravelIntent.js +303 -0
- package/lib/features/travel/parseTravelIntent.js.map +1 -0
- package/lib/features/travel/savedStays.js +66 -0
- package/lib/features/travel/savedStays.js.map +1 -0
- package/lib/features/travel/services/flightDealsBoard.js +111 -0
- package/lib/features/travel/services/flightDealsBoard.js.map +1 -0
- package/lib/features/travel/services/flightSearchConnectorClient.js +42 -0
- package/lib/features/travel/services/flightSearchConnectorClient.js.map +1 -0
- package/lib/features/travel/services/geocodeLocation.js +79 -0
- package/lib/features/travel/services/geocodeLocation.js.map +1 -0
- package/lib/features/travel/services/placePredictions.js +113 -0
- package/lib/features/travel/services/placePredictions.js.map +1 -0
- package/lib/features/travel/services/resolveOriginCity.js +27 -0
- package/lib/features/travel/services/resolveOriginCity.js.map +1 -0
- package/lib/features/travel/services/resortifiConnectorClient.js +76 -0
- package/lib/features/travel/services/resortifiConnectorClient.js.map +1 -0
- package/lib/features/travel/services/travelFlightSearch.js +289 -0
- package/lib/features/travel/services/travelFlightSearch.js.map +1 -0
- package/lib/features/travel/services/travelPropertySearch.js +377 -0
- package/lib/features/travel/services/travelPropertySearch.js.map +1 -0
- package/lib/features/travel/travelAgentSwipe.js +7 -0
- package/lib/features/travel/travelAgentSwipe.js.map +1 -0
- package/lib/features/travel/travelExec.js +14 -0
- package/lib/features/travel/travelExec.js.map +1 -0
- package/lib/features/travel/travelHistoryStore.js +108 -0
- package/lib/features/travel/travelHistoryStore.js.map +1 -0
- package/lib/features/travel/travelRuntime.js +62 -0
- package/lib/features/travel/travelRuntime.js.map +1 -0
- package/lib/features/travel/types.js +9 -0
- package/lib/features/travel/types.js.map +1 -0
- package/lib/features/travel/useTravelSearch.js +330 -0
- package/lib/features/travel/useTravelSearch.js.map +1 -0
- package/lib/features/travel/workspaceContent.js +548 -0
- package/lib/features/travel/workspaceContent.js.map +1 -0
- package/lib/hooks/useCdecliChannel.js +128 -6
- package/lib/hooks/useCdecliChannel.js.map +1 -1
- package/lib/hooks/useChatApi.js +4 -2
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useChatStream.js +77 -63
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/hooks/useHostConnectorCard.js +24 -0
- package/lib/hooks/useHostConnectorCard.js.map +1 -0
- package/lib/hooks/useObtainSystemToken.js +23 -5
- package/lib/hooks/useObtainSystemToken.js.map +1 -1
- package/lib/hooks/webViewRetentionPolicy.js +1 -0
- package/lib/hooks/webViewRetentionPolicy.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/screens/Chat/index.js +51 -22
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/ChatNative/index.js +13 -2
- package/lib/screens/ChatNative/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +3 -3
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/ChatHistoryLanding.js +32 -32
- package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js +12 -6
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
- package/lib/screens/ResumeNative/useResumeHostChat.js +12 -6
- package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
- package/lib/screens/ShoppingNative/useShoppingHostChat.js +12 -6
- package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
- package/lib/screens/TravelNative/useTravelHostChat.js +12 -6
- package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
- package/lib/screens/WebBuilder/WebViewWithNavigation.js +2 -2
- package/lib/screens/WebBuilder/WebViewWithNavigation.js.map +1 -1
- package/lib/services/brainQuickReply.js +38 -1
- package/lib/services/brainQuickReply.js.map +1 -1
- package/lib/state/chatThreadMerge.js +6 -1
- package/lib/state/chatThreadMerge.js.map +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const SOURCE_LABELS = {
|
|
2
|
+
resortifi: "Yantra",
|
|
3
|
+
airbnb: "Airbnb",
|
|
4
|
+
booking: "Booking.com",
|
|
5
|
+
"hotels-com": "Hotels.com",
|
|
6
|
+
expedia: "Expedia",
|
|
7
|
+
"flight-search": "Flights",
|
|
8
|
+
turo: "Turo",
|
|
9
|
+
cars: "Cars",
|
|
10
|
+
chat: "Chat"
|
|
11
|
+
};
|
|
12
|
+
const SOURCE_BADGE = {
|
|
13
|
+
resortifi: {
|
|
14
|
+
bg: "#0c1a2e",
|
|
15
|
+
fg: "#93c5fd"
|
|
16
|
+
},
|
|
17
|
+
airbnb: {
|
|
18
|
+
bg: "#ff385c",
|
|
19
|
+
fg: "#fff"
|
|
20
|
+
},
|
|
21
|
+
booking: {
|
|
22
|
+
bg: "#003580",
|
|
23
|
+
fg: "#fff"
|
|
24
|
+
},
|
|
25
|
+
"hotels-com": {
|
|
26
|
+
bg: "#d32f2f",
|
|
27
|
+
fg: "#fff"
|
|
28
|
+
},
|
|
29
|
+
expedia: {
|
|
30
|
+
bg: "#ffc72c",
|
|
31
|
+
fg: "#0f172a"
|
|
32
|
+
},
|
|
33
|
+
"flight-search": {
|
|
34
|
+
bg: "#0c1a2e",
|
|
35
|
+
fg: "#93c5fd"
|
|
36
|
+
},
|
|
37
|
+
turo: {
|
|
38
|
+
bg: "#593bfb",
|
|
39
|
+
fg: "#fff"
|
|
40
|
+
},
|
|
41
|
+
cars: {
|
|
42
|
+
bg: "#0c1a2e",
|
|
43
|
+
fg: "#f5c26b"
|
|
44
|
+
},
|
|
45
|
+
chat: {
|
|
46
|
+
bg: "#2869E0",
|
|
47
|
+
fg: "#fff"
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const SOURCE_ORDER = ["airbnb", "booking", "hotels-com", "expedia", "resortifi", "flight-search", "turo", "cars", "chat"];
|
|
51
|
+
function propertySource(property) {
|
|
52
|
+
return property.source;
|
|
53
|
+
}
|
|
54
|
+
function formatPriceLabel(property) {
|
|
55
|
+
var _a, _b;
|
|
56
|
+
if ((_a = property.priceLabel) == null ? void 0 : _a.trim()) return property.priceLabel.trim();
|
|
57
|
+
if (typeof property.price === "number" && Number.isFinite(property.price) && property.price > 0) {
|
|
58
|
+
const unit = (_b = property.priceUnit) != null ? _b : property.kind === "flight" ? "trip" : property.kind === "car" ? "day" : "night";
|
|
59
|
+
return `$${Math.round(property.price)} /${unit}`;
|
|
60
|
+
}
|
|
61
|
+
return "See price";
|
|
62
|
+
}
|
|
63
|
+
function kindLabel(kind) {
|
|
64
|
+
switch (kind) {
|
|
65
|
+
case "flight":
|
|
66
|
+
return "Flight";
|
|
67
|
+
case "car":
|
|
68
|
+
return "Car";
|
|
69
|
+
default:
|
|
70
|
+
return "Stay";
|
|
71
|
+
}
|
|
72
|
+
}export{SOURCE_BADGE,SOURCE_LABELS,SOURCE_ORDER,formatPriceLabel,kindLabel,propertySource};//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sources":["../../../src/features/travel/catalog.ts"],"sourcesContent":["import type { PropertySource, TravelProperty, TravelResultKind } from './types';\n\nexport const SOURCE_LABELS: Record<PropertySource, string> = {\n resortifi: 'Yantra',\n airbnb: 'Airbnb',\n booking: 'Booking.com',\n 'hotels-com': 'Hotels.com',\n expedia: 'Expedia',\n 'flight-search': 'Flights',\n turo: 'Turo',\n cars: 'Cars',\n chat: 'Chat',\n};\n\nexport const SOURCE_SECTION: Record<PropertySource, { title: string; subtitle: string }> = {\n airbnb: { title: 'Airbnb', subtitle: 'Homes and stays' },\n booking: { title: 'Booking.com', subtitle: 'Hotels worldwide' },\n 'hotels-com': { title: 'Hotels.com', subtitle: 'Hotel inventory' },\n expedia: { title: 'Expedia', subtitle: 'Packages and hotels' },\n resortifi: { title: 'Yantra stays', subtitle: 'Connector inventory' },\n 'flight-search': { title: 'Flights', subtitle: 'Bookable + meta-search fares' },\n turo: { title: 'Turo', subtitle: 'Peer-to-peer cars' },\n cars: { title: 'Car rentals', subtitle: 'Aggregators and priced offers' },\n chat: { title: 'Chat', subtitle: 'From the travel agent' },\n};\n\nexport const SOURCE_BADGE: Record<PropertySource, { bg: string; fg: string }> = {\n resortifi: { bg: '#0c1a2e', fg: '#93c5fd' },\n airbnb: { bg: '#ff385c', fg: '#fff' },\n booking: { bg: '#003580', fg: '#fff' },\n 'hotels-com': { bg: '#d32f2f', fg: '#fff' },\n expedia: { bg: '#ffc72c', fg: '#0f172a' },\n 'flight-search': { bg: '#0c1a2e', fg: '#93c5fd' },\n turo: { bg: '#593bfb', fg: '#fff' },\n cars: { bg: '#0c1a2e', fg: '#f5c26b' },\n chat: { bg: '#2869E0', fg: '#fff' },\n};\n\nexport const SOURCE_ORDER: PropertySource[] = [\n 'airbnb',\n 'booking',\n 'hotels-com',\n 'expedia',\n 'resortifi',\n 'flight-search',\n 'turo',\n 'cars',\n 'chat',\n];\n\nexport function propertySource(property: TravelProperty): PropertySource {\n return property.source;\n}\n\nexport function formatPriceLabel(property: TravelProperty): string {\n if (property.priceLabel?.trim()) return property.priceLabel.trim();\n if (typeof property.price === 'number' && Number.isFinite(property.price) && property.price > 0) {\n const unit =\n property.priceUnit ?? (property.kind === 'flight' ? 'trip' : property.kind === 'car' ? 'day' : 'night');\n return `$${Math.round(property.price)} /${unit}`;\n }\n return 'See price';\n}\n\nexport function kindLabel(kind?: TravelResultKind): string {\n switch (kind) {\n case 'flight':\n return 'Flight';\n case 'car':\n return 'Car';\n default:\n return 'Stay';\n }\n}\n"],"names":[],"mappings":"AACO,MAAM,aAAgD,GAAA;AAAA,EAC3D,SAAW,EAAA,QAAA;AAAA,EACX,MAAQ,EAAA,QAAA;AAAA,EACR,OAAS,EAAA,aAAA;AAAA,EACT,YAAc,EAAA,YAAA;AAAA,EACd,OAAS,EAAA,SAAA;AAAA,EACT,eAAiB,EAAA,SAAA;AAAA,EACjB,IAAM,EAAA,MAAA;AAAA,EACN,IAAM,EAAA,MAAA;AAAA,EACN,IAAM,EAAA;AACR;AA0CO,MAAM,YAGR,GAAA;AAAA,EACH,SAAW,EAAA;AAAA,IACT,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,OAAS,EAAA;AAAA,IACP,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,OAAS,EAAA;AAAA,IACP,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,eAAiB,EAAA;AAAA,IACf,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA;AAER;AACa,MAAA,YAAA,GAAiC,CAAC,QAAA,EAAU,SAAW,EAAA,YAAA,EAAc,WAAW,WAAa,EAAA,eAAA,EAAiB,MAAQ,EAAA,MAAA,EAAQ,MAAM;AAC1I,SAAS,eAAe,QAA0C,EAAA;AACvE,EAAA,OAAO,QAAS,CAAA,MAAA;AAClB;AACO,SAAS,iBAAiB,QAAkC,EAAA;AAlGnE,EAAA,IAAA,EAAA,EAAA,EAAA;AAmGE,EAAA,IAAA,CAAI,cAAS,UAAT,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqB,QAAe,OAAA,QAAA,CAAS,WAAW,IAAK,EAAA;AACjE,EAAI,IAAA,OAAO,QAAS,CAAA,KAAA,KAAU,QAAY,IAAA,MAAA,CAAO,QAAS,CAAA,QAAA,CAAS,KAAK,CAAA,IAAK,QAAS,CAAA,KAAA,GAAQ,CAAG,EAAA;AAC/F,IAAM,MAAA,IAAA,GAAA,CAAO,EAAS,GAAA,QAAA,CAAA,SAAA,KAAT,IAAuB,GAAA,EAAA,GAAA,QAAA,CAAS,IAAS,KAAA,QAAA,GAAW,MAAS,GAAA,QAAA,CAAS,IAAS,KAAA,KAAA,GAAQ,KAAQ,GAAA,OAAA;AAC5G,IAAA,OAAO,IAAI,IAAK,CAAA,KAAA,CAAM,SAAS,KAAK,CAAC,KAAK,IAAI,CAAA,CAAA;AAAA;AAEhD,EAAO,OAAA,WAAA;AACT;AACO,SAAS,UAAU,IAAiC,EAAA;AACzD,EAAA,QAAQ,IAAM;AAAA,IACZ,KAAK,QAAA;AACH,MAAO,OAAA,QAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAO,OAAA,KAAA;AAAA,IACT;AACE,MAAO,OAAA,MAAA;AAAA;AAEb"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {StyleSheet,View,Text,ScrollView,Pressable}from'react-native';import {Image}from'expo-image';const PREVIEW_LIMIT = 6;
|
|
2
|
+
function TravelChatResultCard({
|
|
3
|
+
attachment,
|
|
4
|
+
properties,
|
|
5
|
+
ink,
|
|
6
|
+
muted,
|
|
7
|
+
border,
|
|
8
|
+
card,
|
|
9
|
+
onViewResults,
|
|
10
|
+
onOpenItem
|
|
11
|
+
}) {
|
|
12
|
+
var _a;
|
|
13
|
+
const byId = new Map(properties.map((p) => [p.id, p]));
|
|
14
|
+
const preview = attachment.properties.slice(0, PREVIEW_LIMIT);
|
|
15
|
+
const remaining = attachment.properties.length - preview.length;
|
|
16
|
+
const count = (_a = attachment.totalCount) != null ? _a : attachment.properties.length;
|
|
17
|
+
return /* @__PURE__ */ jsxs(View, { style: [styles.wrap, {
|
|
18
|
+
backgroundColor: card,
|
|
19
|
+
borderColor: border
|
|
20
|
+
}], children: [
|
|
21
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
22
|
+
color: ink
|
|
23
|
+
}], numberOfLines: 1, children: attachment.title }),
|
|
24
|
+
/* @__PURE__ */ jsxs(Text, { style: [styles.sub, {
|
|
25
|
+
color: muted
|
|
26
|
+
}], children: [
|
|
27
|
+
count,
|
|
28
|
+
" option",
|
|
29
|
+
count === 1 ? "" : "s"
|
|
30
|
+
] }),
|
|
31
|
+
/* @__PURE__ */ jsx(ScrollView, { horizontal: true, nestedScrollEnabled: true, showsHorizontalScrollIndicator: true, contentContainerStyle: styles.row, children: preview.map((item) => {
|
|
32
|
+
const property = byId.get(item.id);
|
|
33
|
+
const meta = item.price != null && item.price > 0 ? `$${Math.round(item.price)}` : void 0;
|
|
34
|
+
return /* @__PURE__ */ jsxs(Pressable, { onPress: () => property && onOpenItem(property), style: styles.tile, children: [
|
|
35
|
+
item.imageUrl ? /* @__PURE__ */ jsx(Image, { source: {
|
|
36
|
+
uri: item.imageUrl
|
|
37
|
+
}, style: styles.thumb, contentFit: "cover" }) : /* @__PURE__ */ jsx(View, { style: [styles.thumb, {
|
|
38
|
+
backgroundColor: "#f1f5f9"
|
|
39
|
+
}] }),
|
|
40
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.thumbTitle, {
|
|
41
|
+
color: ink
|
|
42
|
+
}], numberOfLines: 2, children: item.title }),
|
|
43
|
+
meta ? /* @__PURE__ */ jsx(Text, { style: [styles.thumbMeta, {
|
|
44
|
+
color: muted
|
|
45
|
+
}], numberOfLines: 1, children: meta }) : null
|
|
46
|
+
] }, item.id);
|
|
47
|
+
}) }),
|
|
48
|
+
remaining > 0 ? /* @__PURE__ */ jsxs(Text, { style: [styles.more, {
|
|
49
|
+
color: muted
|
|
50
|
+
}], children: [
|
|
51
|
+
"+",
|
|
52
|
+
remaining,
|
|
53
|
+
" more"
|
|
54
|
+
] }) : null,
|
|
55
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: onViewResults, style: styles.cta, children: /* @__PURE__ */ jsx(Text, { style: styles.ctaText, children: attachment.actionLabel || "View results" }) })
|
|
56
|
+
] });
|
|
57
|
+
}
|
|
58
|
+
const styles = StyleSheet.create({
|
|
59
|
+
wrap: {
|
|
60
|
+
borderWidth: 1,
|
|
61
|
+
borderRadius: 14,
|
|
62
|
+
padding: 12,
|
|
63
|
+
gap: 8,
|
|
64
|
+
marginTop: 8
|
|
65
|
+
},
|
|
66
|
+
title: {
|
|
67
|
+
fontSize: 14,
|
|
68
|
+
fontWeight: "700"
|
|
69
|
+
},
|
|
70
|
+
sub: {
|
|
71
|
+
fontSize: 12
|
|
72
|
+
},
|
|
73
|
+
row: {
|
|
74
|
+
gap: 8,
|
|
75
|
+
paddingVertical: 4
|
|
76
|
+
},
|
|
77
|
+
tile: {
|
|
78
|
+
width: 92,
|
|
79
|
+
gap: 4
|
|
80
|
+
},
|
|
81
|
+
thumb: {
|
|
82
|
+
width: 92,
|
|
83
|
+
height: 64,
|
|
84
|
+
borderRadius: 8
|
|
85
|
+
},
|
|
86
|
+
thumbTitle: {
|
|
87
|
+
fontSize: 11,
|
|
88
|
+
fontWeight: "600"
|
|
89
|
+
},
|
|
90
|
+
thumbMeta: {
|
|
91
|
+
fontSize: 11
|
|
92
|
+
},
|
|
93
|
+
more: {
|
|
94
|
+
fontSize: 12
|
|
95
|
+
},
|
|
96
|
+
cta: {
|
|
97
|
+
backgroundColor: "#0b1220",
|
|
98
|
+
borderRadius: 8,
|
|
99
|
+
paddingVertical: 8,
|
|
100
|
+
alignItems: "center"
|
|
101
|
+
},
|
|
102
|
+
ctaText: {
|
|
103
|
+
color: "#fff",
|
|
104
|
+
fontSize: 13,
|
|
105
|
+
fontWeight: "700"
|
|
106
|
+
}
|
|
107
|
+
});export{TravelChatResultCard};//# sourceMappingURL=TravelChatResultCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TravelChatResultCard.js","sources":["../../../../src/features/travel/chat/TravelChatResultCard.tsx"],"sourcesContent":["import React from 'react';\nimport { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { Image } from 'expo-image';\nimport type { TravelProperty } from '../types';\nimport type { TravelChatAttachment } from './widgetContent';\n\nconst PREVIEW_LIMIT = 6;\n\nexport function TravelChatResultCard({\n attachment,\n properties,\n ink,\n muted,\n border,\n card,\n onViewResults,\n onOpenItem,\n}: {\n attachment: TravelChatAttachment;\n properties: TravelProperty[];\n ink: string;\n muted: string;\n border: string;\n card: string;\n onViewResults: () => void;\n onOpenItem: (property: TravelProperty) => void;\n}) {\n const byId = new Map(properties.map((p) => [p.id, p]));\n const preview = attachment.properties.slice(0, PREVIEW_LIMIT);\n const remaining = attachment.properties.length - preview.length;\n const count = attachment.totalCount ?? attachment.properties.length;\n\n return (\n <View style={[styles.wrap, { backgroundColor: card, borderColor: border }]}>\n <Text style={[styles.title, { color: ink }]} numberOfLines={1}>\n {attachment.title}\n </Text>\n <Text style={[styles.sub, { color: muted }]}>\n {count} option{count === 1 ? '' : 's'}\n </Text>\n <ScrollView\n horizontal\n nestedScrollEnabled\n showsHorizontalScrollIndicator\n contentContainerStyle={styles.row}\n >\n {preview.map((item) => {\n const property = byId.get(item.id);\n const meta = item.price != null && item.price > 0 ? `$${Math.round(item.price)}` : undefined;\n return (\n <Pressable key={item.id} onPress={() => property && onOpenItem(property)} style={styles.tile}>\n {item.imageUrl ? (\n <Image source={{ uri: item.imageUrl }} style={styles.thumb} contentFit=\"cover\" />\n ) : (\n <View style={[styles.thumb, { backgroundColor: '#f1f5f9' }]} />\n )}\n <Text style={[styles.thumbTitle, { color: ink }]} numberOfLines={2}>\n {item.title}\n </Text>\n {meta ? (\n <Text style={[styles.thumbMeta, { color: muted }]} numberOfLines={1}>\n {meta}\n </Text>\n ) : null}\n </Pressable>\n );\n })}\n </ScrollView>\n {remaining > 0 ? <Text style={[styles.more, { color: muted }]}>+{remaining} more</Text> : null}\n <Pressable onPress={onViewResults} style={styles.cta}>\n <Text style={styles.ctaText}>{attachment.actionLabel || 'View results'}</Text>\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: { borderWidth: 1, borderRadius: 14, padding: 12, gap: 8, marginTop: 8 },\n title: { fontSize: 14, fontWeight: '700' },\n sub: { fontSize: 12 },\n row: { gap: 8, paddingVertical: 4 },\n tile: { width: 92, gap: 4 },\n thumb: { width: 92, height: 64, borderRadius: 8 },\n thumbTitle: { fontSize: 11, fontWeight: '600' },\n thumbMeta: { fontSize: 11 },\n more: { fontSize: 12 },\n cta: { backgroundColor: '#0b1220', borderRadius: 8, paddingVertical: 8, alignItems: 'center' },\n ctaText: { color: '#fff', fontSize: 13, fontWeight: '700' },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import {formatPriceLabel}from'../catalog.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
const WIDGET_FENCE = /```(?:yantra:widget|json)\s*([\s\S]*?)```/gi;
|
|
18
|
+
function visibleAssistantContent(messageContent) {
|
|
19
|
+
return messageContent.replace(WIDGET_FENCE, (match, body) => {
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(String(body).trim());
|
|
22
|
+
if (typeof (parsed == null ? void 0 : parsed.propsComponent) === "string") return "";
|
|
23
|
+
} catch (e) {
|
|
24
|
+
return match;
|
|
25
|
+
}
|
|
26
|
+
return match;
|
|
27
|
+
}).replace(/\n{3,}/g, "\n\n").trim();
|
|
28
|
+
}
|
|
29
|
+
function extractTravelAttachment(messageContent) {
|
|
30
|
+
var _a, _b, _c, _d;
|
|
31
|
+
let found = null;
|
|
32
|
+
for (const match of messageContent.matchAll(WIDGET_FENCE)) {
|
|
33
|
+
try {
|
|
34
|
+
const parsed = JSON.parse(String((_a = match[1]) != null ? _a : "").trim());
|
|
35
|
+
const attachment = (parsed == null ? void 0 : parsed.propsComponent) === "travel" ? (_c = (_b = parsed.propsConfiguration) == null ? void 0 : _b.contents) == null ? void 0 : _c.attachment : void 0;
|
|
36
|
+
if ((_d = attachment == null ? void 0 : attachment.properties) == null ? void 0 : _d.length) found = attachment;
|
|
37
|
+
} catch (e) {
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return found;
|
|
41
|
+
}
|
|
42
|
+
function buildTravelAttachment(properties, query) {
|
|
43
|
+
return {
|
|
44
|
+
title: query ? `Results for ${query}` : "Travel results",
|
|
45
|
+
query,
|
|
46
|
+
totalCount: properties.length,
|
|
47
|
+
actionLabel: "View results",
|
|
48
|
+
properties: properties.slice(0, 12).map((p) => __spreadValues(__spreadValues(__spreadValues(__spreadValues({
|
|
49
|
+
id: p.id,
|
|
50
|
+
title: p.title
|
|
51
|
+
}, typeof p.price === "number" ? {
|
|
52
|
+
price: p.price
|
|
53
|
+
} : {}), p.imageUrl ? {
|
|
54
|
+
imageUrl: p.imageUrl
|
|
55
|
+
} : {}), p.url ? {
|
|
56
|
+
url: p.url
|
|
57
|
+
} : {}), p.source ? {
|
|
58
|
+
source: p.source
|
|
59
|
+
} : {}))
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function summarizeTravelResults(properties, query) {
|
|
63
|
+
const count = properties.length;
|
|
64
|
+
const q = query.trim();
|
|
65
|
+
if (count === 0) {
|
|
66
|
+
return q ? `I couldn't find travel options matching **${q}**. Try refining dates or destination.` : `I couldn't find any travel options for that request.`;
|
|
67
|
+
}
|
|
68
|
+
const header = q ? `I found **${count} option${count === 1 ? "" : "s"}** for **${q}**:` : `I found **${count} option${count === 1 ? "" : "s"}**:`;
|
|
69
|
+
const preview = properties.slice(0, 5);
|
|
70
|
+
const lines = preview.map((p, i) => {
|
|
71
|
+
const price = formatPriceLabel(p);
|
|
72
|
+
const rating = typeof p.rating === "number" ? `\u2605 ${p.rating.toFixed(1)}` : void 0;
|
|
73
|
+
const meta = [price !== "See price" ? price : void 0, rating].filter(Boolean).join(" \xB7 ");
|
|
74
|
+
return meta ? `${i + 1}. **${p.title}** \u2014 ${meta}` : `${i + 1}. **${p.title}**`;
|
|
75
|
+
});
|
|
76
|
+
const remaining = count - preview.length;
|
|
77
|
+
const parts = [header, "", ...lines];
|
|
78
|
+
if (remaining > 0) parts.push("", `_+ ${remaining} more in the card below._`);
|
|
79
|
+
parts.push("", "Tap **View results** below to browse the full list.");
|
|
80
|
+
return parts.join("\n");
|
|
81
|
+
}
|
|
82
|
+
function buildTravelWidgetMessage(properties, query) {
|
|
83
|
+
const attachment = buildTravelAttachment(properties, query);
|
|
84
|
+
const envelope = {
|
|
85
|
+
propsComponent: "travel",
|
|
86
|
+
propsConfiguration: {
|
|
87
|
+
contents: {
|
|
88
|
+
attachment
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
return `${summarizeTravelResults(properties, query)}
|
|
93
|
+
|
|
94
|
+
\`\`\`json
|
|
95
|
+
${JSON.stringify(envelope)}
|
|
96
|
+
\`\`\``;
|
|
97
|
+
}
|
|
98
|
+
function isTravelConversation(text) {
|
|
99
|
+
const trimmed = text.trim();
|
|
100
|
+
if (!trimmed) return true;
|
|
101
|
+
if (/^(hi|hey|hello|yo|thanks|thank you|thx|ok|okay)[\s!.?]*$/i.test(trimmed)) return true;
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
function shouldUseHostLane(text, fileCount) {
|
|
105
|
+
if (fileCount > 0) return true;
|
|
106
|
+
return isTravelConversation(text);
|
|
107
|
+
}export{WIDGET_FENCE,buildTravelAttachment,buildTravelWidgetMessage,extractTravelAttachment,isTravelConversation,shouldUseHostLane,summarizeTravelResults,visibleAssistantContent};//# sourceMappingURL=widgetContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widgetContent.js","sources":["../../../../src/features/travel/chat/widgetContent.ts"],"sourcesContent":["import type { TravelProperty } from '../types';\nimport { formatPriceLabel } from '../catalog';\n\nexport const WIDGET_FENCE = /```(?:yantra:widget|json)\\s*([\\s\\S]*?)```/gi;\n\nexport interface TravelChatCardItem {\n id: string;\n title: string;\n price?: number;\n imageUrl?: string;\n url?: string;\n source?: string;\n}\n\nexport interface TravelChatAttachment {\n title: string;\n query?: string;\n actionLabel?: string;\n totalCount?: number;\n properties: TravelChatCardItem[];\n}\n\nexport function visibleAssistantContent(messageContent: string): string {\n return messageContent\n .replace(WIDGET_FENCE, (match, body: string) => {\n try {\n const parsed = JSON.parse(String(body).trim()) as { propsComponent?: unknown };\n if (typeof parsed?.propsComponent === 'string') return '';\n } catch {\n return match;\n }\n return match;\n })\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nexport function extractTravelAttachment(messageContent: string): TravelChatAttachment | null {\n let found: TravelChatAttachment | null = null;\n for (const match of messageContent.matchAll(WIDGET_FENCE)) {\n try {\n const parsed = JSON.parse(String(match[1] ?? '').trim()) as {\n propsComponent?: string;\n propsConfiguration?: { contents?: { attachment?: TravelChatAttachment } };\n };\n const attachment =\n parsed?.propsComponent === 'travel' ? parsed.propsConfiguration?.contents?.attachment : undefined;\n if (attachment?.properties?.length) found = attachment;\n } catch {\n /* skip */\n }\n }\n return found;\n}\n\nexport function buildTravelAttachment(properties: TravelProperty[], query: string): TravelChatAttachment {\n return {\n title: query ? `Results for ${query}` : 'Travel results',\n query,\n totalCount: properties.length,\n actionLabel: 'View results',\n properties: properties.slice(0, 12).map((p) => ({\n id: p.id,\n title: p.title,\n ...(typeof p.price === 'number' ? { price: p.price } : {}),\n ...(p.imageUrl ? { imageUrl: p.imageUrl } : {}),\n ...(p.url ? { url: p.url } : {}),\n ...(p.source ? { source: p.source } : {}),\n })),\n };\n}\n\nexport function summarizeTravelResults(properties: TravelProperty[], query: string): string {\n const count = properties.length;\n const q = query.trim();\n if (count === 0) {\n return q\n ? `I couldn't find travel options matching **${q}**. Try refining dates or destination.`\n : `I couldn't find any travel options for that request.`;\n }\n const header = q\n ? `I found **${count} option${count === 1 ? '' : 's'}** for **${q}**:`\n : `I found **${count} option${count === 1 ? '' : 's'}**:`;\n const preview = properties.slice(0, 5);\n const lines = preview.map((p, i) => {\n const price = formatPriceLabel(p);\n const rating = typeof p.rating === 'number' ? `★ ${p.rating.toFixed(1)}` : undefined;\n const meta = [price !== 'See price' ? price : undefined, rating].filter(Boolean).join(' · ');\n return meta ? `${i + 1}. **${p.title}** — ${meta}` : `${i + 1}. **${p.title}**`;\n });\n const remaining = count - preview.length;\n const parts = [header, '', ...lines];\n if (remaining > 0) parts.push('', `_+ ${remaining} more in the card below._`);\n parts.push('', 'Tap **View results** below to browse the full list.');\n return parts.join('\\n');\n}\n\nexport function buildTravelWidgetMessage(properties: TravelProperty[], query: string): string {\n const attachment = buildTravelAttachment(properties, query);\n const envelope = {\n propsComponent: 'travel',\n propsConfiguration: { contents: { attachment } },\n };\n return `${summarizeTravelResults(properties, query)}\\n\\n\\`\\`\\`json\\n${JSON.stringify(envelope)}\\n\\`\\`\\``;\n}\n\nexport function isTravelConversation(text: string): boolean {\n const trimmed = text.trim();\n if (!trimmed) return true;\n if (/^(hi|hey|hello|yo|thanks|thank you|thx|ok|okay)[\\s!.?]*$/i.test(trimmed)) return true;\n return false;\n}\n\nexport function shouldUseHostLane(text: string, fileCount: number): boolean {\n if (fileCount > 0) return true;\n return isTravelConversation(text);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEO,MAAM,YAAe,GAAA;AAgBrB,SAAS,wBAAwB,cAAgC,EAAA;AACtE,EAAA,OAAO,cAAe,CAAA,OAAA,CAAQ,YAAc,EAAA,CAAC,OAAO,IAAiB,KAAA;AACnE,IAAI,IAAA;AACF,MAAA,MAAM,SAAS,IAAK,CAAA,KAAA,CAAM,OAAO,IAAI,CAAA,CAAE,MAAM,CAAA;AAG7C,MAAA,IAAI,QAAO,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAQ,cAAmB,CAAA,KAAA,QAAA,EAAiB,OAAA,EAAA;AAAA,KACjD,CAAA,OAAA,CAAA,EAAA;AACN,MAAO,OAAA,KAAA;AAAA;AAET,IAAO,OAAA,KAAA;AAAA,GACR,CAAE,CAAA,OAAA,CAAQ,SAAW,EAAA,MAAM,EAAE,IAAK,EAAA;AACrC;AACO,SAAS,wBAAwB,cAAqD,EAAA;AA/B7F,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAgCE,EAAA,IAAI,KAAqC,GAAA,IAAA;AACzC,EAAA,KAAA,MAAW,KAAS,IAAA,cAAA,CAAe,QAAS,CAAA,YAAY,CAAG,EAAA;AACzD,IAAI,IAAA;AACF,MAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,MAAO,CAAA,CAAA,EAAA,GAAA,KAAA,CAAM,CAAC,CAAA,KAAP,IAAY,GAAA,EAAA,GAAA,EAAE,CAAE,CAAA,IAAA,EAAM,CAAA;AAQvD,MAAM,MAAA,UAAA,GAAA,CAAa,iCAAQ,cAAmB,MAAA,QAAA,GAAA,CAAW,kBAAO,kBAAP,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA2B,QAA3B,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAqC,UAAa,GAAA,KAAA,CAAA;AAC3G,MAAA,IAAA,CAAI,EAAY,GAAA,UAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,UAAA,CAAA,UAAA,KAAZ,IAAwB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAA,EAAgB,KAAA,GAAA,UAAA;AAAA,KACtC,CAAA,OAAA,CAAA,EAAA;AAAA;AAER;AAEF,EAAO,OAAA,KAAA;AACT;AACgB,SAAA,qBAAA,CAAsB,YAA8B,KAAqC,EAAA;AACvG,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,KAAA,GAAQ,CAAe,YAAA,EAAA,KAAK,CAAK,CAAA,GAAA,gBAAA;AAAA,IACxC,KAAA;AAAA,IACA,YAAY,UAAW,CAAA,MAAA;AAAA,IACvB,WAAa,EAAA,cAAA;AAAA,IACb,YAAY,UAAW,CAAA,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,IAAI,CAAM,CAAA,KAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA;AAAA,MAC5C,IAAI,CAAE,CAAA,EAAA;AAAA,MACN,OAAO,CAAE,CAAA;AAAA,KACL,EAAA,OAAO,CAAE,CAAA,KAAA,KAAU,QAAW,GAAA;AAAA,MAChC,OAAO,CAAE,CAAA;AAAA,KACP,GAAA,EACA,CAAA,EAAA,CAAA,CAAE,QAAW,GAAA;AAAA,MACf,UAAU,CAAE,CAAA;AAAA,KACV,GAAA,EACA,CAAA,EAAA,CAAA,CAAE,GAAM,GAAA;AAAA,MACV,KAAK,CAAE,CAAA;AAAA,KACL,GAAA,EACA,CAAA,EAAA,CAAA,CAAE,MAAS,GAAA;AAAA,MACb,QAAQ,CAAE,CAAA;AAAA,KACZ,GAAI,EACJ,CAAA;AAAA,GACJ;AACF;AACgB,SAAA,sBAAA,CAAuB,YAA8B,KAAuB,EAAA;AAC1F,EAAA,MAAM,QAAQ,UAAW,CAAA,MAAA;AACzB,EAAM,MAAA,CAAA,GAAI,MAAM,IAAK,EAAA;AACrB,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAO,OAAA,CAAA,GAAI,CAA6C,0CAAA,EAAA,CAAC,CAA2C,sCAAA,CAAA,GAAA,CAAA,oDAAA,CAAA;AAAA;AAEtG,EAAA,MAAM,SAAS,CAAI,GAAA,CAAA,UAAA,EAAa,KAAK,CAAU,OAAA,EAAA,KAAA,KAAU,IAAI,EAAK,GAAA,GAAG,CAAY,SAAA,EAAA,CAAC,QAAQ,CAAa,UAAA,EAAA,KAAK,UAAU,KAAU,KAAA,CAAA,GAAI,KAAK,GAAG,CAAA,GAAA,CAAA;AAC5I,EAAA,MAAM,OAAU,GAAA,UAAA,CAAW,KAAM,CAAA,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,MAAM,KAAQ,GAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,GAAG,CAAM,KAAA;AAClC,IAAM,MAAA,KAAA,GAAQ,iBAAiB,CAAC,CAAA;AAChC,IAAM,MAAA,MAAA,GAAS,OAAO,CAAA,CAAE,MAAW,KAAA,QAAA,GAAW,CAAK,OAAA,EAAA,CAAA,CAAE,MAAO,CAAA,OAAA,CAAQ,CAAC,CAAC,CAAK,CAAA,GAAA,MAAA;AAC3E,IAAA,MAAM,IAAO,GAAA,CAAC,KAAU,KAAA,WAAA,GAAc,KAAQ,GAAA,MAAA,EAAW,MAAM,CAAA,CAAE,MAAO,CAAA,OAAO,CAAE,CAAA,IAAA,CAAK,QAAK,CAAA;AAC3F,IAAA,OAAO,IAAO,GAAA,CAAA,EAAG,CAAI,GAAA,CAAC,OAAO,CAAE,CAAA,KAAK,CAAQ,UAAA,EAAA,IAAI,KAAK,CAAG,EAAA,CAAA,GAAI,CAAC,CAAA,IAAA,EAAO,EAAE,KAAK,CAAA,EAAA,CAAA;AAAA,GAC5E,CAAA;AACD,EAAM,MAAA,SAAA,GAAY,QAAQ,OAAQ,CAAA,MAAA;AAClC,EAAA,MAAM,KAAQ,GAAA,CAAC,MAAQ,EAAA,EAAA,EAAI,GAAG,KAAK,CAAA;AACnC,EAAA,IAAI,YAAY,CAAG,EAAA,KAAA,CAAM,KAAK,EAAI,EAAA,CAAA,GAAA,EAAM,SAAS,CAA2B,yBAAA,CAAA,CAAA;AAC5E,EAAM,KAAA,CAAA,IAAA,CAAK,IAAI,qDAAqD,CAAA;AACpE,EAAO,OAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AACgB,SAAA,wBAAA,CAAyB,YAA8B,KAAuB,EAAA;AAC5F,EAAM,MAAA,UAAA,GAAa,qBAAsB,CAAA,UAAA,EAAY,KAAK,CAAA;AAC1D,EAAA,MAAM,QAAW,GAAA;AAAA,IACf,cAAgB,EAAA,QAAA;AAAA,IAChB,kBAAoB,EAAA;AAAA,MAClB,QAAU,EAAA;AAAA,QACR;AAAA;AACF;AACF,GACF;AACA,EAAA,OAAO,CAAG,EAAA,sBAAA,CAAuB,UAAY,EAAA,KAAK,CAAC;;AAAA;AAAA,EAAmB,IAAA,CAAK,SAAU,CAAA,QAAQ,CAAC;AAAA,MAAA,CAAA;AAChG;AACO,SAAS,qBAAqB,IAAuB,EAAA;AAC1D,EAAM,MAAA,OAAA,GAAU,KAAK,IAAK,EAAA;AAC1B,EAAI,IAAA,CAAC,SAAgB,OAAA,IAAA;AACrB,EAAA,IAAI,2DAA4D,CAAA,IAAA,CAAK,OAAO,CAAA,EAAU,OAAA,IAAA;AACtF,EAAO,OAAA,KAAA;AACT;AACgB,SAAA,iBAAA,CAAkB,MAAc,SAA4B,EAAA;AAC1E,EAAI,IAAA,SAAA,GAAY,GAAU,OAAA,IAAA;AAC1B,EAAA,OAAO,qBAAqB,IAAI,CAAA;AAClC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
function usablePrice(p) {
|
|
2
|
+
return p.price != null && Number.isFinite(p.price) && p.price > 0 ? p.price : void 0;
|
|
3
|
+
}
|
|
4
|
+
function formatDurationShort(minutes) {
|
|
5
|
+
if (minutes == null || !Number.isFinite(minutes) || minutes <= 0) return void 0;
|
|
6
|
+
const h = Math.floor(minutes / 60);
|
|
7
|
+
const m = Math.round(minutes % 60);
|
|
8
|
+
if (h === 0) return `${m}m`;
|
|
9
|
+
return m === 0 ? `${h}h` : `${h}h ${m}m`;
|
|
10
|
+
}
|
|
11
|
+
function compactMarkerPrice(priceLabel, price) {
|
|
12
|
+
const rounded = price != null && Number.isFinite(price) ? Math.round(price) : void 0;
|
|
13
|
+
if (rounded != null) return `$${rounded}`;
|
|
14
|
+
return (priceLabel == null ? void 0 : priceLabel.trim()) || void 0;
|
|
15
|
+
}
|
|
16
|
+
function computeFlightDeals(properties) {
|
|
17
|
+
const priced = properties.filter((p) => (p.kind === "flight" || p.source === "flight-search") && usablePrice(p) != null);
|
|
18
|
+
if (priced.length < 2) return null;
|
|
19
|
+
const byPrice = (a, b) => {
|
|
20
|
+
var _a, _b;
|
|
21
|
+
return usablePrice(a) - usablePrice(b) || ((_a = a.durationMinutes) != null ? _a : Infinity) - ((_b = b.durationMinutes) != null ? _b : Infinity);
|
|
22
|
+
};
|
|
23
|
+
const cheapest = [...priced].sort(byPrice)[0];
|
|
24
|
+
const timed = priced.filter((p) => p.durationMinutes != null && p.durationMinutes > 0);
|
|
25
|
+
const fastest = timed.length ? [...timed].sort((a, b) => a.durationMinutes - b.durationMinutes || usablePrice(a) - usablePrice(b))[0] : void 0;
|
|
26
|
+
const minPrice = usablePrice(cheapest);
|
|
27
|
+
const maxPrice = Math.max(...priced.map((p) => usablePrice(p)));
|
|
28
|
+
let best;
|
|
29
|
+
if (timed.length >= 2 && fastest) {
|
|
30
|
+
const minDuration = fastest.durationMinutes;
|
|
31
|
+
const score = (p) => usablePrice(p) / minPrice + p.durationMinutes / minDuration;
|
|
32
|
+
best = [...timed].sort((a, b) => score(a) - score(b) || byPrice(a, b))[0];
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
count: priced.length,
|
|
36
|
+
minPrice,
|
|
37
|
+
maxPrice,
|
|
38
|
+
cheapest,
|
|
39
|
+
fastest,
|
|
40
|
+
best
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function sortFlightProperties(properties, sort) {
|
|
44
|
+
const durationOf = (p) => p.durationMinutes != null && p.durationMinutes > 0 ? p.durationMinutes : void 0;
|
|
45
|
+
const minPrice = Math.min(...properties.map((p) => {
|
|
46
|
+
var _a;
|
|
47
|
+
return (_a = usablePrice(p)) != null ? _a : Infinity;
|
|
48
|
+
}));
|
|
49
|
+
const minDuration = Math.min(...properties.map((p) => {
|
|
50
|
+
var _a;
|
|
51
|
+
return (_a = durationOf(p)) != null ? _a : Infinity;
|
|
52
|
+
}));
|
|
53
|
+
const metric = (p) => {
|
|
54
|
+
const price = usablePrice(p);
|
|
55
|
+
const duration = durationOf(p);
|
|
56
|
+
if (sort === "cheapest") return price != null ? price : Infinity;
|
|
57
|
+
if (sort === "fastest") return duration != null ? duration : Infinity;
|
|
58
|
+
return price != null && duration != null && Number.isFinite(minPrice) && Number.isFinite(minDuration) ? price / minPrice + duration / minDuration : Infinity;
|
|
59
|
+
};
|
|
60
|
+
return properties.map((p, index) => ({
|
|
61
|
+
p,
|
|
62
|
+
index,
|
|
63
|
+
m: metric(p)
|
|
64
|
+
})).sort((a, b) => (a.m === b.m ? 0 : a.m - b.m) || a.index - b.index).map((x) => x.p);
|
|
65
|
+
}export{compactMarkerPrice,computeFlightDeals,formatDurationShort,sortFlightProperties};//# sourceMappingURL=flightDeals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flightDeals.js","sources":["../../../src/features/travel/flightDeals.ts"],"sourcesContent":["import type { TravelProperty } from './types';\n\nexport type FlightSort = 'cheapest' | 'best' | 'fastest';\n\nexport interface FlightDealSummary {\n count: number;\n minPrice: number;\n maxPrice: number;\n cheapest: TravelProperty;\n fastest?: TravelProperty;\n best?: TravelProperty;\n}\n\nfunction usablePrice(p: TravelProperty): number | undefined {\n return p.price != null && Number.isFinite(p.price) && p.price > 0 ? p.price : undefined;\n}\n\nexport function formatDurationShort(minutes?: number): string | undefined {\n if (minutes == null || !Number.isFinite(minutes) || minutes <= 0) return undefined;\n const h = Math.floor(minutes / 60);\n const m = Math.round(minutes % 60);\n if (h === 0) return `${m}m`;\n return m === 0 ? `${h}h` : `${h}h ${m}m`;\n}\n\nexport function compactMarkerPrice(priceLabel?: string, price?: number): string | undefined {\n const rounded = price != null && Number.isFinite(price) ? Math.round(price) : undefined;\n if (rounded != null) return `$${rounded}`;\n return priceLabel?.trim() || undefined;\n}\n\nexport function computeFlightDeals(properties: TravelProperty[]): FlightDealSummary | null {\n const priced = properties.filter(\n (p) => (p.kind === 'flight' || p.source === 'flight-search') && usablePrice(p) != null,\n );\n if (priced.length < 2) return null;\n\n const byPrice = (a: TravelProperty, b: TravelProperty) =>\n usablePrice(a)! - usablePrice(b)! || (a.durationMinutes ?? Infinity) - (b.durationMinutes ?? Infinity);\n const cheapest = [...priced].sort(byPrice)[0];\n const timed = priced.filter((p) => p.durationMinutes != null && p.durationMinutes > 0);\n const fastest = timed.length\n ? [...timed].sort((a, b) => a.durationMinutes! - b.durationMinutes! || usablePrice(a)! - usablePrice(b)!)[0]\n : undefined;\n const minPrice = usablePrice(cheapest)!;\n const maxPrice = Math.max(...priced.map((p) => usablePrice(p)!));\n let best: TravelProperty | undefined;\n if (timed.length >= 2 && fastest) {\n const minDuration = fastest.durationMinutes!;\n const score = (p: TravelProperty) => usablePrice(p)! / minPrice + p.durationMinutes! / minDuration;\n best = [...timed].sort((a, b) => score(a) - score(b) || byPrice(a, b))[0];\n }\n return { count: priced.length, minPrice, maxPrice, cheapest, fastest, best };\n}\n\nexport function sortFlightProperties(properties: TravelProperty[], sort: FlightSort): TravelProperty[] {\n const durationOf = (p: TravelProperty) =>\n p.durationMinutes != null && p.durationMinutes > 0 ? p.durationMinutes : undefined;\n const minPrice = Math.min(...properties.map((p) => usablePrice(p) ?? Infinity));\n const minDuration = Math.min(...properties.map((p) => durationOf(p) ?? Infinity));\n const metric = (p: TravelProperty): number => {\n const price = usablePrice(p);\n const duration = durationOf(p);\n if (sort === 'cheapest') return price ?? Infinity;\n if (sort === 'fastest') return duration ?? Infinity;\n return price != null && duration != null && Number.isFinite(minPrice) && Number.isFinite(minDuration)\n ? price / minPrice + duration / minDuration\n : Infinity;\n };\n return properties\n .map((p, index) => ({ p, index, m: metric(p) }))\n .sort((a, b) => (a.m === b.m ? 0 : a.m - b.m) || a.index - b.index)\n .map((x) => x.p);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
const GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));
|
|
21
|
+
function withMapCoordinates(properties, center) {
|
|
22
|
+
const delta = 0.012;
|
|
23
|
+
return properties.map((property, index) => {
|
|
24
|
+
if (property.latitude != null && property.longitude != null) {
|
|
25
|
+
return __spreadProps(__spreadValues({}, property), {
|
|
26
|
+
latitude: property.latitude,
|
|
27
|
+
longitude: property.longitude
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const angle = (index + 0.5) * GOLDEN_ANGLE;
|
|
31
|
+
return __spreadProps(__spreadValues({}, property), {
|
|
32
|
+
latitude: center.lat + Math.sin(angle) * delta,
|
|
33
|
+
longitude: center.lng + Math.cos(angle) * delta
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}export{withMapCoordinates};//# sourceMappingURL=mapCoordinates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapCoordinates.js","sources":["../../../src/features/travel/mapCoordinates.ts"],"sourcesContent":["import type { TravelProperty } from './types';\n\n/**\n * Phyllotaxis (sunflower) spacing for properties the supplier gave no coordinates for.\n *\n * The previous `index / properties.length * 2π` spread landed on the cardinal angles whenever\n * the index divided the count evenly — at angle π, `Math.sin` is 0, so the marker sat on the\n * search centre's exact latitude and read as un-jittered. It also derived the angle from the\n * position among ALL properties, so a run of supplier-positioned rows bunched the rest together.\n * The golden angle never lands on a cardinal for an integer step and spreads any count evenly.\n */\nconst GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));\n\nexport function withMapCoordinates(\n properties: TravelProperty[],\n center: { lat: number; lng: number },\n): Array<TravelProperty & { latitude: number; longitude: number }> {\n const delta = 0.012;\n return properties.map((property, index) => {\n if (property.latitude != null && property.longitude != null) {\n return { ...property, latitude: property.latitude, longitude: property.longitude };\n }\n // Half-step offset so index 0 is not on a cardinal angle either.\n const angle = (index + 0.5) * GOLDEN_ANGLE;\n return {\n ...property,\n latitude: center.lat + Math.sin(angle) * delta,\n longitude: center.lng + Math.cos(angle) * delta,\n };\n });\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAWA,MAAM,eAAe,IAAK,CAAA,EAAA,IAAM,CAAI,GAAA,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAC/B,SAAA,kBAAA,CAAmB,YAA8B,MAM9D,EAAA;AACD,EAAA,MAAM,KAAQ,GAAA,KAAA;AACd,EAAA,OAAO,UAAW,CAAA,GAAA,CAAI,CAAC,QAAA,EAAU,KAAU,KAAA;AACzC,IAAA,IAAI,QAAS,CAAA,QAAA,IAAY,IAAQ,IAAA,QAAA,CAAS,aAAa,IAAM,EAAA;AAC3D,MAAA,OAAO,iCACF,QADE,CAAA,EAAA;AAAA,QAEL,UAAU,QAAS,CAAA,QAAA;AAAA,QACnB,WAAW,QAAS,CAAA;AAAA,OACtB,CAAA;AAAA;AAGF,IAAM,MAAA,KAAA,GAAA,CAAS,QAAQ,GAAO,IAAA,YAAA;AAC9B,IAAA,OAAO,iCACF,QADE,CAAA,EAAA;AAAA,MAEL,UAAU,MAAO,CAAA,GAAA,GAAM,IAAK,CAAA,GAAA,CAAI,KAAK,CAAI,GAAA,KAAA;AAAA,MACzC,WAAW,MAAO,CAAA,GAAA,GAAM,IAAK,CAAA,GAAA,CAAI,KAAK,CAAI,GAAA;AAAA,KAC5C,CAAA;AAAA,GACD,CAAA;AACH"}
|