-
Notifications
You must be signed in to change notification settings - Fork 51
/
Copy pathindex.js
108 lines (85 loc) · 2.34 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// @flow
import { PureComponent, createElement } from 'react';
import type MapboxMap from 'mapbox-gl/src/ui/map';
import type MapboxLanguageControl from '@mapbox/mapbox-gl-language/index';
import MapboxLanguage from '@mapbox/mapbox-gl-language';
import MapContext from '../MapContext';
type Props = {
/** List of supported languages */
supportedLanguages?: string[],
/** Custom style transformation to apply */
languageTransform?: Function,
/**
* RegExp to match if a text-field is a language field
* (optional, default /^\{name/)
*/
languageField?: RegExp,
/** Given a language choose the field in the vector tiles */
getLanguageField?: Function,
/** Name of the source that contains the different languages. */
languageSource?: string,
/** Name of the default language to initialize style after loading. */
defaultLanguage?: string,
/** Name of the language to set */
language?: string
};
/**
* Adds support for switching the language of your map style.
*/
class LanguageControl extends PureComponent<Props> {
_map: MapboxMap;
_control: MapboxLanguageControl;
static defaultProps = {};
componentDidMount() {
const map: MapboxMap = this._map;
const {
supportedLanguages,
languageTransform,
languageField,
getLanguageField,
languageSource,
defaultLanguage
} = this.props;
const control: MapboxLanguageControl = new MapboxLanguage({
supportedLanguages,
languageTransform,
languageField,
getLanguageField,
languageSource,
defaultLanguage
});
map.addControl(control);
this._control = control;
}
componentDidUpdate(prevProps: Props) {
if (prevProps.language !== this.props.language) {
this._setLanguage();
}
}
componentWillUnmount() {
if (!this._map || !this._map.getStyle()) {
return;
}
this._map.removeControl(this._control);
}
_setLanguage = () => {
const { language } = this.props;
const map = this._map;
const control = this._control;
if (language) {
map.setStyle(control.setLanguage(map.getStyle(), language));
}
};
getControl() {
return this._control;
}
render() {
return createElement(MapContext.Consumer, {}, (map) => {
if (map) {
this._map = map;
}
return null;
});
}
}
export default LanguageControl;