Skip to content

Instantly share code, notes, and snippets.

@sstur
Created February 3, 2020 04:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sstur/a47a69394375e6d5cd2838a19061dbf0 to your computer and use it in GitHub Desktop.
Save sstur/a47a69394375e6d5cd2838a19061dbf0 to your computer and use it in GitHub Desktop.
import { useEffect, useState } from 'react';
let loadedScripts: Map<string, Promise<null>> = new Map();
export default function useScript(src: string) {
let [isLoaded, setLoaded] = useState(false);
useEffect(() => {
let promise = loadedScripts.get(src) || loadScript(src);
promise.then(() => {
setLoaded(true);
});
}, []);
return isLoaded;
}
function loadScript(src: string) {
let promise: Promise<null> = new Promise((resolve, reject) => {
let script = document.createElement('script');
script.src = src;
script.async = true;
script.addEventListener('load', () => {
resolve(null);
});
script.addEventListener('error', (event: Event) => {
script.parentNode && script.parentNode.removeChild(script);
reject(event);
});
document.head && document.head.appendChild(script);
});
loadedScripts.set(src, promise);
return promise;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment