discourse/app/assets/javascripts/pretty-text/oneboxer.js.es6

55 lines
1.3 KiB
JavaScript

/**
A helper for looking up oneboxes and displaying them
For now it only stores in a local Javascript Object, in future we can change it so it uses localStorage
or some other mechanism.
**/
const localCache = {};
const failedCache = {};
// Perform a lookup of a onebox based an anchor element. It will insert a loading
// indicator and remove it when the loading is complete or fails.
export function load(e, refresh, ajax) {
var $elem = $(e);
// If the onebox has loaded, return
if ($elem.data('onebox-loaded')) return;
if ($elem.hasClass('loading-onebox')) return;
const url = e.href;
// Unless we're forcing a refresh...
if (!refresh) {
// If we have it in our cache, return it.
const cached = localCache[url];
if (cached) return cached;
// If the request failed, don't do anything
const failed = failedCache[url];
if (failed) return;
}
// Add the loading CSS class
$elem.addClass('loading-onebox');
// Retrieve the onebox
return ajax("/onebox", {
dataType: 'html',
data: { url, refresh },
cache: true
}).then(html => {
localCache[url] = html;
$elem.replaceWith(html);
}, function() {
failedCache[url] = true;
}).finally(() => {
$elem.removeClass('loading-onebox');
$elem.data('onebox-loaded');
});
}
export function lookupCache(url) {
return localCache[url];
}