about summary refs log tree commit diff
path: root/app/javascript
diff options
context:
space:
mode:
authorYamagishi Kazutoshi <ykzts@desire.sh>2022-10-04 01:15:47 +0900
committerGitHub <noreply@github.com>2022-10-03 18:15:47 +0200
commit216dbaedaf587db834cfdd53b896e9c7e1284d9c (patch)
tree7b03a9e780675f0cd4a35795a0d32cabd663ec44 /app/javascript
parent37eaa7fc01d8e9cbd06a62cc9ac4b3bd4d835240 (diff)
Disable push notification when not logged in (#19272)
Diffstat (limited to 'app/javascript')
-rw-r--r--app/javascript/mastodon/actions/push_notifications/index.js26
-rw-r--r--app/javascript/mastodon/main.js41
-rw-r--r--app/javascript/mastodon/ready.js37
-rw-r--r--app/javascript/packs/application.js6
4 files changed, 71 insertions, 39 deletions
diff --git a/app/javascript/mastodon/actions/push_notifications/index.js b/app/javascript/mastodon/actions/push_notifications/index.js
index 2ffec500a..9dcc4bd4b 100644
--- a/app/javascript/mastodon/actions/push_notifications/index.js
+++ b/app/javascript/mastodon/actions/push_notifications/index.js
@@ -1,19 +1,5 @@
-import {
-  SET_BROWSER_SUPPORT,
-  SET_SUBSCRIPTION,
-  CLEAR_SUBSCRIPTION,
-  SET_ALERTS,
-  setAlerts,
-} from './setter';
-import { register, saveSettings } from './registerer';
-
-export {
-  SET_BROWSER_SUPPORT,
-  SET_SUBSCRIPTION,
-  CLEAR_SUBSCRIPTION,
-  SET_ALERTS,
-  register,
-};
+import { setAlerts } from './setter';
+import { saveSettings } from './registerer';
 
 export function changeAlerts(path, value) {
   return dispatch => {
@@ -21,3 +7,11 @@ export function changeAlerts(path, value) {
     dispatch(saveSettings());
   };
 }
+
+export {
+  CLEAR_SUBSCRIPTION,
+  SET_BROWSER_SUPPORT,
+  SET_SUBSCRIPTION,
+  SET_ALERTS,
+} from './setter';
+export { register } from './registerer';
diff --git a/app/javascript/mastodon/main.js b/app/javascript/mastodon/main.js
index a66975bfd..f33375b50 100644
--- a/app/javascript/mastodon/main.js
+++ b/app/javascript/mastodon/main.js
@@ -1,12 +1,14 @@
 import React from 'react';
 import ReactDOM from 'react-dom';
-import * as registerPushNotifications from 'mastodon/actions/push_notifications';
 import { setupBrowserNotifications } from 'mastodon/actions/notifications';
 import Mastodon, { store } from 'mastodon/containers/mastodon';
 import ready from 'mastodon/ready';
 
-const perf = require('./performance');
+const perf = require('mastodon/performance');
 
+/**
+ * @returns {Promise<void>}
+ */
 function main() {
   perf.start('main()');
 
@@ -18,7 +20,7 @@ function main() {
     }
   }
 
-  ready(() => {
+  return ready(async () => {
     const mountNode = document.getElementById('mastodon');
     const props = JSON.parse(mountNode.getAttribute('data-props'));
 
@@ -26,19 +28,28 @@ function main() {
     store.dispatch(setupBrowserNotifications());
 
     if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
-      import('workbox-window')
-        .then(({ Workbox }) => {
-          const wb = new Workbox('/sw.js');
-
-          return wb.register();
-        })
-        .then(() => {
-          store.dispatch(registerPushNotifications.register());
-        })
-        .catch(err => {
-          console.error(err);
-        });
+      const [{ Workbox }, { me }] = await Promise.all([
+        import('workbox-window'),
+        import('mastodon/initial_state'),
+      ]);
+
+      const wb = new Workbox('/sw.js');
+
+      try {
+        await wb.register();
+      } catch (err) {
+        console.error(err);
+
+        return;
+      }
+
+      if (me) {
+        const registerPushNotifications = await import('mastodon/actions/push_notifications');
+
+        store.dispatch(registerPushNotifications.register());
+      }
     }
+
     perf.stop('main()');
   });
 }
diff --git a/app/javascript/mastodon/ready.js b/app/javascript/mastodon/ready.js
index dd543910b..e769cc756 100644
--- a/app/javascript/mastodon/ready.js
+++ b/app/javascript/mastodon/ready.js
@@ -1,7 +1,32 @@
-export default function ready(loaded) {
-  if (['interactive', 'complete'].includes(document.readyState)) {
-    loaded();
-  } else {
-    document.addEventListener('DOMContentLoaded', loaded);
-  }
+// @ts-check
+
+/**
+ * @param {(() => void) | (() => Promise<void>)} callback
+ * @returns {Promise<void>}
+ */
+export default function ready(callback) {
+  return new Promise((resolve, reject) => {
+    function loaded() {
+      let result;
+      try {
+        result = callback();
+      } catch (err) {
+        reject(err);
+
+        return;
+      }
+
+      if (typeof result?.then === 'function') {
+        result.then(resolve).catch(reject);
+      } else {
+        resolve();
+      }
+    }
+
+    if (['interactive', 'complete'].includes(document.readyState)) {
+      loaded();
+    } else {
+      document.addEventListener('DOMContentLoaded', loaded);
+    }
+  });
 }
diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js
index 91240aecf..0851f69b6 100644
--- a/app/javascript/packs/application.js
+++ b/app/javascript/packs/application.js
@@ -4,8 +4,10 @@ import { start } from '../mastodon/common';
 
 start();
 
-loadPolyfills().then(() => {
-  require('../mastodon/main').default();
+loadPolyfills().then(async () => {
+  const { default: main } = import('mastodon/main');
+
+  return main();
 }).catch(e => {
   console.error(e);
 });