DataPanel.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import React, { Component, ComponentClass } from 'react';
  2. export interface OuterProps {
  3. type: string;
  4. queries: any[];
  5. isVisible: boolean;
  6. }
  7. export interface AddedProps {
  8. data: any[];
  9. }
  10. interface State {
  11. isLoading: boolean;
  12. data: any[];
  13. }
  14. const DataPanel = (ComposedComponent: ComponentClass<AddedProps & OuterProps>) => {
  15. class Wrapper extends Component<OuterProps, State> {
  16. public static defaultProps = {
  17. isVisible: true,
  18. };
  19. constructor(props: OuterProps) {
  20. super(props);
  21. this.state = {
  22. isLoading: false,
  23. data: [],
  24. };
  25. }
  26. public componentDidMount() {
  27. this.issueQueries();
  28. }
  29. public issueQueries = () => {
  30. const { queries, isVisible } = this.props;
  31. if (!isVisible) {
  32. return;
  33. }
  34. if (!queries.length) {
  35. this.setState({ data: [{ message: 'no queries' }] });
  36. return;
  37. }
  38. this.setState({ isLoading: true });
  39. };
  40. public render() {
  41. const { data, isLoading } = this.state;
  42. if (!data.length) {
  43. return (
  44. <div className="no-data">
  45. <p>No Data</p>
  46. </div>
  47. );
  48. }
  49. if (isLoading) {
  50. return (
  51. <div className="loading">
  52. <p>Loading</p>
  53. </div>
  54. );
  55. }
  56. return <ComposedComponent {...this.props} data={data} />;
  57. }
  58. }
  59. return Wrapper;
  60. };
  61. export default DataPanel;