import React, { FC, HTMLAttributes, ReactNode, useContext } from 'react'; import { getClassName } from '../../helpers/getClassName'; import { classNames } from '../../lib/classNames'; import { HasRootRef } from '../../types'; import { usePlatform } from '../../hooks/usePlatform'; import Separator from '../Separator/Separator'; import { hasReactNode } from '../../lib/utils'; import Caption from '../Typography/Caption/Caption'; import { withAdaptivity, AdaptivityProps, SizeType } from '../../hoc/withAdaptivity'; import ModalRootContext from '../ModalRoot/ModalRootContext'; export interface GroupProps extends HasRootRef, HTMLAttributes, AdaptivityProps { header?: ReactNode; description?: ReactNode; /** show - разделитель всегда показывается, hide – разделитель всегда спрятан, auto – разделитель рисуется автоматически между соседними группами. */ separator?: 'show' | 'hide' | 'auto'; /** * Режим отображения. Если установлен 'card', выглядит как карточка c * обводкой и внешними отступами. Если 'plain' — без отступов и обводки. * По-умолчанию режим отображения зависит от `sizeX`. В модальных окнах * по умолчанию 'plain'. */ mode?: 'plain' | 'card'; } const Group: FC = (props) => { const { header, description, className, children, separator, getRootRef, mode, sizeX, ...restProps } = props; const { isInsideModal } = useContext(ModalRootContext); const platform = usePlatform(); const baseClassNames = getClassName('Group', platform); let computedMode: GroupProps['mode'] = mode; if (!mode) { computedMode = sizeX === SizeType.COMPACT || isInsideModal ? 'plain' : 'card'; } return ( {header} {children} {hasReactNode(description) && {description} } {separator !== 'hide' && } ); }; Group.defaultProps = { separator: 'auto', }; export default withAdaptivity(Group, { sizeX: true });