/** * Utility for dynamically loading external scripts */ interface ScriptLoadOptions { src: string; id?: string; async?: boolean; defer?: boolean; onLoad?: () => void; } const loadedScripts = new Set(); export function loadScript({ src, id, async = true, defer = false, onLoad }: ScriptLoadOptions): Promise { return new Promise((resolve, reject) => { // Check if already loaded const scriptId = id || src; if (loadedScripts.has(scriptId)) { resolve(); return; } // Check if script already exists in DOM const existingScript = id ? document.getElementById(id) : document.querySelector(`script[src="${src}"]`); if (existingScript) { loadedScripts.add(scriptId); resolve(); return; } // Create and append script const script = document.createElement('script'); script.src = src; if (id) script.id = id; script.async = async; script.defer = defer; script.onload = () => { loadedScripts.add(scriptId); if (onLoad) onLoad(); resolve(); }; script.onerror = () => { reject(new Error(`Failed to load script: ${src}`)); }; document.head.appendChild(script); }); } export function isScriptLoaded(idOrSrc: string): boolean { return loadedScripts.has(idOrSrc); }