From 232311aa8c8e879c98dc061ac1755ee4d0dd9b0f Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 13 Nov 2017 12:08:11 +1100 Subject: [PATCH] FIX: missing short image resolution on queued posts --- .../components/composer-editor.js.es6 | 36 ++----------------- .../discourse/components/cook-text.js.es6 | 12 ++++++- .../pretty-text/image-short-url.js.es6 | 32 +++++++++++++++++ 3 files changed, 46 insertions(+), 34 deletions(-) diff --git a/app/assets/javascripts/discourse/components/composer-editor.js.es6 b/app/assets/javascripts/discourse/components/composer-editor.js.es6 index 8c5dc774758..9a9b33aba0d 100644 --- a/app/assets/javascripts/discourse/components/composer-editor.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-editor.js.es6 @@ -13,9 +13,7 @@ import { tinyAvatar, displayErrorForUpload, getUploadMarkdown, validateUploadedFiles } from 'discourse/lib/utilities'; -import { lookupCachedUploadUrl, - lookupUncachedUploadUrls, - cacheShortUploadUrl } from 'pretty-text/image-short-url'; +import { cacheShortUploadUrl, resolveAllShortUrls } from 'pretty-text/image-short-url'; export default Ember.Component.extend({ classNameBindings: ['showToolbar:toolbar-visible', ':wmd-controls'], @@ -180,24 +178,6 @@ export default Ember.Component.extend({ $oneboxes.each((_, o) => load(o, refresh, ajax, this.currentUser.id)); }, - _loadShortUrls($images) { - const urls = _.map($images, img => $(img).data('orig-src')); - lookupUncachedUploadUrls(urls, ajax).then(() => this._loadCachedShortUrls($images)); - }, - - _loadCachedShortUrls($images) { - $images.each((idx, image) => { - let $image = $(image); - let url = lookupCachedUploadUrl($image.data('orig-src')); - if (url) { - $image.removeAttr('data-orig-src'); - if (url !== "missing") { - $image.attr('src', url); - } - } - }); - }, - _warnMentionedGroups($preview) { Ember.run.scheduleOnce('afterRender', () => { var found = this.get('warnedGroupMentions') || []; @@ -584,18 +564,8 @@ export default Ember.Component.extend({ Ember.run.debounce(this, this._loadOneboxes, $oneboxes, 450); } - // Short upload urls - let $shortUploadUrls = $('img[data-orig-src]'); - - if ($shortUploadUrls.length > 0) { - this._loadCachedShortUrls($shortUploadUrls); - - $shortUploadUrls = $('img[data-orig-src]'); - if ($shortUploadUrls.length > 0) { - // this is carefully batched so we can do an leading debounce (trigger right away) - Ember.run.debounce(this, this._loadShortUrls, $shortUploadUrls, 450, true); - } - } + // Short upload urls need resolution + resolveAllShortUrls(ajax); let inline = {}; $('a.inline-onebox-loading', $preview).each(function(index, link) { diff --git a/app/assets/javascripts/discourse/components/cook-text.js.es6 b/app/assets/javascripts/discourse/components/cook-text.js.es6 index 80ed6935632..60a96295c89 100644 --- a/app/assets/javascripts/discourse/components/cook-text.js.es6 +++ b/app/assets/javascripts/discourse/components/cook-text.js.es6 @@ -1,4 +1,5 @@ import { cookAsync } from 'discourse/lib/text'; +import { ajax } from 'discourse/lib/ajax'; const CookText = Ember.Component.extend({ tagName: '', @@ -6,7 +7,16 @@ const CookText = Ember.Component.extend({ didReceiveAttrs() { this._super(...arguments); - cookAsync(this.get('rawText')).then(cooked => this.set('cooked', cooked)); + cookAsync(this.get('rawText')).then( + cooked => { + this.set('cooked', cooked); + // no choice but to defer this cause + // pretty text may only be loaded now + Em.run.next(() => + window.requireModule('pretty-text/image-short-url').resolveAllShortUrls(ajax) + ); + } + ); } }); diff --git a/app/assets/javascripts/pretty-text/image-short-url.js.es6 b/app/assets/javascripts/pretty-text/image-short-url.js.es6 index d815b46696c..4efcefaec37 100644 --- a/app/assets/javascripts/pretty-text/image-short-url.js.es6 +++ b/app/assets/javascripts/pretty-text/image-short-url.js.es6 @@ -16,3 +16,35 @@ export function lookupUncachedUploadUrls(urls, ajax) { export function cacheShortUploadUrl(shortUrl, url) { _cache[shortUrl] = url; } + +function _loadCachedShortUrls($images) { + $images.each((idx, image) => { + let $image = $(image); + let url = lookupCachedUploadUrl($image.data('orig-src')); + if (url) { + $image.removeAttr('data-orig-src'); + if (url !== "missing") { + $image.attr('src', url); + } + } + }); +} + +function _loadShortUrls($images, ajax) { + const urls = _.map($images, img => $(img).data('orig-src')); + lookupUncachedUploadUrls(urls, ajax).then(() => _loadCachedShortUrls($images)); +} + +export function resolveAllShortUrls(ajax) { + let $shortUploadUrls = $('img[data-orig-src]'); + + if ($shortUploadUrls.length > 0) { + _loadCachedShortUrls($shortUploadUrls); + + $shortUploadUrls = $('img[data-orig-src]'); + if ($shortUploadUrls.length > 0) { + // this is carefully batched so we can do a leading debounce (trigger right away) + Ember.run.debounce(null, () => { _loadShortUrls($shortUploadUrls, ajax); }, 450, true); + } + } +}