import { globalState } from "../app/global-state"; export default class ResourceHelper { static loadResourcesDynamically(files: { src: string; type: 'js' | 'css'; mode?: 'normal' | 'module' }[]): Promise { return new Promise((resolve) => { const loadScript = ( src: string, mode?: 'normal' | 'module', retries = 3, ) => { return new Promise((resolve, reject) => { if (!globalState.windowExists) { resolve('Not supported for SSR'); } const attemptLoad = (attempt) => { const script = document.createElement('script'); script.src = src; script.async = true; if (mode == 'module') { script.type = 'module'; } script.onload = () => resolve(`Loaded: ${src}`); script.onerror = () => { if (attempt < retries) { const delay = Math.floor(Math.random() * (1200 - 500 + 1)) + 500; console.warn(`Retrying ${src} in ${delay}ms... (${attempt + 1}/${retries})`); setTimeout(() => attemptLoad(attempt + 1), delay); } else { reject(new Error(`Failed to load: ${src}`)); } }; document.head.appendChild(script); }; attemptLoad(0); }); }; const loadCSS = (href: string, retries = 3) => { return new Promise((resolve, reject) => { const attemptLoad = (attempt) => { const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = href; link.onload = () => resolve(`Loaded: ${href}`); link.onerror = () => { if (attempt < retries) { const delay = Math.floor(Math.random() * (1200 - 500 + 1)) + 500; console.warn(`Retrying ${href} in ${delay}ms... (${attempt + 1}/${retries})`); setTimeout(() => attemptLoad(attempt + 1), delay); } else { reject(new Error(`Failed to load: ${href}`)); } }; document.head.appendChild(link); }; attemptLoad(0); }); }; Promise.all(files.map((file) => { if (file.type == 'js') { return loadScript(file.src, file.mode).then(result => ({ status: 'fulfilled', value: result }), error => ({ status: 'rejected', reason: error })); } else if (file.type == 'css') { return loadCSS(file.src).then(result => ({ status: 'fulfilled', value: result }), error => ({ status: 'rejected', reason: error })); } else { return Promise.resolve({ status: 'rejected', reason: new Error(`Unsupported file type: ${file}`) }); } })).then((results) => { let allOk = true; results.forEach((result) => { if (result.status != 'fulfilled') { console.error((result as any).reason); allOk = false; } }); resolve(allOk); }); }); } }