Panel.tsx 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import React, { PureComponent } from 'react';
  2. interface Props {
  3. isOpen: boolean;
  4. label: string;
  5. loading?: boolean;
  6. collapsible?: boolean;
  7. onToggle?: (isOpen: boolean) => void;
  8. }
  9. export default class Panel extends PureComponent<Props> {
  10. onClickToggle = () => {
  11. const { onToggle, isOpen } = this.props;
  12. if (onToggle) {
  13. onToggle(!isOpen);
  14. }
  15. };
  16. render() {
  17. const { isOpen, loading, collapsible } = this.props;
  18. const panelClass = collapsible
  19. ? 'explore-panel explore-panel--collapsible panel-container'
  20. : 'explore-panel panel-container';
  21. const iconClass = isOpen ? 'fa fa-caret-up' : 'fa fa-caret-down';
  22. const loaderClass = loading ? 'explore-panel__loader explore-panel__loader--active' : 'explore-panel__loader';
  23. return (
  24. <div className={panelClass}>
  25. <div className="explore-panel__header" onClick={this.onClickToggle}>
  26. <div className="explore-panel__header-buttons">
  27. <span className={iconClass} />
  28. </div>
  29. <div className="explore-panel__header-label">{this.props.label}</div>
  30. </div>
  31. {isOpen && (
  32. <div className="explore-panel__body">
  33. <div className={loaderClass} />
  34. {this.props.children}
  35. </div>
  36. )}
  37. </div>
  38. );
  39. }
  40. }