dh-c
Version:
The front-end development engineers jimberton gulp react component
220 lines (184 loc) • 7.95 kB
JavaScript
;
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _rcUpload = require('rc-upload');
var _rcUpload2 = _interopRequireDefault(_rcUpload);
var _icon = require('../icon');
var _icon2 = _interopRequireDefault(_icon);
var _draftJs = require('draft-js');
var _draftConvert = require('draft-convert');
var _utils = require('./utils');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
// function Filtrate(str){
// return str.replace(/(\s*<p>\s*<br>\s*<\/p>\s*)(<figure>)|(<\/figure>)(\s*<p>\s*<br>\s*<\/p>\s*)/ig,
// (_, $1, $2, $3 ) => $2 =='<figure>' ? $2 :'</figure>' )
// }
var Tinymce = function (_React$Component) {
_inherits(Tinymce, _React$Component);
function Tinymce(props) {
_classCallCheck(this, Tinymce);
var _this = _possibleConstructorReturn(this, _React$Component.call(this, props));
_this.state = {
editorState: _draftJs.EditorState.createEmpty()
};
_this.handleChange = _this._onChange.bind(_this);
_this.handleClickImages = _this._insertImage.bind(_this);
_this.handleClickSave = _this._handleClickSave.bind(_this);
_this._imagesUploadSuccess = _this._imagesUploadSuccess.bind(_this);
return _this;
}
Tinymce.prototype.componentWillMount = function componentWillMount() {
if (this.props.rawContent) {
var _editorState = this.state.editorState;
var contentState = (0, _draftConvert.convertFromHTML)((0, _utils.getFromHTMLConfig)())(this.props.rawContent);
var editorState = _draftJs.EditorState.push(_editorState, contentState, 'change-block-data');
this.setState({ editorState: editorState });
}
};
Tinymce.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
if (nextProps.rawContent && nextProps.rawContent !== this.props.rawContent) {
var _editorState = this.state.editorState;
var contentState = (0, _draftConvert.convertFromHTML)((0, _utils.getFromHTMLConfig)())(nextProps.rawContent);
var editorState = _draftJs.EditorState.push(_editorState, contentState, 'change-block-data');
this.setState({ editorState: editorState });
}
};
Tinymce.prototype._onChange = function _onChange(editorState) {
this.setState({ editorState: editorState });
var onChange = this.props.onChange;
if (onChange) {
onChange(editorState.getCurrentContent().getPlainText());
}
};
Tinymce.prototype._insertImage = function _insertImage(src, description) {
this.handleChange((0, _utils.insertImages)(this.state.editorState, {
src: src,
description: description
}));
};
/**
* image 上传
*/
Tinymce.prototype._imagesUploadSuccess = function _imagesUploadSuccess(res) {
var uploadConfig = this.props.uploadConfig;
if ('formatResult' in uploadConfig) {
var result = uploadConfig.formatResult(res);
this._insertImage(result.url, result.name);
} else {
throw "必须配置formatResult, 便于Tinymce接受上传后的图片";
}
};
// getHtmlContent() {
// let _editorState = this.state.editorState.getCurrentContent()
// let _entityStyleFn = (entity) => {
// const entityType = entity.get('type').toLowerCase();
// if (entityType === 'image') {
// const data = entity.getData();
// return {
// element: 'img',
// attributes: {
// src: data.src,
// name: 'dhc-img'
// }
// }
// }
// }
// return stateToHTML(_editorState, { entityStyleFn: _entityStyleFn })
// }
Tinymce.prototype._convertToHTML = function _convertToHTML(contentState) {
var config = (0, _utils.getToHTMLConfig)({ contentState: contentState });
return (0, _draftConvert.convertToHTML)(config)(contentState);
};
Tinymce.prototype._handleClickSave = function _handleClickSave() {
if (this.enabled) {
var html = this._convertToHTML(this.state.editorState.getCurrentContent());
if (this.props.onSave) {
this.props.onSave(html);
this.setState({ editorState: _draftJs.EditorState.createEmpty() });
}
}
};
Tinymce.prototype.render = function render() {
var _props = this.props,
uploadConfig = _props.uploadConfig,
footer = _props.footer,
footerText = _props.footerText,
innerElement = _props.innerElement,
placeholder = _props.placeholder,
onSnap = _props.onSnap,
snap = _props.snap;
var editorState = this.state.editorState;
var uploadProps = _extends({
prefixCls: "dh-upload",
className: 'dh-tinymce-ctr'
}, uploadConfig, {
start: function start(file) {
return console.log('onStart', file, file.name);
},
onSuccess: this._imagesUploadSuccess,
onError: function onError() {
return console.error('onError', err);
}
});
this.enabled = !!(editorState.getCurrentContent().getPlainText().length || innerElement);
return _react2.default.createElement(
'div',
{ className: 'dh-tinymce' },
_react2.default.createElement(
'div',
{ className: 'dh-tinymce-btns' },
_react2.default.createElement(
_rcUpload2.default,
uploadProps,
_react2.default.createElement(_icon2.default, { type: 'tupian' }),
' '
),
snap && _react2.default.createElement(
'span',
{ className: 'dh-tinymce-ctr', onClick: onSnap },
_react2.default.createElement(_icon2.default, { type: 'kuaizhao' })
)
),
innerElement,
_react2.default.createElement(
'div',
{ className: 'dh-tinymce-edit' },
_react2.default.createElement(_draftJs.Editor, {
placeholder: placeholder,
blockRendererFn: _utils.MediaBlockRenderer,
editorState: this.state.editorState,
onChange: this.handleChange
})
),
_react2.default.createElement(
'div',
{ className: 'dh-tinymce-footer' },
footer === true ? _react2.default.createElement(
'div',
{ className: 'dh-tinymce-footer' },
_react2.default.createElement(
'span',
{
onClick: this.handleClickSave,
className: this.enabled ? '' : 'not-allowed'
},
footerText || '发送'
)
) : null
)
);
};
return Tinymce;
}(_react2.default.Component);
Tinymce.defaultProps = {
placeholder: '请输入文字.......',
onSnap: function onSnap() {}
};
exports.default = Tinymce;