2018-11-16 12:21:13 -06:00
|
|
|
import React, { PureComponent } from 'react';
|
|
|
|
|
|
|
|
interface Props {
|
|
|
|
isOpen: boolean;
|
|
|
|
label: string;
|
|
|
|
loading?: boolean;
|
2019-05-17 05:45:11 -05:00
|
|
|
collapsible?: boolean;
|
|
|
|
onToggle?: (isOpen: boolean) => void;
|
2018-11-16 12:21:13 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
export default class Panel extends PureComponent<Props> {
|
2019-05-17 05:45:11 -05:00
|
|
|
onClickToggle = () => {
|
|
|
|
const { onToggle, isOpen } = this.props;
|
|
|
|
if (onToggle) {
|
|
|
|
onToggle(!isOpen);
|
|
|
|
}
|
|
|
|
};
|
2018-11-16 12:21:13 -06:00
|
|
|
|
|
|
|
render() {
|
2019-05-17 05:45:11 -05:00
|
|
|
const { isOpen, loading, collapsible } = this.props;
|
|
|
|
const panelClass = collapsible
|
|
|
|
? 'explore-panel explore-panel--collapsible panel-container'
|
|
|
|
: 'explore-panel panel-container';
|
2018-11-16 12:21:13 -06:00
|
|
|
const iconClass = isOpen ? 'fa fa-caret-up' : 'fa fa-caret-down';
|
|
|
|
const loaderClass = loading ? 'explore-panel__loader explore-panel__loader--active' : 'explore-panel__loader';
|
|
|
|
return (
|
2019-05-17 05:45:11 -05:00
|
|
|
<div className={panelClass}>
|
2018-11-16 12:21:13 -06:00
|
|
|
<div className="explore-panel__header" onClick={this.onClickToggle}>
|
|
|
|
<div className="explore-panel__header-buttons">
|
|
|
|
<span className={iconClass} />
|
|
|
|
</div>
|
|
|
|
<div className="explore-panel__header-label">{this.props.label}</div>
|
|
|
|
</div>
|
|
|
|
{isOpen && (
|
|
|
|
<div className="explore-panel__body">
|
|
|
|
<div className={loaderClass} />
|
|
|
|
{this.props.children}
|
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|