healthChartContainer.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import {Component} from 'react';
  2. import {InjectedRouter} from 'react-router';
  3. import ChartZoom from 'app/components/charts/chartZoom';
  4. import ErrorPanel from 'app/components/charts/errorPanel';
  5. import TransitionChart from 'app/components/charts/transitionChart';
  6. import TransparentLoadingMask from 'app/components/charts/transparentLoadingMask';
  7. import {PlatformKey} from 'app/data/platformCategories';
  8. import {IconWarning} from 'app/icons';
  9. import {GlobalSelection} from 'app/types';
  10. import {sessionTerm} from 'app/views/releases/utils/sessionTerm';
  11. import {ReleaseStatsRequestRenderProps} from '../releaseStatsRequest';
  12. import HealthChart from './healthChart';
  13. import {YAxis} from './releaseChartControls';
  14. import {sortSessionSeries} from './utils';
  15. type Props = Omit<
  16. ReleaseStatsRequestRenderProps,
  17. 'crashFreeTimeBreakdown' | 'chartSummary'
  18. > & {
  19. selection: GlobalSelection;
  20. yAxis: YAxis;
  21. router: InjectedRouter;
  22. platform: PlatformKey;
  23. title: string;
  24. help?: string;
  25. };
  26. type State = {
  27. shouldRecalculateVisibleSeries: boolean;
  28. };
  29. class ReleaseChartContainer extends Component<Props, State> {
  30. state: State = {
  31. shouldRecalculateVisibleSeries: true,
  32. };
  33. handleVisibleSeriesRecalculated = () => {
  34. this.setState({shouldRecalculateVisibleSeries: false});
  35. };
  36. render() {
  37. const {
  38. loading,
  39. errored,
  40. reloading,
  41. chartData,
  42. selection,
  43. yAxis,
  44. router,
  45. platform,
  46. title,
  47. help,
  48. } = this.props;
  49. const {shouldRecalculateVisibleSeries} = this.state;
  50. const {datetime} = selection;
  51. const {utc, period, start, end} = datetime;
  52. const timeseriesData = chartData.filter(({seriesName}) => {
  53. // There is no concept of Abnormal sessions in javascript
  54. if (
  55. (seriesName === sessionTerm.abnormal ||
  56. seriesName === sessionTerm.otherAbnormal) &&
  57. ['javascript', 'node'].includes(platform)
  58. ) {
  59. return false;
  60. }
  61. return true;
  62. });
  63. return (
  64. <ChartZoom router={router} period={period} utc={utc} start={start} end={end}>
  65. {zoomRenderProps => {
  66. if (errored) {
  67. return (
  68. <ErrorPanel>
  69. <IconWarning color="gray300" size="lg" />
  70. </ErrorPanel>
  71. );
  72. }
  73. return (
  74. <TransitionChart loading={loading} reloading={reloading}>
  75. <TransparentLoadingMask visible={reloading} />
  76. <HealthChart
  77. timeseriesData={timeseriesData.sort(sortSessionSeries)}
  78. zoomRenderProps={zoomRenderProps}
  79. reloading={reloading}
  80. yAxis={yAxis}
  81. location={router.location}
  82. shouldRecalculateVisibleSeries={shouldRecalculateVisibleSeries}
  83. onVisibleSeriesRecalculated={this.handleVisibleSeriesRecalculated}
  84. platform={platform}
  85. title={title}
  86. help={help}
  87. />
  88. </TransitionChart>
  89. );
  90. }}
  91. </ChartZoom>
  92. );
  93. }
  94. }
  95. export default ReleaseChartContainer;