Skip to content

Commit f469488

Browse files
committed
refactor( EventListener ): improve EventListener types
- change name of `EventListener" to `EventEmitter` - add `EventMap` generic | `EventMap` includes events and their payloads - make `EventEmitter.targgetEvent` method public - make `Timer` passes their event map to `EventEmitter` - make `NotyfNotification` extends `EventEmitter` - pass `target` as the target property on event "dimiss" and event "click" on `Notyf` - pass `notification` as the target property to events "mouseover" and "mouseleave" on `NotyfView`
1 parent 1189430 commit f469488

File tree

5 files changed

+30
-47
lines changed

5 files changed

+30
-47
lines changed

src/notyf.models.ts

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { INotyfNotificationOptions, DeepPartial, NotyfEvent } from './notyf.options';
2+
import EventEmitter from './utils/classes/eventEmitter';
23

34
export interface INotyfEventPayload {
45
target: NotyfNotification;
@@ -7,20 +8,8 @@ export interface INotyfEventPayload {
78

89
export type NotyfEventCallback = (payload: INotyfEventPayload) => void;
910

10-
export class NotyfNotification {
11-
private listeners: Partial<Record<NotyfEvent, NotyfEventCallback[]>> = {};
12-
13-
constructor(public options: DeepPartial<INotyfNotificationOptions>) {}
14-
15-
public on(eventType: NotyfEvent, cb: NotyfEventCallback) {
16-
const callbacks = this.listeners[eventType] || [];
17-
this.listeners[eventType] = callbacks.concat([cb]);
18-
}
19-
20-
triggerEvent(eventType: NotyfEvent, event?: Event) {
21-
const callbacks = this.listeners[eventType] || [];
22-
callbacks.forEach((cb) => cb({ target: this, event }));
23-
}
11+
export class NotyfNotification extends EventEmitter<{ [ K in NotyfEvent ]: INotyfEventPayload }> {
12+
constructor(public options: DeepPartial<INotyfNotificationOptions>) { super() }
2413
}
2514

2615
export interface IRenderedNotification {

src/notyf.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,10 @@ export default class Notyf {
3030

3131
this.view.on(NotyfEvent.Dismiss, ({ target, event }) => {
3232
this._removeNotification(target);
33-
// tslint:disable-next-line: no-string-literal
34-
target['triggerEvent'](NotyfEvent.Dismiss, event);
33+
target.triggerEvent(NotyfEvent.Dismiss, { target, event });
3534
});
3635

37-
// tslint:disable-next-line: no-string-literal
38-
this.view.on(NotyfEvent.Click, ({ target, event }) => target['triggerEvent'](NotyfEvent.Click, event));
36+
this.view.on(NotyfEvent.Click, ({ target, event }) => target.triggerEvent(NotyfEvent.Click, { target, event }));
3937
}
4038

4139
public error(payload: string | Partial<INotyfNotificationOptions>) {

src/notyf.view.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,11 @@ export class NotyfView {
197197
);
198198

199199
notificationElem.addEventListener('mouseover', event =>
200-
notification.triggerEvent(NotyfEvent.MouseOver, event)
200+
notification.triggerEvent(NotyfEvent.MouseOver, { target: notification, event })
201201
)
202202

203203
notificationElem.addEventListener('mouseleave', event =>
204-
notification.triggerEvent(NotyfEvent.MouseLeave, event)
204+
notification.triggerEvent(NotyfEvent.MouseLeave, { target: notification, event })
205205
)
206206

207207
// Adjust margins depending on whether its an upper or lower notification

src/utils/classes/eventListener.ts

Lines changed: 0 additions & 17 deletions
This file was deleted.

src/utils/classes/timer.ts

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
import EventListener from './eventListener';
1+
import EventEmitter from './eventEmitter';
22

3-
export default class Timer extends EventListener {
3+
type TimerEvents = "finished" | "pause" | "resume"
4+
type TimerEventMap = Record<TimerEvents, undefined>
5+
6+
export default class Timer extends EventEmitter< TimerEventMap > {
47

58
private startTime: number = Date.now();
69

@@ -12,34 +15,44 @@ export default class Timer extends EventListener {
1215
return this.duration - (this.lastTime - this.startTime);
1316
}
1417

15-
constructor(public duration: number) {
18+
constructor( public duration: number ) {
19+
1620
super();
1721

1822
this.timer = setTimeout(() => {
19-
this.triggerEvent('finished');
23+
24+
this.triggerEvent('finished', undefined);
2025

2126
this.lastTime = Date.now();
27+
2228
}, duration);
29+
2330
}
2431

2532
pause() {
26-
this.triggerEvent('pause');
2733

2834
clearTimeout(this.timer);
2935

3036
this.lastTime = Date.now();
37+
38+
this.triggerEvent('pause', undefined);
39+
3140
}
3241

3342
resume() {
34-
this.triggerEvent('resume');
35-
43+
3644
clearTimeout(this.timer);
37-
45+
3846
this.timer = setTimeout(() => {
39-
this.triggerEvent('finished');
40-
47+
48+
this.triggerEvent('finished', undefined);
49+
4150
this.lastTime = Date.now();
51+
4252
}, this.leftTime);
53+
54+
this.triggerEvent('resume', undefined);
55+
4356
}
4457

4558
}

0 commit comments

Comments
 (0)