about summary refs log tree commit diff
path: root/app/javascript/flavours/glitch/util
diff options
context:
space:
mode:
authorYamagishi Kazutoshi <ykzts@desire.sh>2022-10-04 01:15:47 +0900
committerClaire <claire.github-309c@sitedethib.com>2022-10-09 18:23:15 +0200
commitcc93cd5d6cf302140d9df56e64dc6e902ce56708 (patch)
tree86d6d0aa5784167f85657dfe797cc3674252a217 /app/javascript/flavours/glitch/util
parentd86cb4cab89e99afae8ebf49e4276b40d444c498 (diff)
[Glitch] Disable push notification when not logged in
Port 216dbaedaf587db834cfdd53b896e9c7e1284d9c to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
Diffstat (limited to 'app/javascript/flavours/glitch/util')
-rw-r--r--app/javascript/flavours/glitch/util/main.js41
-rw-r--r--app/javascript/flavours/glitch/util/ready.js37
2 files changed, 57 insertions, 21 deletions
diff --git a/app/javascript/flavours/glitch/util/main.js b/app/javascript/flavours/glitch/util/main.js
index 9e76774b6..b4e6bc151 100644
--- a/app/javascript/flavours/glitch/util/main.js
+++ b/app/javascript/flavours/glitch/util/main.js
@@ -1,12 +1,14 @@
 import React from 'react';
 import ReactDOM from 'react-dom';
-import * as registerPushNotifications from 'flavours/glitch/actions/push_notifications';
 import { setupBrowserNotifications } from 'flavours/glitch/actions/notifications';
 import Mastodon, { store } from 'flavours/glitch/containers/mastodon';
 import ready from 'flavours/glitch/util/ready';
 
-const perf = require('./performance');
+const perf = require('flavours/glitch/util/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('flavours/glitch/actions/push_notifications');
+
+        store.dispatch(registerPushNotifications.register());
+      }
     }
+
     perf.stop('main()');
   });
 }
diff --git a/app/javascript/flavours/glitch/util/ready.js b/app/javascript/flavours/glitch/util/ready.js
index dd543910b..e769cc756 100644
--- a/app/javascript/flavours/glitch/util/ready.js
+++ b/app/javascript/flavours/glitch/util/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);
+    }
+  });
 }