-
Notifications
You must be signed in to change notification settings - Fork 235
/
chartsFactory.jsx
93 lines (78 loc) · 2.58 KB
/
chartsFactory.jsx
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
import React, {Component} from 'react';
const win = typeof global === 'undefined' ? window : global;
function chartsFactory(chartType, Highcharts) {
class Chart extends Component {
constructor() {
super()
this.chartType = chartType;
this.Highcharts = Highcharts;
this.displayName = 'Highcharts' + chartType;
}
setChartRef(chartRef) {
this.chartRef = chartRef;
}
renderChart(config) {
if (!config) {
throw new Error('Config must be specified for the ' + this.displayName + ' component');
}
const chartConfig = config.chart;
if (this.chart) {
this.chart.destroy();
}
this.chart = new this.Highcharts[this.chartType]({
...config,
chart: {
...chartConfig,
renderTo: this.chartRef
}
}, this.props.callback);
if (!this.props.neverReflow) {
win && win.requestAnimationFrame && requestAnimationFrame(() => {
this.chart && this.chart.options && this.chart.reflow();
});
}
}
shouldComponentUpdate(nextProps) {
if (nextProps.neverReflow || (nextProps.isPureConfig && this.props.config === nextProps.config)) {
return true;
}
this.renderChart(nextProps.config);
return false;
}
getChart() {
if (!this.chart) {
throw new Error('getChart() should not be called before the component is mounted');
}
return this.chart;
}
componentDidMount() {
this.renderChart(this.props.config);
}
componentWillUnmount() {
this.chart.destroy();
}
render() {
return <div ref={this.setChartRef.bind(this)} {...this.props.domProps} />;
}
}
if (isProdMode) {
let PropTypes = require('prop-types')
Chart.propTypes = {
config: PropTypes.object,
isPureConfig: PropTypes.bool,
neverReflow: PropTypes.bool,
callback: PropTypes.func,
domProps: PropTypes.object
}
}
Chart.defaultProps = {
callback: () => {
},
domProps: {}
}
let result = Chart;
result.Highcharts = Highcharts;
result.withHighcharts = Highcharts => module.exports(chartType, Highcharts);
return result
}
export default chartsFactory;