Skip to content

Commit 0862a60

Browse files
committed
Clean up event handling in DebugConfigurationElement
1 parent 293ce05 commit 0862a60

File tree

3 files changed

+84
-38
lines changed

3 files changed

+84
-38
lines changed

debug-configuration/debug-configuration.ts

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import * as pd from 'polymer-ts-decorators';
22
import { IDebugConfigElementBehavior, IDebugConfig } from '../lib/debug-engine';
3-
import { createElement } from '../lib/debug-workbench';
4-
import { Disposable } from 'event-kit';
5-
import addDisposableListener from '../lib/disposable-dom-event-listener';
3+
import * as debugWorkbench from '../lib/debug-workbench';
4+
import { Disposable, Emitter } from 'event-kit';
65

76
interface ILocalDOM {
87
dialog: PolymerElements.PaperDialog;
@@ -12,38 +11,75 @@ function $(element: any): ILocalDOM {
1211
return element.$;
1312
}
1413

14+
const OPENED_EVENT = 'opened';
15+
const CLOSED_EVENT = 'closed';
16+
1517
/**
1618
* Base behavior of the DebugConfigurationElement.
1719
*/
1820
@pd.is('debug-configuration')
1921
export default class DebugConfigurationElement implements IDebugConfigElementBehavior {
22+
private debugConfig: IDebugConfig;
23+
private emitter: Emitter;
24+
2025
static create(debugConfig: IDebugConfig): Promise<IDebugConfigurationElement> {
21-
return createElement((<any> DebugConfigurationElement.prototype).is, debugConfig);
26+
return debugWorkbench.createElement((<any> DebugConfigurationElement.prototype).is, debugConfig);
2227
}
2328

24-
/** Add a listener to be called when the dialog is opened. */
25-
onOpened(callback: EventListener): Disposable {
26-
return addDisposableListener($(this).dialog, 'iron-overlay-opened', callback);
29+
created(): void {
30+
this.emitter = new Emitter();
2731
}
2832

29-
/** Add a listener to be called when the dialog is closed. */
30-
onClosed(callback: EventListener): Disposable {
31-
return addDisposableListener($(this).dialog, 'iron-overlay-closed', callback);
33+
destroy(): void {
34+
if (this.emitter) {
35+
this.emitter.dispose();
36+
this.emitter = null;
37+
}
3238
}
3339

34-
open(): void {
35-
const dialog = $(this).dialog;
36-
if (dialog) {
37-
dialog.open();
40+
/** Called after ready() with arguments passed to the element constructor function. */
41+
factoryImpl(debugConfig: IDebugConfig): void {
42+
this.debugConfig = debugConfig;
43+
}
44+
45+
@pd.listener('dialog.iron-overlay-opened')
46+
private onIronOverlayOpened(e: CustomEvent): void {
47+
if (Polymer.dom(e).localTarget === $(this).dialog) {
48+
this.emitter.emit(OPENED_EVENT);
49+
} else {
50+
e.stopPropagation();
3851
}
3952
}
4053

41-
close(): void {
42-
const dialog = $(this).dialog;
43-
if (dialog) {
44-
dialog.close();
54+
@pd.listener('dialog.iron-overlay-closed')
55+
private onIronOverlayClosed(e: PolymerElements.IronOverlayClosedEvent): void {
56+
if (Polymer.dom(e).localTarget === $(this).dialog) {
57+
if (e.detail.confirmed) {
58+
debugWorkbench.debugConfigs.save(this.debugConfig);
59+
}
60+
this.emitter.emit(CLOSED_EVENT, e.detail);
61+
} else {
62+
e.stopPropagation();
4563
}
4664
}
65+
66+
/** Add a function to be called when the dialog is opened. */
67+
onOpened(callback: () => void): Disposable {
68+
return this.emitter.on(OPENED_EVENT, callback);
69+
}
70+
71+
/** Add a function to be called when the dialog is closed. */
72+
onClosed(callback: (closingReason: PolymerElements.IClosingReason) => void): Disposable {
73+
return this.emitter.on(CLOSED_EVENT, callback);
74+
}
75+
76+
open(): void {
77+
$(this).dialog.open();
78+
}
79+
80+
close(): void {
81+
$(this).dialog.close();
82+
}
4783
}
4884

4985
export interface IDebugConfigurationElement extends DebugConfigurationElement, HTMLElement {

index.d.ts

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
declare module 'debug-workbench-core-components/lib/debug-engine' {
77
import { Disposable } from 'event-kit';
88
export interface IDebugConfigElementBehavior {
9-
onOpened(callback: EventListener): Disposable;
10-
onClosed(callback: EventListener): Disposable;
9+
onOpened(callback: () => void): Disposable;
10+
onClosed(callback: (closingReason: PolymerElements.IClosingReason) => void): Disposable;
1111
open(): void;
1212
close(): void;
13+
destroy(): void;
1314
}
1415
export interface IDebugConfigElement extends IDebugConfigElementBehavior, HTMLElement {
1516
}
@@ -170,30 +171,26 @@ declare module 'debug-workbench-core-components/lib/debug-workbench' {
170171

171172
}
172173

173-
declare module 'debug-workbench-core-components/lib/disposable-dom-event-listener' {
174-
import { Disposable } from 'event-kit';
175-
/**
176-
* Add an event listener to a DOM node.
177-
*
178-
* @return An object that upon being disposed will remove the event listener from the node it was
179-
* originally added to.
180-
*/
181-
export default function add(node: HTMLElement, eventName: string, callback: EventListener): Disposable;
182-
183-
}
184-
185174
declare module 'debug-workbench-core-components/debug-configuration/debug-configuration' {
186175
import { IDebugConfigElementBehavior, IDebugConfig } from 'debug-workbench-core-components/lib/debug-engine';
187176
import { Disposable } from 'event-kit';
188177
/**
189178
* Base behavior of the DebugConfigurationElement.
190179
*/
191180
export default class DebugConfigurationElement implements IDebugConfigElementBehavior {
181+
private debugConfig;
182+
private emitter;
192183
static create(debugConfig: IDebugConfig): Promise<IDebugConfigurationElement>;
193-
/** Add a listener to be called when the dialog is opened. */
194-
onOpened(callback: EventListener): Disposable;
195-
/** Add a listener to be called when the dialog is closed. */
196-
onClosed(callback: EventListener): Disposable;
184+
created(): void;
185+
destroy(): void;
186+
/** Called after ready() with arguments passed to the element constructor function. */
187+
factoryImpl(debugConfig: IDebugConfig): void;
188+
private onIronOverlayOpened(e);
189+
private onIronOverlayClosed(e);
190+
/** Add a function to be called when the dialog is opened. */
191+
onOpened(callback: () => void): Disposable;
192+
/** Add a function to be called when the dialog is closed. */
193+
onClosed(callback: (closingReason: PolymerElements.IClosingReason) => void): Disposable;
197194
open(): void;
198195
close(): void;
199196
}
@@ -203,6 +200,18 @@ declare module 'debug-workbench-core-components/debug-configuration/debug-config
203200

204201
}
205202

203+
declare module 'debug-workbench-core-components/lib/disposable-dom-event-listener' {
204+
import { Disposable } from 'event-kit';
205+
/**
206+
* Add an event listener to a DOM node.
207+
*
208+
* @return An object that upon being disposed will remove the event listener from the node it was
209+
* originally added to.
210+
*/
211+
export default function add(node: HTMLElement, eventName: string, callback: EventListener): Disposable;
212+
213+
}
214+
206215
declare module 'debug-workbench-core-components/debug-toolbar/debug-toolbar' {
207216
import { Disposable } from 'event-kit';
208217
export default class DebugToolbarElement {

lib/debug-engine.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
import { Disposable } from 'event-kit';
77

88
export interface IDebugConfigElementBehavior {
9-
onOpened(callback: EventListener): Disposable;
10-
onClosed(callback: EventListener): Disposable;
9+
onOpened(callback: () => void): Disposable;
10+
onClosed(callback: (closingReason: PolymerElements.IClosingReason) => void): Disposable;
1111
open(): void;
1212
close(): void;
13+
destroy(): void;
1314
}
1415

1516
export interface IDebugConfigElement extends IDebugConfigElementBehavior, HTMLElement {

0 commit comments

Comments
 (0)