79 lines
2.0 KiB
TypeScript
79 lines
2.0 KiB
TypeScript
"use strict";
|
|
// License: MIT
|
|
|
|
import { extension, notifications } from "./browser";
|
|
|
|
import {EventEmitter} from "./events";
|
|
|
|
const DEFAULTS = {
|
|
type: "basic",
|
|
iconUrl: extension.getURL("/style/icon64.png"),
|
|
title: "DownThemAll!",
|
|
message: "message",
|
|
};
|
|
|
|
const TIMEOUT = 4000;
|
|
|
|
let gid = 1;
|
|
|
|
export class Notification extends EventEmitter {
|
|
private notification: any;
|
|
|
|
private readonly generated: boolean;
|
|
|
|
constructor(id: string | null, options = {}) {
|
|
super();
|
|
|
|
this.generated = !id;
|
|
id = id || `DownThemAll-notification${++gid}`;
|
|
if (typeof options === "string") {
|
|
options = {message: options};
|
|
}
|
|
options = Object.assign(Object.assign({}, DEFAULTS), options);
|
|
|
|
this.opened = this.opened.bind(this);
|
|
this.closed = this.closed.bind(this);
|
|
this.clicked = this.clicked.bind(this);
|
|
|
|
this.notification = notifications.create(id, options);
|
|
|
|
this.notification.then(this.opened).catch(console.error);
|
|
notifications.onClosed.addListener(this.closed);
|
|
notifications.onClicked.addListener(this.clicked);
|
|
notifications.onButtonClicked.addListener(this.clicked);
|
|
}
|
|
|
|
opened(notification: any) {
|
|
this.notification = notification;
|
|
this.emit("opened", this);
|
|
if (this.generated) {
|
|
setTimeout(() => {
|
|
notifications.clear(notification);
|
|
}, TIMEOUT);
|
|
}
|
|
}
|
|
|
|
clicked(notification: any, button?: number) {
|
|
// We can only be clicked, when we were opened, at which point the
|
|
// notification id is available
|
|
if (notification !== this.notification) {
|
|
return;
|
|
}
|
|
if (typeof button === "number") {
|
|
this.emit("button", this, button);
|
|
return;
|
|
}
|
|
this.emit("clicked", this);
|
|
console.log("clicked", notification);
|
|
}
|
|
|
|
async closed(notification: any) {
|
|
if (notification !== await this.notification) {
|
|
return;
|
|
}
|
|
notifications.onClosed.removeListener(this.closed);
|
|
notifications.onClicked.removeListener(this.clicked);
|
|
this.emit("closed", this);
|
|
}
|
|
}
|