Convert Notifier to typescript

pull/21833/head
Michael Telatynski 2020-08-05 11:07:10 +01:00
parent c1ec41715c
commit d7229064c4
3 changed files with 29 additions and 19 deletions

View File

@ -26,6 +26,7 @@ import RoomListLayoutStore from "../stores/room-list/RoomListLayoutStore";
import {IntegrationManagers} from "../integrations/IntegrationManagers"; import {IntegrationManagers} from "../integrations/IntegrationManagers";
import {ModalManager} from "../Modal"; import {ModalManager} from "../Modal";
import SettingsStore from "../settings/SettingsStore"; import SettingsStore from "../settings/SettingsStore";
import {Notifier} from "../Notifier";
declare global { declare global {
interface Window { interface Window {
@ -45,6 +46,7 @@ declare global {
mxIntegrationManagers: typeof IntegrationManagers; mxIntegrationManagers: typeof IntegrationManagers;
singletonModalManager: ModalManager; singletonModalManager: ModalManager;
mxSettingsStore: SettingsStore; mxSettingsStore: SettingsStore;
mxNotifier: typeof Notifier;
} }
// workaround for https://github.com/microsoft/TypeScript/issues/30933 // workaround for https://github.com/microsoft/TypeScript/issues/30933
@ -77,4 +79,8 @@ declare global {
interface PromiseConstructor { interface PromiseConstructor {
allSettled<T>(promises: Promise<T>[]): Promise<Array<ISettledFulfilled<T> | ISettledRejected>>; allSettled<T>(promises: Promise<T>[]): Promise<Array<ISettledFulfilled<T> | ISettledRejected>>;
} }
interface HTMLAudioElement {
type?: string;
}
} }

View File

@ -155,6 +155,8 @@ export default abstract class BasePlatform {
loudNotification(ev: Event, room: Object) { loudNotification(ev: Event, room: Object) {
} }
clearNotification(notif: Notification) {
}
/** /**
* Returns a promise that resolves to a string representing the current version of the application. * Returns a promise that resolves to a string representing the current version of the application.

View File

@ -17,6 +17,9 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
import { MatrixEvent } from "matrix-js-sdk/src/models/event";
import { Room } from "matrix-js-sdk/src/models/room";
import { MatrixClientPeg } from './MatrixClientPeg'; import { MatrixClientPeg } from './MatrixClientPeg';
import SdkConfig from './SdkConfig'; import SdkConfig from './SdkConfig';
import PlatformPeg from './PlatformPeg'; import PlatformPeg from './PlatformPeg';
@ -28,9 +31,7 @@ import * as sdk from './index';
import { _t } from './languageHandler'; import { _t } from './languageHandler';
import Modal from './Modal'; import Modal from './Modal';
import SettingsStore from "./settings/SettingsStore"; import SettingsStore from "./settings/SettingsStore";
import { import { hideToast as hideNotificationsToast } from "./toasts/DesktopNotificationsToast";
hideToast as hideNotificationsToast,
} from "./toasts/DesktopNotificationsToast";
import {SettingLevel} from "./settings/SettingLevel"; import {SettingLevel} from "./settings/SettingLevel";
/* /*
@ -55,7 +56,7 @@ const typehandlers = {
}, },
}; };
const Notifier = { export const Notifier = {
notifsByRoom: {}, notifsByRoom: {},
// A list of event IDs that we've received but need to wait until // A list of event IDs that we've received but need to wait until
@ -63,14 +64,14 @@ const Notifier = {
// or not // or not
pendingEncryptedEventIds: [], pendingEncryptedEventIds: [],
notificationMessageForEvent: function(ev) { notificationMessageForEvent: function(ev: MatrixEvent) {
if (typehandlers.hasOwnProperty(ev.getContent().msgtype)) { if (typehandlers.hasOwnProperty(ev.getContent().msgtype)) {
return typehandlers[ev.getContent().msgtype](ev); return typehandlers[ev.getContent().msgtype](ev);
} }
return TextForEvent.textForEvent(ev); return TextForEvent.textForEvent(ev);
}, },
_displayPopupNotification: function(ev, room) { _displayPopupNotification: function(ev: MatrixEvent, room: Room) {
const plaf = PlatformPeg.get(); const plaf = PlatformPeg.get();
if (!plaf) { if (!plaf) {
return; return;
@ -125,7 +126,7 @@ const Notifier = {
} }
}, },
getSoundForRoom: function(roomId) { getSoundForRoom: function(roomId: string) {
// We do no caching here because the SDK caches setting // We do no caching here because the SDK caches setting
// and the browser will cache the sound. // and the browser will cache the sound.
const content = SettingsStore.getValue("notificationSound", roomId); const content = SettingsStore.getValue("notificationSound", roomId);
@ -153,12 +154,13 @@ const Notifier = {
}; };
}, },
_playAudioNotification: async function(ev, room) { _playAudioNotification: async function(ev: MatrixEvent, room: Room) {
const sound = this.getSoundForRoom(room.roomId); const sound = this.getSoundForRoom(room.roomId);
console.log(`Got sound ${sound && sound.name || "default"} for ${room.roomId}`); console.log(`Got sound ${sound && sound.name || "default"} for ${room.roomId}`);
try { try {
const selector = document.querySelector(sound ? `audio[src='${sound.url}']` : "#messageAudio"); const selector =
document.querySelector<HTMLAudioElement>(sound ? `audio[src='${sound.url}']` : "#messageAudio");
let audioElement = selector; let audioElement = selector;
if (!selector) { if (!selector) {
if (!sound) { if (!sound) {
@ -207,7 +209,7 @@ const Notifier = {
return plaf && plaf.supportsNotifications(); return plaf && plaf.supportsNotifications();
}, },
setEnabled: function(enable, callback) { setEnabled: function(enable: boolean, callback: () => void) {
const plaf = PlatformPeg.get(); const plaf = PlatformPeg.get();
if (!plaf) return; if (!plaf) return;
@ -280,7 +282,7 @@ const Notifier = {
return this.isEnabled() && SettingsStore.getValue("audioNotificationsEnabled"); return this.isEnabled() && SettingsStore.getValue("audioNotificationsEnabled");
}, },
setToolbarHidden: function(hidden, persistent = true) { setToolbarHidden: function(hidden: boolean, persistent = true) {
this.toolbarHidden = hidden; this.toolbarHidden = hidden;
Analytics.trackEvent('Notifier', 'Set Toolbar Hidden', hidden); Analytics.trackEvent('Notifier', 'Set Toolbar Hidden', hidden);
@ -289,7 +291,7 @@ const Notifier = {
// update the info to localStorage for persistent settings // update the info to localStorage for persistent settings
if (persistent && global.localStorage) { if (persistent && global.localStorage) {
global.localStorage.setItem("notifications_hidden", hidden); global.localStorage.setItem("notifications_hidden", String(hidden));
} }
}, },
@ -312,7 +314,7 @@ const Notifier = {
return this.toolbarHidden; return this.toolbarHidden;
}, },
onSyncStateChange: function(state) { onSyncStateChange: function(state: string) {
if (state === "SYNCING") { if (state === "SYNCING") {
this.isSyncing = true; this.isSyncing = true;
} else if (state === "STOPPED" || state === "ERROR") { } else if (state === "STOPPED" || state === "ERROR") {
@ -320,7 +322,7 @@ const Notifier = {
} }
}, },
onEvent: function(ev) { onEvent: function(ev: MatrixEvent) {
if (!this.isSyncing) return; // don't alert for any messages initially if (!this.isSyncing) return; // don't alert for any messages initially
if (ev.sender && ev.sender.userId === MatrixClientPeg.get().credentials.userId) return; if (ev.sender && ev.sender.userId === MatrixClientPeg.get().credentials.userId) return;
@ -338,7 +340,7 @@ const Notifier = {
this._evaluateEvent(ev); this._evaluateEvent(ev);
}, },
onEventDecrypted: function(ev) { onEventDecrypted: function(ev: MatrixEvent) {
// 'decrypted' means the decryption process has finished: it may have failed, // 'decrypted' means the decryption process has finished: it may have failed,
// in which case it might decrypt soon if the keys arrive // in which case it might decrypt soon if the keys arrive
if (ev.isDecryptionFailure()) return; if (ev.isDecryptionFailure()) return;
@ -350,7 +352,7 @@ const Notifier = {
this._evaluateEvent(ev); this._evaluateEvent(ev);
}, },
onRoomReceipt: function(ev, room) { onRoomReceipt: function(ev: MatrixEvent, room: Room) {
if (room.getUnreadNotificationCount() === 0) { if (room.getUnreadNotificationCount() === 0) {
// ideally we would clear each notification when it was read, // ideally we would clear each notification when it was read,
// but we have no way, given a read receipt, to know whether // but we have no way, given a read receipt, to know whether
@ -383,8 +385,8 @@ const Notifier = {
}, },
}; };
if (!global.mxNotifier) { if (!window.mxNotifier) {
global.mxNotifier = Notifier; window.mxNotifier = Notifier;
} }
export default global.mxNotifier; export default window.mxNotifier;