Home Reference Source

application/components/content/diff.js

import React from 'react';
import {htmlDiff, degraf} from './../../util/strings';

/**
 * Diff accepts two HTML strings and displays
 * a marked up diff of the two
 */
class Diff extends React.Component {
    constructor(props) {
        super(props);
        this.displayName = 'Diff';

        this.getDiff = this.getDiff.bind(this);

        this.state = {
            diff: '',
            inputA: this.props.inputA,
            inputB: this.props.inputB
        };
    }

    componentWillReceiveProps(nextProps) {
        if (nextProps.inputA != this.state.inputA
            || nextProps.inputB != this.state.inputB) {

            this.setState(nextProps);
            this.setState({diff: htmlDiff(nextProps.inputA, nextProps.inputB)});
        }
    }

    componentWillMount() {
        if (this.state.inputA && this.state.inputB) {
            this.setState({diff: htmlDiff(this.state.inputA, this.state.inputB)});
        }
    }

    /**
     * Used to dangerously set the html of the differ. You can also
     * use this method to get a copy of the html diff.
     * @see react-application/__tests__/components/content/diff-test.js
     * @return {object} object with '__html' key containing the diff
     */
    getDiff() {
        return {
            '__html': degraf(this.state.diff)
        };
    }

    render() {
        if (!this.state.diff) {
            return <div>Waiting for second input...</div>;
        }

        return <div dangerouslySetInnerHTML={this.getDiff()}></div>;
    }
}

export default Diff;