UNPKG

google-maps-promise

Version:

Wrapper for asynchronously load Google Maps API with Promise.

104 lines 3.2 kB
var defaultUrlSettings = { url: 'https://maps.googleapis.com/maps/api/js', key: null, client: null, version: '3.32', channel: null, libraries: [], language: null, region: null, windowCallbackName: '__google_maps_api_provider_initializator__', }; var windowWithAnything = window; var urlSettings = Object.assign({}, defaultUrlSettings); var resolvePromise; var rejectPromise; var promise; var loaded; var scriptElement; init(); function load() { if (!loaded) { loaded = true; createLoader(); } return promise; } function release() { if (!loaded) { cleanupEnvironment(); return Promise.resolve(); } return promise.then(cleanupEnvironment); } function init() { urlSettings = Object.assign({}, defaultUrlSettings); loaded = false; promise = new Promise(function (resolve, reject) { resolvePromise = resolve; rejectPromise = reject; }); } function createLoader() { if (windowWithAnything.google && windowWithAnything.google.maps) { resolvePromise(windowWithAnything.google.maps); return; } var onError = function () { return rejectPromise(new URIError("The script " + (scriptElement && scriptElement.src) + " is not accessible.")); }; scriptElement = document.createElement('script'); scriptElement.type = 'text/javascript'; scriptElement.src = createUrl(); scriptElement.onerror = onError; windowWithAnything[urlSettings.windowCallbackName] = function () { return resolvePromise(windowWithAnything.google.maps); }; document.body.appendChild(scriptElement); } function createUrl() { var parts = [ 'callback=' + (urlSettings.windowCallbackName || defaultUrlSettings.windowCallbackName), ]; if (urlSettings.key) { parts.push('key=' + urlSettings.key); } if (urlSettings.client) { parts.push('client=' + urlSettings.client, 'v=' + (urlSettings.version || defaultUrlSettings.version)); } else if (urlSettings.version) { parts.push('v=' + urlSettings.version); } if (urlSettings.channel) { parts.push('channel=' + urlSettings.channel); } if (urlSettings.libraries.length > 0) { parts.push('libraries=' + urlSettings.libraries.join(',')); } if (urlSettings.language) { parts.push('language=' + urlSettings.language); } if (urlSettings.region) { parts.push('region=' + urlSettings.region); } return (urlSettings.url || defaultUrlSettings.url) + "?" + parts.join('&'); } function cleanupEnvironment() { init(); if (typeof windowWithAnything.google !== 'undefined') { delete windowWithAnything.google; } if (typeof windowWithAnything[urlSettings.windowCallbackName] !== 'undefined') { delete windowWithAnything[urlSettings.windowCallbackName]; } if (scriptElement) { if (scriptElement.parentElement) { scriptElement.parentElement.removeChild(scriptElement); } scriptElement = null; } } export { load, release, urlSettings, defaultUrlSettings, }; //# sourceMappingURL=index.js.map