From 2a499cec42f61dcab5d68c74f412e9e116c7c962 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20K=C4=99drzy=C5=84ski?= Date: Wed, 12 Jul 2023 09:05:10 +0200 Subject: [PATCH] feat(dom): added loadScript helper --- packages/dom/src/index.ts | 1 + packages/dom/src/loadScript.ts | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 packages/dom/src/loadScript.ts diff --git a/packages/dom/src/index.ts b/packages/dom/src/index.ts index fdd7d84..e8a14ee 100644 --- a/packages/dom/src/index.ts +++ b/packages/dom/src/index.ts @@ -2,5 +2,6 @@ export * from './virtualHistory.js'; export * from './requestIdleCallback.js'; export * from './isBrowser.js'; export * from './localStorageUtils.js'; +export * from './loadScript.js'; export * from './getOuterHeight.js'; export * from './scrollToTopElement.js'; diff --git a/packages/dom/src/loadScript.ts b/packages/dom/src/loadScript.ts new file mode 100644 index 0000000..1f03df9 --- /dev/null +++ b/packages/dom/src/loadScript.ts @@ -0,0 +1,23 @@ +const scripts: { [key: string]: Promise | undefined } = {}; + +/** + * Loads a given script into the page. + * If script was already loaded, it won't load it again + */ +export function loadScript(url: string) { + if (scripts[url]) { + return scripts[url]; + } + + const scriptTag = document.createElement('script'); + + return new Promise((resolve, reject) => { + scriptTag.src = url; + scriptTag.onload = () => resolve(); + scriptTag.onerror = () => { + document.body.removeChild(scriptTag); + reject(); + }; + document.body.appendChild(scriptTag); + }); +}