UNPKG

@xrenders/xflow

Version:

一款功能强大、易用灵活的流程编辑器框架,帮助你轻松构建复杂的工作流和流程产品

170 lines (169 loc) 5.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useFlow = void 0; require("antd/es/message/style"); var _message2 = _interopRequireDefault(require("antd/es/message")); var _tslib = require("tslib"); var _react = require("react"); var _ahooks = require("ahooks"); var _react2 = require("@xyflow/react"); var _useStore = require("./useStore"); var _useTemporalStore2 = require("./useTemporalStore"); var _autoLayoutNodes = _interopRequireDefault(require("../utils/autoLayoutNodes")); var _utils = require("../utils"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } // useFlow 维护原则 // 1. 尽量复用 reactflow 已有的方法,不要重复造轮子 // 2. 非必要不暴露新的方法和状态 var useFlow = exports.useFlow = function useFlow() { var storeApi = (0, _useStore.useStoreApi)(); var instance = storeApi.getState(); var _useReactFlow = (0, _react2.useReactFlow)(), zoomIn = _useReactFlow.zoomIn, zoomOut = _useReactFlow.zoomOut, zoomTo = _useReactFlow.zoomTo, getZoom = _useReactFlow.getZoom, setViewport = _useReactFlow.setViewport, getViewport = _useReactFlow.getViewport, fitView = _useReactFlow.fitView, setCenter = _useReactFlow.setCenter, fitBounds = _useReactFlow.fitBounds, _toObject = _useReactFlow.toObject, _getNodes = _useReactFlow.getNodes, getEdges = _useReactFlow.getEdges, screenToFlowPosition = _useReactFlow.screenToFlowPosition, flowToScreenPosition = _useReactFlow.flowToScreenPosition; var _useTemporalStore = (0, _useTemporalStore2.useTemporalStore)(), record = _useTemporalStore.record; var toObject = (0, _ahooks.useMemoizedFn)(function () { var _a = _toObject(), nodes = _a.nodes, rest = (0, _tslib.__rest)(_a, ["nodes"]); return Object.assign(Object.assign({}, rest), { nodes: getNodes(nodes) }); }); var getFlowData = function getFlowData() { var _toObject2 = _toObject(), nodes = _toObject2.nodes, edges = _toObject2.edges; return { edges: edges, nodes: getNodes(nodes) }; }; var setFlowData = function setFlowData(_ref) { var nodes = _ref.nodes, edges = _ref.edges; if (!!nodes) { setNodes(nodes); } if (!!edges) { setEdges(edges); } }; var getNodes = (0, _ahooks.useMemoizedFn)(function (_nodes) { var nodes = _nodes || _getNodes(); var result = nodes.map(function (item) { var data = item.data, rest = (0, _tslib.__rest)(item, ["data"]); var _nodeType = data._nodeType, restData = (0, _tslib.__rest)(data, ["_nodeType"]); return Object.assign(Object.assign({}, rest), { data: restData, type: _nodeType }); }); return result; }); var setNodes = (0, _ahooks.useMemoizedFn)(function (nodes) { storeApi.getState().setNodes(nodes); }); var addNodes = (0, _ahooks.useMemoizedFn)(function (nodes) { record(function () { storeApi.getState().addNodes(nodes); }); }); var setEdges = (0, _ahooks.useMemoizedFn)(function (edges) { storeApi.getState().setEdges(edges); }); var addEdges = (0, _ahooks.useMemoizedFn)(function (edges) { storeApi.getState().addEdges(edges); }); var copyNode = (0, _ahooks.useMemoizedFn)(function (nodeId) { var copyNodes = (0, _utils.generateCopyNodes)(storeApi.getState().nodes.find(function (node) { return node.id === nodeId; })); storeApi.setState({ copyNodes: copyNodes }); }); var pasteNode = (0, _ahooks.useMemoizedFn)(function (nodeId, data) { if (storeApi.getState().copyNodes.length > 0) { var newEdges = Object.assign({ id: (0, _utils.uuid)(), source: nodeId, target: storeApi.getState().copyNodes[0].id }, data); record(function () { storeApi.getState().addNodes(storeApi.getState().copyNodes, false); }); storeApi.getState().addEdges(newEdges); storeApi.setState({ copyNodes: [] }); } else { _message2.default.warning('请先复制节点!'); } }); var deleteNode = (0, _ahooks.useMemoizedFn)(function (nodeId) { record(function () { storeApi.setState({ edges: storeApi.getState().edges.filter(function (edge) { return edge.source !== nodeId && edge.target !== nodeId; }) }); }); record(function () { storeApi.setState({ nodes: storeApi.getState().nodes.filter(function (node) { return node.id !== nodeId; }) }); }); }); var runAutoLayout = (0, _ahooks.useMemoizedFn)(function () { var newNodes = (0, _autoLayoutNodes.default)(storeApi.getState().nodes, storeApi.getState().edges, storeApi.getState().layout); setNodes(newNodes); }); return (0, _react.useMemo)(function () { return { setNodes: setNodes, addNodes: addNodes, setEdges: setEdges, addEdges: addEdges, getFlowData: getFlowData, setFlowData: setFlowData, getNodes: getNodes, getEdges: getEdges, toObject: toObject, zoomIn: zoomIn, zoomOut: zoomOut, zoomTo: zoomTo, getZoom: getZoom, setViewport: setViewport, getViewport: getViewport, fitView: fitView, setCenter: setCenter, fitBounds: fitBounds, screenToFlowPosition: screenToFlowPosition, flowToScreenPosition: flowToScreenPosition, runAutoLayout: runAutoLayout, copyNode: copyNode, pasteNode: pasteNode, deleteNode: deleteNode }; }, [instance]); };