@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
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import {parseBoardState,emptyBoardState}from'./canvasCore.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
2
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
6
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
@@ -14,6 +16,7 @@ var __spreadValues = (a, b) => {
|
|
|
14
16
|
}
|
|
15
17
|
return a;
|
|
16
18
|
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
17
20
|
const CHANNEL_FIELDS = "id surface channelId title metadata updatedAt";
|
|
18
21
|
const SCRATCH_BOARD_ID = "global";
|
|
19
22
|
function surfaceIndexUrl(graphqlUrl, explicit) {
|
|
@@ -147,6 +150,52 @@ async function fetchMyCanvasBoards(opts) {
|
|
|
147
150
|
error: null
|
|
148
151
|
};
|
|
149
152
|
}
|
|
153
|
+
async function pushCanvasBoard(opts) {
|
|
154
|
+
var _a, _b, _c, _d, _e;
|
|
155
|
+
const channelId = (_a = opts.channelId) == null ? void 0 : _a.trim();
|
|
156
|
+
if (!channelId || channelId === SCRATCH_BOARD_ID) return false;
|
|
157
|
+
if (!opts.url) return false;
|
|
158
|
+
try {
|
|
159
|
+
const response = await fetch(opts.url, {
|
|
160
|
+
method: "POST",
|
|
161
|
+
headers: __spreadValues({
|
|
162
|
+
"content-type": "application/json"
|
|
163
|
+
}, opts.token ? {
|
|
164
|
+
authorization: `Bearer ${opts.token}`
|
|
165
|
+
} : {}),
|
|
166
|
+
body: JSON.stringify({
|
|
167
|
+
query: `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {
|
|
168
|
+
registerSurfaceChannel(input: $input) { ${CHANNEL_FIELDS} }
|
|
169
|
+
}`,
|
|
170
|
+
variables: {
|
|
171
|
+
input: __spreadProps(__spreadValues({
|
|
172
|
+
surface: "canvas",
|
|
173
|
+
channelId,
|
|
174
|
+
sessionId: channelId
|
|
175
|
+
}, opts.state.title ? {
|
|
176
|
+
title: opts.state.title
|
|
177
|
+
} : {}), {
|
|
178
|
+
metadata: opts.state
|
|
179
|
+
})
|
|
180
|
+
}
|
|
181
|
+
})
|
|
182
|
+
});
|
|
183
|
+
if (!response.ok) return false;
|
|
184
|
+
const payload = await response.json();
|
|
185
|
+
if ((_b = payload == null ? void 0 : payload.errors) == null ? void 0 : _b.length) {
|
|
186
|
+
if (__DEV__) {
|
|
187
|
+
console.warn("[pushCanvasBoard]", (_c = payload.errors[0]) == null ? void 0 : _c.message);
|
|
188
|
+
}
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
return Boolean((_e = (_d = payload == null ? void 0 : payload.data) == null ? void 0 : _d.registerSurfaceChannel) == null ? void 0 : _e.id);
|
|
192
|
+
} catch (err) {
|
|
193
|
+
if (__DEV__) {
|
|
194
|
+
console.warn("[pushCanvasBoard] failed:", err);
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
150
199
|
function coerceMetadata(value) {
|
|
151
200
|
if (typeof value !== "string") return value;
|
|
152
201
|
try {
|
|
@@ -154,4 +203,17 @@ function coerceMetadata(value) {
|
|
|
154
203
|
} catch (e) {
|
|
155
204
|
return null;
|
|
156
205
|
}
|
|
157
|
-
}
|
|
206
|
+
}
|
|
207
|
+
function newBoardChannelId() {
|
|
208
|
+
var _a, _b;
|
|
209
|
+
const rand = () => Math.random().toString(36).slice(2, 10);
|
|
210
|
+
try {
|
|
211
|
+
const bytes = new Uint8Array(8);
|
|
212
|
+
(_b = (_a = globalThis.crypto) == null ? void 0 : _a.getRandomValues) == null ? void 0 : _b.call(_a, bytes);
|
|
213
|
+
if (bytes.some((b) => b !== 0)) {
|
|
214
|
+
return `canvas-${Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("")}`;
|
|
215
|
+
}
|
|
216
|
+
} catch (e) {
|
|
217
|
+
}
|
|
218
|
+
return `canvas-${rand()}${rand()}`;
|
|
219
|
+
}export{clearCachedCanvasBoards,fetchMyCanvasBoards,getCachedCanvasBoards,newBoardChannelId,pushCanvasBoard,setCachedCanvasBoards,surfaceIndexUrl,surfaceIndexUrlFromTemplate};//# sourceMappingURL=surfaceIndex.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surfaceIndex.js","sources":["../../../src/features/canvas/surfaceIndex.ts"],"sourcesContent":["/**\n * Native reader for the canvas boards in the SurfaceChannel index.\n *\n * The index (`servers/surface-index-subgraph-server`) is the ONLY store for a\n * canvas: the whole `PersistedCanvasState` rides in the row's `metadata`, and\n * `mySurfaceChannels` enumerates the caller's boards. Rows are per-USER, so the\n * phone — signed in as the same user — sees exactly what the web surface sees.\n *\n * This is the native twin of `@yantra/canvas-surface`'s `state/boards.ts`\n * (`pullBoards`). It is copied rather than imported for the same reason\n * `canvasCore.ts` is: that package builds for the DOM (vite, `import.meta.env`,\n * `window.location`), and importing it would drag the web toolchain into Metro.\n * The contract that matters is the wire shape, which both sides pin.\n *\n * Reads are best-effort: an unreachable index yields an error string for the UI\n * rather than throwing, matching how the web surface degrades.\n */\nimport { emptyBoardState, parseBoardState, type PersistedCanvasState } from './canvasCore';\n\n/** Fields the index returns for a channel row (mirror of CHANNEL_FIELDS). */\nconst CHANNEL_FIELDS = 'id surface channelId title metadata updatedAt';\n\n/**\n * The web surface's `/c/new` scratch board. It is not a real board (no host\n * session backs it), and `pullBoards` skips it — so must this, or an empty\n * scratch row would shadow the user's actual canvases.\n */\nconst SCRATCH_BOARD_ID = 'global';\n\nexport interface CanvasBoardSummary {\n channelId: string;\n title?: string;\n savedAt: number;\n itemCount: number;\n board: PersistedCanvasState;\n}\n\n/**\n * Where the index lives for this environment.\n *\n * Mirrors the surface-kit fallback: the index is a sibling host of the backend,\n * so drop the backend's first label and prefix `surface-index-backend.`\n * (`ideback.yantra-app-v1.cdebase.dev` -> `surface-index-backend.yantra-app-v1.cdebase.dev`).\n * An explicit URL always wins, so a non-standard environment sets one env var\n * instead of needing a code change.\n */\nexport function surfaceIndexUrl(graphqlUrl: string, explicit?: string): string {\n const override = (explicit || '').trim();\n if (override) return override;\n\n const base = (graphqlUrl || '').trim();\n if (!base) return '';\n try {\n const { protocol, host } = parseOrigin(base);\n const labels = host.split('.');\n if (labels.length < 3) return '';\n return `${protocol}//surface-index-backend.${labels.slice(1).join('.')}/graphql`;\n } catch {\n return '';\n }\n}\n\n/**\n * Index GraphQL URL from the same SURFACE_URL_TEMPLATE the native remotes use\n * (`https://{slug}-surface.<cluster>/` → `https://surface-index-backend.<cluster>/graphql`).\n * Local GRAPHQL_URL cannot derive a host; this is the develop-lane fallback.\n */\nexport function surfaceIndexUrlFromTemplate(template: string): string {\n const trimmed = (template || '').trim();\n const match = trimmed.match(/^(https?):\\/\\/\\{slug\\}-surface\\.([^/]+)/i);\n if (!match) return '';\n const host = match[2].replace(/\\/+$/, '');\n if (!host) return '';\n return `${match[1].toLowerCase()}://surface-index-backend.${host}/graphql`;\n}\n\nfunction parseOrigin(url: string): { protocol: string; host: string } {\n // RN has URL via react-native-url-polyfill (imported in the app entry), but\n // this module is also loaded by jest and the surface build, so parse by hand.\n const match = url.match(/^(https?:)\\/\\/([^/]+)/i);\n if (!match) throw new Error(`unparseable url: ${url}`);\n return { protocol: match[1].toLowerCase(), host: match[2].toLowerCase() };\n}\n\nexport interface FetchBoardsOptions {\n url: string;\n token?: string | null;\n signal?: AbortSignal;\n}\n\nexport interface FetchBoardsResult {\n boards: CanvasBoardSummary[];\n /** Plain sentence for the UI; null when the read succeeded. */\n error: string | null;\n}\n\n/** In-memory board list so revisiting Canvas Native does not re-flash the spinner. */\nlet boardsCache: { url: string; boards: CanvasBoardSummary[] } | null = null;\n\nexport function getCachedCanvasBoards(url: string): CanvasBoardSummary[] | null {\n if (!url || !boardsCache || boardsCache.url !== url) return null;\n return boardsCache.boards;\n}\n\n/**\n * Drop the in-memory board cache. Boards are re-fetchable from the surface\n * index, so this is safe to call under memory pressure - the next read simply\n * goes to the network. Registered as a memory reclaimer (see features/memory).\n */\nexport function clearCachedCanvasBoards(): void {\n boardsCache = null;\n}\n\nexport function setCachedCanvasBoards(url: string, boards: CanvasBoardSummary[]): void {\n if (!url) return;\n boardsCache = { url, boards };\n}\n\n/**\n * The caller's canvases, newest first.\n *\n * Empty boards are dropped, matching web `pullBoards` — the grid only shows\n * canvases with media. Only the scratch `global` row is skipped for the same\n * reason as web (it would merge every `/c/new` scratch into one shared row).\n */\nexport async function fetchMyCanvasBoards(opts: FetchBoardsOptions): Promise<FetchBoardsResult> {\n if (!opts.url) {\n return { boards: [], error: 'No canvas index configured for this build.' };\n }\n\n let payload: SurfaceIndexResponse;\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `query MySurfaceChannels($surface: SurfaceType) {\n mySurfaceChannels(surface: $surface) { ${CHANNEL_FIELDS} }\n }`,\n variables: { surface: 'canvas' },\n }),\n signal: opts.signal,\n });\n\n if (response.status === 401 || response.status === 403) {\n return { boards: [], error: 'Your session expired. Sign in again to see your canvases.' };\n }\n if (!response.ok) {\n return { boards: [], error: `The canvas index is unreachable (HTTP ${response.status}).` };\n }\n payload = (await response.json()) as SurfaceIndexResponse;\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n return { boards: [], error: null };\n }\n return { boards: [], error: 'Could not reach the canvas index. Check your connection.' };\n }\n\n if (payload?.errors?.length) {\n // GraphQL errors arrive with HTTP 200. The index reports an unauthenticated\n // caller as \"Missing tenantId in userContext\", which is a developer\n // sentence - say what the user can actually do about it.\n const raw = payload.errors[0]?.message || '';\n const isAuth = /tenantid|unauthenticated|unauthorized|not authorised|forbidden/i.test(raw);\n return {\n boards: [],\n error: isAuth\n ? 'Your session expired. Sign in again to see your canvases.'\n : raw || 'The canvas index rejected the request.',\n };\n }\n\n const rows = payload?.data?.mySurfaceChannels ?? [];\n const boards: CanvasBoardSummary[] = [];\n for (const row of rows) {\n const channelId = typeof row?.channelId === 'string' ? row.channelId : '';\n if (!channelId || channelId === SCRATCH_BOARD_ID) continue;\n const title = typeof row?.title === 'string' ? row.title : undefined;\n const board = parseBoardState(coerceMetadata(row?.metadata)) ?? emptyBoardState(title);\n if (board.items.length === 0) continue;\n boards.push({\n channelId,\n title: board.title || title,\n savedAt: board.savedAt,\n itemCount: board.items.length,\n board,\n });\n }\n\n boards.sort((a, b) => b.savedAt - a.savedAt);\n setCachedCanvasBoards(opts.url, boards);\n return { boards, error: null };\n}\n\nexport interface PushBoardOptions {\n url: string;\n token?: string | null;\n channelId: string;\n state: PersistedCanvasState;\n}\n\n/**\n * Write one board to the index. Twin of canvas-surface `pushBoard`:\n * `registerSurfaceChannel` is the idempotent upsert (update throws when the\n * row does not exist). Metadata is replaced wholesale — send the complete state.\n *\n * Returns false when the id is unsyncable (`global` / empty) or the write fails.\n * Never throws.\n */\nexport async function pushCanvasBoard(opts: PushBoardOptions): Promise<boolean> {\n const channelId = opts.channelId?.trim();\n if (!channelId || channelId === SCRATCH_BOARD_ID) return false;\n if (!opts.url) return false;\n\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {\n registerSurfaceChannel(input: $input) { ${CHANNEL_FIELDS} }\n }`,\n variables: {\n input: {\n surface: 'canvas',\n channelId,\n sessionId: channelId,\n ...(opts.state.title ? { title: opts.state.title } : {}),\n metadata: opts.state,\n },\n },\n }),\n });\n if (!response.ok) return false;\n const payload = (await response.json()) as {\n data?: { registerSurfaceChannel?: { id?: string } | null };\n errors?: Array<{ message?: string }>;\n };\n if (payload?.errors?.length) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[pushCanvasBoard]', payload.errors[0]?.message);\n }\n return false;\n }\n return Boolean(payload?.data?.registerSurfaceChannel?.id);\n } catch (err) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[pushCanvasBoard] failed:', err);\n }\n return false;\n }\n}\n\n/**\n * `metadata` is a JSON scalar, which arrives decoded — but a backend that types\n * it as a String hands back the encoded text instead, and a board that silently\n * fails to parse looks exactly like an empty canvas. Accept both.\n */\nfunction coerceMetadata(value: unknown): unknown {\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\ninterface SurfaceIndexResponse {\n data?: { mySurfaceChannels?: Array<Record<string, unknown>> | null } | null;\n errors?: Array<{ message?: string }>;\n}\n\n/** Mint a board id the same way the web does: the board IS its channel. */\nexport function newBoardChannelId(): string {\n const rand = () => Math.random().toString(36).slice(2, 10);\n try {\n const bytes = new Uint8Array(8);\n (globalThis.crypto as Crypto | undefined)?.getRandomValues?.(bytes);\n if (bytes.some((b) => b !== 0)) {\n return `canvas-${Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')}`;\n }\n } catch {\n // fall through to Math.random\n }\n return `canvas-${rand()}${rand()}`;\n}\n\n/**\n * Write one board to the index - the native twin of the web's `pushBoard`.\n * `registerSurfaceChannel` because it is the idempotent upsert (update throws\n * when the row does not exist). `metadata` is REPLACED wholesale by the\n * backend, so the complete state goes every time; never send a patch.\n */\nexport async function saveCanvasBoard(opts: {\n url: string;\n token?: string | null;\n channelId: string;\n board: PersistedCanvasState;\n}): Promise<{ ok: boolean; error: string | null }> {\n if (!opts.url) return { ok: false, error: 'No canvas index configured for this build.' };\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {\n registerSurfaceChannel(input: $input) { id channelId }\n }`,\n variables: {\n input: {\n surface: 'canvas',\n channelId: opts.channelId,\n title: opts.board.title || 'Untitled canvas',\n metadata: opts.board,\n },\n },\n }),\n });\n if (!response.ok) return { ok: false, error: `Save failed (HTTP ${response.status}).` };\n const payload = (await response.json()) as { errors?: Array<{ message?: string }> };\n if (payload?.errors?.length) return { ok: false, error: payload.errors[0]?.message || 'Save rejected.' };\n return { ok: true, error: null };\n } catch {\n return { ok: false, error: 'Could not reach the canvas index to save.' };\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"surfaceIndex.js","sources":["../../../src/features/canvas/surfaceIndex.ts"],"sourcesContent":["/**\n * Native reader for the canvas boards in the SurfaceChannel index.\n *\n * The index (`servers/surface-index-subgraph-server`) is the ONLY store for a\n * canvas: the whole `PersistedCanvasState` rides in the row's `metadata`, and\n * `mySurfaceChannels` enumerates the caller's boards. Rows are per-USER, so the\n * phone — signed in as the same user — sees exactly what the web surface sees.\n *\n * This is the native twin of `@yantra/canvas-surface`'s `state/boards.ts`\n * (`pullBoards`). It is copied rather than imported for the same reason\n * `canvasCore.ts` is: that package builds for the DOM (vite, `import.meta.env`,\n * `window.location`), and importing it would drag the web toolchain into Metro.\n * The contract that matters is the wire shape, which both sides pin.\n *\n * Reads are best-effort: an unreachable index yields an error string for the UI\n * rather than throwing, matching how the web surface degrades.\n */\nimport { emptyBoardState, parseBoardState, type PersistedCanvasState } from './canvasCore';\n\n/** Fields the index returns for a channel row (mirror of CHANNEL_FIELDS). */\nconst CHANNEL_FIELDS = 'id surface channelId title metadata updatedAt';\n\n/**\n * The web surface's `/c/new` scratch board. It is not a real board (no host\n * session backs it), and `pullBoards` skips it — so must this, or an empty\n * scratch row would shadow the user's actual canvases.\n */\nconst SCRATCH_BOARD_ID = 'global';\n\nexport interface CanvasBoardSummary {\n channelId: string;\n title?: string;\n savedAt: number;\n itemCount: number;\n board: PersistedCanvasState;\n}\n\n/**\n * Where the index lives for this environment.\n *\n * Mirrors the surface-kit fallback: the index is a sibling host of the backend,\n * so drop the backend's first label and prefix `surface-index-backend.`\n * (`ideback.yantra-app-v1.cdebase.dev` -> `surface-index-backend.yantra-app-v1.cdebase.dev`).\n * An explicit URL always wins, so a non-standard environment sets one env var\n * instead of needing a code change.\n */\nexport function surfaceIndexUrl(graphqlUrl: string, explicit?: string): string {\n const override = (explicit || '').trim();\n if (override) return override;\n\n const base = (graphqlUrl || '').trim();\n if (!base) return '';\n try {\n const { protocol, host } = parseOrigin(base);\n const labels = host.split('.');\n if (labels.length < 3) return '';\n return `${protocol}//surface-index-backend.${labels.slice(1).join('.')}/graphql`;\n } catch {\n return '';\n }\n}\n\n/**\n * Index GraphQL URL from the same SURFACE_URL_TEMPLATE the native remotes use\n * (`https://{slug}-surface.<cluster>/` → `https://surface-index-backend.<cluster>/graphql`).\n * Local GRAPHQL_URL cannot derive a host; this is the develop-lane fallback.\n */\nexport function surfaceIndexUrlFromTemplate(template: string): string {\n const trimmed = (template || '').trim();\n const match = trimmed.match(/^(https?):\\/\\/\\{slug\\}-surface\\.([^/]+)/i);\n if (!match) return '';\n const host = match[2].replace(/\\/+$/, '');\n if (!host) return '';\n return `${match[1].toLowerCase()}://surface-index-backend.${host}/graphql`;\n}\n\nfunction parseOrigin(url: string): { protocol: string; host: string } {\n // RN has URL via react-native-url-polyfill (imported in the app entry), but\n // this module is also loaded by jest and the surface build, so parse by hand.\n const match = url.match(/^(https?:)\\/\\/([^/]+)/i);\n if (!match) throw new Error(`unparseable url: ${url}`);\n return { protocol: match[1].toLowerCase(), host: match[2].toLowerCase() };\n}\n\nexport interface FetchBoardsOptions {\n url: string;\n token?: string | null;\n signal?: AbortSignal;\n}\n\nexport interface FetchBoardsResult {\n boards: CanvasBoardSummary[];\n /** Plain sentence for the UI; null when the read succeeded. */\n error: string | null;\n}\n\n/** In-memory board list so revisiting Canvas Native does not re-flash the spinner. */\nlet boardsCache: { url: string; boards: CanvasBoardSummary[] } | null = null;\n\nexport function getCachedCanvasBoards(url: string): CanvasBoardSummary[] | null {\n if (!url || !boardsCache || boardsCache.url !== url) return null;\n return boardsCache.boards;\n}\n\n/**\n * Drop the in-memory board cache. Boards are re-fetchable from the surface\n * index, so this is safe to call under memory pressure - the next read simply\n * goes to the network. Registered as a memory reclaimer (see features/memory).\n */\nexport function clearCachedCanvasBoards(): void {\n boardsCache = null;\n}\n\nexport function setCachedCanvasBoards(url: string, boards: CanvasBoardSummary[]): void {\n if (!url) return;\n boardsCache = { url, boards };\n}\n\n/**\n * The caller's canvases, newest first.\n *\n * Empty boards are dropped, matching web `pullBoards` — the grid only shows\n * canvases with media. Only the scratch `global` row is skipped for the same\n * reason as web (it would merge every `/c/new` scratch into one shared row).\n */\nexport async function fetchMyCanvasBoards(opts: FetchBoardsOptions): Promise<FetchBoardsResult> {\n if (!opts.url) {\n return { boards: [], error: 'No canvas index configured for this build.' };\n }\n\n let payload: SurfaceIndexResponse;\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `query MySurfaceChannels($surface: SurfaceType) {\n mySurfaceChannels(surface: $surface) { ${CHANNEL_FIELDS} }\n }`,\n variables: { surface: 'canvas' },\n }),\n signal: opts.signal,\n });\n\n if (response.status === 401 || response.status === 403) {\n return { boards: [], error: 'Your session expired. Sign in again to see your canvases.' };\n }\n if (!response.ok) {\n return { boards: [], error: `The canvas index is unreachable (HTTP ${response.status}).` };\n }\n payload = (await response.json()) as SurfaceIndexResponse;\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n return { boards: [], error: null };\n }\n return { boards: [], error: 'Could not reach the canvas index. Check your connection.' };\n }\n\n if (payload?.errors?.length) {\n // GraphQL errors arrive with HTTP 200. The index reports an unauthenticated\n // caller as \"Missing tenantId in userContext\", which is a developer\n // sentence - say what the user can actually do about it.\n const raw = payload.errors[0]?.message || '';\n const isAuth = /tenantid|unauthenticated|unauthorized|not authorised|forbidden/i.test(raw);\n return {\n boards: [],\n error: isAuth\n ? 'Your session expired. Sign in again to see your canvases.'\n : raw || 'The canvas index rejected the request.',\n };\n }\n\n const rows = payload?.data?.mySurfaceChannels ?? [];\n const boards: CanvasBoardSummary[] = [];\n for (const row of rows) {\n const channelId = typeof row?.channelId === 'string' ? row.channelId : '';\n if (!channelId || channelId === SCRATCH_BOARD_ID) continue;\n const title = typeof row?.title === 'string' ? row.title : undefined;\n const board = parseBoardState(coerceMetadata(row?.metadata)) ?? emptyBoardState(title);\n if (board.items.length === 0) continue;\n boards.push({\n channelId,\n title: board.title || title,\n savedAt: board.savedAt,\n itemCount: board.items.length,\n board,\n });\n }\n\n boards.sort((a, b) => b.savedAt - a.savedAt);\n setCachedCanvasBoards(opts.url, boards);\n return { boards, error: null };\n}\n\nexport interface PushBoardOptions {\n url: string;\n token?: string | null;\n channelId: string;\n state: PersistedCanvasState;\n}\n\n/**\n * Write one board to the index. Twin of canvas-surface `pushBoard`:\n * `registerSurfaceChannel` is the idempotent upsert (update throws when the\n * row does not exist). Metadata is replaced wholesale — send the complete state.\n *\n * Returns false when the id is unsyncable (`global` / empty) or the write fails.\n * Never throws.\n */\nexport async function pushCanvasBoard(opts: PushBoardOptions): Promise<boolean> {\n const channelId = opts.channelId?.trim();\n if (!channelId || channelId === SCRATCH_BOARD_ID) return false;\n if (!opts.url) return false;\n\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {\n registerSurfaceChannel(input: $input) { ${CHANNEL_FIELDS} }\n }`,\n variables: {\n input: {\n surface: 'canvas',\n channelId,\n sessionId: channelId,\n ...(opts.state.title ? { title: opts.state.title } : {}),\n metadata: opts.state,\n },\n },\n }),\n });\n if (!response.ok) return false;\n const payload = (await response.json()) as {\n data?: { registerSurfaceChannel?: { id?: string } | null };\n errors?: Array<{ message?: string }>;\n };\n if (payload?.errors?.length) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[pushCanvasBoard]', payload.errors[0]?.message);\n }\n return false;\n }\n return Boolean(payload?.data?.registerSurfaceChannel?.id);\n } catch (err) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[pushCanvasBoard] failed:', err);\n }\n return false;\n }\n}\n\n/**\n * `metadata` is a JSON scalar, which arrives decoded — but a backend that types\n * it as a String hands back the encoded text instead, and a board that silently\n * fails to parse looks exactly like an empty canvas. Accept both.\n */\nfunction coerceMetadata(value: unknown): unknown {\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\ninterface SurfaceIndexResponse {\n data?: { mySurfaceChannels?: Array<Record<string, unknown>> | null } | null;\n errors?: Array<{ message?: string }>;\n}\n\n/** Mint a board id the same way the web does: the board IS its channel. */\nexport function newBoardChannelId(): string {\n const rand = () => Math.random().toString(36).slice(2, 10);\n try {\n const bytes = new Uint8Array(8);\n (globalThis.crypto as Crypto | undefined)?.getRandomValues?.(bytes);\n if (bytes.some((b) => b !== 0)) {\n return `canvas-${Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')}`;\n }\n } catch {\n // fall through to Math.random\n }\n return `canvas-${rand()}${rand()}`;\n}\n\n/**\n * Write one board to the index - the native twin of the web's `pushBoard`.\n * `registerSurfaceChannel` because it is the idempotent upsert (update throws\n * when the row does not exist). `metadata` is REPLACED wholesale by the\n * backend, so the complete state goes every time; never send a patch.\n */\nexport async function saveCanvasBoard(opts: {\n url: string;\n token?: string | null;\n channelId: string;\n board: PersistedCanvasState;\n}): Promise<{ ok: boolean; error: string | null }> {\n if (!opts.url) return { ok: false, error: 'No canvas index configured for this build.' };\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {\n registerSurfaceChannel(input: $input) { id channelId }\n }`,\n variables: {\n input: {\n surface: 'canvas',\n channelId: opts.channelId,\n title: opts.board.title || 'Untitled canvas',\n metadata: opts.board,\n },\n },\n }),\n });\n if (!response.ok) return { ok: false, error: `Save failed (HTTP ${response.status}).` };\n const payload = (await response.json()) as { errors?: Array<{ message?: string }> };\n if (payload?.errors?.length) return { ok: false, error: payload.errors[0]?.message || 'Save rejected.' };\n return { ok: true, error: null };\n } catch {\n return { ok: false, error: 'Could not reach the canvas index to save.' };\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import {solidColorSrc,emptyTimeline,DEFAULT_IMAGE_SEC}from'../videoEditor/editorModel.js';import {mirrorMediaUrl}from'./renderConfig.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 = (obj2, key, value) => key in obj2 ? __defProp(obj2, key, { enumerable: true, configurable: true, writable: true, value }) : obj2[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 obj = (v) => typeof v === "object" && v !== null && !Array.isArray(v) ? v : null;
|
|
21
|
+
const str = (v) => typeof v === "string" && v.trim() ? v.trim() : void 0;
|
|
22
|
+
const num = (v) => typeof v === "number" && Number.isFinite(v) ? v : void 0;
|
|
23
|
+
const arr = (v) => Array.isArray(v) ? v : [];
|
|
24
|
+
const CANVAS_SHEET = /bguniquecanvas\.png|unique_canvas\.png/i;
|
|
25
|
+
const LOGO_PLACEHOLDER = /addalogo\.png|Default_Logo\.png|Default_Black_logo\.png/i;
|
|
26
|
+
function configOf(raw) {
|
|
27
|
+
const top = obj(raw);
|
|
28
|
+
if (!top) return null;
|
|
29
|
+
const config = obj(top.config);
|
|
30
|
+
if (config && obj(config.video_dimensions)) return config;
|
|
31
|
+
return obj(top.video_dimensions) ? top : null;
|
|
32
|
+
}
|
|
33
|
+
function isInVideoTemplate(raw) {
|
|
34
|
+
var _a;
|
|
35
|
+
const config = configOf(raw);
|
|
36
|
+
if (!config) return false;
|
|
37
|
+
return Object.values((_a = obj(config.video_dimensions)) != null ? _a : {}).some((dim) => {
|
|
38
|
+
const d = obj(dim);
|
|
39
|
+
return !!d && blocksOf(d).length > 0;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function blocksOf(dim) {
|
|
43
|
+
var _a;
|
|
44
|
+
const blocksMap = (_a = obj(dim.blocks)) != null ? _a : {};
|
|
45
|
+
const order = arr(dim.block_start_list).map(str).filter((id) => !!id);
|
|
46
|
+
const ids = order.length ? order : Object.keys(blocksMap);
|
|
47
|
+
return ids.map((id) => {
|
|
48
|
+
var _a2, _b, _c;
|
|
49
|
+
const b = obj(blocksMap[id]);
|
|
50
|
+
if (!b) return null;
|
|
51
|
+
const start = (_a2 = num(b.start)) != null ? _a2 : 0;
|
|
52
|
+
const end = (_b = num(b.end)) != null ? _b : start + 3;
|
|
53
|
+
return {
|
|
54
|
+
name: (_c = str(b.name)) != null ? _c : "Scene",
|
|
55
|
+
start,
|
|
56
|
+
end: Math.max(end, start + 0.1),
|
|
57
|
+
components: arr(b.components).map(obj).filter((c) => !!c)
|
|
58
|
+
};
|
|
59
|
+
}).filter((b) => !!b);
|
|
60
|
+
}
|
|
61
|
+
function pickAspect(top, config) {
|
|
62
|
+
var _a, _b;
|
|
63
|
+
const dims = (_a = obj(config.video_dimensions)) != null ? _a : {};
|
|
64
|
+
let published = [];
|
|
65
|
+
const declared = (_b = top.dimensions) != null ? _b : config.dimensions;
|
|
66
|
+
if (typeof declared === "string") {
|
|
67
|
+
try {
|
|
68
|
+
published = arr(JSON.parse(declared)).map(str).filter((s) => !!s);
|
|
69
|
+
} catch (e) {
|
|
70
|
+
published = [];
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
published = arr(declared).map(str).filter((s) => !!s);
|
|
74
|
+
}
|
|
75
|
+
const order = [...published, ...Object.keys(dims).filter((k) => !published.includes(k))];
|
|
76
|
+
for (const aspect of order) {
|
|
77
|
+
const dim = obj(dims[aspect]);
|
|
78
|
+
if (!dim) continue;
|
|
79
|
+
const blocks = blocksOf(dim);
|
|
80
|
+
if (blocks.length) return {
|
|
81
|
+
aspect,
|
|
82
|
+
dim,
|
|
83
|
+
blocks
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
function mediaUrlOf(comp) {
|
|
89
|
+
var _a, _b, _c, _d, _e;
|
|
90
|
+
const media = (_c = (_b = obj(comp.media)) != null ? _b : obj((_a = obj(comp.layout)) == null ? void 0 : _a.media)) != null ? _c : obj(comp);
|
|
91
|
+
const url = (_e = (_d = str(media == null ? void 0 : media.url)) != null ? _d : str(media == null ? void 0 : media.src)) != null ? _e : str(comp.url);
|
|
92
|
+
if (!url || CANVAS_SHEET.test(url) || LOGO_PLACEHOLDER.test(url)) return void 0;
|
|
93
|
+
return mirrorMediaUrl(url);
|
|
94
|
+
}
|
|
95
|
+
function isText(comp) {
|
|
96
|
+
return str(comp.sub_type) === "text_composite" || str(comp.compositeType) === "Text";
|
|
97
|
+
}
|
|
98
|
+
function isLogo(comp) {
|
|
99
|
+
var _a;
|
|
100
|
+
return str(comp.sub_type) === "logo" || /logo/i.test((_a = str(comp.name)) != null ? _a : "");
|
|
101
|
+
}
|
|
102
|
+
function textOf(comp) {
|
|
103
|
+
var _a;
|
|
104
|
+
const direct = (_a = str(comp.text)) != null ? _a : str(comp.original_text);
|
|
105
|
+
if (direct) return direct;
|
|
106
|
+
const grains = arr(comp.grains);
|
|
107
|
+
const joined = grains.map((g) => {
|
|
108
|
+
var _a2, _b, _c;
|
|
109
|
+
return (_c = str((_a2 = obj(g)) == null ? void 0 : _a2.text)) != null ? _c : str((_b = obj(g)) == null ? void 0 : _b.original);
|
|
110
|
+
}).filter(Boolean).join(" ").trim();
|
|
111
|
+
return joined || void 0;
|
|
112
|
+
}
|
|
113
|
+
function isVideoUrl(url) {
|
|
114
|
+
return /\.(mp4|mov|webm|m4v)(\?|#|$)/i.test(url) || /\/video\//i.test(url);
|
|
115
|
+
}
|
|
116
|
+
function makeClip(id, type, src, name, durationSec, fillColor) {
|
|
117
|
+
return __spreadValues({
|
|
118
|
+
id,
|
|
119
|
+
itemId: id,
|
|
120
|
+
type,
|
|
121
|
+
src,
|
|
122
|
+
name,
|
|
123
|
+
durationSec,
|
|
124
|
+
trimStartSec: 0,
|
|
125
|
+
trimEndSec: null,
|
|
126
|
+
speed: 1,
|
|
127
|
+
speedCurve: "constant",
|
|
128
|
+
filter: "none",
|
|
129
|
+
kenBurns: null,
|
|
130
|
+
transitionIn: null,
|
|
131
|
+
volume: 1,
|
|
132
|
+
muted: false
|
|
133
|
+
}, fillColor ? {
|
|
134
|
+
fillColor
|
|
135
|
+
} : {});
|
|
136
|
+
}
|
|
137
|
+
function convertInVideoToTimeline(raw) {
|
|
138
|
+
var _a, _b, _c, _d;
|
|
139
|
+
const top = obj(raw);
|
|
140
|
+
const config = configOf(raw);
|
|
141
|
+
if (!top || !config) return null;
|
|
142
|
+
const picked = pickAspect(top, config);
|
|
143
|
+
if (!picked) return null;
|
|
144
|
+
const {
|
|
145
|
+
aspect,
|
|
146
|
+
dim,
|
|
147
|
+
blocks
|
|
148
|
+
} = picked;
|
|
149
|
+
const title = (_b = (_a = str(top.name)) != null ? _a : str(config.name)) != null ? _b : "InVideo template";
|
|
150
|
+
const clips = [];
|
|
151
|
+
const texts = [];
|
|
152
|
+
let logoSrc = null;
|
|
153
|
+
let cursor = 0;
|
|
154
|
+
let clipN = 0;
|
|
155
|
+
let textN = 0;
|
|
156
|
+
for (const block of blocks) {
|
|
157
|
+
const span = Math.max(0.1, block.end - block.start);
|
|
158
|
+
let sceneMedia;
|
|
159
|
+
let sceneType = "image";
|
|
160
|
+
for (const comp of block.components) {
|
|
161
|
+
if (isLogo(comp)) {
|
|
162
|
+
const url2 = mediaUrlOf(comp);
|
|
163
|
+
if (url2 && !logoSrc) logoSrc = url2;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (isText(comp)) {
|
|
167
|
+
const text = textOf(comp);
|
|
168
|
+
if (text) {
|
|
169
|
+
textN += 1;
|
|
170
|
+
texts.push({
|
|
171
|
+
id: `iv-text-${textN}`,
|
|
172
|
+
text,
|
|
173
|
+
startSec: cursor,
|
|
174
|
+
durationSec: span,
|
|
175
|
+
x: 0.5,
|
|
176
|
+
y: 0.5
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const url = mediaUrlOf(comp);
|
|
182
|
+
if (!url) continue;
|
|
183
|
+
if (!sceneMedia) {
|
|
184
|
+
sceneMedia = url;
|
|
185
|
+
sceneType = isVideoUrl(url) ? "video" : "image";
|
|
186
|
+
} else {
|
|
187
|
+
clipN += 1;
|
|
188
|
+
const type = isVideoUrl(url) ? "video" : "image";
|
|
189
|
+
clips.push(makeClip(`iv-clip-${clipN}`, type, url, (_c = str(comp.name)) != null ? _c : "Layer", type === "video" ? span : Math.min(span, DEFAULT_IMAGE_SEC)));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
clipN += 1;
|
|
193
|
+
if (sceneMedia) {
|
|
194
|
+
clips.push(makeClip(`iv-clip-${clipN}`, sceneType, sceneMedia, block.name, sceneType === "video" ? span : Math.min(span, DEFAULT_IMAGE_SEC)));
|
|
195
|
+
} else {
|
|
196
|
+
const fill = "#1e293b";
|
|
197
|
+
clips.push(makeClip(`iv-clip-${clipN}`, "image", solidColorSrc(fill), block.name, span, fill));
|
|
198
|
+
}
|
|
199
|
+
cursor += span;
|
|
200
|
+
}
|
|
201
|
+
const musicSrc = (_d = str(dim.background_music)) != null ? _d : str(config.background_music);
|
|
202
|
+
const music = musicSrc ? mirrorMediaUrl(musicSrc) : void 0;
|
|
203
|
+
const timeline = __spreadValues(__spreadProps(__spreadValues({}, emptyTimeline()), {
|
|
204
|
+
clips,
|
|
205
|
+
texts
|
|
206
|
+
}), music ? {
|
|
207
|
+
soundtrack: {
|
|
208
|
+
audioUrl: music,
|
|
209
|
+
mode: "mix",
|
|
210
|
+
title: "Template music"
|
|
211
|
+
}
|
|
212
|
+
} : {});
|
|
213
|
+
if (timeline.clips.length === 0 && timeline.texts.length === 0) return null;
|
|
214
|
+
return {
|
|
215
|
+
timeline,
|
|
216
|
+
title,
|
|
217
|
+
aspect,
|
|
218
|
+
scenes: blocks.length,
|
|
219
|
+
logoSrc
|
|
220
|
+
};
|
|
221
|
+
}export{convertInVideoToTimeline,isInVideoTemplate};//# sourceMappingURL=invideoNative.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invideoNative.js","sources":["../../../../src/features/canvas/templateImport/invideoNative.ts"],"sourcesContent":["/**\n * Slim native InVideo → EditorTimeline import.\n * Full web converter builds multi-track projects; native keeps a flat clip list\n * in seconds (same shape as promoProjectToTimeline output).\n */\nimport {\n DEFAULT_IMAGE_SEC,\n emptyTimeline,\n solidColorSrc,\n type EditorClip,\n type EditorTimeline,\n type TextClip,\n} from '../videoEditor/editorModel';\nimport { mirrorMediaUrl } from './renderConfig';\n\ntype Json = Record<string, unknown>;\n\nconst obj = (v: unknown): Json | null =>\n typeof v === 'object' && v !== null && !Array.isArray(v) ? (v as Json) : null;\nconst str = (v: unknown): string | undefined => (typeof v === 'string' && v.trim() ? v.trim() : undefined);\nconst num = (v: unknown): number | undefined => (typeof v === 'number' && Number.isFinite(v) ? v : undefined);\nconst arr = (v: unknown): unknown[] => (Array.isArray(v) ? v : []);\n\nconst CANVAS_SHEET = /bguniquecanvas\\.png|unique_canvas\\.png/i;\nconst LOGO_PLACEHOLDER = /addalogo\\.png|Default_Logo\\.png|Default_Black_logo\\.png/i;\n\nexport interface NativeInVideoImport {\n timeline: EditorTimeline;\n title: string;\n aspect: string;\n scenes: number;\n logoSrc: string | null;\n}\n\nfunction configOf(raw: unknown): Json | null {\n const top = obj(raw);\n if (!top) return null;\n const config = obj(top.config);\n if (config && obj(config.video_dimensions)) return config;\n return obj(top.video_dimensions) ? top : null;\n}\n\nexport function isInVideoTemplate(raw: unknown): boolean {\n const config = configOf(raw);\n if (!config) return false;\n return Object.values(obj(config.video_dimensions) ?? {}).some((dim) => {\n const d = obj(dim);\n return !!d && blocksOf(d).length > 0;\n });\n}\n\ninterface Block {\n name: string;\n start: number;\n end: number;\n components: Json[];\n}\n\nfunction blocksOf(dim: Json): Block[] {\n const blocksMap = obj(dim.blocks) ?? {};\n const order = arr(dim.block_start_list)\n .map(str)\n .filter((id): id is string => !!id);\n const ids = order.length ? order : Object.keys(blocksMap);\n return ids\n .map((id) => {\n const b = obj(blocksMap[id]);\n if (!b) return null;\n const start = num(b.start) ?? 0;\n const end = num(b.end) ?? start + 3;\n return {\n name: str(b.name) ?? 'Scene',\n start,\n end: Math.max(end, start + 0.1),\n components: arr(b.components)\n .map(obj)\n .filter((c): c is Json => !!c),\n };\n })\n .filter((b): b is Block => !!b);\n}\n\nfunction pickAspect(top: Json, config: Json): { aspect: string; dim: Json; blocks: Block[] } | null {\n const dims = obj(config.video_dimensions) ?? {};\n let published: string[] = [];\n const declared = top.dimensions ?? config.dimensions;\n if (typeof declared === 'string') {\n try {\n published = arr(JSON.parse(declared))\n .map(str)\n .filter((s): s is string => !!s);\n } catch {\n published = [];\n }\n } else {\n published = arr(declared)\n .map(str)\n .filter((s): s is string => !!s);\n }\n const order = [...published, ...Object.keys(dims).filter((k) => !published.includes(k))];\n for (const aspect of order) {\n const dim = obj(dims[aspect]);\n if (!dim) continue;\n const blocks = blocksOf(dim);\n if (blocks.length) return { aspect, dim, blocks };\n }\n return null;\n}\n\nfunction mediaUrlOf(comp: Json): string | undefined {\n const media = obj(comp.media) ?? obj(obj(comp.layout)?.media) ?? obj(comp);\n const url = str(media?.url) ?? str(media?.src) ?? str(comp.url);\n if (!url || CANVAS_SHEET.test(url) || LOGO_PLACEHOLDER.test(url)) return undefined;\n return mirrorMediaUrl(url);\n}\n\nfunction isText(comp: Json): boolean {\n return str(comp.sub_type) === 'text_composite' || str(comp.compositeType) === 'Text';\n}\n\nfunction isLogo(comp: Json): boolean {\n return str(comp.sub_type) === 'logo' || /logo/i.test(str(comp.name) ?? '');\n}\n\nfunction textOf(comp: Json): string | undefined {\n const direct = str(comp.text) ?? str(comp.original_text);\n if (direct) return direct;\n const grains = arr(comp.grains);\n const joined = grains\n .map((g) => str(obj(g)?.text) ?? str(obj(g)?.original))\n .filter(Boolean)\n .join(' ')\n .trim();\n return joined || undefined;\n}\n\nfunction isVideoUrl(url: string): boolean {\n return /\\.(mp4|mov|webm|m4v)(\\?|#|$)/i.test(url) || /\\/video\\//i.test(url);\n}\n\nfunction makeClip(\n id: string,\n type: 'image' | 'video',\n src: string,\n name: string,\n durationSec: number | null,\n fillColor?: string,\n): EditorClip {\n return {\n id,\n itemId: id,\n type,\n src,\n name,\n durationSec,\n trimStartSec: 0,\n trimEndSec: null,\n speed: 1,\n speedCurve: 'constant',\n filter: 'none',\n kenBurns: null,\n transitionIn: null,\n volume: 1,\n muted: false,\n ...(fillColor ? { fillColor } : {}),\n };\n}\n\n/** Convert an InVideo template payload into the native flat timeline. */\nexport function convertInVideoToTimeline(raw: unknown): NativeInVideoImport | null {\n const top = obj(raw);\n const config = configOf(raw);\n if (!top || !config) return null;\n const picked = pickAspect(top, config);\n if (!picked) return null;\n\n const { aspect, dim, blocks } = picked;\n const title = str(top.name) ?? str(config.name) ?? 'InVideo template';\n const clips: EditorClip[] = [];\n const texts: TextClip[] = [];\n let logoSrc: string | null = null;\n let cursor = 0;\n let clipN = 0;\n let textN = 0;\n\n for (const block of blocks) {\n const span = Math.max(0.1, block.end - block.start);\n let sceneMedia: string | undefined;\n let sceneType: 'video' | 'image' = 'image';\n\n for (const comp of block.components) {\n if (isLogo(comp)) {\n const url = mediaUrlOf(comp);\n if (url && !logoSrc) logoSrc = url;\n continue;\n }\n if (isText(comp)) {\n const text = textOf(comp);\n if (text) {\n textN += 1;\n texts.push({\n id: `iv-text-${textN}`,\n text,\n startSec: cursor,\n durationSec: span,\n x: 0.5,\n y: 0.5,\n });\n }\n continue;\n }\n const url = mediaUrlOf(comp);\n if (!url) continue;\n if (!sceneMedia) {\n sceneMedia = url;\n sceneType = isVideoUrl(url) ? 'video' : 'image';\n } else {\n clipN += 1;\n const type = isVideoUrl(url) ? 'video' : 'image';\n clips.push(\n makeClip(\n `iv-clip-${clipN}`,\n type,\n url,\n str(comp.name) ?? 'Layer',\n type === 'video' ? span : Math.min(span, DEFAULT_IMAGE_SEC),\n ),\n );\n }\n }\n\n clipN += 1;\n if (sceneMedia) {\n clips.push(\n makeClip(\n `iv-clip-${clipN}`,\n sceneType,\n sceneMedia,\n block.name,\n sceneType === 'video' ? span : Math.min(span, DEFAULT_IMAGE_SEC),\n ),\n );\n } else {\n const fill = '#1e293b';\n clips.push(makeClip(`iv-clip-${clipN}`, 'image', solidColorSrc(fill), block.name, span, fill));\n }\n cursor += span;\n }\n\n const musicSrc = str(dim.background_music) ?? str(config.background_music);\n const music = musicSrc ? mirrorMediaUrl(musicSrc) : undefined;\n const timeline: EditorTimeline = {\n ...emptyTimeline(),\n clips,\n texts,\n ...(music\n ? {\n soundtrack: {\n audioUrl: music,\n mode: 'mix' as const,\n title: 'Template music',\n },\n }\n : {}),\n };\n\n if (timeline.clips.length === 0 && timeline.texts.length === 0) return null;\n return { timeline, title, aspect, scenes: blocks.length, logoSrc };\n}\n"],"names":["_a","url"],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {isInVideoTemplate,convertInVideoToTimeline}from'./invideoNative.js';import {pickConfigUrl,fetchRenderConfig}from'./renderConfig.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
|
+
async function loadTemplateTimeline(template, preferAspect) {
|
|
21
|
+
let raw = template.renderConfig;
|
|
22
|
+
if (!raw && template.configUrls && Object.keys(template.configUrls).length > 0) {
|
|
23
|
+
const links = __spreadValues({
|
|
24
|
+
configUrls: template.configUrls
|
|
25
|
+
}, template.defaultAspect ? {
|
|
26
|
+
defaultAspect: template.defaultAspect
|
|
27
|
+
} : {});
|
|
28
|
+
const pick = pickConfigUrl(links, template.aspect);
|
|
29
|
+
if (!pick) throw new Error("This template has no usable render config");
|
|
30
|
+
raw = await fetchRenderConfig(pick.url);
|
|
31
|
+
}
|
|
32
|
+
if (!raw) throw new Error("This template has no render config to import");
|
|
33
|
+
if (!isInVideoTemplate(raw)) throw new Error("This template is not an InVideo render config");
|
|
34
|
+
const imported = convertInVideoToTimeline(raw);
|
|
35
|
+
if (!imported) throw new Error("Could not import template scenes");
|
|
36
|
+
return __spreadProps(__spreadValues({}, imported), {
|
|
37
|
+
title: template.title || imported.title
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function templateHasUsableConfig(template) {
|
|
41
|
+
if (template.renderConfig && isInVideoTemplate(template.renderConfig)) return true;
|
|
42
|
+
return Boolean(template.configUrls && Object.keys(template.configUrls).length > 0);
|
|
43
|
+
}export{loadTemplateTimeline,templateHasUsableConfig};//# sourceMappingURL=loadTemplate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadTemplate.js","sources":["../../../../src/features/canvas/templateImport/loadTemplate.ts"],"sourcesContent":["/**\n * Load a studio/InVideo template into a native EditorTimeline (Use → scenes).\n */\nimport type { CanvasPromptTemplate } from '../canvasChatTemplates';\nimport { convertInVideoToTimeline, isInVideoTemplate, type NativeInVideoImport } from './invideoNative';\nimport { fetchRenderConfig, pickConfigUrl, type RenderConfigLinks } from './renderConfig';\n\nexport async function loadTemplateTimeline(\n template: Pick<CanvasPromptTemplate, 'renderConfig' | 'configUrls' | 'defaultAspect' | 'aspect' | 'title'>,\n preferAspect?: string,\n): Promise<NativeInVideoImport> {\n let raw: unknown = template.renderConfig;\n if (!raw && template.configUrls && Object.keys(template.configUrls).length > 0) {\n const links: RenderConfigLinks = {\n configUrls: template.configUrls,\n ...(template.defaultAspect ? { defaultAspect: template.defaultAspect } : {}),\n };\n const pick = pickConfigUrl(links, preferAspect ?? template.aspect);\n if (!pick) throw new Error('This template has no usable render config');\n raw = await fetchRenderConfig(pick.url);\n }\n if (!raw) throw new Error('This template has no render config to import');\n if (!isInVideoTemplate(raw)) throw new Error('This template is not an InVideo render config');\n const imported = convertInVideoToTimeline(raw);\n if (!imported) throw new Error('Could not import template scenes');\n return {\n ...imported,\n title: template.title || imported.title,\n };\n}\n\nexport function templateHasUsableConfig(template: Pick<CanvasPromptTemplate, 'renderConfig' | 'configUrls'>): boolean {\n if (template.renderConfig && isInVideoTemplate(template.renderConfig)) return true;\n return Boolean(template.configUrls && Object.keys(template.configUrls).length > 0);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAMsB,eAAA,oBAAA,CAAqB,UAA4G,YAAqD,EAAA;AAC1M,EAAA,IAAI,MAAe,QAAS,CAAA,YAAA;AAC5B,EAAI,IAAA,CAAC,GAAO,IAAA,QAAA,CAAS,UAAc,IAAA,MAAA,CAAO,KAAK,QAAS,CAAA,UAAU,CAAE,CAAA,MAAA,GAAS,CAAG,EAAA;AAC9E,IAAA,MAAM,KAA2B,GAAA,cAAA,CAAA;AAAA,MAC/B,YAAY,QAAS,CAAA;AAAA,KAAA,EACjB,SAAS,aAAgB,GAAA;AAAA,MAC3B,eAAe,QAAS,CAAA;AAAA,QACtB,EAAC,CAAA;AAEP,IAAA,MAAM,IAAO,GAAA,aAAA,CAAc,KAAO,EAAgB,SAAS,MAAM,CAAA;AACjE,IAAA,IAAI,CAAC,IAAA,EAAY,MAAA,IAAI,MAAM,2CAA2C,CAAA;AACtE,IAAM,GAAA,GAAA,MAAM,iBAAkB,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA;AAExC,EAAA,IAAI,CAAC,GAAA,EAAW,MAAA,IAAI,MAAM,8CAA8C,CAAA;AACxE,EAAA,IAAI,CAAC,iBAAkB,CAAA,GAAG,GAAS,MAAA,IAAI,MAAM,+CAA+C,CAAA;AAC5F,EAAM,MAAA,QAAA,GAAW,yBAAyB,GAAG,CAAA;AAC7C,EAAA,IAAI,CAAC,QAAA,EAAgB,MAAA,IAAI,MAAM,kCAAkC,CAAA;AACjE,EAAA,OAAO,iCACF,QADE,CAAA,EAAA;AAAA,IAEL,KAAA,EAAO,QAAS,CAAA,KAAA,IAAS,QAAS,CAAA;AAAA,GACpC,CAAA;AACF;AACO,SAAS,wBAAwB,QAA8E,EAAA;AACpH,EAAA,IAAI,SAAS,YAAgB,IAAA,iBAAA,CAAkB,QAAS,CAAA,YAAY,GAAU,OAAA,IAAA;AAC9E,EAAO,OAAA,OAAA,CAAQ,SAAS,UAAc,IAAA,MAAA,CAAO,KAAK,QAAS,CAAA,UAAU,CAAE,CAAA,MAAA,GAAS,CAAC,CAAA;AACnF"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj2, key, value) => key in obj2 ? __defProp(obj2, key, { enumerable: true, configurable: true, writable: true, value }) : obj2[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
const obj = (v) => typeof v === "object" && v !== null && !Array.isArray(v) ? v : null;
|
|
18
|
+
function renderConfigLinks(raw) {
|
|
19
|
+
var _a;
|
|
20
|
+
const summary = obj(raw);
|
|
21
|
+
const dims = obj(summary == null ? void 0 : summary.dimensions);
|
|
22
|
+
if (!dims) return void 0;
|
|
23
|
+
const configUrls = {};
|
|
24
|
+
for (const [aspect, dim] of Object.entries(dims)) {
|
|
25
|
+
const url = (_a = obj(dim)) == null ? void 0 : _a.configUrl;
|
|
26
|
+
if (typeof url === "string" && url) configUrls[aspect] = url;
|
|
27
|
+
}
|
|
28
|
+
if (Object.keys(configUrls).length === 0) return void 0;
|
|
29
|
+
const defaultAspect = typeof (summary == null ? void 0 : summary.defaultDimension) === "string" ? summary.defaultDimension : void 0;
|
|
30
|
+
return __spreadValues({
|
|
31
|
+
configUrls
|
|
32
|
+
}, defaultAspect ? {
|
|
33
|
+
defaultAspect
|
|
34
|
+
} : {});
|
|
35
|
+
}
|
|
36
|
+
function pickConfigUrl(links, preferAspect) {
|
|
37
|
+
const aspect = [preferAspect, links.defaultAspect, ...Object.keys(links.configUrls)].find((a) => !!a && a in links.configUrls);
|
|
38
|
+
return aspect ? {
|
|
39
|
+
aspect,
|
|
40
|
+
url: links.configUrls[aspect]
|
|
41
|
+
} : null;
|
|
42
|
+
}
|
|
43
|
+
async function parseConfigBytes(bytes) {
|
|
44
|
+
const gz = bytes[0] === 31 && bytes[1] === 139;
|
|
45
|
+
if (!gz) {
|
|
46
|
+
return JSON.parse(new TextDecoder().decode(bytes));
|
|
47
|
+
}
|
|
48
|
+
const Decomp = globalThis.DecompressionStream;
|
|
49
|
+
if (!Decomp) throw new Error("Gzip template configs need DecompressionStream");
|
|
50
|
+
const buffer = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
|
|
51
|
+
const body = new Blob([buffer]).stream().pipeThrough(new Decomp("gzip"));
|
|
52
|
+
return JSON.parse(await new Response(body).text());
|
|
53
|
+
}
|
|
54
|
+
const CDN_ORIGIN = "https://cdn.yantra.app/";
|
|
55
|
+
const TEMPLATE_MEDIA = `${CDN_ORIGIN}_side/stackflow150/yantra-video-studio/media/`;
|
|
56
|
+
const S3_PATH_STYLE = /^https?:\/\/s3[.-][a-z0-9-]+\.amazonaws\.com\/([^/]+)\/(.+)$/i;
|
|
57
|
+
const S3_GLOBAL = /^https?:\/\/s3\.amazonaws\.com\/([^/]+)\/(.+)$/i;
|
|
58
|
+
const S3_HOST_STYLE = /^https?:\/\/([a-z0-9.-]+?)\.s3[.-]?[a-z0-9-]*\.amazonaws\.com\/(.+)$/i;
|
|
59
|
+
const ANY_HOST = /^https?:\/\/([^/]+)\/(.+)$/;
|
|
60
|
+
const OUR_HOST = /(^|\.)(yantra\.app|cdebase\.dev)$|\.cloudflarestream\.com$/i;
|
|
61
|
+
const OUR_BUCKET = /^cde-extensions$/i;
|
|
62
|
+
function mirrorPath(key) {
|
|
63
|
+
let decoded = key;
|
|
64
|
+
try {
|
|
65
|
+
decoded = decodeURIComponent(key);
|
|
66
|
+
} catch (e) {
|
|
67
|
+
}
|
|
68
|
+
return decoded.split("/").map(encodeURIComponent).join("/");
|
|
69
|
+
}
|
|
70
|
+
function mirrorMediaUrl(url) {
|
|
71
|
+
var _a, _b;
|
|
72
|
+
if (!url || url.startsWith("data:") || url.startsWith("blob:")) return url;
|
|
73
|
+
const bare = url.split("#")[0].split("?")[0];
|
|
74
|
+
const s3 = (_b = (_a = S3_PATH_STYLE.exec(bare)) != null ? _a : S3_GLOBAL.exec(bare)) != null ? _b : S3_HOST_STYLE.exec(bare);
|
|
75
|
+
if (s3) return OUR_BUCKET.test(s3[1]) ? url : `${TEMPLATE_MEDIA}${s3[1]}/${mirrorPath(s3[2])}`;
|
|
76
|
+
const host = ANY_HOST.exec(bare);
|
|
77
|
+
if (!host || OUR_HOST.test(host[1])) return url;
|
|
78
|
+
return `${TEMPLATE_MEDIA}${host[1].toLowerCase()}/${mirrorPath(host[2])}`;
|
|
79
|
+
}
|
|
80
|
+
function cacheBustedUrl(url, now = Date.now()) {
|
|
81
|
+
return `${url}${url.includes("?") ? "&" : "?"}cb=${now}`;
|
|
82
|
+
}
|
|
83
|
+
async function fetchRenderConfig(url, fetchFn = fetch) {
|
|
84
|
+
let res;
|
|
85
|
+
try {
|
|
86
|
+
res = await fetchFn(url);
|
|
87
|
+
} catch (err) {
|
|
88
|
+
if (!(err instanceof TypeError)) throw err;
|
|
89
|
+
res = await fetchFn(cacheBustedUrl(url));
|
|
90
|
+
}
|
|
91
|
+
if (!res.ok) throw new Error(`Template config fetch failed (${res.status})`);
|
|
92
|
+
return parseConfigBytes(new Uint8Array(await res.arrayBuffer()));
|
|
93
|
+
}export{cacheBustedUrl,fetchRenderConfig,mirrorMediaUrl,parseConfigBytes,pickConfigUrl,renderConfigLinks};//# sourceMappingURL=renderConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderConfig.js","sources":["../../../../src/features/canvas/templateImport/renderConfig.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `editors/video-editor/import/renderConfig.ts`.\n * Catalog rows carry per-aspect config URLs; Use fetches the mirrored InVideo JSON.\n */\n\nexport interface RenderConfigLinks {\n defaultAspect?: string;\n configUrls: Record<string, string>;\n}\n\nconst obj = (v: unknown): Record<string, unknown> | null =>\n typeof v === 'object' && v !== null && !Array.isArray(v) ? (v as Record<string, unknown>) : null;\n\nexport function renderConfigLinks(raw: unknown): RenderConfigLinks | undefined {\n const summary = obj(raw);\n const dims = obj(summary?.dimensions);\n if (!dims) return undefined;\n const configUrls: Record<string, string> = {};\n for (const [aspect, dim] of Object.entries(dims)) {\n const url = obj(dim)?.configUrl;\n if (typeof url === 'string' && url) configUrls[aspect] = url;\n }\n if (Object.keys(configUrls).length === 0) return undefined;\n const defaultAspect = typeof summary?.defaultDimension === 'string' ? summary.defaultDimension : undefined;\n return { configUrls, ...(defaultAspect ? { defaultAspect } : {}) };\n}\n\nexport function pickConfigUrl(links: RenderConfigLinks, preferAspect?: string): { aspect: string; url: string } | null {\n const aspect = [preferAspect, links.defaultAspect, ...Object.keys(links.configUrls)].find(\n (a): a is string => !!a && a in links.configUrls,\n );\n return aspect ? { aspect, url: links.configUrls[aspect] } : null;\n}\n\nexport async function parseConfigBytes(bytes: Uint8Array): Promise<unknown> {\n const gz = bytes[0] === 0x1f && bytes[1] === 0x8b;\n if (!gz) {\n return JSON.parse(new TextDecoder().decode(bytes));\n }\n // React Native may lack DecompressionStream — try when present.\n const Decomp = (globalThis as { DecompressionStream?: typeof DecompressionStream }).DecompressionStream;\n if (!Decomp) throw new Error('Gzip template configs need DecompressionStream');\n const buffer = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n const body = new Blob([buffer]).stream().pipeThrough(new Decomp('gzip'));\n return JSON.parse(await new Response(body).text());\n}\n\nconst CDN_ORIGIN = 'https://cdn.yantra.app/';\nconst TEMPLATE_MEDIA = `${CDN_ORIGIN}_side/stackflow150/yantra-video-studio/media/`;\nconst S3_PATH_STYLE = /^https?:\\/\\/s3[.-][a-z0-9-]+\\.amazonaws\\.com\\/([^/]+)\\/(.+)$/i;\nconst S3_GLOBAL = /^https?:\\/\\/s3\\.amazonaws\\.com\\/([^/]+)\\/(.+)$/i;\nconst S3_HOST_STYLE = /^https?:\\/\\/([a-z0-9.-]+?)\\.s3[.-]?[a-z0-9-]*\\.amazonaws\\.com\\/(.+)$/i;\nconst ANY_HOST = /^https?:\\/\\/([^/]+)\\/(.+)$/;\nconst OUR_HOST = /(^|\\.)(yantra\\.app|cdebase\\.dev)$|\\.cloudflarestream\\.com$/i;\nconst OUR_BUCKET = /^cde-extensions$/i;\n\nfunction mirrorPath(key: string): string {\n let decoded = key;\n try {\n decoded = decodeURIComponent(key);\n } catch {\n // keep as-is\n }\n return decoded.split('/').map(encodeURIComponent).join('/');\n}\n\n/** Remap third-party / InVideo media onto the CDN mirror. */\nexport function mirrorMediaUrl(url: string): string {\n if (!url || url.startsWith('data:') || url.startsWith('blob:')) return url;\n const bare = url.split('#')[0].split('?')[0];\n const s3 = S3_PATH_STYLE.exec(bare) ?? S3_GLOBAL.exec(bare) ?? S3_HOST_STYLE.exec(bare);\n if (s3) return OUR_BUCKET.test(s3[1]) ? url : `${TEMPLATE_MEDIA}${s3[1]}/${mirrorPath(s3[2])}`;\n const host = ANY_HOST.exec(bare);\n if (!host || OUR_HOST.test(host[1])) return url;\n return `${TEMPLATE_MEDIA}${host[1].toLowerCase()}/${mirrorPath(host[2])}`;\n}\n\nexport function cacheBustedUrl(url: string, now = Date.now()): string {\n return `${url}${url.includes('?') ? '&' : '?'}cb=${now}`;\n}\n\nexport async function fetchRenderConfig(url: string, fetchFn: typeof fetch = fetch): Promise<unknown> {\n let res: Response;\n try {\n res = await fetchFn(url);\n } catch (err) {\n if (!(err instanceof TypeError)) throw err;\n res = await fetchFn(cacheBustedUrl(url));\n }\n if (!res.ok) throw new Error(`Template config fetch failed (${res.status})`);\n return parseConfigBytes(new Uint8Array(await res.arrayBuffer()));\n}\n"],"names":[],"mappings":"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"}
|