Skip to content

Commit 7156603

Browse files
author
unknown
committed
1.0.0
1 parent ba4a9af commit 7156603

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+578
-281
lines changed

README.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MDB 5 React
22

3-
Version: FREE 1.0.0-beta7
3+
Version: FREE 1.0.0
44

55
Documentation:
66
https://mdbootstrap.com/docs/b5/react/

app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mdb-react-ui-kit-demo",
3-
"version": "1.0.0-beta7",
3+
"version": "1.0.0",
44
"main": "index.js",
55
"repository": {
66
"type": "git",
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import clsx from 'clsx';
2+
import React, { useState } from 'react';
3+
import type { AccordionProps } from './types';
4+
import { AccordionContext } from './AccordionContext';
5+
6+
const MDBAccordion: React.FC<AccordionProps> = React.forwardRef<HTMLAllCollection, AccordionProps>(
7+
({ alwaysOpen, className, flush, initialActive, tag: Tag, children, ...props }, ref) => {
8+
const classes = clsx('accordion', flush && 'accordion-flush', className);
9+
10+
const [activeItem, setActiveItem] = useState(initialActive);
11+
12+
return (
13+
<AccordionContext.Provider value={{ activeItem, setActiveItem, alwaysOpen, initialActive }}>
14+
<Tag className={classes} ref={ref} {...props}>
15+
{children}
16+
</Tag>
17+
</AccordionContext.Provider>
18+
);
19+
}
20+
);
21+
22+
MDBAccordion.defaultProps = { tag: 'div', initialActive: '' };
23+
24+
export default MDBAccordion;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import React from 'react';
2+
3+
interface AccordionProps {
4+
activeItem: string | undefined;
5+
setActiveItem: React.SetStateAction<any>;
6+
alwaysOpen: boolean | undefined;
7+
initialActive: string | undefined;
8+
}
9+
10+
const AccordionContext = React.createContext<AccordionProps>({
11+
activeItem: '',
12+
setActiveItem: null,
13+
alwaysOpen: false,
14+
initialActive: '',
15+
});
16+
17+
export { AccordionContext };
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import clsx from 'clsx';
2+
import React, { useContext, useState } from 'react';
3+
import { AccordionContext } from '../AccordionContext';
4+
import type { AccordionItemProps } from './types';
5+
import MDBCollapse from '../../Collapse/Collapse';
6+
7+
const MDBAccordionItem: React.FC<AccordionItemProps> = React.forwardRef<HTMLAllCollection, AccordionItemProps>(
8+
({ className, bodyClassName, headerClassName, collapseId, headerTitle, tag: Tag, children, ...props }, ref) => {
9+
const { activeItem, setActiveItem, alwaysOpen, initialActive } = useContext(AccordionContext);
10+
11+
const [openState, setOpenState] = useState(initialActive);
12+
13+
const classes = clsx('accordion-item', className);
14+
const headerClasses = clsx('accordion-header', headerClassName);
15+
const bodyClasses = clsx('accordion-body', bodyClassName);
16+
const buttonClasses = clsx(
17+
'accordion-button',
18+
alwaysOpen ? collapseId !== openState && 'collapsed' : collapseId !== activeItem && 'collapsed'
19+
);
20+
21+
const toggleAccordion = (value: string) => {
22+
if (alwaysOpen) {
23+
value !== openState ? setOpenState(value) : setOpenState('');
24+
} else {
25+
value !== activeItem ? setActiveItem(value) : setActiveItem('');
26+
}
27+
};
28+
29+
return (
30+
<Tag className={classes} ref={ref} {...props}>
31+
<h2 className={headerClasses}>
32+
<button onClick={() => toggleAccordion(collapseId)} className={buttonClasses} type='button'>
33+
{headerTitle}
34+
</button>
35+
</h2>
36+
<MDBCollapse id={collapseId} show={alwaysOpen ? openState : activeItem}>
37+
<div className={bodyClasses}>{children}</div>
38+
</MDBCollapse>
39+
</Tag>
40+
);
41+
}
42+
);
43+
44+
MDBAccordionItem.defaultProps = { tag: 'div' };
45+
46+
export default MDBAccordionItem;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import * as React from 'react';
2+
3+
declare const MDBAccordionItem: React.FunctionComponent<{
4+
className?: string;
5+
bodyClassName?: string;
6+
headerClassName?: string;
7+
collapseId: string;
8+
headerTitle?: string;
9+
tag?: React.ComponentProps<any>;
10+
[rest: string]: any;
11+
}>;
12+
13+
export default MDBAccordionItem;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import React from 'react';
2+
3+
type AccordionItemProps = {
4+
className?: string;
5+
bodyClassName?: string;
6+
headerClassName?: string;
7+
collapseId: string;
8+
headerTitle?: string;
9+
tag?: React.ComponentProps<any>;
10+
[rest: string]: any;
11+
};
12+
13+
export { AccordionItemProps };
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import * as React from 'react';
2+
3+
declare const MDBAccordion: React.FunctionComponent<{
4+
alwaysOpen?: boolean;
5+
className?: string;
6+
flush?: boolean;
7+
initialActive?: string;
8+
tag?: React.ComponentProps<any>;
9+
[rest: string]: any;
10+
}>;
11+
12+
export default MDBAccordion;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import React from 'react';
2+
3+
type AccordionProps = {
4+
alwaysOpen?: boolean;
5+
className?: string;
6+
flush?: boolean;
7+
initialActive?: string;
8+
tag?: React.ComponentProps<any>;
9+
[rest: string]: any;
10+
};
11+
12+
export { AccordionProps };

app/src/components/Collapse/Collapse.tsx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import clsx from 'clsx';
2-
import React, { useEffect, useRef, useState } from 'react';
2+
import React, { useCallback, useEffect, useRef, useState } from 'react';
33
import type { CollapseProps } from './types';
44

55
const MDBCollapse: React.FC<CollapseProps> = ({
@@ -28,6 +28,18 @@ const MDBCollapse: React.FC<CollapseProps> = ({
2828
);
2929
const refCollapse = useRef<HTMLElement>(null);
3030

31+
const handleResize = useCallback(() => {
32+
if (showCollapse || statement) {
33+
setCollapseHeight(undefined);
34+
}
35+
}, [showCollapse, statement]);
36+
37+
useEffect(() => {
38+
if (collapseHeight === undefined && (showCollapse || statement)) {
39+
setCollapseHeight(refCollapse?.current?.scrollHeight);
40+
}
41+
}, [collapseHeight, showCollapse, statement]);
42+
3143
useEffect(() => {
3244
if (typeof show === 'string') {
3345
setShowCollapseString(show);
@@ -47,7 +59,7 @@ const MDBCollapse: React.FC<CollapseProps> = ({
4759
return () => {
4860
clearTimeout(timer);
4961
};
50-
}, [collapseHeight, show, showCollapse, id, showCollapseString, statement]);
62+
}, [show, showCollapse, id, showCollapseString, statement]);
5163

5264
useEffect(() => {
5365
if (showCollapse || statement) {
@@ -57,6 +69,14 @@ const MDBCollapse: React.FC<CollapseProps> = ({
5769
}
5870
}, [showCollapse, statement]);
5971

72+
useEffect(() => {
73+
window.addEventListener('resize', handleResize);
74+
75+
return () => {
76+
window.removeEventListener('resize', handleResize);
77+
};
78+
}, [handleResize]);
79+
6080
return (
6181
<Tag style={{ height: collapseHeight, ...style }} id={id} className={classes} {...props} ref={refCollapse}>
6282
{children}

0 commit comments

Comments
 (0)