pinstripe-document component
import { loadCache } from "./helpers.js";
export default {
initialize(...args){
this.constructor.parent.prototype.initialize.call(this, ...args);
let { loadOnInit } = this.params;
if(loadOnInit == undefined) {
loadOnInit = this.children.length == 0;
} else {
loadOnInit = loadOnInit == 'true';
}
if(loadOnInit) this.on('init', () => this.load());
},
isFrame: true,
get url(){
if(this._url === undefined){
this._url = new URL(
this.params.url || window.location,
this.frame ? this.frame.url : window.location
);
}
return this._url;
},
set url(url){
this._url = new URL(
url,
this.url
);
},
loading: false,
loadWasBlocked: false,
async load(url = this.url, options = {}){
if(this.loading) {
this.loadWasBlocked = true;
return;
};
this.loading = true;
this.abort();
const { method = 'GET', placeholderUrl } = options;
const cachedHtml = method == 'GET' ? loadCache.get(url.toString()) : undefined;
if(cachedHtml) this.patch(cachedHtml);
let minimumDelay = 0;
if(!cachedHtml && placeholderUrl){
const placeholderHtml = loadCache.get(placeholderUrl.toString());
if(placeholderHtml) {
this.patch(placeholderHtml);
minimumDelay = 300;
}
}
this.url = url;
const response = await this.fetch(url, { minimumDelay, ...options });
const html = await response.text();
this.loading = false;
if(html == cachedHtml && !this.loadWasBlocked) return;
this.loadWasBlocked = false;
if(method == 'GET') loadCache.put(url.toString(), html);
this.patch(html);
}
};