Skip to content
Snippets Groups Projects
SimpleEditor.jsx 4.13 KiB
Newer Older
import React from 'react'
import ReactDOM from 'react-dom'
import { Alert } from 'react-bootstrap'

john's avatar
john committed
import {
  ProseEditorConfigurator as Configurator,
  DocumentSession
} from 'substance'
john's avatar
john committed
import config from './config'
import Editor from './Editor'
import Importer from './SimpleEditorImporter'
import SimpleExporter from './SimpleEditorExporter'

import './SimpleEditor.scss'

export default class SimpleEditor extends React.Component {
  constructor (props) {
    super(props)
    this.save = this.save.bind(this)
    this.toggleTrackChangesStatus = this.toggleTrackChangesStatus.bind(this)

    this.state = {
      trackChanges: props.fragment.trackChanges
    }
  }

  createSession () {
    const { fragment } = this.props
    let source
    if (fragment) { source = fragment.source }

john's avatar
john committed
    const configurator = new Configurator().import(config)
    configurator.addImporter('html', Importer)

    const importer = configurator.createImporter('html')
    const doc = importer.importDocument(source)
    const documentSession = new DocumentSession(doc)

    documentSession.setSaveHandler({
      saveDocument: this.save
    })
john's avatar
john committed
      configurator: configurator,
      documentSession: documentSession
  toggleTrackChangesStatus () {
    const { fragment, update } = this.props
    fragment.trackChanges = !fragment.trackChanges
    update(fragment)
    this.setState({
      trackChanges: fragment.trackChanges
    })
  }

  save (source, changes, callback) {
    const { onSave } = this.props
john's avatar
john committed
    const config = this.state.config

    const exporter = new SimpleExporter(config)
    const convertedSource = exporter.exportDocument(source)

    onSave(convertedSource, callback)
  }

  componentDidMount () {
    const { canEdit } = this.props
john's avatar
john committed
    const { onSave } = this.props
    const el = ReactDOM.findDOMNode(this)

    const session = this.createSession()
    const documentSession = session.documentSession
    const configurator = session.configurator

    this.setState({
      config: configurator.config
    })
john's avatar
john committed
    Editor.mount({
      book: this.props.book,
      configurator: configurator,
      containerId: 'body',
      disabled: !canEdit, // set to true read only mode
      documentSession: documentSession,
      fragment: this.props.fragment,
john's avatar
john committed
      history: this.props.history,
      onSave: onSave,
      trackChanges: this.props.fragment.trackChanges,
      updateComments: this.props.updateComments,
      user: this.props.user
    }, el)
  }

  // New props arrived, update the editor
  // componentDidUpdate () {
  //   console.log('did update')
  //
  //   var session = this.createSession()
  //   var documentSession = session.documentSession
  //   var configurator = session.configurator
  //
  //   this.writer.extendProps({
  //     documentSession: documentSession,
  //     configurator: configurator
  //   })
  //
  //   console.log(this.writer)
  // }
  //
  // componentWillUnmount () {
  //   this.writer.dispose()
  // }

  render () {
    const { canEdit } = this.props
    let viewMode = !canEdit
    ? (
      <Alert bsStyle='warning' className='view-mode'>
        <span>Editor is in Read-Only Mode</span>
    let trackChangeStatus = 'Off'
    let trackChangesIconClass = 'fa-eye-slash'

    if (this.state.trackChanges === true) {
      trackChangeStatus = 'On'
      trackChangesIconClass = 'fa-eye'
    }

    let trackChanges =
      <Alert bsStyle='warning' className='track-changes'>
        <span>
          <i className={'fa ' + trackChangesIconClass} onClick={this.toggleTrackChangesStatus} />
          Track Changes is {trackChangeStatus}
        </span>
      </Alert>

      <div className='editor-wrapper'>
        {viewMode} {trackChanges}
      </div>
    )
  }
}

SimpleEditor.propTypes = {
  book: React.PropTypes.object.isRequired,
  canEdit: React.PropTypes.bool,
  fragment: React.PropTypes.object.isRequired,
john's avatar
john committed
  history: React.PropTypes.object.isRequired,
  onSave: React.PropTypes.func.isRequired,
  trackChanges: React.PropTypes.bool.isRequired,
  update: React.PropTypes.func.isRequired,
  updateComments: React.PropTypes.func.isRequired,
  user: React.PropTypes.object.isRequired
}