@difizen/ai-flow
Version:
Scalable, out-of-the-box, agent-oriented flow
200 lines (197 loc) • 8.11 kB
JavaScript
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
import { SAVE_DEBOUNCE_TIME } from "../constants/constant";
import { getLayoutByDagre } from "../utils";
import '@xyflow/react';
import { produce } from 'immer';
import { cloneDeep, debounce } from 'lodash';
import { create } from 'zustand';
import { useFlowStore } from "./flowStore";
var defaultOptions = {
maxHistorySize: 100,
enableShortcuts: true
};
// let past: Snap[] = [];
// let future: Snap[] = [];
// flow 的基本操作:撤销重做、快照生产、自动布局、初始化
export var useFlowsManagerStore = create(function (set, get) {
return {
past: [],
future: [],
// auto save
autoLayout: function autoLayout(fitview) {
return new Promise(function (resolve) {
var _useFlowStore$getStat = useFlowStore.getState(),
nodes = _useFlowStore$getStat.nodes,
edges = _useFlowStore$getStat.edges,
setNodes = _useFlowStore$getStat.setNodes;
var layout = getLayoutByDagre(nodes, edges);
var newNodes = produce(nodes, function (draft) {
draft.forEach(function (node) {
var _node$measured, _node$measured2;
var nodeWithPosition = layout.node(node.id);
node.position = {
x: nodeWithPosition.x - (((_node$measured = node.measured) === null || _node$measured === void 0 ? void 0 : _node$measured.width) || 0) / 2,
y: nodeWithPosition.y - (((_node$measured2 = node.measured) === null || _node$measured2 === void 0 ? void 0 : _node$measured2.height) || 0) / 2
};
});
});
setNodes(newNodes);
resolve(true);
}).then(function (res) {
if (res && fitview) {
var _useFlowStore$getStat2 = useFlowStore.getState(),
reactFlowInstance = _useFlowStore$getStat2.reactFlowInstance;
return reactFlowInstance === null || reactFlowInstance === void 0 ? void 0 : reactFlowInstance.fitView();
}
return;
});
},
autoSaving: true,
saveLoading: false,
saveFlow: function saveFlow() {
get().setSavedAt(new Date().toISOString());
},
setNodesFolded: function setNodesFolded(folded) {
var _useFlowStore$getStat3 = useFlowStore.getState(),
setNodeFolded = _useFlowStore$getStat3.setNodeFolded,
nodes = _useFlowStore$getStat3.nodes;
nodes.forEach(function (n) {
return setNodeFolded(n.id, folded);
});
get().takeSnapshot();
},
setSaveFlow: function setSaveFlow(saveFlow) {
return set({
saveFlow: saveFlow
});
},
setSaveLoading: function setSaveLoading(saveLoading) {
return set({
saveLoading: saveLoading
});
},
setAutoSaving: function setAutoSaving(autoSaving) {
return set({
autoSaving: autoSaving
});
},
autoSavingInterval: SAVE_DEBOUNCE_TIME,
setAutoSavingInterval: function setAutoSavingInterval(autoSavingInterval) {
return set({
autoSavingInterval: autoSavingInterval
});
},
autoSaveFlow: undefined,
hasPast: function hasPast() {
console.log('🚀 ~ past:', get().past);
return get().past && get().past.length > 0;
},
hasFuture: function hasFuture() {
console.log('🚀 ~ future:', get().past);
return get().future && get().future.length > 0;
},
savedAt: '未保存',
setSavedAt: function setSavedAt(savedAt) {
return set({
savedAt: savedAt
});
},
initializeAutoSaveFlow: function initializeAutoSaveFlow() {
var interval = get().autoSavingInterval;
var autoSaveFlow = debounce(function () {
get().saveFlow();
// 在这里执行自动保存的逻辑
}, interval);
set({
autoSaveFlow: autoSaveFlow
});
},
// redo undo
takeSnapshot: function takeSnapshot() {
var _get$past$length, _get$past;
var flowStore = useFlowStore.getState();
var newState = {
nodes: cloneDeep(flowStore.nodes),
edges: cloneDeep(flowStore.edges)
};
var pastLength = (_get$past$length = (_get$past = get().past) === null || _get$past === void 0 ? void 0 : _get$past.length) !== null && _get$past$length !== void 0 ? _get$past$length : 0;
if (pastLength > 0 && JSON.stringify(get().past[pastLength - 1]) === JSON.stringify(newState)) {
return;
}
if (pastLength > 0) {
var past = get().past.slice(pastLength - defaultOptions.maxHistorySize + 1, pastLength);
past.push(newState);
set({
past: _toConsumableArray(past)
});
} else {
set({
past: [newState]
});
}
set({
future: []
});
},
undo: function undo() {
var _get$past$length2, _get$past2, _get$past3, _get$past4;
var newState = useFlowStore.getState();
var pastLength = (_get$past$length2 = (_get$past2 = get().past) === null || _get$past2 === void 0 ? void 0 : _get$past2.length) !== null && _get$past$length2 !== void 0 ? _get$past$length2 : 0;
var pastState = (_get$past3 = (_get$past4 = get().past) === null || _get$past4 === void 0 ? void 0 : _get$past4[pastLength - 1]) !== null && _get$past3 !== void 0 ? _get$past3 : null;
if (pastState) {
var past = get().past.slice(0, pastLength - 1);
set({
past: past
});
if (!get().future) {
set({
future: []
});
}
var newFuture = produce(get().future, function (draft) {
draft.push({
nodes: newState.nodes,
edges: newState.edges
});
});
set({
future: newFuture
});
newState.setNodes(pastState.nodes);
newState.setEdges(pastState.edges);
}
},
redo: function redo() {
var _get$future$length, _get$future, _get$future2, _get$future3;
var newState = useFlowStore.getState();
var futureLength = (_get$future$length = (_get$future = get().future) === null || _get$future === void 0 ? void 0 : _get$future.length) !== null && _get$future$length !== void 0 ? _get$future$length : 0;
var futureState = (_get$future2 = (_get$future3 = get().future) === null || _get$future3 === void 0 ? void 0 : _get$future3[futureLength - 1]) !== null && _get$future2 !== void 0 ? _get$future2 : null;
if (futureState) {
set({
future: get().future.slice(0, futureLength - 1)
});
if (!get().past) {
set({
past: []
});
}
var newPast = produce(get().past, function (draft) {
draft.push({
nodes: newState.nodes,
edges: newState.edges
});
});
set({
past: newPast
});
newState.setNodes(futureState.nodes);
newState.setEdges(futureState.edges);
}
}
};
});