feat(utils): add workspace utils

This commit is contained in:
liujuping 2023-11-23 11:01:50 +08:00 committed by JackLian
parent 32c5202767
commit 0222f31202
6 changed files with 60 additions and 0 deletions

View File

@ -60,6 +60,7 @@ export interface ILowCodePluginContextPrivate {
set workspace(workspace: IPublicApiWorkspace);
set editorWindow(window: IPublicModelWindow);
set registerLevel(level: IPublicEnumPluginRegisterLevel);
set isPluginRegisteredInWorkspace(flag: boolean);
}
export interface ILowCodePluginContextApiAssembler {
assembleApis(

View File

@ -139,6 +139,7 @@ const pluginContextApiAssembler: ILowCodePluginContextApiAssembler = {
context.logger = new Logger({ level: 'warn', bizName: `plugin:${pluginName}` });
context.workspace = workspace;
context.registerLevel = IPublicEnumPluginRegisterLevel.Default;
context.isPluginRegisteredInWorkspace = false;
},
};

View File

@ -108,6 +108,8 @@ export interface IPublicModelPluginContext {
*/
get registerLevel(): IPublicEnumPluginRegisterLevel;
get isPluginRegisteredInWorkspace(): boolean;
get editorWindow(): IPublicModelWindow;
}

View File

@ -30,3 +30,4 @@ export * from './is-plugin-event-name';
export * as css from './css-helper';
export { transactionManager } from './transaction-manager';
export * from './check-types';
export * from './workspace';

View File

@ -0,0 +1,54 @@
import React, { useEffect, useState, useCallback } from 'react';
import { IPublicModelPluginContext, IPublicEnumPluginRegisterLevel, IPublicModelWindow, IPublicModelEditorView } from '@alilc/lowcode-types';
/**
* HOC view
*
* @param {React.ComponentType} Component -
* @param {string|string[]} viewName -
* @returns {React.ComponentType}
*
* @example
* // 用法示例(函数组件):
* const EnhancedComponent = ProvideViewPluginContext(MyComponent, "viewName");
*/
export const ProvideViewPluginContext = (Component: any, viewName?: string | string[]) => {
// 创建一个新的函数组件,以便在其中使用 Hooks
return function WithPluginContext(props: {
[key: string]: any;
pluginContext?: IPublicModelPluginContext;
}) {
const getPluginContextFun = useCallback((editorWindow?: IPublicModelWindow | null) => {
if (!editorWindow?.currentEditorView) {
return null;
}
if (viewName) {
const items = editorWindow?.editorViews.filter(d => (d as any).viewName === viewName || (Array.isArray(viewName) && viewName.includes((d as any).viewName)));
return items[0];
} else {
return editorWindow.currentEditorView;
}
}, []);
const { workspace } = props.pluginContext || {};
const [pluginContext, setPluginContext] = useState<IPublicModelEditorView | null>(getPluginContextFun(workspace?.window));
useEffect(() => {
if (workspace?.window) {
const ctx = getPluginContextFun(workspace.window);
ctx && setPluginContext(ctx);
}
return workspace?.onChangeActiveEditorView(() => {
const ctx = getPluginContextFun(workspace.window);
ctx && setPluginContext(ctx);
});
}, [workspace, getPluginContextFun]);
if (props.pluginContext?.registerLevel !== IPublicEnumPluginRegisterLevel.Workspace || !props.pluginContext) {
return <Component {...props} />;
}
return <Component {...props} pluginContext={pluginContext} />;
};
};

View File

@ -170,6 +170,7 @@ export class BasicContext implements IBasicContext {
context.editorWindow = new Window(editorWindow);
}
context.registerLevel = registerLevel;
context.isPluginRegisteredInWorkspace = registerLevel === IPublicEnumPluginRegisterLevel.Workspace;
},
};