Refactor ControlMap
This commit is contained in:
parent
89d78a2f11
commit
0df3149cb1
1 changed files with 72 additions and 81 deletions
|
|
@ -19,75 +19,47 @@ export type ControlMapProps = {
|
||||||
onChangeControl: (control: Control) => void
|
onChangeControl: (control: Control) => void
|
||||||
};
|
};
|
||||||
|
|
||||||
export default class ControlMap extends React.PureComponent<ControlMapProps> {
|
const center = (props: ControlMapProps): Point =>
|
||||||
constructor(props: ControlMapProps) {
|
convertPoint([
|
||||||
super(props);
|
props.width / 2,
|
||||||
}
|
props.height / 2
|
||||||
|
|
||||||
get center(): Point {
|
|
||||||
return convertPoint([
|
|
||||||
this.props.width / 2,
|
|
||||||
this.props.height / 2
|
|
||||||
]);
|
]);
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
const iconColor = (control: Control, state: State): string => {
|
||||||
return (
|
if (control.iconColor != null) {
|
||||||
<Map center={this.center}
|
return control.iconColor(state);
|
||||||
zoom={this.props.zoom}
|
|
||||||
crs={CRS.Simple}
|
|
||||||
leaflet={{}}>
|
|
||||||
{this.renderMarkers()}
|
|
||||||
{this.renderLayers()}
|
|
||||||
</Map>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
return "#000";
|
||||||
|
};
|
||||||
|
|
||||||
renderMarkers() {
|
const createLeafletIcon = (control: Control, state: State) => {
|
||||||
return map(this.props.controls, this.renderMarker.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
createLeafletIcon(control: Control, state: State) {
|
|
||||||
const icon = control.icon(state);
|
const icon = control.icon(state);
|
||||||
const iconClass = `${icon} mdi-36px`;
|
const iconClass = `${icon} mdi-36px`;
|
||||||
return divIcon({
|
return divIcon({
|
||||||
iconSize: point(36, 36),
|
iconSize: point(36, 36),
|
||||||
iconAnchor: point(18, 18),
|
iconAnchor: point(18, 18),
|
||||||
html: `<i class="${iconClass}"
|
html: `<i class="${iconClass}"
|
||||||
style="line-height: 1; color: ${this.iconColor(control, state)}"></i>`
|
style="line-height: 1; color: ${iconColor(control, state)}"></i>`
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
iconColor(control: Control, state: State): string {
|
const renderMarker = (props: ControlMapProps) =>
|
||||||
if (control.iconColor != null) {
|
(control: Control, key: string) => (
|
||||||
return control.iconColor(state);
|
|
||||||
}
|
|
||||||
return "#000";
|
|
||||||
}
|
|
||||||
|
|
||||||
renderMarker(control: Control, key: string) {
|
|
||||||
return (
|
|
||||||
<MqttContext.Consumer key={key}>
|
<MqttContext.Consumer key={key}>
|
||||||
{({ state }) => (
|
{({ state }) => (
|
||||||
<Marker position={convertPoint(control.position)}
|
<Marker position={convertPoint(control.position)}
|
||||||
icon={this.createLeafletIcon(control, state)}
|
icon={createLeafletIcon(control, state)}
|
||||||
onClick={() => this.props.onChangeControl(control)}
|
onClick={() => props.onChangeControl(control)}
|
||||||
>
|
>
|
||||||
</Marker>
|
</Marker>
|
||||||
)}
|
)}
|
||||||
</MqttContext.Consumer>
|
</MqttContext.Consumer>
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
renderLayers() {
|
const renderMarkers = (props: ControlMapProps) =>
|
||||||
return (
|
map(props.controls, renderMarker(props));
|
||||||
<LayersControl position="topright">
|
|
||||||
{this.props.layers.map(this.renderLayer)}
|
|
||||||
</LayersControl>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
renderLayer(layer: Layer) {
|
const renderLayer = (layer: Layer) => {
|
||||||
const LayersControlType =
|
const LayersControlType =
|
||||||
layer.baseLayer ? LayersControl.BaseLayer : LayersControl.Overlay;
|
layer.baseLayer ? LayersControl.BaseLayer : LayersControl.Overlay;
|
||||||
return (
|
return (
|
||||||
|
|
@ -95,9 +67,11 @@ export default class ControlMap extends React.PureComponent<ControlMapProps> {
|
||||||
key={layer.name}
|
key={layer.name}
|
||||||
name={layer.name}
|
name={layer.name}
|
||||||
checked={layer.defaultVisibility === "visible"}
|
checked={layer.defaultVisibility === "visible"}
|
||||||
removeLayer={(_layer) => {}}
|
removeLayer={(_layer) => {}} // eslint-disable-line fp/no-nil
|
||||||
removeLayerControl={(_layer) => {}}
|
removeLayerControl={(_layer) => {}} // eslint-disable-line fp/no-nil
|
||||||
|
// eslint-disable-next-line fp/no-nil
|
||||||
addOverlay={(_layer, _name, _checked) => {}}
|
addOverlay={(_layer, _name, _checked) => {}}
|
||||||
|
// eslint-disable-next-line fp/no-nil
|
||||||
addBaseLayer={(_layer, _name, _checked) => {}}>
|
addBaseLayer={(_layer, _name, _checked) => {}}>
|
||||||
<ImageOverlay url={layer.image}
|
<ImageOverlay url={layer.image}
|
||||||
bounds={[
|
bounds={[
|
||||||
|
|
@ -107,5 +81,22 @@ export default class ControlMap extends React.PureComponent<ControlMapProps> {
|
||||||
opacity={layer.opacity || 1} />
|
opacity={layer.opacity || 1} />
|
||||||
</LayersControlType>
|
</LayersControlType>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
}
|
|
||||||
|
const renderLayers = (props: ControlMapProps) => (
|
||||||
|
<LayersControl position="topright">
|
||||||
|
{props.layers.map(renderLayer)}
|
||||||
|
</LayersControl>
|
||||||
|
);
|
||||||
|
|
||||||
|
const ControlMap = (props: ControlMapProps) => (
|
||||||
|
<Map center={center(props)}
|
||||||
|
zoom={props.zoom}
|
||||||
|
crs={CRS.Simple}
|
||||||
|
leaflet={{}}>
|
||||||
|
{renderMarkers(props)}
|
||||||
|
{renderLayers(props)}
|
||||||
|
</Map>
|
||||||
|
);
|
||||||
|
|
||||||
|
export default ControlMap;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue