All files / components/Infotip Infotip.jsx

87.32% Statements 62/71
100% Branches 1/1
33.33% Functions 1/3
87.32% Lines 62/71

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 721x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x   1x 1x                 1x 1x 1x 1x 1x 1x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x  
import React from 'react';
import PropTypes from 'prop-types';
import InfotipContent from './InfotipContent';
import InfotipIcon from './InfotipIcon';
 
const BUTTON_SIZE = '16px';
 
const buttonStyle = {
  background: 'transparent',
  border: 0,
  padding: 0,
  width: BUTTON_SIZE,
  height: BUTTON_SIZE,
  WebkitTouchCallout: 'none',
  WebkitUserSelect: 'none',
  userSelect: 'none',
};
 
// TODO: We may want to improve this by tracking touch positions to ensure
// that a 'touchend' event must be reasonably close to the tooltip target.
const touchHandlers = {
  onTouchStart: (e) => {
    e.stopPropagation();
  },
  onTouchEnd: (e) => {
    if (document.activeElement !== e.currentTarget) {
      e.preventDefault();
      e.currentTarget.focus();
    } else {
      e.preventDefault();
      e.currentTarget.blur();
    }
  },
};
 
/**
 * Tooltip with styled information icon
 */
const Infotip = ({ ariaLabel, label, lightIcon, ...props }) => (
  <InfotipContent label={label} {...props}>
    <button
      type="button"
      aria-label={ariaLabel}
      style={buttonStyle}
      {...touchHandlers}
    >
      <InfotipIcon
        lightIcon={lightIcon}
        width={BUTTON_SIZE}
        height={BUTTON_SIZE}
        aria-hidden
        style={{ float: 'left' }}
      />
    </button>
  </InfotipContent>
);
 
Infotip.propTypes = {
  label: PropTypes.string.isRequired,
  ariaLabel: PropTypes.string,
  lightIcon: PropTypes.bool,
  DEBUG_STYLE: PropTypes.bool,
};
 
Infotip.defaultProps = {
  ariaLabel: 'Information',
  lightIcon: false,
  DEBUG_STYLE: undefined,
};
 
export default Infotip;