12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- /**
- * Loads a script from a specific URL. React Native cannot load a JS
- * file/resource/URL via a <script> HTML element, so the implementation
- * fetches the specified src as plain text (e.g. via XMLHttpRequest) and then
- * evaluates the fetched string as JavaScript code (i.e. via the {@link eval}
- * function).
- *
- * @param {string} url - The absolute URL from the which the script is to be
- * (down)loaded.
- * @returns {void}
- */
- export function loadScript(url) {
- let fetch;
- const method = 'GET';
-
- // Prefer the Fetch API. Apart from the fact that we're fetching the
- // specified script as a static resource, the Fetch API provides more
- // detailed errors.
- if (typeof (fetch = window.fetch) === 'function') {
- fetch = fetch(url, { method });
- } else {
- // Otherwise, fall back to the XMLHttpRequest API.
- fetch
- = new Promise(resolve => {
- const xhr = new XMLHttpRequest();
-
- xhr.responseType = 'text';
-
- xhr.onreadystatechange = () => {
- if (xhr.readyState === 4) {
- resolve(xhr);
- }
- };
-
- xhr.open(method, url, /* async */ true);
- xhr.send();
- });
- }
-
- return (
- fetch
- .then(response => {
- switch (response.status) {
- case 200:
- return response.responseText || response.text();
-
- default:
- throw response.statusText;
- }
-
- })
- .then(responseText => {
- eval.call(window, responseText); // eslint-disable-line no-eval
- }));
- }
|