-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaura-toast.ts
121 lines (102 loc) · 3.8 KB
/
aura-toast.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import { autoinject, bindable, containerless, customElement } from "aurelia-framework";
import { AuraToastService } from "./aura-toast-service";
import { AuraToastSubscription } from "./classes/aura-toast-subscription";
import { AuraToastTypes } from "./enums/aura-toast-types";
import { AuraToastRequest } from "./classes/aura-toast-request";
import { AuraToastMessage } from "./classes/aura-toast-message";
import { computedFrom } from "../../../../node_modules/aurelia-binding";
import { AuraToastPositions } from "./enums/aura-toast-positions";
@autoinject()
@containerless()
@customElement("auratoast")
export class AuraToastCustomElement {
@bindable() key: string | null = null;
public toasts: AuraToastMessage[] = [];
private visible: boolean = true;
private id: number = 0;
private messageIdTracker: number = 1;
constructor(
private readonly toastService: AuraToastService
) {
}
bind() {
this.id = this.toastService.subscribe(new AuraToastSubscription(this.addMessage, this.key))
}
detached() {
this.toastService.unsubscribe(this.id);
}
addMessage = (type: AuraToastTypes, request: AuraToastRequest): void => {
let message = new AuraToastMessage(type, request.content, request.title);
message.id = this.generateId();
message.timeoutId = setTimeout(() => {
this.removeMessage(message.id);
}, this.toastService.settings.duration);
this.toasts.push(message);
this.show();
}
removeMessage(id: number) {
let toastIds = this.toasts.map(m => m.id);
let index = toastIds.indexOf(id);
if (index > -1) {
this.toasts.splice(index, 1);
}
if (this.toasts.length <= 0) {
this.hide();
}
}
mouseOverMessage(toast: AuraToastMessage) {
clearTimeout(toast.timeoutId);
}
mouseOutMessage(toast: AuraToastMessage) {
toast.timeoutId = setTimeout(() => {
this.removeMessage(toast.id);
}, this.toastService.settings.duration);
}
private show(): void {
this.visible = true;
}
private hide(): void {
this.visible = false;
}
private generateId(): number {
this.messageIdTracker++;
return this.messageIdTracker;
}
private getToastClasses(toast: AuraToastMessage): string {
let classes = 'auratoast-body auratoast-' + AuraToastTypes[toast.type];
return classes;
}
@computedFrom("toastService.settings")
get containerClass(): string {
let classes = this.key != null ? 'auratoast-container-block' : 'auratoast-container-fixed';
switch(this.toastService.settings.position) {
case AuraToastPositions.top:
classes += ' auratoast-top';
break;
case AuraToastPositions.topleft:
classes += ' auratoast-topleft';
break;
case AuraToastPositions.topright:
classes += ' auratoast-topright';
break;
case AuraToastPositions.bottom:
classes += ' auratoast-bottom';
break;
case AuraToastPositions.bottomleft:
classes += ' auratoast-bottomleft';
break;
case AuraToastPositions.bottomright:
classes += ' auratoast-bottomright';
break;
}
return classes;
}
@computedFrom("toastService.settings.maxWidth")
get containerWidthStyle() {
let position = this.toastService.settings.position;
if (position == AuraToastPositions.top || position == AuraToastPositions.bottom || this.key != null) {
return 'max-width: 100%';
}
return 'max-width: ' + this.toastService.settings.maxWidth;
}
}