@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.
- package/lib/features/apps/appArt.js +1 -1
- package/lib/features/apps/appArt.js.map +1 -1
- package/lib/features/apps/mobileAppCatalog.js +15 -11
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/features/canvas/CanvasAgentChatPane.js +82 -20
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
- package/lib/features/canvas/CanvasBoardsGrid.js +291 -100
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js +105 -12
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +266 -68
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/CanvasGeneratePanel.js +204 -66
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
- package/lib/features/canvas/CanvasLibrarySheet.js +31 -13
- package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
- package/lib/features/canvas/CanvasModelPicker.js +176 -0
- package/lib/features/canvas/CanvasModelPicker.js.map +1 -0
- package/lib/features/canvas/CanvasTasksPanel.js +325 -29
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasTemplatesPanel.js +5 -4
- package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
- package/lib/features/canvas/CanvasToolDock.js +137 -61
- package/lib/features/canvas/CanvasToolDock.js.map +1 -1
- package/lib/features/canvas/FrameExtractorExperience.js +33 -2
- package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
- package/lib/features/canvas/GeneratorReferenceSlots.js +197 -0
- package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -0
- package/lib/features/canvas/NativeCanvasViewer.js +89 -11
- package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
- package/lib/features/canvas/PromoContextFields.js +55 -2
- package/lib/features/canvas/PromoContextFields.js.map +1 -1
- package/lib/features/canvas/SetStudioExperience.js +323 -13
- package/lib/features/canvas/SetStudioExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditExperience.js +1 -53
- package/lib/features/canvas/VideoEditExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditorExperience.js +697 -506
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
- package/lib/features/canvas/VideoGeneratorExperience.js +22 -5
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
- package/lib/features/canvas/canvasAgentChat.js +125 -11
- package/lib/features/canvas/canvasAgentChat.js.map +1 -1
- package/lib/features/canvas/canvasCore.js +117 -12
- package/lib/features/canvas/canvasCore.js.map +1 -1
- package/lib/features/canvas/canvasEditOps.js +148 -111
- package/lib/features/canvas/canvasEditOps.js.map +1 -1
- package/lib/features/canvas/canvasTaskSync.js +235 -0
- package/lib/features/canvas/canvasTaskSync.js.map +1 -0
- package/lib/features/canvas/canvasTasks.js +98 -11
- package/lib/features/canvas/canvasTasks.js.map +1 -1
- package/lib/features/canvas/createTiles.js +247 -0
- package/lib/features/canvas/createTiles.js.map +1 -0
- package/lib/features/canvas/deepLinks.js +83 -0
- package/lib/features/canvas/deepLinks.js.map +1 -0
- package/lib/features/canvas/frameExtract.js +13 -1
- package/lib/features/canvas/frameExtract.js.map +1 -1
- package/lib/features/canvas/generationModels.js +36 -8
- package/lib/features/canvas/generationModels.js.map +1 -1
- package/lib/features/canvas/generatorCommands.js +106 -0
- package/lib/features/canvas/generatorCommands.js.map +1 -0
- package/lib/features/canvas/generatorReferences.js +82 -0
- package/lib/features/canvas/generatorReferences.js.map +1 -0
- package/lib/features/canvas/homeWork.js +74 -0
- package/lib/features/canvas/homeWork.js.map +1 -0
- package/lib/features/canvas/linksRpc.js +130 -0
- package/lib/features/canvas/linksRpc.js.map +1 -0
- package/lib/features/canvas/mediaRecheck.js +176 -0
- package/lib/features/canvas/mediaRecheck.js.map +1 -0
- package/lib/features/canvas/mediaUrls.js +258 -0
- package/lib/features/canvas/mediaUrls.js.map +1 -0
- package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
- package/lib/features/canvas/promoProjectImport.js +80 -13
- package/lib/features/canvas/promoProjectImport.js.map +1 -1
- package/lib/features/canvas/promoVideo.js +106 -15
- package/lib/features/canvas/promoVideo.js.map +1 -1
- package/lib/features/canvas/reframe.js +228 -0
- package/lib/features/canvas/reframe.js.map +1 -0
- package/lib/features/canvas/serverTasks.js +697 -0
- package/lib/features/canvas/serverTasks.js.map +1 -0
- package/lib/features/canvas/set/SetViewportWebView.js +207 -28
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
- package/lib/features/canvas/set/agent/prompt.js +66 -0
- package/lib/features/canvas/set/agent/prompt.js.map +1 -0
- package/lib/features/canvas/set/agent/setOps.js +203 -0
- package/lib/features/canvas/set/agent/setOps.js.map +1 -0
- package/lib/features/canvas/set/agent/setTurn.js +128 -0
- package/lib/features/canvas/set/agent/setTurn.js.map +1 -0
- package/lib/features/canvas/set/agent/snapshot.js +43 -0
- package/lib/features/canvas/set/agent/snapshot.js.map +1 -0
- package/lib/features/canvas/set/agent/tools.js +580 -0
- package/lib/features/canvas/set/agent/tools.js.map +1 -0
- package/lib/features/canvas/set/setProject.js +43 -4
- package/lib/features/canvas/set/setProject.js.map +1 -1
- package/lib/features/canvas/set/supplyLibrary.js +397 -0
- package/lib/features/canvas/set/supplyLibrary.js.map +1 -0
- package/lib/features/canvas/storageLibrary.js +113 -52
- package/lib/features/canvas/storageLibrary.js.map +1 -1
- package/lib/features/canvas/studioCatalog.js +15 -2
- package/lib/features/canvas/studioCatalog.js.map +1 -1
- package/lib/features/canvas/studioLooks.js +1 -8
- package/lib/features/canvas/studioLooks.js.map +1 -1
- package/lib/features/canvas/useBoardMediaRefresh.js +66 -0
- package/lib/features/canvas/useBoardMediaRefresh.js.map +1 -0
- package/lib/features/canvas/useMediaSource.js +84 -0
- package/lib/features/canvas/useMediaSource.js.map +1 -0
- package/lib/features/canvas/video3d.js +11 -10
- package/lib/features/canvas/video3d.js.map +1 -1
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +46 -0
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -0
- package/lib/features/canvas/videoEditor/ExportTaskCard.js +134 -0
- package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +45 -7
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/agentLoop.js +4 -2
- package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/attachments.js +304 -0
- package/lib/features/canvas/videoEditor/agent/attachments.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/brainClient.js +3 -2
- package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/cutTools.js +207 -7
- package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
- package/lib/features/canvas/videoEditor/blurBox.js +34 -0
- package/lib/features/canvas/videoEditor/blurBox.js.map +1 -0
- package/lib/features/canvas/videoEditor/compileTimeline.js +668 -0
- package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -0
- package/lib/features/canvas/videoEditor/editorModel.js +56 -22
- package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportPipeline.js +77 -0
- package/lib/features/canvas/videoEditor/exportPipeline.js.map +1 -0
- package/lib/features/canvas/videoEditor/exportRenderer.js +19 -12
- package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportTask.js +216 -0
- package/lib/features/canvas/videoEditor/exportTask.js.map +1 -0
- package/lib/features/canvas/videoEditor/formWidgets.js +142 -0
- package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -0
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +195 -0
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -0
- package/lib/features/canvas/videoEditor/produce/produceScenes.js +158 -0
- package/lib/features/canvas/videoEditor/produce/produceScenes.js.map +1 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js +17 -5
- package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/renderTimeline.js +207 -0
- package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -0
- package/lib/features/canvas/videoEditor/renewLinks.js +64 -0
- package/lib/features/canvas/videoEditor/renewLinks.js.map +1 -0
- package/lib/features/canvas/videoEditor/sceneLayers.js +101 -0
- package/lib/features/canvas/videoEditor/sceneLayers.js.map +1 -0
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +283 -0
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -0
- package/lib/features/canvas/videoEditor/tools/catalog.js +576 -0
- package/lib/features/canvas/videoEditor/tools/catalog.js.map +1 -0
- package/lib/features/canvas/videoEditor/videoProjectsStore.js +27 -3
- package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +29 -1
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +8 -4
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/codezenHandoff.js +108 -0
- package/lib/features/webbuilder/codezenHandoff.js.map +1 -0
- package/lib/features/webbuilder/workflow.js.map +1 -1
- package/lib/hooks/useChatApi.js +1 -2
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/screens/CanvasBoard/index.js +12 -1
- package/lib/screens/CanvasBoard/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/HomeSuggestions.js +3 -3
- package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
- package/lib/screens/WebBuilder/index.js +4 -2
- package/lib/screens/WebBuilder/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/index.js +29 -2
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +30 -6
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/package.json +4 -4
- /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,
|
|
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
|
-
|
|
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
|
|
205
|
-
const items = [...entry.board.items, ...picked.map((item, i) => __spreadProps(__spreadValues(__spreadValues({}, item),
|
|
206
|
-
|
|
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
|
|
320
|
-
|
|
321
|
-
|
|
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
|
|
332
|
-
|
|
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 =
|
|
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 = [
|
|
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) =>
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
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
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
setExporting(
|
|
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
|
-
|
|
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: (
|
|
616
|
-
channelId:
|
|
617
|
-
}),
|
|
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),
|
|
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 })
|