Merge pull request #778 from nimbleghost/pwa-defaults

Default installed PWA to web push enabled
pull/779/head
Philipp C. Heckel 2023-06-24 14:25:22 -04:00 committed by GitHub
commit 32a110b601
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 42 additions and 12 deletions

View File

@ -434,7 +434,7 @@ func (s *Server) handleInternal(w http.ResponseWriter, r *http.Request, v *visit
} else if r.Method == http.MethodGet && r.URL.Path == webConfigPath { } else if r.Method == http.MethodGet && r.URL.Path == webConfigPath {
return s.ensureWebEnabled(s.handleWebConfig)(w, r, v) return s.ensureWebEnabled(s.handleWebConfig)(w, r, v)
} else if r.Method == http.MethodGet && r.URL.Path == webManifestPath { } else if r.Method == http.MethodGet && r.URL.Path == webManifestPath {
return s.ensureWebEnabled(s.handleWebManifest)(w, r, v) return s.ensureWebPushEnabled(s.handleWebManifest)(w, r, v)
} else if r.Method == http.MethodGet && r.URL.Path == apiUsersPath { } else if r.Method == http.MethodGet && r.URL.Path == apiUsersPath {
return s.ensureAdmin(s.handleUsersGet)(w, r, v) return s.ensureAdmin(s.handleUsersGet)(w, r, v)
} else if r.Method == http.MethodPut && r.URL.Path == apiUsersPath { } else if r.Method == http.MethodPut && r.URL.Path == apiUsersPath {

View File

@ -60,7 +60,7 @@ func (s *Server) ensureWebEnabled(next handleFunc) handleFunc {
func (s *Server) ensureWebPushEnabled(next handleFunc) handleFunc { func (s *Server) ensureWebPushEnabled(next handleFunc) handleFunc {
return func(w http.ResponseWriter, r *http.Request, v *visitor) error { return func(w http.ResponseWriter, r *http.Request, v *visitor) error {
if s.config.WebPushPublicKey == "" { if s.config.WebRoot == "" || s.config.WebPushPublicKey == "" {
return errHTTPNotFound return errHTTPNotFound
} }
return next(w, r, v) return next(w, r, v)

View File

@ -239,9 +239,6 @@ func TestServer_WebEnabled(t *testing.T) {
rr = request(t, s, "GET", "/config.js", "", nil) rr = request(t, s, "GET", "/config.js", "", nil)
require.Equal(t, 404, rr.Code) require.Equal(t, 404, rr.Code)
rr = request(t, s, "GET", "/manifest.webmanifest", "", nil)
require.Equal(t, 404, rr.Code)
rr = request(t, s, "GET", "/sw.js", "", nil) rr = request(t, s, "GET", "/sw.js", "", nil)
require.Equal(t, 404, rr.Code) require.Equal(t, 404, rr.Code)
@ -261,10 +258,6 @@ func TestServer_WebEnabled(t *testing.T) {
rr = request(t, s2, "GET", "/config.js", "", nil) rr = request(t, s2, "GET", "/config.js", "", nil)
require.Equal(t, 200, rr.Code) require.Equal(t, 200, rr.Code)
rr = request(t, s2, "GET", "/manifest.webmanifest", "", nil)
require.Equal(t, 200, rr.Code)
require.Equal(t, "application/manifest+json", rr.Header().Get("Content-Type"))
rr = request(t, s2, "GET", "/sw.js", "", nil) rr = request(t, s2, "GET", "/sw.js", "", nil)
require.Equal(t, 200, rr.Code) require.Equal(t, 200, rr.Code)
@ -272,6 +265,29 @@ func TestServer_WebEnabled(t *testing.T) {
require.Equal(t, 200, rr.Code) require.Equal(t, 200, rr.Code)
} }
func TestServer_WebPushEnabled(t *testing.T) {
conf := newTestConfig(t)
conf.WebRoot = "" // Disable web app
s := newTestServer(t, conf)
rr := request(t, s, "GET", "/manifest.webmanifest", "", nil)
require.Equal(t, 404, rr.Code)
conf2 := newTestConfig(t)
s2 := newTestServer(t, conf2)
rr = request(t, s2, "GET", "/manifest.webmanifest", "", nil)
require.Equal(t, 404, rr.Code)
conf3 := newTestConfigWithWebPush(t)
s3 := newTestServer(t, conf3)
rr = request(t, s3, "GET", "/manifest.webmanifest", "", nil)
require.Equal(t, 200, rr.Code)
require.Equal(t, "application/manifest+json", rr.Header().Get("Content-Type"))
}
func TestServer_PublishLargeMessage(t *testing.T) { func TestServer_PublishLargeMessage(t *testing.T) {
c := newTestConfig(t) c := newTestConfig(t)
c.AttachmentCacheDir = "" // Disable attachments c.AttachmentCacheDir = "" // Disable attachments

View File

@ -1,4 +1,5 @@
import db from "./db"; import db from "./db";
import { isLaunchedPWA } from "./utils";
class Prefs { class Prefs {
constructor(dbImpl) { constructor(dbImpl) {
@ -34,7 +35,7 @@ class Prefs {
async webPushEnabled() { async webPushEnabled() {
const webPushEnabled = await this.db.prefs.get("webPushEnabled"); const webPushEnabled = await this.db.prefs.get("webPushEnabled");
return webPushEnabled?.value ?? false; return webPushEnabled?.value ?? isLaunchedPWA();
} }
async setWebPushEnabled(enabled) { async setWebPushEnabled(enabled) {

View File

@ -263,3 +263,16 @@ export const urlB64ToUint8Array = (base64String) => {
} }
return outputArray; return outputArray;
}; };
export const isLaunchedPWA = () => {
if (window.matchMedia("(display-mode: standalone)").matches) {
return true;
}
// iOS
if (window.navigator.standalone === true) {
return true;
}
return false;
};

View File

@ -36,7 +36,7 @@ import { Info } from "@mui/icons-material";
import { useOutletContext } from "react-router-dom"; import { useOutletContext } from "react-router-dom";
import theme from "./theme"; import theme from "./theme";
import userManager from "../app/UserManager"; import userManager from "../app/UserManager";
import { playSound, shuffle, sounds, validUrl } from "../app/utils"; import { isLaunchedPWA, playSound, shuffle, sounds, validUrl } from "../app/utils";
import session from "../app/Session"; import session from "../app/Session";
import routes from "./routes"; import routes from "./routes";
import accountApi, { Permission, Role } from "../app/AccountApi"; import accountApi, { Permission, Role } from "../app/AccountApi";
@ -86,7 +86,7 @@ const Notifications = () => {
<Sound /> <Sound />
<MinPriority /> <MinPriority />
<DeleteAfter /> <DeleteAfter />
{notifier.pushPossible() && <WebPushEnabled />} {!isLaunchedPWA() && notifier.pushPossible() && <WebPushEnabled />}
</PrefGroup> </PrefGroup>
</Card> </Card>
); );