springload/react-portal-popover

View on GitHub
src/components/ToolTip.js

Summary

Maintainability
C
7 hrs
Test Coverage
import React from 'react';
import Portal from 'react-portal';

import PositionProvider from './PositionProvider';

import {
  SIZE,
  FOREGROUND,
  BORDER_COLOUR,
  POSITION,
  BORDER_WIDTH,
  USE_FOREGROUND,
  CLASS_BASE,
  DEFAULT_ARROW_MARGIN,
} from '../constants';

const ToolTip = (props) => {
  const defaults = {
    classBase: CLASS_BASE,
    className: '',
    size: SIZE,
    offset: DEFAULT_ARROW_MARGIN,
    foregroundColor: FOREGROUND,
    color: BORDER_COLOUR,
    position: props.position || POSITION,
    borderWidth: BORDER_WIDTH,
    useForeground: USE_FOREGROUND,
  };

  const options = Object.assign({}, defaults, props.options);
  const classes = `${options.classBase} ${options.classBase}--${options.position} ${options.className}`;

  const style = {};

  if (props.readonly) {
    style.cursor = 'default';
  }

  return (<div>
    <Portal
      closeOnEsc
      closeOnOutsideClick
      isOpened={props.isOpened}
      onClose={props.onClose}
    >
      <PositionProvider
        position={options.position}
        label={props.label}
        id={props.id}
        arrowSize={options.size}
        arrowOffset={options.offset}
        target={props.trigger}
        options={options}
        classes={classes}
        style={style}
      >
        {props.children}
      </PositionProvider>
    </Portal>
  </div>);
};

ToolTip.propTypes = {
  isOpened: React.PropTypes.bool,
  readonly: React.PropTypes.bool,
  small: React.PropTypes.bool,
  onClose: React.PropTypes.func,
  trigger: React.PropTypes.object,
  id: React.PropTypes.string,
  children: React.PropTypes.node,
  label: React.PropTypes.string,
  position: React.PropTypes.string,
  size: React.PropTypes.number,
  options: React.PropTypes.object,
};

export default ToolTip;