diff --git a/config/jest/client.config.js b/config/jest/client.config.js index 7c844e9b3..421848cc5 100644 --- a/config/jest/client.config.js +++ b/config/jest/client.config.js @@ -33,6 +33,7 @@ module.exports = { "^coral-stream/(.*)$": "/src/core/client/stream/$1", "^coral-framework/(.*)$": "/src/core/client/framework/$1", "^coral-common/(.*)$": "/src/core/common/$1", + "^coral-test/(.*)$": "/src/core/client/test/$1", }, moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node", "ftl"], snapshotSerializers: ["enzyme-to-json/serializer"], diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ApproveButton.css b/src/core/client/admin/components/ModerateCard/ApproveButton.css similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/ApproveButton.css rename to src/core/client/admin/components/ModerateCard/ApproveButton.css diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ApproveButton.spec.tsx b/src/core/client/admin/components/ModerateCard/ApproveButton.spec.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/ApproveButton.spec.tsx rename to src/core/client/admin/components/ModerateCard/ApproveButton.spec.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ApproveButton.tsx b/src/core/client/admin/components/ModerateCard/ApproveButton.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/ApproveButton.tsx rename to src/core/client/admin/components/ModerateCard/ApproveButton.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/CommentContent.css b/src/core/client/admin/components/ModerateCard/CommentContent.css similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/CommentContent.css rename to src/core/client/admin/components/ModerateCard/CommentContent.css diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/CommentContent.spec.tsx b/src/core/client/admin/components/ModerateCard/CommentContent.spec.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/CommentContent.spec.tsx rename to src/core/client/admin/components/ModerateCard/CommentContent.spec.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/CommentContent.tsx b/src/core/client/admin/components/ModerateCard/CommentContent.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/CommentContent.tsx rename to src/core/client/admin/components/ModerateCard/CommentContent.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/FeatureButton.css b/src/core/client/admin/components/ModerateCard/FeatureButton.css similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/FeatureButton.css rename to src/core/client/admin/components/ModerateCard/FeatureButton.css diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/FeatureButton.tsx b/src/core/client/admin/components/ModerateCard/FeatureButton.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/FeatureButton.tsx rename to src/core/client/admin/components/ModerateCard/FeatureButton.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/FeatureCommentMutation.ts b/src/core/client/admin/components/ModerateCard/FeatureCommentMutation.ts similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/FeatureCommentMutation.ts rename to src/core/client/admin/components/ModerateCard/FeatureCommentMutation.ts diff --git a/src/core/client/admin/components/ModerateCard/FlagDetailsCategory.css b/src/core/client/admin/components/ModerateCard/FlagDetailsCategory.css new file mode 100644 index 000000000..3ce9c004c --- /dev/null +++ b/src/core/client/admin/components/ModerateCard/FlagDetailsCategory.css @@ -0,0 +1,3 @@ +.category { + color: var(--palette-error-darkest); +} diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsCategory.tsx b/src/core/client/admin/components/ModerateCard/FlagDetailsCategory.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsCategory.tsx rename to src/core/client/admin/components/ModerateCard/FlagDetailsCategory.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsContainer.tsx b/src/core/client/admin/components/ModerateCard/FlagDetailsContainer.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsContainer.tsx rename to src/core/client/admin/components/ModerateCard/FlagDetailsContainer.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsEntry.css b/src/core/client/admin/components/ModerateCard/FlagDetailsEntry.css similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsEntry.css rename to src/core/client/admin/components/ModerateCard/FlagDetailsEntry.css diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsEntry.tsx b/src/core/client/admin/components/ModerateCard/FlagDetailsEntry.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/FlagDetailsEntry.tsx rename to src/core/client/admin/components/ModerateCard/FlagDetailsEntry.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/InReplyTo.css b/src/core/client/admin/components/ModerateCard/InReplyTo.css similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/InReplyTo.css rename to src/core/client/admin/components/ModerateCard/InReplyTo.css diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/InReplyTo.spec.tsx b/src/core/client/admin/components/ModerateCard/InReplyTo.spec.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/InReplyTo.spec.tsx rename to src/core/client/admin/components/ModerateCard/InReplyTo.spec.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/InReplyTo.tsx b/src/core/client/admin/components/ModerateCard/InReplyTo.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/InReplyTo.tsx rename to src/core/client/admin/components/ModerateCard/InReplyTo.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/Markers.css b/src/core/client/admin/components/ModerateCard/Markers.css similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/Markers.css rename to src/core/client/admin/components/ModerateCard/Markers.css diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/Markers.tsx b/src/core/client/admin/components/ModerateCard/Markers.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/Markers.tsx rename to src/core/client/admin/components/ModerateCard/Markers.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/MarkersContainer.spec.tsx b/src/core/client/admin/components/ModerateCard/MarkersContainer.spec.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/MarkersContainer.spec.tsx rename to src/core/client/admin/components/ModerateCard/MarkersContainer.spec.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/MarkersContainer.tsx b/src/core/client/admin/components/ModerateCard/MarkersContainer.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/MarkersContainer.tsx rename to src/core/client/admin/components/ModerateCard/MarkersContainer.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.css b/src/core/client/admin/components/ModerateCard/ModerateCard.css similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.css rename to src/core/client/admin/components/ModerateCard/ModerateCard.css diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.spec.tsx b/src/core/client/admin/components/ModerateCard/ModerateCard.spec.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.spec.tsx rename to src/core/client/admin/components/ModerateCard/ModerateCard.spec.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.tsx b/src/core/client/admin/components/ModerateCard/ModerateCard.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/ModerateCard.tsx rename to src/core/client/admin/components/ModerateCard/ModerateCard.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ModerateCardContainer.tsx b/src/core/client/admin/components/ModerateCard/ModerateCardContainer.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/ModerateCardContainer.tsx rename to src/core/client/admin/components/ModerateCard/ModerateCardContainer.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ModeratedByContainer.css b/src/core/client/admin/components/ModerateCard/ModeratedByContainer.css similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/ModeratedByContainer.css rename to src/core/client/admin/components/ModerateCard/ModeratedByContainer.css diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ModeratedByContainer.tsx b/src/core/client/admin/components/ModerateCard/ModeratedByContainer.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/ModeratedByContainer.tsx rename to src/core/client/admin/components/ModerateCard/ModeratedByContainer.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/RejectButton.css b/src/core/client/admin/components/ModerateCard/RejectButton.css similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/RejectButton.css rename to src/core/client/admin/components/ModerateCard/RejectButton.css diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/RejectButton.spec.tsx b/src/core/client/admin/components/ModerateCard/RejectButton.spec.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/RejectButton.spec.tsx rename to src/core/client/admin/components/ModerateCard/RejectButton.spec.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/RejectButton.tsx b/src/core/client/admin/components/ModerateCard/RejectButton.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/RejectButton.tsx rename to src/core/client/admin/components/ModerateCard/RejectButton.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/Timestamp.css b/src/core/client/admin/components/ModerateCard/Timestamp.css similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/Timestamp.css rename to src/core/client/admin/components/ModerateCard/Timestamp.css diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/Timestamp.spec.tsx b/src/core/client/admin/components/ModerateCard/Timestamp.spec.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/Timestamp.spec.tsx rename to src/core/client/admin/components/ModerateCard/Timestamp.spec.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/Timestamp.tsx b/src/core/client/admin/components/ModerateCard/Timestamp.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/Timestamp.tsx rename to src/core/client/admin/components/ModerateCard/Timestamp.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ToxicityLabel.css b/src/core/client/admin/components/ModerateCard/ToxicityLabel.css similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/ToxicityLabel.css rename to src/core/client/admin/components/ModerateCard/ToxicityLabel.css diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/ToxicityLabel.tsx b/src/core/client/admin/components/ModerateCard/ToxicityLabel.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/ToxicityLabel.tsx rename to src/core/client/admin/components/ModerateCard/ToxicityLabel.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/UnfeatureCommentMutation.ts b/src/core/client/admin/components/ModerateCard/UnfeatureCommentMutation.ts similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/UnfeatureCommentMutation.ts rename to src/core/client/admin/components/ModerateCard/UnfeatureCommentMutation.ts diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/Username.css b/src/core/client/admin/components/ModerateCard/Username.css similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/Username.css rename to src/core/client/admin/components/ModerateCard/Username.css diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/Username.spec.tsx b/src/core/client/admin/components/ModerateCard/Username.spec.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/Username.spec.tsx rename to src/core/client/admin/components/ModerateCard/Username.spec.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/Username.tsx b/src/core/client/admin/components/ModerateCard/Username.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/Username.tsx rename to src/core/client/admin/components/ModerateCard/Username.tsx diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/ApproveButton.spec.tsx.snap b/src/core/client/admin/components/ModerateCard/__snapshots__/ApproveButton.spec.tsx.snap similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/ApproveButton.spec.tsx.snap rename to src/core/client/admin/components/ModerateCard/__snapshots__/ApproveButton.spec.tsx.snap diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/CommentContent.spec.tsx.snap b/src/core/client/admin/components/ModerateCard/__snapshots__/CommentContent.spec.tsx.snap similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/CommentContent.spec.tsx.snap rename to src/core/client/admin/components/ModerateCard/__snapshots__/CommentContent.spec.tsx.snap diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/InReplyTo.spec.tsx.snap b/src/core/client/admin/components/ModerateCard/__snapshots__/InReplyTo.spec.tsx.snap similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/InReplyTo.spec.tsx.snap rename to src/core/client/admin/components/ModerateCard/__snapshots__/InReplyTo.spec.tsx.snap diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/MarkersContainer.spec.tsx.snap b/src/core/client/admin/components/ModerateCard/__snapshots__/MarkersContainer.spec.tsx.snap similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/MarkersContainer.spec.tsx.snap rename to src/core/client/admin/components/ModerateCard/__snapshots__/MarkersContainer.spec.tsx.snap diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/ModerateCard.spec.tsx.snap b/src/core/client/admin/components/ModerateCard/__snapshots__/ModerateCard.spec.tsx.snap similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/ModerateCard.spec.tsx.snap rename to src/core/client/admin/components/ModerateCard/__snapshots__/ModerateCard.spec.tsx.snap diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/RejectButton.spec.tsx.snap b/src/core/client/admin/components/ModerateCard/__snapshots__/RejectButton.spec.tsx.snap similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/RejectButton.spec.tsx.snap rename to src/core/client/admin/components/ModerateCard/__snapshots__/RejectButton.spec.tsx.snap diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/Timestamp.spec.tsx.snap b/src/core/client/admin/components/ModerateCard/__snapshots__/Timestamp.spec.tsx.snap similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/Timestamp.spec.tsx.snap rename to src/core/client/admin/components/ModerateCard/__snapshots__/Timestamp.spec.tsx.snap diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/Username.spec.tsx.snap b/src/core/client/admin/components/ModerateCard/__snapshots__/Username.spec.tsx.snap similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/__snapshots__/Username.spec.tsx.snap rename to src/core/client/admin/components/ModerateCard/__snapshots__/Username.spec.tsx.snap diff --git a/src/core/client/admin/routes/Moderate/ModerateCard/index.ts b/src/core/client/admin/components/ModerateCard/index.ts similarity index 100% rename from src/core/client/admin/routes/Moderate/ModerateCard/index.ts rename to src/core/client/admin/components/ModerateCard/index.ts diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryAllComments.css b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryAllComments.css similarity index 100% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryAllComments.css rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryAllComments.css diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryAllComments.tsx b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryAllComments.tsx similarity index 98% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryAllComments.tsx rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryAllComments.tsx index 4dea65b99..55e8d1573 100644 --- a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryAllComments.tsx +++ b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryAllComments.tsx @@ -6,15 +6,14 @@ import { Localized } from "fluent-react/compat"; import React, { FunctionComponent, useCallback } from "react"; import { graphql, RelayPaginationProp } from "react-relay"; -import { Button, CallOut, Typography } from "coral-ui/components/"; +import { ModerateCardContainer } from "coral-admin/components/ModerateCard"; +import { Button, CallOut, Typography } from "coral-ui/components"; import { UserHistoryAllComments_settings } from "coral-admin/__generated__/UserHistoryAllComments_settings.graphql"; import { UserHistoryAllComments_user } from "coral-admin/__generated__/UserHistoryAllComments_user.graphql"; import { UserHistoryAllComments_viewer } from "coral-admin/__generated__/UserHistoryAllComments_viewer.graphql"; import { UserHistoryAllCommentsPaginationQueryVariables } from "coral-admin/__generated__/UserHistoryAllCommentsPaginationQuery.graphql"; -import { ModerateCardContainer } from "../ModerateCard"; - import styles from "./UserHistoryAllComments.css"; interface Props { diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryAllCommentsContainer.css b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryAllCommentsContainer.css similarity index 100% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryAllCommentsContainer.css rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryAllCommentsContainer.css diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryAllCommentsContainer.tsx b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryAllCommentsContainer.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryAllCommentsContainer.tsx rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryAllCommentsContainer.tsx diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryDrawerContainer.css b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryDrawerContainer.css similarity index 100% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryDrawerContainer.css rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryDrawerContainer.css diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryDrawerContainer.tsx b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryDrawerContainer.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryDrawerContainer.tsx rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryDrawerContainer.tsx diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryDrawerQuery.css b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryDrawerQuery.css similarity index 100% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryDrawerQuery.css rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryDrawerQuery.css diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryDrawerQuery.tsx b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryDrawerQuery.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryDrawerQuery.tsx rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryDrawerQuery.tsx diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryRejectedComments.css b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryRejectedComments.css similarity index 100% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryRejectedComments.css rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryRejectedComments.css diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryRejectedComments.tsx b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryRejectedComments.tsx similarity index 98% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryRejectedComments.tsx rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryRejectedComments.tsx index 704522ccb..acc77da78 100644 --- a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryRejectedComments.tsx +++ b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryRejectedComments.tsx @@ -6,6 +6,7 @@ import { Localized } from "fluent-react/compat"; import React, { FunctionComponent, useCallback } from "react"; import { graphql, RelayPaginationProp } from "react-relay"; +import { ModerateCardContainer } from "coral-admin/components/ModerateCard"; import { Button, CallOut, Typography } from "coral-ui/components"; import { UserHistoryRejectedComments_settings } from "coral-admin/__generated__/UserHistoryRejectedComments_settings.graphql"; @@ -13,8 +14,6 @@ import { UserHistoryRejectedComments_user } from "coral-admin/__generated__/User import { UserHistoryRejectedComments_viewer } from "coral-admin/__generated__/UserHistoryRejectedComments_viewer.graphql"; import { UserHistoryRejectedCommentsPaginationQueryVariables } from "coral-admin/__generated__/UserHistoryRejectedCommentsPaginationQuery.graphql"; -import { ModerateCardContainer } from "../ModerateCard"; - import styles from "./UserHistoryRejectedComments.css"; interface Props { diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryRejectedCommentsContainer.css b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryRejectedCommentsContainer.css similarity index 100% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryRejectedCommentsContainer.css rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryRejectedCommentsContainer.css diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryRejectedCommentsContainer.tsx b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryRejectedCommentsContainer.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryRejectedCommentsContainer.tsx rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryRejectedCommentsContainer.tsx diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryTabs.css b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryTabs.css similarity index 100% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryTabs.css rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryTabs.css diff --git a/src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryTabs.tsx b/src/core/client/admin/components/UserHistoryDrawer/UserHistoryTabs.tsx similarity index 100% rename from src/core/client/admin/routes/Moderate/UserHistoryDrawer/UserHistoryTabs.tsx rename to src/core/client/admin/components/UserHistoryDrawer/UserHistoryTabs.tsx diff --git a/src/core/client/admin/routes/Community/UserRow.css b/src/core/client/admin/routes/Community/UserRow.css index 80f0ea606..e2c9ef888 100644 --- a/src/core/client/admin/routes/Community/UserRow.css +++ b/src/core/client/admin/routes/Community/UserRow.css @@ -21,3 +21,11 @@ .statusColumn { vertical-align: top; } + +.usernameButton { + padding: 0px; + font-family: var(--font-family-sans-serif); + font-weight: var(--font-weight-regular); + font-size: calc(14rem / var(--rem-base)); + line-height: calc(14em / 14); +} diff --git a/src/core/client/admin/routes/Community/UserRow.tsx b/src/core/client/admin/routes/Community/UserRow.tsx index 8de716ef6..ce5073073 100644 --- a/src/core/client/admin/routes/Community/UserRow.tsx +++ b/src/core/client/admin/routes/Community/UserRow.tsx @@ -1,8 +1,8 @@ -import React, { FunctionComponent } from "react"; +import React, { FunctionComponent, useCallback } from "react"; import NotAvailable from "coral-admin/components/NotAvailable"; import { PropTypesOf } from "coral-framework/types"; -import { TableCell, TableRow, TextLink } from "coral-ui/components"; +import { Button, TableCell, TableRow, TextLink } from "coral-ui/components"; import UserRole from "./UserRole"; import UserStatus from "./UserStatus"; @@ -17,28 +17,47 @@ interface Props { user: PropTypesOf["user"] & PropTypesOf["user"]; viewer: PropTypesOf["viewer"]; + onUsernameClicked?: (userID: string) => void; } -const UserRow: FunctionComponent = props => ( - - - {props.username || } - - - {{props.email} || ( - - )} - - - {props.memberSince} - - - - - - - - -); +const UserRow: FunctionComponent = ({ + userID, + username, + email, + memberSince, + user, + viewer, + onUsernameClicked, +}) => { + const usernameClicked = useCallback(() => { + if (!onUsernameClicked) { + return; + } + + onUsernameClicked(userID); + }, [userID, onUsernameClicked]); + + return ( + + + + + + {{email} || ( + + )} + + {memberSince} + + + + + + + + ); +}; export default UserRow; diff --git a/src/core/client/admin/routes/Community/UserRowContainer.tsx b/src/core/client/admin/routes/Community/UserRowContainer.tsx index 97214e7aa..9138afbc5 100644 --- a/src/core/client/admin/routes/Community/UserRowContainer.tsx +++ b/src/core/client/admin/routes/Community/UserRowContainer.tsx @@ -11,6 +11,7 @@ import UserRow from "./UserRow"; interface Props { user: UserData; viewer: ViewerData; + onUsernameClicked?: (userID: string) => void; } const UserRowContainer: FunctionComponent = props => { @@ -27,6 +28,7 @@ const UserRowContainer: FunctionComponent = props => { month: "2-digit", year: "numeric", }).format(new Date(props.user.createdAt))} + onUsernameClicked={props.onUsernameClicked} /> ); }; diff --git a/src/core/client/admin/routes/Community/UserTable.tsx b/src/core/client/admin/routes/Community/UserTable.tsx index d2d03af77..b9041cc72 100644 --- a/src/core/client/admin/routes/Community/UserTable.tsx +++ b/src/core/client/admin/routes/Community/UserTable.tsx @@ -1,9 +1,10 @@ import { Localized } from "fluent-react/compat"; -import React, { FunctionComponent } from "react"; +import React, { FunctionComponent, useCallback, useState } from "react"; import { PropTypesOf } from "coral-framework/types"; import AutoLoadMore from "coral-admin/components/AutoLoadMore"; +import UserHistoryDrawerContainer from "coral-admin/components/UserHistoryDrawer/UserHistoryDrawerContainer"; import { Table, TableBody, @@ -28,56 +29,86 @@ interface Props { loading: boolean; } -const UserTable: FunctionComponent = props => ( - <> - - - - - - Username - - - - Email Address - - - - - Member Since - - - - Role - - - Status - - - - - {!props.loading && - props.users.map(u => ( - - ))} - -
- {!props.loading && props.users.length === 0 && } - {props.loading && ( - - - - )} - {props.hasMore && ( - - - - )} -
- -); +const UserTable: FunctionComponent = props => { + const [userDrawerUserID, setUserDrawerUserID] = useState(""); + const [userDrawerVisible, setUserDrawerVisible] = useState(false); + + const onShowUserDrawer = useCallback( + (userID: string) => { + setUserDrawerUserID(userID); + setUserDrawerVisible(true); + }, + [setUserDrawerUserID, setUserDrawerVisible] + ); + + const onHideUserDrawer = useCallback(() => { + setUserDrawerVisible(false); + setUserDrawerUserID(""); + }, [setUserDrawerUserID, setUserDrawerVisible]); + + return ( + <> + + + + + + + Username + + + + + Email Address + + + + + Member Since + + + + Role + + + Status + + + + + {!props.loading && + props.users.map(u => ( + + ))} + +
+ {!props.loading && props.users.length === 0 && } + {props.loading && ( + + + + )} + {props.hasMore && ( + + + + )} + +
+ + ); +}; export default UserTable; diff --git a/src/core/client/admin/routes/Moderate/Queue/Queue.tsx b/src/core/client/admin/routes/Moderate/Queue/Queue.tsx index a9bb85f84..27a488f94 100644 --- a/src/core/client/admin/routes/Moderate/Queue/Queue.tsx +++ b/src/core/client/admin/routes/Moderate/Queue/Queue.tsx @@ -3,12 +3,11 @@ import React, { FunctionComponent, useCallback, useState } from "react"; import { CSSTransition, TransitionGroup } from "react-transition-group"; import AutoLoadMore from "coral-admin/components/AutoLoadMore"; +import ModerateCardContainer from "coral-admin/components/ModerateCard"; +import UserHistoryDrawerContainer from "coral-admin/components/UserHistoryDrawer/UserHistoryDrawerContainer"; import { Button, Flex, HorizontalGutter } from "coral-ui/components"; import { PropTypesOf } from "coral-ui/types"; -import ModerateCardContainer from "../ModerateCard"; -import UserHistoryDrawerContainer from "../UserHistoryDrawer/UserHistoryDrawerContainer"; - import styles from "./Queue.css"; interface Props { diff --git a/src/core/client/admin/test/community/__snapshots__/community.spec.tsx.snap b/src/core/client/admin/test/community/__snapshots__/community.spec.tsx.snap index 01a7fd51d..638675950 100644 --- a/src/core/client/admin/test/community/__snapshots__/community.spec.tsx.snap +++ b/src/core/client/admin/test/community/__snapshots__/community.spec.tsx.snap @@ -359,7 +359,18 @@ exports[`renders community 1`] = ` - Markus + - Lukas + - Huy + - Isabelle + = {} +) { + const { testRenderer, context, subscriptionHandler } = create( + { + ...params, + resolvers: pureMerge( + createResolversStub({ + Query: { + settings: () => settings, + viewer: () => viewer, + user: () => user, + }, + }), + params.resolvers + ), + initLocalState: (localRecord, source, environment) => { + localRecord.setValue(true, "loggedIn"); + if (params.initLocalState) { + params.initLocalState(localRecord, source, environment); + } + }, + }, + user + ); + + return { testRenderer, context, subscriptionHandler }; +} + +it("User drawer is open for user, user name is visible", async () => { + const story = createStory(); + const user = story.comments.edges[0].node.author!; + const { testRenderer } = await createTestRenderer(user); + + await act(async () => { + const { getByText } = within(testRenderer.root); + await waitForElement(() => getByText(user.id, { exact: false })); + }); +}); + +it("User drawer is open for user, user name is visible", async () => { + const story = createStory(); + const user = story.comments.edges[0].node.author!; + const { testRenderer } = await createTestRenderer(user); + + await act(async () => { + const { getByText } = within(testRenderer.root); + await waitForElement(() => getByText(user.username!, { exact: false })); + }); +}); + +it("All comments selected, comment is visible in all comments", async () => { + const story = createStory(); + const user = story.comments.edges[0].node.author!; + const comment = user.allComments.edges[0].node; + const { testRenderer } = await createTestRenderer(user); + + await act(async () => { + const { getByText } = within(testRenderer.root); + + await waitForElement(() => getByText(comment.body!, { exact: false })); + }); +}); + +it("Select rejected comments, rejected comment is visible.", async () => { + const story = createStory(); + const user = story.comments.edges[0].node.author!; + const rejectedComment = user.rejectedComments.edges[0].node; + const { testRenderer } = await createTestRenderer(user); + + await act(async () => { + const { getByText } = within(testRenderer.root); + const rejectedTab = await waitForElement(() => + getByText("rejected", { + selector: "button", + exact: false, + }) + ); + + rejectedTab.props.onClick(); + + await waitForElement(() => + getByText(rejectedComment.body!, { exact: false }) + ); + }); +}); diff --git a/src/core/client/admin/test/components/UserHistoryDrawer/create.tsx b/src/core/client/admin/test/components/UserHistoryDrawer/create.tsx new file mode 100644 index 000000000..e6f752527 --- /dev/null +++ b/src/core/client/admin/test/components/UserHistoryDrawer/create.tsx @@ -0,0 +1,32 @@ +import React from "react"; + +import UserHistoryDrawerContainer from "coral-admin/components/UserHistoryDrawer/UserHistoryDrawerContainer"; +import { GQLUser } from "coral-framework/schema"; +import { + createTestRenderer as createTestRendererGeneric, + CreateTestRendererParams, +} from "coral-framework/testHelpers"; + +export default function create( + params: CreateTestRendererParams, + user: GQLUser +) { + return createTestRendererGeneric( + "userDrawer", + { + return; + }} + />, + { + ...params, + initLocalState: (localRecord, source, environment) => { + if (params.initLocalState) { + params.initLocalState(localRecord, source, environment); + } + }, + } + ); +} diff --git a/src/core/client/test/helpers/fixture.ts b/src/core/client/test/helpers/fixture.ts new file mode 100644 index 000000000..0e659c393 --- /dev/null +++ b/src/core/client/test/helpers/fixture.ts @@ -0,0 +1,341 @@ +import { + GQLComment, + GQLCOMMENT_STATUS, + GQLMODERATION_MODE, + GQLSettings, + GQLStory, + GQLUser, + GQLUSER_ROLE, + GQLUSER_STATUS, +} from "coral-framework/schema"; +import { + createFixture, + denormalizeComment, + denormalizeStory, +} from "coral-framework/testHelpers"; +import uuid from "uuid/v4"; + +// TODO: Look into a date/time provider that can create +// predictable date/time (i.e. constantly increasing, or seeded) +export function createDateInRange(start: Date, end: Date) { + return new Date( + start.getTime() + Math.random() * (end.getTime() - start.getTime()) + ); +} + +export function randomDate() { + return createDateInRange(new Date(2000, 0, 1), new Date()); +} + +export function createUserStatus(banned: boolean = false) { + return { + current: [banned ? GQLUSER_STATUS.BANNED : GQLUSER_STATUS.ACTIVE], + ban: { + active: banned, + history: [], + }, + suspension: { + active: false, + until: null, + history: [], + }, + }; +} + +export function createUser() { + return createFixture({ + id: uuid(), + username: uuid(), + role: GQLUSER_ROLE.COMMENTER, + createdAt: randomDate().toISOString(), + status: createUserStatus(), + ignoredUsers: [], + ignoreable: true, + }); +} + +export function createComment(author?: GQLUser) { + const revision = uuid(); + const createdAt = randomDate(); + const editableUntil = new Date(createdAt.getTime() + 30 * 60000); + + if (author === undefined) { + author = createUser(); + author!.createdAt = new Date( + createdAt.getTime() - 60 * 60000 + ).toISOString(); + } + + const comment = denormalizeComment( + createFixture({ + id: uuid(), + author, + body: uuid(), + status: GQLCOMMENT_STATUS.NONE, + statusHistory: { + edges: [], + pageInfo: { endCursor: null, hasNextPage: false }, + }, + createdAt: createdAt.toISOString(), + replies: { edges: [], pageInfo: { endCursor: null, hasNextPage: false } }, + replyCount: 0, + editing: { + edited: false, + editableUntil: editableUntil.toISOString(), + }, + actionCounts: { + reaction: { + total: 0, + }, + 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, + }, + }, + }, + tags: [], + permalink: "", + flags: { + edges: [], + nodes: [], + pageInfo: { + hasNextPage: false, + hasPreviousPage: false, + }, + }, + viewerActionPresence: { reaction: false, dontAgree: false, flag: false }, + parent: undefined, + }) + ); + + comment.revision = { + id: revision, + comment, + metadata: { + perspective: { + score: 0, + }, + }, + createdAt, + actionCounts: { + reaction: { + total: 0, + }, + dontAgree: { + total: 0, + }, + flag: { + total: 0, + reasons: { + COMMENT_REPORTED_OFFENSIVE: 0, + COMMENT_REPORTED_SPAM: 0, + COMMENT_REPORTED_OTHER: 0, + 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, + }, + }, + }, + }; + + return comment; +} + +export function createComments(count: number = 3) { + const comments = []; + for (let i = 0; i < count; i++) { + comments.push(createComment()); + } + + return comments; +} + +export function createStory() { + const id = uuid(); + const comments = createComments(); + comments.forEach(c => { + const edges = [{ node: c, cursor: c.createdAt }]; + c.author!.comments = { + edges, + nodes: [c], + pageInfo: { + hasPreviousPage: false, + hasNextPage: false, + }, + }; + c.author!.allComments = { + edges, + nodes: [c], + pageInfo: { + hasPreviousPage: false, + hasNextPage: false, + }, + }; + c.author!.rejectedComments = { + edges, + nodes: [c], + pageInfo: { + hasPreviousPage: false, + hasNextPage: false, + }, + }; + }); + + const story = denormalizeStory( + createFixture({ + id, + url: `http://localhost/stories/story-${id}`, + comments: { + edges: [ + { node: comments[0], cursor: comments[0].createdAt }, + { node: comments[1], cursor: comments[1].createdAt }, + { node: comments[2], cursor: comments[2].createdAt }, + ], + pageInfo: { + hasNextPage: false, + }, + }, + metadata: { + title: uuid(), + }, + isClosed: false, + commentCounts: { + totalVisible: 0, + tags: { + FEATURED: 0, + }, + }, + settings: { + moderation: GQLMODERATION_MODE.POST, + premodLinksEnable: false, + messageBox: { + enabled: false, + }, + }, + }) + ); + + comments.forEach(c => (c.story = story)); + + return story; +} + +export function createSettings() { + return createFixture({ + id: "settings", + moderation: GQLMODERATION_MODE.POST, + premodLinksEnable: false, + live: { + enabled: true, + configurable: true, + }, + wordList: { + suspect: ["suspect"], + banned: ["banned"], + }, + charCount: { + enabled: false, + max: 1000, + min: 3, + }, + disableCommenting: { + enabled: false, + message: "Comments are closed on this story.", + }, + closeCommenting: { + auto: false, + timeout: 604800, + message: "Comments are closed on this story.", + }, + email: { + enabled: true, + }, + customCSSURL: "", + allowedDomains: ["localhost:8080"], + editCommentWindowLength: 30000, + communityGuidelines: { + enabled: false, + content: "", + }, + organization: { + name: "Coral", + url: "https://test.com/", + contactEmail: "coral@test.com", + }, + integrations: { + akismet: { + enabled: false, + }, + perspective: { + enabled: false, + }, + }, + auth: { + integrations: { + local: { + enabled: true, + allowRegistration: true, + targetFilter: { + admin: true, + stream: true, + }, + }, + sso: { + enabled: false, + allowRegistration: true, + targetFilter: { + admin: true, + stream: true, + }, + key: "", + keyGeneratedAt: null, + }, + google: { + enabled: false, + allowRegistration: true, + targetFilter: { + admin: true, + stream: true, + }, + clientID: "", + clientSecret: "", + callbackURL: "http://localhost/google/callback", + redirectURL: "http://localhost/google", + }, + facebook: { + enabled: false, + allowRegistration: true, + targetFilter: { + admin: true, + stream: true, + }, + clientID: "", + clientSecret: "", + callbackURL: "http://localhost/facebook/callback", + redirectURL: "http://localhost/facebook", + }, + oidc: { + enabled: false, + allowRegistration: false, + targetFilter: { + admin: true, + stream: true, + }, + name: "OIDC", + callbackURL: "http://localhost/oidc/callback", + redirectURL: "http://localhost/oidc", + }, + }, + }, + }); +}