Skip to content
Snippets Groups Projects
ContextualBox.js 1.66 KiB
Newer Older
import { has } from 'lodash'
import styled from 'styled-components'
import { Icon, H3 } from '@pubsweet/ui'
import { override, th } from '@pubsweet/ui-toolkit'

import Accordion from './pending/Accordion'
import ControlledAccordion from './pending/ControlledAccordion'

const CustomHeader = ({
  label,
  toggle,
  expanded,
  transparent,
  rightChildren,
  ...props
}) => (
  <Header
    expanded={expanded}
    hasChildren={rightChildren}
    onClick={toggle}
    transparent={transparent}
  >
      <Icon secondary size={2}>
        {expanded ? 'minus' : 'plus'}
      </Icon>
      <H3>{label}</H3>
    {typeof rightChildren === 'function'
      ? rightChildren({ ...props, expanded, transparent })
      : rightChildren}
  </Header>
)

const ContextualBox = ({ label, children, rightChildren, ...props }) =>
  has(props, 'expanded') ? (
    <ControlledAccordion
      header={CustomHeader}
      label={label}
      rightChildren={rightChildren}
      {...props}
    >
      {children}
    </ControlledAccordion>
  ) : (
    <Accordion
      header={CustomHeader}
      label={label}
      rightChildren={rightChildren}
      {...props}
    >
      {children}
    </Accordion>
  )

export default ContextualBox

// #region styles
const Header = styled.div.attrs({
  'data-test-id': props => props['data-test-id'] || 'accordion-header',
})`
  align-items: center;
  cursor: pointer;
  display: flex;
  justify-content: ${props =>
    props.hasChildren ? 'space-between' : 'flex-start'};
  ${override('ui.Accordion.Header')};

  ${H3} {
    margin: ${th('gridUnit')} 0;
  }

  & div {
    align-items: center;
    display: flex;
  }
`
// #endregion