google-maps
Version:
Async loader for google maps api (browser, typescript)
62 lines • 2.16 kB
JavaScript
export class Loader {
constructor(apiKey = null, options = {}) {
this.apiKey = apiKey;
this.options = options;
if (typeof window === 'undefined') {
throw new Error('google-maps is supported only in browser environment');
}
}
load() {
if (typeof this.api !== 'undefined') {
return Promise.resolve(this.api);
}
if (typeof this.loader !== 'undefined') {
return this.loader;
}
window[Loader.CALLBACK_NAME] = () => {
this.api = window['google'];
if (typeof this.resolve === 'undefined') {
throw new Error('Should not happen');
}
this.resolve(this.api);
};
window['gm_authFailure'] = () => {
if (typeof this.reject === 'undefined') {
throw new Error('Should not happen');
}
this.reject(new Error('google-maps: authentication error'));
};
return this.loader = new Promise((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
const script = document.createElement('script');
script.src = this.createUrl();
script.async = true;
script.onerror = (e) => reject(e);
document.head.appendChild(script);
});
}
createUrl() {
const parameters = [
`callback=${Loader.CALLBACK_NAME}`,
];
if (this.apiKey) {
parameters.push(`key=${this.apiKey}`);
}
for (let name in this.options) {
if (this.options.hasOwnProperty(name)) {
let value = this.options[name];
if (name === 'version') {
name = 'v';
}
if (name === 'libraries') {
value = value.join(',');
}
parameters.push(`${name}=${value}`);
}
}
return `https://maps.googleapis.com/maps/api/js?${parameters.join('&')}`;
}
}
Loader.CALLBACK_NAME = '_dk_google_maps_loader_cb';
//# sourceMappingURL=loader.js.map