diff --git a/app/assets/javascripts/pretty-text/addon/upload-short-url.js b/app/assets/javascripts/pretty-text/addon/upload-short-url.js index 2438924601e..451dd3cd1c9 100644 --- a/app/assets/javascripts/pretty-text/addon/upload-short-url.js +++ b/app/assets/javascripts/pretty-text/addon/upload-short-url.js @@ -1,5 +1,6 @@ -import I18n from "I18n"; import discourseDebounce from "discourse-common/lib/debounce"; +import I18n from "I18n"; +import { Promise } from "rsvp"; let _cache = {}; @@ -160,6 +161,15 @@ function _loadCachedShortUrls(uploadElements, siteSettings, opts) { }); } +let queueUrls; +let queuePromise; +let queueResolve; + +function queuePop(ajax) { + lookupUncachedUploadUrls(queueUrls, ajax).then(queueResolve); + queueUrls = queueResolve = null; +} + function _loadShortUrls(uploads, ajax, siteSettings, opts) { let urls = [...uploads].map((upload) => { return ( @@ -168,9 +178,20 @@ function _loadShortUrls(uploads, ajax, siteSettings, opts) { ); }); - return lookupUncachedUploadUrls(urls, ajax).then(() => - _loadCachedShortUrls(uploads, siteSettings, opts) - ); + if (!queueUrls) { + queueUrls = [...urls]; + queuePromise = new Promise((resolve) => { + queueResolve = resolve; + }); + + discourseDebounce(null, queuePop, ajax, 450); + } else { + queueUrls.push(...urls); + } + + return queuePromise.then(() => { + _loadCachedShortUrls(uploads, siteSettings, opts); + }); } const SHORT_URL_ATTRIBUTES = @@ -192,17 +213,7 @@ export function resolveAllShortUrls(ajax, siteSettings, scope, opts) { shortUploadElements = scope.querySelectorAll(SHORT_URL_ATTRIBUTES); if (shortUploadElements.length > 0) { - // this is carefully batched so we can do a leading debounce (trigger right away) - return discourseDebounce( - null, - _loadShortUrls, - shortUploadElements, - ajax, - siteSettings, - opts, - 450, - true - ); + return _loadShortUrls(shortUploadElements, ajax, siteSettings, opts); } } }