@adminide-stack/yantra-mobile 12.0.69-alpha.9 → 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,421 @@
|
|
|
1
|
+
import*as React from'react';import {CHANNELS_QUERY,MESSAGE_ADDED_SUBSCRIPTION_WS,CREATE_DIRECT_CHANNEL_MUTATION,MESSAGES_QUERY,SEND_MESSAGE_MUTATION,REACTION_CHANGED_SUBSCRIPTION_WS,SET_MESSAGE_REACTION_MUTATION,VIEW_CHANNEL_MUTATION}from'./chatOperations.js';import {mergeConversations,toConversation,patchConversationAfterPost,sortConversations,mergeMessages,toChatMessage,reconcileOptimistic,applyReactionSummary,withViewerReaction}from'./chatModel.js';import {NATIVE_CHAT_CHANNELS_QUERY_VARS,isNativeMessengerChannel,NATIVE_CHAT_LIST_PAGE_SIZE,isMongoAccountId}from'./nativeChatChannelQuery.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 PAGE_SIZE = 20;
|
|
21
|
+
function firstErrorMessage(errors) {
|
|
22
|
+
if (!(errors == null ? void 0 : errors.length)) return null;
|
|
23
|
+
const raw = errors[0].message || "Something went wrong.";
|
|
24
|
+
if (/Cannot return null for non-nullable field Channel\.id/i.test(raw)) return null;
|
|
25
|
+
if (/status code 400/i.test(raw)) return "Could not load messages for this chat.";
|
|
26
|
+
if (/status code 401/i.test(raw) || /status code 403/i.test(raw)) return "You do not have access to this conversation.";
|
|
27
|
+
return raw;
|
|
28
|
+
}
|
|
29
|
+
function sortChannelsByRecentActivity(rows) {
|
|
30
|
+
return [...rows].sort((left, right) => {
|
|
31
|
+
const leftTime = left.lastPostAt ? new Date(left.lastPostAt).getTime() : 0;
|
|
32
|
+
const rightTime = right.lastPostAt ? new Date(right.lastPostAt).getTime() : 0;
|
|
33
|
+
return rightTime - leftTime;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function useConversations(services, viewer, opts) {
|
|
37
|
+
var _a;
|
|
38
|
+
const {
|
|
39
|
+
gql
|
|
40
|
+
} = services;
|
|
41
|
+
const [conversations, setConversations] = React.useState([]);
|
|
42
|
+
const [loading, setLoading] = React.useState(true);
|
|
43
|
+
const [refreshing, setRefreshing] = React.useState(false);
|
|
44
|
+
const [error, setError] = React.useState(null);
|
|
45
|
+
const [hasMore, setHasMore] = React.useState(false);
|
|
46
|
+
const [loadingMore, setLoadingMore] = React.useState(false);
|
|
47
|
+
const viewerId = (_a = viewer == null ? void 0 : viewer.userId) != null ? _a : null;
|
|
48
|
+
const mounted = React.useRef(true);
|
|
49
|
+
const conversationsRef = React.useRef([]);
|
|
50
|
+
const serverOffset = React.useRef(0);
|
|
51
|
+
React.useEffect(() => {
|
|
52
|
+
conversationsRef.current = conversations;
|
|
53
|
+
}, [conversations]);
|
|
54
|
+
const listQueryEnabled = (opts == null ? void 0 : opts.listQueryEnabled) !== false;
|
|
55
|
+
const load = React.useCallback(async (mode) => {
|
|
56
|
+
var _a2, _b, _c, _d;
|
|
57
|
+
if (!viewerId || !listQueryEnabled) return;
|
|
58
|
+
if (mode === "refresh") setRefreshing(true);
|
|
59
|
+
if (mode === "initial") {
|
|
60
|
+
const cached = await gql.query(CHANNELS_QUERY, NATIVE_CHAT_CHANNELS_QUERY_VARS, {
|
|
61
|
+
fetchPolicy: "cache-only"
|
|
62
|
+
});
|
|
63
|
+
const cachedRows = ((_b = (_a2 = cached.data) == null ? void 0 : _a2.channelsByUser) != null ? _b : []).filter(Boolean).filter(isNativeMessengerChannel);
|
|
64
|
+
if (mounted.current && cachedRows.length) {
|
|
65
|
+
setConversations(mergeConversations([], sortChannelsByRecentActivity(cachedRows).map((c) => toConversation(c, viewerId))));
|
|
66
|
+
setLoading(false);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const res = await gql.query(
|
|
70
|
+
CHANNELS_QUERY,
|
|
71
|
+
NATIVE_CHAT_CHANNELS_QUERY_VARS,
|
|
72
|
+
// network-only: a stale conversation list is the single most
|
|
73
|
+
// visible staleness in a chat app, and this is one small page.
|
|
74
|
+
{
|
|
75
|
+
fetchPolicy: "network-only"
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
if (!mounted.current) return;
|
|
79
|
+
const message = firstErrorMessage(res.errors);
|
|
80
|
+
const raw = ((_d = (_c = res.data) == null ? void 0 : _c.channelsByUser) != null ? _d : []).filter(Boolean);
|
|
81
|
+
const rows = raw.filter(isNativeMessengerChannel);
|
|
82
|
+
if (rows.length || !message) {
|
|
83
|
+
setConversations(mergeConversations([], sortChannelsByRecentActivity(rows).map((c) => toConversation(c, viewerId))));
|
|
84
|
+
serverOffset.current = raw.length;
|
|
85
|
+
setHasMore(raw.length >= NATIVE_CHAT_LIST_PAGE_SIZE);
|
|
86
|
+
}
|
|
87
|
+
setError(message);
|
|
88
|
+
setLoading(false);
|
|
89
|
+
setRefreshing(false);
|
|
90
|
+
}, [gql, viewerId, listQueryEnabled]);
|
|
91
|
+
const loadMore = React.useCallback(async () => {
|
|
92
|
+
var _a2, _b;
|
|
93
|
+
if (!viewerId || !listQueryEnabled || !hasMore || loadingMore || loading) return;
|
|
94
|
+
setLoadingMore(true);
|
|
95
|
+
const res = await gql.query(CHANNELS_QUERY, __spreadProps(__spreadValues({}, NATIVE_CHAT_CHANNELS_QUERY_VARS), {
|
|
96
|
+
skip: serverOffset.current
|
|
97
|
+
}), {
|
|
98
|
+
fetchPolicy: "network-only"
|
|
99
|
+
});
|
|
100
|
+
if (!mounted.current) return;
|
|
101
|
+
const message = firstErrorMessage(res.errors);
|
|
102
|
+
const raw = ((_b = (_a2 = res.data) == null ? void 0 : _a2.channelsByUser) != null ? _b : []).filter(Boolean);
|
|
103
|
+
const rows = raw.filter(isNativeMessengerChannel);
|
|
104
|
+
if (rows.length) {
|
|
105
|
+
setConversations((prev) => mergeConversations(prev, rows.map((c) => toConversation(c, viewerId))));
|
|
106
|
+
}
|
|
107
|
+
if (!message) {
|
|
108
|
+
serverOffset.current += raw.length;
|
|
109
|
+
setHasMore(raw.length >= NATIVE_CHAT_LIST_PAGE_SIZE);
|
|
110
|
+
}
|
|
111
|
+
setError(message);
|
|
112
|
+
setLoadingMore(false);
|
|
113
|
+
}, [gql, viewerId, listQueryEnabled, hasMore, loadingMore, loading]);
|
|
114
|
+
React.useEffect(() => {
|
|
115
|
+
if (!listQueryEnabled) {
|
|
116
|
+
setLoading(true);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
void load("initial");
|
|
120
|
+
}, [load, listQueryEnabled]);
|
|
121
|
+
React.useEffect(() => {
|
|
122
|
+
if (gql.reconnectEpoch > 0) void load("refresh");
|
|
123
|
+
}, [gql.reconnectEpoch]);
|
|
124
|
+
const markRead = React.useCallback((channelId) => {
|
|
125
|
+
setConversations((prev) => prev.map((c) => c.id === channelId ? __spreadProps(__spreadValues({}, c), {
|
|
126
|
+
unreadCount: 0
|
|
127
|
+
}) : c));
|
|
128
|
+
}, []);
|
|
129
|
+
const applyConversationMessage = React.useCallback((channelId, post) => {
|
|
130
|
+
if (!viewerId) return;
|
|
131
|
+
setConversations((prev) => {
|
|
132
|
+
const idx = prev.findIndex((c) => c.id === channelId);
|
|
133
|
+
if (idx < 0) return prev;
|
|
134
|
+
const updated = patchConversationAfterPost(prev[idx], post, viewerId);
|
|
135
|
+
const rest = prev.filter((c) => c.id !== channelId);
|
|
136
|
+
return sortConversations([updated, ...rest]);
|
|
137
|
+
});
|
|
138
|
+
}, [viewerId]);
|
|
139
|
+
const listSyncKey = (opts == null ? void 0 : opts.syncListRealtime) ? conversations.map((c) => c.id).slice(0, 12).join("|") : "";
|
|
140
|
+
React.useEffect(() => {
|
|
141
|
+
if (!(opts == null ? void 0 : opts.syncListRealtime) || !viewerId || !listSyncKey) return void 0;
|
|
142
|
+
const channelIds = listSyncKey.split("|").filter(Boolean);
|
|
143
|
+
const unsubs = channelIds.map((channelId) => gql.subscribe(MESSAGE_ADDED_SUBSCRIPTION_WS, {
|
|
144
|
+
channelId
|
|
145
|
+
}, {
|
|
146
|
+
next: (data) => {
|
|
147
|
+
var _a2;
|
|
148
|
+
const post = data == null ? void 0 : data.chatMessageAdded;
|
|
149
|
+
if (!post || !mounted.current) return;
|
|
150
|
+
applyConversationMessage(channelId, post);
|
|
151
|
+
(_a2 = gql.patchChannelListAfterMessage) == null ? void 0 : _a2.call(gql, channelId, post);
|
|
152
|
+
}
|
|
153
|
+
}));
|
|
154
|
+
return () => {
|
|
155
|
+
unsubs.forEach((off) => off());
|
|
156
|
+
};
|
|
157
|
+
}, [gql, viewerId, listSyncKey, opts == null ? void 0 : opts.syncListRealtime, applyConversationMessage]);
|
|
158
|
+
React.useEffect(() => {
|
|
159
|
+
mounted.current = true;
|
|
160
|
+
return () => {
|
|
161
|
+
mounted.current = false;
|
|
162
|
+
};
|
|
163
|
+
}, []);
|
|
164
|
+
const findExistingDirect = React.useCallback((peerUserId, peerName) => {
|
|
165
|
+
const peerKey = String(peerUserId);
|
|
166
|
+
const nameKey = peerName.trim().toLowerCase();
|
|
167
|
+
return conversationsRef.current.find((c) => {
|
|
168
|
+
var _a2, _b;
|
|
169
|
+
return c.isDirect && (((_a2 = c.peer) == null ? void 0 : _a2.id) && String(c.peer.id) === peerKey || !((_b = c.peer) == null ? void 0 : _b.id) && c.title.trim().toLowerCase() === nameKey);
|
|
170
|
+
});
|
|
171
|
+
}, []);
|
|
172
|
+
const openDirect = React.useCallback(async (peerUserId, peerName) => {
|
|
173
|
+
var _a2;
|
|
174
|
+
if (!isMongoAccountId(peerUserId) || peerUserId === viewerId) return null;
|
|
175
|
+
const existing = findExistingDirect(peerUserId, peerName);
|
|
176
|
+
if (existing) return existing.id;
|
|
177
|
+
const res = await gql.mutate(CREATE_DIRECT_CHANNEL_MUTATION, {
|
|
178
|
+
receiver: [peerUserId],
|
|
179
|
+
displayName: peerName
|
|
180
|
+
});
|
|
181
|
+
const message = firstErrorMessage(res.errors);
|
|
182
|
+
if (message) {
|
|
183
|
+
setError(message);
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
const channel = (_a2 = res.data) == null ? void 0 : _a2.createDirectChannel;
|
|
187
|
+
if (!(channel == null ? void 0 : channel.id) || !viewerId) {
|
|
188
|
+
setError("Could not start this conversation. Please try again.");
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
setConversations((prev) => mergeConversations(prev, [toConversation(channel, viewerId)]));
|
|
192
|
+
return String(channel.id);
|
|
193
|
+
}, [gql, viewerId, findExistingDirect]);
|
|
194
|
+
return {
|
|
195
|
+
conversations,
|
|
196
|
+
loading,
|
|
197
|
+
error,
|
|
198
|
+
refreshing,
|
|
199
|
+
refresh: () => void load("refresh"),
|
|
200
|
+
hasMore,
|
|
201
|
+
loadingMore,
|
|
202
|
+
loadMore: () => void loadMore(),
|
|
203
|
+
markRead,
|
|
204
|
+
applyConversationMessage,
|
|
205
|
+
openDirect
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function useThread(gql, channelId, viewer, opts) {
|
|
209
|
+
var _a;
|
|
210
|
+
const [messages, setMessages] = React.useState([]);
|
|
211
|
+
const [loading, setLoading] = React.useState(true);
|
|
212
|
+
const [loadingMore, setLoadingMore] = React.useState(false);
|
|
213
|
+
const [hasMore, setHasMore] = React.useState(true);
|
|
214
|
+
const [error, setError] = React.useState(null);
|
|
215
|
+
const viewerId = (_a = viewer == null ? void 0 : viewer.userId) != null ? _a : null;
|
|
216
|
+
const mounted = React.useRef(true);
|
|
217
|
+
const pending = React.useRef(/* @__PURE__ */ new Map());
|
|
218
|
+
const onConversationMessage = opts == null ? void 0 : opts.onConversationMessage;
|
|
219
|
+
const notifyList = React.useCallback((post) => {
|
|
220
|
+
var _a2;
|
|
221
|
+
if (!channelId) return;
|
|
222
|
+
onConversationMessage == null ? void 0 : onConversationMessage(post);
|
|
223
|
+
(_a2 = gql.patchChannelListAfterMessage) == null ? void 0 : _a2.call(gql, channelId, post);
|
|
224
|
+
}, [channelId, gql, onConversationMessage]);
|
|
225
|
+
React.useEffect(() => {
|
|
226
|
+
mounted.current = true;
|
|
227
|
+
return () => {
|
|
228
|
+
mounted.current = false;
|
|
229
|
+
};
|
|
230
|
+
}, []);
|
|
231
|
+
const fetchPage = React.useCallback(async (skip) => {
|
|
232
|
+
var _a2, _b, _c, _d, _e;
|
|
233
|
+
if (!channelId || !viewerId) return;
|
|
234
|
+
const res = await gql.query(MESSAGES_QUERY, {
|
|
235
|
+
channelId,
|
|
236
|
+
limit: PAGE_SIZE,
|
|
237
|
+
skip
|
|
238
|
+
}, {
|
|
239
|
+
fetchPolicy: "network-only"
|
|
240
|
+
});
|
|
241
|
+
if (!mounted.current) return;
|
|
242
|
+
const rows = ((_c = (_b = (_a2 = res.data) == null ? void 0 : _a2.messages) == null ? void 0 : _b.data) != null ? _c : []).filter(Boolean);
|
|
243
|
+
setMessages((prev) => mergeMessages(prev, rows.map((p) => toChatMessage(p, viewerId))));
|
|
244
|
+
const total = (_e = (_d = res.data) == null ? void 0 : _d.messages) == null ? void 0 : _e.totalCount;
|
|
245
|
+
setHasMore(typeof total === "number" ? skip + rows.length < total : rows.length >= PAGE_SIZE);
|
|
246
|
+
setError(firstErrorMessage(res.errors));
|
|
247
|
+
setLoading(false);
|
|
248
|
+
setLoadingMore(false);
|
|
249
|
+
}, [gql, channelId, viewerId]);
|
|
250
|
+
React.useEffect(() => {
|
|
251
|
+
let cancelled = false;
|
|
252
|
+
setMessages([]);
|
|
253
|
+
setHasMore(true);
|
|
254
|
+
setLoading(true);
|
|
255
|
+
pending.current.clear();
|
|
256
|
+
if (channelId && viewerId) {
|
|
257
|
+
void gql.query(MESSAGES_QUERY, {
|
|
258
|
+
channelId,
|
|
259
|
+
limit: PAGE_SIZE,
|
|
260
|
+
skip: 0
|
|
261
|
+
}, {
|
|
262
|
+
fetchPolicy: "cache-only"
|
|
263
|
+
}).then((cached) => {
|
|
264
|
+
var _a2, _b, _c;
|
|
265
|
+
const rows = ((_c = (_b = (_a2 = cached.data) == null ? void 0 : _a2.messages) == null ? void 0 : _b.data) != null ? _c : []).filter(Boolean);
|
|
266
|
+
if (cancelled || !mounted.current || !rows.length) return;
|
|
267
|
+
setMessages((prev) => prev.length ? prev : mergeMessages([], rows.map((p) => toChatMessage(p, viewerId))));
|
|
268
|
+
setLoading(false);
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
void fetchPage(0);
|
|
272
|
+
return () => {
|
|
273
|
+
cancelled = true;
|
|
274
|
+
};
|
|
275
|
+
}, [fetchPage, gql, channelId, viewerId]);
|
|
276
|
+
React.useEffect(() => {
|
|
277
|
+
if (gql.reconnectEpoch > 0) void fetchPage(0);
|
|
278
|
+
}, [gql.reconnectEpoch]);
|
|
279
|
+
React.useEffect(() => {
|
|
280
|
+
if (!channelId || !viewerId) return void 0;
|
|
281
|
+
return gql.subscribe(MESSAGE_ADDED_SUBSCRIPTION_WS, {
|
|
282
|
+
channelId
|
|
283
|
+
}, {
|
|
284
|
+
next: (data) => {
|
|
285
|
+
const post = data == null ? void 0 : data.chatMessageAdded;
|
|
286
|
+
if (!post || !mounted.current) return;
|
|
287
|
+
const incoming = toChatMessage(post, viewerId);
|
|
288
|
+
setMessages((prev) => reconcileOptimistic(prev, incoming));
|
|
289
|
+
notifyList(post);
|
|
290
|
+
},
|
|
291
|
+
error: (err) => mounted.current && setError(err.message)
|
|
292
|
+
});
|
|
293
|
+
}, [gql, channelId, viewerId, notifyList]);
|
|
294
|
+
const send = React.useCallback(async (body) => {
|
|
295
|
+
var _a2, _b, _c;
|
|
296
|
+
const text = body.trim();
|
|
297
|
+
if (!text || !channelId || !viewerId) return;
|
|
298
|
+
const clientId = `pending-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
299
|
+
const optimistic = {
|
|
300
|
+
id: clientId,
|
|
301
|
+
body: text,
|
|
302
|
+
createdAt: Date.now(),
|
|
303
|
+
authorId: viewerId,
|
|
304
|
+
authorName: (_a2 = viewer == null ? void 0 : viewer.displayName) != null ? _a2 : "You",
|
|
305
|
+
authorAvatar: (_b = viewer == null ? void 0 : viewer.avatarUrl) != null ? _b : null,
|
|
306
|
+
isMine: true,
|
|
307
|
+
isDeleted: false,
|
|
308
|
+
isEdited: false,
|
|
309
|
+
attachments: [],
|
|
310
|
+
reactions: [],
|
|
311
|
+
sendState: "sending"
|
|
312
|
+
};
|
|
313
|
+
pending.current.set(clientId, text);
|
|
314
|
+
setMessages((prev) => mergeMessages(prev, [optimistic]));
|
|
315
|
+
onConversationMessage == null ? void 0 : onConversationMessage({
|
|
316
|
+
id: clientId,
|
|
317
|
+
message: text,
|
|
318
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
319
|
+
creator: {
|
|
320
|
+
id: viewerId
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
const res = await gql.mutate(SEND_MESSAGE_MUTATION, {
|
|
324
|
+
channelId,
|
|
325
|
+
messageInput: {
|
|
326
|
+
content: text
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
if (!mounted.current) return;
|
|
330
|
+
const message = firstErrorMessage(res.errors);
|
|
331
|
+
const saved = (_c = res.data) == null ? void 0 : _c.sendMessage;
|
|
332
|
+
if (message || !saved) {
|
|
333
|
+
setMessages((prev) => prev.map((m) => m.id === clientId ? __spreadProps(__spreadValues({}, m), {
|
|
334
|
+
sendState: "failed"
|
|
335
|
+
}) : m));
|
|
336
|
+
setError(message);
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
pending.current.delete(clientId);
|
|
340
|
+
setMessages((prev) => reconcileOptimistic(prev, toChatMessage(saved, viewerId)));
|
|
341
|
+
notifyList(saved);
|
|
342
|
+
}, [gql, channelId, viewerId, viewer, notifyList, onConversationMessage]);
|
|
343
|
+
const retry = React.useCallback((messageId) => {
|
|
344
|
+
const body = pending.current.get(messageId);
|
|
345
|
+
if (!body) return;
|
|
346
|
+
pending.current.delete(messageId);
|
|
347
|
+
setMessages((prev) => prev.filter((m) => m.id !== messageId));
|
|
348
|
+
void send(body);
|
|
349
|
+
}, [send]);
|
|
350
|
+
const loadMore = React.useCallback(() => {
|
|
351
|
+
if (loadingMore || !hasMore || loading) return;
|
|
352
|
+
setLoadingMore(true);
|
|
353
|
+
void fetchPage(messages.filter((m) => !m.sendState || m.sendState === "sent").length);
|
|
354
|
+
}, [fetchPage, loadingMore, hasMore, loading, messages]);
|
|
355
|
+
React.useEffect(() => {
|
|
356
|
+
if (!channelId || !viewerId) return void 0;
|
|
357
|
+
return gql.subscribe(REACTION_CHANGED_SUBSCRIPTION_WS, {
|
|
358
|
+
channelId
|
|
359
|
+
}, {
|
|
360
|
+
next: (data) => {
|
|
361
|
+
const event = data == null ? void 0 : data.chatReactionChanged;
|
|
362
|
+
if (!(event == null ? void 0 : event.postId) || !mounted.current) return;
|
|
363
|
+
setMessages((prev) => applyReactionSummary(prev, String(event.postId), event.reactions, viewerId));
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
}, [gql, channelId, viewerId]);
|
|
367
|
+
const messagesRef = React.useRef(messages);
|
|
368
|
+
messagesRef.current = messages;
|
|
369
|
+
const react = React.useCallback((messageId, emoji) => {
|
|
370
|
+
var _a2, _b;
|
|
371
|
+
if (!channelId || !viewerId) return;
|
|
372
|
+
const target = messagesRef.current.find((m) => m.id === messageId);
|
|
373
|
+
if (!target || target.sendState && target.sendState !== "sent") return;
|
|
374
|
+
const before = target.reactions;
|
|
375
|
+
const after = withViewerReaction(before, emoji, viewerId);
|
|
376
|
+
const next = (_b = (_a2 = after.find((r) => r.mine)) == null ? void 0 : _a2.reaction) != null ? _b : null;
|
|
377
|
+
setMessages((prev) => prev.map((m) => m.id === messageId ? __spreadProps(__spreadValues({}, m), {
|
|
378
|
+
reactions: after
|
|
379
|
+
}) : m));
|
|
380
|
+
void (async () => {
|
|
381
|
+
var _a3, _b2, _c;
|
|
382
|
+
const res = await gql.mutate(SET_MESSAGE_REACTION_MUTATION, {
|
|
383
|
+
channelId,
|
|
384
|
+
postId: messageId,
|
|
385
|
+
reaction: next
|
|
386
|
+
});
|
|
387
|
+
if (!mounted.current) return;
|
|
388
|
+
if (((_a3 = res.errors) == null ? void 0 : _a3.length) || !((_b2 = res.data) == null ? void 0 : _b2.setMessageReaction)) {
|
|
389
|
+
setMessages((prev) => prev.map((m) => m.id === messageId ? __spreadProps(__spreadValues({}, m), {
|
|
390
|
+
reactions: before
|
|
391
|
+
}) : m));
|
|
392
|
+
setError((_c = firstErrorMessage(res.errors)) != null ? _c : "Could not update the reaction.");
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
setMessages((prev) => {
|
|
396
|
+
var _a4;
|
|
397
|
+
return applyReactionSummary(prev, messageId, (_a4 = res.data) == null ? void 0 : _a4.setMessageReaction, viewerId);
|
|
398
|
+
});
|
|
399
|
+
})();
|
|
400
|
+
}, [gql, channelId, viewerId]);
|
|
401
|
+
return {
|
|
402
|
+
messages,
|
|
403
|
+
loading,
|
|
404
|
+
loadingMore,
|
|
405
|
+
hasMore,
|
|
406
|
+
error,
|
|
407
|
+
send,
|
|
408
|
+
loadMore,
|
|
409
|
+
retry,
|
|
410
|
+
react
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
function useMarkRead(gql, channelId, onMarked) {
|
|
414
|
+
React.useEffect(() => {
|
|
415
|
+
if (!channelId) return;
|
|
416
|
+
onMarked(channelId);
|
|
417
|
+
void gql.mutate(VIEW_CHANNEL_MUTATION, {
|
|
418
|
+
id: channelId
|
|
419
|
+
});
|
|
420
|
+
}, [channelId]);
|
|
421
|
+
}export{useConversations,useMarkRead,useThread};//# sourceMappingURL=useChatData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChatData.js","sources":["../../../src/features/messaging/useChatData.ts"],"sourcesContent":["/**\n * The chat surface's data layer: conversations, one transcript, and sending.\n *\n * Hooks rather than a store, because the remote must not pull in redux or\n * Apollo - everything reaches the network through `ChatGraphQLSeam`. The\n * shaping and merging all live in `chatModel.ts` as pure functions; what is\n * here is the effect wiring around them.\n *\n * Two behaviours are worth knowing about:\n *\n * - **`reconnectEpoch` drives recovery.** The host bumps it on every\n * successful (re)connect. Both hooks re-fetch their head page when it\n * changes, because a dropped socket means missed subscription frames and the\n * only honest fix is to re-read. Merging is idempotent, so healing a gap\n * never duplicates anything.\n * - **Errors are state, not exceptions.** The seam resolves with `{data,\n * errors}` and never rejects, so a failure renders an inline banner over\n * whatever is already on screen instead of unmounting the transcript.\n */\nimport * as React from 'react';\nimport {\n CHANNELS_QUERY,\n CREATE_DIRECT_CHANNEL_MUTATION,\n MESSAGES_QUERY,\n MESSAGE_ADDED_SUBSCRIPTION_WS,\n REACTION_CHANGED_SUBSCRIPTION_WS,\n SEND_MESSAGE_MUTATION,\n SET_MESSAGE_REACTION_MUTATION,\n VIEW_CHANNEL_MUTATION,\n} from './chatOperations';\nimport {\n applyReactionSummary,\n withViewerReaction,\n type WireReaction,\n mergeConversations,\n mergeMessages,\n patchConversationAfterPost,\n reconcileOptimistic,\n sortConversations,\n toChatMessage,\n toConversation,\n type ChatConversation,\n type ChatMessage,\n type WireChannel,\n type WirePost,\n} from './chatModel';\nimport type { ChatGraphQLSeam, ChatHostServices, ChatViewer } from './chatHost';\nimport {\n isMongoAccountId,\n isNativeMessengerChannel,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n NATIVE_CHAT_LIST_PAGE_SIZE,\n} from './nativeChatChannelQuery';\n\n/** Messages fetched per page in a thread. */\nconst PAGE_SIZE = 20;\n\nfunction firstErrorMessage(errors?: { message: string }[]): string | null {\n if (!errors?.length) return null;\n const raw = errors[0].message || 'Something went wrong.';\n if (/Cannot return null for non-nullable field Channel\\.id/i.test(raw)) return null;\n if (/status code 400/i.test(raw)) return 'Could not load messages for this chat.';\n if (/status code 401/i.test(raw) || /status code 403/i.test(raw))\n return 'You do not have access to this conversation.';\n return raw;\n}\n\ninterface MessagesQueryPayload {\n messages?: {\n data?: (WirePost | null)[] | null;\n totalCount?: number | null;\n } | null;\n}\n\nfunction sortChannelsByRecentActivity(rows: WireChannel[]): WireChannel[] {\n return [...rows].sort((left, right) => {\n const leftTime = left.lastPostAt ? new Date(left.lastPostAt).getTime() : 0;\n const rightTime = right.lastPostAt ? new Date(right.lastPostAt).getTime() : 0;\n return rightTime - leftTime;\n });\n}\n\nexport interface ConversationsState {\n conversations: ChatConversation[];\n loading: boolean;\n error: string | null;\n refreshing: boolean;\n refresh: () => void;\n /** More conversations exist on the server beyond what is loaded. */\n hasMore: boolean;\n loadingMore: boolean;\n /** Fetch the next page of conversations. */\n loadMore: () => void;\n /** Locally zero the badge so the list responds before the server confirms. */\n markRead: (channelId: string) => void;\n /** Move a row to the top with an updated preview after send/subscription. */\n applyConversationMessage: (channelId: string, post: WirePost) => void;\n openDirect: (peerUserId: string, peerName: string) => Promise<string | null>;\n}\n\nexport function useConversations(\n services: ChatHostServices,\n viewer: ChatViewer | null,\n opts?: {\n syncListRealtime?: boolean;\n /** Wait for host to set yantra-chat org before querying. */ listQueryEnabled?: boolean;\n },\n): ConversationsState {\n const { gql } = services;\n const [conversations, setConversations] = React.useState<ChatConversation[]>([]);\n const [loading, setLoading] = React.useState(true);\n const [refreshing, setRefreshing] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [hasMore, setHasMore] = React.useState(false);\n const [loadingMore, setLoadingMore] = React.useState(false);\n const viewerId = viewer?.userId ?? null;\n const mounted = React.useRef(true);\n const conversationsRef = React.useRef<ChatConversation[]>([]);\n /** Raw server rows consumed so far (before the client-side filter), i.e. the next `skip`. */\n const serverOffset = React.useRef(0);\n\n React.useEffect(() => {\n conversationsRef.current = conversations;\n }, [conversations]);\n\n const listQueryEnabled = opts?.listQueryEnabled !== false;\n\n const load = React.useCallback(\n async (mode: 'initial' | 'refresh') => {\n if (!viewerId || !listQueryEnabled) return;\n if (mode === 'refresh') setRefreshing(true);\n if (mode === 'initial') {\n // Paint the Apollo-cached list immediately; the network read below replaces it.\n const cached = await gql.query<{ channelsByUser?: (WireChannel | null)[] | null }>(\n CHANNELS_QUERY,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n { fetchPolicy: 'cache-only' },\n );\n const cachedRows = (cached.data?.channelsByUser ?? [])\n .filter(Boolean)\n .filter(isNativeMessengerChannel) as WireChannel[];\n if (mounted.current && cachedRows.length) {\n setConversations(\n mergeConversations(\n [],\n sortChannelsByRecentActivity(cachedRows).map((c) => toConversation(c, viewerId)),\n ),\n );\n setLoading(false);\n }\n }\n const res = await gql.query<{ channelsByUser?: (WireChannel | null)[] | null }>(\n CHANNELS_QUERY,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n // network-only: a stale conversation list is the single most\n // visible staleness in a chat app, and this is one small page.\n { fetchPolicy: 'network-only' },\n );\n if (!mounted.current) return;\n\n const message = firstErrorMessage(res.errors);\n const raw = (res.data?.channelsByUser ?? []).filter(Boolean) as WireChannel[];\n const rows = raw.filter(isNativeMessengerChannel);\n\n // Partial data with errors is normal here (one bad channel should\n // not blank the list), so render what arrived AND show the banner.\n // Initial/refresh always resets to the first page.\n if (rows.length || !message) {\n setConversations(\n mergeConversations(\n [],\n sortChannelsByRecentActivity(rows).map((c) => toConversation(c, viewerId)),\n ),\n );\n serverOffset.current = raw.length;\n setHasMore(raw.length >= NATIVE_CHAT_LIST_PAGE_SIZE);\n }\n setError(message);\n setLoading(false);\n setRefreshing(false);\n },\n [gql, viewerId, listQueryEnabled],\n );\n\n const loadMore = React.useCallback(async () => {\n if (!viewerId || !listQueryEnabled || !hasMore || loadingMore || loading) return;\n setLoadingMore(true);\n const res = await gql.query<{ channelsByUser?: (WireChannel | null)[] | null }>(\n CHANNELS_QUERY,\n { ...NATIVE_CHAT_CHANNELS_QUERY_VARS, skip: serverOffset.current },\n { fetchPolicy: 'network-only' },\n );\n if (!mounted.current) return;\n const message = firstErrorMessage(res.errors);\n const raw = (res.data?.channelsByUser ?? []).filter(Boolean) as WireChannel[];\n const rows = raw.filter(isNativeMessengerChannel);\n if (rows.length) {\n setConversations((prev) =>\n mergeConversations(\n prev,\n rows.map((c) => toConversation(c, viewerId)),\n ),\n );\n }\n if (!message) {\n serverOffset.current += raw.length;\n setHasMore(raw.length >= NATIVE_CHAT_LIST_PAGE_SIZE);\n }\n setError(message);\n setLoadingMore(false);\n }, [gql, viewerId, listQueryEnabled, hasMore, loadingMore, loading]);\n\n React.useEffect(() => {\n if (!listQueryEnabled) {\n setLoading(true);\n return;\n }\n void load('initial');\n }, [load, listQueryEnabled]);\n\n // Re-read the list on every reconnect: while the socket was down the list\n // could have moved for reasons no subscription frame will now tell us.\n React.useEffect(() => {\n if (gql.reconnectEpoch > 0) void load('refresh');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [gql.reconnectEpoch]);\n\n const markRead = React.useCallback((channelId: string) => {\n setConversations((prev) => prev.map((c) => (c.id === channelId ? { ...c, unreadCount: 0 } : c)));\n }, []);\n\n const applyConversationMessage = React.useCallback(\n (channelId: string, post: WirePost) => {\n if (!viewerId) return;\n setConversations((prev) => {\n const idx = prev.findIndex((c) => c.id === channelId);\n if (idx < 0) return prev;\n const updated = patchConversationAfterPost(prev[idx], post, viewerId);\n const rest = prev.filter((c) => c.id !== channelId);\n return sortConversations([updated, ...rest]);\n });\n },\n [viewerId],\n );\n\n const listSyncKey = opts?.syncListRealtime\n ? conversations\n .map((c) => c.id)\n .slice(0, 12)\n .join('|')\n : '';\n\n React.useEffect(() => {\n if (!opts?.syncListRealtime || !viewerId || !listSyncKey) return undefined;\n const channelIds = listSyncKey.split('|').filter(Boolean);\n const unsubs = channelIds.map((channelId) =>\n gql.subscribe<{ chatMessageAdded?: WirePost | null }>(\n MESSAGE_ADDED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const post = data?.chatMessageAdded;\n if (!post || !mounted.current) return;\n applyConversationMessage(channelId, post);\n gql.patchChannelListAfterMessage?.(channelId, post);\n },\n },\n ),\n );\n return () => {\n unsubs.forEach((off) => off());\n };\n }, [gql, viewerId, listSyncKey, opts?.syncListRealtime, applyConversationMessage]);\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const findExistingDirect = React.useCallback((peerUserId: string, peerName: string) => {\n const peerKey = String(peerUserId);\n const nameKey = peerName.trim().toLowerCase();\n return conversationsRef.current.find(\n (c) =>\n c.isDirect &&\n ((c.peer?.id && String(c.peer.id) === peerKey) ||\n (!c.peer?.id && c.title.trim().toLowerCase() === nameKey)),\n );\n }, []);\n\n const openDirect = React.useCallback(\n async (peerUserId: string, peerName: string): Promise<string | null> => {\n if (!isMongoAccountId(peerUserId) || peerUserId === viewerId) return null;\n const existing = findExistingDirect(peerUserId, peerName);\n if (existing) return existing.id;\n\n const res = await gql.mutate<{ createDirectChannel?: WireChannel | null }>(CREATE_DIRECT_CHANNEL_MUTATION, {\n receiver: [peerUserId],\n displayName: peerName,\n });\n const message = firstErrorMessage(res.errors);\n if (message) {\n setError(message);\n return null;\n }\n const channel = res.data?.createDirectChannel;\n if (!channel?.id || !viewerId) {\n // firstErrorMessage hides the null-Channel.id error, so a failed create would otherwise do nothing on tap.\n setError('Could not start this conversation. Please try again.');\n return null;\n }\n // Idempotent server-side, so an existing DM lands here too and just\n // merges over its own row rather than appearing twice.\n setConversations((prev) => mergeConversations(prev, [toConversation(channel, viewerId)]));\n return String(channel.id);\n },\n [gql, viewerId, findExistingDirect],\n );\n\n return {\n conversations,\n loading,\n error,\n refreshing,\n refresh: () => void load('refresh'),\n hasMore,\n loadingMore,\n loadMore: () => void loadMore(),\n markRead,\n applyConversationMessage,\n openDirect,\n };\n}\n\nexport interface ThreadState {\n messages: ChatMessage[];\n loading: boolean;\n loadingMore: boolean;\n hasMore: boolean;\n error: string | null;\n send: (body: string) => Promise<void>;\n loadMore: () => void;\n retry: (messageId: string) => void;\n /** Pick (or, with the same emoji / null, remove) the viewer's Tapback on a message. */\n react: (messageId: string, emoji: string | null) => void;\n}\n\nexport function useThread(\n gql: ChatGraphQLSeam,\n channelId: string | null,\n viewer: ChatViewer | null,\n opts?: { onConversationMessage?: (post: WirePost) => void },\n): ThreadState {\n const [messages, setMessages] = React.useState<ChatMessage[]>([]);\n const [loading, setLoading] = React.useState(true);\n const [loadingMore, setLoadingMore] = React.useState(false);\n const [hasMore, setHasMore] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n const viewerId = viewer?.userId ?? null;\n const mounted = React.useRef(true);\n /** Bodies of rows still in flight, so a retry can find them. */\n const pending = React.useRef(new Map<string, string>());\n\n const onConversationMessage = opts?.onConversationMessage;\n const notifyList = React.useCallback(\n (post: WirePost) => {\n if (!channelId) return;\n onConversationMessage?.(post);\n gql.patchChannelListAfterMessage?.(channelId, post);\n },\n [channelId, gql, onConversationMessage],\n );\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const fetchPage = React.useCallback(\n async (skip: number) => {\n if (!channelId || !viewerId) return;\n const res = await gql.query<MessagesQueryPayload>(\n MESSAGES_QUERY,\n { channelId, limit: PAGE_SIZE, skip },\n { fetchPolicy: 'network-only' },\n );\n if (!mounted.current) return;\n\n const rows = (res.data?.messages?.data ?? []).filter(Boolean) as WirePost[];\n setMessages((prev) =>\n mergeMessages(\n prev,\n rows.map((p) => toChatMessage(p, viewerId)),\n ),\n );\n // Short page means the end. Offset paging can also repeat rows, but\n // mergeMessages de-duplicates so that is invisible.\n const total = res.data?.messages?.totalCount;\n setHasMore(typeof total === 'number' ? skip + rows.length < total : rows.length >= PAGE_SIZE);\n setError(firstErrorMessage(res.errors));\n setLoading(false);\n setLoadingMore(false);\n },\n [gql, channelId, viewerId],\n );\n\n // Reset hard when the channel changes: keeping the previous transcript for\n // even one frame shows the wrong conversation under the right title.\n React.useEffect(() => {\n let cancelled = false;\n setMessages([]);\n setHasMore(true);\n setLoading(true);\n pending.current.clear();\n if (channelId && viewerId) {\n // Paint the Apollo-cached head page immediately (a revisit shows the transcript with no\n // spinner); the network-only fetch below then replaces it with the server's truth.\n void gql\n .query<MessagesQueryPayload>(\n MESSAGES_QUERY,\n { channelId, limit: PAGE_SIZE, skip: 0 },\n { fetchPolicy: 'cache-only' },\n )\n .then((cached) => {\n const rows = (cached.data?.messages?.data ?? []).filter(Boolean) as WirePost[];\n if (cancelled || !mounted.current || !rows.length) return;\n setMessages((prev) =>\n prev.length\n ? prev\n : mergeMessages(\n [],\n rows.map((p) => toChatMessage(p, viewerId)),\n ),\n );\n setLoading(false);\n });\n }\n void fetchPage(0);\n return () => {\n cancelled = true;\n };\n }, [fetchPage, gql, channelId, viewerId]);\n\n React.useEffect(() => {\n if (gql.reconnectEpoch > 0) void fetchPage(0);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [gql.reconnectEpoch]);\n\n // Live messages. The host owns socket retry; this just holds the handle.\n React.useEffect(() => {\n if (!channelId || !viewerId) return undefined;\n return gql.subscribe<{ chatMessageAdded?: WirePost | null }>(\n MESSAGE_ADDED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const post = data?.chatMessageAdded;\n if (!post || !mounted.current) return;\n const incoming = toChatMessage(post, viewerId);\n // The echo of the viewer's own send arrives here too, so it\n // must reconcile rather than append.\n setMessages((prev) => reconcileOptimistic(prev, incoming));\n notifyList(post);\n },\n error: (err) => mounted.current && setError(err.message),\n },\n );\n }, [gql, channelId, viewerId, notifyList]);\n\n const send = React.useCallback(\n async (body: string) => {\n const text = body.trim();\n if (!text || !channelId || !viewerId) return;\n\n const clientId = `pending-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const optimistic: ChatMessage = {\n id: clientId,\n body: text,\n createdAt: Date.now(),\n authorId: viewerId,\n authorName: viewer?.displayName ?? 'You',\n authorAvatar: viewer?.avatarUrl ?? null,\n isMine: true,\n isDeleted: false,\n isEdited: false,\n attachments: [],\n reactions: [],\n sendState: 'sending',\n };\n pending.current.set(clientId, text);\n setMessages((prev) => mergeMessages(prev, [optimistic]));\n onConversationMessage?.({\n id: clientId,\n message: text,\n createdAt: new Date().toISOString(),\n creator: { id: viewerId },\n });\n\n const res = await gql.mutate<{ sendMessage?: WirePost | null }>(SEND_MESSAGE_MUTATION, {\n channelId,\n messageInput: { content: text },\n });\n if (!mounted.current) return;\n\n const message = firstErrorMessage(res.errors);\n const saved = res.data?.sendMessage;\n if (message || !saved) {\n // Keep the text on screen and mark it failed. Dropping a\n // message the user typed is never acceptable.\n setMessages((prev) =>\n prev.map((m) => (m.id === clientId ? { ...m, sendState: 'failed' as const } : m)),\n );\n setError(message);\n return;\n }\n pending.current.delete(clientId);\n setMessages((prev) => reconcileOptimistic(prev, toChatMessage(saved, viewerId)));\n notifyList(saved);\n },\n [gql, channelId, viewerId, viewer, notifyList, onConversationMessage],\n );\n\n const retry = React.useCallback(\n (messageId: string) => {\n const body = pending.current.get(messageId);\n if (!body) return;\n pending.current.delete(messageId);\n setMessages((prev) => prev.filter((m) => m.id !== messageId));\n void send(body);\n },\n [send],\n );\n\n const loadMore = React.useCallback(() => {\n if (loadingMore || !hasMore || loading) return;\n setLoadingMore(true);\n // Count only server rows: optimistic ones are not in the server's\n // offset space and would skip a real message on the next page.\n void fetchPage(messages.filter((m) => !m.sendState || m.sendState === 'sent').length);\n }, [fetchPage, loadingMore, hasMore, loading, messages]);\n\n // Live Tapbacks from anyone in the conversation, including the viewer's other devices.\n React.useEffect(() => {\n if (!channelId || !viewerId) return undefined;\n return gql.subscribe<{\n chatReactionChanged?: { postId?: string | null; reactions?: WireReaction[] | null } | null;\n }>(\n REACTION_CHANGED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const event = data?.chatReactionChanged;\n if (!event?.postId || !mounted.current) return;\n setMessages((prev) => applyReactionSummary(prev, String(event.postId), event.reactions, viewerId));\n },\n },\n );\n }, [gql, channelId, viewerId]);\n\n const messagesRef = React.useRef(messages);\n messagesRef.current = messages;\n\n const react = React.useCallback(\n (messageId: string, emoji: string | null) => {\n if (!channelId || !viewerId) return;\n const target = messagesRef.current.find((m) => m.id === messageId);\n // Only confirmed server rows can carry reactions.\n if (!target || (target.sendState && target.sendState !== 'sent')) return;\n const before = target.reactions;\n const after = withViewerReaction(before, emoji, viewerId);\n const next = after.find((r) => r.mine)?.reaction ?? null;\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, reactions: after } : m)));\n\n void (async () => {\n const res = await gql.mutate<{ setMessageReaction?: WireReaction[] | null }>(\n SET_MESSAGE_REACTION_MUTATION,\n { channelId, postId: messageId, reaction: next },\n );\n if (!mounted.current) return;\n if (res.errors?.length || !res.data?.setMessageReaction) {\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, reactions: before } : m)));\n setError(firstErrorMessage(res.errors) ?? 'Could not update the reaction.');\n return;\n }\n setMessages((prev) => applyReactionSummary(prev, messageId, res.data?.setMessageReaction, viewerId));\n })();\n },\n [gql, channelId, viewerId],\n );\n\n return { messages, loading, loadingMore, hasMore, error, send, loadMore, retry, react };\n}\n\n/** Fire-and-forget read receipt; the badge is already cleared locally. */\nexport function useMarkRead(gql: ChatGraphQLSeam, channelId: string | null, onMarked: (id: string) => void) {\n React.useEffect(() => {\n if (!channelId) return;\n onMarked(channelId);\n void gql.mutate(VIEW_CHANNEL_MUTATION, { id: channelId });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [channelId]);\n}\n"],"names":["_a","_b"],"mappings":"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"}
|