Skip to content

Commit 76a8046

Browse files
committed
Changed most events in LiveEditPage.ts and LiveEditPageProxy.ts to extend IframeEvent, started updating InitializeLiveEditEvent.ts to serialize itself to message
1 parent 6d813b6 commit 76a8046

File tree

6 files changed

+43
-29
lines changed

6 files changed

+43
-29
lines changed

src/main/resources/assets/admin/common/js/event/AbstractEvent.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ export abstract class AbstractEvent {
2121
return this.name;
2222
}
2323

24-
abstract fire(contextWindow: Window);
24+
abstract fire(contextWindow?: Window);
2525

26-
static getEventBus(contextWindow: Window): AbstractEventBus<AbstractEvent> {
26+
static getEventBus(contextWindow?: Window): AbstractEventBus<AbstractEvent> {
2727
throw new Error('Method not implemented.');
2828
};
2929
}

src/main/resources/assets/admin/common/js/event/AbstractEventBus.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
import {AbstractEvent} from './AbstractEvent';
22

3-
export interface HandlersMapEntry {
4-
handler: (event: AbstractEvent) => void;
3+
export interface HandlersMapEntry<E extends AbstractEvent> {
4+
handler: (event: E) => void;
55
customHandler?: (e: CustomEvent) => void;
66
}
77

88
export abstract class AbstractEventBus<E extends AbstractEvent> {
9-
protected handlersMap: Record<string, HandlersMapEntry[]> = {};
9+
protected handlersMap: Record<string, HandlersMapEntry<E>[]> = {};
1010
protected contextWindow: Window;
1111

1212
protected constructor(contextWindow: Window = window) {
1313
this.contextWindow = contextWindow;
1414
}
1515

16-
onEvent(eventName: string, handler: (event: E) => void): HandlersMapEntry {
16+
onEvent(eventName: string, handler: (event: E) => void): HandlersMapEntry<E> {
1717
if (!this.handlersMap[eventName]) {
1818
this.handlersMap[eventName] = [];
1919
}
@@ -22,8 +22,8 @@ export abstract class AbstractEventBus<E extends AbstractEvent> {
2222
return entry;
2323
}
2424

25-
unEvent(eventName: string, handler?: (event: E) => void): HandlersMapEntry[] {
26-
const removedEntries: HandlersMapEntry[] = [];
25+
unEvent(eventName: string, handler?: (event: E) => void): HandlersMapEntry<E>[] {
26+
const removedEntries: HandlersMapEntry<E>[] = [];
2727
if (handler) {
2828
this.handlersMap[eventName] = (this.handlersMap[eventName] || []).filter(
2929
entry => {

src/main/resources/assets/admin/common/js/event/Event.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import {AbstractEvent} from './AbstractEvent';
44
export class Event
55
extends AbstractEvent {
66

7-
fire(contextWindow: Window = window) {
7+
fire(contextWindow?: Window) {
88
EventBus.get(contextWindow).fireEvent(this);
99
}
1010

11-
static getEventBus(contextWindow: Window): EventBus {
11+
static getEventBus(contextWindow?: Window): EventBus {
1212
return EventBus.get(contextWindow);
1313
}
1414
}

src/main/resources/assets/admin/common/js/event/EventBus.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@ export class EventBus
88

99
static get(contextWindow: Window = window): EventBus {
1010
if (!EventBus.instance) {
11+
console.info(`Creating new EventBus instance by ${window.location.pathname} on ${contextWindow.location.pathname}`);
1112
EventBus.instance = new EventBus(contextWindow);
1213
} else if (EventBus.instance.contextWindow !== contextWindow) {
1314
throw new Error('EventBus instance already created with a different contextWindow');
1415
}
1516
return EventBus.instance;
1617
}
1718

18-
onEvent(eventName: string, handler: (event: Event) => void): HandlersMapEntry {
19+
onEvent(eventName: string, handler: (event: Event) => void): HandlersMapEntry<Event> {
1920
const entry = super.onEvent(eventName, handler);
2021
entry.customHandler = (e: CustomEvent) => handler(e.detail);
2122
this.contextWindow.addEventListener(eventName, entry.customHandler);
@@ -24,7 +25,7 @@ export class EventBus
2425

2526
unEvent(eventName: string, handler?: (event: Event) => void) {
2627
const entries = super.unEvent(eventName, handler);
27-
entries.forEach((entry: HandlersMapEntry) => {
28+
entries.forEach((entry: HandlersMapEntry<Event>) => {
2829
this.contextWindow.removeEventListener(eventName, entry.customHandler);
2930
});
3031
return entries;

src/main/resources/assets/admin/common/js/event/IframeEvent.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,19 @@ import {AbstractEvent} from './AbstractEvent';
44
export class IframeEvent
55
extends AbstractEvent {
66

7-
fire(contextWindow: Window = window) {
8-
IframeEventBus.get(contextWindow).fireEvent(this);
7+
fire() {
8+
IframeEventBus.get().fireEvent(this);
99
}
1010

11-
static getEventBus(contextWindow: Window): IframeEventBus {
12-
return IframeEventBus.get(contextWindow);
11+
toMessage(): string {
12+
return '';
13+
}
14+
15+
static fromMessage(name: string, data: string): IframeEvent {
16+
return new IframeEvent(name);
17+
}
18+
19+
static getEventBus(): IframeEventBus {
20+
return IframeEventBus.get();
1321
}
1422
}

src/main/resources/assets/admin/common/js/event/IframeEventBus.ts

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,42 @@ export class IframeEventBus
1010

1111
private constructor(contextWindow: Window) {
1212
super(contextWindow);
13-
this.ensureListener();
13+
14+
if (!this.isListening) {
15+
this.contextWindow.addEventListener('message', this.handleMessageEvent);
16+
this.isListening = true;
17+
}
1418
}
1519

16-
static get(contextWindow: Window = window): IframeEventBus {
20+
static init(contextWindow: Window): IframeEventBus {
21+
if (IframeEventBus.instance) {
22+
throw new Error(`IframeEventBus instance already initialized on ${IframeEventBus.instance.contextWindow.location.pathname}`);
23+
}
24+
console.info(`Initializing IframeEventBus instance by ${window.location.pathname} on ${contextWindow.location.pathname}`);
25+
IframeEventBus.instance = new IframeEventBus(contextWindow);
26+
return IframeEventBus.instance;
27+
}
28+
29+
static get(): IframeEventBus {
1730
if (!IframeEventBus.instance) {
18-
IframeEventBus.instance = new IframeEventBus(contextWindow);
19-
} else if (IframeEventBus.instance.contextWindow !== contextWindow) {
20-
throw new Error('IframeEventBus instance already created with a different contextWindow');
31+
throw new Error('IframeEventBus instance should be initialized with a contextWindow first');
2132
}
2233
return IframeEventBus.instance;
2334
}
2435

2536
public fireEvent(event: IframeEvent) {
2637
this.contextWindow.parent.postMessage({
2738
eventName: event.getName(),
28-
detail: event
39+
detail: event.toMessage()
2940
}, '*');
3041
}
3142

32-
private ensureListener() {
33-
if (!this.isListening) {
34-
this.contextWindow.addEventListener('message', this.handleMessageEvent);
35-
this.isListening = true;
36-
}
37-
}
38-
3943
private handleMessageEvent = (event: MessageEvent) => {
4044
const {eventName, detail} = event.data || {};
4145
if (!eventName) {
4246
return;
4347
}
48+
//TODO: create event object from detail!
4449
(this.handlersMap[eventName] || []).forEach(entry => entry.handler(detail));
4550
};
4651

0 commit comments

Comments
 (0)