@nocobase/flow-engine
Version:
A standalone flow engine for NocoBase, managing workflows, models, and actions.
77 lines (68 loc) • 2.31 kB
text/typescript
/**
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
import React from 'react';
import type { MetaTreeNode } from '../../flowContext';
export interface UseResolvedMetaTreeResult {
resolvedMetaTree: MetaTreeNode[] | undefined;
loading: boolean;
error: Error | null;
}
/**
* 通用 hook 用于处理异步/同步 metaTree
* 统一处理 metaTree 为函数(同步/异步)或数组的情况
*/
export const useResolvedMetaTree = (
metaTree?: MetaTreeNode[] | (() => MetaTreeNode[] | Promise<MetaTreeNode[]>),
): UseResolvedMetaTreeResult => {
const [resolvedMetaTree, setResolvedMetaTree] = React.useState<MetaTreeNode[] | undefined>();
const [loading, setLoading] = React.useState(false);
const [error, setError] = React.useState<Error | null>(null);
React.useEffect(() => {
const resolveMetaTree = async () => {
if (!metaTree) {
setResolvedMetaTree(undefined);
setLoading(false);
setError(null);
return;
}
// 如果是数组,直接使用
if (Array.isArray(metaTree)) {
setResolvedMetaTree(metaTree);
setLoading(false);
setError(null);
return;
}
// 如果是函数,需要调用它
if (typeof metaTree === 'function') {
setLoading(true);
setError(null);
try {
let result = await metaTree();
// 兼容返回值仍然是函数(惰性 loader)的情况,继续调用一次获取真正的数组
if (typeof result === 'function') {
result = await (result as unknown as () => Promise<MetaTreeNode[]>)();
}
setResolvedMetaTree(result as MetaTreeNode[]);
} catch (err) {
console.warn('Failed to resolve metaTree function:', err);
setError(err instanceof Error ? err : new Error(String(err)));
setResolvedMetaTree(undefined);
} finally {
setLoading(false);
}
}
};
resolveMetaTree();
}, [metaTree]);
return {
resolvedMetaTree,
loading,
error,
};
};