-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Expand file tree
/
Copy pathAccordion.js
More file actions
115 lines (100 loc) · 2.71 KB
/
Accordion.js
File metadata and controls
115 lines (100 loc) · 2.71 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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import './Accordion.scss';
import React, { Component } from 'react';
import { BodyText } from '../BodyText/BodyText';
import { Link } from 'gatsby';
import PropTypes from 'prop-types';
import ReactGA from 'react-ga';
import snakeCase from 'lodash/fp/snakeCase';
import i18n from 'i18next'
ReactGA.initialize('UA-135975842-1');
class Accordion extends Component {
constructor(props) {
super(props);
this.state = {
isOpened: false,
};
}
componentDidMount() {
this.props.initiallyOpened && this.setState({ isOpened: true });
}
handleClick() {
const { isOpened } = this.state;
const { title, track } = this.props;
this.setState({ isOpened: !isOpened }, () => {
track &&
ReactGA.event({
category: 'FAQ',
action: `${title} ${!isOpened ? 'expanded' : 'closed'}`,
});
});
}
render() {
const {
title,
content,
className,
containerClassName,
list,
titleStyle,
selectedItem,
} = this.props;
const { isOpened } = this.state;
const identifier = snakeCase(title);
const isRtl = i18n.dir() === 'rtl';
return (
<div
className={`accordion__container col-8 ${isRtl ? 'push-left-1' : 'push-right-1'} ${containerClassName}`}
>
<button
className={`accordion accordion__title ${
isOpened ? 'active' : ''
} ${className}`}
style={titleStyle}
aria-controls={identifier}
aria-expanded={isOpened}
onClick={() => this.handleClick()}
>
{title}
</button>
{isOpened && (
<div className="panel" id={identifier}>
{content && (
<BodyText className={`col-8 ${isRtl ? 'push-left-1' : 'push-right-1'}`} text={content} />
)}
{list && (
<ul>
{list.map((l) => (
<li
key={l.text}
className={selectedItem === l.id ? 'selected' : undefined}
>
<Link to={l.href}>{l.text}</Link>
</li>
))}
</ul>
)}
</div>
)}
</div>
);
}
}
Accordion.propTypes = {
title: PropTypes.string.isRequired,
track: PropTypes.bool,
content: PropTypes.oneOfType([PropTypes.string, PropTypes.array]),
list: PropTypes.array,
className: PropTypes.string,
containerClassName: PropTypes.string,
initiallyOpened: PropTypes.bool,
titleStyle: PropTypes.object,
selectedItem: PropTypes.string,
};
Accordion.defaultProps = {
className: '',
track: false,
containerClassName: '',
initiallyOpened: false,
titleStyle: {},
};
export default Accordion;