package.src.ui.control.logo_control.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of mapbox-gl Show documentation
Show all versions of mapbox-gl Show documentation
A WebGL interactive maps library
The newest version!
// @flow
import DOM from '../../util/dom';
import {bindAll} from '../../util/util';
import type Map from '../map';
/**
* A `LogoControl` is a control that adds the Mapbox watermark
* to the map as required by the [terms of service](https://www.mapbox.com/tos/) for Mapbox
* vector tiles and core styles.
*
* @implements {IControl}
* @private
**/
class LogoControl {
_map: Map;
_container: HTMLElement;
constructor() {
bindAll(['_updateLogo'], this);
bindAll(['_updateCompact'], this);
}
onAdd(map: Map) {
this._map = map;
this._container = DOM.create('div', 'mapboxgl-ctrl');
const anchor = DOM.create('a', 'mapboxgl-ctrl-logo');
anchor.target = "_blank";
anchor.rel = "noopener nofollow";
anchor.href = "https://www.mapbox.com/";
anchor.setAttribute("aria-label", this._map._getUIString('LogoControl.Title'));
anchor.setAttribute("rel", "noopener nofollow");
this._container.appendChild(anchor);
this._container.style.display = 'none';
this._map.on('sourcedata', this._updateLogo);
this._updateLogo();
this._map.on('resize', this._updateCompact);
this._updateCompact();
return this._container;
}
onRemove() {
DOM.remove(this._container);
this._map.off('sourcedata', this._updateLogo);
this._map.off('resize', this._updateCompact);
}
getDefaultPosition() {
return 'bottom-left';
}
_updateLogo(e: any) {
if (!e || e.sourceDataType === 'metadata') {
this._container.style.display = this._logoRequired() ? 'block' : 'none';
}
}
_logoRequired() {
if (!this._map.style) return;
const sourceCaches = this._map.style.sourceCaches;
for (const id in sourceCaches) {
const source = sourceCaches[id].getSource();
if (source.mapbox_logo) {
return true;
}
}
return false;
}
_updateCompact() {
const containerChildren = this._container.children;
if (containerChildren.length) {
const anchor = containerChildren[0];
if (this._map.getCanvasContainer().offsetWidth < 250) {
anchor.classList.add('mapboxgl-compact');
} else {
anchor.classList.remove('mapboxgl-compact');
}
}
}
}
export default LogoControl;