Skip to content

Commit e43099d

Browse files
jonenstgeofjamg
andauthored
Use an imperative handle for centering on a substation to fix recentering on the same substations (#109)
Signed-off-by: Jon Harper <[email protected]> Co-authored-by: Geoffroy Jamgotchian <[email protected]>
1 parent 26b702d commit e43099d

File tree

2 files changed

+22
-18
lines changed

2 files changed

+22
-18
lines changed

src/components/network/network-map.js

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
*/
77

8-
import React, {useMemo, useRef, useState} from 'react';
8+
import React, {forwardRef, useImperativeHandle, useMemo, useRef, useState} from 'react';
99
import PropTypes from 'prop-types';
1010

1111
import {useSelector} from "react-redux";
@@ -28,12 +28,12 @@ const MAPBOX_TOKEN = 'pk.eyJ1IjoiZ2VvZmphbWciLCJhIjoiY2pwbnRwcm8wMDYzMDQ4b2pieXd
2828
const SUBSTATION_LAYER_PREFIX = "substationLayer";
2929
const LINE_LAYER_PREFIX = "lineLayer";
3030

31-
const NetworkMap = (props) => {
31+
const NetworkMap = forwardRef((props, ref) => {
3232

3333
const [labelsVisible, setLabelsVisible] = useState(false);
3434

3535
const [deck, setDeck] = useState(null);
36-
const [centered, setCentered] = useState({lastCenteredSubstation: null, centered: false});
36+
const [centered, setCentered] = useState({lastCenteredSubstation: null, centeredSubstationId: null, centered: false});
3737
const lastViewStateRef = useRef(null);
3838

3939
const [tooltip, setTooltip] = useState({});
@@ -49,6 +49,12 @@ const NetworkMap = (props) => {
4949

5050
const useName = useSelector(state => state.useName);
5151

52+
useImperativeHandle(ref, () => ({
53+
centerSubstation: (substationId) => {
54+
setCentered({lastCenteredSubstation: null, centeredSubstationId: substationId, centered: true});
55+
}
56+
}), [setCentered]);
57+
5258
// Do this in onAfterRender because when doing it in useEffect (triggered by calling setDeck()),
5359
// it doesn't work in the case of using the browser backward/forward buttons (because in this particular case,
5460
// we get the ref to the deck and it has not yet initialized..)
@@ -57,11 +63,11 @@ const NetworkMap = (props) => {
5763
//TODO, replace the next lines with setProps( { initialViewState } ) when we upgrade to 8.1.0
5864
//see https://github.com/uber/deck.gl/pull/4038
5965
//This is a hack because it accesses the properties of deck directly but for now it works
60-
if ((!centered.centered || (props.centeredSubstationId && props.centeredSubstationId !== centered.lastCenteredSubstation))
66+
if ((!centered.centered || (centered.centeredSubstationId && centered.centeredSubstationId !== centered.lastCenteredSubstation))
6167
&& deck !== null && deck.viewManager != null && props.geoData !== null) {
6268
if (props.geoData.substationPositionsById.size > 0) {
63-
if (props.centeredSubstationId) {
64-
const geodata = props.geoData.substationPositionsById.get(props.centeredSubstationId);
69+
if (centered.centeredSubstationId) {
70+
const geodata = props.geoData.substationPositionsById.get(centered.centeredSubstationId);
6571
const copyViewState = lastViewStateRef.current || deck.viewState;
6672
const newViewState = {
6773
longitude: geodata.lon,
@@ -79,7 +85,7 @@ const NetworkMap = (props) => {
7985
deck.viewState = newViewState;
8086
deck.setProps({});
8187
deck._onViewStateChange({viewState: deck.viewState});
82-
setCentered({lastCenteredSubstation: props.centeredSubstationId, centered: true});
88+
setCentered({lastCenteredSubstation: centered.centeredSubstationId, centeredSubstationId: centered.centeredSubstationId, centered: true});
8389
} else {
8490
const coords = Array.from(props.geoData.substationPositionsById.entries()).map(x => x[1]);
8591
const maxlon = Math.max.apply(null, coords.map(x => x.lon));
@@ -207,7 +213,7 @@ const NetworkMap = (props) => {
207213
}}/>
208214
</div>
209215
</DeckGL>;
210-
};
216+
});
211217

212218
NetworkMap.defaultProps = {
213219
network: null,
@@ -216,7 +222,6 @@ NetworkMap.defaultProps = {
216222
initialZoom: 5,
217223
filteredNominalVoltages: null,
218224
initialPosition: [0, 0],
219-
centeredSubstationId: null
220225
};
221226

222227
NetworkMap.propTypes = {
@@ -227,7 +232,6 @@ NetworkMap.propTypes = {
227232
filteredNominalVoltages: PropTypes.array,
228233
initialPosition: PropTypes.arrayOf(PropTypes.number).isRequired,
229234
onSubstationClick: PropTypes.func,
230-
centeredSubstationId: PropTypes.string
231235
};
232236

233237
export default React.memo(NetworkMap);

src/components/study-pane.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
*/
77

8-
import React, {useEffect, useState, useCallback} from "react";
8+
import React, {useEffect, useRef, useState, useCallback} from "react";
99

1010
import {useDispatch, useSelector} from "react-redux";
1111

@@ -87,8 +87,6 @@ const StudyPane = () => {
8787

8888
const [displayedVoltageLevelId, setDisplayedVoltageLevelId] = useState(null);
8989

90-
const [focusedVoltageLevelId, setFocusedVoltageLevelId] = useState(null);
91-
9290
const [filteredNominalVoltages, setFilteredNominalVoltages] = useState([]);
9391

9492
const dispatch = useDispatch();
@@ -196,6 +194,11 @@ const StudyPane = () => {
196194
setFilteredNominalVoltages(newFiltered);
197195
};
198196

197+
const mapRef = useRef();
198+
const centerSubstation = useCallback((id)=> {
199+
mapRef.current.centerSubstation(network.getVoltageLevel(id).substationId);
200+
}, [mapRef, network]);
201+
199202
if (studyNotFound) {
200203
return <StudyNotFound studyName={studyName}/>;
201204
} else {
@@ -204,16 +207,13 @@ const StudyPane = () => {
204207
if (displayedVoltageLevelId) {
205208
displayedVoltageLevel = network.getVoltageLevel(displayedVoltageLevelId);
206209
}
207-
if (focusedVoltageLevelId) {
208-
focusedVoltageLevel = network.getVoltageLevel(focusedVoltageLevelId);
209-
}
210210
}
211211
return (
212212
<Grid container className={classes.main}>
213213
<Grid item xs={12} md={2} key="explorer">
214214
<NetworkExplorer network={network}
215215
onVoltageLevelDisplayClick={showVoltageLevelDiagram}
216-
onVoltageLevelFocusClick={ id => setFocusedVoltageLevelId(id)} />
216+
onVoltageLevelFocusClick={centerSubstation} />
217217
</Grid>
218218
<Grid item xs={12} md={10} key="map">
219219
<div style={{position:"relative", width:"100%", height: "100%"}}>
@@ -223,7 +223,7 @@ const StudyPane = () => {
223223
initialPosition={INITIAL_POSITION}
224224
initialZoom={1}
225225
filteredNominalVoltages={filteredNominalVoltages}
226-
centeredSubstationId={focusedVoltageLevel && focusedVoltageLevel.substationId}
226+
ref={mapRef}
227227
onSubstationClick={showVoltageLevelDiagram} />
228228
{
229229
displayedVoltageLevelId &&

0 commit comments

Comments
 (0)