diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts index e2bfafe7..469ef59c 100644 --- a/src/@types/global.d.ts +++ b/src/@types/global.d.ts @@ -31,6 +31,12 @@ declare global { // https://developer.mozilla.org/en-US/docs/Web/API/InstallTrigger InstallTrigger: any; } + + interface Navigator { + // PWA badging extensions https://w3c.github.io/badging/ + setAppBadge?(count: number): Promise; + clearAppBadge?(): Promise; + } } // add method which is missing from the node typing diff --git a/src/vector/init.tsx b/src/vector/init.tsx index 82c5931b..043ae0ba 100644 --- a/src/vector/init.tsx +++ b/src/vector/init.tsx @@ -26,6 +26,7 @@ import * as React from "react"; import * as languageHandler from "matrix-react-sdk/src/languageHandler"; import SettingsStore from "matrix-react-sdk/src/settings/SettingsStore"; import ElectronPlatform from "./platform/ElectronPlatform"; +import PWAPlatform from "./platform/PWAPlatform"; import WebPlatform from "./platform/WebPlatform"; import PlatformPeg from "matrix-react-sdk/src/PlatformPeg"; import SdkConfig from "matrix-react-sdk/src/SdkConfig"; @@ -39,8 +40,10 @@ export const rageshakePromise = initRageshake(); export function preparePlatform() { if (window.ipcRenderer) { console.log("Using Electron platform"); - const plaf = new ElectronPlatform(); - PlatformPeg.set(plaf); + PlatformPeg.set(new ElectronPlatform()); + } else if (window.matchMedia('(display-mode: standalone)').matches) { + console.log("Using PWA platform"); + PlatformPeg.set(new PWAPlatform()); } else { console.log("Using Web platform"); PlatformPeg.set(new WebPlatform()); diff --git a/src/vector/platform/PWAPlatform.ts b/src/vector/platform/PWAPlatform.ts new file mode 100644 index 00000000..cca3a8e7 --- /dev/null +++ b/src/vector/platform/PWAPlatform.ts @@ -0,0 +1,29 @@ +/* +Copyright 2020 New Vector Ltd + +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 WebPlatform from "./WebPlatform"; + +export default class PWAPlatform extends WebPlatform { + setNotificationCount(count: number) { + if (!navigator.setAppBadge) return super.setNotificationCount(count); + if (this.notificationCount === count) return; + this.notificationCount = count; + + navigator.setAppBadge(count).catch(e => { + console.error("Failed to update PWA app badge", e); + }); + } +}