+ }
{
diff --git a/client/coral-embed-stream/src/components/InactiveCommentLabel.css b/client/coral-embed-stream/src/components/InactiveCommentLabel.css
new file mode 100644
index 000000000..01ba197b5
--- /dev/null
+++ b/client/coral-embed-stream/src/components/InactiveCommentLabel.css
@@ -0,0 +1,32 @@
+.root {
+ display: inline-block;
+ color: white;
+ background: grey;
+ height: 22px;
+ box-sizing: border-box;
+ line-height: 19px;
+ padding: 2px 6px 2px 4px;
+ border-radius: 2px;
+ font-size: 12px;
+ text-transform: capitalize;
+}
+
+.icon {
+ font-size: 14px;
+ vertical-align: text-top;
+ margin: 0;
+ margin-right: 4px;
+}
+
+.label {
+ display: inline-block;
+}
+
+.premod {
+ background: #063B9A;
+}
+
+.rejected {
+ background: #d03235;
+}
+
diff --git a/client/coral-embed-stream/src/components/InactiveCommentLabel.js b/client/coral-embed-stream/src/components/InactiveCommentLabel.js
new file mode 100644
index 000000000..824692558
--- /dev/null
+++ b/client/coral-embed-stream/src/components/InactiveCommentLabel.js
@@ -0,0 +1,36 @@
+import React, {PropTypes} from 'react';
+import t from 'coral-framework/services/i18n';
+import styles from './InactiveCommentLabel.css';
+import {Icon} from 'coral-ui';
+import cn from 'classnames';
+
+const InactiveCommentLabel = ({status, className, ...rest}) => {
+ let label;
+ let icon;
+
+ switch (status) {
+ case 'PREMOD':
+ label = t('modqueue.premod');
+ icon = 'query_builder';
+ break;
+ case 'REJECTED':
+ label = t('modqueue.rejected');
+ icon = 'close';
+ break;
+ default:
+ throw new Error(`Unknown inactive status ${status}`);
+ }
+
+ return (
+
+
+ {label}
+
+ );
+};
+
+InactiveCommentLabel.propTypes = {
+ status: PropTypes.string.isRequired,
+};
+
+export default InactiveCommentLabel;
diff --git a/client/coral-embed-stream/src/components/Stream.js b/client/coral-embed-stream/src/components/Stream.js
index 66ffc0fc8..421a0cf7a 100644
--- a/client/coral-embed-stream/src/components/Stream.js
+++ b/client/coral-embed-stream/src/components/Stream.js
@@ -13,6 +13,7 @@ import t, {timeago} from 'coral-framework/services/i18n';
import {getSlotComponents} from 'coral-framework/helpers/plugins';
import CommentBox from 'talk-plugin-commentbox/CommentBox';
import QuestionBox from 'talk-plugin-questionbox/QuestionBox';
+import {isCommentActive} from 'coral-framework/utils';
import {Button, TabBar, Tab, TabCount, TabContent, TabPane} from 'coral-ui';
import cn from 'classnames';
@@ -105,7 +106,9 @@ class Stream extends React.Component {
// even though the permalinked comment is the highlighted one, we're displaying its parent + replies
let highlightedComment = comment && getTopLevelParent(comment);
if (highlightedComment) {
- const isInactive = ['NONE', 'ACCEPTED'].indexOf(comment.status) === -1;
+
+ // Inactive comments can be viewed by moderators and admins (e.g. using permalinks).
+ const isInactive = !isCommentActive(comment.status);
if (comment.parent && isInactive) {
// the highlighted comment is not active and as such not in the replies, so we
diff --git a/client/coral-framework/utils/index.js b/client/coral-framework/utils/index.js
index 3768b3940..96d9ed629 100644
--- a/client/coral-framework/utils/index.js
+++ b/client/coral-framework/utils/index.js
@@ -187,3 +187,7 @@ export function buildUrl({protocol, hostname, port, pathname, search, hash} = wi
export function getSlotFragmentSpreads(slots, resource) {
return `...${slots.map((s) => `TalkSlot_${capitalize(s)}_${resource}`).join('\n...')}\n`;
}
+
+export function isCommentActive(commentStatus) {
+ return ['NONE', 'ACCEPTED'].indexOf(commentStatus) >= 0;
+}