From 209a101be76d56b33c44c544305e46a087ab159c Mon Sep 17 00:00:00 2001 From: Germain Date: Tue, 27 Sep 2022 11:41:20 +0100 Subject: [PATCH] Add local notification settings capability (#2700) --- spec/unit/local_notifications.spec.ts | 43 +++++++++++++++++++++++++++ src/@types/event.ts | 15 ++++++++-- src/@types/local_notifications.ts | 19 ++++++++++++ src/client.ts | 17 +++++++++++ 4 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 spec/unit/local_notifications.spec.ts create mode 100644 src/@types/local_notifications.ts diff --git a/spec/unit/local_notifications.spec.ts b/spec/unit/local_notifications.spec.ts new file mode 100644 index 000000000..4f6f0c32a --- /dev/null +++ b/spec/unit/local_notifications.spec.ts @@ -0,0 +1,43 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { LocalNotificationSettings } from "../../src/@types/local_notifications"; +import { LOCAL_NOTIFICATION_SETTINGS_PREFIX, MatrixClient } from "../../src/matrix"; +import { TestClient } from '../TestClient'; + +let client: MatrixClient; + +describe("Local notification settings", () => { + beforeEach(() => { + client = (new TestClient( + "@alice:matrix.org", "123", undefined, undefined, undefined, + )).client; + client.setAccountData = jest.fn(); + }); + + describe("Lets you set local notification settings", () => { + it("stores settings in account data", () => { + const deviceId = "device"; + const settings: LocalNotificationSettings = { is_silenced: true }; + client.setLocalNotificationSettings(deviceId, settings); + + expect(client.setAccountData).toHaveBeenCalledWith( + `${LOCAL_NOTIFICATION_SETTINGS_PREFIX.name}.${deviceId}`, + settings, + ); + }); + }); +}); diff --git a/src/@types/event.ts b/src/@types/event.ts index 596a93592..20ef3aba5 100644 --- a/src/@types/event.ts +++ b/src/@types/event.ts @@ -200,14 +200,23 @@ export const PUSHER_ENABLED = new UnstableValue( "enabled", "org.matrix.msc3881.enabled"); +/** + * https://github.com/matrix-org/matrix-doc/pull/3881 + * + * @experimental + */ +export const PUSHER_DEVICE_ID = new UnstableValue( + "device_id", + "org.matrix.msc3881.device_id"); + /** * https://github.com/matrix-org/matrix-doc/pull/3881 * * @experimental */ -export const PUSHER_DEVICE_ID = new UnstableValue( - "device_id", - "org.matrix.msc3881.device_id"); +export const LOCAL_NOTIFICATION_SETTINGS_PREFIX = new UnstableValue( + "m.local_notification_settings", + "m.msc3890.local_notification_settings"); export interface IEncryptedFile { url: string; diff --git a/src/@types/local_notifications.ts b/src/@types/local_notifications.ts new file mode 100644 index 000000000..b92d986bd --- /dev/null +++ b/src/@types/local_notifications.ts @@ -0,0 +1,19 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +export interface LocalNotificationSettings { + is_silenced: boolean; +} diff --git a/src/client.ts b/src/client.ts index f1dd37f3d..48daeca8a 100644 --- a/src/client.ts +++ b/src/client.ts @@ -158,6 +158,7 @@ import { } from "./@types/requests"; import { EventType, + LOCAL_NOTIFICATION_SETTINGS_PREFIX, MsgType, PUSHER_ENABLED, RelationType, @@ -202,6 +203,7 @@ import { ToDeviceBatch } from "./models/ToDeviceMessage"; import { MAIN_ROOM_TIMELINE } from "./models/read-receipt"; import { IgnoredInvites } from "./models/invites-ignorer"; import { UIARequest, UIAResponse } from "./@types/uia"; +import { LocalNotificationSettings } from "./@types/local_notifications"; export type Store = IStore; @@ -8201,6 +8203,21 @@ export class MatrixClient extends TypedEventEmitter { + const key = `${LOCAL_NOTIFICATION_SETTINGS_PREFIX.name}.${deviceId}`; + return this.setAccountData(key, notificationSettings); + } + /** * Get the push rules for the account from the server. * @param {module:client.callback} callback Optional.