UNPKG

google-maps-promise

Version:

Wrapper for asynchronously load Google Maps API with Promise.

100 lines 3.13 kB
const 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__', }; const windowWithAnything = window; let urlSettings = Object.assign({}, defaultUrlSettings); let resolvePromise; let rejectPromise; let promise; let loaded; let 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((resolve, reject) => { resolvePromise = resolve; rejectPromise = reject; }); } function createLoader() { if (windowWithAnything.google && windowWithAnything.google.maps) { resolvePromise(windowWithAnything.google.maps); return; } const onError = () => 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] = () => resolvePromise(windowWithAnything.google.maps); document.body.appendChild(scriptElement); } function createUrl() { const 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