All files / atom/card/src index.js

72.72% Statements 8/11
57.69% Branches 15/26
33.33% Functions 1/3
80% Lines 8/10

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103                                1x                         10x     10x       10x   10x                     10x                         1x   1x                                                                            
import cx from 'classnames'
import PropTypes from 'prop-types'
 
import {
  BASE_CLASS,
  BORDER_RADIUS,
  CLASS_HIGHLIGHT,
  CLASS_INFO,
  CLASS_LINK,
  CLASS_MEDIA,
  CLASS_RESPONSIVE,
  CLASS_VERTICAL,
  ELEVATION,
  redirectToHref
} from './config.js'
 
const AtomCard = ({
  media: Media,
  content: Content,
  vertical,
  responsive,
  rounded,
  elevation,
  highlight,
  href,
  blank,
  onClick,
  tabIndex
}) => {
  const onClickHandler = e => {
    typeof onClick === 'function' ? onClick(e) : redirectToHref({href, blank})
  }
  const redirectOnEnter = e => {
    if (e.key === 'Enter') redirectToHref({href, blank})
  }
 
  const isVertical = vertical && !responsive
 
  const classNames = cx(
    BASE_CLASS,
    isVertical && CLASS_VERTICAL,
    responsive && CLASS_RESPONSIVE,
    href && CLASS_LINK,
    onClick && CLASS_LINK,
    highlight && (href || onClick) && CLASS_HIGHLIGHT,
    rounded && `${BASE_CLASS}--rounded-${rounded}`,
    elevation && `${BASE_CLASS}--elevation-${elevation}`
  )
 
  return (
    <div className={classNames} tabIndex={tabIndex} role="button" onClick={onClickHandler} onKeyDown={redirectOnEnter}>
      {Media && (
        <div className={CLASS_MEDIA}>
          <Media />
        </div>
      )}
 
      <div className={CLASS_INFO}>{Content && <Content />}</div>
    </div>
  )
}
 
AtomCard.displayName = 'AtomCard'
 
AtomCard.propTypes = {
  /** HTML (component) to be displayed on the left/right side. It's an optional component */
  media: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
 
  /** HTML (component) to be displayed on the other side */
  content: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
 
  /** true for vertical layout */
  vertical: PropTypes.bool,
 
  /** true for make responsive layout */
  responsive: PropTypes.bool,
 
  /** Specify the border-radius of the card  */
  rounded: PropTypes.oneOf(Object.values(BORDER_RADIUS)),
 
  /** Specify the box-shadow of the card  */
  elevation: PropTypes.oneOf(Object.values(ELEVATION)),
 
  /** true for highlight mode */
  highlight: PropTypes.bool,
 
  /** url target of the card */
  href: PropTypes.string,
 
  /** true to open a new tab */
  blank: PropTypes.bool,
 
  /** tab order */
  tabIndex: PropTypes.string,
 
  /**  */
  onClick: PropTypes.func
}
 
export default AtomCard
 
export {BORDER_RADIUS as atomCardRounded, ELEVATION as atomCardElevation}