1 import {BaseSelection, LexicalEditor} from "lexical";
2 import {EditorUIManager} from "./manager";
3 import {el} from "../../helpers";
5 export type EditorUiStateUpdate = {
7 selection: BaseSelection|null,
10 export type EditorUiContext = {
11 editor: LexicalEditor,
12 translate: (text: string) => string,
13 manager: EditorUIManager,
14 lastSelection: BaseSelection|null,
17 export abstract class EditorUiElement {
18 protected dom: HTMLElement|null = null;
19 private context: EditorUiContext|null = null;
21 protected abstract buildDOM(): HTMLElement;
23 setContext(context: EditorUiContext): void {
24 this.context = context;
27 getContext(): EditorUiContext {
28 if (this.context === null) {
29 throw new Error('Attempted to use EditorUIContext before it has been set');
35 getDOMElement(): HTMLElement {
37 this.dom = this.buildDOM();
44 return this.getContext().translate(text);
47 updateState(state: EditorUiStateUpdate): void {
52 export class EditorContainerUiElement extends EditorUiElement {
53 protected children : EditorUiElement[];
55 constructor(children: EditorUiElement[]) {
57 this.children = children;
60 protected buildDOM(): HTMLElement {
61 return el('div', {}, this.getChildren().map(child => child.getDOMElement()));
64 getChildren(): EditorUiElement[] {
68 updateState(state: EditorUiStateUpdate): void {
69 for (const child of this.children) {
70 child.updateState(state);
74 setContext(context: EditorUiContext) {
75 super.setContext(context);
76 for (const child of this.getChildren()) {
77 child.setContext(context);
82 export class EditorSimpleClassContainer extends EditorContainerUiElement {
85 constructor(className: string, children: EditorUiElement[]) {
87 this.className = className;
90 protected buildDOM(): HTMLElement {
92 class: this.className,
93 }, this.getChildren().map(child => child.getDOMElement()));