google-maps-promise
Version:
Wrapper for asynchronously load Google Maps API with Promise.
104 lines • 3.2 kB
JavaScript
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