@adminide-stack/yantra-mobile 12.0.69-alpha.8 → 12.0.69
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 +164 -0
- package/lib/features/chat/ConnectorConnectCard.js.map +1 -0
- package/lib/features/chat/ConnectorConnectPrompt.js +254 -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 +179 -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,29 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {StyleSheet,ScrollView,Text}from'react-native';import {TravelPropertyCard}from'./TravelPropertyCard.js';import {useTravelHistory}from'./travelHistoryStore.js';function BookingsPanel({
|
|
2
|
+
onOpenDetails,
|
|
3
|
+
card,
|
|
4
|
+
border,
|
|
5
|
+
ink,
|
|
6
|
+
muted
|
|
7
|
+
}) {
|
|
8
|
+
const {
|
|
9
|
+
bookings
|
|
10
|
+
} = useTravelHistory();
|
|
11
|
+
return /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: styles.body, children: [
|
|
12
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
13
|
+
color: ink
|
|
14
|
+
}], children: "Trips" }),
|
|
15
|
+
bookings.length === 0 ? /* @__PURE__ */ jsx(Text, { style: {
|
|
16
|
+
color: muted
|
|
17
|
+
}, children: "Listings you open to book are tracked here." }) : bookings.map((entry) => /* @__PURE__ */ jsx(TravelPropertyCard, { property: entry.property, card, border, ink, muted, onOpen: () => onOpenDetails(entry.property) }, entry.id))
|
|
18
|
+
] });
|
|
19
|
+
}
|
|
20
|
+
const styles = StyleSheet.create({
|
|
21
|
+
body: {
|
|
22
|
+
padding: 16,
|
|
23
|
+
gap: 10
|
|
24
|
+
},
|
|
25
|
+
title: {
|
|
26
|
+
fontSize: 18,
|
|
27
|
+
fontWeight: "800"
|
|
28
|
+
}
|
|
29
|
+
});export{BookingsPanel};//# sourceMappingURL=BookingsPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BookingsPanel.js","sources":["../../../src/features/travel/BookingsPanel.tsx"],"sourcesContent":["import React from 'react';\nimport { ScrollView, StyleSheet, Text } from 'react-native';\nimport type { TravelProperty } from './types';\nimport { TravelPropertyCard } from './TravelPropertyCard';\nimport { useTravelHistory } from './travelHistoryStore';\n\nexport function BookingsPanel({\n onOpenDetails,\n card,\n border,\n ink,\n muted,\n}: {\n onOpenDetails: (property: TravelProperty) => void;\n card: string;\n border: string;\n ink: string;\n muted: string;\n}) {\n const { bookings } = useTravelHistory();\n return (\n <ScrollView contentContainerStyle={styles.body}>\n <Text style={[styles.title, { color: ink }]}>Trips</Text>\n {bookings.length === 0 ? (\n <Text style={{ color: muted }}>Listings you open to book are tracked here.</Text>\n ) : (\n bookings.map((entry) => (\n <TravelPropertyCard\n key={entry.id}\n property={entry.property}\n card={card}\n border={border}\n ink={ink}\n muted={muted}\n onOpen={() => onOpenDetails(entry.property)}\n />\n ))\n )}\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create({\n body: { padding: 16, gap: 10 },\n title: { fontSize: 18, fontWeight: '800' },\n});\n"],"names":[],"mappings":"+MAKO,SAAS,aAAc,CAAA;AAAA,EAC5B,aAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAMG,EAAA;AACD,EAAM,MAAA;AAAA,IACJ;AAAA,MACE,gBAAiB,EAAA;AACrB,EAAA,uBAAQ,IAAA,CAAA,UAAA,EAAA,EAAW,qBAAuB,EAAA,MAAA,CAAO,IACvC,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,KAAO,EAAA;AAAA,MAClC,KAAO,EAAA;AAAA,KACR,GAAG,QAAK,EAAA,OAAA,EAAA,CAAA;AAAA,IACA,QAAS,CAAA,MAAA,KAAW,CAAI,mBAAA,GAAA,CAAC,QAAK,KAAO,EAAA;AAAA,MAC5C,KAAO,EAAA;AAAA,KACT,EAAG,yDAA2C,CAAU,GAAA,QAAA,CAAS,IAAI,CAAS,KAAA,qBAAA,GAAA,CAAC,kBAAkC,EAAA,EAAA,QAAA,EAAU,KAAM,CAAA,QAAA,EAAU,MAAY,MAAgB,EAAA,GAAA,EAAU,KAAc,EAAA,MAAA,EAAQ,MAAM,aAAA,CAAc,MAAM,QAAQ,CAAA,EAAA,EAAlI,KAAM,CAAA,EAA+H,CAAE;AAAA,GAC1O,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,IAAM,EAAA;AAAA,IACJ,OAAS,EAAA,EAAA;AAAA,IACT,GAAK,EAAA;AAAA,GACP;AAAA,EACA,KAAO,EAAA;AAAA,IACL,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA;AAEhB,CAAC,CAAA"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useState}from'react';import {StyleSheet,ScrollView,Text,View,TextInput,Pressable,ActivityIndicator,Linking}from'react-native';import {Image}from'expo-image';import {discoverExperiencesViaConnector,discoverSocialViaConnector}from'./services/resortifiConnectorClient.js';function DiscoverPanel({
|
|
2
|
+
card,
|
|
3
|
+
border,
|
|
4
|
+
ink,
|
|
5
|
+
muted
|
|
6
|
+
}) {
|
|
7
|
+
const [query, setQuery] = useState("");
|
|
8
|
+
const [loading, setLoading] = useState(false);
|
|
9
|
+
const [error, setError] = useState(null);
|
|
10
|
+
const [items, setItems] = useState([]);
|
|
11
|
+
const [posts, setPosts] = useState([]);
|
|
12
|
+
const run = async () => {
|
|
13
|
+
const place = query.trim();
|
|
14
|
+
if (!place) return;
|
|
15
|
+
setLoading(true);
|
|
16
|
+
setError(null);
|
|
17
|
+
try {
|
|
18
|
+
const [result, social] = await Promise.all([discoverExperiencesViaConnector({
|
|
19
|
+
location: place,
|
|
20
|
+
categories: ["attractions", "restaurants", "transport"]
|
|
21
|
+
}), discoverSocialViaConnector({
|
|
22
|
+
location: place
|
|
23
|
+
}).catch(() => ({
|
|
24
|
+
posts: []
|
|
25
|
+
}))]);
|
|
26
|
+
setItems([...result.attractions, ...result.restaurants, ...result.transport]);
|
|
27
|
+
setPosts(social.posts);
|
|
28
|
+
} catch (err) {
|
|
29
|
+
setItems([]);
|
|
30
|
+
setPosts([]);
|
|
31
|
+
setError(err instanceof Error ? err.message : "Discover search failed.");
|
|
32
|
+
} finally {
|
|
33
|
+
setLoading(false);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
return /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: styles.body, keyboardShouldPersistTaps: "handled", children: [
|
|
37
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
38
|
+
color: ink
|
|
39
|
+
}], children: "Discover" }),
|
|
40
|
+
/* @__PURE__ */ jsx(Text, { style: {
|
|
41
|
+
color: muted
|
|
42
|
+
}, children: "Attractions, dining, and transport for a destination \u2014 same connector as web Travel." }),
|
|
43
|
+
/* @__PURE__ */ jsxs(View, { style: styles.row, children: [
|
|
44
|
+
/* @__PURE__ */ jsx(TextInput, { value: query, onChangeText: setQuery, placeholder: "Lisbon, Portugal", placeholderTextColor: "#94a3b8", style: styles.input, returnKeyType: "search", onSubmitEditing: () => void run() }),
|
|
45
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: () => void run(), style: styles.go, children: /* @__PURE__ */ jsx(Text, { style: styles.goText, children: "Go" }) })
|
|
46
|
+
] }),
|
|
47
|
+
loading ? /* @__PURE__ */ jsx(ActivityIndicator, {}) : null,
|
|
48
|
+
error ? /* @__PURE__ */ jsx(Text, { style: {
|
|
49
|
+
color: muted
|
|
50
|
+
}, children: error }) : null,
|
|
51
|
+
posts.length ? /* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
52
|
+
color: ink,
|
|
53
|
+
fontSize: 15
|
|
54
|
+
}], children: "Trending social" }) : null,
|
|
55
|
+
posts.map((post) => /* @__PURE__ */ jsxs(Pressable, { onPress: () => post.url && void Linking.openURL(post.url), style: [styles.card, {
|
|
56
|
+
backgroundColor: card,
|
|
57
|
+
borderColor: border
|
|
58
|
+
}], children: [
|
|
59
|
+
post.content.imageUrl ? /* @__PURE__ */ jsx(Image, { source: {
|
|
60
|
+
uri: post.content.imageUrl
|
|
61
|
+
}, style: styles.thumb, contentFit: "cover" }) : null,
|
|
62
|
+
/* @__PURE__ */ jsxs(View, { style: {
|
|
63
|
+
flex: 1,
|
|
64
|
+
gap: 4
|
|
65
|
+
}, children: [
|
|
66
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.cat, {
|
|
67
|
+
color: muted
|
|
68
|
+
}], children: post.platform }),
|
|
69
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.name, {
|
|
70
|
+
color: ink
|
|
71
|
+
}], children: post.content.username }),
|
|
72
|
+
post.content.caption ? /* @__PURE__ */ jsx(Text, { style: {
|
|
73
|
+
color: muted,
|
|
74
|
+
fontSize: 12
|
|
75
|
+
}, numberOfLines: 3, children: post.content.caption }) : null
|
|
76
|
+
] })
|
|
77
|
+
] }, post.id)),
|
|
78
|
+
items.map((item) => /* @__PURE__ */ jsxs(Pressable, { onPress: () => item.url && void Linking.openURL(item.url), style: [styles.card, {
|
|
79
|
+
backgroundColor: card,
|
|
80
|
+
borderColor: border
|
|
81
|
+
}], children: [
|
|
82
|
+
item.image ? /* @__PURE__ */ jsx(Image, { source: {
|
|
83
|
+
uri: item.image
|
|
84
|
+
}, style: styles.thumb, contentFit: "cover" }) : null,
|
|
85
|
+
/* @__PURE__ */ jsxs(View, { style: {
|
|
86
|
+
flex: 1,
|
|
87
|
+
gap: 4
|
|
88
|
+
}, children: [
|
|
89
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.cat, {
|
|
90
|
+
color: muted
|
|
91
|
+
}], children: item.category }),
|
|
92
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.name, {
|
|
93
|
+
color: ink
|
|
94
|
+
}], children: item.name }),
|
|
95
|
+
item.address ? /* @__PURE__ */ jsx(Text, { style: {
|
|
96
|
+
color: muted,
|
|
97
|
+
fontSize: 12
|
|
98
|
+
}, numberOfLines: 2, children: item.address }) : null
|
|
99
|
+
] })
|
|
100
|
+
] }, item.id))
|
|
101
|
+
] });
|
|
102
|
+
}
|
|
103
|
+
const styles = StyleSheet.create({
|
|
104
|
+
body: {
|
|
105
|
+
padding: 16,
|
|
106
|
+
gap: 10,
|
|
107
|
+
paddingBottom: 80
|
|
108
|
+
},
|
|
109
|
+
title: {
|
|
110
|
+
fontSize: 18,
|
|
111
|
+
fontWeight: "800"
|
|
112
|
+
},
|
|
113
|
+
row: {
|
|
114
|
+
flexDirection: "row",
|
|
115
|
+
gap: 8
|
|
116
|
+
},
|
|
117
|
+
input: {
|
|
118
|
+
flex: 1,
|
|
119
|
+
backgroundColor: "#fff",
|
|
120
|
+
borderRadius: 12,
|
|
121
|
+
paddingHorizontal: 12,
|
|
122
|
+
paddingVertical: 10
|
|
123
|
+
},
|
|
124
|
+
go: {
|
|
125
|
+
backgroundColor: "#f59e0b",
|
|
126
|
+
borderRadius: 12,
|
|
127
|
+
paddingHorizontal: 14,
|
|
128
|
+
justifyContent: "center"
|
|
129
|
+
},
|
|
130
|
+
goText: {
|
|
131
|
+
fontWeight: "800",
|
|
132
|
+
color: "#1a1408"
|
|
133
|
+
},
|
|
134
|
+
card: {
|
|
135
|
+
flexDirection: "row",
|
|
136
|
+
gap: 10,
|
|
137
|
+
borderWidth: 1,
|
|
138
|
+
borderRadius: 14,
|
|
139
|
+
padding: 10
|
|
140
|
+
},
|
|
141
|
+
thumb: {
|
|
142
|
+
width: 64,
|
|
143
|
+
height: 64,
|
|
144
|
+
borderRadius: 10
|
|
145
|
+
},
|
|
146
|
+
cat: {
|
|
147
|
+
fontSize: 10,
|
|
148
|
+
fontWeight: "700",
|
|
149
|
+
textTransform: "uppercase"
|
|
150
|
+
},
|
|
151
|
+
name: {
|
|
152
|
+
fontSize: 14,
|
|
153
|
+
fontWeight: "700"
|
|
154
|
+
}
|
|
155
|
+
});export{DiscoverPanel};//# sourceMappingURL=DiscoverPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiscoverPanel.js","sources":["../../../src/features/travel/DiscoverPanel.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { ActivityIndicator, Linking, Pressable, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { Image } from 'expo-image';\nimport {\n discoverExperiencesViaConnector,\n discoverSocialViaConnector,\n type ResortifiDiscoverExperience,\n type ResortifiDiscoverSocialPost,\n} from './services/resortifiConnectorClient';\n\nexport function DiscoverPanel({\n card,\n border,\n ink,\n muted,\n}: {\n card: string;\n border: string;\n ink: string;\n muted: string;\n}) {\n const [query, setQuery] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [items, setItems] = useState<ResortifiDiscoverExperience[]>([]);\n const [posts, setPosts] = useState<ResortifiDiscoverSocialPost[]>([]);\n\n const run = async () => {\n const place = query.trim();\n if (!place) return;\n setLoading(true);\n setError(null);\n try {\n const [result, social] = await Promise.all([\n discoverExperiencesViaConnector({\n location: place,\n categories: ['attractions', 'restaurants', 'transport'],\n }),\n discoverSocialViaConnector({ location: place }).catch(() => ({\n posts: [] as ResortifiDiscoverSocialPost[],\n })),\n ]);\n setItems([...result.attractions, ...result.restaurants, ...result.transport]);\n setPosts(social.posts);\n } catch (err) {\n setItems([]);\n setPosts([]);\n setError(err instanceof Error ? err.message : 'Discover search failed.');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <ScrollView contentContainerStyle={styles.body} keyboardShouldPersistTaps=\"handled\">\n <Text style={[styles.title, { color: ink }]}>Discover</Text>\n <Text style={{ color: muted }}>\n Attractions, dining, and transport for a destination — same connector as web Travel.\n </Text>\n <View style={styles.row}>\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder=\"Lisbon, Portugal\"\n placeholderTextColor=\"#94a3b8\"\n style={styles.input}\n returnKeyType=\"search\"\n onSubmitEditing={() => void run()}\n />\n <Pressable onPress={() => void run()} style={styles.go}>\n <Text style={styles.goText}>Go</Text>\n </Pressable>\n </View>\n {loading ? <ActivityIndicator /> : null}\n {error ? <Text style={{ color: muted }}>{error}</Text> : null}\n {posts.length ? <Text style={[styles.title, { color: ink, fontSize: 15 }]}>Trending social</Text> : null}\n {posts.map((post) => (\n <Pressable\n key={post.id}\n onPress={() => post.url && void Linking.openURL(post.url)}\n style={[styles.card, { backgroundColor: card, borderColor: border }]}\n >\n {post.content.imageUrl ? (\n <Image source={{ uri: post.content.imageUrl }} style={styles.thumb} contentFit=\"cover\" />\n ) : null}\n <View style={{ flex: 1, gap: 4 }}>\n <Text style={[styles.cat, { color: muted }]}>{post.platform}</Text>\n <Text style={[styles.name, { color: ink }]}>{post.content.username}</Text>\n {post.content.caption ? (\n <Text style={{ color: muted, fontSize: 12 }} numberOfLines={3}>\n {post.content.caption}\n </Text>\n ) : null}\n </View>\n </Pressable>\n ))}\n {items.map((item) => (\n <Pressable\n key={item.id}\n onPress={() => item.url && void Linking.openURL(item.url)}\n style={[styles.card, { backgroundColor: card, borderColor: border }]}\n >\n {item.image ? <Image source={{ uri: item.image }} style={styles.thumb} contentFit=\"cover\" /> : null}\n <View style={{ flex: 1, gap: 4 }}>\n <Text style={[styles.cat, { color: muted }]}>{item.category}</Text>\n <Text style={[styles.name, { color: ink }]}>{item.name}</Text>\n {item.address ? (\n <Text style={{ color: muted, fontSize: 12 }} numberOfLines={2}>\n {item.address}\n </Text>\n ) : null}\n </View>\n </Pressable>\n ))}\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create({\n body: { padding: 16, gap: 10, paddingBottom: 80 },\n title: { fontSize: 18, fontWeight: '800' },\n row: { flexDirection: 'row', gap: 8 },\n input: { flex: 1, backgroundColor: '#fff', borderRadius: 12, paddingHorizontal: 12, paddingVertical: 10 },\n go: { backgroundColor: '#f59e0b', borderRadius: 12, paddingHorizontal: 14, justifyContent: 'center' },\n goText: { fontWeight: '800', color: '#1a1408' },\n card: { flexDirection: 'row', gap: 10, borderWidth: 1, borderRadius: 14, padding: 10 },\n thumb: { width: 64, height: 64, borderRadius: 10 },\n cat: { fontSize: 10, fontWeight: '700', textTransform: 'uppercase' },\n name: { fontSize: 14, fontWeight: '700' },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {jsx,jsxs}from'react/jsx-runtime';import {StyleSheet,View,Pressable,Text}from'react-native';import {compactMarkerPrice,formatDurationShort}from'./flightDeals.js';const CHIP_DEFS = [{
|
|
2
|
+
key: "cheapest",
|
|
3
|
+
label: "Cheapest",
|
|
4
|
+
accent: "#047857"
|
|
5
|
+
}, {
|
|
6
|
+
key: "best",
|
|
7
|
+
label: "Best value",
|
|
8
|
+
accent: "#2563eb"
|
|
9
|
+
}, {
|
|
10
|
+
key: "fastest",
|
|
11
|
+
label: "Fastest",
|
|
12
|
+
accent: "#7c3aed"
|
|
13
|
+
}];
|
|
14
|
+
function airlineOf(offer) {
|
|
15
|
+
var _a;
|
|
16
|
+
const head = (_a = offer.title.split(/\s+[·—–]\s+/)[0]) == null ? void 0 : _a.trim();
|
|
17
|
+
return head && head.length <= 30 ? head : void 0;
|
|
18
|
+
}
|
|
19
|
+
function stopsText(stops) {
|
|
20
|
+
if (stops == null) return void 0;
|
|
21
|
+
if (stops <= 0) return "Nonstop";
|
|
22
|
+
return stops === 1 ? "1 stop" : `${stops} stops`;
|
|
23
|
+
}
|
|
24
|
+
function FlightCompareBar({
|
|
25
|
+
deals,
|
|
26
|
+
sort,
|
|
27
|
+
onPick,
|
|
28
|
+
ink,
|
|
29
|
+
muted,
|
|
30
|
+
card,
|
|
31
|
+
border
|
|
32
|
+
}) {
|
|
33
|
+
const offers = {
|
|
34
|
+
cheapest: deals.cheapest,
|
|
35
|
+
best: deals.best,
|
|
36
|
+
fastest: deals.fastest
|
|
37
|
+
};
|
|
38
|
+
const chips = CHIP_DEFS.filter((c) => offers[c.key]);
|
|
39
|
+
if (chips.length < 2) return null;
|
|
40
|
+
return /* @__PURE__ */ jsx(View, { style: styles.row, testID: "flight-compare-bar", children: chips.map(({
|
|
41
|
+
key,
|
|
42
|
+
label,
|
|
43
|
+
accent
|
|
44
|
+
}) => {
|
|
45
|
+
const offer = offers[key];
|
|
46
|
+
const price = compactMarkerPrice(offer.priceLabel, offer.price);
|
|
47
|
+
const meta = [airlineOf(offer), formatDurationShort(offer.durationMinutes), stopsText(offer.stops)].filter(Boolean).join(" \xB7 ");
|
|
48
|
+
const active = sort === key;
|
|
49
|
+
return /* @__PURE__ */ jsxs(Pressable, { onPress: () => onPick(key, offer.id), style: [styles.chip, {
|
|
50
|
+
backgroundColor: card,
|
|
51
|
+
borderColor: active ? accent : border
|
|
52
|
+
}], children: [
|
|
53
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.label, {
|
|
54
|
+
color: accent
|
|
55
|
+
}], children: label }),
|
|
56
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.price, {
|
|
57
|
+
color: ink
|
|
58
|
+
}], children: price }),
|
|
59
|
+
meta ? /* @__PURE__ */ jsx(Text, { style: {
|
|
60
|
+
color: muted,
|
|
61
|
+
fontSize: 11
|
|
62
|
+
}, children: meta }) : null
|
|
63
|
+
] }, key);
|
|
64
|
+
}) });
|
|
65
|
+
}
|
|
66
|
+
const styles = StyleSheet.create({
|
|
67
|
+
row: {
|
|
68
|
+
flexDirection: "row",
|
|
69
|
+
gap: 8
|
|
70
|
+
},
|
|
71
|
+
chip: {
|
|
72
|
+
flex: 1,
|
|
73
|
+
borderWidth: 1,
|
|
74
|
+
borderRadius: 12,
|
|
75
|
+
padding: 8,
|
|
76
|
+
gap: 2
|
|
77
|
+
},
|
|
78
|
+
label: {
|
|
79
|
+
fontSize: 11,
|
|
80
|
+
fontWeight: "800"
|
|
81
|
+
},
|
|
82
|
+
price: {
|
|
83
|
+
fontSize: 15,
|
|
84
|
+
fontWeight: "800"
|
|
85
|
+
}
|
|
86
|
+
});export{FlightCompareBar};//# sourceMappingURL=FlightCompareBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlightCompareBar.js","sources":["../../../src/features/travel/FlightCompareBar.tsx"],"sourcesContent":["import React from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\nimport type { TravelProperty } from './types';\nimport { type FlightDealSummary, type FlightSort, compactMarkerPrice, formatDurationShort } from './flightDeals';\n\nconst CHIP_DEFS: Array<{ key: FlightSort; label: string; accent: string }> = [\n { key: 'cheapest', label: 'Cheapest', accent: '#047857' },\n { key: 'best', label: 'Best value', accent: '#2563eb' },\n { key: 'fastest', label: 'Fastest', accent: '#7c3aed' },\n];\n\nfunction airlineOf(offer: TravelProperty): string | undefined {\n const head = offer.title.split(/\\s+[·—–]\\s+/)[0]?.trim();\n return head && head.length <= 30 ? head : undefined;\n}\n\nfunction stopsText(stops?: number): string | undefined {\n if (stops == null) return undefined;\n if (stops <= 0) return 'Nonstop';\n return stops === 1 ? '1 stop' : `${stops} stops`;\n}\n\nexport function FlightCompareBar({\n deals,\n sort,\n onPick,\n ink,\n muted,\n card,\n border,\n}: {\n deals: FlightDealSummary;\n sort: FlightSort;\n onPick: (sort: FlightSort, offerId: string) => void;\n ink: string;\n muted: string;\n card: string;\n border: string;\n}) {\n const offers: Partial<Record<FlightSort, TravelProperty>> = {\n cheapest: deals.cheapest,\n best: deals.best,\n fastest: deals.fastest,\n };\n const chips = CHIP_DEFS.filter((c) => offers[c.key]);\n if (chips.length < 2) return null;\n\n return (\n <View style={styles.row} testID=\"flight-compare-bar\">\n {chips.map(({ key, label, accent }) => {\n const offer = offers[key]!;\n const price = compactMarkerPrice(offer.priceLabel, offer.price);\n const meta = [airlineOf(offer), formatDurationShort(offer.durationMinutes), stopsText(offer.stops)]\n .filter(Boolean)\n .join(' · ');\n const active = sort === key;\n return (\n <Pressable\n key={key}\n onPress={() => onPick(key, offer.id)}\n style={[styles.chip, { backgroundColor: card, borderColor: active ? accent : border }]}\n >\n <Text style={[styles.label, { color: accent }]}>{label}</Text>\n <Text style={[styles.price, { color: ink }]}>{price}</Text>\n {meta ? <Text style={{ color: muted, fontSize: 11 }}>{meta}</Text> : null}\n </Pressable>\n );\n })}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n row: { flexDirection: 'row', gap: 8 },\n chip: { flex: 1, borderWidth: 1, borderRadius: 12, padding: 8, gap: 2 },\n label: { fontSize: 11, fontWeight: '800' },\n price: { fontSize: 15, fontWeight: '800' },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useState,useEffect}from'react';import {StyleSheet,View,Text,Pressable,ActivityIndicator}from'react-native';import {DEAL_BOARD_DESTINATIONS,fetchFlightDeal}from'./services/flightDealsBoard.js';import {DEFAULT_FLIGHT_ORIGIN,ensureFlightOrigin}from'./services/resolveOriginCity.js';function FlightDealsBoard({
|
|
2
|
+
ink,
|
|
3
|
+
muted,
|
|
4
|
+
card,
|
|
5
|
+
border,
|
|
6
|
+
originHint,
|
|
7
|
+
onSelectRoute
|
|
8
|
+
}) {
|
|
9
|
+
const [origin, setOrigin] = useState((originHint == null ? void 0 : originHint.trim()) || DEFAULT_FLIGHT_ORIGIN);
|
|
10
|
+
const [deals, setDeals] = useState([]);
|
|
11
|
+
const [loading, setLoading] = useState(true);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
let cancelled = false;
|
|
14
|
+
void ensureFlightOrigin(originHint).then((from) => {
|
|
15
|
+
if (!cancelled) setOrigin(from);
|
|
16
|
+
});
|
|
17
|
+
return () => {
|
|
18
|
+
cancelled = true;
|
|
19
|
+
};
|
|
20
|
+
}, [originHint]);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
let cancelled = false;
|
|
23
|
+
setDeals([]);
|
|
24
|
+
setLoading(true);
|
|
25
|
+
void (async () => {
|
|
26
|
+
const next = [];
|
|
27
|
+
for (const dest of DEAL_BOARD_DESTINATIONS) {
|
|
28
|
+
if (cancelled) return;
|
|
29
|
+
const cardRow = await fetchFlightDeal(origin, dest);
|
|
30
|
+
if (cancelled || !cardRow) continue;
|
|
31
|
+
next.push(cardRow);
|
|
32
|
+
setDeals([...next]);
|
|
33
|
+
}
|
|
34
|
+
if (!cancelled) setLoading(false);
|
|
35
|
+
})();
|
|
36
|
+
return () => {
|
|
37
|
+
cancelled = true;
|
|
38
|
+
};
|
|
39
|
+
}, [origin]);
|
|
40
|
+
return /* @__PURE__ */ jsxs(View, { style: {
|
|
41
|
+
gap: 8
|
|
42
|
+
}, children: [
|
|
43
|
+
/* @__PURE__ */ jsxs(Text, { style: [styles.title, {
|
|
44
|
+
color: ink
|
|
45
|
+
}], children: [
|
|
46
|
+
"Cheap flights from ",
|
|
47
|
+
origin
|
|
48
|
+
] }),
|
|
49
|
+
/* @__PURE__ */ jsx(Text, { style: {
|
|
50
|
+
color: muted,
|
|
51
|
+
fontSize: 12
|
|
52
|
+
}, children: "Live fares from the same flight-search connector as web." }),
|
|
53
|
+
deals.map((deal) => /* @__PURE__ */ jsxs(Pressable, { onPress: () => onSelectRoute(origin, deal.destinationQuery), style: [styles.row, {
|
|
54
|
+
backgroundColor: card,
|
|
55
|
+
borderColor: border
|
|
56
|
+
}], children: [
|
|
57
|
+
/* @__PURE__ */ jsxs(View, { style: {
|
|
58
|
+
flex: 1
|
|
59
|
+
}, children: [
|
|
60
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.dest, {
|
|
61
|
+
color: ink
|
|
62
|
+
}], children: deal.destinationLabel }),
|
|
63
|
+
/* @__PURE__ */ jsxs(Text, { style: {
|
|
64
|
+
color: muted,
|
|
65
|
+
fontSize: 12
|
|
66
|
+
}, children: [
|
|
67
|
+
deal.departDate,
|
|
68
|
+
" \u2192 ",
|
|
69
|
+
deal.returnDate
|
|
70
|
+
] })
|
|
71
|
+
] }),
|
|
72
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.price, {
|
|
73
|
+
color: ink
|
|
74
|
+
}], children: deal.empty ? "\u2014" : deal.priceLabel || (deal.price != null ? `$${Math.round(deal.price)}` : "\u2026") })
|
|
75
|
+
] }, deal.destinationCode)),
|
|
76
|
+
loading ? /* @__PURE__ */ jsx(ActivityIndicator, {}) : null
|
|
77
|
+
] });
|
|
78
|
+
}
|
|
79
|
+
const styles = StyleSheet.create({
|
|
80
|
+
title: {
|
|
81
|
+
fontSize: 16,
|
|
82
|
+
fontWeight: "800"
|
|
83
|
+
},
|
|
84
|
+
row: {
|
|
85
|
+
flexDirection: "row",
|
|
86
|
+
alignItems: "center",
|
|
87
|
+
borderWidth: 1,
|
|
88
|
+
borderRadius: 12,
|
|
89
|
+
padding: 12,
|
|
90
|
+
gap: 8
|
|
91
|
+
},
|
|
92
|
+
dest: {
|
|
93
|
+
fontSize: 15,
|
|
94
|
+
fontWeight: "700"
|
|
95
|
+
},
|
|
96
|
+
price: {
|
|
97
|
+
fontSize: 16,
|
|
98
|
+
fontWeight: "800"
|
|
99
|
+
}
|
|
100
|
+
});export{FlightDealsBoard};//# sourceMappingURL=FlightDealsBoard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlightDealsBoard.js","sources":["../../../src/features/travel/FlightDealsBoard.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { ActivityIndicator, Pressable, StyleSheet, Text, View } from 'react-native';\nimport { DEAL_BOARD_DESTINATIONS, fetchFlightDeal, type FlightDealCard } from './services/flightDealsBoard';\nimport { DEFAULT_FLIGHT_ORIGIN, ensureFlightOrigin } from './services/resolveOriginCity';\n\nexport function FlightDealsBoard({\n ink,\n muted,\n card,\n border,\n originHint,\n onSelectRoute,\n}: {\n ink: string;\n muted: string;\n card: string;\n border: string;\n originHint?: string;\n onSelectRoute: (origin: string, destination: string) => void;\n}) {\n const [origin, setOrigin] = useState(originHint?.trim() || DEFAULT_FLIGHT_ORIGIN);\n const [deals, setDeals] = useState<FlightDealCard[]>([]);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n void ensureFlightOrigin(originHint).then((from) => {\n if (!cancelled) setOrigin(from);\n });\n return () => {\n cancelled = true;\n };\n }, [originHint]);\n\n useEffect(() => {\n let cancelled = false;\n setDeals([]);\n setLoading(true);\n void (async () => {\n const next: FlightDealCard[] = [];\n for (const dest of DEAL_BOARD_DESTINATIONS) {\n if (cancelled) return;\n const cardRow = await fetchFlightDeal(origin, dest);\n if (cancelled || !cardRow) continue;\n next.push(cardRow);\n setDeals([...next]);\n }\n if (!cancelled) setLoading(false);\n })();\n return () => {\n cancelled = true;\n };\n }, [origin]);\n\n return (\n <View style={{ gap: 8 }}>\n <Text style={[styles.title, { color: ink }]}>Cheap flights from {origin}</Text>\n <Text style={{ color: muted, fontSize: 12 }}>Live fares from the same flight-search connector as web.</Text>\n {deals.map((deal) => (\n <Pressable\n key={deal.destinationCode}\n onPress={() => onSelectRoute(origin, deal.destinationQuery)}\n style={[styles.row, { backgroundColor: card, borderColor: border }]}\n >\n <View style={{ flex: 1 }}>\n <Text style={[styles.dest, { color: ink }]}>{deal.destinationLabel}</Text>\n <Text style={{ color: muted, fontSize: 12 }}>\n {deal.departDate} → {deal.returnDate}\n </Text>\n </View>\n <Text style={[styles.price, { color: ink }]}>\n {deal.empty\n ? '—'\n : deal.priceLabel || (deal.price != null ? `$${Math.round(deal.price)}` : '…')}\n </Text>\n </Pressable>\n ))}\n {loading ? <ActivityIndicator /> : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n title: { fontSize: 16, fontWeight: '800' },\n row: { flexDirection: 'row', alignItems: 'center', borderWidth: 1, borderRadius: 12, padding: 12, gap: 8 },\n dest: { fontSize: 15, fontWeight: '700' },\n price: { fontSize: 16, fontWeight: '800' },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useMemo}from'react';import {StyleSheet,ScrollView,View,Text,Pressable}from'react-native';import {useTravelHistory,clearTravelHistory}from'./travelHistoryStore.js';import {timeAgo}from'../shopping/timeAgo.js';function HistoryPanel({
|
|
2
|
+
onRerunSearch,
|
|
3
|
+
onOpenDetails,
|
|
4
|
+
card,
|
|
5
|
+
border,
|
|
6
|
+
ink,
|
|
7
|
+
muted
|
|
8
|
+
}) {
|
|
9
|
+
const {
|
|
10
|
+
searches,
|
|
11
|
+
views
|
|
12
|
+
} = useTravelHistory();
|
|
13
|
+
const now = useMemo(() => Date.now(), [searches, views]);
|
|
14
|
+
const empty = searches.length === 0 && views.length === 0;
|
|
15
|
+
return /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: styles.body, children: [
|
|
16
|
+
/* @__PURE__ */ jsxs(View, { style: styles.head, children: [
|
|
17
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
18
|
+
color: ink
|
|
19
|
+
}], children: "History" }),
|
|
20
|
+
!empty ? /* @__PURE__ */ jsx(Pressable, { onPress: clearTravelHistory, accessibilityRole: "button", children: /* @__PURE__ */ jsx(Text, { style: styles.clear, children: "Clear" }) }) : null
|
|
21
|
+
] }),
|
|
22
|
+
empty ? /* @__PURE__ */ jsx(Text, { style: {
|
|
23
|
+
color: muted
|
|
24
|
+
}, children: "Searches and viewed options will show up here." }) : null,
|
|
25
|
+
searches.map((entry) => /* @__PURE__ */ jsxs(Pressable, { onPress: () => onRerunSearch(entry), style: [styles.row, {
|
|
26
|
+
backgroundColor: card,
|
|
27
|
+
borderColor: border
|
|
28
|
+
}], children: [
|
|
29
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.rowTitle, {
|
|
30
|
+
color: ink
|
|
31
|
+
}], children: entry.query }),
|
|
32
|
+
/* @__PURE__ */ jsxs(Text, { style: {
|
|
33
|
+
color: muted,
|
|
34
|
+
fontSize: 12
|
|
35
|
+
}, children: [
|
|
36
|
+
timeAgo(entry.ts, now),
|
|
37
|
+
entry.resultCount != null ? ` \xB7 ${entry.resultCount} results` : ""
|
|
38
|
+
] })
|
|
39
|
+
] }, entry.id)),
|
|
40
|
+
views.map((entry) => /* @__PURE__ */ jsxs(Pressable, { onPress: () => onOpenDetails(entry.property), style: [styles.row, {
|
|
41
|
+
backgroundColor: card,
|
|
42
|
+
borderColor: border
|
|
43
|
+
}], children: [
|
|
44
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.rowTitle, {
|
|
45
|
+
color: ink
|
|
46
|
+
}], numberOfLines: 2, children: entry.property.title }),
|
|
47
|
+
/* @__PURE__ */ jsx(Text, { style: {
|
|
48
|
+
color: muted,
|
|
49
|
+
fontSize: 12
|
|
50
|
+
}, children: timeAgo(entry.ts, now) })
|
|
51
|
+
] }, entry.id))
|
|
52
|
+
] });
|
|
53
|
+
}
|
|
54
|
+
const styles = StyleSheet.create({
|
|
55
|
+
body: {
|
|
56
|
+
padding: 16,
|
|
57
|
+
gap: 10
|
|
58
|
+
},
|
|
59
|
+
head: {
|
|
60
|
+
flexDirection: "row",
|
|
61
|
+
justifyContent: "space-between",
|
|
62
|
+
alignItems: "center"
|
|
63
|
+
},
|
|
64
|
+
title: {
|
|
65
|
+
fontSize: 18,
|
|
66
|
+
fontWeight: "800"
|
|
67
|
+
},
|
|
68
|
+
clear: {
|
|
69
|
+
color: "#2563eb",
|
|
70
|
+
fontWeight: "600"
|
|
71
|
+
},
|
|
72
|
+
row: {
|
|
73
|
+
borderWidth: 1,
|
|
74
|
+
borderRadius: 12,
|
|
75
|
+
padding: 12,
|
|
76
|
+
gap: 4
|
|
77
|
+
},
|
|
78
|
+
rowTitle: {
|
|
79
|
+
fontSize: 14,
|
|
80
|
+
fontWeight: "600"
|
|
81
|
+
}
|
|
82
|
+
});export{HistoryPanel};//# sourceMappingURL=HistoryPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HistoryPanel.js","sources":["../../../src/features/travel/HistoryPanel.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport type { TravelProperty } from './types';\nimport { clearTravelHistory, useTravelHistory, type SearchHistoryEntry } from './travelHistoryStore';\nimport { timeAgo } from '../shopping/timeAgo';\n\nexport function HistoryPanel({\n onRerunSearch,\n onOpenDetails,\n card,\n border,\n ink,\n muted,\n}: {\n onRerunSearch: (entry: SearchHistoryEntry) => void;\n onOpenDetails: (property: TravelProperty) => void;\n card: string;\n border: string;\n ink: string;\n muted: string;\n}) {\n const { searches, views } = useTravelHistory();\n const now = useMemo(() => Date.now(), [searches, views]);\n const empty = searches.length === 0 && views.length === 0;\n\n return (\n <ScrollView contentContainerStyle={styles.body}>\n <View style={styles.head}>\n <Text style={[styles.title, { color: ink }]}>History</Text>\n {!empty ? (\n <Pressable onPress={clearTravelHistory} accessibilityRole=\"button\">\n <Text style={styles.clear}>Clear</Text>\n </Pressable>\n ) : null}\n </View>\n {empty ? <Text style={{ color: muted }}>Searches and viewed options will show up here.</Text> : null}\n {searches.map((entry) => (\n <Pressable\n key={entry.id}\n onPress={() => onRerunSearch(entry)}\n style={[styles.row, { backgroundColor: card, borderColor: border }]}\n >\n <Text style={[styles.rowTitle, { color: ink }]}>{entry.query}</Text>\n <Text style={{ color: muted, fontSize: 12 }}>\n {timeAgo(entry.ts, now)}\n {entry.resultCount != null ? ` · ${entry.resultCount} results` : ''}\n </Text>\n </Pressable>\n ))}\n {views.map((entry) => (\n <Pressable\n key={entry.id}\n onPress={() => onOpenDetails(entry.property)}\n style={[styles.row, { backgroundColor: card, borderColor: border }]}\n >\n <Text style={[styles.rowTitle, { color: ink }]} numberOfLines={2}>\n {entry.property.title}\n </Text>\n <Text style={{ color: muted, fontSize: 12 }}>{timeAgo(entry.ts, now)}</Text>\n </Pressable>\n ))}\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create({\n body: { padding: 16, gap: 10 },\n head: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' },\n title: { fontSize: 18, fontWeight: '800' },\n clear: { color: '#2563eb', fontWeight: '600' },\n row: { borderWidth: 1, borderRadius: 12, padding: 12, gap: 4 },\n rowTitle: { fontSize: 14, fontWeight: '600' },\n});\n"],"names":[],"mappings":"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"}
|