2022-05-05 16:48:15 +08:00

87 lines
2.7 KiB
TypeScript

/* eslint-disable no-multi-assign */
import { Editor, EngineConfig, engineConfig } from '@alilc/lowcode-editor-core';
import { Designer, ILowCodePluginManager } from '@alilc/lowcode-designer';
import { Skeleton as InnerSkeleton } from '@alilc/lowcode-editor-skeleton';
import {
Hotkey,
Project,
Skeleton,
Setters,
Material,
Event,
editorSymbol,
designerSymbol,
skeletonSymbol,
} from '@alilc/lowcode-shell';
import { getLogger, Logger } from '@alilc/lowcode-utils';
import {
ILowCodePluginContext,
IPluginContextOptions,
ILowCodePluginPreferenceDeclaration,
PreferenceValueType,
IPluginPreferenceMananger,
} from './plugin-types';
import { isValidPreferenceKey } from './plugin-utils';
export default class PluginContext implements ILowCodePluginContext {
private readonly [editorSymbol]: Editor;
private readonly [designerSymbol]: Designer;
private readonly [skeletonSymbol]: InnerSkeleton;
hotkey: Hotkey;
project: Project;
skeleton: Skeleton;
logger: Logger;
setters: Setters;
material: Material;
config: EngineConfig;
event: Event;
plugins: ILowCodePluginManager;
preference: IPluginPreferenceMananger;
constructor(plugins: ILowCodePluginManager, options: IPluginContextOptions) {
const editor = this[editorSymbol] = plugins.editor;
const designer = this[designerSymbol] = editor.get('designer')!;
const skeleton = this[skeletonSymbol] = editor.get('skeleton')!;
const { pluginName = 'anonymous' } = options;
const project = designer?.project;
this.hotkey = new Hotkey();
this.project = new Project(project);
this.skeleton = new Skeleton(skeleton);
this.setters = new Setters();
this.material = new Material(editor);
this.config = engineConfig;
this.plugins = plugins;
this.event = new Event(editor, { prefix: 'common' });
this.logger = getLogger({ level: 'warn', bizName: `designer:plugin:${pluginName}` });
const enhancePluginContextHook = engineConfig.get('enhancePluginContextHook');
if (enhancePluginContextHook) {
enhancePluginContextHook(this);
}
}
setPreference(
pluginName: string,
preferenceDeclaration: ILowCodePluginPreferenceDeclaration,
): void {
const getPreferenceValue = (
key: string,
defaultValue?: PreferenceValueType,
): PreferenceValueType | undefined => {
if (!isValidPreferenceKey(key, preferenceDeclaration)) {
return undefined;
}
const pluginPreference = this.plugins.getPluginPreference(pluginName) || {};
if (pluginPreference[key] === undefined || pluginPreference[key] === null) {
return defaultValue;
}
return pluginPreference[key];
};
this.preference = {
getPreferenceValue,
};
}
}