summaryrefslogtreecommitdiffhomepage
path: root/gui/src
diff options
context:
space:
mode:
authorOskar Nyberg <oskar@mullvad.net>2020-09-04 10:49:52 +0200
committerOskar Nyberg <oskar@mullvad.net>2020-09-10 10:03:47 +0200
commit5fab199ac45d8e8bb08f267a04179afbe0e4acf5 (patch)
treef5c8edf438dfa94aed9a85ef8fb6b81b19895f70 /gui/src
parent080ddf5c161c86a2374d0e38e7a9072b0401a607 (diff)
downloadmullvadvpn-5fab199ac45d8e8bb08f267a04179afbe0e4acf5.tar.xz
mullvadvpn-5fab199ac45d8e8bb08f267a04179afbe0e4acf5.zip
Refactor SvgMap to be more readable
Diffstat (limited to 'gui/src')
-rw-r--r--gui/src/renderer/components/SvgMap.tsx75
1 files changed, 44 insertions, 31 deletions
diff --git a/gui/src/renderer/components/SvgMap.tsx b/gui/src/renderer/components/SvgMap.tsx
index 27e9c0c6b4..fc71c11891 100644
--- a/gui/src/renderer/components/SvgMap.tsx
+++ b/gui/src/renderer/components/SvgMap.tsx
@@ -138,19 +138,45 @@ function sameProps(prevProps: IProps, nextProps: IProps) {
);
}
-function useBboxes(bbox: BBox): [BBox[], () => void] {
+function useViewportBboxes(
+ center: [number, number],
+ width: number,
+ height: number,
+ projection: GeoProjection,
+ zoom: number,
+): [BBox[], () => void] {
+ const viewportBbox = useMemo(
+ () => getViewportGeoBoundingBox(center, width, height, projection, zoom),
+ [center, width, height, projection, zoom],
+ );
+
const prev = useRef<BBox[]>([]);
- const bboxes = useMemo(() => [...prev.current, bbox], [bbox]);
+ const viewportBboxes = useMemo(() => [...prev.current, viewportBbox], [viewportBbox]);
const keepLast = useCallback(() => {
prev.current = prev.current.slice(-1);
}, []);
useEffect(() => {
- prev.current = [...bboxes];
- }, [bboxes]);
+ prev.current = [...viewportBboxes];
+ }, [viewportBboxes]);
+
+ return [viewportBboxes, keepLast];
+}
+
+function useVisibleGeometry(viewportBboxes: BBox[]) {
+ const combinedViewportBboxMatch = useMemo(() => getCombindedViewportBboxMatch(viewportBboxes), [
+ viewportBboxes,
+ ]);
+ const visibleGeometry = useMemo(() => geometryTree.search(combinedViewportBboxMatch), [
+ combinedViewportBboxMatch,
+ ]);
+ const visibleStatesProvincesLines = useMemo(
+ () => provincesStatesLinesTree.search(combinedViewportBboxMatch),
+ [combinedViewportBboxMatch],
+ );
- return [bboxes, keepLast];
+ return [visibleGeometry, visibleStatesProvincesLines];
}
export interface IProps {
@@ -167,37 +193,24 @@ export interface IProps {
function SvgMap(props: IProps) {
const { width, height, zoomLevel } = props;
const center = useMemo(() => props.center, [...props.center]);
- const offset = useMemo(() => props.offset, [...props.offset]);
-
- const projection = useMemo(() => getProjection(width, height, offset, projectionConfig.scale), [
+ const projection = useMemo(
+ () => getProjection(width, height, props.offset, projectionConfig.scale),
+ [width, height, ...props.offset, projectionConfig.scale],
+ );
+ const zoomCenter = useMemo(() => getZoomCenter(center, props.offset, projection, zoomLevel), [
+ ...center,
+ ...props.offset,
+ projection,
+ zoomLevel,
+ ]);
+ const [viewportBboxes, removeOldViewportBboxes] = useViewportBboxes(
+ zoomCenter,
width,
height,
- offset,
- projectionConfig.scale,
- ]);
- const zoomCenter = useMemo(() => getZoomCenter(center, offset, projection, zoomLevel), [
- center,
- offset,
projection,
zoomLevel,
- ]);
-
- const viewportBbox = useMemo(
- () => getViewportGeoBoundingBox(zoomCenter, width, height, projection, zoomLevel),
- [zoomCenter, width, height, projection, zoomLevel],
- );
- const [viewportBboxes, removeOldViewportBboxes] = useBboxes(viewportBbox);
-
- const combinedViewportBboxMatch = useMemo(() => getCombindedViewportBboxMatch(viewportBboxes), [
- viewportBboxes,
- ]);
- const visibleGeometry = useMemo(() => geometryTree.search(combinedViewportBboxMatch), [
- combinedViewportBboxMatch,
- ]);
- const visibleStatesProvincesLines = useMemo(
- () => provincesStatesLinesTree.search(combinedViewportBboxMatch),
- [combinedViewportBboxMatch],
);
+ const [visibleGeometry, visibleStatesProvincesLines] = useVisibleGeometry(viewportBboxes);
return (
<ComposableMap