DataPanel.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Library
  2. import React, { Component } from 'react';
  3. interface RenderProps {
  4. loading: LoadingState;
  5. data: any;
  6. }
  7. export interface Props {
  8. datasource: string | null;
  9. queries: any[];
  10. children: (r: RenderProps) => JSX.Element;
  11. }
  12. export interface State {
  13. isFirstLoad: boolean;
  14. loading: LoadingState;
  15. data: any;
  16. }
  17. export enum LoadingState {
  18. NotStarted = 'NotStarted',
  19. Loading = 'Loading',
  20. Done = 'Done',
  21. Error = 'Error',
  22. }
  23. export interface PanelProps extends RenderProps {}
  24. export class DataPanel extends Component<Props, State> {
  25. constructor(props: Props) {
  26. super(props);
  27. this.state = {
  28. loading: LoadingState.NotStarted,
  29. data: [],
  30. isFirstLoad: true,
  31. };
  32. }
  33. componentDidMount() {
  34. console.log('DataPanel mount');
  35. this.issueQueries();
  36. }
  37. issueQueries = async () => {
  38. this.setState({ loading: LoadingState.Loading });
  39. await new Promise(resolve => {
  40. setTimeout(() => {
  41. this.setState({ loading: LoadingState.Done, data: [{ value: 10 }], isFirstLoad: false });
  42. }, 500);
  43. });
  44. };
  45. render() {
  46. const { data, loading, isFirstLoad } = this.state;
  47. console.log('data panel render');
  48. if (isFirstLoad && loading === LoadingState.Loading) {
  49. return (
  50. <div className="loading">
  51. <p>Loading</p>
  52. </div>
  53. );
  54. }
  55. return (
  56. <>
  57. {this.loadingSpinner}
  58. {this.props.children({
  59. data,
  60. loading,
  61. })}
  62. </>
  63. );
  64. }
  65. private get loadingSpinner(): JSX.Element {
  66. const { loading } = this.state;
  67. if (loading === LoadingState.Loading) {
  68. return (
  69. <div className="panel__loading">
  70. <i className="fa fa-spinner fa-spin" />
  71. </div>
  72. );
  73. }
  74. return null;
  75. }
  76. }