Files
AFFiNE-Mirror/libs/components/editor-plugins/src/base-plugin.ts
T
2022-07-27 16:22:05 +08:00

66 lines
1.9 KiB
TypeScript

import {
Virgo,
Plugin,
PluginHooks,
HookType,
} from '@toeverything/framework/virgo';
import { genErrorObj } from '@toeverything/utils';
import { Subscription } from 'rxjs';
export abstract class BasePlugin implements Plugin {
protected editor: Virgo;
protected hooks: PluginHooks;
protected sub: Subscription;
private _disposed = false;
// Unique identifier to distinguish between different Plugins
public static get pluginName(): string {
throw new Error(
"subclass need to implement 'get pluginName' property accessors."
);
}
// Priority, the higher the number, the higher the priority
public static get priority(): number {
return 1;
}
constructor(editor: Virgo, hooks: PluginHooks) {
this.editor = editor;
this.hooks = hooks;
this.sub = hooks.get(HookType.RENDER).subscribe(() => this._onRender());
}
/**
* Only executed once during initialization
*/
public init(): void {
// implement in subclass
}
/**
* will trigger multiple times
*/
protected _onRender(): void {
// implement in subclass
}
public dispose(): void {
// See https://stackoverflow.com/questions/33387318/access-to-static-properties-via-this-constructor-in-typescript
const pluginName = (this.constructor as typeof BasePlugin).pluginName;
if (this._disposed) {
console.warn(`Plugin '${pluginName}' already disposed`);
return;
}
this.sub.unsubscribe();
this._disposed = true;
const errorMsg = `You are trying to access an invalid editor or hooks.
The plugin '${pluginName}' has been disposed.
Make sure all hooks are removed before dispose.`;
this.editor = genErrorObj(errorMsg) as Virgo;
this.hooks = genErrorObj(errorMsg) as PluginHooks;
}
}