forked from firefox-devtools/debugger
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAccordion.js
More file actions
82 lines (69 loc) · 1.9 KB
/
Copy pathAccordion.js
File metadata and controls
82 lines (69 loc) · 1.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
// @flow
import React, { cloneElement, Component } from "react";
import Svg from "./Svg";
import "./Accordion.css";
type AccordionItem = {
buttons?: Array<Object>,
component: React$Element<any>,
componentProps: Object,
header: string,
className: string,
opened: boolean,
onToggle?: () => void,
shouldOpen?: () => void
};
type Props = { items: Array<Object> };
type State = {
opened: boolean[],
created: boolean[]
};
class Accordion extends Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
opened: props.items.map(item => item.opened),
created: []
};
}
handleHeaderClick(i: number) {
const item = this.props.items[i];
const opened = !item.opened;
item.opened = opened;
if (item.onToggle) {
item.onToggle(opened);
}
// We force an update because otherwise the accordion
// would not re-render
this.forceUpdate();
}
renderContainer = (item: AccordionItem, i: number) => {
const { opened } = item;
return (
<div className={item.className} key={i}>
<div className="_header" onClick={() => this.handleHeaderClick(i)}>
<Svg name="arrow" className={opened ? "expanded" : ""} />
{item.header}
{item.buttons ? (
<div className="header-buttons">{item.buttons}</div>
) : null}
</div>
{opened && (
<div className="_content">
{cloneElement(item.component, item.componentProps || {})}
</div>
)}
</div>
);
};
render() {
return (
<div className="accordion">
{this.props.items.map(this.renderContainer)}
</div>
);
}
}
export default Accordion;