react-cimpress-comment
Version:
Visualizes comment(s) for a particular platform resource
383 lines (324 loc) • 15.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
require('../../style/index.css');
var _CommentVisibilityIcon = require('./CommentVisibilityIcon');
var _CommentVisibilityIcon2 = _interopRequireDefault(_CommentVisibilityIcon);
var _CommentRefererIcon = require('./CommentRefererIcon');
var _CommentRefererIcon2 = _interopRequireDefault(_CommentRefererIcon);
var _CommentAuthorAvatar = require('./CommentAuthorAvatar');
var _CommentAuthorAvatar2 = _interopRequireDefault(_CommentAuthorAvatar);
var _CommentAuthor = require('./CommentAuthor');
var _CommentAuthor2 = _interopRequireDefault(_CommentAuthor);
var _CommentTime = require('./CommentTime');
var _CommentTime2 = _interopRequireDefault(_CommentTime);
var _reactMentions = require('react-mentions');
var _renderCoamMentionSuggestion = require('../renderers/renderCoamMentionSuggestion');
var _renderCoamMentionSuggestion2 = _interopRequireDefault(_renderCoamMentionSuggestion);
var _reactComponents = require('@cimpress/react-components');
var _reactI18next = require('react-i18next');
var _i18n = require('../tools/i18n');
var _helper = require('../tools/helper');
var _mentions = require('../clients/mentions');
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; }
var Spinner = _reactComponents.shapes.Spinner;
var Comment = function (_React$Component) {
_inherits(Comment, _React$Component);
function Comment(props) {
_classCallCheck(this, Comment);
var _this = _possibleConstructorReturn(this, (Comment.__proto__ || Object.getPrototypeOf(Comment)).call(this, props));
_this.state = {
editMode: false,
editedComment: null,
updatingComment: !props.comment.createdAt && !props.comment.updatedAt,
commentObject: props.comment
};
return _this;
}
_createClass(Comment, [{
key: 'safeSetState',
value: function safeSetState(data, callback) {
if (this._ismounted) {
this.setState(data, callback);
}
}
}, {
key: 'componentDidMount',
value: function componentDidMount() {
this._ismounted = true;
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this._ismounted = false;
}
}, {
key: 'change',
value: function change(event, newValue, newPlainTextValue, mentions) {
this.safeSetState({
editedComment: newValue
});
}
}, {
key: 'completeEditing',
value: function completeEditing() {
var _this2 = this;
if (this.state.editedComment !== null && this.state.editedComment !== this.state.commentObject.comment) {
this.safeSetState({
updatingComment: true
});
this.props.commentsClient.putComment(this.props.commentUri, this.state.editedComment.trim(), this.state.commentObject.visibility).then(function (responseJson) {
_this2.exitEditing();
_this2.safeSetState({
commentObject: responseJson
});
}).catch(function (err) {
_this2.safeSetState({
errorPut: err,
updatingComment: false
});
});
} else {
this.safeSetState({
editedComment: null,
editMode: false,
updatingComment: false
});
}
}
}, {
key: 'deleteComment',
value: function deleteComment() {
var _this3 = this;
this.safeSetState({
updatingComment: true
});
this.props.commentsClient.deleteComment(this.props.commentUri).then(function () {
if (_this3.props.onDelete) {
_this3.props.onDelete(_this3.props.comment);
}
}).catch(function (err) {
_this3.safeSetState({
errorDelete: err,
updatingComment: false
});
});
}
}, {
key: 'exitEditing',
value: function exitEditing() {
this.safeSetState({
updatingComment: false,
editMode: false,
editedComment: null,
errorPut: null,
errorDelete: null
});
}
}, {
key: 'tt',
value: function tt(key) {
// eslint-disable-next-line react/prop-types
var _props = this.props,
t = _props.t,
locale = _props.locale;
if (locale.length > 2) {
locale = locale.substr(0, 2);
}
return t(key, { lng: locale });
}
}, {
key: 'renderError',
value: function renderError(e, prefix) {
if (!e) {
return null;
}
return _react2.default.createElement(
'span',
{ className: 'text-danger' },
'\xA0',
_react2.default.createElement('i', {
className: 'fa fa-exclamation-triangle' }),
'\xA0',
prefix,
prefix ? _react2.default.createElement(
'span',
null,
'\xA0'
) : null,
'(',
this.tt((0, _helper.errorToString)(e)),
')'
);
}
}, {
key: 'renderEditMenu',
value: function renderEditMenu() {
var _this4 = this;
if (!this.canModify) {
// editing disabled
return null;
}
if (this.state.commentObject.createdBy !== this.props.jwtSub && this.state.commentObject.updatedBy !== this.props.jwtSub) {
// can edit only 'own' comments
return null;
}
if (this.state.editMode) {
return _react2.default.createElement(
'div',
null,
this.state.editedComment !== null && this.state.editedComment !== this.state.commentObject.comment && this.state.editedComment !== '' ? _react2.default.createElement('div', { onClick: this.completeEditing.bind(this), className: 'fa fa-check mentions-ok' }) : null,
this.props.deleteComments ? _react2.default.createElement('div', { onClick: this.deleteComment.bind(this), className: 'fa fa-trash mentions-delete' }) : null,
_react2.default.createElement('div', { onClick: this.exitEditing.bind(this), className: 'fa fa-times mentions-cancel' })
);
}
return _react2.default.createElement('div', { onClick: function onClick() {
return _this4.safeSetState({ editMode: true });
}, className: 'mentions-edit fa fa-edit' });
}
}, {
key: 'render',
value: function render() {
var _this5 = this;
var editMenu = void 0;
var readonlyTextField = void 0;
if (this.state.updatingComment === true) {
readonlyTextField = true;
editMenu = _react2.default.createElement(
'div',
{ className: 'mentions-edit' },
_react2.default.createElement(Spinner, { size: 'small' })
);
} else {
readonlyTextField = !(this.state.editMode && this.props.editComments);
editMenu = this.renderEditMenu();
}
var visibility = this.state.commentObject.visibility || 'internal';
var visibilityOption = this.props.commentVisibilityLevels.find(function (l) {
return l.value === visibility;
});
var commentBody = _react2.default.createElement(
'div',
{
onKeyDown: (0, _helper.performActionOnMetaEnter)(this.completeEditing.bind(this)),
tabIndex: '1',
style: { position: 'relative', display: 'flex', flexFlow: 'row' } },
_react2.default.createElement(
_reactMentions.MentionsInput,
{
className: 'mentions ' + (readonlyTextField ? 'disabled' : ''),
value: this.state.editedComment !== null ? this.state.editedComment : this.state.commentObject.comment,
onChange: this.change.bind(this),
displayTransform: function displayTransform(id, display, type) {
return '@' + display;
}, allowSpaceInQuery: true,
readOnly: readonlyTextField },
_react2.default.createElement(_reactMentions.Mention, { trigger: '@', data: function data(search, callback) {
(0, _mentions.fetchMatchingMentions)(_this5.props.accessToken, search).then(callback);
},
renderSuggestion: _renderCoamMentionSuggestion2.default })
),
this.renderError(this.state.errorPut, this.tt('unable_to_edit_comment')),
this.renderError(this.state.errorDelete, this.tt('unable_to_delete_comment')),
editMenu
);
var error = this.renderError(this.state.error, this.tt('unable_to_read_comment'));
if (error) {
return _react2.default.createElement(
'div',
{ className: this.props.className },
error
);
}
var header = this.props.header;
var avatar = null;
if (typeof header === 'undefined') {
var commentCreator = _react2.default.createElement(_CommentAuthor2.default, {
accessToken: this.props.accessToken,
createdBy: this.state.commentObject.createdBy });
var commentTime = _react2.default.createElement(_CommentTime2.default, {
locale: this.props.locale,
accessToken: this.props.accessToken,
createdBy: this.state.commentObject.createdBy,
createdAt: this.state.commentObject.createdAt,
updatedBy: this.state.commentObject.updatedBy,
updatedAt: this.state.commentObject.updatedAt });
var additionalCommentIndicators = _react2.default.createElement(
'span',
{ className: 'comment-creator' },
_react2.default.createElement(_CommentVisibilityIcon2.default, { icon: visibilityOption.icon, label: visibilityOption.label }),
_react2.default.createElement(_CommentRefererIcon2.default, { referer: this.state.commentObject.referer })
);
avatar = _react2.default.createElement(_CommentAuthorAvatar2.default, { userId: this.state.commentObject.createdBy,
accessToken: this.props.accessToken });
header = _react2.default.createElement(
'span',
{ className: 'comment-creator' },
commentCreator,
commentTime ? _react2.default.createElement(
'span',
null,
',\xA0'
) : null,
commentTime,
additionalCommentIndicators
);
}
return _react2.default.createElement(
'div',
{ className: this.props.className },
_react2.default.createElement(
'div',
null,
avatar
),
_react2.default.createElement(
'div',
null,
header,
_react2.default.createElement(
'div',
{ className: 'comment-body' },
commentBody
),
this.props.footer
)
);
}
}, {
key: 'canModify',
get: function get() {
return this.props.editComments || this.props.deleteComments;
}
}]);
return Comment;
}(_react2.default.Component);
Comment.propTypes = {
locale: _propTypes2.default.string,
accessToken: _propTypes2.default.string,
className: _propTypes2.default.string,
jwtSub: _propTypes2.default.string,
commentUri: _propTypes2.default.string,
comment: _propTypes2.default.object,
editComments: _propTypes2.default.bool,
deleteComments: _propTypes2.default.bool,
onDelete: _propTypes2.default.func,
header: _propTypes2.default.node,
footer: _propTypes2.default.node,
commentVisibilityLevels: _propTypes2.default.array,
commentsClient: _propTypes2.default.any
};
Comment.defaultProps = {
locale: 'en',
className: 'comment'
};
exports.default = (0, _reactI18next.translate)('translations', { i18n: (0, _i18n.getI18nInstance)() })(Comment);