about summary refs log tree commit diff
path: root/app/javascript/flavours/glitch/util/ready.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/javascript/flavours/glitch/util/ready.js')
-rw-r--r--app/javascript/flavours/glitch/util/ready.js37
1 files changed, 31 insertions, 6 deletions
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);
+    }
+  });
 }