/*
* This file is part of ORY Editor.
*
* ORY Editor is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ORY Editor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with ORY Editor. If not, see .
*
* @license LGPL-3.0
* @copyright 2016-2018 Aeneas Rekkas
* @author Aeneas Rekkas
*
*/
import * as React from 'react';
import { Provider } from 'react-redux';
import dragDropContext from '../DragDropContext';
import HotKeyDecorator from '../HotKey/Decorator';
import { editable } from '../../selector/editable';
import Inner from './Inner';
import { EditorState } from '../../types/editor';
import Editor from '../../';
export type PropTypes = {
id: string;
editor: Editor;
onChange?: Function;
};
class Editable extends React.PureComponent {
unsubscribe: Function;
previousState: EditorState = {};
DragDropContext: React.ComponentClass;
constructor(props: PropTypes) {
super(props);
this.DragDropContext = dragDropContext(props.editor.dragDropContext);
}
componentDidMount() {
if (!this.props.id) {
throw new Error('The state must have an unique id');
}
this.unsubscribe = this.props.editor.store.subscribe(this.onChange);
this.previousState = null;
}
componentWillUnmount() {
this.unsubscribe();
}
onChange = () => {
const { onChange } = this.props;
if (typeof onChange !== 'function') {
return;
}
const state: EditorState = editable(this.props.editor.store.getState(), {
id: this.props.id,
});
if (state === this.previousState || !state) {
return;
}
const serialized = this.props.editor.plugins.serialize(state);
onChange(serialized);
}
render() {
const {
id,
editor: { store, defaultPlugin },
} = this.props;
const DragDropContext = this.DragDropContext;
return (
);
}
}
export default Editable;