@adminide-stack/yantra-mobile 12.0.131 → 12.0.132

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 (149) hide show
  1. package/lib/components/CustomDrawer.js +2 -2
  2. package/lib/components/CustomDrawer.js.map +1 -1
  3. package/lib/features/apps/AppsCatalog.js +7 -1
  4. package/lib/features/apps/AppsCatalog.js.map +1 -1
  5. package/lib/features/apps/nativeSurfaceTwin.js +35 -0
  6. package/lib/features/apps/nativeSurfaceTwin.js.map +1 -0
  7. package/lib/features/canvas/CanvasBoardsGrid.js +49 -49
  8. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  9. package/lib/features/canvas/CanvasExperience.js +69 -28
  10. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  11. package/lib/features/canvas/audioEditor/AudioWaveform.js +1 -1
  12. package/lib/features/canvas/designCatalog.js +63 -39
  13. package/lib/features/canvas/designCatalog.js.map +1 -1
  14. package/lib/features/canvas/designCategories.js +56 -0
  15. package/lib/features/canvas/designCategories.js.map +1 -1
  16. package/lib/features/canvas/generator/DirectorSheet.js +3 -2
  17. package/lib/features/canvas/generator/DirectorSheet.js.map +1 -1
  18. package/lib/features/canvas/home/HeroComposer.js +165 -76
  19. package/lib/features/canvas/home/HeroComposer.js.map +1 -1
  20. package/lib/features/canvas/home/HeroMonitor.js +75 -46
  21. package/lib/features/canvas/home/HeroMonitor.js.map +1 -1
  22. package/lib/features/canvas/home/TemplatesGallery.js +273 -138
  23. package/lib/features/canvas/home/TemplatesGallery.js.map +1 -1
  24. package/lib/features/canvas/home/templatesGallerySources.js +221 -0
  25. package/lib/features/canvas/home/templatesGallerySources.js.map +1 -0
  26. package/lib/features/canvas/homeWork.js +12 -11
  27. package/lib/features/canvas/homeWork.js.map +1 -1
  28. package/lib/features/canvas/lazyEditors.js +51 -0
  29. package/lib/features/canvas/lazyEditors.js.map +1 -0
  30. package/lib/features/canvas/rankedCatalogSearch.js +33 -23
  31. package/lib/features/canvas/rankedCatalogSearch.js.map +1 -1
  32. package/lib/features/canvas/set/SetViewportWebView.js +1 -1
  33. package/lib/features/canvas/set/agent/tools.js +1 -1
  34. package/lib/features/canvas/studioCatalog.js +2 -2
  35. package/lib/features/canvas/studioCatalog.js.map +1 -1
  36. package/lib/features/canvas/templateSearch.js +8 -1
  37. package/lib/features/canvas/templateSearch.js.map +1 -1
  38. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +1 -1
  39. package/lib/features/design/DesignEditorExperience.js +103 -29
  40. package/lib/features/design/DesignEditorExperience.js.map +1 -1
  41. package/lib/features/design/DesignExperience.js +4 -3
  42. package/lib/features/design/DesignExperience.js.map +1 -1
  43. package/lib/features/design/doc/aiDesign.js +1 -1
  44. package/lib/features/design/doc/aiDesign.js.map +1 -1
  45. package/lib/features/design/doc/artifacts.js +40 -13
  46. package/lib/features/design/doc/artifacts.js.map +1 -1
  47. package/lib/features/design/doc/chart.js +387 -13
  48. package/lib/features/design/doc/chart.js.map +1 -1
  49. package/lib/features/design/doc/copyStyle.js +47 -0
  50. package/lib/features/design/doc/copyStyle.js.map +1 -0
  51. package/lib/features/design/doc/docOps.js +22 -4
  52. package/lib/features/design/doc/docOps.js.map +1 -1
  53. package/lib/features/design/doc/geometry.js +32 -18
  54. package/lib/features/design/doc/geometry.js.map +1 -1
  55. package/lib/features/design/doc/newDoc.js +5 -1
  56. package/lib/features/design/doc/newDoc.js.map +1 -1
  57. package/lib/features/design/doc/resize.js +101 -0
  58. package/lib/features/design/doc/resize.js.map +1 -0
  59. package/lib/features/design/doc/sizes.js +15 -2
  60. package/lib/features/design/doc/sizes.js.map +1 -1
  61. package/lib/features/design/editor/ChartDataPanel.js +49 -9
  62. package/lib/features/design/editor/ChartDataPanel.js.map +1 -1
  63. package/lib/features/design/editor/CropOverlay.js +1 -1
  64. package/lib/features/design/editor/DesignCanvas.js +14 -13
  65. package/lib/features/design/editor/DesignCanvas.js.map +1 -1
  66. package/lib/features/design/editor/ExportSheet.js +8 -4
  67. package/lib/features/design/editor/ExportSheet.js.map +1 -1
  68. package/lib/features/design/editor/LayerTools.js +37 -5
  69. package/lib/features/design/editor/LayerTools.js.map +1 -1
  70. package/lib/features/design/editor/Slideshow.js +30 -5
  71. package/lib/features/design/editor/Slideshow.js.map +1 -1
  72. package/lib/features/design/editor/useDesignSave.js +21 -36
  73. package/lib/features/design/editor/useDesignSave.js.map +1 -1
  74. package/lib/features/design/export/exportDesign.js +3 -1
  75. package/lib/features/design/export/exportDesign.js.map +1 -1
  76. package/lib/features/design/home/DesignHome.js +7 -2
  77. package/lib/features/design/home/DesignHome.js.map +1 -1
  78. package/lib/features/design/render/DesignPageView.js +1 -1
  79. package/lib/features/design/render/DesignPageView.js.map +1 -1
  80. package/lib/features/design/render/PageCapture.js +11 -10
  81. package/lib/features/design/render/PageCapture.js.map +1 -1
  82. package/lib/features/design/render/fontRegistry.js +27 -3
  83. package/lib/features/design/render/fontRegistry.js.map +1 -1
  84. package/lib/features/design/render/svgParts.js +27 -74
  85. package/lib/features/design/render/svgParts.js.map +1 -1
  86. package/lib/features/devices/brands/qnScale.js +7 -2
  87. package/lib/features/devices/brands/qnScale.js.map +1 -1
  88. package/lib/features/devices/brands/uuids.js +2 -1
  89. package/lib/features/devices/brands/uuids.js.map +1 -1
  90. package/lib/features/devices/devices.js +2 -1
  91. package/lib/features/devices/devices.js.map +1 -1
  92. package/lib/features/docs/DocBlockRow.js +1 -1
  93. package/lib/features/docs/docArtifacts.js +2 -2
  94. package/lib/features/docs/docArtifacts.js.map +1 -1
  95. package/lib/features/health/healthSync.js +3 -1
  96. package/lib/features/health/healthSync.js.map +1 -1
  97. package/lib/features/health/nativeHealth.js +8 -0
  98. package/lib/features/health/nativeHealth.js.map +1 -0
  99. package/lib/features/links/openInApp.js +11 -1
  100. package/lib/features/links/openInApp.js.map +1 -1
  101. package/lib/features/webbuilder/WebBuilderExperience.js +135 -28
  102. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  103. package/lib/features/webbuilder/buildFragments.js +14 -6
  104. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  105. package/lib/features/webbuilder/components/PreviewFrame.js +28 -3
  106. package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -1
  107. package/lib/features/webbuilder/components/PreviewScreen.js +1 -1
  108. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  109. package/lib/features/webbuilder/components/ProjectChat.js +24 -5
  110. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  111. package/lib/features/webbuilder/components/ProjectsScreen.js +18 -2
  112. package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -1
  113. package/lib/features/webbuilder/components/ui.js +20 -6
  114. package/lib/features/webbuilder/components/ui.js.map +1 -1
  115. package/lib/features/webbuilder/exportCode.js +52 -0
  116. package/lib/features/webbuilder/exportCode.js.map +1 -0
  117. package/lib/features/webbuilder/siteAddress.js +71 -0
  118. package/lib/features/webbuilder/siteAddress.js.map +1 -0
  119. package/lib/features/webbuilder/widgetBlocks.js +30 -0
  120. package/lib/features/webbuilder/widgetBlocks.js.map +1 -0
  121. package/lib/screens/Chat/index.js +5 -6
  122. package/lib/screens/Chat/index.js.map +1 -1
  123. package/lib/screens/ChatHistory/index.js +3 -2
  124. package/lib/screens/ChatHistory/index.js.map +1 -1
  125. package/lib/screens/Home/HomeScreen.js +20 -4
  126. package/lib/screens/Home/HomeScreen.js.map +1 -1
  127. package/lib/screens/Home/components/WebBuilderCodePrewarm.js +18 -0
  128. package/lib/screens/Home/components/WebBuilderCodePrewarm.js.map +1 -0
  129. package/lib/screens/WebBuilderNative/index.js +1 -1
  130. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  131. package/lib/screens/WebBuilderNative/keepAlive.js +112 -0
  132. package/lib/screens/WebBuilderNative/keepAlive.js.map +1 -0
  133. package/lib/screens/WebBuilderNative/runningBuilds.js +40 -0
  134. package/lib/screens/WebBuilderNative/runningBuilds.js.map +1 -0
  135. package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js +57 -0
  136. package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js.map +1 -0
  137. package/lib/screens/WebBuilderNative/useWebBuilderGallery.js +73 -14
  138. package/lib/screens/WebBuilderNative/useWebBuilderGallery.js.map +1 -1
  139. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +143 -34
  140. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  141. package/lib/screens/WebBuilderNative/useWebBuilderJobs.js +17 -5
  142. package/lib/screens/WebBuilderNative/useWebBuilderJobs.js.map +1 -1
  143. package/lib/screens/WebBuilderNative/versionUndo.js +144 -0
  144. package/lib/screens/WebBuilderNative/versionUndo.js.map +1 -0
  145. package/lib/screens/WebBuilderNative/webbuilderSnapshotKey.js +1 -0
  146. package/lib/screens/WebBuilderNative/webbuilderSnapshotKey.js.map +1 -0
  147. package/lib/screens/WebBuilderNative/webbuilderTransport.js +90 -6
  148. package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
  149. package/package.json +4 -4
@@ -1,4 +1,4 @@
1
- import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useMemo,useCallback,useState,useRef,useEffect}from'react';import {Alert,View,ActivityIndicator,Text,StyleSheet}from'react-native';import {gql}from'@apollo/client/index.js';import {useCanvasTheme,themedStyles}from'../canvas/canvasTheme.js';import {ActionButton,SPACE,TYPE}from'../canvas/canvasUi.js';import {DESIGN_CATALOG_QUERY,fetchDesignCatalog,fetchDesignCatalogViaClient}from'../canvas/designCatalog.js';import {designCategoryFor}from'../canvas/designCategories.js';import {DesignCategoryGallery}from'../canvas/DesignCategoryGallery.js';import {deriveBackendGraphqlUrl,createRemoteUploadMedia,createRemoteConnectorExec}from'../canvas/videoEditor/remoteMediaClient.js';import {CAROUSEL_CONNECTOR}from'./doc/aiDesign.js';import {listDesignArtifacts,loadOwnedDesignArtifact,isDesignArtifactId,deleteDesignArtifact,buildDesignArtifact,newArtifactId,saveDesignArtifact}from'./doc/artifacts.js';import {backendCatalogRows,findDesignTemplate,blankDocForSize,catalogToDoc,catalogKind,blankDocCustom}from'./doc/newDoc.js';import {DESIGN_SIZES}from'./doc/sizes.js';import {legacyToDoc,legacyKind}from'./doc/legacyDoc.js';import {newDesignDoc}from'./designCore.js';import {fetchMyDesigns}from'./designIndex.js';import {DesignEditorExperience}from'./DesignEditorExperience.js';import {DesignHome}from'./home/DesignHome.js';import {createDesignImagePicker}from'./pickDesignImage.js';var __defProp = Object.defineProperty;
1
+ import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useMemo,useCallback,useState,useRef,useEffect}from'react';import {Alert,View,ActivityIndicator,Text,StyleSheet}from'react-native';import {gql}from'@apollo/client/index.js';import {useCanvasTheme,themedStyles}from'../canvas/canvasTheme.js';import {ActionButton,SPACE,TYPE}from'../canvas/canvasUi.js';import {fetchDesignCatalog,fetchDesignCatalogViaClient,DESIGN_CATALOG_QUERY}from'../canvas/designCatalog.js';import {designCategoryFor}from'../canvas/designCategories.js';import {DesignCategoryGallery}from'../canvas/DesignCategoryGallery.js';import {deriveBackendGraphqlUrl,createRemoteUploadMedia,createRemoteConnectorExec}from'../canvas/videoEditor/remoteMediaClient.js';import {CAROUSEL_CONNECTOR}from'./doc/aiDesign.js';import {listDesignArtifacts,loadOwnedDesignArtifact,isDesignArtifactId,deleteDesignArtifact,buildDesignArtifact,newArtifactId,saveDesignArtifact}from'./doc/artifacts.js';import {backendCatalogRows,findDesignTemplate,blankDocForSize,catalogToDoc,catalogKind,blankDocCustom}from'./doc/newDoc.js';import {DESIGN_SIZES}from'./doc/sizes.js';import {legacyToDoc,legacyKind}from'./doc/legacyDoc.js';import {newDesignDoc}from'./designCore.js';import {fetchMyDesigns}from'./designIndex.js';import {DesignEditorExperience}from'./DesignEditorExperience.js';import {DesignHome}from'./home/DesignHome.js';import {createDesignImagePicker}from'./pickDesignImage.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -37,6 +37,7 @@ function DesignExperience({
37
37
  sessionError,
38
38
  runAction,
39
39
  runMediaAction,
40
+ padTopInset = false,
40
41
  testID
41
42
  }) {
42
43
  const theme = useCanvasTheme();
@@ -297,7 +298,7 @@ function DesignExperience({
297
298
  }
298
299
  }, [index, refresh]);
299
300
  if (screen.kind === "editor") {
300
- return /* @__PURE__ */ jsx(View, { style: styles.fill, testID, children: /* @__PURE__ */ jsx(DesignEditorExperience, { doc: screen.doc, kind: screen.docKind, opened: screen.opened, index, sessionId, loadCatalog, readTemplate: readRows ? readTemplate : void 0, pickImage, uploadFile: effectiveUpload, runCarousel, onClose: leaveEditor }, screen.key) });
301
+ return /* @__PURE__ */ jsx(View, { style: styles.fill, testID, children: /* @__PURE__ */ jsx(DesignEditorExperience, { padTopInset, doc: screen.doc, kind: screen.docKind, opened: screen.opened, index, sessionId, loadCatalog, readTemplate: readRows ? readTemplate : void 0, pickImage, uploadFile: effectiveUpload, runCarousel, onClose: leaveEditor }, screen.key) });
301
302
  }
302
303
  if (screen.kind === "category") {
303
304
  return /* @__PURE__ */ jsx(View, { style: styles.fill, testID, children: /* @__PURE__ */ jsx(DesignCategoryGallery, { category: screen.category, initialQuery: screen.query, load: loadCatalog, onClose: () => setScreen({
@@ -322,7 +323,7 @@ function DesignExperience({
322
323
  } })
323
324
  ] }) });
324
325
  }
325
- return /* @__PURE__ */ jsx(View, { style: styles.fill, testID, children: /* @__PURE__ */ jsx(DesignHome, { designs, loading, error: sessionError || listError, onRefresh: refresh, onClose, onOpenDesign: (design) => openDoc(design.doc, design.kind, design), onDesignAction: (design, action) => void designAction(design, action), onRenameDesign: (design, title) => void renameDesign(design, title), onCreate: openSize, onCustom: (w, h) => openDoc(blankDocCustom(w, h), "deck"), onOpenCategory: (category, query) => setScreen({
326
+ return /* @__PURE__ */ jsx(View, { style: styles.fill, testID, children: /* @__PURE__ */ jsx(DesignHome, { padTopInset, designs, loading, error: sessionError || listError, onRefresh: refresh, onClose, onOpenDesign: (design) => openDoc(design.doc, design.kind, design), onDesignAction: (design, action) => void designAction(design, action), onRenameDesign: (design, title) => void renameDesign(design, title), onCreate: openSize, onCustom: (w, h) => openDoc(blankDocCustom(w, h), "deck"), onOpenCategory: (category, query) => setScreen({
326
327
  kind: "category",
327
328
  category,
328
329
  query
@@ -1 +1 @@
1
- {"version":3,"file":"DesignExperience.js","sources":["../../../src/features/design/DesignExperience.tsx"],"sourcesContent":["/**\n * The design studio - the phone's twin of the web Design Studio (canvas\n * surface `editors/carousel-editor`): start from a size or a catalog\n * template, edit pages of text, shapes, pictures and charts, and keep every\n * design in the same store the web lists, so either side opens the other's.\n *\n * Everything is drawn natively - no WebView, no web surface. It ships OTA:\n * the canvas remote renders it in place of the web canvas hand-off, and the\n * `design_native` remote exposes it as its own surface. Designs made in the\n * first native editor (`design` surface rows) still open, converted\n * (doc/legacyDoc.ts), and save on as studio designs. Host seams win when\n * present (they can refresh auth); otherwise the remote builds its own from\n * the token and index URL it already holds, so older binaries get the whole\n * studio too.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ActivityIndicator, Alert, StyleSheet, Text, View } from 'react-native';\nimport { gql } from '@apollo/client';\nimport { themedStyles, useCanvasTheme, type CanvasPalette } from '../canvas/canvasTheme';\nimport { ActionButton, SPACE, TYPE } from '../canvas/canvasUi';\nimport {\n DESIGN_CATALOG_QUERY,\n fetchDesignCatalog,\n fetchDesignCatalogViaClient,\n type DesignCatalogCard,\n} from '../canvas/designCatalog';\nimport { designCategoryFor, type BlankSize, type DesignCategory } from '../canvas/designCategories';\nimport { DesignCategoryGallery, type LoadDesignCatalog } from '../canvas/DesignCategoryGallery';\nimport type { StudioCatalogClient } from '../canvas/useStudioCatalogTemplates';\nimport {\n createRemoteConnectorExec,\n createRemoteUploadMedia,\n deriveBackendGraphqlUrl,\n} from '../canvas/videoEditor/remoteMediaClient';\nimport { CAROUSEL_CONNECTOR, type RunCarousel } from './doc/aiDesign';\nimport {\n buildDesignArtifact,\n deleteDesignArtifact,\n listDesignArtifacts,\n isDesignArtifactId,\n loadOwnedDesignArtifact,\n newArtifactId,\n saveDesignArtifact,\n type DesignArtifact,\n type IndexOptions,\n} from './doc/artifacts';\nimport {\n backendCatalogRows,\n blankDocCustom,\n blankDocForSize,\n catalogKind,\n catalogToDoc,\n findDesignTemplate,\n type DesignTemplate,\n type ReadCatalogRows,\n} from './doc/newDoc';\nimport { DESIGN_SIZES, type DesignSize } from './doc/sizes';\nimport type { DesignDoc, DesignKind } from './doc/types';\nimport { legacyKind, legacyToDoc } from './doc/legacyDoc';\nimport { newDesignDoc, type DesignKind as LegacyDesignKind } from './designCore';\nimport { fetchMyDesigns } from './designIndex';\nimport { DesignEditorExperience } from './DesignEditorExperience';\nimport { DesignHome } from './home/DesignHome';\nimport { createDesignImagePicker, type PickLocalMedia, type UploadMedia } from './pickDesignImage';\n\n/**\n * Where the studio opens. Absent: its home. `kind` and `channelId` are the\n * first editor's entries (a canvas tile, a saved design id), still honoured.\n */\nexport type DesignEntry =\n | { templateId: string }\n | { artifactId: string }\n | { sizeId: string }\n | { categoryId: string }\n | { blank: { width: number; height: number } }\n | { kind: LegacyDesignKind }\n | { channelId: string };\n\n/** One connector action, as a host or the remote transport runs it. */\nexport type RunConnectorAction = (\n connector: string,\n action: string,\n params: Record<string, unknown>,\n) => Promise<Record<string, unknown>>;\n\nexport interface DesignExperienceProps {\n token?: string | null;\n /** The surface index (saved designs live there, on the `canvas` surface). */\n indexUrl: string;\n /** The backend GraphQL (the template catalog); derived from `indexUrl` when absent. */\n graphqlUrl?: string | null;\n /** A dev host whose backend URL cannot be derived reads the catalog through Apollo. */\n apolloClient?: StudioCatalogClient | null;\n entry?: DesignEntry | null;\n /** Leave the studio (back from its home, or from an editor it was opened straight into). */\n onClose?: () => void;\n onPickLocalMedia?: PickLocalMedia;\n uploadMedia?: UploadMedia;\n /** The chat session designs made here belong to. */\n sessionId?: string;\n /** A session the host could not mint: shown instead of an empty home. */\n sessionError?: string | null;\n /**\n * Runs a connector action (the AI tool's `yantra-carousel` calls). A host seam wins; a\n * RunMediaAction-shaped `runMediaAction` is used next; otherwise the remote builds its own\n * from the token and index URL.\n */\n runAction?: RunConnectorAction;\n /** A host's media runner; any connector it is handed goes through, so the AI tool can use it. */\n runMediaAction?: unknown;\n testID?: string;\n}\n\ntype Screen =\n | { kind: 'home' }\n | { kind: 'category'; category: DesignCategory; query?: string }\n | { kind: 'loading'; label: string }\n | { kind: 'editor'; doc: DesignDoc; docKind: DesignKind; opened?: DesignArtifact | null; key: string }\n | { kind: 'error'; message: string };\n\nconst TEMPLATE_DOC = gql(DESIGN_CATALOG_QUERY);\n\n/** A category's blank size as the studio's full size (kind, platform, trim, sides). */\nfunction fullSize(blank: BlankSize): DesignSize | null {\n return DESIGN_SIZES.find((s) => s.id === blank.id) ?? null;\n}\n\nlet editorKeyCounter = 0;\nconst editorKey = () => `ed-${Date.now().toString(36)}-${(editorKeyCounter += 1)}`;\n\nexport function DesignExperience({\n token,\n indexUrl,\n graphqlUrl: graphqlUrlProp,\n apolloClient,\n entry,\n onClose,\n onPickLocalMedia,\n uploadMedia,\n sessionId,\n sessionError,\n runAction,\n runMediaAction,\n testID,\n}: DesignExperienceProps) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n\n const index = useMemo<IndexOptions | null>(() => (indexUrl ? { url: indexUrl, token } : null), [indexUrl, token]);\n const graphqlUrl = useMemo(\n () => graphqlUrlProp || (indexUrl ? deriveBackendGraphqlUrl(indexUrl) : null),\n [graphqlUrlProp, indexUrl],\n );\n\n const loadCatalog = useMemo<LoadDesignCatalog | undefined>(() => {\n if (graphqlUrl) return (group, opts) => fetchDesignCatalog(graphqlUrl, token, group, opts);\n if (apolloClient) return (group, opts) => fetchDesignCatalogViaClient(apolloClient, group, opts);\n return undefined;\n }, [graphqlUrl, token, apolloClient]);\n\n const readRows = useMemo<ReadCatalogRows | null>(() => {\n if (graphqlUrl) return backendCatalogRows(graphqlUrl, token);\n if (apolloClient) {\n return async (filter) => {\n const { data } = await apolloClient.query({\n query: TEMPLATE_DOC,\n variables: { filter },\n fetchPolicy: 'no-cache',\n });\n const nodes = (\n data as { formTemplateSubmissions?: { nodes?: Array<Record<string, any>> | null } } | null\n )?.formTemplateSubmissions?.nodes;\n return Array.isArray(nodes) ? nodes : [];\n };\n }\n return null;\n }, [graphqlUrl, token, apolloClient]);\n\n const readTemplate = useCallback(\n (id: string): Promise<DesignTemplate | null> =>\n readRows ? findDesignTemplate(id, readRows) : Promise.resolve(null),\n [readRows],\n );\n\n const effectiveUpload = useMemo<UploadMedia | undefined>(\n () => uploadMedia ?? (token && indexUrl ? createRemoteUploadMedia(token, indexUrl) : undefined),\n [uploadMedia, token, indexUrl],\n );\n const pickImage = useMemo(\n () => createDesignImagePicker(onPickLocalMedia, effectiveUpload),\n [onPickLocalMedia, effectiveUpload],\n );\n\n /** The AI tool's transport: the host's, else the remote's own from what it holds. */\n const runCarousel = useMemo<RunCarousel | undefined>(() => {\n const seam =\n runAction ?? (typeof runMediaAction === 'function' ? (runMediaAction as RunConnectorAction) : undefined);\n if (seam) return (action, params) => seam(CAROUSEL_CONNECTOR, action, params);\n if (token && indexUrl) {\n const exec = createRemoteConnectorExec(token, indexUrl);\n return (action, params, timeoutMs) => exec(CAROUSEL_CONNECTOR, action, params, { timeoutMs });\n }\n return undefined;\n }, [runAction, runMediaAction, token, indexUrl]);\n\n // ── Saved designs ─────────────────────────────────────────────────────\n const [designs, setDesigns] = useState<DesignArtifact[]>([]);\n const [loading, setLoading] = useState(Boolean(index));\n const [listError, setListError] = useState<string | null>(null);\n const [listRead, setListRead] = useState(0);\n const refresh = useCallback(() => setListRead((n) => n + 1), []);\n\n const [screen, setScreen] = useState<Screen>(() =>\n entry ? { kind: 'loading', label: 'Opening…' } : { kind: 'home' },\n );\n /** Opened straight into an editor (a canvas tile, a link): back leaves the studio. */\n const directEntry = useRef(Boolean(entry));\n const onHome = screen.kind === 'home';\n\n useEffect(() => {\n if (!index || !onHome) return undefined;\n const controller = new AbortController();\n setLoading(true);\n void listDesignArtifacts({ ...index, signal: controller.signal }).then((result) => {\n if (controller.signal.aborted) return;\n setDesigns(result.designs);\n setListError(result.error);\n setLoading(false);\n });\n return () => controller.abort();\n }, [index, onHome, listRead]);\n\n // ── Opening ───────────────────────────────────────────────────────────\n const openDoc = useCallback((doc: DesignDoc, docKind: DesignKind, opened?: DesignArtifact | null) => {\n setScreen({ kind: 'editor', doc, docKind, opened: opened ?? null, key: editorKey() });\n }, []);\n\n const openSize = useCallback((size: DesignSize) => openDoc(blankDocForSize(size), size.kind), [openDoc]);\n\n const openTemplate = useCallback(\n async (id: string) => {\n setScreen({ kind: 'loading', label: 'Opening template…' });\n try {\n const template = await readTemplate(id);\n if (!template) {\n setScreen({ kind: 'error', message: 'That template is no longer in the catalog.' });\n return;\n }\n openDoc(catalogToDoc(template), catalogKind(template));\n } catch (err) {\n setScreen({\n kind: 'error',\n message: err instanceof Error ? err.message : 'The template could not be opened.',\n });\n }\n },\n [readTemplate, openDoc],\n );\n\n const openSaved = useCallback(\n async (id: string) => {\n if (!index) {\n setScreen({ kind: 'error', message: 'Sign in to open your designs.' });\n return;\n }\n setScreen({ kind: 'loading', label: 'Opening design…' });\n const { artifact, error } = await loadOwnedDesignArtifact(index, id);\n if (artifact) openDoc(artifact.doc, artifact.kind, artifact);\n else setScreen({ kind: 'error', message: error ?? 'That design is not one of yours, or it was deleted.' });\n },\n [index, openDoc],\n );\n\n /** A first-editor design (`design` surface): converted, then saved on as a new studio design. */\n const openLegacy = useCallback(\n async (channelId: string) => {\n if (!index) {\n setScreen({ kind: 'error', message: 'Sign in to open your designs.' });\n return;\n }\n setScreen({ kind: 'loading', label: 'Opening design…' });\n const result = await fetchMyDesigns({ url: index.url, token: index.token });\n const match = result.designs.find((d) => d.channelId === channelId);\n if (match)\n openDoc(legacyToDoc({ ...match.doc, title: match.doc.title ?? match.title }), legacyKind(match.doc));\n else\n setScreen({\n kind: 'error',\n message: result.error ?? 'That design is not one of yours, or it was deleted.',\n });\n },\n [index, openDoc],\n );\n\n // An entry runs once, when the studio mounts.\n const entryRan = useRef(false);\n useEffect(() => {\n if (entryRan.current || !entry) return;\n entryRan.current = true;\n if ('templateId' in entry) void openTemplate(entry.templateId);\n else if ('artifactId' in entry) void openSaved(entry.artifactId);\n else if ('sizeId' in entry) {\n const size = DESIGN_SIZES.find((s) => s.id === entry.sizeId);\n if (size) openSize(size);\n else setScreen({ kind: 'home' });\n } else if ('kind' in entry) {\n // The first editor's kinds: a T-shirt keeps its own starter; the rest are studio formats.\n if (entry.kind === 'tshirt') openDoc(legacyToDoc(newDesignDoc('tshirt')), 'flyer');\n else if (entry.kind === 'postcard') openSize(DESIGN_SIZES.find((s) => s.id === 'postcard')!);\n else if (entry.kind === 'carousel') {\n directEntry.current = false;\n setScreen({ kind: 'category', category: designCategoryFor('carousel')! });\n } else {\n directEntry.current = false;\n setScreen({ kind: 'home' });\n }\n } else if ('channelId' in entry) {\n if (isDesignArtifactId(entry.channelId)) void openSaved(entry.channelId);\n else void openLegacy(entry.channelId);\n } else if ('categoryId' in entry) {\n const category = designCategoryFor(entry.categoryId);\n directEntry.current = false;\n setScreen(category ? { kind: 'category', category } : { kind: 'home' });\n } else {\n openDoc(blankDocCustom(entry.blank.width, entry.blank.height), 'deck');\n }\n }, [entry, openTemplate, openSaved, openLegacy, openSize, openDoc]);\n\n const leaveEditor = useCallback(() => {\n if (directEntry.current && onClose) {\n onClose();\n return;\n }\n directEntry.current = false;\n setScreen({ kind: 'home' });\n }, [onClose]);\n\n const designAction = useCallback(\n async (design: DesignArtifact, action: 'duplicate' | 'delete') => {\n if (!index) return;\n if (action === 'delete') {\n Alert.alert('Delete this design?', `\"${design.title}\" will be gone from the phone and the web.`, [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Delete',\n style: 'destructive',\n onPress: async () => {\n setDesigns((prev) => prev.filter((d) => d.id !== design.id));\n const ok = await deleteDesignArtifact(index, design.id);\n if (!ok) {\n Alert.alert('Could not delete', 'Check your connection and try again.');\n refresh();\n }\n },\n },\n ]);\n return;\n }\n const doc = { ...design.doc, title: `${design.title} (copy)` };\n // Same pages, so the original's renders are the copy's too: keep its cover in the grid.\n const copy = buildDesignArtifact(newArtifactId(design.kind), design.kind, doc, {\n sessionId: design.sessionId,\n thumbUrl: design.thumbUrl,\n exportUrl: design.exportUrl,\n });\n const result = await saveDesignArtifact(index, copy);\n if (result.ok) setDesigns((prev) => [copy, ...prev]);\n else Alert.alert('Could not copy', result.error ?? 'Try again.');\n },\n [index, refresh],\n );\n\n /** Web RecentDesigns rename: the row's doc takes the new title (empty clears it) and saves. */\n const renameDesign = useCallback(\n async (design: DesignArtifact, title: string) => {\n if (!index) return;\n const doc = { ...design.doc, title: title.trim() || undefined };\n const renamed = buildDesignArtifact(design.id, design.kind, doc, {\n sessionId: design.sessionId,\n thumbUrl: design.thumbUrl,\n exportUrl: design.exportUrl,\n });\n setDesigns((prev) => prev.map((d) => (d.id === design.id ? renamed : d)));\n const result = await saveDesignArtifact(index, renamed);\n if (!result.ok) {\n Alert.alert('Could not rename that design', result.error ?? 'Try again.');\n refresh();\n }\n },\n [index, refresh],\n );\n\n // ── Screens ───────────────────────────────────────────────────────────\n if (screen.kind === 'editor') {\n return (\n <View style={styles.fill} testID={testID}>\n <DesignEditorExperience\n key={screen.key}\n doc={screen.doc}\n kind={screen.docKind}\n opened={screen.opened}\n index={index}\n sessionId={sessionId}\n loadCatalog={loadCatalog}\n readTemplate={readRows ? readTemplate : undefined}\n pickImage={pickImage}\n uploadFile={effectiveUpload}\n runCarousel={runCarousel}\n onClose={leaveEditor}\n />\n </View>\n );\n }\n\n if (screen.kind === 'category') {\n return (\n <View style={styles.fill} testID={testID}>\n <DesignCategoryGallery\n category={screen.category}\n initialQuery={screen.query}\n load={loadCatalog}\n onClose={() => setScreen({ kind: 'home' })}\n onBlank={(blank) => {\n const size = fullSize(blank);\n if (size) openSize(size);\n else openDoc(blankDocCustom(blank.width, blank.height), 'deck');\n }}\n onOpenTemplate={readRows ? (card: DesignCatalogCard) => void openTemplate(card.id) : undefined}\n />\n </View>\n );\n }\n\n if (screen.kind === 'loading' || screen.kind === 'error') {\n return (\n <View style={[styles.fill, styles.center]} testID={testID}>\n {screen.kind === 'loading' ? (\n <>\n <ActivityIndicator color={theme.mutedForeground} />\n <Text style={styles.message}>{screen.label}</Text>\n </>\n ) : (\n <>\n <Text style={styles.message}>{screen.message}</Text>\n <ActionButton\n label=\"Go to Design\"\n onPress={() => {\n directEntry.current = false;\n setScreen({ kind: 'home' });\n }}\n />\n </>\n )}\n </View>\n );\n }\n\n return (\n <View style={styles.fill} testID={testID}>\n <DesignHome\n designs={designs}\n loading={loading}\n error={sessionError || listError}\n onRefresh={refresh}\n onClose={onClose}\n onOpenDesign={(design) => openDoc(design.doc, design.kind, design)}\n onDesignAction={(design, action) => void designAction(design, action)}\n onRenameDesign={(design, title) => void renameDesign(design, title)}\n onCreate={openSize}\n onCustom={(w, h) => openDoc(blankDocCustom(w, h), 'deck')}\n onOpenCategory={(category, query) => setScreen({ kind: 'category', category, query })}\n onOpenTemplate={(card) => {\n if (readRows) void openTemplate(card.id);\n }}\n loadCatalog={loadCatalog}\n />\n </View>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n fill: { flex: 1, backgroundColor: theme.background },\n center: { alignItems: 'center', justifyContent: 'center', gap: SPACE.lg, padding: SPACE.xl },\n message: { ...TYPE.body, color: theme.mutedForeground, textAlign: 'center' },\n }),\n);\n\nexport default DesignExperience;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DesignExperience.js","sources":["../../../src/features/design/DesignExperience.tsx"],"sourcesContent":["/**\n * The design studio - the phone's twin of the web Design Studio (canvas\n * surface `editors/carousel-editor`): start from a size or a catalog\n * template, edit pages of text, shapes, pictures and charts, and keep every\n * design in the same store the web lists, so either side opens the other's.\n *\n * Everything is drawn natively - no WebView, no web surface. It ships OTA:\n * the canvas remote renders it in place of the web canvas hand-off, and the\n * `design_native` remote exposes it as its own surface. Designs made in the\n * first native editor (`design` surface rows) still open, converted\n * (doc/legacyDoc.ts), and save on as studio designs. Host seams win when\n * present (they can refresh auth); otherwise the remote builds its own from\n * the token and index URL it already holds, so older binaries get the whole\n * studio too.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ActivityIndicator, Alert, StyleSheet, Text, View } from 'react-native';\nimport { gql } from '@apollo/client';\nimport { themedStyles, useCanvasTheme, type CanvasPalette } from '../canvas/canvasTheme';\nimport { ActionButton, SPACE, TYPE } from '../canvas/canvasUi';\nimport {\n DESIGN_CATALOG_QUERY,\n fetchDesignCatalog,\n fetchDesignCatalogViaClient,\n type DesignCatalogCard,\n} from '../canvas/designCatalog';\nimport { designCategoryFor, type BlankSize, type DesignCategory } from '../canvas/designCategories';\nimport { DesignCategoryGallery, type LoadDesignCatalog } from '../canvas/DesignCategoryGallery';\nimport type { StudioCatalogClient } from '../canvas/useStudioCatalogTemplates';\nimport {\n createRemoteConnectorExec,\n createRemoteUploadMedia,\n deriveBackendGraphqlUrl,\n} from '../canvas/videoEditor/remoteMediaClient';\nimport { CAROUSEL_CONNECTOR, type RunCarousel } from './doc/aiDesign';\nimport {\n buildDesignArtifact,\n deleteDesignArtifact,\n listDesignArtifacts,\n isDesignArtifactId,\n loadOwnedDesignArtifact,\n newArtifactId,\n saveDesignArtifact,\n type DesignArtifact,\n type IndexOptions,\n} from './doc/artifacts';\nimport {\n backendCatalogRows,\n blankDocCustom,\n blankDocForSize,\n catalogKind,\n catalogToDoc,\n findDesignTemplate,\n type DesignTemplate,\n type ReadCatalogRows,\n} from './doc/newDoc';\nimport { DESIGN_SIZES, type DesignSize } from './doc/sizes';\nimport type { DesignDoc, DesignKind } from './doc/types';\nimport { legacyKind, legacyToDoc } from './doc/legacyDoc';\nimport { newDesignDoc, type DesignKind as LegacyDesignKind } from './designCore';\nimport { fetchMyDesigns } from './designIndex';\nimport { DesignEditorExperience } from './DesignEditorExperience';\nimport { DesignHome } from './home/DesignHome';\nimport { createDesignImagePicker, type PickLocalMedia, type UploadMedia } from './pickDesignImage';\n\n/**\n * Where the studio opens. Absent: its home. `kind` and `channelId` are the\n * first editor's entries (a canvas tile, a saved design id), still honoured.\n */\nexport type DesignEntry =\n | { templateId: string }\n | { artifactId: string }\n | { sizeId: string }\n | { categoryId: string }\n | { blank: { width: number; height: number } }\n | { kind: LegacyDesignKind }\n | { channelId: string };\n\n/** One connector action, as a host or the remote transport runs it. */\nexport type RunConnectorAction = (\n connector: string,\n action: string,\n params: Record<string, unknown>,\n) => Promise<Record<string, unknown>>;\n\nexport interface DesignExperienceProps {\n token?: string | null;\n /** The surface index (saved designs live there, on the `canvas` surface). */\n indexUrl: string;\n /** The backend GraphQL (the template catalog); derived from `indexUrl` when absent. */\n graphqlUrl?: string | null;\n /** A dev host whose backend URL cannot be derived reads the catalog through Apollo. */\n apolloClient?: StudioCatalogClient | null;\n entry?: DesignEntry | null;\n /** Leave the studio (back from its home, or from an editor it was opened straight into). */\n onClose?: () => void;\n onPickLocalMedia?: PickLocalMedia;\n uploadMedia?: UploadMedia;\n /** The chat session designs made here belong to. */\n sessionId?: string;\n /** A session the host could not mint: shown instead of an empty home. */\n sessionError?: string | null;\n /**\n * Runs a connector action (the AI tool's `yantra-carousel` calls). A host seam wins; a\n * RunMediaAction-shaped `runMediaAction` is used next; otherwise the remote builds its own\n * from the token and index URL.\n */\n runAction?: RunConnectorAction;\n /** A host's media runner; any connector it is handed goes through, so the AI tool can use it. */\n runMediaAction?: unknown;\n /** Pad the studio for the status bar: only for a host that shows it full screen with no header. */\n padTopInset?: boolean;\n testID?: string;\n}\n\ntype Screen =\n | { kind: 'home' }\n | { kind: 'category'; category: DesignCategory; query?: string }\n | { kind: 'loading'; label: string }\n | { kind: 'editor'; doc: DesignDoc; docKind: DesignKind; opened?: DesignArtifact | null; key: string }\n | { kind: 'error'; message: string };\n\nconst TEMPLATE_DOC = gql(DESIGN_CATALOG_QUERY);\n\n/** A category's blank size as the studio's full size (kind, platform, trim, sides). */\nfunction fullSize(blank: BlankSize): DesignSize | null {\n return DESIGN_SIZES.find((s) => s.id === blank.id) ?? null;\n}\n\nlet editorKeyCounter = 0;\nconst editorKey = () => `ed-${Date.now().toString(36)}-${(editorKeyCounter += 1)}`;\n\nexport function DesignExperience({\n token,\n indexUrl,\n graphqlUrl: graphqlUrlProp,\n apolloClient,\n entry,\n onClose,\n onPickLocalMedia,\n uploadMedia,\n sessionId,\n sessionError,\n runAction,\n runMediaAction,\n padTopInset = false,\n testID,\n}: DesignExperienceProps) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n\n const index = useMemo<IndexOptions | null>(() => (indexUrl ? { url: indexUrl, token } : null), [indexUrl, token]);\n const graphqlUrl = useMemo(\n () => graphqlUrlProp || (indexUrl ? deriveBackendGraphqlUrl(indexUrl) : null),\n [graphqlUrlProp, indexUrl],\n );\n\n const loadCatalog = useMemo<LoadDesignCatalog | undefined>(() => {\n if (graphqlUrl) return (group, opts) => fetchDesignCatalog(graphqlUrl, token, group, opts);\n if (apolloClient) return (group, opts) => fetchDesignCatalogViaClient(apolloClient, group, opts);\n return undefined;\n }, [graphqlUrl, token, apolloClient]);\n\n const readRows = useMemo<ReadCatalogRows | null>(() => {\n if (graphqlUrl) return backendCatalogRows(graphqlUrl, token);\n if (apolloClient) {\n return async (filter) => {\n const { data } = await apolloClient.query({\n query: TEMPLATE_DOC,\n variables: { filter },\n fetchPolicy: 'no-cache',\n });\n const nodes = (\n data as { formTemplateSubmissions?: { nodes?: Array<Record<string, any>> | null } } | null\n )?.formTemplateSubmissions?.nodes;\n return Array.isArray(nodes) ? nodes : [];\n };\n }\n return null;\n }, [graphqlUrl, token, apolloClient]);\n\n const readTemplate = useCallback(\n (id: string): Promise<DesignTemplate | null> =>\n readRows ? findDesignTemplate(id, readRows) : Promise.resolve(null),\n [readRows],\n );\n\n const effectiveUpload = useMemo<UploadMedia | undefined>(\n () => uploadMedia ?? (token && indexUrl ? createRemoteUploadMedia(token, indexUrl) : undefined),\n [uploadMedia, token, indexUrl],\n );\n const pickImage = useMemo(\n () => createDesignImagePicker(onPickLocalMedia, effectiveUpload),\n [onPickLocalMedia, effectiveUpload],\n );\n\n /** The AI tool's transport: the host's, else the remote's own from what it holds. */\n const runCarousel = useMemo<RunCarousel | undefined>(() => {\n const seam =\n runAction ?? (typeof runMediaAction === 'function' ? (runMediaAction as RunConnectorAction) : undefined);\n if (seam) return (action, params) => seam(CAROUSEL_CONNECTOR, action, params);\n if (token && indexUrl) {\n const exec = createRemoteConnectorExec(token, indexUrl);\n return (action, params, timeoutMs) => exec(CAROUSEL_CONNECTOR, action, params, { timeoutMs });\n }\n return undefined;\n }, [runAction, runMediaAction, token, indexUrl]);\n\n // ── Saved designs ─────────────────────────────────────────────────────\n const [designs, setDesigns] = useState<DesignArtifact[]>([]);\n const [loading, setLoading] = useState(Boolean(index));\n const [listError, setListError] = useState<string | null>(null);\n const [listRead, setListRead] = useState(0);\n const refresh = useCallback(() => setListRead((n) => n + 1), []);\n\n const [screen, setScreen] = useState<Screen>(() =>\n entry ? { kind: 'loading', label: 'Opening…' } : { kind: 'home' },\n );\n /** Opened straight into an editor (a canvas tile, a link): back leaves the studio. */\n const directEntry = useRef(Boolean(entry));\n const onHome = screen.kind === 'home';\n\n useEffect(() => {\n if (!index || !onHome) return undefined;\n const controller = new AbortController();\n setLoading(true);\n void listDesignArtifacts({ ...index, signal: controller.signal }).then((result) => {\n if (controller.signal.aborted) return;\n setDesigns(result.designs);\n setListError(result.error);\n setLoading(false);\n });\n return () => controller.abort();\n }, [index, onHome, listRead]);\n\n // ── Opening ───────────────────────────────────────────────────────────\n const openDoc = useCallback((doc: DesignDoc, docKind: DesignKind, opened?: DesignArtifact | null) => {\n setScreen({ kind: 'editor', doc, docKind, opened: opened ?? null, key: editorKey() });\n }, []);\n\n const openSize = useCallback((size: DesignSize) => openDoc(blankDocForSize(size), size.kind), [openDoc]);\n\n const openTemplate = useCallback(\n async (id: string) => {\n setScreen({ kind: 'loading', label: 'Opening template…' });\n try {\n const template = await readTemplate(id);\n if (!template) {\n setScreen({ kind: 'error', message: 'That template is no longer in the catalog.' });\n return;\n }\n openDoc(catalogToDoc(template), catalogKind(template));\n } catch (err) {\n setScreen({\n kind: 'error',\n message: err instanceof Error ? err.message : 'The template could not be opened.',\n });\n }\n },\n [readTemplate, openDoc],\n );\n\n const openSaved = useCallback(\n async (id: string) => {\n if (!index) {\n setScreen({ kind: 'error', message: 'Sign in to open your designs.' });\n return;\n }\n setScreen({ kind: 'loading', label: 'Opening design…' });\n const { artifact, error } = await loadOwnedDesignArtifact(index, id);\n if (artifact) openDoc(artifact.doc, artifact.kind, artifact);\n else setScreen({ kind: 'error', message: error ?? 'That design is not one of yours, or it was deleted.' });\n },\n [index, openDoc],\n );\n\n /** A first-editor design (`design` surface): converted, then saved on as a new studio design. */\n const openLegacy = useCallback(\n async (channelId: string) => {\n if (!index) {\n setScreen({ kind: 'error', message: 'Sign in to open your designs.' });\n return;\n }\n setScreen({ kind: 'loading', label: 'Opening design…' });\n const result = await fetchMyDesigns({ url: index.url, token: index.token });\n const match = result.designs.find((d) => d.channelId === channelId);\n if (match)\n openDoc(legacyToDoc({ ...match.doc, title: match.doc.title ?? match.title }), legacyKind(match.doc));\n else\n setScreen({\n kind: 'error',\n message: result.error ?? 'That design is not one of yours, or it was deleted.',\n });\n },\n [index, openDoc],\n );\n\n // An entry runs once, when the studio mounts.\n const entryRan = useRef(false);\n useEffect(() => {\n if (entryRan.current || !entry) return;\n entryRan.current = true;\n if ('templateId' in entry) void openTemplate(entry.templateId);\n else if ('artifactId' in entry) void openSaved(entry.artifactId);\n else if ('sizeId' in entry) {\n const size = DESIGN_SIZES.find((s) => s.id === entry.sizeId);\n if (size) openSize(size);\n else setScreen({ kind: 'home' });\n } else if ('kind' in entry) {\n // The first editor's kinds: a T-shirt keeps its own starter; the rest are studio formats.\n if (entry.kind === 'tshirt') openDoc(legacyToDoc(newDesignDoc('tshirt')), 'flyer');\n else if (entry.kind === 'postcard') openSize(DESIGN_SIZES.find((s) => s.id === 'postcard')!);\n else if (entry.kind === 'carousel') {\n directEntry.current = false;\n setScreen({ kind: 'category', category: designCategoryFor('carousel')! });\n } else {\n directEntry.current = false;\n setScreen({ kind: 'home' });\n }\n } else if ('channelId' in entry) {\n if (isDesignArtifactId(entry.channelId)) void openSaved(entry.channelId);\n else void openLegacy(entry.channelId);\n } else if ('categoryId' in entry) {\n const category = designCategoryFor(entry.categoryId);\n directEntry.current = false;\n setScreen(category ? { kind: 'category', category } : { kind: 'home' });\n } else {\n openDoc(blankDocCustom(entry.blank.width, entry.blank.height), 'deck');\n }\n }, [entry, openTemplate, openSaved, openLegacy, openSize, openDoc]);\n\n const leaveEditor = useCallback(() => {\n if (directEntry.current && onClose) {\n onClose();\n return;\n }\n directEntry.current = false;\n setScreen({ kind: 'home' });\n }, [onClose]);\n\n const designAction = useCallback(\n async (design: DesignArtifact, action: 'duplicate' | 'delete') => {\n if (!index) return;\n if (action === 'delete') {\n Alert.alert('Delete this design?', `\"${design.title}\" will be gone from the phone and the web.`, [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Delete',\n style: 'destructive',\n onPress: async () => {\n setDesigns((prev) => prev.filter((d) => d.id !== design.id));\n const ok = await deleteDesignArtifact(index, design.id);\n if (!ok) {\n Alert.alert('Could not delete', 'Check your connection and try again.');\n refresh();\n }\n },\n },\n ]);\n return;\n }\n const doc = { ...design.doc, title: `${design.title} (copy)` };\n // Same pages, so the original's renders are the copy's too: keep its cover in the grid.\n const copy = buildDesignArtifact(newArtifactId(design.kind), design.kind, doc, {\n sessionId: design.sessionId,\n thumbUrl: design.thumbUrl,\n exportUrl: design.exportUrl,\n });\n const result = await saveDesignArtifact(index, copy);\n if (result.ok) setDesigns((prev) => [copy, ...prev]);\n else Alert.alert('Could not copy', result.error ?? 'Try again.');\n },\n [index, refresh],\n );\n\n /** Web RecentDesigns rename: the row's doc takes the new title (empty clears it) and saves. */\n const renameDesign = useCallback(\n async (design: DesignArtifact, title: string) => {\n if (!index) return;\n const doc = { ...design.doc, title: title.trim() || undefined };\n const renamed = buildDesignArtifact(design.id, design.kind, doc, {\n sessionId: design.sessionId,\n thumbUrl: design.thumbUrl,\n exportUrl: design.exportUrl,\n });\n setDesigns((prev) => prev.map((d) => (d.id === design.id ? renamed : d)));\n const result = await saveDesignArtifact(index, renamed);\n if (!result.ok) {\n Alert.alert('Could not rename that design', result.error ?? 'Try again.');\n refresh();\n }\n },\n [index, refresh],\n );\n\n // ── Screens ───────────────────────────────────────────────────────────\n if (screen.kind === 'editor') {\n return (\n <View style={styles.fill} testID={testID}>\n <DesignEditorExperience\n padTopInset={padTopInset}\n key={screen.key}\n doc={screen.doc}\n kind={screen.docKind}\n opened={screen.opened}\n index={index}\n sessionId={sessionId}\n loadCatalog={loadCatalog}\n readTemplate={readRows ? readTemplate : undefined}\n pickImage={pickImage}\n uploadFile={effectiveUpload}\n runCarousel={runCarousel}\n onClose={leaveEditor}\n />\n </View>\n );\n }\n\n if (screen.kind === 'category') {\n return (\n <View style={styles.fill} testID={testID}>\n <DesignCategoryGallery\n category={screen.category}\n initialQuery={screen.query}\n load={loadCatalog}\n onClose={() => setScreen({ kind: 'home' })}\n onBlank={(blank) => {\n const size = fullSize(blank);\n if (size) openSize(size);\n else openDoc(blankDocCustom(blank.width, blank.height), 'deck');\n }}\n onOpenTemplate={readRows ? (card: DesignCatalogCard) => void openTemplate(card.id) : undefined}\n />\n </View>\n );\n }\n\n if (screen.kind === 'loading' || screen.kind === 'error') {\n return (\n <View style={[styles.fill, styles.center]} testID={testID}>\n {screen.kind === 'loading' ? (\n <>\n <ActivityIndicator color={theme.mutedForeground} />\n <Text style={styles.message}>{screen.label}</Text>\n </>\n ) : (\n <>\n <Text style={styles.message}>{screen.message}</Text>\n <ActionButton\n label=\"Go to Design\"\n onPress={() => {\n directEntry.current = false;\n setScreen({ kind: 'home' });\n }}\n />\n </>\n )}\n </View>\n );\n }\n\n return (\n <View style={styles.fill} testID={testID}>\n <DesignHome\n padTopInset={padTopInset}\n designs={designs}\n loading={loading}\n error={sessionError || listError}\n onRefresh={refresh}\n onClose={onClose}\n onOpenDesign={(design) => openDoc(design.doc, design.kind, design)}\n onDesignAction={(design, action) => void designAction(design, action)}\n onRenameDesign={(design, title) => void renameDesign(design, title)}\n onCreate={openSize}\n onCustom={(w, h) => openDoc(blankDocCustom(w, h), 'deck')}\n onOpenCategory={(category, query) => setScreen({ kind: 'category', category, query })}\n onOpenTemplate={(card) => {\n if (readRows) void openTemplate(card.id);\n }}\n loadCatalog={loadCatalog}\n />\n </View>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n fill: { flex: 1, backgroundColor: theme.background },\n center: { alignItems: 'center', justifyContent: 'center', gap: SPACE.lg, padding: SPACE.xl },\n message: { ...TYPE.body, color: theme.mutedForeground, textAlign: 'center' },\n }),\n);\n\nexport default DesignExperience;\n"],"names":[],"mappings":"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"}
@@ -128,7 +128,7 @@ function mergeEditedPage(page, edited) {
128
128
  const prompt = ((_a2 = l.prompt) != null ? _a2 : "").trim();
129
129
  const match = painted.find((p) => {
130
130
  var _a3;
131
- return ((_a3 = p.prompt) != null ? _a3 : "").trim() === prompt && prompt;
131
+ return ((_a3 = p.prompt) != null ? _a3 : "").trim() === prompt;
132
132
  });
133
133
  return match ? __spreadProps(__spreadValues({}, l), {
134
134
  id: newLayerId(),
@@ -1 +1 @@
1
- {"version":3,"file":"aiDesign.js","sources":["../../../../src/features/design/doc/aiDesign.ts"],"sourcesContent":["/**\n * Designing with AI - native twin of the web Design Studio's wizard and chat\n * (state.tsx `startFromBrief` / `startFromFlyerBrief` / `editPageWithAI`, and\n * rpc/carouselRpc.ts): the `yantra-carousel` connector's actions, the same\n * params, the same result shapes.\n *\n * brief -> BUILD_OUTLINE -> BUILD_DESIGN (a deck) -> pages inserted\n * brief -> BUILD_FLYER (print) -> one page inserted\n * \"Edit this page\" -> EDIT_PAGE -> the page's layers replaced\n *\n * Image layers come back as text-free prompts; GENERATE_PAGE paints each one\n * afterwards (the caller hosts the bytes).\n *\n * Pure apart from the injected transport: runs under jest as-is.\n */\nimport {\n defaultPageName,\n newLayerId,\n newPageId,\n type DesignBackground,\n type DesignBrief,\n type DesignDoc,\n type DesignFontPair,\n type DesignPage,\n type DesignPalette,\n type EditorLayer,\n type PageBackground,\n} from './types';\n\nexport const CAROUSEL_CONNECTOR = 'yantra-carousel';\n\nexport const CAROUSEL_ACTIONS = {\n BUILD_OUTLINE: 'YANTRA_CAROUSEL_BUILD_OUTLINE',\n BUILD_DESIGN: 'YANTRA_CAROUSEL_BUILD_DESIGN',\n BUILD_FLYER: 'YANTRA_CAROUSEL_BUILD_FLYER',\n EDIT_PAGE: 'YANTRA_CAROUSEL_EDIT_PAGE',\n GENERATE_PAGE: 'YANTRA_CAROUSEL_GENERATE_PAGE',\n} as const;\n\n/** Web state.tsx NO_TEXT_SUFFIX: picture prompts must never paint words. */\nexport const NO_TEXT_SUFFIX =\n ' Absolutely no text, words, letters, numbers, captions, or typography anywhere in the image.';\n\n/** One connector call: action, params, and how long the agent may take. */\nexport type RunCarousel = (\n action: string,\n params: Record<string, unknown>,\n timeoutMs: number,\n) => Promise<Record<string, unknown>>;\n\n/** A connector page: what BUILD_DESIGN / BUILD_FLYER / EDIT_PAGE return per page. */\nexport interface ConnectorPage {\n role: 'cover' | 'content' | 'cta';\n background: DesignBackground;\n layers: Array<Record<string, unknown> & { kind: EditorLayer['kind'] }>;\n}\n\nexport interface ConnectorDesign {\n palette: DesignPalette;\n fontPair: DesignFontPair;\n pages: ConnectorPage[];\n}\n\n/** connector-run wraps results as { successful, data } in some agent versions and bare in others. */\nexport function unwrapConnectorResult(result: Record<string, unknown>): Record<string, unknown> {\n if (result.successful === false) throw new Error((result.error as string) || 'The design assistant failed');\n const data = (result.data ?? result) as Record<string, unknown>;\n if (data.success === false) throw new Error((data.error as string) || 'The design assistant failed');\n return data;\n}\n\n/** A deck brief from what the person typed and the design they are in. */\nexport function deckBrief(\n input: { topic: string; pageCount: number; audience?: string; tone?: string },\n doc: DesignDoc,\n): DesignBrief {\n return {\n platform: doc.brief?.platform || 'Instagram',\n format: doc.aspectRatio || doc.brief?.format || '4:5',\n pageCount: Math.max(1, Math.min(20, Math.round(input.pageCount))),\n topic: input.topic.trim(),\n audience: input.audience?.trim() || doc.brief?.audience || 'a general audience',\n tone: input.tone?.trim() || doc.brief?.tone || 'Professional',\n ...(doc.brief?.brandGuidelines ? { brandGuidelines: doc.brief.brandGuidelines } : {}),\n };\n}\n\n/** Is this a printed piece (one page, the flyer action) rather than a deck? */\nexport function isPrintDoc(doc: Pick<DesignDoc, 'print' | 'brief'>): boolean {\n return Boolean(doc.print) || /print/i.test(doc.brief?.platform ?? '');\n}\n\n/**\n * Connector pages as editor pages (web `designToPages`): fresh ids, chart\n * arrays cloned, image layers empty until painted.\n */\nexport function designToPages(design: Pick<ConnectorDesign, 'pages'>, startIndex = 0): DesignPage[] {\n return design.pages.map((page, i) => ({\n id: newPageId(),\n name: defaultPageName(page.role, startIndex + i),\n prompt: '',\n src: null,\n status: 'ready' as const,\n role: page.role,\n background: {\n ...page.background,\n ...(page.background?.kind === 'image' ? { src: null, imageStatus: 'empty' as const } : {}),\n } as PageBackground,\n layers: (page.layers ?? []).map((layer) => {\n const copy = JSON.parse(JSON.stringify(layer)) as EditorLayer;\n return {\n ...copy,\n id: newLayerId(),\n ...(copy.kind === 'image' ? { src: null, imageStatus: 'empty' as const, uploaded: false } : {}),\n } as EditorLayer;\n }),\n }));\n}\n\n/** The page as the connector reads it: no ids, no hosted pictures (web editPageWithAI). */\nexport function toConnectorPage(page: DesignPage, index: number, total: number): ConnectorPage {\n const role = page.role ?? (index === 0 ? 'cover' : index === total - 1 ? 'cta' : 'content');\n const {\n src: _src,\n imageStatus: _status,\n ...background\n } = page.background ?? { kind: 'color' as const, color: '#ffffff' };\n return {\n role,\n background: background as DesignBackground,\n layers: (page.layers ?? []).map((layer) => {\n const { id: _id, ...rest } = layer as EditorLayer & { src?: unknown; imageStatus?: unknown };\n const out = { ...rest } as Record<string, unknown> & { kind: EditorLayer['kind'] };\n delete out.src;\n delete out.imageStatus;\n return out;\n }),\n };\n}\n\n/**\n * An edited connector page merged onto the old one: a picture whose prompt did\n * not change keeps its painted source, so an edit never pays to repaint it.\n */\nexport function mergeEditedPage(page: DesignPage, edited: ConnectorPage): DesignPage {\n const painted = (page.layers ?? []).filter((l) => l.kind === 'image' && l.src) as Array<\n Extract<EditorLayer, { kind: 'image' }>\n >;\n const layers: EditorLayer[] = (edited.layers ?? []).map((raw) => {\n const l = JSON.parse(JSON.stringify(raw)) as EditorLayer;\n if (l.kind === 'image') {\n const prompt = (l.prompt ?? '').trim();\n const match = painted.find((p) => (p.prompt ?? '').trim() === prompt && prompt);\n return match\n ? { ...l, id: newLayerId(), src: match.src, imageStatus: 'ready' as const }\n : { ...l, id: newLayerId(), src: null, imageStatus: 'empty' as const };\n }\n return { ...l, id: newLayerId() } as EditorLayer;\n });\n let background: PageBackground = { ...edited.background };\n if (edited.background?.kind === 'image' && edited.background.imagePrompt) {\n const prev = page.background;\n const same =\n prev?.kind === 'image' && !!prev.src && prev.imagePrompt?.trim() === edited.background.imagePrompt.trim();\n background = same\n ? { ...edited.background, src: prev!.src, imageStatus: 'ready' }\n : { ...edited.background, src: null, imageStatus: 'empty' };\n }\n return { ...page, role: edited.role ?? page.role, background, layers };\n}\n\nfunction designOf(data: Record<string, unknown>, what: string): ConnectorDesign {\n const design = data.design as ConnectorDesign | undefined;\n if (!design || !Array.isArray(design.pages) || design.pages.length === 0)\n throw new Error(`The design assistant returned no ${what}`);\n return design;\n}\n\n/** Brief -> outline -> layered deck. The outline is best-effort, as on web. */\nexport async function buildDeck(run: RunCarousel, brief: DesignBrief, aspectRatio: string): Promise<ConnectorDesign> {\n let outlineMarkdown: string | undefined;\n try {\n const outline = unwrapConnectorResult(await run(CAROUSEL_ACTIONS.BUILD_OUTLINE, { ...brief }, 60_000));\n outlineMarkdown = (outline.outlineMarkdown as string) || undefined;\n } catch {\n outlineMarkdown = undefined;\n }\n const data = unwrapConnectorResult(\n await run(\n CAROUSEL_ACTIONS.BUILD_DESIGN,\n { brief: { ...brief }, ...(outlineMarkdown ? { outlineMarkdown } : {}), aspectRatio },\n 120_000,\n ),\n );\n return designOf(data, 'pages');\n}\n\nexport interface FlyerInput {\n title: string;\n headline?: string;\n tagline?: string;\n body?: string;\n tone?: string;\n format?: string;\n}\n\n/** A print brief -> one designed page (BUILD_FLYER). */\nexport async function buildFlyer(\n run: RunCarousel,\n brief: FlyerInput,\n fontPair?: DesignFontPair,\n): Promise<ConnectorDesign> {\n const data = unwrapConnectorResult(await run(CAROUSEL_ACTIONS.BUILD_FLYER, { brief: { ...brief } }, 240_000));\n const design = designOf(data, 'flyer');\n return { ...design, pages: design.pages.slice(0, 1), ...(fontPair ? { fontPair } : {}) };\n}\n\n/** A natural-language edit of one page (EDIT_PAGE). */\nexport async function editPage(\n run: RunCarousel,\n input: {\n instruction: string;\n page: ConnectorPage;\n palette?: DesignPalette;\n fontPair?: DesignFontPair;\n aspectRatio: string;\n },\n): Promise<ConnectorPage> {\n const data = unwrapConnectorResult(\n await run(\n CAROUSEL_ACTIONS.EDIT_PAGE,\n {\n instruction: input.instruction,\n page: input.page,\n ...(input.palette ? { palette: input.palette } : {}),\n ...(input.fontPair ? { fontPair: input.fontPair } : {}),\n aspectRatio: input.aspectRatio,\n },\n 120_000,\n ),\n );\n const page = data.page as ConnectorPage | undefined;\n if (!page || !Array.isArray(page.layers)) throw new Error('The design assistant returned no edited page');\n return page;\n}\n\n/** One picture for a prompt: inline base64 or a stored URL, whichever the agent returned. */\nexport async function paintPicture(\n run: RunCarousel,\n input: { prompt: string; pageIndex: number; totalPages: number; aspectRatio: string },\n): Promise<{ dataBase64?: string; url?: string; mimeType: string }> {\n const data = unwrapConnectorResult(\n await run(\n CAROUSEL_ACTIONS.GENERATE_PAGE,\n {\n prompt: `${input.prompt}${NO_TEXT_SUFFIX}`,\n pageIndex: input.pageIndex,\n totalPages: input.totalPages,\n aspectRatio: input.aspectRatio,\n skipCarouselPrefix: true,\n },\n 240_000,\n ),\n );\n const images = (data.images as Array<{ dataBase64?: string; url?: string; mimeType?: string }> | undefined) ?? [];\n const inline = images.find((im) => im.dataBase64);\n if (inline?.dataBase64) return { dataBase64: inline.dataBase64, mimeType: inline.mimeType || 'image/png' };\n const remote = images.find((im) => im.url);\n if (remote?.url) return { url: remote.url, mimeType: remote.mimeType || 'image/png' };\n throw new Error('No picture came back');\n}\n\n/** Every picture a page still needs painted: its image background, then image layers without a source. */\nexport function picturesToPaint(\n page: DesignPage,\n): Array<{ target: 'background' } | { target: 'layer'; layerId: string; prompt: string }> {\n const out: Array<{ target: 'background' } | { target: 'layer'; layerId: string; prompt: string }> = [];\n if (page.background?.kind === 'image' && page.background.imagePrompt && !page.background.src)\n out.push({ target: 'background' });\n for (const l of page.layers ?? []) {\n if (l.kind === 'image' && !l.src && l.prompt?.trim())\n out.push({ target: 'layer', layerId: l.id, prompt: l.prompt });\n }\n return out;\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"aiDesign.js","sources":["../../../../src/features/design/doc/aiDesign.ts"],"sourcesContent":["/**\n * Designing with AI - native twin of the web Design Studio's wizard and chat\n * (state.tsx `startFromBrief` / `startFromFlyerBrief` / `editPageWithAI`, and\n * rpc/carouselRpc.ts): the `yantra-carousel` connector's actions, the same\n * params, the same result shapes.\n *\n * brief -> BUILD_OUTLINE -> BUILD_DESIGN (a deck) -> pages inserted\n * brief -> BUILD_FLYER (print) -> one page inserted\n * \"Edit this page\" -> EDIT_PAGE -> the page's layers replaced\n *\n * Image layers come back as text-free prompts; GENERATE_PAGE paints each one\n * afterwards (the caller hosts the bytes).\n *\n * Pure apart from the injected transport: runs under jest as-is.\n */\nimport {\n defaultPageName,\n newLayerId,\n newPageId,\n type DesignBackground,\n type DesignBrief,\n type DesignDoc,\n type DesignFontPair,\n type DesignPage,\n type DesignPalette,\n type EditorLayer,\n type PageBackground,\n} from './types';\n\nexport const CAROUSEL_CONNECTOR = 'yantra-carousel';\n\nexport const CAROUSEL_ACTIONS = {\n BUILD_OUTLINE: 'YANTRA_CAROUSEL_BUILD_OUTLINE',\n BUILD_DESIGN: 'YANTRA_CAROUSEL_BUILD_DESIGN',\n BUILD_FLYER: 'YANTRA_CAROUSEL_BUILD_FLYER',\n EDIT_PAGE: 'YANTRA_CAROUSEL_EDIT_PAGE',\n GENERATE_PAGE: 'YANTRA_CAROUSEL_GENERATE_PAGE',\n} as const;\n\n/** Web state.tsx NO_TEXT_SUFFIX: picture prompts must never paint words. */\nexport const NO_TEXT_SUFFIX =\n ' Absolutely no text, words, letters, numbers, captions, or typography anywhere in the image.';\n\n/** One connector call: action, params, and how long the agent may take. */\nexport type RunCarousel = (\n action: string,\n params: Record<string, unknown>,\n timeoutMs: number,\n) => Promise<Record<string, unknown>>;\n\n/** A connector page: what BUILD_DESIGN / BUILD_FLYER / EDIT_PAGE return per page. */\nexport interface ConnectorPage {\n role: 'cover' | 'content' | 'cta';\n background: DesignBackground;\n layers: Array<Record<string, unknown> & { kind: EditorLayer['kind'] }>;\n}\n\nexport interface ConnectorDesign {\n palette: DesignPalette;\n fontPair: DesignFontPair;\n pages: ConnectorPage[];\n}\n\n/** connector-run wraps results as { successful, data } in some agent versions and bare in others. */\nexport function unwrapConnectorResult(result: Record<string, unknown>): Record<string, unknown> {\n if (result.successful === false) throw new Error((result.error as string) || 'The design assistant failed');\n const data = (result.data ?? result) as Record<string, unknown>;\n if (data.success === false) throw new Error((data.error as string) || 'The design assistant failed');\n return data;\n}\n\n/** A deck brief from what the person typed and the design they are in. */\nexport function deckBrief(\n input: { topic: string; pageCount: number; audience?: string; tone?: string },\n doc: DesignDoc,\n): DesignBrief {\n return {\n platform: doc.brief?.platform || 'Instagram',\n format: doc.aspectRatio || doc.brief?.format || '4:5',\n pageCount: Math.max(1, Math.min(20, Math.round(input.pageCount))),\n topic: input.topic.trim(),\n audience: input.audience?.trim() || doc.brief?.audience || 'a general audience',\n tone: input.tone?.trim() || doc.brief?.tone || 'Professional',\n ...(doc.brief?.brandGuidelines ? { brandGuidelines: doc.brief.brandGuidelines } : {}),\n };\n}\n\n/** Is this a printed piece (one page, the flyer action) rather than a deck? */\nexport function isPrintDoc(doc: Pick<DesignDoc, 'print' | 'brief'>): boolean {\n return Boolean(doc.print) || /print/i.test(doc.brief?.platform ?? '');\n}\n\n/**\n * Connector pages as editor pages (web `designToPages`): fresh ids, chart\n * arrays cloned, image layers empty until painted.\n */\nexport function designToPages(design: Pick<ConnectorDesign, 'pages'>, startIndex = 0): DesignPage[] {\n return design.pages.map((page, i) => ({\n id: newPageId(),\n name: defaultPageName(page.role, startIndex + i),\n prompt: '',\n src: null,\n status: 'ready' as const,\n role: page.role,\n background: {\n ...page.background,\n ...(page.background?.kind === 'image' ? { src: null, imageStatus: 'empty' as const } : {}),\n } as PageBackground,\n layers: (page.layers ?? []).map((layer) => {\n const copy = JSON.parse(JSON.stringify(layer)) as EditorLayer;\n return {\n ...copy,\n id: newLayerId(),\n ...(copy.kind === 'image' ? { src: null, imageStatus: 'empty' as const, uploaded: false } : {}),\n } as EditorLayer;\n }),\n }));\n}\n\n/** The page as the connector reads it: no ids, no hosted pictures (web editPageWithAI). */\nexport function toConnectorPage(page: DesignPage, index: number, total: number): ConnectorPage {\n const role = page.role ?? (index === 0 ? 'cover' : index === total - 1 ? 'cta' : 'content');\n const {\n src: _src,\n imageStatus: _status,\n ...background\n } = page.background ?? { kind: 'color' as const, color: '#ffffff' };\n return {\n role,\n background: background as DesignBackground,\n layers: (page.layers ?? []).map((layer) => {\n const { id: _id, ...rest } = layer as EditorLayer & { src?: unknown; imageStatus?: unknown };\n const out = { ...rest } as Record<string, unknown> & { kind: EditorLayer['kind'] };\n delete out.src;\n delete out.imageStatus;\n return out;\n }),\n };\n}\n\n/**\n * An edited connector page merged onto the old one: a picture whose prompt did\n * not change keeps its painted source, so an edit never pays to repaint it.\n */\nexport function mergeEditedPage(page: DesignPage, edited: ConnectorPage): DesignPage {\n const painted = (page.layers ?? []).filter((l) => l.kind === 'image' && l.src) as Array<\n Extract<EditorLayer, { kind: 'image' }>\n >;\n const layers: EditorLayer[] = (edited.layers ?? []).map((raw) => {\n const l = JSON.parse(JSON.stringify(raw)) as EditorLayer;\n if (l.kind === 'image') {\n const prompt = (l.prompt ?? '').trim();\n // Web matches an empty prompt too: an uploaded or catalog picture keeps its source.\n const match = painted.find((p) => (p.prompt ?? '').trim() === prompt);\n return match\n ? { ...l, id: newLayerId(), src: match.src, imageStatus: 'ready' as const }\n : { ...l, id: newLayerId(), src: null, imageStatus: 'empty' as const };\n }\n return { ...l, id: newLayerId() } as EditorLayer;\n });\n let background: PageBackground = { ...edited.background };\n if (edited.background?.kind === 'image' && edited.background.imagePrompt) {\n const prev = page.background;\n const same =\n prev?.kind === 'image' && !!prev.src && prev.imagePrompt?.trim() === edited.background.imagePrompt.trim();\n background = same\n ? { ...edited.background, src: prev!.src, imageStatus: 'ready' }\n : { ...edited.background, src: null, imageStatus: 'empty' };\n }\n return { ...page, role: edited.role ?? page.role, background, layers };\n}\n\nfunction designOf(data: Record<string, unknown>, what: string): ConnectorDesign {\n const design = data.design as ConnectorDesign | undefined;\n if (!design || !Array.isArray(design.pages) || design.pages.length === 0)\n throw new Error(`The design assistant returned no ${what}`);\n return design;\n}\n\n/** Brief -> outline -> layered deck. The outline is best-effort, as on web. */\nexport async function buildDeck(run: RunCarousel, brief: DesignBrief, aspectRatio: string): Promise<ConnectorDesign> {\n let outlineMarkdown: string | undefined;\n try {\n const outline = unwrapConnectorResult(await run(CAROUSEL_ACTIONS.BUILD_OUTLINE, { ...brief }, 60_000));\n outlineMarkdown = (outline.outlineMarkdown as string) || undefined;\n } catch {\n outlineMarkdown = undefined;\n }\n const data = unwrapConnectorResult(\n await run(\n CAROUSEL_ACTIONS.BUILD_DESIGN,\n { brief: { ...brief }, ...(outlineMarkdown ? { outlineMarkdown } : {}), aspectRatio },\n 120_000,\n ),\n );\n return designOf(data, 'pages');\n}\n\nexport interface FlyerInput {\n title: string;\n headline?: string;\n tagline?: string;\n body?: string;\n tone?: string;\n format?: string;\n}\n\n/** A print brief -> one designed page (BUILD_FLYER). */\nexport async function buildFlyer(\n run: RunCarousel,\n brief: FlyerInput,\n fontPair?: DesignFontPair,\n): Promise<ConnectorDesign> {\n const data = unwrapConnectorResult(await run(CAROUSEL_ACTIONS.BUILD_FLYER, { brief: { ...brief } }, 240_000));\n const design = designOf(data, 'flyer');\n return { ...design, pages: design.pages.slice(0, 1), ...(fontPair ? { fontPair } : {}) };\n}\n\n/** A natural-language edit of one page (EDIT_PAGE). */\nexport async function editPage(\n run: RunCarousel,\n input: {\n instruction: string;\n page: ConnectorPage;\n palette?: DesignPalette;\n fontPair?: DesignFontPair;\n aspectRatio: string;\n },\n): Promise<ConnectorPage> {\n const data = unwrapConnectorResult(\n await run(\n CAROUSEL_ACTIONS.EDIT_PAGE,\n {\n instruction: input.instruction,\n page: input.page,\n ...(input.palette ? { palette: input.palette } : {}),\n ...(input.fontPair ? { fontPair: input.fontPair } : {}),\n aspectRatio: input.aspectRatio,\n },\n 120_000,\n ),\n );\n const page = data.page as ConnectorPage | undefined;\n if (!page || !Array.isArray(page.layers)) throw new Error('The design assistant returned no edited page');\n return page;\n}\n\n/** One picture for a prompt: inline base64 or a stored URL, whichever the agent returned. */\nexport async function paintPicture(\n run: RunCarousel,\n input: { prompt: string; pageIndex: number; totalPages: number; aspectRatio: string },\n): Promise<{ dataBase64?: string; url?: string; mimeType: string }> {\n const data = unwrapConnectorResult(\n await run(\n CAROUSEL_ACTIONS.GENERATE_PAGE,\n {\n prompt: `${input.prompt}${NO_TEXT_SUFFIX}`,\n pageIndex: input.pageIndex,\n totalPages: input.totalPages,\n aspectRatio: input.aspectRatio,\n skipCarouselPrefix: true,\n },\n 240_000,\n ),\n );\n const images = (data.images as Array<{ dataBase64?: string; url?: string; mimeType?: string }> | undefined) ?? [];\n const inline = images.find((im) => im.dataBase64);\n if (inline?.dataBase64) return { dataBase64: inline.dataBase64, mimeType: inline.mimeType || 'image/png' };\n const remote = images.find((im) => im.url);\n if (remote?.url) return { url: remote.url, mimeType: remote.mimeType || 'image/png' };\n throw new Error('No picture came back');\n}\n\n/** Every picture a page still needs painted: its image background, then image layers without a source. */\nexport function picturesToPaint(\n page: DesignPage,\n): Array<{ target: 'background' } | { target: 'layer'; layerId: string; prompt: string }> {\n const out: Array<{ target: 'background' } | { target: 'layer'; layerId: string; prompt: string }> = [];\n if (page.background?.kind === 'image' && page.background.imagePrompt && !page.background.src)\n out.push({ target: 'background' });\n for (const l of page.layers ?? []) {\n if (l.kind === 'image' && !l.src && l.prompt?.trim())\n out.push({ target: 'layer', layerId: l.id, prompt: l.prompt });\n }\n return out;\n}\n"],"names":["_a"],"mappings":"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"}
@@ -174,6 +174,8 @@ async function gql(opts, query, variables) {
174
174
  }
175
175
  }
176
176
  const ROW_FIELDS = "channelId title metadata updatedAt";
177
+ const ARTIFACT_SURFACES = ["design", "canvas"];
178
+ const SAVE_SURFACE = "canvas";
177
179
  async function saveDesignArtifact(opts, artifact) {
178
180
  var _a;
179
181
  const {
@@ -183,7 +185,7 @@ async function saveDesignArtifact(opts, artifact) {
183
185
  registerSurfaceChannel(input: $input) { ${ROW_FIELDS} }
184
186
  }`, {
185
187
  input: __spreadProps(__spreadValues(__spreadValues({
186
- surface: "canvas",
188
+ surface: SAVE_SURFACE,
187
189
  channelId: artifact.id
188
190
  }, artifact.sessionId ? {
189
191
  sessionId: artifact.sessionId
@@ -207,7 +209,7 @@ async function saveDesignArtifact(opts, artifact) {
207
209
  error: "Could not save. Recent edits are not stored yet."
208
210
  };
209
211
  }
210
- async function channelsMatching(opts, search, limit) {
212
+ async function channelsOn(opts, surface, search, limit) {
211
213
  var _a, _b;
212
214
  const {
213
215
  data,
@@ -216,7 +218,7 @@ async function channelsMatching(opts, search, limit) {
216
218
  surfaceChannels(filter: $filter, offset: $offset, limit: $limit) { data { ${ROW_FIELDS} } totalCount }
217
219
  }`, {
218
220
  filter: {
219
- surface: "canvas",
221
+ surface,
220
222
  search
221
223
  },
222
224
  offset: 0,
@@ -229,6 +231,28 @@ async function channelsMatching(opts, search, limit) {
229
231
  error
230
232
  };
231
233
  }
234
+ async function channelsMatching(opts, search, limit, surfaces = ARTIFACT_SURFACES) {
235
+ var _a, _b;
236
+ const pages = await Promise.all(surfaces.map((surface) => channelsOn(opts, surface, search, limit)));
237
+ const byId = /* @__PURE__ */ new Map();
238
+ const stamp = (row) => {
239
+ var _a2, _b2;
240
+ return (_b2 = (_a2 = coerceDesignArtifact(row.metadata)) == null ? void 0 : _a2.updatedAt) != null ? _b2 : 0;
241
+ };
242
+ for (const page of pages) {
243
+ for (const row of page.rows) {
244
+ const id = typeof row.channelId === "string" ? row.channelId : "";
245
+ const held = byId.get(id);
246
+ if (!held || stamp(row) > stamp(held)) byId.set(id, row);
247
+ }
248
+ }
249
+ const answered = pages.filter((p) => !p.error);
250
+ return {
251
+ rows: [...byId.values()],
252
+ total: Math.max(0, ...pages.map((p) => p.total)),
253
+ error: answered.length ? null : (_b = (_a = pages.find((p) => p.error)) == null ? void 0 : _a.error) != null ? _b : null
254
+ };
255
+ }
232
256
  async function listDesignArtifacts(opts, limit = 24) {
233
257
  var _a, _b;
234
258
  const pages = await Promise.all(DESIGN_KINDS.map((kind) => channelsMatching(opts, `${kind}:`, limit)));
@@ -268,13 +292,16 @@ async function loadOwnedDesignArtifact(opts, id) {
268
292
  };
269
293
  }
270
294
  async function deleteDesignArtifact(opts, id) {
271
- const {
272
- data
273
- } = await gql(opts, `mutation DeleteSurfaceChannel($surface: SurfaceType!, $channelId: String!) {
274
- deleteSurfaceChannel(surface: $surface, channelId: $channelId)
275
- }`, {
276
- surface: "canvas",
277
- channelId: id
278
- });
279
- return Boolean(data == null ? void 0 : data.deleteSurfaceChannel);
280
- }export{DESIGN_KINDS,buildDesignArtifact,channelsMatching,coerceDesignArtifact,decodeMetadata,deleteDesignArtifact,gql,hasLocalMedia,isDesignArtifactId,isDocArtifactId,listDesignArtifacts,loadOwnedDesignArtifact,newArtifactId,saveDesignArtifact,slimDoc};//# sourceMappingURL=artifacts.js.map
295
+ const results = await Promise.all(ARTIFACT_SURFACES.map(async (surface) => {
296
+ const {
297
+ data
298
+ } = await gql(opts, `mutation DeleteSurfaceChannel($surface: SurfaceType!, $channelId: String!) {
299
+ deleteSurfaceChannel(surface: $surface, channelId: $channelId)
300
+ }`, {
301
+ surface,
302
+ channelId: id
303
+ });
304
+ return Boolean(data == null ? void 0 : data.deleteSurfaceChannel);
305
+ }));
306
+ return results.some(Boolean);
307
+ }export{ARTIFACT_SURFACES,DESIGN_KINDS,buildDesignArtifact,channelsMatching,coerceDesignArtifact,decodeMetadata,deleteDesignArtifact,gql,hasLocalMedia,isDesignArtifactId,isDocArtifactId,listDesignArtifacts,loadOwnedDesignArtifact,newArtifactId,saveDesignArtifact,slimDoc};//# sourceMappingURL=artifacts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","sources":["../../../../src/features/design/doc/artifacts.ts"],"sourcesContent":["/**\n * Saved designs - native twin of canvas-surface `state/artifacts.ts` for the\n * two kinds the Design Studio writes (`deck`, `flyer`).\n *\n * One SurfaceChannel row per design on the `canvas` surface, keyed\n * `<kind>:<uuid>`, the whole `{ artifact }` in `metadata`. That is exactly\n * what the web Design Studio writes and lists, so a design saved on the phone\n * is in the web's \"Recent designs\" and the reverse.\n *\n * `registerSurfaceChannel` is the idempotent upsert and `metadata` is replaced\n * wholesale: a save sends the complete artifact, never a patch. Reads are\n * best-effort (an error string, never a throw) like `canvas/surfaceIndex.ts`.\n *\n * Pure apart from `fetch`: runs under jest as-is.\n */\nimport { artifactTitle, type CanvasArtifactKind, type DesignDoc, type DesignKind } from './types';\n\nexport const DESIGN_KINDS: readonly DesignKind[] = ['deck', 'flyer'];\n\n/** One saved design (web `CanvasArtifact<CarouselDoc>`). */\nexport interface DesignArtifact {\n /** Row id AND artifact id: `<kind>:<uuid>`. */\n id: string;\n kind: DesignKind;\n sessionId?: string;\n title: string;\n updatedAt: number;\n doc: DesignDoc;\n /** First page as an image, for a grid tile - written by web; native keeps it through saves. */\n thumbUrl?: string;\n exportUrl?: string;\n}\n\nexport interface IndexOptions {\n url: string;\n token?: string | null;\n signal?: AbortSignal;\n}\n\nfunction uuid(): string {\n const bytes = new Uint8Array(16);\n let filled = false;\n try {\n (globalThis.crypto as Crypto | undefined)?.getRandomValues?.(bytes);\n filled = bytes.some((b) => b !== 0);\n } catch {\n filled = false;\n }\n if (!filled) for (let i = 0; i < 16; i += 1) bytes[i] = Math.floor(Math.random() * 256);\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/** Mint an artifact id. The kind rides in the id, so a row classifies without decoding its metadata. */\nexport function newArtifactId(kind: CanvasArtifactKind): string {\n return `${kind}:${uuid()}`;\n}\n\n/** Is this a saved-design id (`deck:…` / `flyer:…`), as a link or chat card carries it? */\nexport function isDesignArtifactId(id: unknown): id is string {\n return typeof id === 'string' && /^(deck|flyer):[0-9A-Za-z-]{8,}$/.test(id.trim());\n}\n\n/** Is this a rich-text doc id (`doc:…`, the web docs editor's rows)? Docs are not designs: they open in the docs editor. */\nexport function isDocArtifactId(id: unknown): id is string {\n return typeof id === 'string' && /^doc:[0-9A-Za-z-]{8,}$/.test(id.trim());\n}\n\nconst stripDataUrl = (src: string | null | undefined): string | null => (src && !src.startsWith('data:') ? src : null);\n\n/**\n * The document as a save writes it (web `slimDoc`): no inline data: images,\n * no page rasters - the index body is capped, and a phone's local file URI\n * means nothing on another device.\n */\nexport function slimDoc(doc: DesignDoc): DesignDoc {\n const hosted = (src: string | null | undefined) => {\n const kept = stripDataUrl(src);\n return kept && !/^(file|ph|assets-library|content):/i.test(kept) ? kept : null;\n };\n return {\n ...doc,\n brandKit: doc.brandKit\n ? { ...doc.brandKit, logos: doc.brandKit.logos.filter((l) => !l.startsWith('data:')) }\n : undefined,\n pages: doc.pages.map((p) => ({\n ...p,\n dataBase64: undefined,\n src: hosted(p.src),\n status: p.status === 'generating' ? 'empty' : p.src && p.src.startsWith('data:') ? 'empty' : p.status,\n background: p.background\n ? {\n ...p.background,\n src: hosted(p.background.src),\n imageStatus: hosted(p.background.src) ? p.background.imageStatus : 'empty',\n }\n : undefined,\n layers: p.layers?.map((l) =>\n l.kind === 'image'\n ? {\n ...l,\n src: hosted(l.src),\n imageStatus: hosted(l.src) ? l.imageStatus : 'empty',\n uploadError: undefined,\n }\n : l,\n ),\n })),\n };\n}\n\n/** Does a document still hold a picture only this phone can see (an upload that has not finished)? */\nexport function hasLocalMedia(doc: DesignDoc): boolean {\n const local = (src: string | null | undefined) =>\n Boolean(src && /^(file|ph|assets-library|content|data):/i.test(src));\n return doc.pages.some(\n (p) => local(p.background?.src) || (p.layers ?? []).some((l) => l.kind === 'image' && local(l.src)),\n );\n}\n\n/** `metadata` arrives decoded, or as text from a backend that types it a String. */\nexport function decodeMetadata(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\n/** Validate a decoded row (untrusted JSON from the index); null for anything but a design. */\nexport function coerceDesignArtifact(metadata: unknown): DesignArtifact | null {\n const meta = decodeMetadata(metadata) as { artifact?: DesignArtifact } | null;\n const artifact = meta?.artifact;\n if (!artifact || typeof artifact.id !== 'string' || !artifact.id) return null;\n if (!DESIGN_KINDS.includes(artifact.kind)) return null;\n const doc = artifact.doc as DesignDoc | undefined;\n if (!doc || !Array.isArray(doc.pages) || !(doc.pageWidth > 0) || !(doc.pageHeight > 0)) return null;\n return artifact;\n}\n\n/** Build the row a save writes. */\nexport function buildDesignArtifact(\n id: string,\n kind: DesignKind,\n doc: DesignDoc,\n keep: Pick<DesignArtifact, 'sessionId' | 'thumbUrl' | 'exportUrl'> = {},\n now: number = Date.now(),\n): DesignArtifact {\n const slim = slimDoc(doc);\n return {\n id,\n kind,\n ...(keep.sessionId ? { sessionId: keep.sessionId } : {}),\n title: artifactTitle(slim),\n updatedAt: now,\n doc: slim,\n ...(keep.thumbUrl ? { thumbUrl: keep.thumbUrl } : {}),\n ...(keep.exportUrl ? { exportUrl: keep.exportUrl } : {}),\n };\n}\n\nexport interface GqlResult<T> {\n data: T | null;\n error: string | null;\n}\n\n/** One GraphQL call to the index (shared with `features/docs/docArtifacts`). */\nexport async function gql<T>(\n opts: IndexOptions,\n query: string,\n variables: Record<string, unknown>,\n): Promise<GqlResult<T>> {\n if (!opts.url) return { data: null, error: 'No design 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({ query, variables }),\n signal: opts.signal,\n });\n if (response.status === 401 || response.status === 403) {\n return { data: null, error: 'Your session expired. Sign in again to see your designs.' };\n }\n if (response.status === 413) {\n return { data: null, error: 'This design is too big to save. Remove a few pictures or pages.' };\n }\n if (!response.ok) return { data: null, error: `The design index is unreachable (HTTP ${response.status}).` };\n const payload = (await response.json()) as { data?: T; errors?: Array<{ message?: string }> };\n if (payload?.errors?.length) {\n const raw = payload.errors[0]?.message || '';\n const isAuth = /tenantid|unauthenticated|unauthorized|not authorised|forbidden/i.test(raw);\n return {\n data: null,\n error: isAuth ? 'Your session expired. Sign in again to see your designs.' : raw || 'Request rejected.',\n };\n }\n return { data: payload?.data ?? null, error: null };\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') return { data: null, error: null };\n return { data: null, error: 'Could not reach the design index. Check your connection.' };\n }\n}\n\nconst ROW_FIELDS = 'channelId title metadata updatedAt';\n\n/** Write one design (web `saveArtifact`). `ok: false` is lost work: say so. */\nexport async function saveDesignArtifact(\n opts: IndexOptions,\n artifact: DesignArtifact,\n): Promise<{ ok: boolean; error: string | null }> {\n const { data, error } = await gql<{ registerSurfaceChannel?: { channelId?: string } | null }>(\n opts,\n `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {\n registerSurfaceChannel(input: $input) { ${ROW_FIELDS} }\n }`,\n {\n input: {\n surface: 'canvas',\n channelId: artifact.id,\n // Top-level AND inside the payload: the column is what lists filter on\n // server-side, the metadata copy is what the reader validates.\n ...(artifact.sessionId ? { sessionId: artifact.sessionId } : {}),\n ...(artifact.title ? { title: artifact.title } : {}),\n metadata: { artifact },\n },\n },\n );\n if (error) return { ok: false, error };\n return data?.registerSurfaceChannel?.channelId\n ? { ok: true, error: null }\n : { ok: false, error: 'Could not save. Recent edits are not stored yet.' };\n}\n\ninterface ChannelsPage {\n surfaceChannels?: { data?: Array<Record<string, unknown>> | null; totalCount?: number } | null;\n}\n\nexport async function channelsMatching(\n opts: IndexOptions,\n search: string,\n limit: number,\n): Promise<{ rows: Array<Record<string, unknown>>; total: number; error: string | null }> {\n const { data, error } = await gql<ChannelsPage>(\n opts,\n `query SurfaceChannels($filter: SurfaceChannelFilter, $offset: Int, $limit: Int) {\n surfaceChannels(filter: $filter, offset: $offset, limit: $limit) { data { ${ROW_FIELDS} } totalCount }\n }`,\n { filter: { surface: 'canvas', search }, offset: 0, limit },\n );\n const page = data?.surfaceChannels;\n return { rows: page?.data ?? [], total: page?.totalCount ?? 0, error };\n}\n\nexport interface DesignListResult {\n designs: DesignArtifact[];\n /** A kind had rows past `limit`. */\n more: boolean;\n error: string | null;\n}\n\n/**\n * The caller's designs, newest first (web `listArtifactsOfKinds(['deck', 'flyer'])`):\n * `search: '<kind>:'` narrows each kind server-side; the kind is checked again\n * here because the search also matches titles.\n */\nexport async function listDesignArtifacts(opts: IndexOptions, limit = 24): Promise<DesignListResult> {\n const pages = await Promise.all(DESIGN_KINDS.map((kind) => channelsMatching(opts, `${kind}:`, limit)));\n const designs: DesignArtifact[] = [];\n for (const [i, page] of pages.entries()) {\n for (const row of page.rows) {\n const artifact = coerceDesignArtifact(row.metadata);\n if (artifact?.kind === DESIGN_KINDS[i] && artifact.id === row.channelId) designs.push(artifact);\n }\n }\n designs.sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n const error = designs.length === 0 ? (pages.find((p) => p.error)?.error ?? null) : null;\n return {\n designs: designs.slice(0, limit),\n more: pages.some((p) => p.total > limit) || designs.length > limit,\n error,\n };\n}\n\n/**\n * One of the CALLER'S OWN designs (web `loadOwnedArtifact`): the list is\n * scoped server-side to the bearer, the single-row read is not - so an id\n * from outside (a link, a chat card) opens only when the list returns it.\n */\nexport async function loadOwnedDesignArtifact(\n opts: IndexOptions,\n id: string,\n): Promise<{ artifact: DesignArtifact | null; error: string | null }> {\n if (!isDesignArtifactId(id)) return { artifact: null, error: null };\n const page = await channelsMatching(opts, id.trim(), 5);\n const row = page.rows.find((r) => r.channelId === id.trim());\n if (!row) return { artifact: null, error: page.error };\n const artifact = coerceDesignArtifact(row.metadata);\n return { artifact: artifact && artifact.id === id.trim() ? artifact : null, error: null };\n}\n\n/** Hard-delete one design row (its exported files in storage are not touched). */\nexport async function deleteDesignArtifact(opts: IndexOptions, id: string): Promise<boolean> {\n const { data } = await gql<{ deleteSurfaceChannel?: boolean | null }>(\n opts,\n `mutation DeleteSurfaceChannel($surface: SurfaceType!, $channelId: String!) {\n deleteSurfaceChannel(surface: $surface, channelId: $channelId)\n }`,\n { surface: 'canvas', channelId: id },\n );\n return Boolean(data?.deleteSurfaceChannel);\n}\n"],"names":["_a","_b"],"mappings":"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"}
1
+ {"version":3,"file":"artifacts.js","sources":["../../../../src/features/design/doc/artifacts.ts"],"sourcesContent":["/**\n * Saved designs - native twin of canvas-surface `state/artifacts.ts` for the\n * two kinds the Design Studio writes (`deck`, `flyer`).\n *\n * One SurfaceChannel row per design, keyed `<kind>:<uuid>`, the whole\n * `{ artifact }` in `metadata`. Web Design 0.5.0 keeps these rows on the\n * `design` surface and MOVES the old `canvas` ones there (deleting the canvas\n * copy); web 0.4.x and the canvas surface still read `canvas`. So reads take\n * both surfaces, newest copy of an id winning, and a delete clears both. Saves\n * stay on `canvas`, which every web version sees (0.5.0 moves them on its next\n * read). Switch saves to `design` once no web reads `canvas`.\n *\n * `registerSurfaceChannel` is the idempotent upsert and `metadata` is replaced\n * wholesale: a save sends the complete artifact, never a patch. Reads are\n * best-effort (an error string, never a throw) like `canvas/surfaceIndex.ts`.\n *\n * Pure apart from `fetch`: runs under jest as-is.\n */\nimport { artifactTitle, type CanvasArtifactKind, type DesignDoc, type DesignKind } from './types';\n\nexport const DESIGN_KINDS: readonly DesignKind[] = ['deck', 'flyer'];\n\n/** One saved design (web `CanvasArtifact<CarouselDoc>`). */\nexport interface DesignArtifact {\n /** Row id AND artifact id: `<kind>:<uuid>`. */\n id: string;\n kind: DesignKind;\n sessionId?: string;\n title: string;\n updatedAt: number;\n doc: DesignDoc;\n /** First page as an image, for a grid tile - written by web; native keeps it through saves. */\n thumbUrl?: string;\n exportUrl?: string;\n}\n\nexport interface IndexOptions {\n url: string;\n token?: string | null;\n signal?: AbortSignal;\n}\n\nfunction uuid(): string {\n const bytes = new Uint8Array(16);\n let filled = false;\n try {\n (globalThis.crypto as Crypto | undefined)?.getRandomValues?.(bytes);\n filled = bytes.some((b) => b !== 0);\n } catch {\n filled = false;\n }\n if (!filled) for (let i = 0; i < 16; i += 1) bytes[i] = Math.floor(Math.random() * 256);\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/** Mint an artifact id. The kind rides in the id, so a row classifies without decoding its metadata. */\nexport function newArtifactId(kind: CanvasArtifactKind): string {\n return `${kind}:${uuid()}`;\n}\n\n/** Is this a saved-design id (`deck:…` / `flyer:…`), as a link or chat card carries it? */\nexport function isDesignArtifactId(id: unknown): id is string {\n return typeof id === 'string' && /^(deck|flyer):[0-9A-Za-z-]{8,}$/.test(id.trim());\n}\n\n/** Is this a rich-text doc id (`doc:…`, the web docs editor's rows)? Docs are not designs: they open in the docs editor. */\nexport function isDocArtifactId(id: unknown): id is string {\n return typeof id === 'string' && /^doc:[0-9A-Za-z-]{8,}$/.test(id.trim());\n}\n\nconst stripDataUrl = (src: string | null | undefined): string | null => (src && !src.startsWith('data:') ? src : null);\n\n/**\n * The document as a save writes it (web `slimDoc`): no inline data: images,\n * no page rasters - the index body is capped, and a phone's local file URI\n * means nothing on another device.\n */\nexport function slimDoc(doc: DesignDoc): DesignDoc {\n const hosted = (src: string | null | undefined) => {\n const kept = stripDataUrl(src);\n return kept && !/^(file|ph|assets-library|content):/i.test(kept) ? kept : null;\n };\n return {\n ...doc,\n brandKit: doc.brandKit\n ? { ...doc.brandKit, logos: doc.brandKit.logos.filter((l) => !l.startsWith('data:')) }\n : undefined,\n pages: doc.pages.map((p) => ({\n ...p,\n dataBase64: undefined,\n src: hosted(p.src),\n status: p.status === 'generating' ? 'empty' : p.src && p.src.startsWith('data:') ? 'empty' : p.status,\n background: p.background\n ? {\n ...p.background,\n src: hosted(p.background.src),\n imageStatus: hosted(p.background.src) ? p.background.imageStatus : 'empty',\n }\n : undefined,\n layers: p.layers?.map((l) =>\n l.kind === 'image'\n ? {\n ...l,\n src: hosted(l.src),\n imageStatus: hosted(l.src) ? l.imageStatus : 'empty',\n uploadError: undefined,\n }\n : l,\n ),\n })),\n };\n}\n\n/** Does a document still hold a picture only this phone can see (an upload that has not finished)? */\nexport function hasLocalMedia(doc: DesignDoc): boolean {\n const local = (src: string | null | undefined) =>\n Boolean(src && /^(file|ph|assets-library|content|data):/i.test(src));\n return doc.pages.some(\n (p) => local(p.background?.src) || (p.layers ?? []).some((l) => l.kind === 'image' && local(l.src)),\n );\n}\n\n/** `metadata` arrives decoded, or as text from a backend that types it a String. */\nexport function decodeMetadata(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\n/** Validate a decoded row (untrusted JSON from the index); null for anything but a design. */\nexport function coerceDesignArtifact(metadata: unknown): DesignArtifact | null {\n const meta = decodeMetadata(metadata) as { artifact?: DesignArtifact } | null;\n const artifact = meta?.artifact;\n if (!artifact || typeof artifact.id !== 'string' || !artifact.id) return null;\n if (!DESIGN_KINDS.includes(artifact.kind)) return null;\n const doc = artifact.doc as DesignDoc | undefined;\n if (!doc || !Array.isArray(doc.pages) || !(doc.pageWidth > 0) || !(doc.pageHeight > 0)) return null;\n return artifact;\n}\n\n/** Build the row a save writes. */\nexport function buildDesignArtifact(\n id: string,\n kind: DesignKind,\n doc: DesignDoc,\n keep: Pick<DesignArtifact, 'sessionId' | 'thumbUrl' | 'exportUrl'> = {},\n now: number = Date.now(),\n): DesignArtifact {\n const slim = slimDoc(doc);\n return {\n id,\n kind,\n ...(keep.sessionId ? { sessionId: keep.sessionId } : {}),\n title: artifactTitle(slim),\n updatedAt: now,\n doc: slim,\n ...(keep.thumbUrl ? { thumbUrl: keep.thumbUrl } : {}),\n ...(keep.exportUrl ? { exportUrl: keep.exportUrl } : {}),\n };\n}\n\nexport interface GqlResult<T> {\n data: T | null;\n error: string | null;\n}\n\n/** One GraphQL call to the index (shared with `features/docs/docArtifacts`). */\nexport async function gql<T>(\n opts: IndexOptions,\n query: string,\n variables: Record<string, unknown>,\n): Promise<GqlResult<T>> {\n if (!opts.url) return { data: null, error: 'No design 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({ query, variables }),\n signal: opts.signal,\n });\n if (response.status === 401 || response.status === 403) {\n return { data: null, error: 'Your session expired. Sign in again to see your designs.' };\n }\n if (response.status === 413) {\n return { data: null, error: 'This design is too big to save. Remove a few pictures or pages.' };\n }\n if (!response.ok) return { data: null, error: `The design index is unreachable (HTTP ${response.status}).` };\n const payload = (await response.json()) as { data?: T; errors?: Array<{ message?: string }> };\n if (payload?.errors?.length) {\n const raw = payload.errors[0]?.message || '';\n const isAuth = /tenantid|unauthenticated|unauthorized|not authorised|forbidden/i.test(raw);\n return {\n data: null,\n error: isAuth ? 'Your session expired. Sign in again to see your designs.' : raw || 'Request rejected.',\n };\n }\n return { data: payload?.data ?? null, error: null };\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') return { data: null, error: null };\n return { data: null, error: 'Could not reach the design index. Check your connection.' };\n }\n}\n\nconst ROW_FIELDS = 'channelId title metadata updatedAt';\n\n/** Where studio rows live: `design` (web 0.5.0+), and `canvas` until every row has moved. */\nexport const ARTIFACT_SURFACES = ['design', 'canvas'] as const;\nexport type ArtifactSurface = (typeof ARTIFACT_SURFACES)[number];\n/** Where a save writes (see the header). */\nconst SAVE_SURFACE: ArtifactSurface = 'canvas';\n\n/** Write one design (web `saveArtifact`). `ok: false` is lost work: say so. */\nexport async function saveDesignArtifact(\n opts: IndexOptions,\n artifact: DesignArtifact,\n): Promise<{ ok: boolean; error: string | null }> {\n const { data, error } = await gql<{ registerSurfaceChannel?: { channelId?: string } | null }>(\n opts,\n `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {\n registerSurfaceChannel(input: $input) { ${ROW_FIELDS} }\n }`,\n {\n input: {\n surface: SAVE_SURFACE,\n channelId: artifact.id,\n // Top-level AND inside the payload: the column is what lists filter on\n // server-side, the metadata copy is what the reader validates.\n ...(artifact.sessionId ? { sessionId: artifact.sessionId } : {}),\n ...(artifact.title ? { title: artifact.title } : {}),\n metadata: { artifact },\n },\n },\n );\n if (error) return { ok: false, error };\n return data?.registerSurfaceChannel?.channelId\n ? { ok: true, error: null }\n : { ok: false, error: 'Could not save. Recent edits are not stored yet.' };\n}\n\ninterface ChannelsPage {\n surfaceChannels?: { data?: Array<Record<string, unknown>> | null; totalCount?: number } | null;\n}\n\nasync function channelsOn(\n opts: IndexOptions,\n surface: ArtifactSurface,\n search: string,\n limit: number,\n): Promise<{ rows: Array<Record<string, unknown>>; total: number; error: string | null }> {\n const { data, error } = await gql<ChannelsPage>(\n opts,\n `query SurfaceChannels($filter: SurfaceChannelFilter, $offset: Int, $limit: Int) {\n surfaceChannels(filter: $filter, offset: $offset, limit: $limit) { data { ${ROW_FIELDS} } totalCount }\n }`,\n { filter: { surface, search }, offset: 0, limit },\n );\n const page = data?.surfaceChannels;\n return { rows: page?.data ?? [], total: page?.totalCount ?? 0, error };\n}\n\n/**\n * The caller's rows matching `search`, from every studio surface. A row moved\n * mid-read can show on both: the copy with the newest artifact wins. The error\n * is reported only when no surface answered.\n */\nexport async function channelsMatching(\n opts: IndexOptions,\n search: string,\n limit: number,\n surfaces: readonly ArtifactSurface[] = ARTIFACT_SURFACES,\n): Promise<{ rows: Array<Record<string, unknown>>; total: number; error: string | null }> {\n const pages = await Promise.all(surfaces.map((surface) => channelsOn(opts, surface, search, limit)));\n const byId = new Map<string, Record<string, unknown>>();\n const stamp = (row: Record<string, unknown>) => coerceDesignArtifact(row.metadata)?.updatedAt ?? 0;\n for (const page of pages) {\n for (const row of page.rows) {\n const id = typeof row.channelId === 'string' ? row.channelId : '';\n const held = byId.get(id);\n if (!held || stamp(row) > stamp(held)) byId.set(id, row);\n }\n }\n const answered = pages.filter((p) => !p.error);\n return {\n rows: [...byId.values()],\n total: Math.max(0, ...pages.map((p) => p.total)),\n error: answered.length ? null : (pages.find((p) => p.error)?.error ?? null),\n };\n}\n\nexport interface DesignListResult {\n designs: DesignArtifact[];\n /** A kind had rows past `limit`. */\n more: boolean;\n error: string | null;\n}\n\n/**\n * The caller's designs, newest first (web `listArtifactsOfKinds(['deck', 'flyer'])`):\n * `search: '<kind>:'` narrows each kind server-side; the kind is checked again\n * here because the search also matches titles.\n */\nexport async function listDesignArtifacts(opts: IndexOptions, limit = 24): Promise<DesignListResult> {\n const pages = await Promise.all(DESIGN_KINDS.map((kind) => channelsMatching(opts, `${kind}:`, limit)));\n const designs: DesignArtifact[] = [];\n for (const [i, page] of pages.entries()) {\n for (const row of page.rows) {\n const artifact = coerceDesignArtifact(row.metadata);\n if (artifact?.kind === DESIGN_KINDS[i] && artifact.id === row.channelId) designs.push(artifact);\n }\n }\n designs.sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n const error = designs.length === 0 ? (pages.find((p) => p.error)?.error ?? null) : null;\n return {\n designs: designs.slice(0, limit),\n more: pages.some((p) => p.total > limit) || designs.length > limit,\n error,\n };\n}\n\n/**\n * One of the CALLER'S OWN designs (web `loadOwnedArtifact`): the list is\n * scoped server-side to the bearer, the single-row read is not - so an id\n * from outside (a link, a chat card) opens only when the list returns it.\n */\nexport async function loadOwnedDesignArtifact(\n opts: IndexOptions,\n id: string,\n): Promise<{ artifact: DesignArtifact | null; error: string | null }> {\n if (!isDesignArtifactId(id)) return { artifact: null, error: null };\n const page = await channelsMatching(opts, id.trim(), 5);\n const row = page.rows.find((r) => r.channelId === id.trim());\n if (!row) return { artifact: null, error: page.error };\n const artifact = coerceDesignArtifact(row.metadata);\n return { artifact: artifact && artifact.id === id.trim() ? artifact : null, error: null };\n}\n\n/**\n * Hard-delete one design, from every studio surface - a copy left on `canvas`\n * would be moved back by the web (its exported files in storage are not touched).\n */\nexport async function deleteDesignArtifact(opts: IndexOptions, id: string): Promise<boolean> {\n const results = await Promise.all(\n ARTIFACT_SURFACES.map(async (surface) => {\n const { data } = await gql<{ deleteSurfaceChannel?: boolean | null }>(\n opts,\n `mutation DeleteSurfaceChannel($surface: SurfaceType!, $channelId: String!) {\n deleteSurfaceChannel(surface: $surface, channelId: $channelId)\n }`,\n { surface, channelId: id },\n );\n return Boolean(data?.deleteSurfaceChannel);\n }),\n );\n return results.some(Boolean);\n}\n"],"names":["_a","_b"],"mappings":"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"}