@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 @@
|
|
|
1
|
+
{"version":3,"file":"shoppingChatReply.js","sources":["../../../../src/features/shopping/services/shoppingChatReply.ts"],"sourcesContent":["/**\n * Shopping agent conversational lane — native twin of surface `shoppingChatReply.ts`.\n * Uses `/resources/yantra-brain-complete` when available; falls back to a static line.\n */\nimport { brainCompleteViaBrain } from '../../../services/brainQuickReply';\n\nconst SHOPPING_AGENT_SYSTEM_PROMPT =\n 'You are the Yantra shopping agent. You search and compare real products across Amazon, Walmart, ' +\n 'eBay, Target, Shopify and Google Shopping, track prices over time, and manage a cart, watchlist and order history. ' +\n 'This particular message is NOT a product search — it is conversation (a greeting, small talk, a question about ' +\n 'you or about shopping in general). Answer it directly, warmly and briefly, the way a knowledgeable shop ' +\n 'assistant would. Two or three sentences at most, plain text, no markdown headings and no bullet lists. ' +\n 'Do not invent products, prices, stores or stock — you have not searched anything for this message. ' +\n 'When it fits naturally, close by inviting them to name what they are looking for; never repeat that invitation ' +\n 'twice in one reply, and never announce that you have classified their message.';\n\nexport const SHOPPING_AGENT_FALLBACK =\n 'I am your shopping agent — tell me what you are after and I will search Amazon, Walmart, eBay, Target and more, ' +\n 'compare prices and keep watching them for you.';\n\nconst HISTORY_TURNS = 6;\nconst REPLY_MAX_TOKENS = 220;\nconst REPLY_TIMEOUT_MS = 12_000;\n\nexport interface ShoppingChatTurn {\n role: 'user' | 'assistant';\n content: string;\n}\n\nexport async function replyToNonShoppingTurn(\n text: string,\n history: readonly ShoppingChatTurn[] = [],\n opts: { signal?: AbortSignal } = {},\n): Promise<string | null> {\n const trimmed = (text || '').trim();\n if (!trimmed) return null;\n\n const messages = [\n { role: 'system' as const, content: SHOPPING_AGENT_SYSTEM_PROMPT },\n ...history\n .slice(-HISTORY_TURNS)\n .filter((turn) => turn.content.trim())\n .map((turn) => ({ role: turn.role, content: turn.content })),\n { role: 'user' as const, content: trimmed },\n ];\n\n try {\n const reply = await brainCompleteViaBrain(messages, {\n maxTokens: REPLY_MAX_TOKENS,\n timeoutMs: REPLY_TIMEOUT_MS,\n ...(opts.signal ? { signal: opts.signal } : {}),\n });\n const answer = reply?.trim();\n return answer ? answer : null;\n } catch {\n return null;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAKA,MAAM,4BAA+B,GAAA,6zBAAA;AAC9B,MAAM,uBAA0B,GAAA;AAEvC,MAAM,gBAAmB,GAAA,GAAA;AACzB,MAAM,gBAAmB,GAAA,IAAA;AAKzB,eAAsB,uBAAuB,IAAc,EAAA,OAAA,GAAuC,EAAI,EAAA,IAAA,GAElG,EAA4B,EAAA;AAC9B,EAAM,MAAA,OAAA,GAAA,CAAW,IAAQ,IAAA,EAAA,EAAI,IAAK,EAAA;AAClC,EAAI,IAAA,CAAC,SAAgB,OAAA,IAAA;AACrB,EAAA,MAAM,WAAW,CAAC;AAAA,IAChB,IAAM,EAAA,QAAA;AAAA,IACN,OAAS,EAAA;AAAA,GACR,EAAA,GAAG,OAAQ,CAAA,KAAA,CAAM,EAAc,CAAA,CAAE,MAAO,CAAA,CAAA,IAAA,KAAQ,KAAK,OAAQ,CAAA,IAAA,EAAM,CAAA,CAAE,IAAI,CAAS,IAAA,MAAA;AAAA,IACnF,MAAM,IAAK,CAAA,IAAA;AAAA,IACX,SAAS,IAAK,CAAA;AAAA,IACd,CAAG,EAAA;AAAA,IACH,IAAM,EAAA,MAAA;AAAA,IACN,OAAS,EAAA;AAAA,GACV,CAAA;AACD,EAAI,IAAA;AACF,IAAM,MAAA,KAAA,GAAQ,MAAM,qBAAA,CAAsB,QAAU,EAAA,cAAA,CAAA;AAAA,MAClD,SAAW,EAAA,gBAAA;AAAA,MACX,SAAW,EAAA;AAAA,KAAA,EACP,KAAK,MAAS,GAAA;AAAA,MAChB,QAAQ,IAAK,CAAA;AAAA,KACf,GAAI,EACL,CAAA,CAAA;AACD,IAAA,MAAM,SAAS,KAAO,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAA,IAAA,EAAA;AACtB,IAAA,OAAO,SAAS,MAAS,GAAA,IAAA;AAAA,GACnB,CAAA,OAAA,CAAA,EAAA;AACN,IAAO,OAAA,IAAA;AAAA;AAEX"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import {SOURCE_LABELS,departmentBadge,amazonImageUrlFromAsin}from'../catalog.js';import {getShoppingRuntime}from'../shoppingRuntime.js';import {detectRetailerSourceFromUrl}from'./retailerUrl.js';import {invokeShoppingSearchConnector,SHOPPING_SEARCH_ACTIONS}from'./shoppingSearchConnectorClient.js';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 DEPARTMENT_SEARCH_PRESETS = {
|
|
21
|
+
"high-tech": {
|
|
22
|
+
query: "wireless headphones smartphone laptop tablet electronics",
|
|
23
|
+
catalogQuery: "wireless headphones",
|
|
24
|
+
category: "electronics"
|
|
25
|
+
},
|
|
26
|
+
sports: {
|
|
27
|
+
query: "sports gear bicycle backpack football fitness",
|
|
28
|
+
catalogQuery: "backpack",
|
|
29
|
+
category: "sports"
|
|
30
|
+
},
|
|
31
|
+
beauty: {
|
|
32
|
+
query: "skincare serum perfume beauty wellness",
|
|
33
|
+
catalogQuery: "skincare serum",
|
|
34
|
+
category: "beauty"
|
|
35
|
+
},
|
|
36
|
+
"home-garden": {
|
|
37
|
+
query: "outdoor furniture BBQ grill string lights lawn garden",
|
|
38
|
+
catalogQuery: "outdoor furniture",
|
|
39
|
+
category: "home"
|
|
40
|
+
},
|
|
41
|
+
office: {
|
|
42
|
+
query: "standing desk tablet office supplies monitor",
|
|
43
|
+
catalogQuery: "standing desk",
|
|
44
|
+
category: "office"
|
|
45
|
+
},
|
|
46
|
+
toys: {
|
|
47
|
+
query: "toys games building blocks plush kids",
|
|
48
|
+
catalogQuery: "building blocks",
|
|
49
|
+
category: "toys"
|
|
50
|
+
},
|
|
51
|
+
fashion: {
|
|
52
|
+
query: "running shoes sneakers jacket jeans handbag apparel",
|
|
53
|
+
catalogQuery: "running shoes",
|
|
54
|
+
category: "fashion"
|
|
55
|
+
},
|
|
56
|
+
grocery: {
|
|
57
|
+
query: "coffee snacks paper towels laundry detergent household",
|
|
58
|
+
catalogQuery: "coffee",
|
|
59
|
+
category: "grocery"
|
|
60
|
+
},
|
|
61
|
+
auto: {
|
|
62
|
+
query: "car vacuum dash cam power drill tool set automotive",
|
|
63
|
+
catalogQuery: "power drill",
|
|
64
|
+
category: "auto"
|
|
65
|
+
},
|
|
66
|
+
pets: {
|
|
67
|
+
query: "dog food cat litter pet bed chew toys",
|
|
68
|
+
catalogQuery: "dog food",
|
|
69
|
+
category: "pets"
|
|
70
|
+
},
|
|
71
|
+
kitchen: {
|
|
72
|
+
query: "air fryer cookware set knife set blender kitchen",
|
|
73
|
+
catalogQuery: "air fryer",
|
|
74
|
+
category: "kitchen"
|
|
75
|
+
},
|
|
76
|
+
furniture: {
|
|
77
|
+
query: "sofa bookshelf floor lamp coffee table home decor",
|
|
78
|
+
catalogQuery: "sofa",
|
|
79
|
+
category: "furniture"
|
|
80
|
+
},
|
|
81
|
+
baby: {
|
|
82
|
+
query: "stroller car seat baby monitor crib kids clothing",
|
|
83
|
+
catalogQuery: "stroller",
|
|
84
|
+
category: "baby"
|
|
85
|
+
},
|
|
86
|
+
health: {
|
|
87
|
+
query: "fitness tracker protein powder yoga mat dumbbells vitamins",
|
|
88
|
+
catalogQuery: "fitness tracker",
|
|
89
|
+
category: "health"
|
|
90
|
+
},
|
|
91
|
+
gaming: {
|
|
92
|
+
query: "gaming console controller gaming headset graphics card gaming chair",
|
|
93
|
+
catalogQuery: "gaming headset",
|
|
94
|
+
category: "gaming"
|
|
95
|
+
},
|
|
96
|
+
books: {
|
|
97
|
+
query: "bestselling books vinyl records blu-ray audiobooks",
|
|
98
|
+
catalogQuery: "bestselling books",
|
|
99
|
+
category: "books"
|
|
100
|
+
},
|
|
101
|
+
jewelry: {
|
|
102
|
+
query: "smartwatch wristwatch necklace earrings ring jewelry",
|
|
103
|
+
catalogQuery: "wristwatch",
|
|
104
|
+
category: "jewelry"
|
|
105
|
+
},
|
|
106
|
+
travel: {
|
|
107
|
+
query: "carry-on suitcase travel backpack packing cubes luggage",
|
|
108
|
+
catalogQuery: "carry-on suitcase",
|
|
109
|
+
category: "travel"
|
|
110
|
+
},
|
|
111
|
+
music: {
|
|
112
|
+
query: "acoustic guitar digital piano keyboard microphone instruments",
|
|
113
|
+
catalogQuery: "acoustic guitar",
|
|
114
|
+
category: "music"
|
|
115
|
+
},
|
|
116
|
+
camera: {
|
|
117
|
+
query: "mirrorless camera lens drone action camera tripod",
|
|
118
|
+
catalogQuery: "mirrorless camera",
|
|
119
|
+
category: "camera"
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
const DEFAULT_CATALOG_RETAILERS = ["walmart", "target", "best_buy", "kohls", "macys", "woot"];
|
|
123
|
+
function isCatalogConfigured() {
|
|
124
|
+
const runtime = getShoppingRuntime().config.shoppingSearch;
|
|
125
|
+
if (typeof (runtime == null ? void 0 : runtime.catalogEnabled) === "boolean") return runtime.catalogEnabled;
|
|
126
|
+
return !!(runtime == null ? void 0 : runtime.lemmebuyitApiKey);
|
|
127
|
+
}
|
|
128
|
+
function parsePrice(price, priceText) {
|
|
129
|
+
if (typeof price === "number" && Number.isFinite(price) && price > 0) return price;
|
|
130
|
+
if (!priceText) return 0;
|
|
131
|
+
const match = String(priceText).replace(/,/g, "").match(/(\d+(?:\.\d+)?)/);
|
|
132
|
+
return match ? Number.parseFloat(match[1]) : 0;
|
|
133
|
+
}
|
|
134
|
+
function parseRating(rating) {
|
|
135
|
+
if (typeof rating === "number" && Number.isFinite(rating)) return Math.min(5, Math.max(0, rating));
|
|
136
|
+
if (typeof rating === "string") {
|
|
137
|
+
const match = rating.match(/(\d(?:\.\d+)?)/);
|
|
138
|
+
if (match) return Math.min(5, Math.max(0, Number.parseFloat(match[1])));
|
|
139
|
+
}
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
function parseReviews(value) {
|
|
143
|
+
if (typeof value === "number" && Number.isFinite(value) && value > 0) return Math.round(value);
|
|
144
|
+
if (typeof value === "string") {
|
|
145
|
+
const match = value.replace(/,/g, "").match(/(\d+)/);
|
|
146
|
+
if (match) return Number.parseInt(match[1], 10);
|
|
147
|
+
}
|
|
148
|
+
return 0;
|
|
149
|
+
}
|
|
150
|
+
function extractAsin(url, raw) {
|
|
151
|
+
var _a;
|
|
152
|
+
const fromField = raw == null ? void 0 : raw.trim().toUpperCase();
|
|
153
|
+
if (fromField && /^[A-Z0-9]{10}$/.test(fromField)) return fromField;
|
|
154
|
+
const match = url == null ? void 0 : url.match(/\/(?:dp|gp\/product|gp\/aw\/d|product)\/([A-Z0-9]{10})(?:[/?#]|$)/i);
|
|
155
|
+
return (_a = match == null ? void 0 : match[1]) == null ? void 0 : _a.toUpperCase();
|
|
156
|
+
}
|
|
157
|
+
function mapRow(item, source, departmentId, index) {
|
|
158
|
+
var _a, _b, _c;
|
|
159
|
+
const name = (item.title || item.name || "").trim();
|
|
160
|
+
if (!name) return null;
|
|
161
|
+
const dept = departmentBadge(departmentId);
|
|
162
|
+
const url = (_a = item.url) == null ? void 0 : _a.trim();
|
|
163
|
+
const asin = extractAsin(url, item.asin);
|
|
164
|
+
const inferred = detectRetailerSourceFromUrl(url);
|
|
165
|
+
const tagged = source === "google" && inferred ? inferred : source;
|
|
166
|
+
const id = tagged === "catalog" && `cat-${item.retailer || "x"}-${item.sku || item.id || index}` || (asin && tagged === "amazon" ? `amz-${asin}` : `${tagged}-${index}-${name.slice(0, 24).replace(/\s+/g, "-")}`);
|
|
167
|
+
return {
|
|
168
|
+
id,
|
|
169
|
+
name,
|
|
170
|
+
departmentId: dept.id,
|
|
171
|
+
price: parsePrice(item.price, item.priceText || item.priceLabel),
|
|
172
|
+
rating: parseRating(item.rating),
|
|
173
|
+
reviews: parseReviews((_b = item.reviewCount) != null ? _b : item.reviews),
|
|
174
|
+
icon: tagged === "catalog" ? "\u{1F6CD}" : dept.icon,
|
|
175
|
+
accent: tagged === "catalog" ? "#94a3b8" : dept.accent,
|
|
176
|
+
imageUrl: ((_c = item.imageUrl) == null ? void 0 : _c.trim()) || amazonImageUrlFromAsin(asin),
|
|
177
|
+
url,
|
|
178
|
+
asin,
|
|
179
|
+
isPrime: Boolean(item.isPrime),
|
|
180
|
+
sponsored: Boolean(item.isSponsored),
|
|
181
|
+
source: tagged,
|
|
182
|
+
originalPrice: item.originalPrice,
|
|
183
|
+
discountPercent: item.discountPercent,
|
|
184
|
+
currency: item.currency,
|
|
185
|
+
inStock: item.inStock,
|
|
186
|
+
brand: item.brand,
|
|
187
|
+
retailerId: item.retailer,
|
|
188
|
+
sku: item.sku,
|
|
189
|
+
upc: item.upc,
|
|
190
|
+
ean: item.ean,
|
|
191
|
+
gtin: item.gtin,
|
|
192
|
+
mpn: item.mpn
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function mapPayload(data, source, departmentId) {
|
|
196
|
+
var _a, _b;
|
|
197
|
+
if (!data || typeof data !== "object") return [];
|
|
198
|
+
const row = data;
|
|
199
|
+
const fromProducts = ((_a = row.products) != null ? _a : []).map((item, index) => mapRow(item, source, departmentId, index)).filter((p) => p !== null);
|
|
200
|
+
if (fromProducts.length > 0) return fromProducts;
|
|
201
|
+
return ((_b = row.properties) != null ? _b : []).map((item, index) => mapRow(item, source, departmentId, index)).filter((p) => p !== null);
|
|
202
|
+
}
|
|
203
|
+
function normalizeTitleKey(name) {
|
|
204
|
+
return name.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim().slice(0, 80);
|
|
205
|
+
}
|
|
206
|
+
function mergeShoppingProductSources(groups) {
|
|
207
|
+
const seen = /* @__PURE__ */ new Set();
|
|
208
|
+
const merged = [];
|
|
209
|
+
for (const group of groups) {
|
|
210
|
+
for (const product of group) {
|
|
211
|
+
const key = normalizeTitleKey(product.name);
|
|
212
|
+
if (key && seen.has(key)) continue;
|
|
213
|
+
if (key) seen.add(key);
|
|
214
|
+
merged.push(product);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return merged;
|
|
218
|
+
}
|
|
219
|
+
function sanitizeShoppingProviderError(message, label = "Amazon") {
|
|
220
|
+
if (/402|insufficient credit|billing details|add more funds/i.test(message)) {
|
|
221
|
+
return `${label} results are currently unavailable. Please try again later.`;
|
|
222
|
+
}
|
|
223
|
+
return message;
|
|
224
|
+
}
|
|
225
|
+
function resolveQuery(params) {
|
|
226
|
+
const preset = params.departmentId ? DEPARTMENT_SEARCH_PRESETS[params.departmentId] : void 0;
|
|
227
|
+
const trimmed = params.query.trim();
|
|
228
|
+
const query = trimmed || (preset == null ? void 0 : preset.query);
|
|
229
|
+
if (!query) throw new Error("Shopping search requires a query or department");
|
|
230
|
+
return {
|
|
231
|
+
query,
|
|
232
|
+
catalogQuery: trimmed || (preset == null ? void 0 : preset.catalogQuery) || query,
|
|
233
|
+
category: params.category || (preset == null ? void 0 : preset.category)
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
async function searchLane(action, source, params, departmentId) {
|
|
237
|
+
const result = await invokeShoppingSearchConnector(params, action);
|
|
238
|
+
if (!result.success) throw new Error(result.error || `${SOURCE_LABELS[source]} search failed`);
|
|
239
|
+
return mapPayload(result.data, source, departmentId);
|
|
240
|
+
}
|
|
241
|
+
async function searchShoppingProductsFast(params) {
|
|
242
|
+
var _a, _b, _c;
|
|
243
|
+
const {
|
|
244
|
+
query,
|
|
245
|
+
catalogQuery,
|
|
246
|
+
category
|
|
247
|
+
} = resolveQuery(params);
|
|
248
|
+
const shared = __spreadValues(__spreadValues({
|
|
249
|
+
query,
|
|
250
|
+
maxResults: (_a = params.maxResults) != null ? _a : 24,
|
|
251
|
+
maxItems: (_b = params.maxResults) != null ? _b : 48
|
|
252
|
+
}, params.budget != null ? {
|
|
253
|
+
budget: params.budget
|
|
254
|
+
} : {}), category ? {
|
|
255
|
+
category
|
|
256
|
+
} : {});
|
|
257
|
+
const catalogEnabled = isCatalogConfigured();
|
|
258
|
+
const [amazonOutcome, catalogOutcome] = await Promise.allSettled([searchLane(SHOPPING_SEARCH_ACTIONS.AMAZON_LIST, "amazon", __spreadProps(__spreadValues({}, shared), {
|
|
259
|
+
page: 1
|
|
260
|
+
}), params.departmentId), catalogEnabled ? invokeShoppingSearchConnector(__spreadValues({
|
|
261
|
+
retailer: DEFAULT_CATALOG_RETAILERS[0],
|
|
262
|
+
retailers: DEFAULT_CATALOG_RETAILERS.slice(1),
|
|
263
|
+
query: catalogQuery,
|
|
264
|
+
limit: (_c = params.maxResults) != null ? _c : 24,
|
|
265
|
+
sortBy: "relevance"
|
|
266
|
+
}, params.budget != null ? {
|
|
267
|
+
maxPrice: params.budget
|
|
268
|
+
} : {}), SHOPPING_SEARCH_ACTIONS.CATALOG_SEARCH).then((result) => {
|
|
269
|
+
if (!result.success) throw new Error(result.error || "Catalog search failed");
|
|
270
|
+
const data = result.data;
|
|
271
|
+
return {
|
|
272
|
+
products: mapPayload(data, "catalog", params.departmentId),
|
|
273
|
+
affiliateDisclosure: data == null ? void 0 : data.affiliateDisclosure
|
|
274
|
+
};
|
|
275
|
+
}) : Promise.resolve({
|
|
276
|
+
products: [],
|
|
277
|
+
affiliateDisclosure: void 0
|
|
278
|
+
})]);
|
|
279
|
+
const amazon = amazonOutcome.status === "fulfilled" ? amazonOutcome.value : [];
|
|
280
|
+
const catalog = catalogOutcome.status === "fulfilled" ? catalogOutcome.value.products : [];
|
|
281
|
+
const affiliateDisclosure = catalogOutcome.status === "fulfilled" ? catalogOutcome.value.affiliateDisclosure : void 0;
|
|
282
|
+
const products = mergeShoppingProductSources([catalog, amazon]);
|
|
283
|
+
const partialErrors = [catalogEnabled && catalogOutcome.status === "rejected" && !products.some((p) => p.source === "catalog") ? `${SOURCE_LABELS.catalog} results unavailable` : null, amazonOutcome.status === "rejected" && !products.some((p) => p.source === "amazon") ? `${SOURCE_LABELS.amazon} results unavailable` : null].filter(Boolean);
|
|
284
|
+
return __spreadValues(__spreadValues({
|
|
285
|
+
products,
|
|
286
|
+
query
|
|
287
|
+
}, affiliateDisclosure ? {
|
|
288
|
+
affiliateDisclosure
|
|
289
|
+
} : {}), partialErrors.length > 0 ? {
|
|
290
|
+
error: partialErrors.join(" \xB7 ")
|
|
291
|
+
} : {});
|
|
292
|
+
}
|
|
293
|
+
const REST_LANES = [{
|
|
294
|
+
action: SHOPPING_SEARCH_ACTIONS.ANALYZE,
|
|
295
|
+
source: "yantra"
|
|
296
|
+
}, {
|
|
297
|
+
action: SHOPPING_SEARCH_ACTIONS.WALMART_LIST,
|
|
298
|
+
source: "walmart"
|
|
299
|
+
}, {
|
|
300
|
+
action: SHOPPING_SEARCH_ACTIONS.EBAY_LIST,
|
|
301
|
+
source: "ebay"
|
|
302
|
+
}, {
|
|
303
|
+
action: SHOPPING_SEARCH_ACTIONS.TARGET_LIST,
|
|
304
|
+
source: "target"
|
|
305
|
+
}, {
|
|
306
|
+
action: SHOPPING_SEARCH_ACTIONS.GOOGLE_LIST,
|
|
307
|
+
source: "google"
|
|
308
|
+
}];
|
|
309
|
+
async function searchShoppingProductsRest(params) {
|
|
310
|
+
var _a;
|
|
311
|
+
const {
|
|
312
|
+
query,
|
|
313
|
+
category
|
|
314
|
+
} = resolveQuery(params);
|
|
315
|
+
const shared = __spreadValues(__spreadValues({
|
|
316
|
+
query,
|
|
317
|
+
maxResults: (_a = params.maxResults) != null ? _a : 24
|
|
318
|
+
}, params.budget != null ? {
|
|
319
|
+
budget: params.budget
|
|
320
|
+
} : {}), category ? {
|
|
321
|
+
category
|
|
322
|
+
} : {});
|
|
323
|
+
const outcomes = await Promise.allSettled(REST_LANES.map((lane) => searchLane(lane.action, lane.source, shared, params.departmentId)));
|
|
324
|
+
const groups = outcomes.map((outcome, index) => {
|
|
325
|
+
if (outcome.status !== "fulfilled") return [];
|
|
326
|
+
return outcome.value.map((p) => {
|
|
327
|
+
var _a2;
|
|
328
|
+
return __spreadProps(__spreadValues({}, p), {
|
|
329
|
+
source: (_a2 = p.source) != null ? _a2 : REST_LANES[index].source
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
return {
|
|
334
|
+
products: mergeShoppingProductSources(groups)
|
|
335
|
+
};
|
|
336
|
+
}export{DEPARTMENT_SEARCH_PRESETS,detectRetailerSourceFromUrl,isCatalogConfigured,mergeShoppingProductSources,sanitizeShoppingProviderError,searchShoppingProductsFast,searchShoppingProductsRest};//# sourceMappingURL=shoppingProductSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shoppingProductSearch.js","sources":["../../../../src/features/shopping/services/shoppingProductSearch.ts"],"sourcesContent":["import { amazonImageUrlFromAsin, departmentBadge, SOURCE_LABELS, type Product, type ProductSource } from '../catalog';\nimport { getShoppingRuntime } from '../shoppingRuntime';\nimport { detectRetailerSourceFromUrl } from './retailerUrl';\nimport {\n invokeShoppingSearchConnector,\n SHOPPING_SEARCH_ACTIONS,\n type ShoppingSearchConnectorAction,\n} from './shoppingSearchConnectorClient';\n\nexport const DEPARTMENT_SEARCH_PRESETS: Record<string, { query: string; catalogQuery: string; category: string }> = {\n 'high-tech': {\n query: 'wireless headphones smartphone laptop tablet electronics',\n catalogQuery: 'wireless headphones',\n category: 'electronics',\n },\n sports: {\n query: 'sports gear bicycle backpack football fitness',\n catalogQuery: 'backpack',\n category: 'sports',\n },\n beauty: {\n query: 'skincare serum perfume beauty wellness',\n catalogQuery: 'skincare serum',\n category: 'beauty',\n },\n 'home-garden': {\n query: 'outdoor furniture BBQ grill string lights lawn garden',\n catalogQuery: 'outdoor furniture',\n category: 'home',\n },\n office: {\n query: 'standing desk tablet office supplies monitor',\n catalogQuery: 'standing desk',\n category: 'office',\n },\n toys: {\n query: 'toys games building blocks plush kids',\n catalogQuery: 'building blocks',\n category: 'toys',\n },\n fashion: {\n query: 'running shoes sneakers jacket jeans handbag apparel',\n catalogQuery: 'running shoes',\n category: 'fashion',\n },\n grocery: {\n query: 'coffee snacks paper towels laundry detergent household',\n catalogQuery: 'coffee',\n category: 'grocery',\n },\n auto: {\n query: 'car vacuum dash cam power drill tool set automotive',\n catalogQuery: 'power drill',\n category: 'auto',\n },\n pets: {\n query: 'dog food cat litter pet bed chew toys',\n catalogQuery: 'dog food',\n category: 'pets',\n },\n kitchen: {\n query: 'air fryer cookware set knife set blender kitchen',\n catalogQuery: 'air fryer',\n category: 'kitchen',\n },\n furniture: {\n query: 'sofa bookshelf floor lamp coffee table home decor',\n catalogQuery: 'sofa',\n category: 'furniture',\n },\n baby: {\n query: 'stroller car seat baby monitor crib kids clothing',\n catalogQuery: 'stroller',\n category: 'baby',\n },\n health: {\n query: 'fitness tracker protein powder yoga mat dumbbells vitamins',\n catalogQuery: 'fitness tracker',\n category: 'health',\n },\n gaming: {\n query: 'gaming console controller gaming headset graphics card gaming chair',\n catalogQuery: 'gaming headset',\n category: 'gaming',\n },\n books: {\n query: 'bestselling books vinyl records blu-ray audiobooks',\n catalogQuery: 'bestselling books',\n category: 'books',\n },\n jewelry: {\n query: 'smartwatch wristwatch necklace earrings ring jewelry',\n catalogQuery: 'wristwatch',\n category: 'jewelry',\n },\n travel: {\n query: 'carry-on suitcase travel backpack packing cubes luggage',\n catalogQuery: 'carry-on suitcase',\n category: 'travel',\n },\n music: {\n query: 'acoustic guitar digital piano keyboard microphone instruments',\n catalogQuery: 'acoustic guitar',\n category: 'music',\n },\n camera: {\n query: 'mirrorless camera lens drone action camera tripod',\n catalogQuery: 'mirrorless camera',\n category: 'camera',\n },\n};\n\nexport const DEFAULT_BROWSE_QUERY = 'popular products electronics sports beauty home office toys';\n\nconst DEFAULT_CATALOG_RETAILERS = ['walmart', 'target', 'best_buy', 'kohls', 'macys', 'woot'];\n\nexport { detectRetailerSourceFromUrl } from './retailerUrl';\n\nexport function isCatalogConfigured(): boolean {\n const runtime = getShoppingRuntime().config.shoppingSearch;\n if (typeof runtime?.catalogEnabled === 'boolean') return runtime.catalogEnabled;\n return !!runtime?.lemmebuyitApiKey;\n}\n\nexport interface ShoppingSearchParams {\n query: string;\n departmentId?: string;\n budget?: number;\n maxResults?: number;\n category?: string;\n}\n\nfunction parsePrice(price?: number, priceText?: string): number {\n if (typeof price === 'number' && Number.isFinite(price) && price > 0) return price;\n if (!priceText) return 0;\n const match = String(priceText)\n .replace(/,/g, '')\n .match(/(\\d+(?:\\.\\d+)?)/);\n return match ? Number.parseFloat(match[1]) : 0;\n}\n\nfunction parseRating(rating?: number | string): number {\n if (typeof rating === 'number' && Number.isFinite(rating)) return Math.min(5, Math.max(0, rating));\n if (typeof rating === 'string') {\n const match = rating.match(/(\\d(?:\\.\\d+)?)/);\n if (match) return Math.min(5, Math.max(0, Number.parseFloat(match[1])));\n }\n return 0;\n}\n\nfunction parseReviews(value?: number | string): number {\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) return Math.round(value);\n if (typeof value === 'string') {\n const match = value.replace(/,/g, '').match(/(\\d+)/);\n if (match) return Number.parseInt(match[1], 10);\n }\n return 0;\n}\n\nfunction extractAsin(url?: string, raw?: string): string | undefined {\n const fromField = raw?.trim().toUpperCase();\n if (fromField && /^[A-Z0-9]{10}$/.test(fromField)) return fromField;\n const match = url?.match(/\\/(?:dp|gp\\/product|gp\\/aw\\/d|product)\\/([A-Z0-9]{10})(?:[/?#]|$)/i);\n return match?.[1]?.toUpperCase();\n}\n\ninterface LooseProduct {\n id?: string;\n asin?: string;\n title?: string;\n name?: string;\n price?: number;\n priceText?: string;\n priceLabel?: string;\n rating?: number | string;\n reviews?: number | string;\n reviewCount?: number | string;\n imageUrl?: string;\n url?: string;\n isPrime?: boolean;\n isSponsored?: boolean;\n retailer?: string;\n originalPrice?: number;\n discountPercent?: number;\n currency?: string;\n inStock?: boolean;\n brand?: string;\n sku?: string;\n upc?: string;\n ean?: string;\n gtin?: string;\n mpn?: string;\n}\n\nfunction mapRow(\n item: LooseProduct,\n source: ProductSource,\n departmentId: string | undefined,\n index: number,\n): Product | null {\n const name = (item.title || item.name || '').trim();\n if (!name) return null;\n const dept = departmentBadge(departmentId);\n const url = item.url?.trim();\n const asin = extractAsin(url, item.asin);\n const inferred = detectRetailerSourceFromUrl(url);\n const tagged = source === 'google' && inferred ? inferred : source;\n const id =\n (tagged === 'catalog' && `cat-${item.retailer || 'x'}-${item.sku || item.id || index}`) ||\n (asin && tagged === 'amazon' ? `amz-${asin}` : `${tagged}-${index}-${name.slice(0, 24).replace(/\\s+/g, '-')}`);\n\n return {\n id,\n name,\n departmentId: dept.id,\n price: parsePrice(item.price, item.priceText || item.priceLabel),\n rating: parseRating(item.rating),\n reviews: parseReviews(item.reviewCount ?? item.reviews),\n icon: tagged === 'catalog' ? '\\u{1F6CD}' : dept.icon,\n accent: tagged === 'catalog' ? '#94a3b8' : dept.accent,\n imageUrl: item.imageUrl?.trim() || amazonImageUrlFromAsin(asin),\n url,\n asin,\n isPrime: Boolean(item.isPrime),\n sponsored: Boolean(item.isSponsored),\n source: tagged,\n originalPrice: item.originalPrice,\n discountPercent: item.discountPercent,\n currency: item.currency,\n inStock: item.inStock,\n brand: item.brand,\n retailerId: item.retailer,\n sku: item.sku,\n upc: item.upc,\n ean: item.ean,\n gtin: item.gtin,\n mpn: item.mpn,\n };\n}\n\nfunction mapPayload(data: unknown, source: ProductSource, departmentId?: string): Product[] {\n if (!data || typeof data !== 'object') return [];\n const row = data as { products?: LooseProduct[]; properties?: LooseProduct[] };\n const fromProducts = (row.products ?? [])\n .map((item, index) => mapRow(item, source, departmentId, index))\n .filter((p): p is Product => p !== null);\n if (fromProducts.length > 0) return fromProducts;\n return (row.properties ?? [])\n .map((item, index) => mapRow(item, source, departmentId, index))\n .filter((p): p is Product => p !== null);\n}\n\nfunction normalizeTitleKey(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, ' ')\n .trim()\n .slice(0, 80);\n}\n\nexport function mergeShoppingProductSources(groups: Product[][]): Product[] {\n const seen = new Set<string>();\n const merged: Product[] = [];\n for (const group of groups) {\n for (const product of group) {\n const key = normalizeTitleKey(product.name);\n if (key && seen.has(key)) continue;\n if (key) seen.add(key);\n merged.push(product);\n }\n }\n return merged;\n}\n\nexport function sanitizeShoppingProviderError(message: string, label = 'Amazon'): string {\n if (/402|insufficient credit|billing details|add more funds/i.test(message)) {\n return `${label} results are currently unavailable. Please try again later.`;\n }\n return message;\n}\n\nfunction resolveQuery(params: ShoppingSearchParams): { query: string; catalogQuery: string; category?: string } {\n const preset = params.departmentId ? DEPARTMENT_SEARCH_PRESETS[params.departmentId] : undefined;\n const trimmed = params.query.trim();\n const query = trimmed || preset?.query;\n if (!query) throw new Error('Shopping search requires a query or department');\n return {\n query,\n catalogQuery: trimmed || preset?.catalogQuery || query,\n category: params.category || preset?.category,\n };\n}\n\nasync function searchLane(\n action: ShoppingSearchConnectorAction,\n source: ProductSource,\n params: Record<string, unknown>,\n departmentId?: string,\n): Promise<Product[]> {\n const result = await invokeShoppingSearchConnector(params, action);\n if (!result.success) throw new Error(result.error || `${SOURCE_LABELS[source]} search failed`);\n return mapPayload(result.data, source, departmentId);\n}\n\nexport async function searchShoppingProductsFast(params: ShoppingSearchParams): Promise<{\n products: Product[];\n query: string;\n error?: string;\n affiliateDisclosure?: string;\n}> {\n const { query, catalogQuery, category } = resolveQuery(params);\n const shared = {\n query,\n maxResults: params.maxResults ?? 24,\n maxItems: params.maxResults ?? 48,\n ...(params.budget != null ? { budget: params.budget } : {}),\n ...(category ? { category } : {}),\n };\n\n const catalogEnabled = isCatalogConfigured();\n const [amazonOutcome, catalogOutcome] = await Promise.allSettled([\n searchLane(SHOPPING_SEARCH_ACTIONS.AMAZON_LIST, 'amazon', { ...shared, page: 1 }, params.departmentId),\n catalogEnabled\n ? invokeShoppingSearchConnector(\n {\n retailer: DEFAULT_CATALOG_RETAILERS[0],\n retailers: DEFAULT_CATALOG_RETAILERS.slice(1),\n query: catalogQuery,\n limit: params.maxResults ?? 24,\n sortBy: 'relevance',\n ...(params.budget != null ? { maxPrice: params.budget } : {}),\n },\n SHOPPING_SEARCH_ACTIONS.CATALOG_SEARCH,\n ).then((result) => {\n if (!result.success) throw new Error(result.error || 'Catalog search failed');\n const data = result.data as { affiliateDisclosure?: string; products?: LooseProduct[] } | undefined;\n return {\n products: mapPayload(data, 'catalog', params.departmentId),\n affiliateDisclosure: data?.affiliateDisclosure,\n };\n })\n : Promise.resolve({ products: [] as Product[], affiliateDisclosure: undefined as string | undefined }),\n ]);\n\n const amazon = amazonOutcome.status === 'fulfilled' ? amazonOutcome.value : [];\n const catalog = catalogOutcome.status === 'fulfilled' ? catalogOutcome.value.products : [];\n const affiliateDisclosure =\n catalogOutcome.status === 'fulfilled' ? catalogOutcome.value.affiliateDisclosure : undefined;\n const products = mergeShoppingProductSources([catalog, amazon]);\n const partialErrors = [\n catalogEnabled && catalogOutcome.status === 'rejected' && !products.some((p) => p.source === 'catalog')\n ? `${SOURCE_LABELS.catalog} results unavailable`\n : null,\n amazonOutcome.status === 'rejected' && !products.some((p) => p.source === 'amazon')\n ? `${SOURCE_LABELS.amazon} results unavailable`\n : null,\n ].filter(Boolean);\n\n return {\n products,\n query,\n ...(affiliateDisclosure ? { affiliateDisclosure } : {}),\n ...(partialErrors.length > 0 ? { error: partialErrors.join(' · ') } : {}),\n };\n}\n\nconst REST_LANES: Array<{ action: ShoppingSearchConnectorAction; source: ProductSource }> = [\n { action: SHOPPING_SEARCH_ACTIONS.ANALYZE, source: 'yantra' },\n { action: SHOPPING_SEARCH_ACTIONS.WALMART_LIST, source: 'walmart' },\n { action: SHOPPING_SEARCH_ACTIONS.EBAY_LIST, source: 'ebay' },\n { action: SHOPPING_SEARCH_ACTIONS.TARGET_LIST, source: 'target' },\n { action: SHOPPING_SEARCH_ACTIONS.GOOGLE_LIST, source: 'google' },\n];\n\nexport async function searchShoppingProductsRest(params: ShoppingSearchParams): Promise<{ products: Product[] }> {\n const { query, category } = resolveQuery(params);\n const shared = {\n query,\n maxResults: params.maxResults ?? 24,\n ...(params.budget != null ? { budget: params.budget } : {}),\n ...(category ? { category } : {}),\n };\n const outcomes = await Promise.allSettled(\n REST_LANES.map((lane) => searchLane(lane.action, lane.source, shared, params.departmentId)),\n );\n const groups = outcomes.map((outcome, index) => {\n if (outcome.status !== 'fulfilled') return [] as Product[];\n return outcome.value.map((p) => ({ ...p, source: p.source ?? REST_LANES[index].source }));\n });\n return { products: mergeShoppingProductSources(groups) };\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import {getShoppingRuntime}from'../shoppingRuntime.js';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 SHOPPING_SEARCH_CONNECTOR_ID = "yantra-shopping-search";
|
|
21
|
+
const SHOPPING_SEARCH_ACTIONS = {
|
|
22
|
+
ANALYZE: "YANTRA_SHOPPING_SEARCH_ANALYZE",
|
|
23
|
+
AMAZON_LIST: "YANTRA_SHOPPING_SEARCH_AMAZON_LIST",
|
|
24
|
+
WALMART_LIST: "YANTRA_SHOPPING_SEARCH_WALMART_LIST",
|
|
25
|
+
EBAY_LIST: "YANTRA_SHOPPING_SEARCH_EBAY_LIST",
|
|
26
|
+
TARGET_LIST: "YANTRA_SHOPPING_SEARCH_TARGET_LIST",
|
|
27
|
+
GOOGLE_LIST: "YANTRA_SHOPPING_SEARCH_GOOGLE_LIST",
|
|
28
|
+
CATALOG_SEARCH: "YANTRA_SHOPPING_SEARCH_CATALOG_SEARCH",
|
|
29
|
+
DEALS: "YANTRA_SHOPPING_SEARCH_DEALS",
|
|
30
|
+
COMPARE: "YANTRA_SHOPPING_SEARCH_COMPARE",
|
|
31
|
+
PRICE_HISTORY: "YANTRA_SHOPPING_SEARCH_PRICE_HISTORY",
|
|
32
|
+
WATCH_ADD: "YANTRA_SHOPPING_SEARCH_WATCH_ADD",
|
|
33
|
+
WATCH_STATUS: "YANTRA_SHOPPING_SEARCH_WATCH_STATUS"
|
|
34
|
+
};
|
|
35
|
+
async function invokeShoppingSearchConnector(params, action = SHOPPING_SEARCH_ACTIONS.ANALYZE) {
|
|
36
|
+
const runtime = getShoppingRuntime();
|
|
37
|
+
const execParams = __spreadValues(__spreadProps(__spreadValues({}, params), {
|
|
38
|
+
stream: false
|
|
39
|
+
}), runtime.config.shoppingSearch);
|
|
40
|
+
return runtime.exec(SHOPPING_SEARCH_CONNECTOR_ID, action, execParams);
|
|
41
|
+
}export{SHOPPING_SEARCH_ACTIONS,SHOPPING_SEARCH_CONNECTOR_ID,invokeShoppingSearchConnector};//# sourceMappingURL=shoppingSearchConnectorClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shoppingSearchConnectorClient.js","sources":["../../../../src/features/shopping/services/shoppingSearchConnectorClient.ts"],"sourcesContent":["import { getShoppingRuntime } from '../shoppingRuntime';\n\nexport const SHOPPING_SEARCH_CONNECTOR_ID = 'yantra-shopping-search';\n\nexport const SHOPPING_SEARCH_ACTIONS = {\n ANALYZE: 'YANTRA_SHOPPING_SEARCH_ANALYZE',\n AMAZON_LIST: 'YANTRA_SHOPPING_SEARCH_AMAZON_LIST',\n WALMART_LIST: 'YANTRA_SHOPPING_SEARCH_WALMART_LIST',\n EBAY_LIST: 'YANTRA_SHOPPING_SEARCH_EBAY_LIST',\n TARGET_LIST: 'YANTRA_SHOPPING_SEARCH_TARGET_LIST',\n SHOPIFY_LIST: 'YANTRA_SHOPPING_SEARCH_SHOPIFY_LIST',\n GOOGLE_LIST: 'YANTRA_SHOPPING_SEARCH_GOOGLE_LIST',\n CATALOG_SEARCH: 'YANTRA_SHOPPING_SEARCH_CATALOG_SEARCH',\n DEALS: 'YANTRA_SHOPPING_SEARCH_DEALS',\n COMPARE: 'YANTRA_SHOPPING_SEARCH_COMPARE',\n PRICE_HISTORY: 'YANTRA_SHOPPING_SEARCH_PRICE_HISTORY',\n WATCH_ADD: 'YANTRA_SHOPPING_SEARCH_WATCH_ADD',\n WATCH_STATUS: 'YANTRA_SHOPPING_SEARCH_WATCH_STATUS',\n} as const;\n\nexport type ShoppingSearchConnectorAction = (typeof SHOPPING_SEARCH_ACTIONS)[keyof typeof SHOPPING_SEARCH_ACTIONS];\n\nexport async function invokeShoppingSearchConnector<T = unknown>(\n params: Record<string, unknown>,\n action: ShoppingSearchConnectorAction = SHOPPING_SEARCH_ACTIONS.ANALYZE,\n): Promise<{ success: boolean; data?: T; error?: string }> {\n const runtime = getShoppingRuntime();\n const execParams = { ...params, stream: false, ...runtime.config.shoppingSearch };\n return runtime.exec<T>(SHOPPING_SEARCH_CONNECTOR_ID, action, execParams);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AACO,MAAM,4BAA+B,GAAA;AACrC,MAAM,uBAA0B,GAAA;AAAA,EACrC,OAAS,EAAA,gCAAA;AAAA,EACT,WAAa,EAAA,oCAAA;AAAA,EACb,YAAc,EAAA,qCAAA;AAAA,EACd,SAAW,EAAA,kCAAA;AAAA,EACX,WAAa,EAAA,oCAAA;AAAA,EAEb,WAAa,EAAA,oCAAA;AAAA,EACb,cAAgB,EAAA,uCAAA;AAAA,EAChB,KAAO,EAAA,8BAAA;AAAA,EACP,OAAS,EAAA,gCAAA;AAAA,EACT,aAAe,EAAA,sCAAA;AAAA,EACf,SAAW,EAAA,kCAAA;AAAA,EACX,YAAc,EAAA;AAChB;AAEA,eAAsB,6BAA2C,CAAA,MAAA,EAAiC,MAAwC,GAAA,uBAAA,CAAwB,OAI/J,EAAA;AACD,EAAA,MAAM,UAAU,kBAAmB,EAAA;AACnC,EAAM,MAAA,UAAA,GAAa,gDACd,MADc,CAAA,EAAA;AAAA,IAEjB,MAAQ,EAAA;AAAA,GAAA,CAAA,EACL,QAAQ,MAAO,CAAA,cAAA,CAAA;AAEpB,EAAA,OAAO,OAAQ,CAAA,IAAA,CAAQ,4BAA8B,EAAA,MAAA,EAAQ,UAAU,CAAA;AACzE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const SHOP_AGENT_MIN_DX = 48;
|
|
2
|
+
function isOpenAgentSwipe(g, minDx = SHOP_AGENT_MIN_DX) {
|
|
3
|
+
return g.dx <= -minDx && Math.abs(g.dx) > Math.abs(g.dy) * 1.15;
|
|
4
|
+
}
|
|
5
|
+
function shouldClaimOpenAgentMove(g) {
|
|
6
|
+
return g.dx < -10 && Math.abs(g.dx) > Math.abs(g.dy);
|
|
7
|
+
}export{SHOP_AGENT_MIN_DX,isOpenAgentSwipe,shouldClaimOpenAgentMove};//# sourceMappingURL=shopAgentSwipe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shopAgentSwipe.js","sources":["../../../src/features/shopping/shopAgentSwipe.ts"],"sourcesContent":["/** Shop storefront ↔ Shopping Agent swipe. dx > 0 is finger moving right. */\n\nexport const SHOP_AGENT_MIN_DX = 48;\n\n/** Shop: finger starts on the Agent (right) side and moves left. */\nexport function isOpenAgentSwipe(g: { dx: number; dy: number }, minDx = SHOP_AGENT_MIN_DX): boolean {\n return g.dx <= -minDx && Math.abs(g.dx) > Math.abs(g.dy) * 1.15;\n}\n\n/** Agent: finger starts on the left (chip) side and moves right, back to Shop. */\nexport function isCloseAgentSwipe(g: { dx: number; dy: number }, minDx = SHOP_AGENT_MIN_DX): boolean {\n return g.dx >= minDx && Math.abs(g.dx) > Math.abs(g.dy) * 1.15;\n}\n\nexport function shouldClaimOpenAgentMove(g: { dx: number; dy: number }): boolean {\n return g.dx < -10 && Math.abs(g.dx) > Math.abs(g.dy);\n}\n\nexport function shouldClaimCloseAgentMove(g: { dx: number; dy: number }): boolean {\n return g.dx > 10 && Math.abs(g.dx) > Math.abs(g.dy);\n}\n"],"names":[],"mappings":"AAEO,MAAM,iBAAoB,GAAA;AAGjB,SAAA,gBAAA,CAAiB,CAG9B,EAAA,KAAA,GAAQ,iBAA4B,EAAA;AACrC,EAAA,OAAO,CAAE,CAAA,EAAA,IAAM,CAAC,KAAA,IAAS,IAAK,CAAA,GAAA,CAAI,CAAE,CAAA,EAAE,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,CAAE,EAAE,CAAI,GAAA,IAAA;AAC7D;AASO,SAAS,yBAAyB,CAG7B,EAAA;AACV,EAAO,OAAA,CAAA,CAAE,EAAK,GAAA,GAAA,IAAO,IAAK,CAAA,GAAA,CAAI,CAAE,CAAA,EAAE,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,CAAE,EAAE,CAAA;AACrD"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import {useSyncExternalStore}from'react';import {recordCartEvent}from'./shoppingHistoryStore.js';var _a;
|
|
2
|
+
const STORAGE_KEY = "yantra.shopping.cart";
|
|
3
|
+
const MAX_LINES = 60;
|
|
4
|
+
let AsyncStorage = null;
|
|
5
|
+
try {
|
|
6
|
+
AsyncStorage = (_a = require("@react-native-async-storage/async-storage").default) != null ? _a : null;
|
|
7
|
+
} catch (e) {
|
|
8
|
+
AsyncStorage = null;
|
|
9
|
+
}
|
|
10
|
+
let _lines = [];
|
|
11
|
+
let _updatedAt = 0;
|
|
12
|
+
let _durable = {
|
|
13
|
+
lines: _lines,
|
|
14
|
+
updatedAt: _updatedAt
|
|
15
|
+
};
|
|
16
|
+
const _listeners = /* @__PURE__ */ new Set();
|
|
17
|
+
function emit(touched = true) {
|
|
18
|
+
_lines = _lines.slice(0, MAX_LINES);
|
|
19
|
+
if (touched) _updatedAt = Date.now();
|
|
20
|
+
_durable = {
|
|
21
|
+
lines: _lines,
|
|
22
|
+
updatedAt: _updatedAt
|
|
23
|
+
};
|
|
24
|
+
persist(_durable);
|
|
25
|
+
_listeners.forEach((l) => l());
|
|
26
|
+
}
|
|
27
|
+
function persist(cart) {
|
|
28
|
+
try {
|
|
29
|
+
void (AsyncStorage == null ? void 0 : AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(cart)));
|
|
30
|
+
} catch (e) {
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function parseCart(raw) {
|
|
34
|
+
if (!raw) return null;
|
|
35
|
+
try {
|
|
36
|
+
const parsed = JSON.parse(raw);
|
|
37
|
+
if (!Array.isArray(parsed == null ? void 0 : parsed.lines)) return null;
|
|
38
|
+
return {
|
|
39
|
+
lines: parsed.lines.filter((l) => {
|
|
40
|
+
var _a2;
|
|
41
|
+
return Boolean((_a2 = l == null ? void 0 : l.product) == null ? void 0 : _a2.id) && typeof l.qty === "number";
|
|
42
|
+
}),
|
|
43
|
+
updatedAt: typeof parsed.updatedAt === "number" ? parsed.updatedAt : 0
|
|
44
|
+
};
|
|
45
|
+
} catch (e) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function hydrateCart() {
|
|
50
|
+
if (!AsyncStorage) return;
|
|
51
|
+
try {
|
|
52
|
+
const parsed = parseCart(await AsyncStorage.getItem(STORAGE_KEY));
|
|
53
|
+
if (!parsed || parsed.updatedAt <= _updatedAt) return;
|
|
54
|
+
_lines = parsed.lines;
|
|
55
|
+
_updatedAt = parsed.updatedAt;
|
|
56
|
+
emit(false);
|
|
57
|
+
} catch (e) {
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function subscribe(listener) {
|
|
61
|
+
_listeners.add(listener);
|
|
62
|
+
return () => _listeners.delete(listener);
|
|
63
|
+
}
|
|
64
|
+
function addToCart(product, qty = 1) {
|
|
65
|
+
const existing = _lines.find((l) => l.product.id === product.id);
|
|
66
|
+
if (existing) existing.qty += qty;
|
|
67
|
+
else _lines.push({
|
|
68
|
+
product,
|
|
69
|
+
qty
|
|
70
|
+
});
|
|
71
|
+
emit();
|
|
72
|
+
recordCartEvent("add", product, existing ? existing.qty : qty);
|
|
73
|
+
}
|
|
74
|
+
function setQty(productId, qty) {
|
|
75
|
+
if (qty <= 0) {
|
|
76
|
+
removeFromCart(productId);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const line = _lines.find((l) => l.product.id === productId);
|
|
80
|
+
if (!line) return;
|
|
81
|
+
line.qty = qty;
|
|
82
|
+
emit();
|
|
83
|
+
recordCartEvent("qty", line.product, qty);
|
|
84
|
+
}
|
|
85
|
+
function removeFromCart(productId) {
|
|
86
|
+
const removed = _lines.find((l) => l.product.id === productId);
|
|
87
|
+
if (!removed) return;
|
|
88
|
+
_lines = _lines.filter((l) => l.product.id !== productId);
|
|
89
|
+
emit();
|
|
90
|
+
recordCartEvent("remove", removed.product, removed.qty);
|
|
91
|
+
}
|
|
92
|
+
function clearCart() {
|
|
93
|
+
if (_lines.length === 0) return;
|
|
94
|
+
_lines = [];
|
|
95
|
+
emit();
|
|
96
|
+
recordCartEvent("clear");
|
|
97
|
+
}
|
|
98
|
+
function getCartTotals(lines = _lines) {
|
|
99
|
+
return {
|
|
100
|
+
lines,
|
|
101
|
+
count: lines.reduce((n, l) => n + l.qty, 0),
|
|
102
|
+
subtotal: lines.reduce((sum, l) => sum + l.product.price * l.qty, 0)
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function cartQtyOf(productId) {
|
|
106
|
+
var _a2, _b;
|
|
107
|
+
return (_b = (_a2 = _lines.find((line) => line.product.id === productId)) == null ? void 0 : _a2.qty) != null ? _b : 0;
|
|
108
|
+
}
|
|
109
|
+
const EMPTY_LINES = [];
|
|
110
|
+
function useCart() {
|
|
111
|
+
const lines = useSyncExternalStore(subscribe, () => _lines, () => EMPTY_LINES);
|
|
112
|
+
return getCartTotals(lines);
|
|
113
|
+
}
|
|
114
|
+
function useCartQty(productId) {
|
|
115
|
+
return useSyncExternalStore(subscribe, () => cartQtyOf(productId), () => 0);
|
|
116
|
+
}export{addToCart,cartQtyOf,clearCart,getCartTotals,hydrateCart,removeFromCart,setQty,useCart,useCartQty};//# sourceMappingURL=shoppingCart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shoppingCart.js","sources":["../../../src/features/shopping/shoppingCart.ts"],"sourcesContent":["import { useSyncExternalStore } from 'react';\nimport type { Product } from './catalog';\nimport { recordCartEvent } from './shoppingHistoryStore';\n\nexport interface CartLine {\n product: Product;\n qty: number;\n}\n\nexport interface DurableCart {\n lines: CartLine[];\n updatedAt: number;\n}\n\nexport interface CartTotals {\n lines: CartLine[];\n count: number;\n subtotal: number;\n}\n\nconst STORAGE_KEY = 'yantra.shopping.cart';\nconst MAX_LINES = 60;\n\ntype StorageLike = { getItem(key: string): Promise<string | null>; setItem(key: string, value: string): Promise<void> };\nlet AsyncStorage: StorageLike | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n AsyncStorage = require('@react-native-async-storage/async-storage').default ?? null;\n} catch {\n AsyncStorage = null;\n}\n\nlet _lines: CartLine[] = [];\nlet _updatedAt = 0;\nlet _durable: DurableCart = { lines: _lines, updatedAt: _updatedAt };\nconst _listeners = new Set<() => void>();\n\nfunction emit(touched = true): void {\n _lines = _lines.slice(0, MAX_LINES);\n if (touched) _updatedAt = Date.now();\n _durable = { lines: _lines, updatedAt: _updatedAt };\n persist(_durable);\n _listeners.forEach((l) => l());\n}\n\nfunction persist(cart: DurableCart): void {\n try {\n void AsyncStorage?.setItem(STORAGE_KEY, JSON.stringify(cart));\n } catch {\n /* best-effort */\n }\n}\n\nfunction parseCart(raw: string | null): DurableCart | null {\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<DurableCart>;\n if (!Array.isArray(parsed?.lines)) return null;\n return {\n lines: parsed.lines.filter((l): l is CartLine => Boolean(l?.product?.id) && typeof l.qty === 'number'),\n updatedAt: typeof parsed.updatedAt === 'number' ? parsed.updatedAt : 0,\n };\n } catch {\n return null;\n }\n}\n\nexport async function hydrateCart(): Promise<void> {\n if (!AsyncStorage) return;\n try {\n const parsed = parseCart(await AsyncStorage.getItem(STORAGE_KEY));\n if (!parsed || parsed.updatedAt <= _updatedAt) return;\n _lines = parsed.lines;\n _updatedAt = parsed.updatedAt;\n emit(false);\n } catch {\n /* memory-only */\n }\n}\n\nfunction subscribe(listener: () => void): () => void {\n _listeners.add(listener);\n return () => _listeners.delete(listener);\n}\n\nexport function addToCart(product: Product, qty = 1): void {\n const existing = _lines.find((l) => l.product.id === product.id);\n if (existing) existing.qty += qty;\n else _lines.push({ product, qty });\n emit();\n recordCartEvent('add', product, existing ? existing.qty : qty);\n}\n\nexport function setQty(productId: string, qty: number): void {\n if (qty <= 0) {\n removeFromCart(productId);\n return;\n }\n const line = _lines.find((l) => l.product.id === productId);\n if (!line) return;\n line.qty = qty;\n emit();\n recordCartEvent('qty', line.product, qty);\n}\n\nexport function removeFromCart(productId: string): void {\n const removed = _lines.find((l) => l.product.id === productId);\n if (!removed) return;\n _lines = _lines.filter((l) => l.product.id !== productId);\n emit();\n recordCartEvent('remove', removed.product, removed.qty);\n}\n\nexport function clearCart(): void {\n if (_lines.length === 0) return;\n _lines = [];\n emit();\n recordCartEvent('clear');\n}\n\nexport function getCartTotals(lines: CartLine[] = _lines): CartTotals {\n return {\n lines,\n count: lines.reduce((n, l) => n + l.qty, 0),\n subtotal: lines.reduce((sum, l) => sum + l.product.price * l.qty, 0),\n };\n}\n\nexport function cartQtyOf(productId: string): number {\n return _lines.find((line) => line.product.id === productId)?.qty ?? 0;\n}\n\nconst EMPTY_LINES: CartLine[] = [];\n\nexport function useCart(): CartTotals {\n const lines = useSyncExternalStore(\n subscribe,\n () => _lines,\n () => EMPTY_LINES,\n );\n return getCartTotals(lines);\n}\n\nexport function useCartQty(productId: string): number {\n return useSyncExternalStore(\n subscribe,\n () => cartQtyOf(productId),\n () => 0,\n );\n}\n\nexport function __resetCart(): void {\n _lines = [];\n _updatedAt = 0;\n _durable = { lines: _lines, updatedAt: 0 };\n persist(_durable);\n _listeners.forEach((l) => l());\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import {createRemoteRunAction}from'../canvas/videoEditor/remoteMediaClient.js';import {unwrapConnectorEnvelope}from'./shoppingRuntime.js';function createShoppingExec(token, indexUrl) {
|
|
2
|
+
const run = createRemoteRunAction(token, indexUrl);
|
|
3
|
+
return async (connector, action, params) => {
|
|
4
|
+
try {
|
|
5
|
+
const raw = await run(connector, action, params);
|
|
6
|
+
return unwrapConnectorEnvelope(raw);
|
|
7
|
+
} catch (err) {
|
|
8
|
+
return {
|
|
9
|
+
success: false,
|
|
10
|
+
error: err instanceof Error ? err.message : String(err)
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
}export{createShoppingExec};//# sourceMappingURL=shoppingExec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shoppingExec.js","sources":["../../../src/features/shopping/shoppingExec.ts"],"sourcesContent":["/**\n * Connector transport for native shopping: the same cdecli `exec/stream`\n * lane canvas editors use. Token + index URL come from the host session;\n * nothing host-specific (Apollo, env) ships in the remote.\n */\n\nimport { createRemoteRunAction } from '../canvas/videoEditor/remoteMediaClient';\nimport type { ConnectorExec } from './shoppingRuntime';\nimport { unwrapConnectorEnvelope } from './shoppingRuntime';\n\nexport function createShoppingExec(token: string, indexUrl: string): ConnectorExec {\n const run = createRemoteRunAction(token, indexUrl);\n return async <T = unknown>(connector: string, action: string, params: Record<string, unknown>) => {\n try {\n const raw = await run(connector as Parameters<typeof run>[0], action, params);\n return unwrapConnectorEnvelope<T>(raw);\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n };\n}\n"],"names":[],"mappings":"0IASgB,SAAA,kBAAA,CAAmB,OAAe,QAAiC,EAAA;AACjF,EAAM,MAAA,GAAA,GAAM,qBAAsB,CAAA,KAAA,EAAO,QAAQ,CAAA;AACjD,EAAO,OAAA,OAAqB,SAAmB,EAAA,MAAA,EAAgB,MAAoC,KAAA;AACjG,IAAI,IAAA;AACF,MAAA,MAAM,GAAM,GAAA,MAAM,GAAI,CAAA,SAAA,EAAwC,QAAQ,MAAM,CAAA;AAC5E,MAAA,OAAO,wBAA2B,GAAG,CAAA;AAAA,aAC9B,GAAK,EAAA;AACZ,MAAO,OAAA;AAAA,QACL,OAAS,EAAA,KAAA;AAAA,QACT,OAAO,GAAe,YAAA,KAAA,GAAQ,GAAI,CAAA,OAAA,GAAU,OAAO,GAAG;AAAA,OACxD;AAAA;AACF,GACF;AACF"}
|