{"version":3,"file":"load-script.mjs","sources":["../../src/load-script.tsx"],"sourcesContent":["import {useState, useEffect} from 'react';\n\nconst SCRIPTS_LOADED: Record<string, Promise<boolean>> = {};\n\ntype LoadScriptOptions = {\n  module?: boolean;\n  in?: 'head' | 'body';\n  attributes?: Record<string, string>;\n};\n\nexport function loadScript(\n  src: string,\n  options?: LoadScriptOptions,\n): Promise<boolean> {\n  const isScriptLoaded = SCRIPTS_LOADED[src];\n\n  // eslint-disable-next-line @typescript-eslint/no-misused-promises\n  if (isScriptLoaded) {\n    return isScriptLoaded;\n  }\n\n  const promise = new Promise<boolean>((resolve, reject) => {\n    const script = document.createElement('script');\n    if (options?.module) {\n      script.type = 'module';\n    } else {\n      script.type = 'text/javascript';\n    }\n    script.src = src;\n    script.onload = (): void => {\n      resolve(true);\n    };\n    script.onerror = (): void => {\n      reject(false);\n    };\n    if (options?.in === 'head') {\n      document.head.appendChild(script);\n    } else {\n      document.body.appendChild(script);\n    }\n\n    const attributes = options?.attributes;\n    if (attributes) {\n      Object.keys(attributes).forEach((key) => {\n        script.setAttribute(key, attributes[key]);\n      });\n    }\n  });\n\n  SCRIPTS_LOADED[src] = promise;\n\n  return promise;\n}\n\ntype LoadScriptParams = Parameters<typeof loadScript>;\n\n/**\n * The `useLoadScript` hook loads an external script tag in the browser. It allows React components to lazy-load large third-party dependencies.\n */\nexport function useLoadScript(\n  url: LoadScriptParams[0],\n  options?: LoadScriptParams[1],\n): ScriptState {\n  const [status, setStatus] = useState<ScriptState>('loading');\n\n  useEffect(\n    () => {\n      loadScript(url, options)\n        .then(() => setStatus('done'))\n        .catch(() => setStatus('error'));\n    },\n    // Ignore options changes since it won't trigger a new load.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [url],\n  );\n\n  return status;\n}\n\ntype ScriptState = 'loading' | 'done' | 'error';\n"],"names":[],"mappings":";AAEA,MAAM,iBAAmD,CAAA;AAQlD,SAAS,WACd,KACA,SACkB;AAClB,QAAM,iBAAiB,eAAe,GAAG;AAGzC,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,IAAI,QAAiB,CAAC,SAAS,WAAW;AACxD,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,QAAI,mCAAS,QAAQ;AACnB,aAAO,OAAO;AAAA,IAChB,OAAO;AACL,aAAO,OAAO;AAAA,IAChB;AACA,WAAO,MAAM;AACb,WAAO,SAAS,MAAY;AAC1B,cAAQ,IAAI;AAAA,IACd;AACA,WAAO,UAAU,MAAY;AAC3B,aAAO,KAAK;AAAA,IACd;AACA,SAAI,mCAAS,QAAO,QAAQ;AAC1B,eAAS,KAAK,YAAY,MAAM;AAAA,IAClC,OAAO;AACL,eAAS,KAAK,YAAY,MAAM;AAAA,IAClC;AAEA,UAAM,aAAa,mCAAS;AAC5B,QAAI,YAAY;AACd,aAAO,KAAK,UAAU,EAAE,QAAQ,CAAC,QAAQ;AACvC,eAAO,aAAa,KAAK,WAAW,GAAG,CAAC;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,iBAAe,GAAG,IAAI;AAEtB,SAAO;AACT;AAOO,SAAS,cACd,KACA,SACa;AACb,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAsB,SAAS;AAE3D;AAAA,IACE,MAAM;AACJ,iBAAW,KAAK,OAAO,EACpB,KAAK,MAAM,UAAU,MAAM,CAAC,EAC5B,MAAM,MAAM,UAAU,OAAO,CAAC;AAAA,IACnC;AAAA;AAAA;AAAA,IAGA,CAAC,GAAG;AAAA,EAAA;AAGN,SAAO;AACT;"}