let _cache = {}; export function lookupCachedUploadUrl(shortUrl) { return _cache[shortUrl]; } export function lookupUncachedUploadUrls(urls, ajax) { return ajax("/uploads/lookup-urls", { method: "POST", data: { short_urls: urls } }).then(uploads => { uploads.forEach(upload => (_cache[upload.short_url] = upload.url)); urls.forEach(url => (_cache[url] = _cache[url] || "missing")); return uploads; }); } 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 ); } } }