import { isDefined, selectDefined } from '@o/utils' import { Theme, ThemeResetSubTheme } from 'gloss' import React, { useCallback } from 'react' import { CollapsableProps, CollapseArrow, splitCollapseProps, useCollapse } from './Collapsable' import { ListItemSimple } from './lists/ListItemSimple' import { ListItemProps, ListItemSpecificProps } from './lists/ListItemViewProps' import { useIsSelected } from './lists/useIsSelected' import { getSize } from './Sizes' import { getSpaceSizeNum, Sizes } from './Space' import { Surface, SurfaceSpecificProps } from './Surface' import { Stack, StackProps } from './View/Stack' export type CardProps = SurfaceSpecificProps & ListItemSpecificProps & Partial & Omit & { collapseOnClick?: boolean onClickTitle?: Function headerProps?: ListItemProps titlePadding?: Sizes innerColProps?: StackProps themeImmer?: string } export function Card(props: CardProps) { const [collapseProps, rest] = splitCollapseProps(props) const { padding, sizeRadius = true, icon, location, preview, title, afterTitle, children, iconProps, titleProps, subTitleProps, titleFlex, onClickLocation, subTitle, date, hideSubtitle, space, flexDirection, collapseOnClick, scrollable, maxHeight, size, iconBefore, headerProps, coat, onClickTitle, titlePadding, themeInner, innerColProps, ...sizedSurfaceProps } = rest const isSelected = useIsSelected(props) const showChildren = typeof children !== 'undefined' && !props.hideBody const toggle = useCollapse(collapseProps) const hasTitleClick = !!(collapseOnClick || onClickTitle || (headerProps && headerProps.onClick)) const hasTitle = selectDefined(title, afterTitle, subTitle, icon, date, location) let innerContent = ( ) if (themeInner) { innerContent = {innerContent} } else { // reset inner contents to be original theme innerContent = {innerContent} } return ( {hasTitle && ( ) || undefined} className="ui-card-header grid-draggable" onClickLocation={onClickLocation} onDoubleClick={ (!collapseOnClick && collapseProps.collapsable && toggle.toggle) || undefined } onClick={useCallback( e => { collapseOnClick && toggle.toggle() onClickTitle && onClickTitle(e) }, [collapseOnClick, onClickTitle], )} cursor={hasTitleClick ? 'pointer' : 'inherit'} alignItems="center" titleFlex={titleFlex} subTitleProps={subTitleProps} titleProps={{ fontWeight: 400, ...titleProps, }} hoverStyle={hasTitleClick ? true : false} activeStyle={hasTitleClick ? true : false} afterTitle={afterTitle} title={title} subTitle={subTitle} date={date} icon={icon} location={location} hideSubtitle={hideSubtitle} iconProps={iconProps} preview={preview} iconBefore={iconBefore} padding={selectDefined(titlePadding, 'sm')} {...headerProps} /> )} {innerContent} ) } const backgroundTheme = theme => theme.background // @ts-ignore Card.accepts = { surfaceProps: true, }