From f95b705585f635f44f16063012e85dbff6ae024a Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Fri, 12 Jul 2019 20:41:34 +0000 Subject: [PATCH] feat: added toxic labels (#2396) --- .../sections/Moderation/PerspectiveConfig.tsx | 4 +- .../ModerateCard/FlagDetailsCategory.css | 3 - .../ModerateCard/FlagDetailsCategory.tsx | 6 +- .../ModerateCard/FlagDetailsContainer.tsx | 144 ++++++----- .../routes/Moderate/ModerateCard/Markers.css | 4 + .../routes/Moderate/ModerateCard/Markers.tsx | 13 +- .../ModerateCard/MarkersContainer.spec.tsx | 73 ++++-- .../ModerateCard/MarkersContainer.tsx | 103 +++++--- .../ModerateCard/ModerateCard.spec.tsx | 1 + .../Moderate/ModerateCard/ModerateCard.tsx | 4 +- .../ModerateCard/ModerateCardContainer.tsx | 2 + .../Moderate/ModerateCard/ToxicityLabel.css | 3 + .../Moderate/ModerateCard/ToxicityLabel.tsx | 45 ++++ .../MarkersContainer.spec.tsx.snap | 76 ++++-- .../__snapshots__/ModerateCard.spec.tsx.snap | 6 + .../__snapshots__/moderation.spec.tsx.snap | 4 +- src/core/client/admin/test/fixtures.ts | 105 +++++--- .../__snapshots__/regularQueue.spec.tsx.snap | 234 ++++++++---------- .../__snapshots__/rejectedQueue.spec.tsx.snap | 140 +++++------ .../__snapshots__/singleComment.spec.tsx.snap | 90 +++---- .../client/ui/components/Counter/Counter.css | 4 + .../client/ui/components/Counter/Counter.tsx | 3 +- .../__snapshots__/Counter.spec.tsx.snap | 1 + .../client/ui/components/Marker/Count.css | 2 +- .../client/ui/components/Marker/Marker.css | 2 +- .../ui/components/Typography/Typography.css | 4 + .../ui/components/Typography/Typography.tsx | 2 + src/core/common/constants.ts | 7 + .../graph/tenant/resolvers/CommentRevision.ts | 2 + .../server/graph/tenant/schema/schema.graphql | 32 ++- src/core/server/models/comment/index.ts | 39 +-- src/core/server/services/comments/index.ts | 2 +- .../services/comments/pipeline/index.spec.ts | 14 +- .../services/comments/pipeline/index.ts | 24 +- .../comments/pipeline/phases/commentLength.ts | 1 - .../comments/pipeline/phases/detectLinks.ts | 14 +- .../comments/pipeline/phases/preModerate.ts | 1 - .../services/comments/pipeline/phases/spam.ts | 2 +- .../pipeline/phases/storyClosed.spec.ts | 10 - .../comments/pipeline/phases/storyClosed.ts | 9 +- .../comments/pipeline/phases/toxic.ts | 13 +- src/locales/en-US/admin.ftl | 5 + 42 files changed, 727 insertions(+), 526 deletions(-) delete mode 100644 src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsCategory.css create mode 100644 src/core/client/admin/routes/Moderate/ModerateCard/ToxicityLabel.css create mode 100644 src/core/client/admin/routes/Moderate/ModerateCard/ToxicityLabel.tsx diff --git a/src/core/client/admin/routes/Configure/sections/Moderation/PerspectiveConfig.tsx b/src/core/client/admin/routes/Configure/sections/Moderation/PerspectiveConfig.tsx index 3a3b250c7..c8f92cd88 100644 --- a/src/core/client/admin/routes/Configure/sections/Moderation/PerspectiveConfig.tsx +++ b/src/core/client/admin/routes/Configure/sections/Moderation/PerspectiveConfig.tsx @@ -6,6 +6,7 @@ import { Field } from "react-final-form"; import { formatPercentage, parsePercentage } from "coral-framework/lib/form"; import { + TOXICITY_ENDPOINT_DEFAULT, TOXICITY_MODEL_DEFAULT, TOXICITY_THRESHOLD_DEFAULT, } from "coral-common/constants"; @@ -220,7 +221,7 @@ const PerspectiveConfig: FunctionComponent = ({ disabled }) => { By default the endpoint is set to $default. You may override this @@ -242,6 +243,7 @@ const PerspectiveConfig: FunctionComponent = ({ disabled }) => { autoComplete="off" autoCorrect="off" autoCapitalize="off" + placeholder={TOXICITY_ENDPOINT_DEFAULT} spellCheck={false} /> {meta.touched && (meta.error || meta.submitError) && ( diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsCategory.css b/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsCategory.css deleted file mode 100644 index 3ce9c004c..000000000 --- a/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsCategory.css +++ /dev/null @@ -1,3 +0,0 @@ -.category { - color: var(--palette-error-darkest); -} diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsCategory.tsx b/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsCategory.tsx index e0e70ed68..8f8d58ed9 100644 --- a/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsCategory.tsx +++ b/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsCategory.tsx @@ -2,8 +2,6 @@ import React, { FunctionComponent } from "react"; import { HorizontalGutter, Typography } from "coral-ui/components"; -import styles from "./FlagDetailsCategory.css"; - interface Props { category: React.ReactNode; children?: React.ReactNode; @@ -15,9 +13,7 @@ const FlagDetailsCategory: FunctionComponent = ({ }) => { return ( - - {category} - + {category} {children} ); diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsContainer.tsx b/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsContainer.tsx index e880f1e03..781cd389e 100644 --- a/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsContainer.tsx +++ b/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsContainer.tsx @@ -1,80 +1,94 @@ import { Localized } from "fluent-react/compat"; -import React from "react"; +import React, { FunctionComponent } from "react"; import { graphql } from "react-relay"; -import { FlagDetailsContainer_comment as CommentData } from "coral-admin/__generated__/FlagDetailsContainer_comment.graphql"; +import { FlagDetailsContainer_comment } from "coral-admin/__generated__/FlagDetailsContainer_comment.graphql"; +import { FlagDetailsContainer_settings } from "coral-admin/__generated__/FlagDetailsContainer_settings.graphql"; import NotAvailable from "coral-admin/components/NotAvailable"; +import { TOXICITY_THRESHOLD_DEFAULT } from "coral-common/constants"; import { withFragmentContainer } from "coral-framework/lib/relay"; import { GQLCOMMENT_FLAG_REASON } from "coral-framework/schema"; import { HorizontalGutter } from "coral-ui/components"; import FlagDetailsCategory from "./FlagDetailsCategory"; import FlagDetailsEntry from "./FlagDetailsEntry"; +import ToxicityLabel from "./ToxicityLabel"; interface Props { - comment: CommentData; + comment: FlagDetailsContainer_comment; + settings: FlagDetailsContainer_settings; } -export class FlagDetailsContainer extends React.Component { - public render() { - const nodes = this.props.comment.flags.nodes; - const offensiveList: React.ReactElement[] = []; - const spamList: React.ReactElement[] = []; - nodes.forEach((n, i) => { - switch (n.reason) { - case GQLCOMMENT_FLAG_REASON.COMMENT_REPORTED_OFFENSIVE: - offensiveList.push( +const FlagDetailsContainer: FunctionComponent = ({ + comment: { + revision: { metadata }, + flags: { nodes }, + }, + settings, +}) => { + const offensive = nodes.filter( + ({ reason }) => reason === GQLCOMMENT_FLAG_REASON.COMMENT_REPORTED_OFFENSIVE + ); + const spam = nodes.filter( + ({ reason }) => reason === GQLCOMMENT_FLAG_REASON.COMMENT_REPORTED_SPAM + ); + + return ( + + {metadata.perspective && ( + + Toxicity Score + + } + > + + + )} + {offensive.length > 0 && ( + + Offensive + + } + > + {offensive.map((flag, i) => ( } - details={n.additionalDetails} + user={flag.flagger ? flag.flagger.username : } + details={flag.additionalDetails} /> - ); - return; - case GQLCOMMENT_FLAG_REASON.COMMENT_REPORTED_SPAM: - spamList.push( + ))} + + )} + {spam.length > 0 && ( + + Spam + + } + > + {spam.map((flag, i) => ( } - details={n.additionalDetails} + user={flag.flagger ? flag.flagger.username : } + details={flag.additionalDetails} /> - ); - return; - default: - return; - } - }); - if (offensiveList.length + spamList.length === 0) { - return null; - } - return ( - - {offensiveList.length > 0 && ( - - Offensive - - } - > - {offensiveList} - - )} - {spamList.length > 0 && ( - - Spam - - } - > - {spamList} - - )} - - ); - } -} + ))} + + )} + + ); +}; const enhanced = withFragmentContainer({ comment: graphql` @@ -88,6 +102,22 @@ const enhanced = withFragmentContainer({ additionalDetails } } + revision { + metadata { + perspective { + score + } + } + } + } + `, + settings: graphql` + fragment FlagDetailsContainer_settings on Settings { + integrations { + perspective { + threshold + } + } } `, })(FlagDetailsContainer); diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/Markers.css b/src/core/client/admin/routes/Moderate/ModerateCard/Markers.css index 6d2f74e66..123823806 100644 --- a/src/core/client/admin/routes/Moderate/ModerateCard/Markers.css +++ b/src/core/client/admin/routes/Moderate/ModerateCard/Markers.css @@ -14,3 +14,7 @@ .detailsText { margin: 0; } + +.detailsDivider { + border: 1px solid var(--palette-grey-lightest); +} diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/Markers.tsx b/src/core/client/admin/routes/Moderate/ModerateCard/Markers.tsx index 1bdd9fef2..89a6c2b0b 100644 --- a/src/core/client/admin/routes/Moderate/ModerateCard/Markers.tsx +++ b/src/core/client/admin/routes/Moderate/ModerateCard/Markers.tsx @@ -18,9 +18,9 @@ const Markers: FunctionComponent = ({ children, details }) => { showDetails, ]); return ( - - - {children} + + + {children} {details && ( )} - {showDetails &&
{details}
} + {showDetails && ( +
+
+ {details} +
+ )}
); }; diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/MarkersContainer.spec.tsx b/src/core/client/admin/routes/Moderate/ModerateCard/MarkersContainer.spec.tsx index bdf91e667..9ab6e1d11 100644 --- a/src/core/client/admin/routes/Moderate/ModerateCard/MarkersContainer.spec.tsx +++ b/src/core/client/admin/routes/Moderate/ModerateCard/MarkersContainer.spec.tsx @@ -1,6 +1,7 @@ import React from "react"; import { createRenderer } from "react-test-renderer/shallow"; +import { TOXICITY_THRESHOLD_DEFAULT } from "coral-common/constants"; import { removeFragmentRefs } from "coral-framework/testHelpers"; import { PropTypesOf } from "coral-framework/types"; @@ -12,19 +13,33 @@ it("renders all markers", () => { const props: PropTypesOf = { comment: { status: "PREMOD", - actionCounts: { - flag: { - reasons: { - COMMENT_DETECTED_TOXIC: 1, - COMMENT_DETECTED_SPAM: 1, - COMMENT_DETECTED_TRUST: 1, - COMMENT_DETECTED_LINKS: 1, - COMMENT_DETECTED_BANNED_WORD: 1, - COMMENT_DETECTED_SUSPECT_WORD: 1, - COMMENT_REPORTED_OFFENSIVE: 2, - COMMENT_REPORTED_SPAM: 3, + revision: { + actionCounts: { + flag: { + reasons: { + COMMENT_DETECTED_TOXIC: 1, + COMMENT_DETECTED_SPAM: 1, + COMMENT_DETECTED_TRUST: 1, + COMMENT_DETECTED_LINKS: 1, + COMMENT_DETECTED_BANNED_WORD: 1, + COMMENT_DETECTED_SUSPECT_WORD: 1, + COMMENT_REPORTED_OFFENSIVE: 2, + COMMENT_REPORTED_SPAM: 3, + }, }, }, + metadata: { + perspective: { + score: 0, + }, + }, + }, + }, + settings: { + integrations: { + perspective: { + threshold: TOXICITY_THRESHOLD_DEFAULT / 100, + }, }, }, }; @@ -37,19 +52,33 @@ it("renders some markers", () => { const props: PropTypesOf = { comment: { status: "PREMOD", - actionCounts: { - flag: { - reasons: { - COMMENT_DETECTED_TOXIC: 1, - COMMENT_DETECTED_SPAM: 0, - COMMENT_DETECTED_TRUST: 1, - COMMENT_DETECTED_LINKS: 0, - COMMENT_DETECTED_BANNED_WORD: 1, - COMMENT_DETECTED_SUSPECT_WORD: 0, - COMMENT_REPORTED_OFFENSIVE: 2, - COMMENT_REPORTED_SPAM: 0, + revision: { + actionCounts: { + flag: { + reasons: { + COMMENT_DETECTED_TOXIC: 1, + COMMENT_DETECTED_SPAM: 0, + COMMENT_DETECTED_TRUST: 1, + COMMENT_DETECTED_LINKS: 0, + COMMENT_DETECTED_BANNED_WORD: 1, + COMMENT_DETECTED_SUSPECT_WORD: 0, + COMMENT_REPORTED_OFFENSIVE: 2, + COMMENT_REPORTED_SPAM: 0, + }, }, }, + metadata: { + perspective: { + score: 1, + }, + }, + }, + }, + settings: { + integrations: { + perspective: { + threshold: TOXICITY_THRESHOLD_DEFAULT / 100, + }, }, }, }; diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/MarkersContainer.tsx b/src/core/client/admin/routes/Moderate/ModerateCard/MarkersContainer.tsx index fc7d78444..5ecc57107 100644 --- a/src/core/client/admin/routes/Moderate/ModerateCard/MarkersContainer.tsx +++ b/src/core/client/admin/routes/Moderate/ModerateCard/MarkersContainer.tsx @@ -2,26 +2,30 @@ import { Localized } from "fluent-react/compat"; import React from "react"; import { graphql } from "react-relay"; -import { MarkersContainer_comment as CommentData } from "coral-admin/__generated__/MarkersContainer_comment.graphql"; +import { MarkersContainer_comment } from "coral-admin/__generated__/MarkersContainer_comment.graphql"; +import { MarkersContainer_settings } from "coral-admin/__generated__/MarkersContainer_settings.graphql"; import { withFragmentContainer } from "coral-framework/lib/relay"; import { Marker, MarkerCount } from "coral-ui/components"; import FlagDetailsContainer from "./FlagDetailsContainer"; import Markers from "./Markers"; interface MarkersContainerProps { - comment: CommentData; + comment: MarkersContainer_comment; + settings: MarkersContainer_settings; } -function hasDetails(c: CommentData) { +function hasDetails(c: MarkersContainer_comment) { return ( - c.actionCounts.flag.reasons.COMMENT_REPORTED_OFFENSIVE + - c.actionCounts.flag.reasons.COMMENT_REPORTED_SPAM > - 0 + c.revision.actionCounts.flag.reasons.COMMENT_REPORTED_OFFENSIVE + + c.revision.actionCounts.flag.reasons.COMMENT_REPORTED_SPAM > + 0 || c.revision.metadata.perspective ); } let keyCounter = 0; -const markers: Array<(c: CommentData) => React.ReactElement | null> = [ +const markers: Array< + (c: MarkersContainer_comment) => React.ReactElement | null +> = [ c => (c.status === "PREMOD" && ( @@ -30,21 +34,21 @@ const markers: Array<(c: CommentData) => React.ReactElement | null> = [ )) || null, c => - (c.actionCounts.flag.reasons.COMMENT_DETECTED_LINKS && ( + (c.revision.actionCounts.flag.reasons.COMMENT_DETECTED_LINKS && ( Link )) || null, c => - (c.actionCounts.flag.reasons.COMMENT_DETECTED_BANNED_WORD && ( + (c.revision.actionCounts.flag.reasons.COMMENT_DETECTED_BANNED_WORD && ( Banned Word )) || null, c => - (c.actionCounts.flag.reasons.COMMENT_DETECTED_SUSPECT_WORD && ( + (c.revision.actionCounts.flag.reasons.COMMENT_DETECTED_SUSPECT_WORD && ( Suspect Word @@ -53,46 +57,46 @@ const markers: Array<(c: CommentData) => React.ReactElement | null> = [ )) || null, c => - (c.actionCounts.flag.reasons.COMMENT_DETECTED_SPAM && ( + (c.revision.actionCounts.flag.reasons.COMMENT_DETECTED_SPAM && ( Spam )) || null, c => - (c.actionCounts.flag.reasons.COMMENT_DETECTED_TOXIC && ( + (c.revision.actionCounts.flag.reasons.COMMENT_DETECTED_TOXIC && ( Toxic )) || null, c => - (c.actionCounts.flag.reasons.COMMENT_DETECTED_TRUST && ( + (c.revision.actionCounts.flag.reasons.COMMENT_DETECTED_TRUST && ( Karma )) || null, c => - (c.actionCounts.flag.reasons.COMMENT_REPORTED_OFFENSIVE && ( + (c.revision.actionCounts.flag.reasons.COMMENT_REPORTED_OFFENSIVE && ( Offensive {" "} - {c.actionCounts.flag.reasons.COMMENT_REPORTED_OFFENSIVE} + {c.revision.actionCounts.flag.reasons.COMMENT_REPORTED_OFFENSIVE} )) || null, c => - (c.actionCounts.flag.reasons.COMMENT_REPORTED_SPAM && ( + (c.revision.actionCounts.flag.reasons.COMMENT_REPORTED_SPAM && ( Spam {" "} - {c.actionCounts.flag.reasons.COMMENT_REPORTED_SPAM} + {c.revision.actionCounts.flag.reasons.COMMENT_REPORTED_SPAM} )) || @@ -102,20 +106,25 @@ const markers: Array<(c: CommentData) => React.ReactElement | null> = [ export class MarkersContainer extends React.Component { public render() { const elements = markers.map(cb => cb(this.props.comment)).filter(m => m); - if (elements.length) { - return ( - - ) : null - } - > - {elements} - - ); + const doesHaveDetails = hasDetails(this.props.comment); + if (elements.length === 0 && !doesHaveDetails) { + return null; } - return null; + + return ( + + ) : null + } + > + {elements} + + ); } } @@ -124,22 +133,34 @@ const enhanced = withFragmentContainer({ fragment MarkersContainer_comment on Comment { ...FlagDetailsContainer_comment status - actionCounts { - flag { - reasons { - COMMENT_DETECTED_TOXIC - COMMENT_DETECTED_SPAM - COMMENT_DETECTED_TRUST - COMMENT_DETECTED_LINKS - COMMENT_DETECTED_BANNED_WORD - COMMENT_DETECTED_SUSPECT_WORD - COMMENT_REPORTED_OFFENSIVE - COMMENT_REPORTED_SPAM + revision { + actionCounts { + flag { + reasons { + COMMENT_DETECTED_TOXIC + COMMENT_DETECTED_SPAM + COMMENT_DETECTED_TRUST + COMMENT_DETECTED_LINKS + COMMENT_DETECTED_BANNED_WORD + COMMENT_DETECTED_SUSPECT_WORD + COMMENT_REPORTED_OFFENSIVE + COMMENT_REPORTED_SPAM + } + } + } + metadata { + perspective { + score } } } } `, + settings: graphql` + fragment MarkersContainer_settings on Settings { + ...FlagDetailsContainer_settings + } + `, })(MarkersContainer); export default enhanced; diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.spec.tsx b/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.spec.tsx index 42c064e68..49b172885 100644 --- a/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.spec.tsx +++ b/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.spec.tsx @@ -16,6 +16,7 @@ const baseProps: PropTypesOf = { body: "content", inReplyTo: null, comment: {}, + settings: {}, status: "undecided", featured: false, viewContextHref: "http://localhost/comment", diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.tsx b/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.tsx index 7336708fe..a9ea65b28 100644 --- a/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.tsx +++ b/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.tsx @@ -29,6 +29,7 @@ interface Props { body: string; inReplyTo: string | null; comment: PropTypesOf["comment"]; + settings: PropTypesOf["settings"]; status: "approved" | "rejected" | "undecided"; featured: boolean; moderatedBy: React.ReactNode | null; @@ -60,6 +61,7 @@ const ModerateCard: FunctionComponent = ({ body, inReplyTo, comment, + settings, viewContextHref, status, featured, @@ -146,7 +148,7 @@ const ModerateCard: FunctionComponent = ({ )} - +
diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCardContainer.tsx b/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCardContainer.tsx index 4fd86f61c..e7169a7a5 100644 --- a/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCardContainer.tsx +++ b/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCardContainer.tsx @@ -141,6 +141,7 @@ const ModerateCardContainer: FunctionComponent = ({ body={comment.body!} inReplyTo={comment.parent && comment.parent.author!.username!} comment={comment} + settings={settings} dangling={danglingLogic(comment.status)} status={getStatus(comment)} featured={isFeatured(comment)} @@ -211,6 +212,7 @@ const enhanced = withFragmentContainer({ banned suspect } + ...MarkersContainer_settings } `, viewer: graphql` diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ToxicityLabel.css b/src/core/client/admin/routes/Moderate/ModerateCard/ToxicityLabel.css new file mode 100644 index 000000000..382b14abc --- /dev/null +++ b/src/core/client/admin/routes/Moderate/ModerateCard/ToxicityLabel.css @@ -0,0 +1,3 @@ +.root { + font-size: calc(14rem / var(--rem-base)); +} diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ToxicityLabel.tsx b/src/core/client/admin/routes/Moderate/ModerateCard/ToxicityLabel.tsx new file mode 100644 index 000000000..3638447e2 --- /dev/null +++ b/src/core/client/admin/routes/Moderate/ModerateCard/ToxicityLabel.tsx @@ -0,0 +1,45 @@ +import { Localized } from "fluent-react/compat"; +import React, { FunctionComponent } from "react"; + +import { Counter, Typography } from "coral-ui/components"; + +import styles from "./ToxicityLabel.css"; + +const ToxicityCounter: FunctionComponent<{ score: number }> = ({ score }) => ( + {Math.round(score * 100)}% +); + +const ToxicityLabel: FunctionComponent<{ + score: number; + threshold: number; +}> = ({ score, threshold }) => { + const counter = ; + + if (score > threshold) { + return ( + + + Likely + + + ); + } else if (score <= 0.5) { + return ( + + Unlikely + + ); + } + + return ( + + Maybe + + ); +}; + +export default ToxicityLabel; diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/MarkersContainer.spec.tsx.snap b/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/MarkersContainer.spec.tsx.snap index 8e37b9289..70133cb76 100644 --- a/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/MarkersContainer.spec.tsx.snap +++ b/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/MarkersContainer.spec.tsx.snap @@ -6,23 +6,39 @@ exports[`renders all markers 1`] = ` } > @@ -129,23 +145,39 @@ exports[`renders some markers 1`] = ` } > diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/ModerateCard.spec.tsx.snap b/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/ModerateCard.spec.tsx.snap index 0a159e574..a67435eef 100644 --- a/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/ModerateCard.spec.tsx.snap +++ b/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/ModerateCard.spec.tsx.snap @@ -66,6 +66,7 @@ exports[`renders approved correctly 1`] = ` @@ -174,6 +175,7 @@ exports[`renders correctly 1`] = ` @@ -281,6 +283,7 @@ exports[`renders dangling correctly 1`] = ` @@ -390,6 +393,7 @@ exports[`renders rejected correctly 1`] = ` @@ -503,6 +507,7 @@ exports[`renders reply correctly 1`] = ` @@ -639,6 +644,7 @@ exports[`renders story info 1`] = ` diff --git a/src/core/client/admin/test/configure/__snapshots__/moderation.spec.tsx.snap b/src/core/client/admin/test/configure/__snapshots__/moderation.spec.tsx.snap index 810ccb167..ab9642a4a 100644 --- a/src/core/client/admin/test/configure/__snapshots__/moderation.spec.tsx.snap +++ b/src/core/client/admin/test/configure/__snapshots__/moderation.spec.tsx.snap @@ -352,7 +352,7 @@ comment is toxic, according to Perspective API. By default the threshold is set placeholder="80" spellCheck={false} type="text" - value="" + value="80" />
({ }, perspective: { enabled: false, + threshold: TOXICITY_THRESHOLD_DEFAULT / 100, }, }, auth: { @@ -432,19 +434,22 @@ export const baseComment = createFixture({ edges: [], pageInfo: { endCursor: null, hasNextPage: false }, }, - actionCounts: { - flag: { - reasons: { - COMMENT_DETECTED_TOXIC: 0, - COMMENT_DETECTED_SPAM: 0, - COMMENT_DETECTED_TRUST: 0, - COMMENT_DETECTED_LINKS: 0, - COMMENT_DETECTED_BANNED_WORD: 0, - COMMENT_DETECTED_SUSPECT_WORD: 0, - COMMENT_REPORTED_OFFENSIVE: 0, - COMMENT_REPORTED_SPAM: 0, + revision: { + actionCounts: { + flag: { + reasons: { + COMMENT_DETECTED_TOXIC: 0, + COMMENT_DETECTED_SPAM: 0, + COMMENT_DETECTED_TRUST: 0, + COMMENT_DETECTED_LINKS: 0, + COMMENT_DETECTED_BANNED_WORD: 0, + COMMENT_DETECTED_SUSPECT_WORD: 0, + COMMENT_REPORTED_OFFENSIVE: 0, + COMMENT_REPORTED_SPAM: 0, + }, }, }, + metadata: {}, }, flags: { nodes: [], @@ -498,17 +503,22 @@ export const reportedComments = createFixtures( author: users.commenters[0], revision: { id: "comment-0-revision-0", + actionCounts: { + flag: { + reasons: { + COMMENT_REPORTED_SPAM: 2, + }, + }, + }, + metadata: { + perspective: { + score: 0.1, + }, + }, }, permalink: "http://localhost/comment/0", body: "This is the last random sentence I will be writing and I am going to stop mid-sent", - actionCounts: { - flag: { - reasons: { - COMMENT_REPORTED_SPAM: 2, - }, - }, - }, flags: { nodes: [ { @@ -528,17 +538,22 @@ export const reportedComments = createFixtures( id: "comment-1", revision: { id: "comment-1-revision-1", + actionCounts: { + flag: { + reasons: { + COMMENT_REPORTED_OFFENSIVE: 3, + }, + }, + }, + metadata: { + perspective: { + score: 0.1, + }, + }, }, permalink: "http://localhost/comment/1", author: users.commenters[1], body: "Don't fool with me", - actionCounts: { - flag: { - reasons: { - COMMENT_REPORTED_OFFENSIVE: 3, - }, - }, - }, flags: { nodes: [ { @@ -563,19 +578,24 @@ export const reportedComments = createFixtures( id: "comment-2", revision: { id: "comment-2-revision-2", + actionCounts: { + flag: { + reasons: { + COMMENT_REPORTED_SPAM: 1, + COMMENT_REPORTED_OFFENSIVE: 1, + }, + }, + }, + metadata: { + perspective: { + score: 0.1, + }, + }, }, permalink: "http://localhost/comment/2", status: GQLCOMMENT_STATUS.PREMOD, author: users.commenters[2], body: "I think I deserve better", - actionCounts: { - flag: { - reasons: { - COMMENT_REPORTED_SPAM: 1, - COMMENT_REPORTED_OFFENSIVE: 1, - }, - }, - }, flags: { nodes: [ { @@ -595,18 +615,23 @@ export const reportedComments = createFixtures( id: "comment-3", revision: { id: "comment-3-revision-3", + actionCounts: { + flag: { + reasons: { + COMMENT_REPORTED_SPAM: 1, + }, + }, + }, + metadata: { + perspective: { + score: 0.1, + }, + }, }, permalink: "http://localhost/comment/3", status: GQLCOMMENT_STATUS.PREMOD, author: users.commenters[3], body: "World peace at last", - actionCounts: { - flag: { - reasons: { - COMMENT_REPORTED_SPAM: 1, - }, - }, - }, flags: { nodes: [ { diff --git a/src/core/client/admin/test/moderate/__snapshots__/regularQueue.spec.tsx.snap b/src/core/client/admin/test/moderate/__snapshots__/regularQueue.spec.tsx.snap index c2c2a5035..b61b591c7 100644 --- a/src/core/client/admin/test/moderate/__snapshots__/regularQueue.spec.tsx.snap +++ b/src/core/client/admin/test/moderate/__snapshots__/regularQueue.spec.tsx.snap @@ -120,28 +120,24 @@ exports[`approves comment in reported queue: dangling 1`] = `
-
- - - Spam - - - - 2 - + + Spam -
+ + + 2 + +
-
- - - Spam - - - - 2 - + + Spam -
+ + + 2 + +
-
- - - Spam - - - - 2 - + + Spam -
+ + + 2 + +
-
- - - Offensive - - - - 3 - + + Offensive -
+ + + 3 + +
-
- - - Spam - - - - 2 - + + Spam -
+ + + 2 + +
-
- - - Offensive - - - - 3 - + + Offensive -
+ + + 3 + +
-
- - Pre-Mod + Pre-Mod + + + + Offensive + - - Offensive - - - - 1 - + 1 + + + + Spam + + - - Spam - - - - 1 - + 1 -
+
-
- - - Spam - - - - 2 - + + Spam -
+ + + 2 + +
-
- - - Spam - - - - 2 - + + Spam -
+ + + 2 + +
-
- - - Offensive - - - - 3 - + + Offensive -
+ + + 3 + +
-
- - - Offensive - - - - 1 - + + Offensive + - - Spam - - - - 1 - + 1 -
+ + + + Spam + + + + 1 + +
-
- - - Spam - - - - 2 - + + Spam -
+ + + 2 + +
-
- - - Spam - - - - 2 - + + Spam -
+ + + 2 + +
-
- - - Spam - - - - 2 - + + Spam -
+ + + 2 + +