3222 lines
113 KiB
JavaScript
3222 lines
113 KiB
JavaScript
/*
|
|
* Extracted from browser-delivered Turbopack chunk: 09166d9658efb080.e1742a6c63.js
|
|
* Module id: 929286
|
|
* For reading/searching only; this factory depends on the original Turbopack runtime.
|
|
*/
|
|
|
|
const moduleFactory = (e) => {
|
|
"use strict";
|
|
let t;
|
|
e.i(23741);
|
|
var n = e.i(462214),
|
|
o = e.i(358379),
|
|
i = e.i(888255),
|
|
r = e.i(396805),
|
|
a = e.i(744027),
|
|
s = e.i(834308),
|
|
l = e.i(768924),
|
|
d = e.i(226508),
|
|
u = e.i(410985),
|
|
c = e.i(144963),
|
|
p = e.i(417754),
|
|
h = e.i(677418),
|
|
g = e.i(713118),
|
|
f = e.i(799545),
|
|
m = e.i(182004),
|
|
y = e.i(733077);
|
|
let v = null;
|
|
function w(e) {
|
|
v = e;
|
|
}
|
|
let x = { current: !1 };
|
|
function S(e, t, n) {
|
|
if (t && !n && e.some((e) => "select" === e.type)) {
|
|
if (x.current) {
|
|
x.current = !1;
|
|
return;
|
|
}
|
|
v?.();
|
|
}
|
|
}
|
|
e.s(
|
|
[
|
|
"afterApplyNodeChangesClipTimelineSync",
|
|
() => S,
|
|
"registerClearEmbedClipTimelineSelection",
|
|
() => w,
|
|
"suppressCanvasSelectionDrivenTimelineClearRef",
|
|
0,
|
|
x,
|
|
],
|
|
689625,
|
|
);
|
|
var b = e.i(325528),
|
|
I = e.i(640958);
|
|
function _(e, t) {
|
|
if (0 === e.length) return 0;
|
|
let n = Math.ceil((t / 100) * e.length) - 1;
|
|
return e[Math.max(0, n)];
|
|
}
|
|
let E = 0;
|
|
class M {
|
|
static _instance = null;
|
|
_sessionId = "";
|
|
_sessionStart = 0;
|
|
_samples = new Map();
|
|
_metrics = new Map();
|
|
_fpsSamples = [];
|
|
_fpsAnimFrame = null;
|
|
_fpsLastTime = 0;
|
|
_fpsFrameCount = 0;
|
|
_isActive = !1;
|
|
_fpsPaused = !1;
|
|
static getInstance() {
|
|
return M._instance || (M._instance = new M()), M._instance;
|
|
}
|
|
startSession(e) {
|
|
this._isActive && this.endSession(),
|
|
E++,
|
|
(this._sessionId = `perf-${Date.now()}-${E}`),
|
|
(this._sessionStart = performance.now()),
|
|
this._samples.clear(),
|
|
this._metrics.clear(),
|
|
(this._fpsSamples = []),
|
|
(this._isActive = !0),
|
|
this.startFpsMonitor();
|
|
}
|
|
endSession() {
|
|
return this._isActive
|
|
? (this.stopFpsMonitor(), (this._isActive = !1), this.getSummary())
|
|
: null;
|
|
}
|
|
get isActive() {
|
|
return this._isActive;
|
|
}
|
|
startMeasure(e) {
|
|
if (!this._isActive) return () => 0;
|
|
let t = performance.now();
|
|
return (n) => {
|
|
let o = performance.now() - t;
|
|
return this.recordSample(e, o, n?.success), o;
|
|
};
|
|
}
|
|
recordSample(e, t, n) {
|
|
if (!this._isActive) return;
|
|
let o = {
|
|
operation: e,
|
|
durationMs: t,
|
|
timestamp: Date.now(),
|
|
success: n,
|
|
},
|
|
i = this._samples.get(e);
|
|
i || ((i = []), this._samples.set(e, i)),
|
|
i.push(o),
|
|
i.length > 500 && i.splice(0, i.length - 500);
|
|
}
|
|
recordMetric(e, t, n) {
|
|
this._isActive &&
|
|
this._metrics.set(e, {
|
|
name: e,
|
|
value: t,
|
|
timestamp: Date.now(),
|
|
tags: n,
|
|
});
|
|
}
|
|
getSummary() {
|
|
let e,
|
|
t = this._isActive ? performance.now() - this._sessionStart : 0,
|
|
n = {};
|
|
for (let [e, t] of this._samples) {
|
|
if (0 === t.length) continue;
|
|
let o = t.map((e) => e.durationMs).sort((e, t) => e - t),
|
|
i = t.filter((e) => !1 !== e.success).length;
|
|
n[e] = {
|
|
count: t.length,
|
|
avgMs: o.reduce((e, t) => e + t, 0) / o.length,
|
|
p50Ms: _(o, 50),
|
|
p95Ms: _(o, 95),
|
|
p99Ms: _(o, 99),
|
|
maxMs: o[o.length - 1],
|
|
minMs: o[0],
|
|
successRate: t.length > 0 ? i / t.length : 1,
|
|
};
|
|
}
|
|
let o = {};
|
|
for (let [e, t] of this._metrics) o[e] = t.value;
|
|
if (this._fpsSamples.length > 0) {
|
|
let t = [...this._fpsSamples].sort((e, t) => e - t);
|
|
e = {
|
|
avg: t.reduce((e, t) => e + t, 0) / t.length,
|
|
min: t[0],
|
|
p5: _(t, 5),
|
|
};
|
|
}
|
|
return {
|
|
sessionId: this._sessionId,
|
|
sessionDurationMs: Math.round(t),
|
|
operations: n,
|
|
latestMetrics: o,
|
|
fps: e,
|
|
};
|
|
}
|
|
getRecentSamples(e, t = 20) {
|
|
return (this._samples.get(e) ?? []).slice(-t);
|
|
}
|
|
pauseFps() {
|
|
this._fpsPaused || ((this._fpsPaused = !0), this.stopFpsMonitor());
|
|
}
|
|
resumeFps() {
|
|
this._fpsPaused &&
|
|
((this._fpsPaused = !1), this._isActive && this.startFpsMonitor());
|
|
}
|
|
startFpsMonitor() {
|
|
if ("u" < typeof requestAnimationFrame) return;
|
|
(this._fpsLastTime = performance.now()), (this._fpsFrameCount = 0);
|
|
let e = () => {
|
|
if (!this._isActive || this._fpsPaused) return;
|
|
this._fpsFrameCount++;
|
|
let t = performance.now(),
|
|
n = t - this._fpsLastTime;
|
|
if (n >= 1e3) {
|
|
let e = (this._fpsFrameCount / n) * 1e3;
|
|
this._fpsSamples.push(e),
|
|
this._fpsSamples.length > 120 &&
|
|
this._fpsSamples.splice(0, this._fpsSamples.length - 120),
|
|
(this._fpsLastTime = t),
|
|
(this._fpsFrameCount = 0);
|
|
}
|
|
this._fpsAnimFrame = requestAnimationFrame(e);
|
|
};
|
|
this._fpsAnimFrame = requestAnimationFrame(e);
|
|
}
|
|
stopFpsMonitor() {
|
|
null !== this._fpsAnimFrame &&
|
|
(cancelAnimationFrame(this._fpsAnimFrame),
|
|
(this._fpsAnimFrame = null));
|
|
}
|
|
reset() {
|
|
this.endSession(),
|
|
this._samples.clear(),
|
|
this._metrics.clear(),
|
|
(this._fpsSamples = []);
|
|
}
|
|
}
|
|
function C() {
|
|
return M.getInstance();
|
|
}
|
|
e.s(["getCanvasPerformance", () => C], 763026);
|
|
let N = "pending-ops";
|
|
function P() {
|
|
return new Promise((e, t) => {
|
|
let n = indexedDB.open("liblibtv-sync", 1);
|
|
(n.onupgradeneeded = () => {
|
|
let e = n.result;
|
|
e.objectStoreNames.contains(N) ||
|
|
e.createObjectStore(N, { keyPath: "id", autoIncrement: !0 });
|
|
}),
|
|
(n.onsuccess = () => e(n.result)),
|
|
(n.onerror = () => t(n.error ?? Error("IndexedDB open failed")));
|
|
});
|
|
}
|
|
async function k(e, t) {
|
|
try {
|
|
let n = await P(),
|
|
o = n.transaction(N, "readwrite"),
|
|
i = o.objectStore(N),
|
|
r = { projectUuid: e, operation: t, createdAt: Date.now() };
|
|
i.add(r),
|
|
await new Promise((e, t) => {
|
|
(o.oncomplete = () => e()),
|
|
(o.onerror = () =>
|
|
t(o.error ?? Error("IndexedDB transaction failed")));
|
|
}),
|
|
n.close();
|
|
} catch (e) {
|
|
console.warn("[SyncStorage] 持久化操作失败:", e);
|
|
}
|
|
}
|
|
async function T(e) {
|
|
try {
|
|
let t = await P(),
|
|
n = t.transaction(N, "readonly").objectStore(N),
|
|
o = await new Promise((e, t) => {
|
|
let o = n.getAll();
|
|
(o.onsuccess = () => e(o.result)),
|
|
(o.onerror = () =>
|
|
t(o.error ?? Error("IndexedDB request failed")));
|
|
});
|
|
return (
|
|
t.close(),
|
|
o
|
|
.filter((t) => t.projectUuid === e)
|
|
.sort((e, t) => e.createdAt - t.createdAt)
|
|
.map((e) => e.operation)
|
|
);
|
|
} catch (e) {
|
|
return console.warn("[SyncStorage] 加载持久化操作失败:", e), [];
|
|
}
|
|
}
|
|
async function O(e) {
|
|
try {
|
|
let t = await P(),
|
|
n = t.transaction(N, "readwrite"),
|
|
o = n.objectStore(N),
|
|
i = await new Promise((e, t) => {
|
|
let n = o.getAll();
|
|
(n.onsuccess = () => e(n.result)),
|
|
(n.onerror = () =>
|
|
t(n.error ?? Error("IndexedDB request failed")));
|
|
}),
|
|
r = o.getAllKeys(),
|
|
a = await new Promise((e, t) => {
|
|
(r.onsuccess = () => e(r.result)),
|
|
(r.onerror = () =>
|
|
t(r.error ?? Error("IndexedDB request failed")));
|
|
});
|
|
for (let t = 0; t < i.length; t++)
|
|
i[t].projectUuid === e && o.delete(a[t]);
|
|
await new Promise((e, t) => {
|
|
(n.oncomplete = () => e()),
|
|
(n.onerror = () =>
|
|
t(n.error ?? Error("IndexedDB transaction failed")));
|
|
}),
|
|
t.close();
|
|
} catch (e) {
|
|
console.warn("[SyncStorage] 清除持久化操作失败:", e);
|
|
}
|
|
}
|
|
async function A() {
|
|
try {
|
|
let e = await P(),
|
|
t = e.transaction(N, "readwrite"),
|
|
n = t.objectStore(N),
|
|
o = Date.now(),
|
|
i = await new Promise((e, t) => {
|
|
let o = n.getAll();
|
|
(o.onsuccess = () => e(o.result)),
|
|
(o.onerror = () =>
|
|
t(o.error ?? Error("IndexedDB request failed")));
|
|
}),
|
|
r = n.getAllKeys(),
|
|
a = await new Promise((e, t) => {
|
|
(r.onsuccess = () => e(r.result)),
|
|
(r.onerror = () =>
|
|
t(r.error ?? Error("IndexedDB request failed")));
|
|
});
|
|
for (let e = 0; e < i.length; e++)
|
|
o - i[e].createdAt > 864e5 && n.delete(a[e]);
|
|
await new Promise((e, n) => {
|
|
(t.oncomplete = () => e()),
|
|
(t.onerror = () =>
|
|
n(t.error ?? Error("IndexedDB transaction failed")));
|
|
}),
|
|
e.close();
|
|
} catch (e) {
|
|
console.warn("[SyncStorage] 清理过期操作失败:", e);
|
|
}
|
|
}
|
|
function D(e, t) {
|
|
let n = {};
|
|
if (e.nodeCreate || t.nodeCreate) {
|
|
let o = new Map();
|
|
for (let n of [...(e.nodeCreate || []), ...(t.nodeCreate || [])])
|
|
o.set(n.id, n);
|
|
n.nodeCreate = Array.from(o.values());
|
|
}
|
|
if (e.nodeUpdate || t.nodeUpdate) {
|
|
let o = new Map();
|
|
for (let n of [...(e.nodeUpdate || []), ...(t.nodeUpdate || [])])
|
|
o.set(n.id, n);
|
|
n.nodeUpdate = Array.from(o.values());
|
|
}
|
|
if (
|
|
((e.nodeDelete || t.nodeDelete) &&
|
|
(n.nodeDelete = Array.from(
|
|
new Set([...(e.nodeDelete || []), ...(t.nodeDelete || [])]),
|
|
)),
|
|
e.edgeCreate || t.edgeCreate)
|
|
) {
|
|
let o = new Map();
|
|
for (let n of [...(e.edgeCreate || []), ...(t.edgeCreate || [])])
|
|
o.set(n.id, n);
|
|
n.edgeCreate = Array.from(o.values());
|
|
}
|
|
if (e.edgeUpdate || t.edgeUpdate) {
|
|
let o = new Map();
|
|
for (let n of [...(e.edgeUpdate || []), ...(t.edgeUpdate || [])])
|
|
o.set(n.id, n);
|
|
n.edgeUpdate = Array.from(o.values());
|
|
}
|
|
return (
|
|
(e.edgeDelete || t.edgeDelete) &&
|
|
(n.edgeDelete = Array.from(
|
|
new Set([...(e.edgeDelete || []), ...(t.edgeDelete || [])]),
|
|
)),
|
|
n
|
|
);
|
|
}
|
|
function L(e) {
|
|
return (
|
|
!e.nodeCreate?.length &&
|
|
!e.nodeUpdate?.length &&
|
|
!e.nodeDelete?.length &&
|
|
!e.edgeCreate?.length &&
|
|
!e.edgeUpdate?.length &&
|
|
!e.edgeDelete?.length
|
|
);
|
|
}
|
|
class j {
|
|
pendingOp = {};
|
|
mergeTimer = null;
|
|
isFlushing = !1;
|
|
hasQueuedAfterFlush = !1;
|
|
retryCount = 0;
|
|
_status = "saved";
|
|
statusListeners = new Set();
|
|
projectUuid = null;
|
|
convertNodeFn;
|
|
convertEdgeFn;
|
|
getStateFn;
|
|
isOffline = !1;
|
|
handleOnline = null;
|
|
handleOffline = null;
|
|
_paused = !1;
|
|
_sessionExpiredCallback = null;
|
|
_localVersion = 0;
|
|
_serverVersion = 0;
|
|
_conflictResolver = null;
|
|
lastFlushFailureMessage = null;
|
|
lastFlushFailureCode = null;
|
|
constructor(e, t, n) {
|
|
(this.convertNodeFn = e),
|
|
(this.convertEdgeFn = t),
|
|
(this.getStateFn = n),
|
|
(this.isOffline = !navigator.onLine),
|
|
(this.handleOnline = () => {
|
|
(this.isOffline = !1), this.replayPersistedOps();
|
|
}),
|
|
(this.handleOffline = () => {
|
|
this.isOffline = !0;
|
|
}),
|
|
window.addEventListener("online", this.handleOnline),
|
|
window.addEventListener("offline", this.handleOffline),
|
|
A();
|
|
}
|
|
setProjectId(e) {
|
|
(this.projectUuid = e), e && this.replayPersistedOps();
|
|
}
|
|
get status() {
|
|
return this._status;
|
|
}
|
|
getLastFlushFailureMessage() {
|
|
return this.lastFlushFailureMessage;
|
|
}
|
|
getLastFlushFailureCode() {
|
|
return this.lastFlushFailureCode;
|
|
}
|
|
clearLastFlushFailureMessage() {
|
|
(this.lastFlushFailureMessage = null),
|
|
(this.lastFlushFailureCode = null);
|
|
}
|
|
get localVersion() {
|
|
return this._localVersion;
|
|
}
|
|
get serverVersion() {
|
|
return this._serverVersion;
|
|
}
|
|
setServerVersion(e) {
|
|
(this._serverVersion = e), (this._localVersion = e);
|
|
}
|
|
onConflict(e) {
|
|
return (
|
|
(this._conflictResolver = e),
|
|
() => {
|
|
this._conflictResolver = null;
|
|
}
|
|
);
|
|
}
|
|
onSessionExpired(e) {
|
|
return (
|
|
(this._sessionExpiredCallback = e),
|
|
() => {
|
|
this._sessionExpiredCallback = null;
|
|
}
|
|
);
|
|
}
|
|
pause() {
|
|
(this._paused = !0),
|
|
this.mergeTimer &&
|
|
(clearTimeout(this.mergeTimer), (this.mergeTimer = null));
|
|
}
|
|
resume() {
|
|
(this._paused = !1),
|
|
L(this.pendingOp) ||
|
|
this.isFlushing ||
|
|
(this.setStatus("pending"),
|
|
(this.mergeTimer = setTimeout(() => {
|
|
(this.mergeTimer = null), this.flush();
|
|
}, 500)));
|
|
}
|
|
enqueue(e) {
|
|
if (!this.projectUuid || L(e)) return;
|
|
if (this._paused) {
|
|
let t = JSON.parse(JSON.stringify(e));
|
|
this.pendingOp = D(this.pendingOp, t);
|
|
return;
|
|
}
|
|
let t = JSON.parse(JSON.stringify(e));
|
|
if (
|
|
((this.pendingOp = D(this.pendingOp, t)),
|
|
this.setStatus("pending"),
|
|
this.isOffline)
|
|
)
|
|
return void k(this.projectUuid, t);
|
|
if (this.isFlushing) {
|
|
this.hasQueuedAfterFlush = !0;
|
|
return;
|
|
}
|
|
this.mergeTimer && clearTimeout(this.mergeTimer),
|
|
(this.mergeTimer = setTimeout(() => {
|
|
(this.mergeTimer = null), this.flush();
|
|
}, 500));
|
|
}
|
|
onStatusChange(e) {
|
|
return (
|
|
this.statusListeners.add(e),
|
|
() => {
|
|
this.statusListeners.delete(e);
|
|
}
|
|
);
|
|
}
|
|
retry() {
|
|
"error" === this._status &&
|
|
((this.retryCount = 0), this.setStatus("pending"), this.flush());
|
|
}
|
|
requestImmediateFlush() {
|
|
this.mergeTimer &&
|
|
(clearTimeout(this.mergeTimer), (this.mergeTimer = null)),
|
|
L(this.pendingOp) || this.isFlushing || this._paused || this.flush();
|
|
}
|
|
flushAndWait() {
|
|
return this._paused
|
|
? Promise.resolve({ ok: !1 })
|
|
: (this.mergeTimer &&
|
|
(clearTimeout(this.mergeTimer), (this.mergeTimer = null)),
|
|
L(this.pendingOp) && !this.isFlushing)
|
|
? Promise.resolve({ ok: !0 })
|
|
: (L(this.pendingOp) ||
|
|
this.isFlushing ||
|
|
this._paused ||
|
|
this.flush(),
|
|
new Promise((e) => {
|
|
if (!this.isFlushing && L(this.pendingOp))
|
|
return void e({ ok: "saved" === this._status });
|
|
let t = this.onStatusChange((n) => {
|
|
("saved" === n || "error" === n) &&
|
|
(t(), e({ ok: "saved" === n }));
|
|
});
|
|
}));
|
|
}
|
|
flushSync() {
|
|
if (
|
|
(this.mergeTimer &&
|
|
(clearTimeout(this.mergeTimer), (this.mergeTimer = null)),
|
|
!this._paused) &&
|
|
!(!this.projectUuid || L(this.pendingOp))
|
|
)
|
|
try {
|
|
let e = this.buildPayload();
|
|
if (((this.pendingOp = {}), e)) {
|
|
let t = (0, y.getActiveSession)(),
|
|
n = t
|
|
? { ...e, sessionId: t.sessionId, timestamp: t.timestamp }
|
|
: e,
|
|
o = JSON.stringify(n),
|
|
i = `${b.config.tv.apiHost}/api/canvas/nodes/batch`,
|
|
r = I.getUsertokenFromCookie?.() ?? "";
|
|
try {
|
|
fetch(i, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
...(r ? { token: r } : {}),
|
|
},
|
|
body: o,
|
|
keepalive: !0,
|
|
}).catch(() => {});
|
|
} catch {
|
|
let e = new Blob([o], { type: "application/json" });
|
|
navigator.sendBeacon(i, e);
|
|
}
|
|
}
|
|
} catch {}
|
|
}
|
|
async replayPersistedOps() {
|
|
if (this.projectUuid && !this.isOffline)
|
|
try {
|
|
let e = await T(this.projectUuid);
|
|
if (0 === e.length) return;
|
|
for (let t of e) this.pendingOp = D(this.pendingOp, t);
|
|
await O(this.projectUuid),
|
|
L(this.pendingOp) ||
|
|
this.isFlushing ||
|
|
(this.setStatus("pending"), this.flush());
|
|
} catch {}
|
|
}
|
|
setStatus(e) {
|
|
this._status !== e &&
|
|
((this._status = e),
|
|
this.statusListeners.forEach((t) => {
|
|
try {
|
|
t(e);
|
|
} catch {}
|
|
}));
|
|
}
|
|
buildPayload() {
|
|
if (!this.projectUuid || L(this.pendingOp)) return null;
|
|
let e = this.projectUuid,
|
|
t = (function (e) {
|
|
let t = { ...e };
|
|
if (t.nodeCreate?.length && t.nodeDelete?.length) {
|
|
let e = new Set(t.nodeDelete),
|
|
n = t.nodeCreate.filter((t) => !e.has(t.id)),
|
|
o = t.nodeCreate.filter((t) => e.has(t.id)).map((e) => e.id);
|
|
(t.nodeCreate = n.length ? n : void 0),
|
|
(t.nodeDelete = t.nodeDelete.filter((e) => !o.includes(e))),
|
|
t.nodeDelete.length || (t.nodeDelete = void 0);
|
|
}
|
|
if (t.nodeCreate?.length && t.nodeUpdate?.length) {
|
|
let e = new Map(t.nodeCreate.map((e) => [e.id, e])),
|
|
n = [];
|
|
for (let o of t.nodeUpdate) {
|
|
let t = e.get(o.id);
|
|
t && (Object.assign(t.data ?? {}, o.data ?? {}), n.push(o.id));
|
|
}
|
|
if (n.length) {
|
|
let e = new Set(n);
|
|
(t.nodeUpdate = t.nodeUpdate.filter((t) => !e.has(t.id))),
|
|
t.nodeUpdate.length || (t.nodeUpdate = void 0);
|
|
}
|
|
}
|
|
if (t.nodeUpdate?.length && t.nodeDelete?.length) {
|
|
let e = new Set(t.nodeDelete);
|
|
(t.nodeUpdate = t.nodeUpdate.filter((t) => !e.has(t.id))),
|
|
t.nodeUpdate.length || (t.nodeUpdate = void 0);
|
|
}
|
|
if (t.edgeCreate?.length && t.edgeDelete?.length) {
|
|
let e = new Set(t.edgeDelete),
|
|
n = t.edgeCreate.filter((t) => !e.has(t.id)),
|
|
o = t.edgeCreate.filter((t) => e.has(t.id)).map((e) => e.id);
|
|
(t.edgeCreate = n.length ? n : void 0),
|
|
(t.edgeDelete = t.edgeDelete.filter((e) => !o.includes(e))),
|
|
t.edgeDelete.length || (t.edgeDelete = void 0);
|
|
}
|
|
if (t.edgeCreate?.length && t.edgeUpdate?.length) {
|
|
let e = new Map(t.edgeCreate.map((e) => [e.id, e])),
|
|
n = [];
|
|
for (let o of t.edgeUpdate) {
|
|
let t = e.get(o.id);
|
|
t && (Object.assign(t, o), n.push(o.id));
|
|
}
|
|
if (n.length) {
|
|
let e = new Set(n);
|
|
(t.edgeUpdate = t.edgeUpdate.filter((t) => !e.has(t.id))),
|
|
t.edgeUpdate.length || (t.edgeUpdate = void 0);
|
|
}
|
|
}
|
|
if (t.edgeUpdate?.length && t.edgeDelete?.length) {
|
|
let e = new Set(t.edgeDelete);
|
|
(t.edgeUpdate = t.edgeUpdate.filter((t) => !e.has(t.id))),
|
|
t.edgeUpdate.length || (t.edgeUpdate = void 0);
|
|
}
|
|
return t;
|
|
})(this.pendingOp),
|
|
{ nodes: n, edges: o } = this.getStateFn(),
|
|
i = new Set(n.map((e) => e.id)),
|
|
r = t.nodeDelete ? new Set(t.nodeDelete) : new Set(),
|
|
a = {},
|
|
s = {};
|
|
return (t.nodeCreate?.length &&
|
|
(a.create = t.nodeCreate.map((t) => this.convertNodeFn(t, e, i, r))),
|
|
t.nodeUpdate?.length &&
|
|
(a.update = t.nodeUpdate.map((t) => this.convertNodeFn(t, e, i, r))),
|
|
t.nodeDelete?.length &&
|
|
(a.delete = t.nodeDelete.map((t) => {
|
|
let o = n.find((e) => e.id === t);
|
|
return o
|
|
? this.convertNodeFn(o, e, i, r)
|
|
: { nodeKey: t, projectUuid: e };
|
|
})),
|
|
t.edgeCreate?.length &&
|
|
(s.create = t.edgeCreate.map((t) => this.convertEdgeFn(t, e))),
|
|
t.edgeUpdate?.length &&
|
|
(s.update = t.edgeUpdate.map((t) => this.convertEdgeFn(t, e))),
|
|
t.edgeDelete?.length &&
|
|
(s.delete = t.edgeDelete.map((t) => {
|
|
let n = o.find((e) => e.id === t);
|
|
return n
|
|
? this.convertEdgeFn(n, e)
|
|
: { projectUuid: e, connectionId: t, source: "", target: "" };
|
|
})),
|
|
a.create || a.update || a.delete || s.create || s.update || s.delete)
|
|
? {
|
|
projectUuid: e,
|
|
nodes: a,
|
|
connections: s,
|
|
version: this._localVersion,
|
|
}
|
|
: null;
|
|
}
|
|
async flush() {
|
|
if (this.isFlushing || this._paused) return;
|
|
let e = this.buildPayload();
|
|
if (!e) return void this.setStatus("saved");
|
|
let t = { ...this.pendingOp };
|
|
(this.pendingOp = {}),
|
|
(this.isFlushing = !0),
|
|
(this.hasQueuedAfterFlush = !1),
|
|
this.setStatus("syncing");
|
|
let n = C().startMeasure("sync.flush");
|
|
try {
|
|
(this.lastFlushFailureMessage = null),
|
|
(this.lastFlushFailureCode = null),
|
|
await (0, y.nodesBatch)(e),
|
|
n({ success: !0 }),
|
|
this._localVersion++,
|
|
(this._serverVersion = this._localVersion),
|
|
(this.retryCount = 0),
|
|
(this.isFlushing = !1),
|
|
(this.hasQueuedAfterFlush = !1),
|
|
L(this.pendingOp)
|
|
? this.setStatus("saved")
|
|
: (this.mergeTimer = setTimeout(() => {
|
|
(this.mergeTimer = null), this.flush();
|
|
}, 500));
|
|
} catch (o) {
|
|
(this.isFlushing = !1), n({ success: !1 });
|
|
let e = (function (e) {
|
|
if (null == e) return;
|
|
if ("string" == typeof e) return e.trim() || void 0;
|
|
if ("object" != typeof e) return;
|
|
if ("string" == typeof e.message && e.message.trim())
|
|
return e.message.trim();
|
|
if ("string" == typeof e.msg && e.msg.trim()) return e.msg.trim();
|
|
let t = e.response;
|
|
if (t && "object" == typeof t) {
|
|
let e = t.data;
|
|
if (e && "object" == typeof e) {
|
|
let t = e.msg ?? e.message;
|
|
if ("string" == typeof t && t.trim()) return t.trim();
|
|
}
|
|
}
|
|
})(o);
|
|
if (
|
|
(e && (this.lastFlushFailureMessage = e),
|
|
(this.lastFlushFailureCode =
|
|
(function (e) {
|
|
if (null == e || "object" != typeof e) return;
|
|
if (void 0 !== e.code) return e.code;
|
|
let t = e.response;
|
|
if (t && "object" == typeof t) {
|
|
if (t.data && "object" == typeof t.data) {
|
|
let e = t.data.code;
|
|
if (void 0 !== e) return e;
|
|
}
|
|
if ("number" == typeof t.status) return t.status;
|
|
}
|
|
})(o) ?? null),
|
|
(0, y.isSessionExpiredError)(o))
|
|
) {
|
|
(this.pendingOp = D(t, this.pendingOp)),
|
|
this.setStatus("error"),
|
|
this.pause(),
|
|
this._sessionExpiredCallback?.();
|
|
return;
|
|
}
|
|
if (
|
|
((this.pendingOp = D(t, this.pendingOp)), this.isVersionConflict(o))
|
|
) {
|
|
if ((this.setStatus("conflict"), this._conflictResolver))
|
|
try {
|
|
let e = this.extractServerVersion(o);
|
|
await this._conflictResolver(e),
|
|
(this.retryCount = 0),
|
|
L(this.pendingOp)
|
|
? this.setStatus("saved")
|
|
: (this.setStatus("pending"), this.flush());
|
|
} catch {
|
|
this.setStatus("error");
|
|
}
|
|
else this.setStatus("error");
|
|
return;
|
|
}
|
|
if ((this.retryCount++, this.retryCount <= 3)) {
|
|
let e = 1e3 * Math.pow(2, this.retryCount - 1);
|
|
this.setStatus("pending"),
|
|
setTimeout(() => {
|
|
this.flush();
|
|
}, e);
|
|
} else
|
|
this.projectUuid &&
|
|
!L(this.pendingOp) &&
|
|
k(this.projectUuid, this.pendingOp),
|
|
this.setStatus("error");
|
|
}
|
|
}
|
|
isVersionConflict(e) {
|
|
if (e && "object" == typeof e) {
|
|
if (e.response && "object" == typeof e.response) {
|
|
let t = e.response;
|
|
if (409 === t.status) return !0;
|
|
if (t.data && "object" == typeof t.data) {
|
|
let e = t.data;
|
|
if ("VERSION_CONFLICT" === e.code || 409 === e.code) return !0;
|
|
}
|
|
}
|
|
if ("VERSION_CONFLICT" === e.code || 409 === e.status) return !0;
|
|
}
|
|
return !1;
|
|
}
|
|
extractServerVersion(e) {
|
|
if (
|
|
e &&
|
|
"object" == typeof e &&
|
|
e.response &&
|
|
"object" == typeof e.response
|
|
) {
|
|
let t = e.response;
|
|
if (t.data && "object" == typeof t.data) {
|
|
let e = t.data;
|
|
if ("number" == typeof e.version) return e.version;
|
|
if ("number" == typeof e.serverVersion) return e.serverVersion;
|
|
}
|
|
}
|
|
return this._serverVersion;
|
|
}
|
|
destroy() {
|
|
this.mergeTimer &&
|
|
(clearTimeout(this.mergeTimer), (this.mergeTimer = null)),
|
|
this.handleOnline &&
|
|
window.removeEventListener("online", this.handleOnline),
|
|
this.handleOffline &&
|
|
window.removeEventListener("offline", this.handleOffline),
|
|
this.statusListeners.clear(),
|
|
(this._conflictResolver = null),
|
|
(this._sessionExpiredCallback = null),
|
|
(this._paused = !1),
|
|
(this.isFlushing = !1),
|
|
(this.retryCount = 0),
|
|
(this.pendingOp = {}),
|
|
(this.lastFlushFailureMessage = null),
|
|
(this.lastFlushFailureCode = null);
|
|
}
|
|
}
|
|
let R = g.NODE_GAP / 2;
|
|
function z(e) {
|
|
return {
|
|
x: e.position.x,
|
|
y: e.position.y,
|
|
width: e.measured?.width ?? e.width ?? g.NODE_WIDTH,
|
|
height: e.measured?.height ?? e.height ?? g.NODE_HEIGHT_EMPTY,
|
|
};
|
|
}
|
|
function F(e, t, n) {
|
|
return (
|
|
e.x < t.x + t.width + n &&
|
|
e.x + e.width + n > t.x &&
|
|
e.y < t.y + t.height + n &&
|
|
e.y + e.height + n > t.y
|
|
);
|
|
}
|
|
function $(e, t, n, o) {
|
|
return "x" === o
|
|
? Math.min(
|
|
Math.abs(t.x + t.width + n - e.x),
|
|
Math.abs(e.x + e.width + n - t.x),
|
|
)
|
|
: Math.min(
|
|
Math.abs(t.y + t.height + n - e.y),
|
|
Math.abs(e.y + e.height + n - t.y),
|
|
);
|
|
}
|
|
function B(
|
|
e,
|
|
t = { width: g.NODE_WIDTH, height: g.NODE_HEIGHT_EMPTY },
|
|
n,
|
|
o = {},
|
|
) {
|
|
let {
|
|
preferAxis: i = "vertical",
|
|
margin: r = R,
|
|
maxIterations: a = 30,
|
|
excludeIds: s,
|
|
} = o,
|
|
l = n.filter((e) => !s?.has(e.id)).map((e) => z(e)),
|
|
{ x: d, y: u } = e;
|
|
for (let e = 0; e < a; e++) {
|
|
let e = { x: d, y: u, width: t.width, height: t.height },
|
|
n = 0;
|
|
for (let t of l)
|
|
F(e, t, r) &&
|
|
(n = Math.max(
|
|
n,
|
|
"vertical" === i
|
|
? $(e, t, r, "y")
|
|
: "horizontal" === i
|
|
? $(e, t, r, "x")
|
|
: Math.max($(e, t, r, "x"), $(e, t, r, "y")),
|
|
));
|
|
if (0 === n) break;
|
|
"vertical" === i
|
|
? (u += n)
|
|
: "horizontal" === i
|
|
? (d += n)
|
|
: ((d += n), (u += n));
|
|
}
|
|
return { x: d, y: u };
|
|
}
|
|
function H(
|
|
e,
|
|
t = { width: g.NODE_WIDTH, height: g.NODE_HEIGHT_EMPTY },
|
|
n,
|
|
o = {},
|
|
) {
|
|
let i = o.margin ?? R,
|
|
r = o.maxIterations ?? 30,
|
|
a = o.excludeIds,
|
|
s = n.filter((e) => !a?.has(e.id)).map((e) => z(e)),
|
|
l = e.x,
|
|
d = e.y;
|
|
for (let e = 0; e < r; e++) {
|
|
let e = { x: l, y: d, width: t.width, height: t.height },
|
|
n = d,
|
|
o = !1;
|
|
for (let t of s)
|
|
F(e, t, i) && ((o = !0), (n = Math.max(n, t.y + t.height + i)));
|
|
if (!o) break;
|
|
d = n;
|
|
}
|
|
return { x: l, y: d };
|
|
}
|
|
function V(e, t, n, o, i, r, a = g.NODE_GAP) {
|
|
let s = e.x + t + a,
|
|
l = e.y,
|
|
d = new Set(i.filter((e) => e.source === r).map((e) => e.target)),
|
|
u = o.filter((n) => !!d.has(n.id) && n.position.x >= e.x + t / 2);
|
|
return 0 === u.length
|
|
? { x: s, y: l }
|
|
: {
|
|
x: s,
|
|
y:
|
|
Math.max(
|
|
...u.map((e) => {
|
|
let t = e.measured?.height ?? e.height ?? g.NODE_HEIGHT_EMPTY;
|
|
return e.position.y + t;
|
|
}),
|
|
) + a,
|
|
};
|
|
}
|
|
function U(e, t, n = {}) {
|
|
let o = t.filter((e) => !n.excludeIds?.has(e.id)).map((e) => z(e)),
|
|
i = [];
|
|
for (let { position: t, size: r } of e) {
|
|
let e = B(
|
|
t,
|
|
r,
|
|
o.map((e, t) => ({
|
|
id: `__virtual_${t}`,
|
|
position: { x: e.x, y: e.y },
|
|
measured: { width: e.width, height: e.height },
|
|
})),
|
|
{ ...n, excludeIds: void 0 },
|
|
);
|
|
i.push(e), o.push({ x: e.x, y: e.y, width: r.width, height: r.height });
|
|
}
|
|
return i;
|
|
}
|
|
function Y(e) {
|
|
let t = e.measured?.width ?? e.width,
|
|
n = e.measured?.height ?? e.height;
|
|
if ("number" == typeof t && "number" == typeof n)
|
|
return { width: t, height: n };
|
|
let o = e.data,
|
|
i = o?.contentWidth,
|
|
r = o?.contentHeight;
|
|
if ("number" == typeof i && "number" == typeof r)
|
|
return { width: i, height: r };
|
|
let a = (0, g.extractRatioFromNodeParams)(o?.params),
|
|
s = (0, g.computeNodeDimensionsFromRatio)(a);
|
|
return a
|
|
? s
|
|
: {
|
|
width:
|
|
("number" == typeof t ? t : void 0) ?? s.width ?? g.NODE_WIDTH,
|
|
height:
|
|
("number" == typeof n ? n : void 0) ??
|
|
s.height ??
|
|
g.NODE_HEIGHT_EMPTY,
|
|
};
|
|
}
|
|
function W(e, t) {
|
|
let n = new Map(t.map((e) => [e.id, e])),
|
|
o = e.position.x,
|
|
i = e.position.y,
|
|
r = e.parentId;
|
|
for (; r; ) {
|
|
let e = n.get(r);
|
|
if (!e) break;
|
|
(o += e.position.x), (i += e.position.y), (r = e.parentId);
|
|
}
|
|
return { x: o, y: i };
|
|
}
|
|
function X(e) {
|
|
let t = e.data?.contentWidth,
|
|
n = "number" == typeof t ? t : void 0;
|
|
if ("number" == typeof n && n > 0) return n;
|
|
let o = "number" == typeof e.measured?.width ? e.measured.width : void 0,
|
|
i = "number" == typeof e.width ? e.width : void 0;
|
|
return o ?? i ?? g.NODE_WIDTH;
|
|
}
|
|
function K(
|
|
e,
|
|
t,
|
|
n = { width: g.NODE_WIDTH, height: g.NODE_HEIGHT_EMPTY },
|
|
o = 120,
|
|
) {
|
|
let i,
|
|
r = W(e, t),
|
|
a = X(e),
|
|
s = r.x + a + o,
|
|
l = g.NODE_GAP / 2,
|
|
d = t.map((e) => {
|
|
let n = W(e, t);
|
|
return {
|
|
x: n.x,
|
|
y: n.y,
|
|
width: X(e),
|
|
height: e.measured?.height ?? e.height ?? g.NODE_HEIGHT_EMPTY,
|
|
};
|
|
});
|
|
if (
|
|
((i = r.y),
|
|
!d.some(
|
|
(e) =>
|
|
s < e.x + e.width + l &&
|
|
s + n.width + l > e.x &&
|
|
i < e.y + e.height + l &&
|
|
i + n.height + l > e.y,
|
|
))
|
|
)
|
|
return { x: s, y: r.y };
|
|
let u = (e) => {
|
|
let t = d.filter(
|
|
(t) => e < t.x + t.width + l && e + n.width + l > t.x,
|
|
);
|
|
if (0 === t.length) return r.y;
|
|
let o = t
|
|
.map((e) => ({
|
|
top: e.y - n.height - l,
|
|
bottom: e.y + e.height + l,
|
|
}))
|
|
.sort((e, t) => e.top - t.top),
|
|
i = [];
|
|
for (let e of o)
|
|
i.length > 0 && e.top <= i[i.length - 1].bottom
|
|
? (i[i.length - 1].bottom = Math.max(
|
|
i[i.length - 1].bottom,
|
|
e.bottom,
|
|
))
|
|
: i.push({ top: e.top, bottom: e.bottom });
|
|
let a = r.y,
|
|
s = a,
|
|
u = 1 / 0,
|
|
c = (e) => {
|
|
let t = Math.abs(e - a);
|
|
t < u && ((u = t), (s = e));
|
|
};
|
|
c(Math.min(a, i[0].top));
|
|
for (let e = 0; e < i.length - 1; e++) {
|
|
let t = i[e].bottom,
|
|
n = i[e + 1].top;
|
|
n - t < 1 || c(Math.max(t, Math.min(a, n)));
|
|
}
|
|
return c(Math.max(a, i[i.length - 1].bottom)), s;
|
|
},
|
|
c = new Set();
|
|
for (let e of (c.add(s), d)) {
|
|
let t = e.x + e.width + l,
|
|
o = e.x - n.width - l;
|
|
t >= s && c.add(t), o >= s && c.add(o);
|
|
}
|
|
let p = s,
|
|
h = r.y,
|
|
f = 1 / 0;
|
|
for (let e of c) {
|
|
let t = u(e),
|
|
n = e - s,
|
|
o = t - r.y,
|
|
i = n * n + o * o;
|
|
i < f && ((f = i), (p = e), (h = t));
|
|
}
|
|
return { x: p, y: h };
|
|
}
|
|
e.s(
|
|
[
|
|
"CANVAS_RIGHT_EDGE_GAP",
|
|
0,
|
|
120,
|
|
"findClosestRightFlowPosition",
|
|
() => K,
|
|
"findRightSidePosition",
|
|
() => V,
|
|
"getAbsoluteNodePosition",
|
|
() => W,
|
|
"getNodeSizeForPlacement",
|
|
() => Y,
|
|
"resolveMultiNodePlacement",
|
|
() => U,
|
|
"resolveNodePlacement",
|
|
() => B,
|
|
"resolveNodePlacementDagBelowOccluders",
|
|
() => H,
|
|
],
|
|
44980,
|
|
);
|
|
class q {
|
|
bySource = new Map();
|
|
byTarget = new Map();
|
|
lastEdgesRef = null;
|
|
rebuild(e) {
|
|
if (e !== this.lastEdgesRef)
|
|
for (let t of ((this.lastEdgesRef = e),
|
|
this.bySource.clear(),
|
|
this.byTarget.clear(),
|
|
e)) {
|
|
let e = this.bySource.get(t.source);
|
|
e ? e.push(t) : this.bySource.set(t.source, [t]);
|
|
let n = this.byTarget.get(t.target);
|
|
n ? n.push(t) : this.byTarget.set(t.target, [t]);
|
|
}
|
|
}
|
|
getBySource(e) {
|
|
return this.bySource.get(e) ?? [];
|
|
}
|
|
getByTarget(e) {
|
|
return this.byTarget.get(e) ?? [];
|
|
}
|
|
getByNode(e) {
|
|
return [...this.getBySource(e), ...this.getByTarget(e)];
|
|
}
|
|
}
|
|
let Z = new q();
|
|
class G {
|
|
byId = new Map();
|
|
lastNodesRef = null;
|
|
rebuild(e) {
|
|
if (e !== this.lastNodesRef)
|
|
for (let t of ((this.lastNodesRef = e), this.byId.clear(), e))
|
|
this.byId.set(t.id, t);
|
|
}
|
|
get(e) {
|
|
return this.byId.get(e);
|
|
}
|
|
}
|
|
let Q = new G();
|
|
class J {
|
|
byNodeId = new Map();
|
|
byUrl = new Map();
|
|
byTaskId = new Map();
|
|
lastNodesRef = null;
|
|
rebuild(e) {
|
|
if (e !== this.lastNodesRef)
|
|
for (let t of ((this.lastNodesRef = e),
|
|
this.byNodeId.clear(),
|
|
this.byUrl.clear(),
|
|
this.byTaskId.clear(),
|
|
e)) {
|
|
let e = t.resourceMeta;
|
|
if (!e) continue;
|
|
this.byNodeId.set(t.id, e);
|
|
let n = Array.isArray(e.items) ? e.items : [],
|
|
o = t.data ?? void 0,
|
|
i = Array.isArray(o?.url) ? o.url : [];
|
|
for (let [e, o] of n.entries()) {
|
|
let n = i[e];
|
|
n && this.byUrl.set(n, { nodeId: t.id, item: o });
|
|
}
|
|
let r = o?.taskInfo,
|
|
a = r?.taskId ?? "";
|
|
if (a) {
|
|
let e = this.byTaskId.get(a) ?? [];
|
|
n.forEach((n) => e.push({ nodeId: t.id, item: n })),
|
|
this.byTaskId.set(a, e);
|
|
}
|
|
}
|
|
}
|
|
getByNodeId(e) {
|
|
return this.byNodeId.get(e);
|
|
}
|
|
getByUrl(e) {
|
|
return this.byUrl.get(e);
|
|
}
|
|
getByTaskId(e) {
|
|
return this.byTaskId.get(e) ?? [];
|
|
}
|
|
}
|
|
let ee = new J(),
|
|
et = "__temp_connection_node__";
|
|
function en(e) {
|
|
return e.id === et || "temp" === e.type || "temp" === e.data?.type;
|
|
}
|
|
function eo(e) {
|
|
return (
|
|
"__temp_connection_edge__" === e.id ||
|
|
e.source === et ||
|
|
e.target === et
|
|
);
|
|
}
|
|
function ei(e) {
|
|
return (t) => (Z.rebuild(t.edges), Z.getByTarget(e).length > 0);
|
|
}
|
|
function er(e) {
|
|
return (t) => (Z.rebuild(t.edges), Z.getBySource(e).length > 0);
|
|
}
|
|
function ea(e) {
|
|
return (t) => {
|
|
Q.rebuild(t.nodes);
|
|
let n = Q.get(e);
|
|
return n?.data ?? null;
|
|
};
|
|
}
|
|
function es(e, t) {
|
|
return (n) =>
|
|
!!e &&
|
|
(Z.rebuild(n.edges),
|
|
!!Z.getBySource(e).some((e) => e.target === t) ||
|
|
Z.getBySource(t).some((t) => t.target === e));
|
|
}
|
|
function el(e, t) {
|
|
return (n) => {
|
|
if (0 === e.length) return !1;
|
|
for (let o of e) if (es(o, t)(n)) return !0;
|
|
return !1;
|
|
};
|
|
}
|
|
function ed(e) {
|
|
return (t) => (ee.rebuild(t.nodes), ee.getByNodeId(e) ?? null);
|
|
}
|
|
function eu(e) {
|
|
return (t) => (ee.rebuild(t.nodes), ee.getByUrl(e) ?? null);
|
|
}
|
|
function ec(e) {
|
|
return (t) => (ee.rebuild(t.nodes), ee.getByTaskId(e));
|
|
}
|
|
function ep(e = "id") {
|
|
return "u" > typeof crypto && "function" == typeof crypto.randomUUID
|
|
? `${e}-${crypto.randomUUID()}`
|
|
: `${e}-${Date.now()}-${Math.random().toString(36).slice(2, 11)}-${Math.random().toString(36).slice(2, 11)}`;
|
|
}
|
|
function eh(e) {
|
|
if (null == e || "object" != typeof e) return e;
|
|
if (e instanceof Date) return new Date(e.getTime());
|
|
if (Array.isArray(e)) return e.map((e) => eh(e));
|
|
try {
|
|
return JSON.parse(JSON.stringify(e));
|
|
} catch {
|
|
let t = {};
|
|
for (let n in e)
|
|
Object.prototype.hasOwnProperty.call(e, n) && (t[n] = eh(e[n]));
|
|
return t;
|
|
}
|
|
}
|
|
function eg(e) {
|
|
let t = { ...e },
|
|
n = "string" == typeof t.name ? t.name : void 0,
|
|
o = "string" == typeof t.label ? t.label : void 0;
|
|
return !n && o && (t.name = o), "label" in t && delete t.label, t;
|
|
}
|
|
function ef(e) {
|
|
return e
|
|
? {
|
|
[y.NodeType.TEXT]: m.NodeType.TEXT,
|
|
[y.NodeType.IMAGE]: m.NodeType.IMAGE,
|
|
[y.NodeType.VIDEO]: m.NodeType.VIDEO,
|
|
[y.NodeType.AUDIO]: m.NodeType.AUDIO,
|
|
[y.NodeType.GROUP]: m.NodeType.GROUP,
|
|
[y.NodeType.SCRIPT]: m.NodeType.SCRIPT,
|
|
[y.NodeType.VIDEO_CLIP]: m.NodeType.VIDEO_CLIP,
|
|
[y.NodeType.SPACE_SCENE_720]: m.NodeType.SPACE_SCENE_720,
|
|
}[e]
|
|
: m.NodeType.TEXT;
|
|
}
|
|
function em(e) {
|
|
return e.startsWith("blob:") || e.startsWith("data:");
|
|
}
|
|
function ey(e, t, n, o) {
|
|
var i;
|
|
let r = eg(e.data ?? {}),
|
|
a =
|
|
"number" == typeof (i = r?.type)
|
|
? i
|
|
: {
|
|
[m.NodeType.TEXT]: y.NodeType.TEXT,
|
|
[m.NodeType.IMAGE]: y.NodeType.IMAGE,
|
|
[m.NodeType.VIDEO]: y.NodeType.VIDEO,
|
|
[m.NodeType.AUDIO]: y.NodeType.AUDIO,
|
|
[m.NodeType.GROUP]: y.NodeType.GROUP,
|
|
[m.NodeType.VIDEO_CLIP]: y.NodeType.VIDEO_CLIP,
|
|
[m.NodeType.SPACE_SCENE_720]: y.NodeType.SPACE_SCENE_720,
|
|
}[i] || y.NodeType.TEXT,
|
|
s = e.parentId || null;
|
|
s &&
|
|
(o && o.has(s)
|
|
? (console.warn(
|
|
`[convertNode] 清除 parentKey: node=${e.id} parent=${s}(父节点正在被删除)`,
|
|
),
|
|
(s = null))
|
|
: n &&
|
|
!n.has(s) &&
|
|
(console.warn(
|
|
`[convertNode] 清除 parentKey: node=${e.id} parent=${s}(父节点不存在于画布中)`,
|
|
),
|
|
(s = null)));
|
|
let l = s ?? "";
|
|
if (l && "" !== l) {
|
|
let t = n?.has(l),
|
|
i = o?.has(l);
|
|
console.debug(
|
|
`[convertNode] 发送非空 parentKey: node=${e.id} parentKey=${l}`,
|
|
`| parentExists=${t} parentDeleting=${i}`,
|
|
`| nodeType=${a} existingCount=${n?.size ?? "?"} deletedCount=${o?.size ?? "?"}`,
|
|
);
|
|
}
|
|
let d = (function (e) {
|
|
let t = { ...e };
|
|
if (Array.isArray(t.url)) {
|
|
let e = t.url.map((e) => ("string" == typeof e && em(e) ? "" : e));
|
|
e.some((e) => "" === e) && (t.url = e.filter((e) => "" !== e));
|
|
}
|
|
return (
|
|
"string" == typeof t.poster && em(t.poster) && (t.poster = ""),
|
|
"string" == typeof t.panoramaUrl &&
|
|
em(t.panoramaUrl) &&
|
|
(t.panoramaUrl = ""),
|
|
t
|
|
);
|
|
})(r),
|
|
u = e.resourceMeta;
|
|
return (
|
|
u && (d._resourceMeta = u),
|
|
{
|
|
nodeKey: e.id,
|
|
projectUuid: t,
|
|
type: a,
|
|
name: d?.name,
|
|
position: {
|
|
positionX: String(e.position.x),
|
|
positionY: String(e.position.y),
|
|
},
|
|
measured: e.measured
|
|
? {
|
|
width: String(e.measured.width),
|
|
height: String(e.measured.height),
|
|
}
|
|
: void 0,
|
|
parentKey: l,
|
|
data: JSON.stringify(d),
|
|
workflowUuid: d?.workflowUuid || void 0,
|
|
}
|
|
);
|
|
}
|
|
function ev(e, t) {
|
|
return {
|
|
projectUuid: t,
|
|
connectionId: e.id,
|
|
source: e.source,
|
|
target: e.target,
|
|
sourceHandle: e.sourceHandle || void 0,
|
|
targetHandle: e.targetHandle || void 0,
|
|
type: e.type || "default",
|
|
deletable: !1 !== e.deletable,
|
|
selectable: !1 !== e.selectable,
|
|
};
|
|
}
|
|
function ew(e, t, n) {}
|
|
let ex = { zoom: 1, position: { x: 0, y: 0 } };
|
|
function eS(e, t, n) {
|
|
let o = e.find((e) => e.id === n);
|
|
if (!o?.data) return;
|
|
let i = o.data;
|
|
if (!i.params) return;
|
|
let r = t.filter((e) => {
|
|
if (e.target !== n) return !1;
|
|
let t = e.data;
|
|
return !t?.portraitVirtual && !t?.assetVirtual;
|
|
}),
|
|
a = new Map(e.map((e) => [e.id, e])),
|
|
s = r.map((e) => a.get(e.source)).filter((e) => !!e),
|
|
l = (0, p.collectIncomingNodeData)(s),
|
|
d = i.scriptRowHiddenUuid;
|
|
if (d) {
|
|
let t = (0, p.findHiddenLineImageNode)(d, e, n);
|
|
t && l.imageList.push(t);
|
|
}
|
|
let u = i.params,
|
|
c = (0, f.normalizeMediaList)(u.imageList).filter(
|
|
(e) => e.nodeId && (0, f.isAssetProtocol)(e.nodeId),
|
|
),
|
|
g = [...l.imageList, ...c],
|
|
m = (0, f.normalizeMediaList)(u.videoList).filter(
|
|
(e) => e.nodeId && (0, f.isAssetProtocol)(e.nodeId),
|
|
),
|
|
y = [...l.videoList, ...m],
|
|
v = (0, f.normalizeMediaList)(u.audioList).filter(
|
|
(e) => e.nodeId && (0, f.isAssetProtocol)(e.nodeId),
|
|
),
|
|
w = [...l.audioList, ...v],
|
|
x = u.imageListOrder,
|
|
S = u.videoListOrder,
|
|
b = u.audioListOrder,
|
|
I = (0, h.applyMediaListOrder)(g, x),
|
|
_ = (0, h.applyMediaListOrder)(y, S),
|
|
E = (0, h.applyMediaListOrder)(w, b),
|
|
M = (function (e, t, n) {
|
|
if (!e) return e;
|
|
let o = t.imageList ?? [],
|
|
i = t.videoList ?? [],
|
|
r = t.audioList ?? [],
|
|
a = t.mixedListOrder ?? void 0,
|
|
s = (0, h.buildMixedList)(o, i, r, a),
|
|
l = (0, h.buildMixedList)(n.imageList, n.videoList, n.audioList, a),
|
|
d = {
|
|
Image: new Map(n.imageList.map((e, t) => [e.nodeId, t + 1])),
|
|
Video: new Map(n.videoList.map((e, t) => [e.nodeId, t + 1])),
|
|
Audio: new Map(n.audioList.map((e, t) => [e.nodeId, t + 1])),
|
|
Mixed: new Map(l.map((e, t) => [e.nodeId, t + 1])),
|
|
Portrait: new Map(n.imageList.map((e, t) => [e.nodeId, t + 1])),
|
|
},
|
|
u = { Image: o, Video: i, Audio: r, Mixed: s, Portrait: o };
|
|
return e
|
|
.replace(
|
|
/(\n[ \t]*)?\{\{(Image|Video|Audio|Mixed|Portrait)\s+(\d+)\}\}[ \t]*/g,
|
|
(e, t, n, o) => {
|
|
let i = parseInt(o, 10) - 1,
|
|
r = u[n],
|
|
a = r?.[i];
|
|
if (!a?.nodeId) return "";
|
|
let s = d[n]?.get(a.nodeId);
|
|
return void 0 === s ? "" : `${t ?? ""}{{${n} ${s}}} `;
|
|
},
|
|
)
|
|
.replace(/ {2,}/g, " ")
|
|
.trim();
|
|
})("string" == typeof u.prompt ? u.prompt : "", u, {
|
|
imageList: I,
|
|
videoList: _,
|
|
audioList: E,
|
|
});
|
|
o.data = {
|
|
...o.data,
|
|
params: {
|
|
...u,
|
|
prompt: M,
|
|
textList: l.textList,
|
|
imageList: I,
|
|
videoList: _,
|
|
audioList: E,
|
|
},
|
|
};
|
|
}
|
|
function eb(e, t) {
|
|
let n = t.data?.type;
|
|
if (n && !t.data?.name) {
|
|
let o = (0, m.resolveCanvasNodeTypeLabelZh)(n) ?? n,
|
|
i = e.filter((e) => e.data?.type === n).length;
|
|
t.data.name = `${o}${i + 1}`;
|
|
}
|
|
}
|
|
let eI = () => {
|
|
let e = null,
|
|
t = new Set();
|
|
function n() {
|
|
if ((e && (clearTimeout(e), (e = null)), 0 === t.size || !o)) return;
|
|
let n = o.getState().nodes.filter((e) => t.has(e.id));
|
|
t.clear(), n.length > 0 && i.enqueue({ nodeUpdate: n });
|
|
}
|
|
let o = null,
|
|
i = new j(ey, ev, () => {
|
|
if (!o) return { nodes: [], edges: [] };
|
|
let e = o.getState();
|
|
return { nodes: eh(e.nodes), edges: eh(e.edges) };
|
|
}),
|
|
r = new Set(),
|
|
a = (e) => {
|
|
for (let t of r)
|
|
try {
|
|
t(e);
|
|
} catch (e) {
|
|
console.error("[CanvasStore] onSendToChat listener error", e);
|
|
}
|
|
},
|
|
s = (0, c.createStore)()(
|
|
(0, d.devtools)(
|
|
(0, u.immer)(
|
|
(s, d) => (
|
|
i.onStatusChange((e) => {
|
|
s((t) => {
|
|
(t.syncStatus = e), (t.syncVersion = i.localVersion);
|
|
});
|
|
}),
|
|
{
|
|
nodes: [],
|
|
edges: [],
|
|
viewport: { ...ex },
|
|
projectId: null,
|
|
projectName: "未命名",
|
|
projectTemplateUuid: null,
|
|
isLoadingProject: !1,
|
|
isRestoring: !1,
|
|
syncStatus: "saved",
|
|
isMarkMode: !1,
|
|
markSourceNodeId: null,
|
|
isFocusMode: !1,
|
|
focusSourceNodeId: null,
|
|
focusInteractingNodeId: null,
|
|
focusCancelKey: 0,
|
|
isCanvasCaptureMode: !1,
|
|
canvasCaptureCallback: null,
|
|
syncVersion: 0,
|
|
connectingSourceId: null,
|
|
connectingSourceIds: null,
|
|
multiSelectHoveredNodeId: null,
|
|
multiSelectCursorPos: null,
|
|
connectingInvalidTargetId: null,
|
|
editingNodeId: null,
|
|
editingImageTool: null,
|
|
panoramaPreviewNodeIds: new Set(),
|
|
editingClipNodeId: null,
|
|
editingClipPreviewExpanded: !0,
|
|
editingClipNodeFocusNonce: 0,
|
|
deletingNodeIds: new Set(),
|
|
canvasLocked: !1,
|
|
isReadonly: !1,
|
|
snapToGrid: (() => {
|
|
try {
|
|
let e = localStorage.getItem("canvas:snapToGrid");
|
|
return null === e || "true" === e;
|
|
} catch {
|
|
return !0;
|
|
}
|
|
})(),
|
|
isBoxSelecting: !1,
|
|
isInteracting: !1,
|
|
pendingFocusNodeIds: null,
|
|
imageEditorPrimaryToolbarTool: "upscale",
|
|
applyNodeChanges: (e) => {
|
|
s((t) => {
|
|
t.nodes = (0, l.applyNodeChanges)(e, t.nodes);
|
|
});
|
|
let t = d();
|
|
S(e, t.editingClipNodeId, t.editingClipPreviewExpanded);
|
|
},
|
|
applyEdgeChanges: (e) => {
|
|
s((t) => {
|
|
t.edges = (0, l.applyEdgeChanges)(e, t.edges);
|
|
});
|
|
},
|
|
addNode: (e, t) => {
|
|
if (
|
|
(e.data &&
|
|
"object" == typeof e.data &&
|
|
(e.data = eg(e.data)),
|
|
eb(d().nodes, e),
|
|
!t?.skipOverlapResolution && !e.parentId)
|
|
) {
|
|
let n = {
|
|
width: e.measured?.width ?? e.width ?? g.NODE_WIDTH,
|
|
height:
|
|
e.measured?.height ?? e.height ?? g.NODE_HEIGHT_EMPTY,
|
|
};
|
|
e.position = B(e.position, n, d().nodes, t);
|
|
}
|
|
return (
|
|
s((t) => {
|
|
e.parentId ? t.nodes.push(e) : t.nodes.unshift(e),
|
|
ew(
|
|
{
|
|
nodes: t.nodes,
|
|
edges: t.edges,
|
|
viewport: t.viewport,
|
|
},
|
|
"添加节点",
|
|
t.projectId,
|
|
),
|
|
en(e) || i.enqueue({ nodeCreate: [e] });
|
|
}),
|
|
e.id
|
|
);
|
|
},
|
|
addNodes: (e, t) => {
|
|
let n = d().nodes;
|
|
if (
|
|
(e.forEach((e) => {
|
|
e.data &&
|
|
"object" == typeof e.data &&
|
|
(e.data = eg(e.data)),
|
|
eb(n, e);
|
|
}),
|
|
!t?.skipOverlapResolution)
|
|
) {
|
|
let o = e.filter((e) => !e.parentId);
|
|
if (o.length > 0) {
|
|
let e = U(
|
|
o.map((e) => ({
|
|
position: e.position,
|
|
size: {
|
|
width:
|
|
e.measured?.width ?? e.width ?? g.NODE_WIDTH,
|
|
height:
|
|
e.measured?.height ??
|
|
e.height ??
|
|
g.NODE_HEIGHT_EMPTY,
|
|
},
|
|
})),
|
|
n,
|
|
t,
|
|
);
|
|
o.forEach((t, n) => {
|
|
t.position = e[n];
|
|
});
|
|
}
|
|
}
|
|
return (
|
|
s((n) => {
|
|
let o = e.filter((e) => !e.parentId),
|
|
r = e.filter((e) => e.parentId);
|
|
if (
|
|
(n.nodes.unshift(...o),
|
|
n.nodes.push(...r),
|
|
ew(
|
|
{
|
|
nodes: n.nodes,
|
|
edges: n.edges,
|
|
viewport: n.viewport,
|
|
},
|
|
"批量添加节点",
|
|
n.projectId,
|
|
),
|
|
!t?.skipSync)
|
|
) {
|
|
let t = e.filter((e) => !en(e));
|
|
t.length > 0 && i.enqueue({ nodeCreate: t });
|
|
}
|
|
}),
|
|
e.map((e) => e.id)
|
|
);
|
|
},
|
|
clearPendingFocusNodeIds: () => {
|
|
s((e) => {
|
|
e.pendingFocusNodeIds = null;
|
|
});
|
|
},
|
|
requestFitViewToNodeIds: (e) => {
|
|
let t = e.filter(
|
|
(e) => "string" == typeof e && e.trim().length > 0,
|
|
);
|
|
0 !== t.length &&
|
|
s((e) => {
|
|
e.pendingFocusNodeIds = t;
|
|
});
|
|
},
|
|
deleteNode: (e) => {
|
|
s((t) => {
|
|
t.deletingNodeIds = new Set([e]);
|
|
let n = t.edges.filter(
|
|
(t) => t.source === e || t.target === e,
|
|
),
|
|
o = n.map((e) => e.id),
|
|
r = new Set(
|
|
n.filter((t) => t.source === e).map((e) => e.target),
|
|
),
|
|
a = t.nodes.find((t) => t.id === e);
|
|
for (let n of ((t.nodes = t.nodes.filter(
|
|
(t) => t.id !== e,
|
|
)),
|
|
(t.edges = t.edges.filter(
|
|
(t) => t.source !== e && t.target !== e,
|
|
)),
|
|
t.editingClipNodeId === e && (t.editingClipNodeId = null),
|
|
t.panoramaPreviewNodeIds.delete(e),
|
|
t.nodes))
|
|
n.parentId === e &&
|
|
(a &&
|
|
(n.position = {
|
|
x: a.position.x + n.position.x,
|
|
y: a.position.y + n.position.y,
|
|
}),
|
|
(n.parentId = void 0),
|
|
(n.extent = void 0));
|
|
for (let e of r) {
|
|
eS(t.nodes, t.edges, e);
|
|
let n = t.nodes.find((t) => t.id === e);
|
|
n?.data?.isStale &&
|
|
(n.data = { ...n.data, isStale: !1 });
|
|
}
|
|
ew(
|
|
{
|
|
nodes: t.nodes,
|
|
edges: t.edges,
|
|
viewport: t.viewport,
|
|
},
|
|
"删除节点",
|
|
t.projectId,
|
|
),
|
|
i.enqueue({
|
|
nodeDelete: [e],
|
|
edgeDelete: o.length > 0 ? o : void 0,
|
|
});
|
|
}),
|
|
queueMicrotask(() => {
|
|
s((e) => {
|
|
e.deletingNodeIds = new Set();
|
|
});
|
|
});
|
|
},
|
|
deleteNodes: (e, t) => {
|
|
s((n) => {
|
|
n.deletingNodeIds = new Set(e);
|
|
let o = new Set(e),
|
|
r = n.edges.filter(
|
|
(e) => o.has(e.source) || o.has(e.target),
|
|
),
|
|
a = r.map((e) => e.id),
|
|
s = new Set(
|
|
r
|
|
.filter((e) => o.has(e.source) && !o.has(e.target))
|
|
.map((e) => e.target),
|
|
),
|
|
l = new Map(
|
|
n.nodes
|
|
.filter((e) => o.has(e.id))
|
|
.map((e) => [e.id, e]),
|
|
);
|
|
for (let e of ((n.nodes = n.nodes.filter(
|
|
(e) => !o.has(e.id),
|
|
)),
|
|
(n.edges = n.edges.filter(
|
|
(e) => !o.has(e.source) && !o.has(e.target),
|
|
)),
|
|
n.editingClipNodeId &&
|
|
o.has(n.editingClipNodeId) &&
|
|
(n.editingClipNodeId = null),
|
|
o))
|
|
n.panoramaPreviewNodeIds.delete(e);
|
|
for (let e of n.nodes)
|
|
if (e.parentId && o.has(e.parentId)) {
|
|
let t = l.get(e.parentId);
|
|
t &&
|
|
(e.position = {
|
|
x: t.position.x + e.position.x,
|
|
y: t.position.y + e.position.y,
|
|
}),
|
|
(e.parentId = void 0),
|
|
(e.extent = void 0);
|
|
}
|
|
for (let e of s) {
|
|
eS(n.nodes, n.edges, e);
|
|
let t = n.nodes.find((t) => t.id === e);
|
|
t?.data?.isStale &&
|
|
(t.data = { ...t.data, isStale: !1 });
|
|
}
|
|
ew(
|
|
{
|
|
nodes: n.nodes,
|
|
edges: n.edges,
|
|
viewport: n.viewport,
|
|
},
|
|
"批量删除节点",
|
|
n.projectId,
|
|
),
|
|
t?.skipSync ||
|
|
i.enqueue({
|
|
nodeDelete: e,
|
|
edgeDelete: a.length > 0 ? a : void 0,
|
|
});
|
|
}),
|
|
queueMicrotask(() => {
|
|
s((e) => {
|
|
e.deletingNodeIds = new Set();
|
|
});
|
|
});
|
|
},
|
|
updateNode: (e, t) => {
|
|
s((n) => {
|
|
let o = n.nodes.find((t) => t.id === e);
|
|
if (o) {
|
|
if (t.data && "object" == typeof t.data) {
|
|
o.data = eg({ ...(o.data ?? {}), ...t.data });
|
|
let { data: e, ...n } = t;
|
|
Object.assign(o, n);
|
|
} else Object.assign(o, t);
|
|
"parentId" in t &&
|
|
n.nodes.sort((e, t) =>
|
|
!e.parentId && t.parentId
|
|
? -1
|
|
: e.parentId && !t.parentId
|
|
? 1
|
|
: 0,
|
|
),
|
|
ew(
|
|
{
|
|
nodes: n.nodes,
|
|
edges: n.edges,
|
|
viewport: n.viewport,
|
|
},
|
|
"更新节点",
|
|
n.projectId,
|
|
),
|
|
i.enqueue({ nodeUpdate: [o] });
|
|
}
|
|
});
|
|
},
|
|
updateNodeData: (n, o, r) => {
|
|
let { resourceMeta: a, ...l } = o ?? {},
|
|
u = eg(l);
|
|
s((e) => {
|
|
let t = e.nodes.find((e) => e.id === n);
|
|
if (t) {
|
|
let n = u.taskInfo;
|
|
if (n?.loading === !0 && n.taskId) {
|
|
let e = t.data ?? {},
|
|
o = e.taskInfo;
|
|
if (o?.taskId && o.taskId !== n.taskId && !o.loading)
|
|
u.prevTaskInfo = e.taskInfo;
|
|
else if (o?.loading) {
|
|
let t = e.prevTaskInfo;
|
|
t && (u.prevTaskInfo = t);
|
|
}
|
|
}
|
|
(t.data = eg({ ...(t.data ?? {}), ...u })),
|
|
void 0 !== a && (t.resourceMeta = a),
|
|
ew(
|
|
{
|
|
nodes: e.nodes,
|
|
edges: e.edges,
|
|
viewport: e.viewport,
|
|
},
|
|
"更新节点数据",
|
|
e.projectId,
|
|
);
|
|
}
|
|
}),
|
|
r?.skipSync ||
|
|
(t.add(n),
|
|
e && clearTimeout(e),
|
|
(e = setTimeout(() => {
|
|
let n = d().nodes.filter((e) => t.has(e.id));
|
|
t.clear(),
|
|
(e = null),
|
|
n.length > 0 && i.enqueue({ nodeUpdate: n });
|
|
}, 300)));
|
|
},
|
|
batchUpdateNodeData: (n) => {
|
|
let o = new Set();
|
|
if (
|
|
(s((e) => {
|
|
for (let { nodeId: t, data: i, skipSync: r } of n) {
|
|
let { resourceMeta: n, ...a } = i ?? {},
|
|
s = eg(a),
|
|
l = e.nodes.find((e) => e.id === t);
|
|
if (!l) continue;
|
|
let d = s.taskInfo;
|
|
if (d?.loading === !0 && d.taskId) {
|
|
let e = l.data ?? {},
|
|
t = e.taskInfo;
|
|
if (
|
|
t?.taskId &&
|
|
t.taskId !== d.taskId &&
|
|
!t.loading
|
|
)
|
|
s.prevTaskInfo = e.taskInfo;
|
|
else if (t?.loading) {
|
|
let t = e.prevTaskInfo;
|
|
t && (s.prevTaskInfo = t);
|
|
}
|
|
}
|
|
(l.data = eg({ ...(l.data ?? {}), ...s })),
|
|
void 0 !== n && (l.resourceMeta = n),
|
|
r || o.add(t);
|
|
}
|
|
ew(
|
|
{
|
|
nodes: e.nodes,
|
|
edges: e.edges,
|
|
viewport: e.viewport,
|
|
},
|
|
"批量更新节点数据",
|
|
e.projectId,
|
|
);
|
|
}),
|
|
o.size > 0)
|
|
) {
|
|
for (let e of o) t.add(e);
|
|
e && clearTimeout(e),
|
|
(e = setTimeout(() => {
|
|
let n = d().nodes.filter((e) => t.has(e.id));
|
|
t.clear(),
|
|
(e = null),
|
|
n.length > 0 && i.enqueue({ nodeUpdate: n });
|
|
}, 300));
|
|
}
|
|
},
|
|
updateNodes: (e, t) => {
|
|
s((n) => {
|
|
let o = [],
|
|
r = !1;
|
|
e.forEach(({ id: e, updates: t }) => {
|
|
let i = n.nodes.find((t) => t.id === e);
|
|
i &&
|
|
("parentId" in t && (r = !0),
|
|
Object.assign(i, t),
|
|
o.push(i));
|
|
}),
|
|
r &&
|
|
n.nodes.sort((e, t) =>
|
|
!e.parentId && t.parentId
|
|
? -1
|
|
: e.parentId && !t.parentId
|
|
? 1
|
|
: 0,
|
|
),
|
|
ew(
|
|
{
|
|
nodes: n.nodes,
|
|
edges: n.edges,
|
|
viewport: n.viewport,
|
|
},
|
|
"批量更新节点",
|
|
n.projectId,
|
|
),
|
|
!t?.skipSync &&
|
|
o.length > 0 &&
|
|
i.enqueue({ nodeUpdate: o });
|
|
});
|
|
},
|
|
getNode: (e) => d().nodes.find((t) => t.id === e),
|
|
getNodes: () => d().nodes,
|
|
setNodes: (n) => {
|
|
e && (clearTimeout(e), (e = null)),
|
|
t.clear(),
|
|
s((e) => {
|
|
let t = new Set(e.nodes.map((e) => e.id)),
|
|
o = [],
|
|
r = [];
|
|
n.forEach((e) => {
|
|
t.has(e.id) ? r.push(e) : o.push(e);
|
|
});
|
|
let a = new Set(n.map((e) => e.id)),
|
|
s = e.nodes
|
|
.filter((e) => !a.has(e.id))
|
|
.map((e) => e.id),
|
|
l = new Set(s),
|
|
d = n.map((e) => {
|
|
let t =
|
|
e.data && "object" == typeof e.data
|
|
? eg(e.data)
|
|
: e.data;
|
|
return e.parentId &&
|
|
(l.has(e.parentId) || !a.has(e.parentId))
|
|
? {
|
|
...e,
|
|
data: t,
|
|
parentId: void 0,
|
|
extent: void 0,
|
|
}
|
|
: { ...e, data: t };
|
|
}),
|
|
u = r.map((e) =>
|
|
e.parentId &&
|
|
(l.has(e.parentId) || !a.has(e.parentId))
|
|
? { ...e, parentId: void 0, extent: void 0 }
|
|
: e,
|
|
);
|
|
d.sort((e, t) =>
|
|
!e.parentId && t.parentId
|
|
? -1
|
|
: e.parentId && !t.parentId
|
|
? 1
|
|
: 0,
|
|
),
|
|
(e.nodes = d),
|
|
ew(
|
|
{
|
|
nodes: e.nodes,
|
|
edges: e.edges,
|
|
viewport: e.viewport,
|
|
},
|
|
"设置节点",
|
|
e.projectId,
|
|
),
|
|
e.isLoadingProject ||
|
|
e.isRestoring ||
|
|
i.enqueue({
|
|
nodeCreate: o.length > 0 ? o : void 0,
|
|
nodeUpdate: u.length > 0 ? u : void 0,
|
|
nodeDelete: s.length > 0 ? s : void 0,
|
|
});
|
|
});
|
|
},
|
|
addEdge: (e) => {
|
|
let t = { ...e, id: e.id || ep("edge") };
|
|
return (
|
|
s((e) => {
|
|
e.edges.push(t),
|
|
t.target && eS(e.nodes, e.edges, t.target),
|
|
ew(
|
|
{
|
|
nodes: e.nodes,
|
|
edges: e.edges,
|
|
viewport: e.viewport,
|
|
},
|
|
"添加边",
|
|
e.projectId,
|
|
),
|
|
eo(t) || i.enqueue({ edgeCreate: [t] });
|
|
}),
|
|
t.id
|
|
);
|
|
},
|
|
addEdges: (e, t) => {
|
|
let n = e.map((e) => ({ ...e, id: e.id || ep("edge") }));
|
|
return 0 === n.length
|
|
? []
|
|
: (s((e) => {
|
|
for (let t of n) e.edges.push(t);
|
|
for (let t of new Set(n.map((e) => e.target)))
|
|
eS(e.nodes, e.edges, t);
|
|
if (
|
|
(ew(
|
|
{
|
|
nodes: e.nodes,
|
|
edges: e.edges,
|
|
viewport: e.viewport,
|
|
},
|
|
"批量添加边",
|
|
e.projectId,
|
|
),
|
|
!t?.skipSync)
|
|
) {
|
|
let e = n.filter((e) => !eo(e));
|
|
e.length > 0 && i.enqueue({ edgeCreate: e });
|
|
}
|
|
}),
|
|
n.map((e) => e.id));
|
|
},
|
|
deleteEdge: (e) => {
|
|
s((t) => {
|
|
let n = t.edges.find((t) => t.id === e);
|
|
(t.edges = t.edges.filter((t) => t.id !== e)),
|
|
n && eS(t.nodes, t.edges, n.target),
|
|
ew(
|
|
{
|
|
nodes: t.nodes,
|
|
edges: t.edges,
|
|
viewport: t.viewport,
|
|
},
|
|
"删除边",
|
|
t.projectId,
|
|
),
|
|
i.enqueue({ edgeDelete: [e] });
|
|
});
|
|
},
|
|
deleteEdges: (e, t) => {
|
|
s((n) => {
|
|
let o = new Set(e),
|
|
r = new Set(
|
|
n.edges
|
|
.filter((e) => o.has(e.id))
|
|
.map((e) => e.target),
|
|
);
|
|
for (let e of ((n.edges = n.edges.filter(
|
|
(e) => !o.has(e.id),
|
|
)),
|
|
r))
|
|
eS(n.nodes, n.edges, e);
|
|
ew(
|
|
{
|
|
nodes: n.nodes,
|
|
edges: n.edges,
|
|
viewport: n.viewport,
|
|
},
|
|
"批量删除边",
|
|
n.projectId,
|
|
),
|
|
t?.skipSync || i.enqueue({ edgeDelete: e });
|
|
});
|
|
},
|
|
updateEdge: (e, t) => {
|
|
s((n) => {
|
|
let o = n.edges.find((t) => t.id === e);
|
|
o &&
|
|
(Object.assign(o, t),
|
|
ew(
|
|
{
|
|
nodes: n.nodes,
|
|
edges: n.edges,
|
|
viewport: n.viewport,
|
|
},
|
|
"更新边",
|
|
n.projectId,
|
|
),
|
|
i.enqueue({ edgeUpdate: [o] }));
|
|
});
|
|
},
|
|
getEdge: (e) => d().edges.find((t) => t.id === e),
|
|
getEdges: () => d().edges,
|
|
getNodeEdges: (e) => {
|
|
let t = d().edges;
|
|
return Z.rebuild(t), Z.getByNode(e);
|
|
},
|
|
setEdges: (e) => {
|
|
s((t) => {
|
|
let n = new Set(t.edges.map((e) => e.id)),
|
|
o = [],
|
|
r = [];
|
|
e.forEach((e) => {
|
|
n.has(e.id) ? r.push(e) : o.push(e);
|
|
});
|
|
let a = new Set(e.map((e) => e.id)),
|
|
s = t.edges
|
|
.filter((e) => !a.has(e.id))
|
|
.map((e) => e.id);
|
|
(t.edges = e),
|
|
ew(
|
|
{
|
|
nodes: t.nodes,
|
|
edges: t.edges,
|
|
viewport: t.viewport,
|
|
},
|
|
"设置边",
|
|
t.projectId,
|
|
),
|
|
t.isLoadingProject ||
|
|
t.isRestoring ||
|
|
i.enqueue({
|
|
edgeCreate: o.length > 0 ? o : void 0,
|
|
edgeUpdate: r.length > 0 ? r : void 0,
|
|
edgeDelete: s.length > 0 ? s : void 0,
|
|
});
|
|
});
|
|
},
|
|
updateEdges: (e, t) => {
|
|
0 !== e.length &&
|
|
s((n) => {
|
|
let o = [],
|
|
r = new Set();
|
|
for (let t of (e.forEach(({ id: e, updates: t }) => {
|
|
let i = n.edges.find((t) => t.id === e);
|
|
if (!i) return;
|
|
let a = i.target;
|
|
Object.assign(i, t),
|
|
r.add(i.target),
|
|
a !== i.target && r.add(a),
|
|
o.push(i);
|
|
}),
|
|
r))
|
|
eS(n.nodes, n.edges, t);
|
|
if (
|
|
(ew(
|
|
{
|
|
nodes: n.nodes,
|
|
edges: n.edges,
|
|
viewport: n.viewport,
|
|
},
|
|
"批量更新边",
|
|
n.projectId,
|
|
),
|
|
!t?.skipSync && o.length > 0)
|
|
) {
|
|
let e = o.filter((e) => !eo(e));
|
|
e.length > 0 && i.enqueue({ edgeUpdate: e });
|
|
}
|
|
});
|
|
},
|
|
getIncomingNodes: (e) => {
|
|
let t = d();
|
|
Z.rebuild(t.edges);
|
|
let n = Z.getByTarget(e),
|
|
o = new Map(t.nodes.map((e) => [e.id, e]));
|
|
return n
|
|
.filter((e) => {
|
|
let t = e.data;
|
|
return !t?.portraitVirtual && !t?.assetVirtual;
|
|
})
|
|
.map((e) => o.get(e.source))
|
|
.filter((e) => !!e);
|
|
},
|
|
getOutgoingNodes: (e) => {
|
|
let t = d();
|
|
Z.rebuild(t.edges);
|
|
let n = new Set(Z.getBySource(e).map((e) => e.target));
|
|
return t.nodes.filter((e) => n.has(e.id));
|
|
},
|
|
markDownstreamStale: (e) => {
|
|
let t = [];
|
|
if (
|
|
(s((n) => {
|
|
for (let o of (Z.rebuild(n.edges), Z.getBySource(e))) {
|
|
let e = n.nodes.find((e) => e.id === o.target);
|
|
if (e) {
|
|
let n = e.data.taskInfo;
|
|
if (!n?.loading) {
|
|
let n = e.data.staleVersion || 0;
|
|
(e.data = {
|
|
...e.data,
|
|
isStale: !0,
|
|
staleVersion: n + 1,
|
|
}),
|
|
t.push(e.id);
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
t.length > 0)
|
|
) {
|
|
let e = d().nodes.filter((e) => t.includes(e.id));
|
|
e.length > 0 && i.enqueue({ nodeUpdate: e });
|
|
}
|
|
},
|
|
setZoom: (e) => {
|
|
s((t) => {
|
|
(t.viewport.zoom = e),
|
|
ew(
|
|
{
|
|
nodes: t.nodes,
|
|
edges: t.edges,
|
|
viewport: t.viewport,
|
|
},
|
|
"设置缩放",
|
|
t.projectId,
|
|
);
|
|
});
|
|
},
|
|
setViewport: (e) => {
|
|
s((t) => {
|
|
void 0 !== e.zoom && (t.viewport.zoom = e.zoom),
|
|
e.position &&
|
|
(t.viewport.position = {
|
|
...t.viewport.position,
|
|
...e.position,
|
|
}),
|
|
ew(
|
|
{
|
|
nodes: t.nodes,
|
|
edges: t.edges,
|
|
viewport: t.viewport,
|
|
},
|
|
"设置视图",
|
|
t.projectId,
|
|
);
|
|
});
|
|
},
|
|
getViewport: () => d().viewport,
|
|
getState: () => eh(d()),
|
|
setState: (e) => {
|
|
s((t) => {
|
|
void 0 !== e.nodes && (t.nodes = e.nodes),
|
|
void 0 !== e.edges && (t.edges = e.edges),
|
|
void 0 !== e.viewport &&
|
|
(t.viewport = { ...e.viewport }),
|
|
ew(
|
|
{
|
|
nodes: t.nodes,
|
|
edges: t.edges,
|
|
viewport: t.viewport,
|
|
},
|
|
"设置状态",
|
|
t.projectId,
|
|
);
|
|
});
|
|
},
|
|
reset: () => {
|
|
s((e) => {
|
|
(e.nodes = []),
|
|
(e.edges = []),
|
|
(e.viewport = { ...ex }),
|
|
(e.projectTemplateUuid = null),
|
|
(e.isMarkMode = !1),
|
|
(e.markSourceNodeId = null),
|
|
(e.isFocusMode = !1),
|
|
(e.focusSourceNodeId = null),
|
|
(e.focusInteractingNodeId = null),
|
|
(e.focusCancelKey = 0),
|
|
(e.isReadonly = !1),
|
|
(e.editingNodeId = null),
|
|
(e.panoramaPreviewNodeIds = new Set()),
|
|
(e.editingClipNodeId = null),
|
|
(e.editingClipPreviewExpanded = !0),
|
|
(e.editingClipNodeFocusNonce = 0),
|
|
(e.canvasLocked = !1);
|
|
try {
|
|
let t = localStorage.getItem("canvas:snapToGrid");
|
|
e.snapToGrid = null === t || "true" === t;
|
|
} catch {
|
|
e.snapToGrid = !0;
|
|
}
|
|
(e.isBoxSelecting = !1),
|
|
(e.connectingSourceId = null),
|
|
(e.connectingSourceIds = null),
|
|
(e.multiSelectHoveredNodeId = null),
|
|
(e.multiSelectCursorPos = null),
|
|
(e.connectingInvalidTargetId = null),
|
|
(e.imageEditorPrimaryToolbarTool = "upscale"),
|
|
ew(
|
|
{
|
|
nodes: e.nodes,
|
|
edges: e.edges,
|
|
viewport: e.viewport,
|
|
},
|
|
"重置画布",
|
|
e.projectId,
|
|
);
|
|
});
|
|
},
|
|
clear: () => {
|
|
s((e) => {
|
|
(e.nodes = []),
|
|
(e.edges = []),
|
|
ew(
|
|
{
|
|
nodes: e.nodes,
|
|
edges: e.edges,
|
|
viewport: e.viewport,
|
|
},
|
|
"清空画布",
|
|
e.projectId,
|
|
);
|
|
});
|
|
},
|
|
export: () => d().getState(),
|
|
import: (e) => {
|
|
d().setState(e);
|
|
},
|
|
setProjectId: (e) => {
|
|
d().projectId !== e &&
|
|
(i.setProjectId(e),
|
|
s((t) => {
|
|
(t.projectId = e), (t.projectTemplateUuid = null);
|
|
}));
|
|
},
|
|
setProjectName: (e) => {
|
|
s((t) => {
|
|
t.projectName = e;
|
|
});
|
|
},
|
|
setProjectTemplateUuid: (e) => {
|
|
s((t) => {
|
|
t.projectTemplateUuid = e;
|
|
});
|
|
},
|
|
setLoadingProject: (e) => {
|
|
s((t) => {
|
|
t.isLoadingProject = e;
|
|
});
|
|
},
|
|
setRestoring: (e) => {
|
|
s((t) => {
|
|
t.isRestoring = e;
|
|
});
|
|
},
|
|
setMarkMode: (e, t) => {
|
|
s((n) => {
|
|
(n.isMarkMode = e),
|
|
(n.markSourceNodeId = e ? (t ?? null) : null),
|
|
e &&
|
|
((n.isFocusMode = !1),
|
|
(n.focusSourceNodeId = null),
|
|
(n.isCanvasCaptureMode = !1),
|
|
(n.canvasCaptureCallback = null));
|
|
});
|
|
},
|
|
setFocusMode: (e, t) => {
|
|
s((n) => {
|
|
(n.isFocusMode = e),
|
|
(n.focusSourceNodeId = e ? (t ?? null) : null),
|
|
e || (n.focusInteractingNodeId = null),
|
|
e &&
|
|
((n.isMarkMode = !1),
|
|
(n.markSourceNodeId = null),
|
|
(n.isCanvasCaptureMode = !1),
|
|
(n.canvasCaptureCallback = null));
|
|
});
|
|
},
|
|
setCanvasCaptureMode: (e, t) => {
|
|
s((n) => {
|
|
(n.isCanvasCaptureMode = e),
|
|
(n.canvasCaptureCallback = e ? (t ?? null) : null),
|
|
e &&
|
|
((n.isMarkMode = !1),
|
|
(n.markSourceNodeId = null),
|
|
(n.isFocusMode = !1),
|
|
(n.focusSourceNodeId = null),
|
|
(n.focusInteractingNodeId = null));
|
|
});
|
|
},
|
|
setFocusInteractingNode: (e) => {
|
|
s((t) => {
|
|
t.focusInteractingNodeId = e;
|
|
});
|
|
},
|
|
cancelFocusPendingRegion: () => {
|
|
s((e) => {
|
|
e.focusCancelKey += 1;
|
|
});
|
|
},
|
|
setConnectingSourceId: (e) => {
|
|
s((t) => {
|
|
(t.connectingSourceId = e),
|
|
(t.connectingSourceIds = null),
|
|
null === e && (t.connectingInvalidTargetId = null);
|
|
});
|
|
},
|
|
setConnectingSourceIds: (e) => {
|
|
s((t) => {
|
|
(t.connectingSourceIds = e),
|
|
e?.length && (t.connectingSourceId = null),
|
|
e?.length ||
|
|
((t.multiSelectHoveredNodeId = null),
|
|
(t.multiSelectCursorPos = null));
|
|
});
|
|
},
|
|
setMultiSelectHoveredNodeId: (e) => {
|
|
s((t) => {
|
|
t.multiSelectHoveredNodeId = e;
|
|
});
|
|
},
|
|
setMultiSelectCursorPos: (e) => {
|
|
s((t) => {
|
|
t.multiSelectCursorPos = e;
|
|
});
|
|
},
|
|
setConnectingInvalidTargetId: (e) => {
|
|
s((t) => {
|
|
t.connectingInvalidTargetId = e;
|
|
});
|
|
},
|
|
retrySyncQueue: () => {
|
|
i.retry();
|
|
},
|
|
flushSyncQueue: () => {
|
|
n(), i.flushSync();
|
|
},
|
|
requestImmediateFlush: () => {
|
|
n(), i.requestImmediateFlush();
|
|
},
|
|
waitForSyncSaved: (e = 6e4, t) => (
|
|
i.clearLastFlushFailureMessage(),
|
|
new Promise((r) => {
|
|
let a = !1,
|
|
s = null,
|
|
l = null,
|
|
d = (e) => {
|
|
a || ((a = !0), s && clearTimeout(s), l?.(), r(e));
|
|
};
|
|
if (
|
|
((l = i.onStatusChange((e) => {
|
|
if ("saved" === e) d({ ok: !0 });
|
|
else if ("error" === e) {
|
|
let e = i.getLastFlushFailureMessage()?.trim(),
|
|
t = i.getLastFlushFailureCode() ?? void 0;
|
|
d({
|
|
ok: !1,
|
|
...(e ? { msg: e } : {}),
|
|
...(void 0 !== t ? { code: t } : {}),
|
|
});
|
|
}
|
|
})),
|
|
n(),
|
|
t?.includeFullNodeEdgeSnapshot && o)
|
|
) {
|
|
let e = o.getState();
|
|
if (e.projectId) {
|
|
let t = e.nodes.filter((e) => !en(e)),
|
|
n = e.edges.filter((e) => !eo(e));
|
|
(t.length > 0 || n.length > 0) &&
|
|
i.enqueue({
|
|
...(t.length > 0 ? { nodeUpdate: eh(t) } : {}),
|
|
...(n.length > 0 ? { edgeUpdate: eh(n) } : {}),
|
|
});
|
|
}
|
|
}
|
|
i.requestImmediateFlush(),
|
|
queueMicrotask(() => {
|
|
"saved" === i.status && d({ ok: !0 });
|
|
}),
|
|
Number.isFinite(e) &&
|
|
e > 0 &&
|
|
(s = setTimeout(
|
|
() =>
|
|
d({
|
|
ok: !1,
|
|
code: "WAIT_TIMEOUT",
|
|
msg: "保存超时",
|
|
}),
|
|
e,
|
|
));
|
|
})
|
|
),
|
|
saveFullSnapshotAsUpdate: async () => {
|
|
if (!o) return { ok: !1, msg: "保存失败" };
|
|
let e = o.getState().projectId;
|
|
if (!e)
|
|
return {
|
|
ok: !1,
|
|
msg: "项目未加载",
|
|
code: "PROJECT_ID_MISSING",
|
|
};
|
|
if (
|
|
(n(),
|
|
i.clearLastFlushFailureMessage(),
|
|
!(await i.flushAndWait()).ok)
|
|
)
|
|
return {
|
|
ok: !1,
|
|
code: "INCREMENTAL_FLUSH_FAILED",
|
|
msg: "增量同步失败,手动保存已中止,请重试",
|
|
};
|
|
await Promise.resolve();
|
|
let t = o.getState(),
|
|
r = t.nodes.filter((e) => !en(e)),
|
|
a = t.edges.filter((e) => !eo(e));
|
|
if (0 === r.length && 0 === a.length) return { ok: !0 };
|
|
let s = new Set(r.map((e) => e.id)),
|
|
l = r.map((t) => ey(t, e, s, new Set())),
|
|
d = a.map((t) => ev(t, e));
|
|
try {
|
|
let t = {
|
|
projectUuid: e,
|
|
nodes: { update: l },
|
|
connections: { update: d },
|
|
version: i.localVersion,
|
|
};
|
|
return (
|
|
await (0, y.nodesBatch)(t),
|
|
i.setServerVersion(i.localVersion + 1),
|
|
{ ok: !0 }
|
|
);
|
|
} catch (n) {
|
|
let e = n.code ?? n.response?.data?.code,
|
|
t =
|
|
n.response?.data?.msg ??
|
|
n.response?.data?.message ??
|
|
n.message;
|
|
return {
|
|
ok: !1,
|
|
...(void 0 !== e ? { code: e } : {}),
|
|
...("string" == typeof t && t.trim()
|
|
? { msg: t.trim() }
|
|
: {}),
|
|
};
|
|
}
|
|
},
|
|
enqueueSyncOp: (e) => {
|
|
i.enqueue(e);
|
|
},
|
|
pauseSyncQueue: () => {
|
|
i.pause();
|
|
},
|
|
resumeSyncQueue: () => {
|
|
i.resume();
|
|
},
|
|
onSyncSessionExpired: (e) => i.onSessionExpired(e),
|
|
sendToChat: (e) => {
|
|
if ("batch" === e.type) {
|
|
let e = d()
|
|
.nodes.filter((e) => e.selected && !en(e))
|
|
.map((e) => e.id);
|
|
if (0 === e.length) return;
|
|
a({ type: "batch", nodeIds: e });
|
|
return;
|
|
}
|
|
"single" === e.type && a(e);
|
|
},
|
|
onSendToChat: (e) => (
|
|
r.add(e),
|
|
() => {
|
|
r.delete(e);
|
|
}
|
|
),
|
|
setSyncServerVersion: (e) => {
|
|
i.setServerVersion(e),
|
|
s((t) => {
|
|
t.syncVersion = e;
|
|
});
|
|
},
|
|
setEditingNodeId: (e) => {
|
|
s((t) => {
|
|
(t.editingNodeId = e), e || (t.editingImageTool = null);
|
|
});
|
|
},
|
|
setPanoramaPreviewNodeId: (e) => {
|
|
s((t) => {
|
|
null === e
|
|
? (t.panoramaPreviewNodeIds = new Set())
|
|
: t.panoramaPreviewNodeIds.add(e);
|
|
});
|
|
},
|
|
removePanoramaPreviewNodeId: (e) => {
|
|
s((t) => {
|
|
t.panoramaPreviewNodeIds.delete(e);
|
|
});
|
|
},
|
|
setEditingImageTool: (e) => {
|
|
s((t) => {
|
|
t.editingImageTool = e;
|
|
});
|
|
},
|
|
setImageEditorPrimaryToolbarTool: (e) => {
|
|
s((t) => {
|
|
t.imageEditorPrimaryToolbarTool = e;
|
|
});
|
|
},
|
|
setEditingClipNodeId: (e) => {
|
|
s((t) => {
|
|
(t.editingClipNodeId = e),
|
|
null === e && (t.editingClipPreviewExpanded = !0);
|
|
});
|
|
},
|
|
setEditingClipPreviewExpanded: (e) => {
|
|
s((t) => {
|
|
t.editingClipPreviewExpanded = e;
|
|
});
|
|
},
|
|
requestEditingClipNodeFocus: () => {
|
|
s((e) => {
|
|
e.editingClipNodeId && (e.editingClipNodeFocusNonce += 1);
|
|
});
|
|
},
|
|
setCanvasLocked: (e) => {
|
|
s((t) => {
|
|
t.canvasLocked = e;
|
|
});
|
|
},
|
|
setSnapToGrid: (e) => {
|
|
s((t) => {
|
|
t.snapToGrid = e;
|
|
});
|
|
try {
|
|
localStorage.setItem("canvas:snapToGrid", String(e));
|
|
} catch {}
|
|
},
|
|
setReadonly: (e) => {
|
|
s((t) => {
|
|
t.isReadonly = e;
|
|
});
|
|
},
|
|
setBoxSelecting: (e) => {
|
|
s((t) => {
|
|
t.isBoxSelecting = e;
|
|
});
|
|
},
|
|
setInteracting: (e) => {
|
|
s((t) => {
|
|
t.isInteracting = e;
|
|
});
|
|
},
|
|
}
|
|
),
|
|
),
|
|
{ name: "CanvasStore" },
|
|
),
|
|
);
|
|
return (o = s), s;
|
|
};
|
|
e.s(
|
|
[
|
|
"convertBackendNodeTypeToFrontend",
|
|
() => ef,
|
|
"convertEdgeToConnection",
|
|
() => ev,
|
|
"convertNodeToCanvasNode",
|
|
() => ey,
|
|
"createCanvasStore",
|
|
0,
|
|
eI,
|
|
"selectHasIncomingEdge",
|
|
() => ei,
|
|
"selectHasOutgoingEdge",
|
|
() => er,
|
|
"selectIsAnyConnected",
|
|
() => el,
|
|
"selectIsConnected",
|
|
() => es,
|
|
"selectNodeData",
|
|
() => ea,
|
|
"selectNodeResourceMeta",
|
|
() => ed,
|
|
"selectResourceMetaByTaskId",
|
|
() => ec,
|
|
"selectResourceMetaByUrl",
|
|
() => eu,
|
|
],
|
|
929286,
|
|
);
|
|
let e_ = { text: null, image: null, video: null, audio: null },
|
|
eE = {
|
|
enhanceVideo: "video",
|
|
enhanceImage: "image",
|
|
scriptImage: "image",
|
|
scriptText: "text",
|
|
storyboardVideo: "video",
|
|
},
|
|
eM = {
|
|
text: null,
|
|
image: null,
|
|
video: null,
|
|
audio: null,
|
|
enhanceVideo: null,
|
|
enhanceImage: null,
|
|
scriptImage: null,
|
|
scriptText: null,
|
|
storyboardVideo: null,
|
|
};
|
|
var eC = e.i(546372),
|
|
eN = e.i(505e3),
|
|
eP = e.i(677588),
|
|
ek = e.i(135623);
|
|
let eT = { page: 1, pageSize: 20 };
|
|
var eO = e.i(627164);
|
|
function eA(e) {
|
|
e.uuid &&
|
|
(0, ek.setCookieLongTerm)(eN.USER_UUID_COOKIE_KEY, e.uuid, {
|
|
secure: !0,
|
|
sameSite: "none",
|
|
}),
|
|
(0, eO.setUserinfoToLocalStorage)(e);
|
|
}
|
|
let eD = (0, o.createContext)(null);
|
|
function eL({
|
|
children: e,
|
|
initialUser: i,
|
|
initialLang: r,
|
|
initialAreaCode: l,
|
|
}) {
|
|
let p = (0, o.useRef)(null);
|
|
return (
|
|
p.current ||
|
|
(p.current = {
|
|
langStore: (0, c.createStore)()(
|
|
(0, d.devtools)(
|
|
(0, u.immer)((e) => ({
|
|
lang: r || "zh",
|
|
setLang: (t) => {
|
|
let n;
|
|
e((e) => {
|
|
e.lang = t;
|
|
}),
|
|
(0, eP.reportLog)({
|
|
e: "user_language",
|
|
var: { lang: t },
|
|
tp: "log_acceptor_front_aws_lovart",
|
|
}),
|
|
(0, ek.setCookieLongTerm)(eN.LOCALE_COOKIE_KEY, t);
|
|
let o = window.location.pathname,
|
|
i = o.split("/").filter(Boolean);
|
|
if (
|
|
i.length > 0 &&
|
|
((n = i[0]), eC.i18n.locales.includes(n))
|
|
) {
|
|
if (t === eC.i18n.defaultLocale) {
|
|
let e = "/" + i.slice(1).join("/");
|
|
window.location.href = e || "/";
|
|
return;
|
|
}
|
|
let e = "/" + t + "/" + i.slice(1).join("/");
|
|
window.location.href = e;
|
|
return;
|
|
}
|
|
if (t !== eC.i18n.defaultLocale) {
|
|
window.location.href = "/" + t + o;
|
|
return;
|
|
}
|
|
window.location.reload();
|
|
},
|
|
})),
|
|
{ name: "LangStore" },
|
|
),
|
|
),
|
|
areaStore: (0, s.createAreaStore)(),
|
|
globalStore: (0, c.createStore)()(
|
|
(0, d.devtools)(
|
|
(0, u.immer)((e, t) => ({
|
|
schema: e_,
|
|
support: eM,
|
|
defaultModel: { video: "", image: "", audio: "", text: "" },
|
|
cameraControl: null,
|
|
slashImage: null,
|
|
setSlashImage: (t) =>
|
|
e((e) => {
|
|
e.slashImage = t;
|
|
}),
|
|
getModelSchema: (e) => {
|
|
let n = t();
|
|
for (let t of ["text", "image", "video", "audio"]) {
|
|
let o = n.schema[t];
|
|
if (o && o[e]) return o[e];
|
|
}
|
|
return null;
|
|
},
|
|
getModel(e, n) {
|
|
let o = t(),
|
|
i = eE[e] ?? e,
|
|
r = o.schema[i];
|
|
if (null == r) return null;
|
|
let a = r[n];
|
|
return null != a ? a : null;
|
|
},
|
|
setInitData: (t) =>
|
|
e((e) => {
|
|
if (void 0 !== t.modelSchema) {
|
|
let n = t.modelSchema,
|
|
o = n?.default;
|
|
Object.assign(e, {
|
|
schema: {
|
|
text: n?.textModels ?? null,
|
|
image: n?.imageModels ?? null,
|
|
video: n?.videoModels ?? null,
|
|
audio: n?.audioModels ?? null,
|
|
},
|
|
defaultModel: o
|
|
? {
|
|
text: o.text ?? "",
|
|
image: o.image ?? "",
|
|
video: o.video ?? "",
|
|
audio: o.audio ?? "",
|
|
}
|
|
: { text: "", image: "", video: "", audio: "" },
|
|
});
|
|
}
|
|
if (void 0 !== t.supportModels) {
|
|
let n = t.supportModels;
|
|
e.support = {
|
|
text: n?.text ?? null,
|
|
image: n?.image ?? null,
|
|
video: n?.video ?? null,
|
|
audio: n?.audio ?? null,
|
|
enhanceVideo: n?.enhanceVideo ?? null,
|
|
enhanceImage: n?.enhanceImage ?? null,
|
|
scriptImage: n?.scriptImage ?? null,
|
|
scriptText: n?.scriptText ?? null,
|
|
storyboardVideo: n?.storyboardVideo ?? null,
|
|
};
|
|
}
|
|
void 0 !== t.cameraControl &&
|
|
(e.cameraControl = t.cameraControl ?? null);
|
|
}),
|
|
setVoiceList: (t) => {
|
|
e((e) => {
|
|
e.voiceList = t;
|
|
});
|
|
},
|
|
voiceList: null,
|
|
cascadeColumn: 0,
|
|
setCascadeColumn: (t) =>
|
|
e((e) => {
|
|
e.cascadeColumn = t;
|
|
}),
|
|
})),
|
|
{ name: "GlobalStore" },
|
|
),
|
|
),
|
|
canvasStore: eI(),
|
|
projectStore: (0, c.createStore)()(
|
|
(0, d.devtools)(
|
|
(0, u.immer)((e) => ({
|
|
projectList: [],
|
|
total: 0,
|
|
isLoadingList: !1,
|
|
setProjectList: (t, n) => {
|
|
e((e) => {
|
|
(e.projectList = t), (e.total = n);
|
|
});
|
|
},
|
|
setLoadingList: (t) => {
|
|
e((e) => {
|
|
e.isLoadingList = t;
|
|
});
|
|
},
|
|
clearProjectList: () => {
|
|
e((e) => {
|
|
(e.projectList = []), (e.total = 0);
|
|
});
|
|
},
|
|
})),
|
|
{ name: "ProjectStore" },
|
|
),
|
|
),
|
|
mediaAssetStore: (0, c.createStore)()(
|
|
(0, d.devtools)(
|
|
(0, u.immer)((e) => ({
|
|
assetList: [],
|
|
total: 0,
|
|
isLoadingList: !1,
|
|
currentAsset: null,
|
|
isLoadingDetail: !1,
|
|
tagTreeMap: {},
|
|
isLoadingTagTree: !1,
|
|
assetTypes: [],
|
|
assetTypesLoaded: !1,
|
|
listFilter: { ...eT },
|
|
setAssetList: (t, n) => {
|
|
e((e) => {
|
|
(e.assetList = t), (e.total = n);
|
|
});
|
|
},
|
|
appendAssetList: (t, n) => {
|
|
e((e) => {
|
|
e.assetList.push(...t), void 0 !== n && (e.total = n);
|
|
});
|
|
},
|
|
setLoadingList: (t) => {
|
|
e((e) => {
|
|
e.isLoadingList = t;
|
|
});
|
|
},
|
|
clearAssetList: () => {
|
|
e((e) => {
|
|
(e.assetList = []), (e.total = 0);
|
|
});
|
|
},
|
|
setCurrentAsset: (t) => {
|
|
e((e) => {
|
|
e.currentAsset = t;
|
|
});
|
|
},
|
|
setLoadingDetail: (t) => {
|
|
e((e) => {
|
|
e.isLoadingDetail = t;
|
|
});
|
|
},
|
|
setTagTree: (t, n) => {
|
|
e((e) => {
|
|
e.tagTreeMap[t] = n;
|
|
});
|
|
},
|
|
setLoadingTagTree: (t) => {
|
|
e((e) => {
|
|
e.isLoadingTagTree = t;
|
|
});
|
|
},
|
|
setAssetTypes: (t) => {
|
|
e((e) => {
|
|
(e.assetTypes = t), (e.assetTypesLoaded = !0);
|
|
});
|
|
},
|
|
setListFilter: (t) => {
|
|
e((e) => {
|
|
Object.assign(e.listFilter, t);
|
|
});
|
|
},
|
|
resetListFilter: () => {
|
|
e((e) => {
|
|
e.listFilter = { ...eT };
|
|
});
|
|
},
|
|
removeAssetFromList: (t) => {
|
|
e((e) => {
|
|
(e.assetList = e.assetList.filter((e) => e.uuid !== t)),
|
|
(e.total = Math.max(0, e.total - 1));
|
|
});
|
|
},
|
|
updateAssetInList: (t, n) => {
|
|
e((e) => {
|
|
let o = e.assetList.findIndex((e) => e.uuid === t);
|
|
if (-1 !== o) {
|
|
let t = Object.entries(n).filter(
|
|
([, e]) => void 0 !== e,
|
|
);
|
|
Object.assign(e.assetList[o], Object.fromEntries(t));
|
|
}
|
|
});
|
|
},
|
|
prependAssetToList: (t) => {
|
|
e((e) => {
|
|
e.assetList.unshift(t), (e.total += 1);
|
|
});
|
|
},
|
|
})),
|
|
{ name: "MediaAssetStore" },
|
|
),
|
|
),
|
|
userStore:
|
|
(i && eA(i),
|
|
(0, c.createStore)()(
|
|
(0, d.devtools)(
|
|
(0, u.immer)((e) => ({
|
|
isLogin: !!i,
|
|
userInfo: i || null,
|
|
setUserInfo: (t) => {
|
|
eA(t),
|
|
e((e) => {
|
|
(e.isLogin = !0), (e.userInfo = t);
|
|
});
|
|
},
|
|
logout: () => {
|
|
e((e) => {
|
|
(e.isLogin = !1), (e.userInfo = null);
|
|
});
|
|
},
|
|
})),
|
|
{ name: "UserStore" },
|
|
),
|
|
)),
|
|
communityStore: (0, c.createStore)()(
|
|
(0, d.devtools)(
|
|
(0, u.immer)((e) => ({
|
|
items: [],
|
|
total: 0,
|
|
cacheMeta: null,
|
|
cacheScrollY: 0,
|
|
cacheActiveTag: 0,
|
|
setItems: (t) =>
|
|
e((e) => {
|
|
e.items = t;
|
|
}),
|
|
setTotal: (t) =>
|
|
e((e) => {
|
|
e.total = t;
|
|
}),
|
|
appendItems: (t) =>
|
|
e((e) => {
|
|
e.items.push(...t);
|
|
}),
|
|
toggleLike: (t) =>
|
|
e((e) => {
|
|
let n = e.items.find((e) => e.id === t);
|
|
n &&
|
|
((n.isLiked = !n.isLiked),
|
|
(n.likeCount += n.isLiked ? 1 : -1));
|
|
}),
|
|
updateItem: (t, n) =>
|
|
e((e) => {
|
|
let o = e.items.find((e) => e.id === t);
|
|
o && Object.assign(o, n);
|
|
}),
|
|
setCacheMeta: (t) =>
|
|
e((e) => {
|
|
e.cacheMeta = t;
|
|
}),
|
|
setCacheScrollY: (t) =>
|
|
e((e) => {
|
|
e.cacheScrollY = t;
|
|
}),
|
|
setCacheActiveTag: (t) =>
|
|
e((e) => {
|
|
e.cacheActiveTag = t;
|
|
}),
|
|
reset: () =>
|
|
e((e) => {
|
|
(e.items = []),
|
|
(e.total = 0),
|
|
(e.cacheMeta = null),
|
|
(e.cacheScrollY = 0);
|
|
}),
|
|
})),
|
|
{ name: "CommunityStore" },
|
|
),
|
|
),
|
|
activityAwardedStore: (0, a.createActivityAwardedStore)(),
|
|
projectDetailStore: (0, c.createStore)()(
|
|
(0, d.devtools)(
|
|
(0, u.immer)((e) => ({
|
|
projectId: "",
|
|
items: [],
|
|
currentIndex: 0,
|
|
isPlaying: !1,
|
|
processModalOpen: !1,
|
|
init: (t, n, o) =>
|
|
e((e) => {
|
|
(e.projectId = t),
|
|
(e.items = n),
|
|
(e.currentIndex = o),
|
|
(e.isPlaying = !1);
|
|
}),
|
|
setItems: (t) =>
|
|
e((e) => {
|
|
e.items = t;
|
|
}),
|
|
setCurrentIndex: (t) =>
|
|
e((e) => {
|
|
e.currentIndex = t;
|
|
}),
|
|
setIsPlaying: (t) =>
|
|
e((e) => {
|
|
e.isPlaying = t;
|
|
}),
|
|
setProcessModalOpen: (t) =>
|
|
e((e) => {
|
|
e.processModalOpen = t;
|
|
}),
|
|
toggleLike: (t) =>
|
|
e((e) => {
|
|
let n = e.items.find((e) => e.id === t);
|
|
n &&
|
|
((n.isLiked = !n.isLiked),
|
|
(n.likeCount += n.isLiked ? 1 : -1));
|
|
}),
|
|
updateItem: (t, n) =>
|
|
e((e) => {
|
|
let o = e.items.find((e) => e.id === t);
|
|
o && Object.assign(o, n);
|
|
}),
|
|
reset: () =>
|
|
e((e) => {
|
|
(e.projectId = ""),
|
|
(e.items = []),
|
|
(e.currentIndex = 0),
|
|
(e.isPlaying = !1),
|
|
(e.processModalOpen = !1);
|
|
}),
|
|
})),
|
|
{ name: "ProjectDetailStore" },
|
|
),
|
|
),
|
|
uiStore: (0, c.createStore)()(
|
|
(0, d.devtools)(
|
|
(0, u.immer)((e) => ({
|
|
activeSidebarPanel: null,
|
|
activityBannerHeight: 0,
|
|
toggleSidebarPanel: (t) =>
|
|
e(
|
|
(e) => {
|
|
e.activeSidebarPanel =
|
|
e.activeSidebarPanel === t ? null : t;
|
|
},
|
|
!1,
|
|
"ui/toggleSidebarPanel",
|
|
),
|
|
closeSidebarPanel: () =>
|
|
e(
|
|
(e) => {
|
|
e.activeSidebarPanel = null;
|
|
},
|
|
!1,
|
|
"ui/closeSidebarPanel",
|
|
),
|
|
setActivityBannerHeight: (t) =>
|
|
e(
|
|
(e) => {
|
|
e.activityBannerHeight = t;
|
|
},
|
|
!1,
|
|
"ui/setActivityBannerHeight",
|
|
),
|
|
})),
|
|
{ name: "uiStore" },
|
|
),
|
|
),
|
|
}),
|
|
(t = p.current),
|
|
l && t.areaStore.getState().setAreaCode(l),
|
|
(0, n.jsx)(eD.Provider, { value: p.current, children: e })
|
|
);
|
|
}
|
|
function ej() {
|
|
let e = (0, o.useContext)(eD);
|
|
if (e) return e;
|
|
if (t) return t;
|
|
throw Error("Missing RootStoreProvider");
|
|
}
|
|
function eR(e) {
|
|
return function (t) {
|
|
let n = ej()[e];
|
|
return (0, r.useStoreWithEqualityFn)(n, t ?? ((e) => e), i.shallow);
|
|
};
|
|
}
|
|
eR("langStore"), eR("areaStore");
|
|
let ez = eR("globalStore"),
|
|
eF = eR("canvasStore"),
|
|
e$ = eR("projectStore"),
|
|
eB = eR("mediaAssetStore"),
|
|
eH = eR("userStore"),
|
|
eV = eR("communityStore"),
|
|
eU = eR("activityAwardedStore"),
|
|
eY = eR("projectDetailStore"),
|
|
eW = eR("uiStore");
|
|
e.s(
|
|
[
|
|
"RootStoreProvider",
|
|
() => eL,
|
|
"stores",
|
|
0,
|
|
{
|
|
get lang() {
|
|
return t ? t.langStore.getState() : null;
|
|
},
|
|
get area() {
|
|
return t ? t.areaStore.getState() : null;
|
|
},
|
|
get global() {
|
|
return t ? t.globalStore.getState() : null;
|
|
},
|
|
get canvas() {
|
|
return t ? t.canvasStore.getState() : null;
|
|
},
|
|
get project() {
|
|
return t ? t.projectStore.getState() : null;
|
|
},
|
|
get mediaAsset() {
|
|
return t ? t.mediaAssetStore.getState() : null;
|
|
},
|
|
get user() {
|
|
return t ? t.userStore.getState() : null;
|
|
},
|
|
get community() {
|
|
return t ? t.communityStore.getState() : null;
|
|
},
|
|
get activityAwarded() {
|
|
return t ? t.activityAwardedStore.getState() : null;
|
|
},
|
|
get projectDetail() {
|
|
return t ? t.projectDetailStore.getState() : null;
|
|
},
|
|
get ui() {
|
|
return t ? t.uiStore.getState() : null;
|
|
},
|
|
},
|
|
"useActivityAwardedStore",
|
|
0,
|
|
eU,
|
|
"useCanvasStore",
|
|
0,
|
|
eF,
|
|
"useCommunityStore",
|
|
0,
|
|
eV,
|
|
"useGlobalStore",
|
|
0,
|
|
ez,
|
|
"useMediaAssetStore",
|
|
0,
|
|
eB,
|
|
"useProjectDetailStore",
|
|
0,
|
|
eY,
|
|
"useProjectStore",
|
|
0,
|
|
e$,
|
|
"useRootStore",
|
|
() => ej,
|
|
"useUiStore",
|
|
0,
|
|
eW,
|
|
"useUserStore",
|
|
0,
|
|
eH,
|
|
],
|
|
216257,
|
|
);
|
|
};
|
|
|
|
export default moduleFactory;
|