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