| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- const waitSeconds = 100;
- const head = document.getElementsByTagName('head')[0];
- // get all link tags in the page
- const links = document.getElementsByTagName('link');
- const linkHrefs = [];
- for (let i = 0; i < links.length; i++) {
- linkHrefs.push(links[i].href);
- }
- const isWebkit = !!window.navigator.userAgent.match(/AppleWebKit\/([^ ;]*)/);
- const webkitLoadCheck = (link, callback) => {
- setTimeout(() => {
- for (let i = 0; i < document.styleSheets.length; i++) {
- const sheet = document.styleSheets[i];
- if (sheet.href === link.href) {
- return callback();
- }
- }
- webkitLoadCheck(link, callback);
- }, 10);
- };
- const noop = () => {};
- const loadCSS = url => {
- return new Promise((resolve, reject) => {
- const link = document.createElement('link');
- const timeout = setTimeout(() => {
- reject('Unable to load CSS');
- }, waitSeconds * 1000);
- const _callback = error => {
- clearTimeout(timeout);
- link.onload = link.onerror = noop;
- setTimeout(() => {
- if (error) {
- reject(error);
- } else {
- resolve('');
- }
- }, 7);
- };
- link.type = 'text/css';
- link.rel = 'stylesheet';
- link.href = url;
- if (!isWebkit) {
- link.onload = () => {
- _callback(undefined);
- };
- } else {
- webkitLoadCheck(link, _callback);
- }
- link.onerror = (evt: any) => {
- _callback(evt.error || new Error('Error loading CSS file.'));
- };
- head.appendChild(link);
- });
- };
- export function fetch(load): any {
- if (typeof window === 'undefined') {
- return '';
- }
- // don't reload styles loaded in the head
- for (let i = 0; i < linkHrefs.length; i++) {
- if (load.address === linkHrefs[i]) {
- return '';
- }
- }
- return loadCSS(load.address);
- }
|