lbry-desktop/ui/component/common/card.jsx

125 lines
3.3 KiB
React
Raw Normal View History

2019-09-26 18:07:11 +02:00
// @flow
import type { Node } from 'react';
import React, { useState } from 'react';
2019-09-26 18:07:11 +02:00
import classnames from 'classnames';
import Icon from 'component/common/icon';
import Button from 'component/button';
import * as ICONS from 'constants/icons';
2019-09-26 18:07:11 +02:00
type Props = {
2019-09-27 20:56:15 +02:00
title?: string | Node,
2019-09-26 18:07:11 +02:00
subtitle?: string | Node,
titleActions?: string | Node,
2019-09-26 18:07:11 +02:00
body?: string | Node,
actions?: string | Node,
icon?: string,
2019-11-22 22:13:00 +01:00
className?: string,
isPageTitle?: boolean,
2020-05-21 17:38:28 +02:00
noTitleWrap?: boolean,
2020-04-29 21:31:11 +02:00
isBodyList?: boolean,
defaultExpand?: boolean,
nag?: Node,
2020-08-10 22:47:39 +02:00
smallTitle?: boolean,
2021-03-30 01:05:18 +02:00
onClick?: () => void,
children?: Node,
2019-09-26 18:07:11 +02:00
};
export default function Card(props: Props) {
const {
title,
subtitle,
titleActions,
body,
actions,
icon,
className,
isPageTitle = false,
2020-04-29 21:31:11 +02:00
isBodyList = false,
2020-05-21 17:38:28 +02:00
noTitleWrap = false,
2020-08-10 22:47:39 +02:00
smallTitle = false,
defaultExpand,
nag,
2021-03-30 01:05:18 +02:00
onClick,
children,
} = props;
const [expanded, setExpanded] = useState(defaultExpand);
const expandable = defaultExpand !== undefined;
2019-09-26 18:07:11 +02:00
return (
2021-03-30 01:05:18 +02:00
<section
role={onClick ? 'button' : undefined}
2021-03-30 01:05:18 +02:00
className={classnames(className, 'card')}
2021-04-23 21:59:48 +02:00
onClick={(e) => {
2021-03-30 01:05:18 +02:00
if (onClick) {
onClick();
2021-04-23 21:59:48 +02:00
e.stopPropagation();
2021-03-30 01:05:18 +02:00
}
}}
>
{(title || subtitle) && (
2020-05-21 17:38:28 +02:00
<div
className={classnames('card__header--between', {
'card__header--nowrap': noTitleWrap,
})}
>
2020-08-10 22:47:39 +02:00
<div
className={classnames('card__title-section', {
'card__title-section--body-list': isBodyList,
'card__title-section--small': smallTitle,
})}
>
{icon && <Icon sectionIcon icon={icon} />}
<div>
{isPageTitle && <h1 className="card__title">{title}</h1>}
2020-08-10 22:47:39 +02:00
{!isPageTitle && (
<h2 className={classnames('card__title', { 'card__title--small': smallTitle })}>{title}</h2>
)}
{subtitle && <div className="card__subtitle">{subtitle}</div>}
</div>
2019-09-26 18:07:11 +02:00
</div>
<div>
2021-04-08 17:21:45 +02:00
{titleActions && (
<div
className={classnames('card__title-actions', {
'card__title-actions--small': smallTitle,
})}
>
{titleActions}
</div>
)}
{expandable && (
<div className="card__title-actions">
<Button
2020-09-30 20:46:17 +02:00
button="alt"
aria-expanded={expanded}
aria-label={expanded ? __('Less') : __('More')}
2020-04-15 16:12:54 +02:00
icon={expanded ? ICONS.SUBTRACT : ICONS.ADD}
onClick={() => setExpanded(!expanded)}
/>
</div>
)}
</div>
2019-09-26 18:07:11 +02:00
</div>
2019-09-27 20:56:15 +02:00
)}
{(!expandable || (expandable && expanded)) && (
<>
{body && (
<div
className={classnames('card__body', {
'card__body--no-title': !title && !subtitle,
2020-04-29 21:31:11 +02:00
'card__body--list': isBodyList,
})}
>
{body}
</div>
)}
{actions && <div className="card__main-actions">{actions}</div>}
2021-03-30 01:05:18 +02:00
{children && <div className="card__main-actions">{children}</div>}
</>
2019-09-26 18:07:11 +02:00
)}
{nag}
2019-09-26 18:07:11 +02:00
</section>
);
}