{"version":3,"file":"load-script.mjs","names":[],"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\n/** @publicDocs */\nexport type 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 * @publicDocs\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"],"mappings":";;AAEA,IAAM,iBAAmD,EAAE;AAQ3D,SAAgB,WACd,KACA,SACkB;CAClB,MAAM,iBAAiB,eAAe;AAGtC,KAAI,eACF,QAAO;CAGT,MAAM,UAAU,IAAI,SAAkB,SAAS,WAAW;EACxD,MAAM,SAAS,SAAS,cAAc,SAAS;AAC/C,MAAI,SAAS,OACX,QAAO,OAAO;MAEd,QAAO,OAAO;AAEhB,SAAO,MAAM;AACb,SAAO,eAAqB;AAC1B,WAAQ,KAAK;;AAEf,SAAO,gBAAsB;AAC3B,UAAO,MAAM;;AAEf,MAAI,SAAS,OAAO,OAClB,UAAS,KAAK,YAAY,OAAO;MAEjC,UAAS,KAAK,YAAY,OAAO;EAGnC,MAAM,aAAa,SAAS;AAC5B,MAAI,WACF,QAAO,KAAK,WAAW,CAAC,SAAS,QAAQ;AACvC,UAAO,aAAa,KAAK,WAAW,KAAK;IACzC;GAEJ;AAEF,gBAAe,OAAO;AAEtB,QAAO;;;;;;AAUT,SAAgB,cACd,KACA,SACa;CACb,MAAM,CAAC,QAAQ,aAAa,SAAsB,UAAU;AAE5D,iBACQ;AACJ,aAAW,KAAK,QAAQ,CACrB,WAAW,UAAU,OAAO,CAAC,CAC7B,YAAY,UAAU,QAAQ,CAAC;IAIpC,CAAC,IAAI,CACN;AAED,QAAO"}