forked from mystiq/hydrogen-web
support enabling/disabling push notifs on a session
This commit is contained in:
parent
f764323c80
commit
630e61a674
2 changed files with 57 additions and 0 deletions
|
@ -15,6 +15,7 @@ limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {Room} from "./room/Room.js";
|
import {Room} from "./room/Room.js";
|
||||||
|
import {Pusher} from "./push/Pusher.js";
|
||||||
import { ObservableMap } from "../observable/index.js";
|
import { ObservableMap } from "../observable/index.js";
|
||||||
import {User} from "./User.js";
|
import {User} from "./User.js";
|
||||||
import {DeviceMessageHandler} from "./DeviceMessageHandler.js";
|
import {DeviceMessageHandler} from "./DeviceMessageHandler.js";
|
||||||
|
@ -38,6 +39,7 @@ import {SecretStorage} from "./ssss/SecretStorage.js";
|
||||||
import {ObservableValue} from "../observable/ObservableValue.js";
|
import {ObservableValue} from "../observable/ObservableValue.js";
|
||||||
|
|
||||||
const PICKLE_KEY = "DEFAULT_KEY";
|
const PICKLE_KEY = "DEFAULT_KEY";
|
||||||
|
const PUSHER_KEY = "pusher";
|
||||||
|
|
||||||
export class Session {
|
export class Session {
|
||||||
// sessionInfo contains deviceId, userId and homeServer
|
// sessionInfo contains deviceId, userId and homeServer
|
||||||
|
@ -466,6 +468,60 @@ export class Session {
|
||||||
get user() {
|
get user() {
|
||||||
return this._user;
|
return this._user;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enablePushNotifications(enable) {
|
||||||
|
if (enable) {
|
||||||
|
return this._enablePush();
|
||||||
|
} else {
|
||||||
|
return this._disablePush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async _enablePush() {
|
||||||
|
return this._platform.logger.run("enablePush", async log => {
|
||||||
|
const defaultPayload = Pusher.createDefaultPayload(this._sessionInfo.id);
|
||||||
|
const pusher = await this._platform.notificationService.enablePush(Pusher, defaultPayload);
|
||||||
|
if (!pusher) {
|
||||||
|
log.set("no_pusher", true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
await pusher.enable(this._hsApi, log);
|
||||||
|
// store pusher data, so we know we enabled it across reloads,
|
||||||
|
// and we can disable it without too much hassle
|
||||||
|
const txn = await this._storage.readWriteTxn([this._storage.storeNames.session]);
|
||||||
|
txn.session.set(PUSHER_KEY, pusher.serialize());
|
||||||
|
await txn.complete();
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async _disablePush() {
|
||||||
|
return this._platform.logger.run("disablePush", async log => {
|
||||||
|
await this._platform.notificationService.disablePush();
|
||||||
|
const readTxn = await this._storage.readTxn([this._storage.storeNames.session]);
|
||||||
|
const pusherData = await readTxn.session.get(PUSHER_KEY);
|
||||||
|
if (!pusherData) {
|
||||||
|
// we've disabled push in the notif service at least
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
const pusher = new Pusher(pusherData);
|
||||||
|
await pusher.disable(this._hsApi, log);
|
||||||
|
const txn = await this._storage.readWriteTxn([this._storage.storeNames.session]);
|
||||||
|
txn.session.remove(PUSHER_KEY);
|
||||||
|
await txn.complete();
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async arePushNotificationsEnabled() {
|
||||||
|
if (await this._platform.notificationService.isPushEnabled()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const readTxn = await this._storage.readTxn([this._storage.storeNames.session]);
|
||||||
|
const pusherData = await readTxn.session.get(PUSHER_KEY);
|
||||||
|
return !!pusherData;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function tests() {
|
export function tests() {
|
||||||
|
|
|
@ -166,6 +166,7 @@ export class SessionContainer {
|
||||||
this._storage = await this._platform.storageFactory.create(sessionInfo.id);
|
this._storage = await this._platform.storageFactory.create(sessionInfo.id);
|
||||||
// no need to pass access token to session
|
// no need to pass access token to session
|
||||||
const filteredSessionInfo = {
|
const filteredSessionInfo = {
|
||||||
|
id: sessionInfo.id,
|
||||||
deviceId: sessionInfo.deviceId,
|
deviceId: sessionInfo.deviceId,
|
||||||
userId: sessionInfo.userId,
|
userId: sessionInfo.userId,
|
||||||
homeServer: sessionInfo.homeServer,
|
homeServer: sessionInfo.homeServer,
|
||||||
|
|
Loading…
Reference in a new issue