aitu-app 0.5.21 → 0.5.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/assets/{ChatMessagesArea-CAnmzKeA.js → ChatMessagesArea-DZUaOu9O.js} +3 -3
- package/assets/{Serializer-DPCLjt6U.js → Serializer-C_KNMVa5.js} +1 -1
- package/assets/{ToolboxDrawer-D-ZDs49h.js → ToolboxDrawer-DMs6NEQ9.js} +18 -18
- package/assets/_baseUniq-CkDEmepm.js +1 -0
- package/assets/{advancedFormat-Chr195ZY.js → advancedFormat-DDVKqCcb.js} +1 -1
- package/assets/{ai-analyze-D3V-tpIV.js → ai-analyze-CdMnSdcj.js} +1 -1
- package/assets/{arc-lNLKXIKC.js → arc-DxooX0JA.js} +1 -1
- package/assets/{architectureDiagram-VXUJARFQ-CCzBT9XK.js → architectureDiagram-VXUJARFQ-By9X2_fg.js} +1 -1
- package/assets/{batch-image-generation-CgR-a8Ii.js → batch-image-generation-BNCavPE3.js} +1 -1
- package/assets/{blockDiagram-38ab4fdb-CbcE_DRD.js → blockDiagram-38ab4fdb-CaSq1se3.js} +1 -1
- package/assets/{blockDiagram-VD42YOAC-CgcfCyW1.js → blockDiagram-VD42YOAC-BikDTbXB.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-DqzYo_xg.js → c4Diagram-3d4e48cf-B4tV12g-.js} +1 -1
- package/assets/{c4Diagram-YG6GDRKO-BTZAWhX1.js → c4Diagram-YG6GDRKO-JMT--oeK.js} +1 -1
- package/assets/channel-C_nOy9ji.js +1 -0
- package/assets/{chunk-4BX2VUAB-DH-I_3Sl.js → chunk-4BX2VUAB-BPeyyZbJ.js} +1 -1
- package/assets/{chunk-55IACEB6-BJKBSn0v.js → chunk-55IACEB6-Ccwuu0V6.js} +1 -1
- package/assets/{chunk-B4BG7PRW-BIhB4ChZ.js → chunk-B4BG7PRW-DLAZ694p.js} +1 -1
- package/assets/{chunk-DI55MBZ5-NlFLhYIc.js → chunk-DI55MBZ5-B4N06CXR.js} +1 -1
- package/assets/{chunk-FMBD7UC4-QVfOPBEJ.js → chunk-FMBD7UC4-DhF98R8b.js} +1 -1
- package/assets/{chunk-QN33PNHL-C_DotWZ6.js → chunk-QN33PNHL-DRmv0Kl8.js} +1 -1
- package/assets/{chunk-QZHKN3VN-Ei6ogyMg.js → chunk-QZHKN3VN-NK4FKL-2.js} +1 -1
- package/assets/{chunk-TZMSLE5B-CKPTgIMs.js → chunk-TZMSLE5B-C3pBP9gO.js} +1 -1
- package/assets/classDiagram-2ON5EDUG-LTjKb48E.js +1 -0
- package/assets/{classDiagram-70f12bd4-DeAD0Lw4.js → classDiagram-70f12bd4-CzjJ3zBX.js} +1 -1
- package/assets/classDiagram-v2-WZHVMYZB-LTjKb48E.js +1 -0
- package/assets/{classDiagram-v2-f2320105-DR43MMrr.js → classDiagram-v2-f2320105-4itfn1co.js} +1 -1
- package/assets/clone-aw5zGyML.js +1 -0
- package/assets/{cose-bilkent-S5V4N54A-CE31mcuy.js → cose-bilkent-S5V4N54A-D40X2DSY.js} +1 -1
- package/assets/{createText-2e5e7dd3-DuyGuD-n.js → createText-2e5e7dd3-DhE7DCyc.js} +1 -1
- package/assets/{cytoscape-cose-bilkent-DTqUuT3l.js → cytoscape-cose-bilkent-BsYgDGHx.js} +1 -1
- package/assets/{dagre-6UL2VRFP-CuJmVGl3.js → dagre-6UL2VRFP-uiP7xLTe.js} +1 -1
- package/assets/{diagram-PSM6KHXK-D5Y5dlL9.js → diagram-PSM6KHXK-BUdQQ4mi.js} +1 -1
- package/assets/{diagram-QEK2KX5R-DOWAGxHq.js → diagram-QEK2KX5R-Da7c7682.js} +1 -1
- package/assets/{diagram-S2PKOQOG-ykMhl6fc.js → diagram-S2PKOQOG-B6hGrurD.js} +1 -1
- package/assets/{edges-e0da2a9e-BpsZLv9t.js → edges-e0da2a9e-BzY0YHdX.js} +1 -1
- package/assets/{erDiagram-9861fffd-rZLPDBgy.js → erDiagram-9861fffd-C4picwCJ.js} +1 -1
- package/assets/{erDiagram-Q2GNP2WA-zRo1erex.js → erDiagram-Q2GNP2WA-C0s9UR06.js} +1 -1
- package/assets/{flowDb-956e92f1-f4MK2XS7.js → flowDb-956e92f1-B5hwoPgC.js} +1 -1
- package/assets/{flowDiagram-66a62f08-_6Eo5sZi.js → flowDiagram-66a62f08-CrR2uteW.js} +1 -1
- package/assets/{flowDiagram-NV44I4VS-CFCClCRc.js → flowDiagram-NV44I4VS-DjrSimbb.js} +1 -1
- package/assets/flowDiagram-v2-96b9c2cf-DgGX-RZm.js +1 -0
- package/assets/{flowchart-elk-definition-4a651766-t4QJuK_b.js → flowchart-elk-definition-4a651766-BDOktHiR.js} +1 -1
- package/assets/{ganttDiagram-JELNMOA3-DIX2ad-2.js → ganttDiagram-JELNMOA3-4pTVMpLW.js} +1 -1
- package/assets/{ganttDiagram-c361ad54-dX5QjWrh.js → ganttDiagram-c361ad54-DRHnwNf3.js} +1 -1
- package/assets/{gitGraphDiagram-72cf32ee-BBZSqS6J.js → gitGraphDiagram-72cf32ee-C5lLz1AW.js} +1 -1
- package/assets/{gitGraphDiagram-NY62KEGX-C-FRyLSQ.js → gitGraphDiagram-NY62KEGX-RhL9MP5w.js} +1 -1
- package/assets/{graph-BpCqwwyJ.js → graph-CfNSLaMq.js} +1 -1
- package/assets/{graph-dwf5l9kJ.js → graph-bUdqaJE_.js} +1 -1
- package/assets/{grid-image-DRAUp_wj.js → grid-image-acNs-BIa.js} +1 -1
- package/assets/{has-BBSmRLAB.js → has-DqJVnicm.js} +1 -1
- package/assets/hasIn-BgAGChZR.js +1 -0
- package/assets/{index-3862675e-BmuXVGGA.js → index-3862675e-CGEqBqVJ.js} +1 -1
- package/assets/{index-DNIlXgAo.js → index-BJLqfOr0.js} +15 -15
- package/assets/{index-DEjUAZUe.js → index-BVXa7MXV.js} +2 -2
- package/assets/index-CB62HEjY.js +1 -0
- package/assets/index-CJy2IilV.js +13 -0
- package/assets/index-CNCXXhfY.css +1 -0
- package/assets/{index-DvbaH1wH.js → index-Ck1hF1QZ.js} +9 -9
- package/assets/index-D5zpPSZd.css +1 -0
- package/assets/index-DNBUgJ6m.js +6 -0
- package/assets/{index-eOV7y-oZ.js → index-DYqiMz6F.js} +1 -1
- package/assets/{index-_FyCDKGq.js → index-DwM7FTGg.js} +4 -4
- package/assets/{index-CISxTBJ3.js → index-Mr4gAcdX.js} +1 -1
- package/assets/index-UMnk2FgQ.css +1 -0
- package/assets/index-hu9MEe3D.js +2087 -0
- package/assets/{infoDiagram-WHAUD3N6-Cw6LtQsv.js → infoDiagram-WHAUD3N6-PQkd8OJe.js} +1 -1
- package/assets/{infoDiagram-f8f76790-suYKggbB.js → infoDiagram-f8f76790-DMu2j8xn.js} +1 -1
- package/assets/{inspiration-board-8CO8xK39.js → inspiration-board-DjFziX4I.js} +1 -1
- package/assets/{isEmpty-BZ44SF3F.js → isEmpty-lhEuKFnA.js} +1 -1
- package/assets/{journeyDiagram-49397b02-DLzRdow3.js → journeyDiagram-49397b02-c1Ox_S5e.js} +1 -1
- package/assets/{journeyDiagram-XKPGCS4Q-CcD6LNVi.js → journeyDiagram-XKPGCS4Q-C9TTNqlU.js} +1 -1
- package/assets/{kanban-definition-3W4ZIXB7-DWA3YqY9.js → kanban-definition-3W4ZIXB7-D48lDwmv.js} +1 -1
- package/assets/{layout-D8KZ21ze.js → layout-LQknPSHO.js} +1 -1
- package/assets/{layout-jxFX0Ar3.js → layout-k4A-djr0.js} +1 -1
- package/assets/{line-B3fXWiyE.js → line-DW5onvZ1.js} +1 -1
- package/assets/{linear-DsVcoO9v.js → linear-BD1p-SFP.js} +1 -1
- package/assets/{mermaid.core-ruaJ9d8x.js → mermaid.core-C9xtTvXS.js} +4 -4
- package/assets/{min-B6fh4WRE.js → min-DVwuybYx.js} +1 -1
- package/assets/{mindmap-definition-VGOIOE7T-BzeNa7DW.js → mindmap-definition-VGOIOE7T-CKq7aT8O.js} +1 -1
- package/assets/{mindmap-definition-fc14e90a-C3sElkm0.js → mindmap-definition-fc14e90a-ByyhB4pn.js} +1 -1
- package/assets/{photo-wall-splitter-C1GbxYBl.js → photo-wall-splitter-BIKUaBqT.js} +1 -1
- package/assets/{pick-DUB8w7iE.js → pick-DgQOmoYu.js} +1 -1
- package/assets/{pie-DAYMJpRO.js → pie-B6R_p3p3.js} +1 -1
- package/assets/{pieDiagram-8a3498a8-CZI3pF7g.js → pieDiagram-8a3498a8-DHhO5yag.js} +1 -1
- package/assets/{pieDiagram-ADFJNKIX-BqonG77Q.js → pieDiagram-ADFJNKIX-DN2VC8bQ.js} +1 -1
- package/assets/{quadrantDiagram-120e2f19-Q2bVMK-T.js → quadrantDiagram-120e2f19-DPjaVe-4.js} +1 -1
- package/assets/{quadrantDiagram-AYHSOK5B-yJZRIs-Q.js → quadrantDiagram-AYHSOK5B-CiJOSVPI.js} +1 -1
- package/assets/{requirementDiagram-UZGBJVZJ-3kaAkLjO.js → requirementDiagram-UZGBJVZJ-D2GEKncs.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-DHOhXBYo.js → requirementDiagram-deff3bca-Bw6uhN2Z.js} +1 -1
- package/assets/{sankeyDiagram-04a897e0-3UqYNZg9.js → sankeyDiagram-04a897e0-glX-T11Z.js} +1 -1
- package/assets/{sankeyDiagram-TZEHDZUN-Ce844Tbc.js → sankeyDiagram-TZEHDZUN-B0sxBMgX.js} +1 -1
- package/assets/{sequenceDiagram-704730f1-CBXqjnXl.js → sequenceDiagram-704730f1-YOQcYS6k.js} +1 -1
- package/assets/{sequenceDiagram-WL72ISMW-DBN2cRGt.js → sequenceDiagram-WL72ISMW-CH7OsdKd.js} +1 -1
- package/assets/{settings-dialog-aU8BHcuS.js → settings-dialog-BhXTHyTf.js} +1 -1
- package/assets/{stateDiagram-587899a1-BGKPA37n.js → stateDiagram-587899a1-DB0HJUlE.js} +1 -1
- package/assets/{stateDiagram-FKZM4ZOC-Czg5Opf0.js → stateDiagram-FKZM4ZOC-D7dinatq.js} +1 -1
- package/assets/stateDiagram-v2-4FDKWEC3-34OgkUmW.js +1 -0
- package/assets/{stateDiagram-v2-d93cdb3a-DWU3UljE.js → stateDiagram-v2-d93cdb3a-CVqrr3U9.js} +1 -1
- package/assets/{styles-6aaf32cf-BVLDN8CD.js → styles-6aaf32cf-CJlj1Ty8.js} +1 -1
- package/assets/{styles-9a916d00-vSy8MhZp.js → styles-9a916d00-l8x77ac6.js} +1 -1
- package/assets/{styles-c10674c1-dzTvI8BU.js → styles-c10674c1-DixhXbk5.js} +1 -1
- package/assets/{svgDrawCommon-08f97a94-dptVwf62.js → svgDrawCommon-08f97a94-9oE5_zSZ.js} +1 -1
- package/assets/{timeline-definition-85554ec2-jKiT0ZaE.js → timeline-definition-85554ec2-BARq6AF9.js} +1 -1
- package/assets/{timeline-definition-IT6M3QCI-B2NoE4jH.js → timeline-definition-IT6M3QCI-B_wm5Yc_.js} +1 -1
- package/assets/{treemap-KMMF4GRG-1nrNbz-r.js → treemap-KMMF4GRG-CEXoIc79.js} +1 -1
- package/assets/ttd-dialog-BgDkODyr.js +47 -0
- package/assets/{ttd-dialog-DCapefb6.css → ttd-dialog-DhSikbX8.css} +1 -1
- package/assets/union-C2tc6S2B.js +1 -0
- package/assets/{upload-Crej215t.js → upload-DQt3EdOm.js} +1 -1
- package/assets/{video-recovery-service-Zb_336FQ.js → video-recovery-service-B0iISZ_W.js} +1 -1
- package/assets/{xychartDiagram-PRI3JC2R-UPkX0dfi.js → xychartDiagram-PRI3JC2R-gNLbCmE-.js} +1 -1
- package/assets/{xychartDiagram-e933f94c-BXYMaBZh.js → xychartDiagram-e933f94c-C1RYlf2W.js} +1 -1
- package/assets/zipObject-B1zPFQtb.js +1 -0
- package/package.json +1 -1
- package/sw-debug/app.js +7 -9
- package/sw-debug/console-entry.js +68 -26
- package/sw-debug/postmessage-entry.js +4 -3
- package/sw-debug/styles.css +58 -102
- package/sw-debug/utils.js +3 -6
- package/sw.js +7 -7
- package/version.json +2 -2
- package/assets/_baseUniq-CHS3E5If.js +0 -1
- package/assets/channel-Bew-Iahk.js +0 -1
- package/assets/classDiagram-2ON5EDUG-DIttp4Yk.js +0 -1
- package/assets/classDiagram-v2-WZHVMYZB-DIttp4Yk.js +0 -1
- package/assets/clone-Y0952eQY.js +0 -1
- package/assets/flowDiagram-v2-96b9c2cf-Dn2WmcvX.js +0 -1
- package/assets/hasIn-CGUnHN5L.js +0 -1
- package/assets/index-B2dvADz8.css +0 -1
- package/assets/index-DCs3C-gs.js +0 -1
- package/assets/index-Ds1UcDjn.js +0 -2064
- package/assets/stateDiagram-v2-4FDKWEC3-4Ev4KuVZ.js +0 -1
- package/assets/ttd-dialog-WN-s4x87.js +0 -47
- package/assets/union-B2D_ldts.js +0 -1
- package/assets/zipObject-bwVIVuzi.js +0 -1
package/assets/index-DCs3C-gs.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a8 as Z,a9 as V,aa as $,ab as ne,ac as re,ad as K,ae as P,u as F,af as H,$ as Y,c as U,ag as q,ah as Q,ai as X,aj as ee,S as O,U as R,ak as oe,r as I,W as C,a2 as ce,J as l,K as le,L as de,al as z,am as te}from"./index-Ds1UcDjn.js";import{U as pe}from"./upload-Crej215t.js";const me=2,se="aitu-backup";function ae(E){return E.map(n=>n.id?n:{...n,id:`imported-${Date.now()}-${Math.random().toString(36).slice(2,9)}`})}function L(E){return{"image/jpeg":".jpg","image/jpg":".jpg","image/png":".png","image/gif":".gif","image/webp":".webp","image/svg+xml":".svg","video/mp4":".mp4","video/webm":".webm","video/quicktime":".mov"}[E]||""}function ie(E){return E.replace(/[<>:"/\\|?*]/g,"_").replace(/\s+/g," ").trim()||"unnamed"}class ue{async exportToZip(n,e){const t=new Z;e==null||e(5,"正在准备数据...");const s=V.getCurrentBoard(),o={currentBoardId:(s==null?void 0:s.id)||null,currentBoardName:s==null?void 0:s.name,viewport:s==null?void 0:s.viewport},m={signature:se,version:me,createdAt:Date.now(),includes:{prompts:n.includePrompts,projects:n.includeProjects,assets:n.includeAssets},stats:{promptCount:0,videoPromptCount:0,imagePromptCount:0,folderCount:0,boardCount:0,assetCount:0,taskCount:0},workspaceState:o};if(n.includePrompts){e==null||e(10,"正在导出提示词...");const p=await this.collectPromptData();t.file("prompts.json",JSON.stringify(p,null,2)),m.stats.promptCount=p.promptHistory.length,m.stats.videoPromptCount=p.videoPromptHistory.length,m.stats.imagePromptCount=p.imagePromptHistory.length}n.includeProjects&&(e==null||e(25,"正在导出项目..."),await this.exportProjects(t,m,e)),n.includeAssets&&(e==null||e(50,"正在导出素材..."),await this.exportAssets(t,m,e)),e==null||e(80,"正在写入清单..."),t.file("manifest.json",JSON.stringify(m,null,2)),e==null||e(85,"正在压缩文件...");const u=await t.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}},p=>{const i=85+Math.round(p.percent*.14);e==null||e(i,"正在压缩...")});return e==null||e(100,"导出完成"),u}async exportProjects(n,e,t){const s=n.folder("projects");if(!s)return;const[o,m]=await Promise.all([$.loadAllFolders(),$.loadAllBoards()]),u=this.buildFolderPathMap(o);for(const p of o){const i=u.get(p.id)||p.name;s.folder(i)}e.stats.folderCount=o.length;for(let p=0;p<m.length;p++){const i=m[p],b=i.folderId?u.get(i.folderId):null,j=ie(i.name),c=b?`${b}/${j}.drawnix`:`${j}.drawnix`,x={type:ne.drawnix,version:re.drawnix,source:"backup",elements:i.elements||[],viewport:i.viewport||{zoom:1},theme:i.theme,boardMeta:{id:i.id,name:i.name,folderId:i.folderId,order:i.order,createdAt:i.createdAt,updatedAt:i.updatedAt}};if(s.file(c,JSON.stringify(x,null,2)),t&&m.length>0){const f=25+Math.round((p+1)/m.length*20);t(f,`正在导出画板 (${p+1}/${m.length})...`)}}e.stats.boardCount=m.length}buildFolderPathMap(n){const e=new Map,t=new Map;for(const o of n)t.set(o.id,o);const s=o=>{if(e.has(o))return e.get(o);const m=t.get(o);if(!m)return"";const u=ie(m.name);if(m.parentId){const p=s(m.parentId),i=p?`${p}/${u}`:u;return e.set(o,i),i}return e.set(o,u),u};for(const o of n)s(o.id);return e}async exportAssets(n,e,t){var a;const s=n.folder("assets");if(!s)return;const o=new Set;let m=0;const u=K.createInstance({name:P.STORAGE_NAME,storeName:P.STORE_NAME}),p=await u.keys(),i=p.length;for(let r=0;r<p.length;r++){try{const d=await u.getItem(p[r]);if(d){s.file(`${d.id}.meta.json`,JSON.stringify(d,null,2));const h=await F.getCachedBlob(d.url);if(h){const g=L(d.mimeType);s.file(`${d.id}${g}`,h),o.add(d.url),m++}}}catch(d){console.warn(`[BackupRestore] Failed to load asset ${p[r]}:`,d)}if(t&&i>0){const d=50+Math.round((r+1)/i*15);t(d,`正在导出本地素材 (${r+1}/${i})...`)}}const j=(await F.getAllCacheMetadata()).filter(r=>!o.has(r.url)),c=j.length;for(let r=0;r<j.length;r++){const d=j[r];try{const h=((a=d.metadata)==null?void 0:a.taskId)||this.generateIdFromUrl(d.url),g={id:h,url:d.url,type:d.type==="video"?"VIDEO":"IMAGE",mimeType:d.mimeType,size:d.size,source:"AI_GENERATED",createdAt:d.cachedAt,updatedAt:d.lastUsed,metadata:d.metadata};s.file(`${h}.meta.json`,JSON.stringify(g,null,2));const v=await F.getCachedBlob(d.url);if(v){const _=L(d.mimeType);s.file(`${h}${_}`,v),o.add(d.url),m++}}catch(h){console.warn(`[BackupRestore] Failed to export cached media ${d.url}:`,h)}if(t&&c>0){const h=65+Math.round((r+1)/c*10);t(h,`正在导出缓存媒体 (${r+1}/${c})...`)}}e.stats.assetCount=m,t==null||t(75,"正在导出任务数据...");const f=H.getAllTasks().filter(r=>{var d;return r.status===Y.COMPLETED&&(r.type===U.IMAGE||r.type===U.VIDEO)&&((d=r.result)==null?void 0:d.url)});f.length>0&&(n.file("tasks.json",JSON.stringify(f,null,2)),e.stats.taskCount=f.length)}generateIdFromUrl(n){let e=0;for(let t=0;t<n.length;t++){const s=n.charCodeAt(t);e=(e<<5)-e+s,e=e&e}return`cache-${Math.abs(e).toString(36)}`}async importFromZip(n,e){const t={success:!1,prompts:{imported:0,skipped:0},projects:{folders:0,boards:0,merged:0,skipped:0},assets:{imported:0,skipped:0},tasks:{imported:0,skipped:0},errors:[]};try{e==null||e(5,"正在读取文件...");const s=await Z.loadAsync(n);e==null||e(10,"正在验证文件格式...");const o=s.file("manifest.json");if(!o)throw new Error("无效的备份文件:未找到 manifest.json");const m=await o.async("string"),u=JSON.parse(m);if(u.signature!==se)throw new Error("无效的备份文件:签名不匹配");if(u.includes.prompts){e==null||e(20,"正在导入提示词...");const p=s.file("prompts.json");if(p){const i=await p.async("string"),b=JSON.parse(i);t.prompts=await this.importPromptData(b)}}u.includes.projects&&(e==null||e(40,"正在导入项目..."),t.projects=await this.importProjects(s,e)),u.includes.assets&&(e==null||e(60,"正在导入素材..."),t.assets=await this.importAssets(s,e),e==null||e(85,"正在导入任务数据..."),t.tasks=await this.importTasks(s)),(t.projects.folders>0||t.projects.boards>0)&&await V.reload(),u.workspaceState&&(t.workspaceState=u.workspaceState),t.success=t.errors.length===0,e==null||e(100,"导入完成")}catch(s){const o=s instanceof Error?s.message:String(s);t.errors.push(o)}return t}downloadZip(n,e){const t=new Date,s=t.toISOString().split("T")[0],o=t.toTimeString().split(" ")[0].replace(/:/g,""),m=`aitu_backup_${s}_${o}.zip`,u=URL.createObjectURL(n),p=document.createElement("a");p.href=u,p.download=e||m,document.body.appendChild(p),p.click(),document.body.removeChild(p),URL.revokeObjectURL(u)}async collectPromptData(){await q();const n=Q();let e=X(),t=ee();const s=H.getTasksByStatus(Y.COMPLETED),o=s.filter(c=>{var x;return c.type===U.IMAGE&&((x=c.params)==null?void 0:x.prompt)}).map(c=>({id:`task_${c.id}`,content:c.params.prompt.trim(),timestamp:c.completedAt||c.createdAt})).filter(c=>c.content.length>0),m=s.filter(c=>{var x;return c.type===U.VIDEO&&((x=c.params)==null?void 0:x.prompt)}).map(c=>({id:`task_${c.id}`,content:c.params.prompt.trim(),timestamp:c.completedAt||c.createdAt})).filter(c=>c.content.length>0),u=new Set(t.map(c=>c.content)),p=o.filter(c=>!u.has(c.content));t=[...t,...p];const i=new Set(e.map(c=>c.content)),b=m.filter(c=>!i.has(c.content));e=[...e,...b];const j=await O.get(R.PRESET_SETTINGS);return{promptHistory:n,videoPromptHistory:e,imagePromptHistory:t,presetSettings:j||{image:{pinnedPrompts:[],deletedPrompts:[]},video:{pinnedPrompts:[],deletedPrompts:[]}}}}async importPromptData(n){let e=0,t=0;const s=n.promptHistory||[],o=n.videoPromptHistory||[],m=n.imagePromptHistory||[];await q();const u=Q(),p=X(),i=ee(),b=new Set(u.map(k=>k.id)),j=new Set(u.map(k=>k.content)),c=s.filter(k=>b.has(k.id)||j.has(k.content)?(t++,!1):(e++,!0)),x=new Set(p.map(k=>k.id)),f=new Set(p.map(k=>k.content)),a=o.filter(k=>x.has(k.id)||f.has(k.content)?(t++,!1):(e++,!0)),r=new Set(i.map(k=>k.id)),d=new Set(i.map(k=>k.content)),h=m.filter(k=>r.has(k.id)||d.has(k.content)?(t++,!1):(e++,!0)),g=[...u,...c],v=[...p,...a],_=[...i,...h];await O.set(R.PROMPT_HISTORY,g),await O.set(R.VIDEO_PROMPT_HISTORY,v),await O.set(R.IMAGE_PROMPT_HISTORY,_);const S=await O.get(R.PRESET_SETTINGS);if(S&&n.presetSettings){const k={image:{pinnedPrompts:[...new Set([...S.image.pinnedPrompts,...n.presetSettings.image.pinnedPrompts])],deletedPrompts:[...new Set([...S.image.deletedPrompts,...n.presetSettings.image.deletedPrompts])]},video:{pinnedPrompts:[...new Set([...S.video.pinnedPrompts,...n.presetSettings.video.pinnedPrompts])],deletedPrompts:[...new Set([...S.video.deletedPrompts,...n.presetSettings.video.deletedPrompts])]}};await O.set(R.PRESET_SETTINGS,k)}else n.presetSettings&&await O.set(R.PRESET_SETTINGS,n.presetSettings);return await oe(),{imported:e,skipped:t}}async importProjects(n,e){let t=0,s=0,o=0,m=0;const u=await $.loadAllFolders(),p=await $.loadAllBoards(),i=new Set(p.map(f=>f.id)),b=Object.keys(n.files).filter(f=>f.startsWith("projects/")&&f.endsWith(".drawnix")&&!f.includes("/_"));if(b.length===0)return{folders:0,boards:0,merged:0,skipped:0};const j=new Set,c=new Map;for(const f of b){const r=f.replace(/^projects\//,"").split("/");if(r.length>1){let d="";for(let h=0;h<r.length-1;h++)d=d?`${d}/${r[h]}`:r[h],j.add(d)}}const x=Array.from(j).sort((f,a)=>{const r=f.split("/").length,d=a.split("/").length;return r-d||f.localeCompare(a)});for(let f=0;f<x.length;f++){const a=x[f],r=a.split("/"),d=r[r.length-1],h=r.length>1?r.slice(0,-1).join("/"):null,g=h&&c.get(h)||null,v=this.generateId();c.set(a,v);const _=u.find(k=>k.name===d&&k.parentId===g);if(_){c.set(a,_.id),m++;continue}const S={id:v,name:d,parentId:g,order:f,isExpanded:!0,createdAt:Date.now(),updatedAt:Date.now()};await $.saveFolder(S),t++}for(let f=0;f<b.length;f++){const a=b[f];try{const r=n.file(a);if(r){const d=await r.async("string"),h=JSON.parse(d),g=h.boardMeta,_=a.replace(/^projects\//,"").split("/"),S=_.length>1?_.slice(0,-1).join("/"):null,k=S&&(c.get(S)||(g==null?void 0:g.folderId))||null,G=_[_.length-1]||"unnamed.drawnix",D=(g==null?void 0:g.name)||G.replace(".drawnix","");if(g!=null&&g.id&&i.has(g.id)){const w=p.find(y=>y.id===g.id);if(w){const y=new Set((w.elements||[]).map(A=>A.id).filter(A=>!!A)),B=(h.elements||[]).filter(A=>A.id?!y.has(A.id):!0),N=[...w.elements||[],...ae(B)],J={...w,elements:N,viewport:h.viewport||w.viewport,theme:h.theme||w.theme,updatedAt:Date.now()};await $.saveBoard(J),o++;continue}}const M={id:(g==null?void 0:g.id)||this.generateId(),name:D,folderId:k,order:(g==null?void 0:g.order)??f,elements:ae(h.elements||[]),viewport:h.viewport,theme:h.theme,createdAt:(g==null?void 0:g.createdAt)||Date.now(),updatedAt:(g==null?void 0:g.updatedAt)||Date.now()};await $.saveBoard(M),s++}}catch(r){console.warn(`[BackupRestore] Failed to import board ${a}:`,r)}if(e&&b.length>0){const r=40+Math.round((f+1)/b.length*15);e(r,`正在导入画板 (${f+1}/${b.length})...`)}}return{folders:t,boards:s,merged:o,skipped:m}}async importAssets(n,e){var b,j,c;let t=0,s=0;const o=Object.keys(n.files).filter(x=>x.startsWith("assets/")&&x.endsWith(".meta.json"));if(o.length===0)return{imported:0,skipped:0};const m=K.createInstance({name:P.STORAGE_NAME,storeName:P.STORE_NAME}),u=await m.keys(),p=new Set(u),i=new Set(await F.getAllCachedUrls());for(let x=0;x<o.length;x++){const f=o[x],a=f.replace("assets/","").replace(".meta.json","");try{const r=n.file(f);if(!r){s++;continue}const d=await r.async("string"),h=JSON.parse(d),g=h.source==="AI_GENERATED";if(g){if(i.has(h.url)){s++;continue}}else if(p.has(a)){s++;continue}const v=[".jpg",".png",".gif",".webp",".mp4",".webm",".mov",".svg"];let _=null;for(const S of v){const k=n.file(`assets/${a}${S}`);if(k){_=await k.async("blob");break}}if(!_&&h.mimeType){const S=L(h.mimeType);if(S){const k=n.file(`assets/${a}${S}`);k&&(_=await k.async("blob"))}}if(_){const S=h.type==="VIDEO"?"video":"image";await F.cacheMediaFromBlob(h.url,_,S,{taskId:((b=h.metadata)==null?void 0:b.taskId)||a,prompt:(j=h.metadata)==null?void 0:j.prompt,model:(c=h.metadata)==null?void 0:c.model}),g||await m.setItem(a,h),t++}else console.warn(`[BackupRestore] No media file found for asset ${a}, skipping`),s++}catch(r){console.warn(`[BackupRestore] Failed to import asset ${a}:`,r),s++}if(e&&o.length>0){const r=60+Math.round((x+1)/o.length*35);e(r,`正在导入素材 (${x+1}/${o.length})...`)}}return{imported:t,skipped:s}}async importTasks(n){let e=0,t=0;const s=n.file("tasks.json");if(!s)return{imported:0,skipped:0};try{const o=await s.async("string"),m=JSON.parse(o);if(!Array.isArray(m)||m.length===0)return{imported:0,skipped:0};const u=H.getAllTasks(),p=new Set(u.map(b=>b.id)),i=m.filter(b=>p.has(b.id)?(t++,!1):!0);i.length>0&&(await H.restoreTasks(i),e=i.length)}catch(o){console.warn("[BackupRestore] Failed to import tasks:",o)}return{imported:e,skipped:t}}generateId(){return`${Date.now().toString(36)}-${Math.random().toString(36).substring(2,11)}`}}const W=new ue,ge=({open:E,onOpenChange:n,container:e,onSwitchBoard:t,onBeforeImport:s})=>{var M;const[o,m]=I.useState("backup"),[u,p]=I.useState({includePrompts:!0,includeProjects:!0,includeAssets:!0}),[i,b]=I.useState(!1),[j,c]=I.useState(0),[x,f]=I.useState(""),[a,r]=I.useState(null),[d,h]=I.useState(null),g=I.useRef(null),v=I.useCallback(async w=>{if(!w.currentBoardId||!t)return;const y=V.getBoard(w.currentBoardId);if(!y)return;const T=V.getCurrentBoard();if(!T||!T.elements||T.elements.length===0)await t(w.currentBoardId,w.viewport),C.success(`已切换到画板「${y.name}」`);else{const N=ce.confirm({header:"恢复画布状态",body:`备份时正在编辑画板「${w.currentBoardName||y.name}」,是否切换到该画板?`,confirmBtn:"切换",cancelBtn:"取消",onConfirm:async()=>{await t(w.currentBoardId,w.viewport),C.success(`已切换到画板「${y.name}」`),N.destroy()},onCancel:()=>{N.destroy()}})}},[t]),_=I.useCallback(async()=>{if(!i){if(d&&(await v(d),h(null)),a&&a.tasks&&a.tasks.imported>0){window.location.reload();return}n(!1),c(0),f(""),r(null)}},[i,n,a,d,v]),S=I.useCallback(async()=>{if(!u.includePrompts&&!u.includeProjects&&!u.includeAssets){C.warning("请至少选择一项要备份的内容");return}b(!0),c(0),f("正在准备...");try{const w=await W.exportToZip(u,(y,T)=>{c(y),f(T)});W.downloadZip(w),C.success("备份成功!"),_()}catch(w){console.error("[BackupRestore] Export failed:",w),C.error("备份失败,请重试")}finally{b(!1)}},[u,_]),k=I.useCallback(()=>{var w;(w=g.current)==null||w.click()},[]),G=I.useCallback(async w=>{var T,B;const y=(T=w.target.files)==null?void 0:T[0];if(y){if(!y.name.endsWith(".zip")){C.warning("请选择 ZIP 格式的备份文件");return}b(!0),c(0),f("正在保存当前画板..."),r(null);try{s&&await s(),f("正在读取文件...");const N=await W.importFromZip(y,(J,A)=>{c(J),f(A)});r(N),(B=N.workspaceState)!=null&&B.currentBoardId&&h(N.workspaceState),N.success?C.success("导入成功!"):N.errors.length>0&&C.warning("导入完成,但有部分错误")}catch(N){console.error("[BackupRestore] Import failed:",N),C.error("导入失败,请检查文件格式")}finally{b(!1),g.current&&(g.current.value="")}}},[s]),D=I.useCallback((w,y)=>{p(T=>({...T,[w]:y}))},[]);return l.jsx(le,{open:E,onOpenChange:_,children:l.jsxs(de,{className:"backup-restore-dialog",container:e,children:[l.jsx("h2",{className:"backup-restore-dialog__title",children:"备份 / 恢复"}),l.jsxs("div",{className:"backup-restore-dialog__tabs",children:[l.jsx("button",{className:`backup-restore-dialog__tab ${o==="backup"?"backup-restore-dialog__tab--active":""}`,onClick:()=>m("backup"),disabled:i,children:"备份"}),l.jsx("button",{className:`backup-restore-dialog__tab ${o==="restore"?"backup-restore-dialog__tab--active":""}`,onClick:()=>m("restore"),disabled:i,children:"恢复"})]}),o==="backup"&&l.jsxs("div",{className:"backup-restore-dialog__panel",children:[l.jsx("p",{className:"backup-restore-dialog__description",children:"选择要备份的内容,将导出为 ZIP 压缩包:"}),l.jsxs("div",{className:"backup-restore-dialog__options",children:[l.jsx(z,{checked:u.includePrompts,onChange:w=>D("includePrompts",w),disabled:i,children:l.jsxs("div",{className:"backup-restore-dialog__option-content",children:[l.jsx("span",{className:"backup-restore-dialog__option-title",children:"提示词"}),l.jsx("span",{className:"backup-restore-dialog__option-desc",children:"包含图片和视频生成的历史提示词"})]})}),l.jsx(z,{checked:u.includeProjects,onChange:w=>D("includeProjects",w),disabled:i,children:l.jsxs("div",{className:"backup-restore-dialog__option-content",children:[l.jsx("span",{className:"backup-restore-dialog__option-title",children:"项目"}),l.jsx("span",{className:"backup-restore-dialog__option-desc",children:"包含所有文件夹和画板"})]})}),l.jsx(z,{checked:u.includeAssets,onChange:w=>D("includeAssets",w),disabled:i,children:l.jsxs("div",{className:"backup-restore-dialog__option-content",children:[l.jsx("span",{className:"backup-restore-dialog__option-title",children:"素材库"}),l.jsx("span",{className:"backup-restore-dialog__option-desc",children:"包含所有本地上传的图片和视频"})]})})]}),i&&l.jsxs("div",{className:"backup-restore-dialog__progress",children:[l.jsx(te,{percentage:j,theme:"line"}),l.jsx("span",{className:"backup-restore-dialog__progress-text",children:x})]}),l.jsxs("div",{className:"backup-restore-dialog__actions",children:[l.jsx("button",{className:"backup-restore-dialog__button backup-restore-dialog__button--cancel",onClick:_,disabled:i,children:"取消"}),l.jsx("button",{className:"backup-restore-dialog__button backup-restore-dialog__button--primary",onClick:S,disabled:i,children:i?"正在备份...":"开始备份"})]})]}),o==="restore"&&l.jsxs("div",{className:"backup-restore-dialog__panel",children:[l.jsx("p",{className:"backup-restore-dialog__description",children:"选择备份文件进行恢复,数据将增量导入(不会覆盖现有内容):"}),l.jsxs("div",{className:"backup-restore-dialog__dropzone",onClick:k,children:[l.jsx(pe,{className:"backup-restore-dialog__dropzone-icon"}),l.jsx("span",{className:"backup-restore-dialog__dropzone-text",children:"点击选择备份文件 (.zip)"}),l.jsx("input",{ref:g,type:"file",accept:".zip",onChange:G,style:{display:"none"}})]}),i&&l.jsxs("div",{className:"backup-restore-dialog__progress",children:[l.jsx(te,{percentage:j,theme:"line"}),l.jsx("span",{className:"backup-restore-dialog__progress-text",children:x})]}),a&&l.jsxs("div",{className:"backup-restore-dialog__result",children:[l.jsx("h4",{className:"backup-restore-dialog__result-title",children:a.success?"导入完成":"导入完成(有错误)"}),l.jsxs("ul",{className:"backup-restore-dialog__result-list",children:[(a.prompts.imported>0||a.prompts.skipped>0)&&l.jsxs("li",{children:["提示词:导入 ",a.prompts.imported," 条,跳过 ",a.prompts.skipped," 条"]}),(a.projects.folders>0||a.projects.boards>0||a.projects.merged>0)&&l.jsxs("li",{children:["项目:导入 ",a.projects.folders," 个文件夹,",a.projects.boards," 个画板",a.projects.merged>0&&`,合并 ${a.projects.merged} 个画板`]}),(a.assets.imported>0||a.assets.skipped>0)&&l.jsxs("li",{children:["素材:导入 ",a.assets.imported," 个,跳过 ",a.assets.skipped," 个"]}),a.tasks&&(a.tasks.imported>0||a.tasks.skipped>0)&&l.jsxs("li",{children:["任务:导入 ",a.tasks.imported," 个,跳过 ",a.tasks.skipped," 个"]})]}),a.errors.length>0&&l.jsxs("div",{className:"backup-restore-dialog__result-errors",children:[l.jsx("strong",{children:"错误信息:"}),l.jsx("ul",{children:a.errors.map((w,y)=>l.jsx("li",{children:w},y))})]})]}),l.jsx("div",{className:"backup-restore-dialog__actions",children:l.jsx("button",{className:"backup-restore-dialog__button backup-restore-dialog__button--cancel",onClick:_,disabled:i,children:a?((M=a.tasks)==null?void 0:M.imported)>0?"完成并刷新":"完成":"取消"})})]})]})})};export{ge as BackupRestoreDialog};
|