import { h, Component } from 'preact'; class WBAccordion extends Component { constructor(...args) { super(...args); this.setupIds(); console.log('WBAccordion() : domId=' + this.state.domId); } setupIds() { this.state.domId = 'accordion-' + uuid.v4(); const { names } = this.props; const { state } = this; state.headerDomIds = names.map(() => ('accordion-' + uuid.v4())); state.collapseDomIds = names.map(() => ('accordion-' + uuid.v4())); state.isOpen = Array(names.length).fill(false); state.collapseElements = null; } setupEvents() { const { collapseDomIds, isOpen } = this.state; const accordion = this; const collapseElements = $(collapseDomIds.map(a => '#' + a).join(',')); this.state.collapseElements = collapseElements; collapseElements.on('hidden.bs.collapse shown.bs.collapse', function(ev) { // console.log(this.id); const el = this; const idx = collapseDomIds.findIndex(a => (a === el.id)); isOpen[idx] = (ev.type === 'shown'); accordion.setState({ isOpen }); }); } removeEvents() { const { collapseElements } = this.state; collapseElements.off('hidden.bs.collapse shown.bs.collapse'); } setup() { this.setupIds(); this.setupEvents(); } componentDidMount() { console.log('WBAccordion.componentDidMount()'); this.setupEvents(); } componentWillUnmount() { console.log('WBAccordion.componentWillUnmount()'); this.removeEvents(); } componentWillReceiveProps(nextProps) { console.log('WBAccordion.componentWillReceiveProps()'); this.props = nextProps; this.removeEvents(); this.setupIds(); this.setState({}); // render this.setupEvents(); } render({ children, names, cardHeaderClass }, { domId, headerDomIds, collapseDomIds, isOpen }) { return (
{ children.map((_, i) => (

{ children[i] }
)) }
); } }; WBAccordion.defaultProps = { 'cardHeaderClass': 'card-header' }; export default WBAccordion;