@adminide-stack/yantra-mobile 12.0.121 → 12.0.123-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/lib/features/apps/appArt.js +1 -1
  2. package/lib/features/apps/appArt.js.map +1 -1
  3. package/lib/features/apps/mobileAppCatalog.js +15 -11
  4. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  5. package/lib/features/canvas/CanvasAgentChatPane.js +82 -20
  6. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  7. package/lib/features/canvas/CanvasBoardsGrid.js +291 -100
  8. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  9. package/lib/features/canvas/CanvasEditToolsPanel.js +105 -12
  10. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  11. package/lib/features/canvas/CanvasExperience.js +266 -68
  12. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  13. package/lib/features/canvas/CanvasGeneratePanel.js +204 -66
  14. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  15. package/lib/features/canvas/CanvasLibrarySheet.js +31 -13
  16. package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
  17. package/lib/features/canvas/CanvasModelPicker.js +176 -0
  18. package/lib/features/canvas/CanvasModelPicker.js.map +1 -0
  19. package/lib/features/canvas/CanvasTasksPanel.js +325 -29
  20. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  21. package/lib/features/canvas/CanvasTemplatesPanel.js +5 -4
  22. package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
  23. package/lib/features/canvas/CanvasToolDock.js +137 -61
  24. package/lib/features/canvas/CanvasToolDock.js.map +1 -1
  25. package/lib/features/canvas/FrameExtractorExperience.js +33 -2
  26. package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
  27. package/lib/features/canvas/GeneratorReferenceSlots.js +197 -0
  28. package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -0
  29. package/lib/features/canvas/NativeCanvasViewer.js +89 -11
  30. package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
  31. package/lib/features/canvas/PromoContextFields.js +55 -2
  32. package/lib/features/canvas/PromoContextFields.js.map +1 -1
  33. package/lib/features/canvas/SetStudioExperience.js +323 -13
  34. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  35. package/lib/features/canvas/VideoEditExperience.js +1 -53
  36. package/lib/features/canvas/VideoEditExperience.js.map +1 -1
  37. package/lib/features/canvas/VideoEditorExperience.js +697 -506
  38. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  39. package/lib/features/canvas/VideoGeneratorExperience.js +22 -5
  40. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  41. package/lib/features/canvas/canvasAgentChat.js +125 -11
  42. package/lib/features/canvas/canvasAgentChat.js.map +1 -1
  43. package/lib/features/canvas/canvasCore.js +117 -12
  44. package/lib/features/canvas/canvasCore.js.map +1 -1
  45. package/lib/features/canvas/canvasEditOps.js +148 -111
  46. package/lib/features/canvas/canvasEditOps.js.map +1 -1
  47. package/lib/features/canvas/canvasTaskSync.js +235 -0
  48. package/lib/features/canvas/canvasTaskSync.js.map +1 -0
  49. package/lib/features/canvas/canvasTasks.js +98 -11
  50. package/lib/features/canvas/canvasTasks.js.map +1 -1
  51. package/lib/features/canvas/createTiles.js +247 -0
  52. package/lib/features/canvas/createTiles.js.map +1 -0
  53. package/lib/features/canvas/deepLinks.js +83 -0
  54. package/lib/features/canvas/deepLinks.js.map +1 -0
  55. package/lib/features/canvas/frameExtract.js +13 -1
  56. package/lib/features/canvas/frameExtract.js.map +1 -1
  57. package/lib/features/canvas/generationModels.js +36 -8
  58. package/lib/features/canvas/generationModels.js.map +1 -1
  59. package/lib/features/canvas/generatorCommands.js +106 -0
  60. package/lib/features/canvas/generatorCommands.js.map +1 -0
  61. package/lib/features/canvas/generatorReferences.js +82 -0
  62. package/lib/features/canvas/generatorReferences.js.map +1 -0
  63. package/lib/features/canvas/homeWork.js +74 -0
  64. package/lib/features/canvas/homeWork.js.map +1 -0
  65. package/lib/features/canvas/linksRpc.js +130 -0
  66. package/lib/features/canvas/linksRpc.js.map +1 -0
  67. package/lib/features/canvas/mediaRecheck.js +176 -0
  68. package/lib/features/canvas/mediaRecheck.js.map +1 -0
  69. package/lib/features/canvas/mediaUrls.js +258 -0
  70. package/lib/features/canvas/mediaUrls.js.map +1 -0
  71. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  72. package/lib/features/canvas/promoProjectImport.js +80 -13
  73. package/lib/features/canvas/promoProjectImport.js.map +1 -1
  74. package/lib/features/canvas/promoVideo.js +106 -15
  75. package/lib/features/canvas/promoVideo.js.map +1 -1
  76. package/lib/features/canvas/reframe.js +228 -0
  77. package/lib/features/canvas/reframe.js.map +1 -0
  78. package/lib/features/canvas/serverTasks.js +697 -0
  79. package/lib/features/canvas/serverTasks.js.map +1 -0
  80. package/lib/features/canvas/set/SetViewportWebView.js +207 -28
  81. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  82. package/lib/features/canvas/set/agent/prompt.js +66 -0
  83. package/lib/features/canvas/set/agent/prompt.js.map +1 -0
  84. package/lib/features/canvas/set/agent/setOps.js +203 -0
  85. package/lib/features/canvas/set/agent/setOps.js.map +1 -0
  86. package/lib/features/canvas/set/agent/setTurn.js +128 -0
  87. package/lib/features/canvas/set/agent/setTurn.js.map +1 -0
  88. package/lib/features/canvas/set/agent/snapshot.js +43 -0
  89. package/lib/features/canvas/set/agent/snapshot.js.map +1 -0
  90. package/lib/features/canvas/set/agent/tools.js +580 -0
  91. package/lib/features/canvas/set/agent/tools.js.map +1 -0
  92. package/lib/features/canvas/set/setProject.js +43 -4
  93. package/lib/features/canvas/set/setProject.js.map +1 -1
  94. package/lib/features/canvas/set/supplyLibrary.js +397 -0
  95. package/lib/features/canvas/set/supplyLibrary.js.map +1 -0
  96. package/lib/features/canvas/storageLibrary.js +113 -52
  97. package/lib/features/canvas/storageLibrary.js.map +1 -1
  98. package/lib/features/canvas/studioCatalog.js +15 -2
  99. package/lib/features/canvas/studioCatalog.js.map +1 -1
  100. package/lib/features/canvas/studioLooks.js +1 -8
  101. package/lib/features/canvas/studioLooks.js.map +1 -1
  102. package/lib/features/canvas/useBoardMediaRefresh.js +66 -0
  103. package/lib/features/canvas/useBoardMediaRefresh.js.map +1 -0
  104. package/lib/features/canvas/useMediaSource.js +84 -0
  105. package/lib/features/canvas/useMediaSource.js.map +1 -0
  106. package/lib/features/canvas/video3d.js +11 -10
  107. package/lib/features/canvas/video3d.js.map +1 -1
  108. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +46 -0
  109. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -0
  110. package/lib/features/canvas/videoEditor/ExportTaskCard.js +134 -0
  111. package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -0
  112. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +45 -7
  113. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  114. package/lib/features/canvas/videoEditor/agent/agentLoop.js +4 -2
  115. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  116. package/lib/features/canvas/videoEditor/agent/attachments.js +304 -0
  117. package/lib/features/canvas/videoEditor/agent/attachments.js.map +1 -0
  118. package/lib/features/canvas/videoEditor/agent/brainClient.js +3 -2
  119. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  120. package/lib/features/canvas/videoEditor/agent/cutTools.js +207 -7
  121. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  122. package/lib/features/canvas/videoEditor/blurBox.js +34 -0
  123. package/lib/features/canvas/videoEditor/blurBox.js.map +1 -0
  124. package/lib/features/canvas/videoEditor/compileTimeline.js +668 -0
  125. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -0
  126. package/lib/features/canvas/videoEditor/editorModel.js +56 -22
  127. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  128. package/lib/features/canvas/videoEditor/exportPipeline.js +77 -0
  129. package/lib/features/canvas/videoEditor/exportPipeline.js.map +1 -0
  130. package/lib/features/canvas/videoEditor/exportRenderer.js +19 -12
  131. package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -1
  132. package/lib/features/canvas/videoEditor/exportTask.js +216 -0
  133. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -0
  134. package/lib/features/canvas/videoEditor/formWidgets.js +142 -0
  135. package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -0
  136. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +195 -0
  137. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -0
  138. package/lib/features/canvas/videoEditor/produce/produceScenes.js +158 -0
  139. package/lib/features/canvas/videoEditor/produce/produceScenes.js.map +1 -0
  140. package/lib/features/canvas/videoEditor/remoteMediaClient.js +17 -5
  141. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  142. package/lib/features/canvas/videoEditor/renderTimeline.js +207 -0
  143. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -0
  144. package/lib/features/canvas/videoEditor/renewLinks.js +64 -0
  145. package/lib/features/canvas/videoEditor/renewLinks.js.map +1 -0
  146. package/lib/features/canvas/videoEditor/sceneLayers.js +101 -0
  147. package/lib/features/canvas/videoEditor/sceneLayers.js.map +1 -0
  148. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +283 -0
  149. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -0
  150. package/lib/features/canvas/videoEditor/tools/catalog.js +576 -0
  151. package/lib/features/canvas/videoEditor/tools/catalog.js.map +1 -0
  152. package/lib/features/canvas/videoEditor/videoProjectsStore.js +27 -3
  153. package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -1
  154. package/lib/features/webbuilder/WebBuilderExperience.js +29 -1
  155. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  156. package/lib/features/webbuilder/buildFragments.js +8 -4
  157. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  158. package/lib/features/webbuilder/codezenHandoff.js +108 -0
  159. package/lib/features/webbuilder/codezenHandoff.js.map +1 -0
  160. package/lib/features/webbuilder/workflow.js.map +1 -1
  161. package/lib/hooks/useChatApi.js +1 -2
  162. package/lib/hooks/useChatApi.js.map +1 -1
  163. package/lib/screens/CanvasBoard/index.js +12 -1
  164. package/lib/screens/CanvasBoard/index.js.map +1 -1
  165. package/lib/screens/Home/HomeScreen.js.map +1 -1
  166. package/lib/screens/Home/components/HomeSuggestions.js +3 -3
  167. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
  168. package/lib/screens/WebBuilder/index.js +4 -2
  169. package/lib/screens/WebBuilder/index.js.map +1 -1
  170. package/lib/screens/WebBuilderNative/index.js +29 -2
  171. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  172. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +30 -6
  173. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  174. package/package.json +4 -4
  175. /package/lib/assets/apps/{paper2poster.webp → poster.webp} +0 -0
@@ -1,4 +1,4 @@
1
- import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useMemo,useState,useRef,useEffect,useCallback}from'react';import {StyleSheet,useColorScheme,View,Text,Pressable,ActivityIndicator}from'react-native';import {NativeCanvasViewer}from'./NativeCanvasViewer.js';import {CanvasBoardsGrid}from'./CanvasBoardsGrid.js';import {CanvasAgentChatPane}from'./CanvasAgentChatPane.js';import {VideoEditorExperience}from'./VideoEditorExperience.js';import {ImageEditorExperience}from'./ImageEditorExperience.js';import {AudioEditorExperience}from'./AudioEditorExperience.js';import {friendlyMediaError}from'./videoEditor/mediaActions.js';import {createRemoteRunAction,createRemoteUploadMedia,proxiedMediaUrl}from'./videoEditor/remoteMediaClient.js';import {renderExportSpec}from'./videoEditor/exportRenderer.js';import {getCachedCanvasBoards,fetchMyCanvasBoards,pushCanvasBoard}from'./surfaceIndex.js';import {readCachedCanvasBoards,writeCachedCanvasBoards}from'./canvasBoardsCatalog.js';import {hydrateCanvasBoardsSnapshot,persistCanvasBoardsSnapshot}from'./canvasBoardsSnapshot.js';import {boardSignature,frameForUpload,buildBoardState,dimsForAspect,newBoardId,emptyBoardState}from'./canvasCore.js';import {promoProjectToTimeline}from'./promoProjectImport.js';import {loadTemplateTimeline}from'./templateImport/loadTemplate.js';import {CanvasToolDock}from'./CanvasToolDock.js';import {describeSession}from'./sessionIdentity.js';import {DesignExperience}from'../design/DesignExperience.js';import {fetchMyDesigns}from'../design/designIndex.js';import {VideoGeneratorExperience}from'./VideoGeneratorExperience.js';import {VideoEditExperience}from'./VideoEditExperience.js';import {VideoClipsExperience}from'./VideoClipsExperience.js';import {FrameExtractorExperience}from'./FrameExtractorExperience.js';import {MoodboardExperience}from'./MoodboardExperience.js';import {SetStudioExperience}from'./SetStudioExperience.js';import {InfluencerStudioExperience}from'./InfluencerStudioExperience.js';import {CameraRecorderExperience}from'./recorder/CameraRecorderExperience.js';import {listStudioLooks}from'./studioLooks.js';var __defProp = Object.defineProperty;
1
+ import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useMemo,useState,useRef,useEffect,useCallback}from'react';import {StyleSheet,useColorScheme,Image,View,Text,Pressable,ActivityIndicator}from'react-native';import {NativeCanvasViewer}from'./NativeCanvasViewer.js';import {CanvasBoardsGrid}from'./CanvasBoardsGrid.js';import {CanvasAgentChatPane}from'./CanvasAgentChatPane.js';import {VideoEditorExperience}from'./VideoEditorExperience.js';import {ImageEditorExperience}from'./ImageEditorExperience.js';import {AudioEditorExperience}from'./AudioEditorExperience.js';import {friendlyMediaError}from'./videoEditor/mediaActions.js';import {createRemoteRunAction,createRemoteUploadMedia,proxiedMediaUrl,unwrapProxyUrl}from'./videoEditor/remoteMediaClient.js';import {renderExportSpec}from'./videoEditor/exportRenderer.js';import {startExportTask}from'./videoEditor/exportTask.js';import {useCanvasTask,ExportTaskCard}from'./videoEditor/ExportTaskCard.js';import {markTaskDelivered,dismissTask}from'./canvasTasks.js';import {getCachedCanvasBoards,fetchMyCanvasBoards,pushCanvasBoard}from'./surfaceIndex.js';import {useMediaSigning,useBoardMediaRefresh,applySrcRenewals}from'./useBoardMediaRefresh.js';import {readCachedCanvasBoards,writeCachedCanvasBoards}from'./canvasBoardsCatalog.js';import {hydrateCanvasBoardsSnapshot,persistCanvasBoardsSnapshot}from'./canvasBoardsSnapshot.js';import {boardSignature,mediaItemsFor,buildBoardState,reconcileDismissed,newBoardId,emptyBoardState,dimsForAspect,mediaKey}from'./canvasCore.js';import {visibleCreateGroups}from'./createTiles.js';import {parseDesignLink,parseMediaLink,parseCreateTileLink}from'./deepLinks.js';import {promoProjectToTimeline}from'./promoProjectImport.js';import {loadTemplateTimeline}from'./templateImport/loadTemplate.js';import {CanvasToolDock}from'./CanvasToolDock.js';import {describeSession}from'./sessionIdentity.js';import {DesignExperience}from'../design/DesignExperience.js';import {fetchMyDesigns}from'../design/designIndex.js';import {VideoGeneratorExperience}from'./VideoGeneratorExperience.js';import {VideoEditExperience}from'./VideoEditExperience.js';import {VideoClipsExperience}from'./VideoClipsExperience.js';import {FrameExtractorExperience}from'./FrameExtractorExperience.js';import {MoodboardExperience}from'./MoodboardExperience.js';import {SetStudioExperience}from'./SetStudioExperience.js';import {configureServerTasks}from'./serverTasks.js';import {setCanvasTasksHost}from'./canvasTaskSync.js';import {InfluencerStudioExperience}from'./InfluencerStudioExperience.js';import {CameraRecorderExperience}from'./recorder/CameraRecorderExperience.js';import {listStudioLooks}from'./studioLooks.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -28,6 +28,43 @@ function untitledBoard(channelId) {
28
28
  };
29
29
  }
30
30
  const SAVE_DEBOUNCE_MS = 600;
31
+ const MEDIA_LINK_MEASURE_MS = 1500;
32
+ const boardMediaKey = (src) => mediaKey(src, unwrapProxyUrl);
33
+ function placementFor(type, src, opts) {
34
+ var _a;
35
+ const maxEdge = type === "video" ? 640 : 600;
36
+ const size = (opts == null ? void 0 : opts.aspect) ? dimsForAspect(opts.aspect, maxEdge) : opts == null ? void 0 : opts.size;
37
+ return __spreadValues({
38
+ type,
39
+ src,
40
+ label: (_a = opts == null ? void 0 : opts.name) != null ? _a : type === "video" ? "Edited video" : type
41
+ }, size ? {
42
+ size
43
+ } : {});
44
+ }
45
+ function placementForPicked(item) {
46
+ return __spreadValues(__spreadValues(__spreadValues({
47
+ type: item.type,
48
+ src: item.src
49
+ }, item.generatedAssetName ? {
50
+ label: item.generatedAssetName
51
+ } : {}), item.width > 0 && item.height > 0 ? {
52
+ size: {
53
+ width: item.width,
54
+ height: item.height
55
+ }
56
+ } : {}), item.hasAudio === false ? {
57
+ hasAudio: false
58
+ } : {});
59
+ }
60
+ function withTombstones(prev, next) {
61
+ var _a;
62
+ const dismissed = reconcileDismissed(prev.items, next.items, (_a = prev.dismissed) != null ? _a : [], boardMediaKey);
63
+ const out = __spreadValues({}, next);
64
+ if (dismissed.length > 0) out.dismissed = dismissed;
65
+ else delete out.dismissed;
66
+ return out;
67
+ }
31
68
  function CanvasExperience({
32
69
  token,
33
70
  indexUrl,
@@ -42,14 +79,25 @@ function CanvasExperience({
42
79
  audioRecorder,
43
80
  runMediaAction,
44
81
  apolloClient,
82
+ createTile,
83
+ media,
84
+ designId,
85
+ designTemplateId,
86
+ artifactId,
45
87
  testID
46
88
  }) {
47
89
  var _a, _b, _c, _d, _e, _f, _g;
48
90
  const isDark = useColorScheme() === "dark";
49
91
  const effectiveRunAction = useMemo(() => runMediaAction != null ? runMediaAction : token && indexUrl ? createRemoteRunAction(token, indexUrl) : void 0, [runMediaAction, token, indexUrl]);
92
+ useMemo(() => configureServerTasks({
93
+ token,
94
+ indexUrl
95
+ }), [token, indexUrl]);
50
96
  const effectiveUploadMedia = useMemo(() => uploadMedia != null ? uploadMedia : token && indexUrl ? createRemoteUploadMedia(token, indexUrl) : void 0, [uploadMedia, token, indexUrl]);
51
97
  const cachedBoards = (_a = getCachedCanvasBoards(indexUrl)) != null ? _a : apolloClient ? readCachedCanvasBoards(apolloClient) : null;
52
98
  const [boards, setBoards] = useState(() => cachedBoards != null ? cachedBoards : []);
99
+ const boardsRef = useRef(boards);
100
+ boardsRef.current = boards;
53
101
  const [loading, setLoading] = useState(!explicitBoard && cachedBoards == null);
54
102
  const [error, setError] = useState(null);
55
103
  const [selectedId, setSelectedId] = useState(null);
@@ -59,7 +107,21 @@ function CanvasExperience({
59
107
  const [mediaBusy, setMediaBusy] = useState(false);
60
108
  const [uploadStatus, setUploadStatus] = useState(null);
61
109
  const lastSavedByIdRef = useRef({});
110
+ const [boardsSettled, setBoardsSettled] = useState(false);
62
111
  const skipFetch = Boolean(explicitBoard);
112
+ const tasksBoardsRef = useRef(boards);
113
+ tasksBoardsRef.current = boards;
114
+ useEffect(() => {
115
+ setCanvasTasksHost({
116
+ openBoardId: selectedId,
117
+ openBoard: (id) => setSelectedId(id),
118
+ boardLabel: (id) => {
119
+ var _a2;
120
+ return ((_a2 = tasksBoardsRef.current.find((entry) => entry.channelId === id)) == null ? void 0 : _a2.title) || void 0;
121
+ },
122
+ runAction: effectiveRunAction
123
+ });
124
+ }, [selectedId, effectiveRunAction]);
63
125
  useEffect(() => {
64
126
  if (skipFetch || !indexUrl) return void 0;
65
127
  let cancelled = false;
@@ -113,6 +175,7 @@ function CanvasExperience({
113
175
  if (result.error) {
114
176
  if (!hasCache) setError(result.error);
115
177
  setLoading(false);
178
+ setBoardsSettled(true);
116
179
  return;
117
180
  }
118
181
  lastSavedByIdRef.current = Object.fromEntries(result.boards.map((entry) => [entry.channelId, boardSignature(entry.board)]));
@@ -120,6 +183,7 @@ function CanvasExperience({
120
183
  writeCachedCanvasBoards(apolloClient, result.boards);
121
184
  setError(null);
122
185
  setLoading(false);
186
+ setBoardsSettled(true);
123
187
  })();
124
188
  return () => {
125
189
  cancelled = true;
@@ -136,6 +200,16 @@ function CanvasExperience({
136
200
  if (match) setSelectedId(match.channelId);
137
201
  }, [boards, channelId, selectedId]);
138
202
  const selected = useMemo(() => selectedId ? boards.find((entry) => entry.channelId === selectedId) : void 0, [boards, selectedId]);
203
+ useMediaSigning(token, indexUrl);
204
+ useBoardMediaRefresh(selected == null ? void 0 : selected.channelId, selected == null ? void 0 : selected.board.items, effectiveRunAction, (boardId, renewals) => setBoards((prev) => prev.map((entry) => {
205
+ if (entry.channelId !== boardId) return entry;
206
+ const items = applySrcRenewals(entry.board.items, renewals);
207
+ return items === entry.board.items ? entry : __spreadProps(__spreadValues({}, entry), {
208
+ board: __spreadProps(__spreadValues({}, entry.board), {
209
+ items
210
+ })
211
+ });
212
+ })));
139
213
  const playableBoard = useCallback((board) => {
140
214
  if (!indexUrl) return board;
141
215
  return __spreadProps(__spreadValues({}, board), {
@@ -182,7 +256,9 @@ function CanvasExperience({
182
256
  const reload = useCallback(() => setGeneration((n) => n + 1), []);
183
257
  const handleBoardChange = useCallback((board) => {
184
258
  setBoards((prev) => prev.map((entry) => entry.channelId === selectedId ? __spreadProps(__spreadValues({}, entry), {
185
- board,
259
+ // A delete must leave a tombstone, or web's channel
260
+ // drain puts the media straight back (web #530).
261
+ board: withTombstones(entry.board, board),
186
262
  title: board.title || entry.title,
187
263
  itemCount: board.items.length,
188
264
  savedAt: board.savedAt
@@ -201,9 +277,9 @@ function CanvasExperience({
201
277
  const targetId = selectedId != null ? selectedId : list[0].channelId;
202
278
  return list.map((entry) => {
203
279
  if (entry.channelId !== targetId) return entry;
204
- const startZ = entry.board.items.length;
205
- const items = [...entry.board.items, ...picked.map((item, i) => __spreadProps(__spreadValues(__spreadValues({}, item), frameForUpload(item.type)), {
206
- zIndex: startZ + i + 1
280
+ const placed = mediaItemsFor(entry.board.items, picked.map(placementForPicked));
281
+ const items = [...entry.board.items, ...picked.map((item, i) => __spreadProps(__spreadValues(__spreadValues({}, item), placed[i]), {
282
+ id: item.id || placed[i].id
207
283
  }))];
208
284
  const nextState = buildBoardState(items, entry.board.zoom, entry.title);
209
285
  return __spreadProps(__spreadValues({}, entry), {
@@ -244,7 +320,7 @@ function CanvasExperience({
244
320
  }, []);
245
321
  useEffect(() => {
246
322
  if (skipFetch || loading || !token || !indexUrl || !selected) return void 0;
247
- const state = buildBoardState(selected.board.items, selected.board.zoom, selected.title);
323
+ const state = buildBoardState(selected.board.items, selected.board.zoom, selected.title, selected.board.dismissed);
248
324
  if (state.items.length === 0) return void 0;
249
325
  const sig = boardSignature(state);
250
326
  if (lastSavedByIdRef.current[selected.channelId] === sig) return void 0;
@@ -272,6 +348,8 @@ function CanvasExperience({
272
348
  const [showRecorder, setShowRecorder] = useState(false);
273
349
  const [boardSelectedItem, setBoardSelectedItem] = useState(null);
274
350
  const [exporting, setExporting] = useState(null);
351
+ const [exportTaskId, setExportTaskId] = useState(null);
352
+ const exportTask = useCanvasTask(exportTaskId);
275
353
  const [designEntry, setDesignEntry] = useState(null);
276
354
  const [designs, setDesigns] = useState([]);
277
355
  const [featuredLooks, setFeaturedLooks] = useState([]);
@@ -309,28 +387,20 @@ function CanvasExperience({
309
387
  };
310
388
  }, [apolloClient, effectiveRunAction, indexUrl, token]);
311
389
  const addBoardItem = useCallback((type, url, opts) => {
312
- var _a2;
313
- const maxEdge = type === "video" ? 640 : 600;
314
- const frame = (opts == null ? void 0 : opts.aspect) ? __spreadValues({
315
- x: 100,
316
- y: 100
317
- }, dimsForAspect(opts.aspect, maxEdge)) : frameForUpload(type);
390
+ var _a2, _b2;
318
391
  const src = indexUrl ? proxiedMediaUrl(indexUrl, url) : url;
319
- const item = __spreadValues({
320
- id: newBoardId(),
321
- type,
322
- src,
323
- generatedAssetName: (_a2 = opts == null ? void 0 : opts.name) != null ? _a2 : type === "video" ? "Edited video" : type,
324
- zIndex: 1
325
- }, frame);
392
+ const placement = placementFor(type, src, opts);
393
+ const target = (_a2 = boardsRef.current.find((entry) => entry.channelId === selectedId)) != null ? _a2 : boardsRef.current[0];
394
+ const item = mediaItemsFor((_b2 = target == null ? void 0 : target.board.items) != null ? _b2 : [], [placement])[0];
326
395
  setBoards((prev) => {
327
396
  const list = prev.length ? prev : [untitledBoard(channelId)];
328
397
  const targetId = selectedId != null ? selectedId : list[0].channelId;
329
398
  return list.map((entry) => {
330
399
  if (entry.channelId !== targetId) return entry;
331
- const items = [...entry.board.items, __spreadProps(__spreadValues({}, item), {
332
- zIndex: entry.board.items.length + 1
333
- })];
400
+ const [placed] = mediaItemsFor(entry.board.items, [__spreadProps(__spreadValues({}, placement), {
401
+ id: item.id
402
+ })]);
403
+ const items = [...entry.board.items, placed];
334
404
  const nextState = buildBoardState(items, entry.board.zoom, entry.title);
335
405
  return __spreadProps(__spreadValues({}, entry), {
336
406
  title: nextState.title || entry.title,
@@ -346,24 +416,10 @@ function CanvasExperience({
346
416
  return item;
347
417
  }, [selectedId, channelId, indexUrl]);
348
418
  const openFreshBoardWithItem = useCallback((type, url, opts) => {
349
- var _a2;
350
- const maxEdge = type === "video" ? 640 : 600;
351
- const frame = (opts == null ? void 0 : opts.aspect) ? __spreadValues({
352
- x: 100,
353
- y: 100
354
- }, dimsForAspect(opts.aspect, maxEdge)) : frameForUpload(type);
355
419
  const src = indexUrl ? proxiedMediaUrl(indexUrl, url) : url;
356
- const item = __spreadValues({
357
- id: newBoardId(),
358
- type,
359
- src,
360
- generatedAssetName: (_a2 = opts == null ? void 0 : opts.name) != null ? _a2 : type === "video" ? "Edited video" : type,
361
- zIndex: 1
362
- }, frame);
420
+ const item = mediaItemsFor([], [placementFor(type, src, opts)])[0];
363
421
  const entry = untitledBoard();
364
- const items = [__spreadProps(__spreadValues({}, item), {
365
- zIndex: 1
366
- })];
422
+ const items = [item];
367
423
  const nextState = buildBoardState(items, entry.board.zoom, entry.title);
368
424
  const next = __spreadProps(__spreadValues({}, entry), {
369
425
  title: nextState.title || entry.title,
@@ -385,11 +441,15 @@ function CanvasExperience({
385
441
  const src = indexUrl ? proxiedMediaUrl(indexUrl, url) : url;
386
442
  setBoards((prev) => prev.map((entry) => {
387
443
  if (entry.channelId !== selectedId) return entry;
388
- const items = entry.board.items.map((item) => item.id === itemId ? __spreadValues(__spreadProps(__spreadValues({}, item), {
389
- src
390
- }), type ? {
391
- type
392
- } : {}) : item);
444
+ const items = entry.board.items.map((item) => (
445
+ // New media: the old short link would point at the old object.
446
+ item.id === itemId ? __spreadValues(__spreadProps(__spreadValues({}, item), {
447
+ src,
448
+ share: void 0
449
+ }), type ? {
450
+ type
451
+ } : {}) : item
452
+ ));
393
453
  const nextState = buildBoardState(items, entry.board.zoom, entry.title);
394
454
  return __spreadProps(__spreadValues({}, entry), {
395
455
  board: __spreadProps(__spreadValues({}, entry.board), {
@@ -408,13 +468,20 @@ function CanvasExperience({
408
468
  return (spec) => {
409
469
  if (exportBusyRef.current) return;
410
470
  exportBusyRef.current = true;
411
- setExporting({
412
- stage: "Starting render"
413
- });
414
- void renderExportSpec(spec, runAction, upload, (p) => setExporting(p)).then((url) => {
415
- addRenderedVideo(url);
416
- setEditorSeed(null);
417
- setExporting(null);
471
+ void startExportTask(runAction, {
472
+ spec,
473
+ boardId: selectedId != null ? selectedId : "",
474
+ brief: (editorSeed == null ? void 0 : editorSeed.projectTitle) || (selected == null ? void 0 : selected.board.title) || (selected == null ? void 0 : selected.title) || "Video export",
475
+ upload
476
+ }).then((id) => setExportTaskId(id)).catch(() => {
477
+ setExporting({
478
+ stage: "Starting render"
479
+ });
480
+ return renderExportSpec(spec, runAction, upload, (p) => setExporting(p)).then((url) => {
481
+ addRenderedVideo(url);
482
+ setEditorSeed(null);
483
+ setExporting(null);
484
+ });
418
485
  }).catch((err) => {
419
486
  setExporting({
420
487
  stage: "",
@@ -424,7 +491,15 @@ function CanvasExperience({
424
491
  exportBusyRef.current = false;
425
492
  });
426
493
  };
427
- }, [onExportVideo, effectiveRunAction, effectiveUploadMedia, addRenderedVideo]);
494
+ }, [onExportVideo, effectiveRunAction, effectiveUploadMedia, addRenderedVideo, selectedId, editorSeed, selected]);
495
+ useEffect(() => {
496
+ var _a2;
497
+ if (!exportTask || exportTask.state !== "succeeded" || exportTask.delivered || !((_a2 = exportTask.result) == null ? void 0 : _a2.url)) return;
498
+ markTaskDelivered(exportTask.id);
499
+ addRenderedVideo(exportTask.result.url);
500
+ setEditorSeed(null);
501
+ setExportTaskId(null);
502
+ }, [exportTask, addRenderedVideo]);
428
503
  const handleItemAction = useCallback((action, item) => {
429
504
  if (action === "create-video") {
430
505
  setGenerator({
@@ -486,6 +561,128 @@ function CanvasExperience({
486
561
  } catch (e) {
487
562
  }
488
563
  }, []);
564
+ const pickThenEdit = useCallback(async (kind) => {
565
+ if (!onPickLocalMedia) return;
566
+ try {
567
+ const picked = await onPickLocalMedia(void 0, kind === "image" ? "library" : "file");
568
+ const first = picked.find((p) => p.type === kind);
569
+ if (!first) return;
570
+ const item = openFreshBoardWithItem(kind, first.src, __spreadValues({
571
+ name: first.generatedAssetName
572
+ }, first.width > 0 && first.height > 0 ? {
573
+ size: {
574
+ width: first.width,
575
+ height: first.height
576
+ }
577
+ } : {}));
578
+ setMediaEdit({
579
+ kind,
580
+ item
581
+ });
582
+ } catch (err) {
583
+ if (__DEV__) {
584
+ console.warn("[CanvasExperience] pick for editor failed:", err);
585
+ }
586
+ }
587
+ }, [onPickLocalMedia, openFreshBoardWithItem]);
588
+ const canRunCreate = useCallback((action) => action.type !== "studio" || action.studio !== "image" && action.studio !== "audio" || Boolean(onPickLocalMedia && effectiveRunAction), [onPickLocalMedia, effectiveRunAction]);
589
+ const createGroups = useMemo(() => visibleCreateGroups(canRunCreate), [canRunCreate]);
590
+ const handleCreate = useCallback((action) => {
591
+ if (action.type === "design") {
592
+ setDesignEntry({
593
+ kind: action.kind
594
+ });
595
+ return;
596
+ }
597
+ if (action.type === "generate") {
598
+ if (action.mode === "slides") {
599
+ setDesignEntry({
600
+ kind: "design"
601
+ });
602
+ return;
603
+ }
604
+ handleNewCanvas();
605
+ if (action.mode === "clips") setVideoClips("url");
606
+ else setGenerator({
607
+ mode: action.mode
608
+ });
609
+ return;
610
+ }
611
+ if (action.studio === "image" || action.studio === "audio") {
612
+ void pickThenEdit(action.studio);
613
+ return;
614
+ }
615
+ handleNewCanvas();
616
+ switch (action.studio) {
617
+ case "record":
618
+ setShowRecorder(true);
619
+ return;
620
+ case "ai-cut":
621
+ handleDockStudio("agent");
622
+ return;
623
+ case "set":
624
+ handleDockStudio("set3d");
625
+ return;
626
+ default:
627
+ handleDockStudio(action.studio);
628
+ }
629
+ }, [handleNewCanvas, handleDockStudio, pickThenEdit]);
630
+ const openMediaLink = useCallback(async (link) => {
631
+ var _a2, _b2, _c2;
632
+ const size = link.kind === "image" ? await new Promise((resolve) => {
633
+ const timer = setTimeout(() => resolve(void 0), MEDIA_LINK_MEASURE_MS);
634
+ Image.getSize(link.src, (width, height) => {
635
+ clearTimeout(timer);
636
+ resolve(width > 0 && height > 0 ? {
637
+ width,
638
+ height
639
+ } : void 0);
640
+ }, () => {
641
+ clearTimeout(timer);
642
+ resolve(void 0);
643
+ });
644
+ }) : void 0;
645
+ const item = openFreshBoardWithItem(link.kind, link.src, __spreadValues({
646
+ name: (_c2 = (_b2 = link.name) != null ? _b2 : (_a2 = link.fileName) == null ? void 0 : _a2.replace(/\.[^.]+$/, "")) != null ? _c2 : link.kind === "image" ? "Image" : "Video"
647
+ }, size ? {
648
+ size
649
+ } : {}));
650
+ if (link.kind === "video") setEditorSeed({
651
+ itemId: item.id
652
+ });
653
+ else if (effectiveRunAction) setMediaEdit({
654
+ kind: "image",
655
+ item
656
+ });
657
+ }, [openFreshBoardWithItem, effectiveRunAction]);
658
+ const designLinkRanRef = useRef(false);
659
+ useEffect(() => {
660
+ if (designLinkRanRef.current || skipFetch) return;
661
+ designLinkRanRef.current = true;
662
+ const entry = parseDesignLink({
663
+ designId,
664
+ designTemplateId,
665
+ artifactId
666
+ });
667
+ if (entry) setDesignEntry(entry);
668
+ }, []);
669
+ const boardLinkRanRef = useRef(false);
670
+ useEffect(() => {
671
+ if (boardLinkRanRef.current || skipFetch || !boardsSettled) return;
672
+ boardLinkRanRef.current = true;
673
+ if (parseDesignLink({
674
+ designId,
675
+ designTemplateId,
676
+ artifactId
677
+ })) return;
678
+ const mediaLink = parseMediaLink(media);
679
+ if (mediaLink) {
680
+ void openMediaLink(mediaLink);
681
+ return;
682
+ }
683
+ const action = parseCreateTileLink(createTile);
684
+ if (action) handleCreate(action);
685
+ }, [boardsSettled, skipFetch]);
489
686
  if (generator) {
490
687
  return /* @__PURE__ */ jsx(VideoGeneratorExperience, { mode: generator.mode, item: generator.item, restyle: generator.restyle, initialPrompt: generator.initialPrompt, runAction: effectiveRunAction, onClose: () => setGenerator(null), onGenerated: (url, meta) => {
491
688
  const kind = meta.mode === "audio" ? "audio" : meta.mode === "image" ? "image" : "video";
@@ -523,7 +720,7 @@ function CanvasExperience({
523
720
  } });
524
721
  }
525
722
  if (showSet3d) {
526
- return /* @__PURE__ */ jsx(SetStudioExperience, { boardItems: (_d = selected == null ? void 0 : selected.board.items) != null ? _d : [], runAction: effectiveRunAction, uploadMedia: effectiveUploadMedia, onClose: () => setShowSet3d(false), onPlace: (kind, url, name) => {
723
+ return /* @__PURE__ */ jsx(SetStudioExperience, { boardItems: (_d = selected == null ? void 0 : selected.board.items) != null ? _d : [], runAction: effectiveRunAction, uploadMedia: effectiveUploadMedia, token, indexUrl, onClose: () => setShowSet3d(false), onPlace: (kind, url, name) => {
527
724
  addBoardItem(kind, url, {
528
725
  name
529
726
  });
@@ -596,7 +793,10 @@ function CanvasExperience({
596
793
  if (editorSeed) {
597
794
  return /* @__PURE__ */ jsxs(View, { style: styles.fill, children: [
598
795
  /* @__PURE__ */ jsx(VideoEditorExperience, { items: (_g = selected == null ? void 0 : selected.board.items) != null ? _g : [], seedItemId: editorSeed.itemId, initialTimeline: editorSeed.initialTimeline, projectTitle: editorSeed.projectTitle || (selected == null ? void 0 : selected.board.title) || (selected == null ? void 0 : selected.title), initialLogoSrc: editorSeed.logoSrc, onClose: () => setEditorSeed(null), onExport: effectiveOnExport, onPickLocalMedia, runAction: effectiveRunAction, uploadMedia: effectiveUploadMedia, audioRecorder, apolloClient, token, indexUrl, initialRailTab: editorSeed.initialRailTab }),
599
- exporting ? /* @__PURE__ */ jsx(View, { style: styles.exportOverlay, children: /* @__PURE__ */ jsx(View, { style: styles.exportCard, children: exporting.error ? /* @__PURE__ */ jsxs(Fragment, { children: [
796
+ exportTask ? /* @__PURE__ */ jsx(View, { style: styles.exportOverlay, children: /* @__PURE__ */ jsx(ExportTaskCard, { task: exportTask, onDismiss: () => {
797
+ dismissTask(exportTask.id);
798
+ setExportTaskId(null);
799
+ }, onBackground: () => setExportTaskId(null) }) }) : exporting ? /* @__PURE__ */ jsx(View, { style: styles.exportOverlay, children: /* @__PURE__ */ jsx(View, { style: styles.exportCard, children: exporting.error ? /* @__PURE__ */ jsxs(Fragment, { children: [
600
800
  /* @__PURE__ */ jsx(Text, { style: styles.exportError, children: "Export failed" }),
601
801
  /* @__PURE__ */ jsx(Text, { style: styles.exportStage, numberOfLines: 4, children: exporting.error }),
602
802
  /* @__PURE__ */ jsx(Pressable, { onPress: () => setExporting(null), style: styles.exportDismiss, accessibilityRole: "button", children: /* @__PURE__ */ jsx(Text, { style: styles.exportDismissLabel, children: "Dismiss" }) })
@@ -612,19 +812,9 @@ function CanvasExperience({
612
812
  if (!selected) {
613
813
  return /* @__PURE__ */ jsxs(View, { style: styles.fill, testID, children: [
614
814
  loading && boards.length === 0 ? /* @__PURE__ */ jsx(View, { style: styles.gridLoading, pointerEvents: "none", children: /* @__PURE__ */ jsx(ActivityIndicator, { size: "small" }) }) : null,
615
- /* @__PURE__ */ jsx(CanvasBoardsGrid, { boards: boards.filter((entry) => entry.itemCount > 0), onOpen: setSelectedId, onNewCanvas: handleNewCanvas, designs, onOpenDesign: (channelId2) => setDesignEntry({
616
- channelId: channelId2
617
- }), onNewDesign: (kind) => setDesignEntry({
618
- kind
619
- }), onAskAgent: handleAskAgentFromGrid, onComposeGenerate: ({
620
- mode,
621
- prompt
622
- }) => {
623
- setGenerator({
624
- mode,
625
- initialPrompt: prompt
626
- });
627
- }, featuredLooks, onRecreateLook: (look) => {
815
+ /* @__PURE__ */ jsx(CanvasBoardsGrid, { boards: boards.filter((entry) => entry.itemCount > 0), onOpen: setSelectedId, onNewCanvas: handleNewCanvas, designs, onOpenDesign: (designChannelId) => setDesignEntry({
816
+ channelId: designChannelId
817
+ }), onAskAgent: handleAskAgentFromGrid, createGroups, onCreate: handleCreate, runAction: effectiveRunAction, featuredLooks, onRecreateLook: (look) => {
628
818
  setGenerator({
629
819
  mode: "video",
630
820
  initialPrompt: look.prompt
@@ -640,7 +830,12 @@ function CanvasExperience({
640
830
  ] });
641
831
  }
642
832
  return /* @__PURE__ */ jsxs(View, { style: styles.fill, testID, children: [
643
- /* @__PURE__ */ jsx(CanvasToolDock, { busy: mediaBusy, boards, boardId: selectedId, runAction: effectiveRunAction, apolloClient, token, indexUrl, seedItem: boardSelectedItem, dockHidden: agentOpen, onUpload: (source) => void handleAddPhotos(source), onPlace: (item) => addBoardItem(item.type, item.src, {
833
+ /* @__PURE__ */ jsx(CanvasToolDock, { busy: mediaBusy, boards, boardId: selectedId, runAction: effectiveRunAction, apolloClient, token, indexUrl, seedItem: boardSelectedItem, dockHidden: agentOpen, onUpload: (source) => void handleAddPhotos(source), onPickDeviceStill: onPickLocalMedia ? async () => {
834
+ const picked = await onPickLocalMedia(void 0, "library");
835
+ const first = picked.find((p) => p.type === "image");
836
+ if (!first) return null;
837
+ return /^https?:/i.test(first.src) || !effectiveUploadMedia ? first.src : effectiveUploadMedia(first.src);
838
+ } : void 0, onPlace: (item) => addBoardItem(item.type, item.src, {
644
839
  name: item.generatedAssetName
645
840
  }), onPickStorage: (kind, url, name) => addBoardItem(kind, url, {
646
841
  name
@@ -666,7 +861,10 @@ function CanvasExperience({
666
861
  name: `${kind === "image" ? "Image" : kind === "audio" ? "Audio" : "Video"} \xB7 ${(meta.title || meta.prompt).slice(0, 28)}`,
667
862
  aspect: meta.aspect
668
863
  });
669
- }, onAgentReplace: (itemId, url) => patchItemSrc(itemId, url), onUseTemplate: (template) => void handleUseTemplate(template) }) }),
864
+ }, onAgentReplace: (itemId, url) => patchItemSrc(itemId, url), onUseTemplate: (template) => void handleUseTemplate(template), shareLinks: token && indexUrl ? {
865
+ token,
866
+ indexUrl
867
+ } : void 0 }) }),
670
868
  uploadStatus ? /* @__PURE__ */ jsxs(View, { pointerEvents: "none", style: styles.uploadToast, children: [
671
869
  mediaBusy ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: "#2563eb" }) : null,
672
870
  /* @__PURE__ */ jsx(Text, { style: styles.uploadToastText, numberOfLines: 2, children: uploadStatus })