Home Reference Source

src/components/snippets/Typography/ContentEditable.jsx

import React, { Component, createRef } from 'react';
import PropTypes from 'prop-types';

import { moveCursorToEnd } from './utils';

class ContentEditable extends Component {
  constructor(props) {
    super(props);
    this.ref = createRef();
  }

  componentDidUpdate(prevProps) {
    if (this.props.editable !== prevProps.editable && this.props.editable) {
      this.ref.current.focus();
      moveCursorToEnd(this.ref.current);
    }
  }

  render() {
    const { editable, children, onChange } = this.props;

    return editable ? (
      <div
        className="editable"
        ref={this.ref}
        contentEditable={editable}
        onInput={onChange}
      >
        {children}
      </div>
    ) : (
      children
    );
  }
}

ContentEditable.propTypes = {
  editable: PropTypes.bool,
  onChange: PropTypes.func,
  children: PropTypes.node,
};

ContentEditable.defaultProps = {
  editable: false,
  onChange: () => {},
  children: null,
};

export default ContentEditable;