Files
redash/client/app/visualizations/map/Renderer.jsx
Arik Fraimovich 56d3be2248 Prettier all the Javascript code & GitHub Action (#4433)
* Prettier all the JS files

* Add GitHub Action to autoformat code pushed to master

* Fix eslint violation due to formatting.

* Remove GitHub actions for styling

* Add restyled.io config
2019-12-11 17:05:38 +02:00

60 lines
1.6 KiB
JavaScript

import { isEqual, omit, merge } from "lodash";
import React, { useState, useEffect, useRef, useMemo } from "react";
import { RendererPropTypes } from "@/visualizations";
import prepareData from "./prepareData";
import initMap from "./initMap";
function useMemoWithDeepCompare(create, inputs) {
const valueRef = useRef();
const value = useMemo(create, inputs);
if (!isEqual(value, valueRef.current)) {
valueRef.current = value;
}
return valueRef.current;
}
export default function Renderer({ data, options, onOptionsChange }) {
const [container, setContainer] = useState(null);
const optionsWithoutBounds = useMemoWithDeepCompare(() => omit(options, ["bounds"]), [options]);
const groups = useMemo(() => prepareData(data, optionsWithoutBounds), [data, optionsWithoutBounds]);
const [map, setMap] = useState(null);
useEffect(() => {
if (container) {
const _map = initMap(container);
setMap(_map);
return () => {
_map.destroy();
};
}
}, [container]);
useEffect(() => {
if (map) {
map.updateLayers(groups, optionsWithoutBounds);
}
}, [map, groups, optionsWithoutBounds]);
useEffect(() => {
if (map) {
map.updateBounds(options.bounds);
}
}, [map, options.bounds]);
useEffect(() => {
if (map && onOptionsChange) {
map.onBoundsChange = bounds => {
onOptionsChange(merge({}, options, { bounds }));
};
}
}, [map, options, onOptionsChange]);
return <div className="map-visualization-container" ref={setContainer} />;
}
Renderer.propTypes = RendererPropTypes;