-
Notifications
You must be signed in to change notification settings - Fork 113
/
AccordionItem.wrapper.tsx
65 lines (55 loc) · 1.8 KB
/
AccordionItem.wrapper.tsx
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
import * as React from 'react';
import {
CONTEXT_KEY,
getAccordionStore,
} from '../AccordionContainer/AccordionContainer';
import * as propTypes from '../helpers/propTypes';
import { nextUuid } from '../helpers/uuid';
import { Provider as ItemProvider } from '../ItemContainer/ItemContainer';
import AccordionItem from './AccordionItem';
type AccordionItemWrapperProps = React.HTMLAttributes<HTMLDivElement> & {
expandedClassName?: string;
expanded?: boolean;
uuid?: string;
};
type AccordionItemWrapperState = {};
type AccordionItemWrapperContext = {
[CONTEXT_KEY](): null;
};
export default class AccordionItemWrapper extends React.Component<
AccordionItemWrapperProps,
AccordionItemWrapperState,
AccordionItemWrapperContext
> {
static contextTypes: AccordionItemWrapperContext = {
[CONTEXT_KEY]: propTypes.wildcard,
};
static defaultProps: AccordionItemWrapperProps = {
className: 'accordion__item',
expandedClassName: '',
expanded: false,
uuid: undefined,
};
id: number = nextUuid();
render(): JSX.Element {
const accordionStore = getAccordionStore(this.context);
if (!accordionStore) {
// tslint:disable-next-line:no-console
console.error(
'AccordionItem component cannot render because it has not been nested inside an Accordion component.',
);
return null;
}
const { uuid, ...rest } = this.props;
const itemUuid = uuid !== undefined ? uuid : this.id;
return (
<ItemProvider uuid={itemUuid}>
<AccordionItem
{...rest}
uuid={itemUuid}
accordionStore={accordionStore}
/>
</ItemProvider>
);
}
}