google-maps-promise
Version:
Wrapper for asynchronously load Google Maps API with Promise.
117 lines (112 loc) • 3.73 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.GoogleMapsPromise = {})));
}(this, (function (exports) { 'use strict';
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;
exports.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() {
exports.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[exports.urlSettings.windowCallbackName] = function () {
return resolvePromise(windowWithAnything.google.maps);
};
document.body.appendChild(scriptElement);
}
function createUrl() {
var parts = [
'callback=' + (exports.urlSettings.windowCallbackName
|| defaultUrlSettings.windowCallbackName),
];
if (exports.urlSettings.key) {
parts.push('key=' + exports.urlSettings.key);
}
if (exports.urlSettings.client) {
parts.push('client=' + exports.urlSettings.client, 'v=' + (exports.urlSettings.version || defaultUrlSettings.version));
}
else if (exports.urlSettings.version) {
parts.push('v=' + exports.urlSettings.version);
}
if (exports.urlSettings.channel) {
parts.push('channel=' + exports.urlSettings.channel);
}
if (exports.urlSettings.libraries.length > 0) {
parts.push('libraries=' + exports.urlSettings.libraries.join(','));
}
if (exports.urlSettings.language) {
parts.push('language=' + exports.urlSettings.language);
}
if (exports.urlSettings.region) {
parts.push('region=' + exports.urlSettings.region);
}
return (exports.urlSettings.url || defaultUrlSettings.url) + "?" + parts.join('&');
}
function cleanupEnvironment() {
init();
if (typeof windowWithAnything.google !== 'undefined') {
delete windowWithAnything.google;
}
if (typeof windowWithAnything[exports.urlSettings.windowCallbackName] !== 'undefined') {
delete windowWithAnything[exports.urlSettings.windowCallbackName];
}
if (scriptElement) {
if (scriptElement.parentElement) {
scriptElement.parentElement.removeChild(scriptElement);
}
scriptElement = null;
}
}
exports.load = load;
exports.release = release;
exports.defaultUrlSettings = defaultUrlSettings;
Object.defineProperty(exports, '__esModule', { value: true });
})));