From 513f8e73d40bf9a2de8d2c681e011b019e1d75d2 Mon Sep 17 00:00:00 2001
From: ansuz <ansuz@transitiontech.ca>
Date: Thu, 14 Sep 2017 11:23:37 +0200
Subject: [PATCH] refactor cryptpad.ready to use nthen

---
 www/common/cryptpad-common.js | 267 ++++++++++++++++------------------
 1 file changed, 127 insertions(+), 140 deletions(-)

diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js
index 9ff1bddac..6708b39c2 100644
--- a/www/common/cryptpad-common.js
+++ b/www/common/cryptpad-common.js
@@ -20,9 +20,10 @@ define([
     '/common/pinpad.js',
     '/customize/application_config.js',
     '/common/media-tag.js',
+    '/bower_components/nthen/index.js',
 ], function ($, Config, Messages, Store, Util, Hash, UI, History, UserList, Title, Metadata,
             Messaging, CodeMirror, Files, FileCrypto, Realtime, Clipboard,
-            Pinpad, AppConfig, MediaTag) {
+            Pinpad, AppConfig, MediaTag, Nthen) {
 
     // Configure MediaTags to use our local viewer
     if (MediaTag && MediaTag.PdfPlugin) {
@@ -2071,54 +2072,12 @@ define([
 
     return function (f) {
         if (initialized) {
-            return void window.setTimeout(function () {
-                f(void 0, env);
-            });
-        }
-        var block = 0;
-
-        var cb = function () {
-            block--;
-            if (!block) {
-                initialized = true;
-
-                updateLocalVersion();
-                common.addTooltips();
-                f(void 0, env);
-                if (typeof(window.onhashchange) === 'function') { window.onhashchange(); }
-            }
-        };
-
-        if (sessionStorage[newPadNameKey]) {
-            common.initialName = sessionStorage[newPadNameKey];
-            delete sessionStorage[newPadNameKey];
-        }
-        if (sessionStorage[newPadPathKey]) {
-            common.initialPath = sessionStorage[newPadPathKey];
-            delete sessionStorage[newPadPathKey];
+            return void setTimeout(function () { f(void 0, env); });
         }
 
-        common.onFriendRequest = function (confirmText, cb) {
-            common.confirm(confirmText, cb, null, true);
-        };
-        common.onFriendComplete = function (data) {
-            common.log(data.logText);
-        };
-
-        Store.ready(function (err, storeObj) {
-            store = common.store = env.store = storeObj;
-            common.addDirectMessageHandler(common);
-
-            var proxy = getProxy();
-            var network = getNetwork();
-
-            network.on('disconnect', function () {
-                Realtime.setConnectionState(false);
-            });
-            network.on('reconnect', function () {
-                Realtime.setConnectionState(true);
-            });
-
+        var proxy;
+        var network;
+        var provideFeedback = function () {
             if (Object.keys(proxy).length === 1) {
                 feedback("FIRST_APP_USE", true);
             }
@@ -2141,110 +2100,138 @@ define([
             }
             common.reportScreenDimensions();
             common.reportLanguage();
+        };
 
-            $(function() {
-                // Race condition : if document.body is undefined when alertify.js is loaded, Alertify
-                // won't work. We have to reset it now to make sure it uses a correct "body"
-                UI.Alertify.reset();
-                // clear any tooltips that might get hung
-                setInterval(function () { common.clearTooltips(); }, 5000);
-
-                // Load the new pad when the hash has changed
-                var oldHref  = document.location.href;
-                window.onhashchange = function () {
-                    var newHref = document.location.href;
-                    var parsedOld = parsePadUrl(oldHref).hashData;
-                    var parsedNew = parsePadUrl(newHref).hashData;
-                    if (parsedOld && parsedNew && (
-                          parsedOld.type !== parsedNew.type
-                          || parsedOld.channel !== parsedNew.channel
-                          || parsedOld.mode !== parsedNew.mode
-                          || parsedOld.key !== parsedNew.key)) {
-                        if (!parsedOld.channel) { oldHref = newHref; return; }
-                        document.location.reload();
-                        return;
-                    }
-                    if (parsedNew) {
-                        oldHref = newHref;
-                    }
-                };
-
-                if (PINNING_ENABLED && isLoggedIn()) {
-                    console.log("logged in. pads will be pinned");
-                    block++;
-
-                    Pinpad.create(network, proxy, function (e, call) {
-                        if (e) {
-                            console.error(e);
-                            return cb();
-                        }
-
-                        console.log('RPC handshake complete');
-                        rpc = common.rpc = env.rpc = call;
-
-                        common.getPinLimit(function (e, limit, plan, note) {
-                            if (e) { return void console.error(e); }
-                            common.account.limit = limit;
-                            localStorage.plan = common.account.plan = plan;
-                            common.account.note = note;
-                            cb();
-                        });
-
-                        common.arePinsSynced(function (err, yes) {
-                            if (!yes) {
-                                common.resetPins(function (err) {
-                                    if (err) {
-                                        console.error("Pin Reset Error");
-                                        return console.error(err);
-                                    }
-                                    console.log('RESET DONE');
-                                });
-                            }
-                        });
-                    });
-                } else if (PINNING_ENABLED) {
-                    console.log('not logged in. pads will not be pinned');
-                } else {
-                    console.log('pinning disabled');
-                }
-
-                block++;
-                require([
-                    '/common/rpc.js',
-                ], function (Rpc) {
-                    Rpc.createAnonymous(network, function (e, call) {
-                        if (e) {
-                            console.error(e);
-                            return void cb();
-                        }
-                        anon_rpc = common.anon_rpc = env.anon_rpc = call;
-                        cb();
-                    });
+        Nthen(function (waitFor) {
+            if (sessionStorage[newPadNameKey]) {
+                common.initialName = sessionStorage[newPadNameKey];
+                delete sessionStorage[newPadNameKey];
+            }
+            if (sessionStorage[newPadPathKey]) {
+                common.initialPath = sessionStorage[newPadPathKey];
+                delete sessionStorage[newPadPathKey];
+            }
+            common.onFriendRequest = function (confirmText, cb) {
+                common.confirm(confirmText, cb, null, true);
+            };
+            common.onFriendComplete = function (data) {
+                common.log(data.logText);
+            };
+        }).nThen(function (waitFor) {
+            Store.ready(waitFor(function (err, storeObj) {
+                store = common.store = env.store = storeObj;
+                common.addDirectMessageHandler(common);
+                proxy = getProxy();
+                network = getNetwork();
+                network.on('disconnect', function () {
+                    Realtime.setConnectionState(false);
                 });
+                network.on('reconnect', function () {
+                    Realtime.setConnectionState(true);
+                });
+                provideFeedback();
+            }), common);
+        }).nThen(function (waitFor) {
+            $(waitFor());
+        }).nThen(function (waitFor) {
+            // Race condition : if document.body is undefined when alertify.js is loaded, Alertify
+            // won't work. We have to reset it now to make sure it uses a correct "body"
+            UI.Alertify.reset();
+            // clear any tooltips that might get hung
+            setInterval(function () { common.clearTooltips(); }, 5000);
 
-
-                // Everything's ready, continue...
-                if($('#pad-iframe').length) {
-                    block++;
-                    var $iframe = $('#pad-iframe');
-                    var iframe = $iframe[0];
-                    var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
-                    if (iframeDoc.readyState === 'complete') {
-                        cb();
-                        return;
-                    }
-                    $iframe.load(cb);
+            // Load the new pad when the hash has changed
+            var oldHref  = document.location.href;
+            window.onhashchange = function () {
+                var newHref = document.location.href;
+                var parsedOld = parsePadUrl(oldHref).hashData;
+                var parsedNew = parsePadUrl(newHref).hashData;
+                if (parsedOld && parsedNew && (
+                      parsedOld.type !== parsedNew.type
+                      || parsedOld.channel !== parsedNew.channel
+                      || parsedOld.mode !== parsedNew.mode
+                      || parsedOld.key !== parsedNew.key)) {
+                    if (!parsedOld.channel) { oldHref = newHref; return; }
+                    document.location.reload();
                     return;
                 }
+                if (parsedNew) { oldHref = newHref; }
+            };
 
-                block++;
-                cb();
+            if (PINNING_ENABLED && isLoggedIn()) {
+                console.log("logged in. pads will be pinned");
+                var w0 = waitFor();
+                Pinpad.create(network, proxy, function (e, call) {
+                    if (e) {
+                        console.error(e);
+                        return w0();
+                    }
+
+                    console.log('RPC handshake complete');
+                    rpc = common.rpc = env.rpc = call;
+
+                    common.getPinLimit(function (e, limit, plan, note) {
+                        if (e) { return void console.error(e); }
+                        common.account.limit = limit;
+                        localStorage.plan = common.account.plan = plan;
+                        common.account.note = note;
+                        w0();
+                    });
+
+                    common.arePinsSynced(function (err, yes) {
+                        if (!yes) {
+                            common.resetPins(function (err) {
+                                if (err) {
+                                    console.error("Pin Reset Error");
+                                    return console.error(err);
+                                }
+                                console.log('RESET DONE');
+                            });
+                        }
+                    });
+                });
+            } else if (PINNING_ENABLED) {
+                console.log('not logged in. pads will not be pinned');
+            } else {
+                console.log('pinning disabled');
+            }
+
+            var w1 = waitFor();
+            require([
+                '/common/rpc.js',
+            ], function (Rpc) {
+                Rpc.createAnonymous(network, function (e, call) {
+                    if (e) {
+                        console.error(e);
+                        return void w1();
+                    }
+                    anon_rpc = common.anon_rpc = env.anon_rpc = call;
+                    w1();
+                });
             });
-        }, common);
+
+            // Everything's ready, continue...
+            if($('#pad-iframe').length) {
+                var w2 = waitFor();
+                var $iframe = $('#pad-iframe');
+                var iframe = $iframe[0];
+                var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
+                if (iframeDoc.readyState === 'complete') {
+                    return void w2();
+                }
+                $iframe.load(w2); //cb);
+            }
+        }).nThen(function () {
+            updateLocalVersion();
+            common.addTooltips();
+            f(void 0, env);
+            if (typeof(window.onhashchange) === 'function') { window.onhashchange(); }
+        });
     };
 
     }());
 
+    // MAGIC that happens implicitly
     $(function () {
         Messages._applyTranslation();
     });