bitburner-src/src/ui/React/BBAccordion.tsx

85 lines
2.0 KiB
TypeScript
Raw Normal View History

/**
* React component to create an accordion element
*/
import * as React from "react";
type IProps = {
2021-09-05 01:09:30 +02:00
headerClass?: string; // Override default class
headerContent: React.ReactElement;
panelClass?: string; // Override default class
panelContent: React.ReactElement;
panelInitiallyOpened?: boolean;
style?: string;
};
type IState = {
2021-09-05 01:09:30 +02:00
panelOpened: boolean;
};
2021-09-13 18:44:46 +02:00
export class BBAccordion extends React.Component<IProps, IState> {
2021-09-05 01:09:30 +02:00
constructor(props: IProps) {
super(props);
2021-09-05 01:09:30 +02:00
this.handleHeaderClick = this.handleHeaderClick.bind(this);
2021-09-05 01:09:30 +02:00
this.state = {
2021-09-09 05:47:34 +02:00
panelOpened: props.panelInitiallyOpened ? props.panelInitiallyOpened : false,
2021-09-05 01:09:30 +02:00
};
}
2021-09-05 01:09:30 +02:00
handleHeaderClick(): void {
this.setState({
panelOpened: !this.state.panelOpened,
});
}
2021-09-05 01:09:30 +02:00
render(): React.ReactNode {
let className = "accordion-header";
if (typeof this.props.headerClass === "string") {
className = this.props.headerClass;
}
2021-09-05 01:09:30 +02:00
if (this.state.panelOpened) className += " active";
2021-09-05 01:09:30 +02:00
return (
<>
<button className={className} onClick={this.handleHeaderClick}>
{this.props.headerContent}
</button>
<AccordionPanel
opened={this.state.panelOpened}
panelClass={this.props.panelClass}
panelContent={this.props.panelContent}
/>
</>
);
}
}
type IPanelProps = {
2021-09-05 01:09:30 +02:00
opened: boolean;
panelClass?: string; // Override default class
panelContent: React.ReactElement;
};
class AccordionPanel extends React.Component<IPanelProps, any> {
2021-09-05 01:09:30 +02:00
shouldComponentUpdate(nextProps: IPanelProps): boolean {
return this.props.opened || nextProps.opened;
}
2021-09-05 01:09:30 +02:00
render(): React.ReactNode {
let className = "accordion-panel";
if (typeof this.props.panelClass === "string") {
className = this.props.panelClass;
}
2021-08-27 21:26:12 +02:00
2021-09-05 01:09:30 +02:00
if (!this.props.opened) return <></>;
2021-09-05 01:09:30 +02:00
return (
<div className={className} style={{ display: "block" }}>
{this.props.panelContent}
</div>
);
}
}