-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathCollapsable.tsx
43 lines (37 loc) · 1.41 KB
/
Collapsable.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
import { useCallback, useEffect, useState, type HTMLAttributes } from 'react';
import { ChevronDown, ChevronUp } from '@osrd-project/ui-icons';
import cx from 'classnames';
import { omit } from 'lodash';
import { useTranslation } from 'react-i18next';
interface CollapsableProps extends Omit<HTMLAttributes<unknown>, 'children' | 'collapsed'> {
children: [JSX.Element, JSX.Element];
collapsed?: boolean;
}
const Collapsable = (props: CollapsableProps) => {
const { children, collapsed = false, className } = props;
const { t } = useTranslation('common/common');
const [isCollapsed, setIsCollapsed] = useState(collapsed);
const toggle = useCallback(() => {
setIsCollapsed((prev) => !prev);
}, []);
useEffect(() => {
setIsCollapsed(collapsed);
}, [collapsed]);
return (
<div className={cx(className, 'p-1')} {...omit(props, ['children', 'collapsed', 'className'])}>
<div className="collapse-header d-flex align-items-start">
<div className="flex-grow-1">{children[0]}</div>
<button
type="button"
className="flex-grow-0 px-1 pb-1 mx-1"
title={isCollapsed ? t('actions.expand') : t('actions.collapse')}
onClick={toggle}
>
{isCollapsed ? <ChevronUp /> : <ChevronDown />}
</button>
</div>
{!isCollapsed && <div className="collapse-header">{children[1]}</div>}
</div>
);
};
export default Collapsable;