From c35ce979f5d17d6154d7f134c12834d0f48af047 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Wed, 24 May 2017 19:04:05 +0700 Subject: [PATCH] Move query logic to containers --- client/coral-admin/src/actions/moderation.js | 6 + .../coral-admin/src/constants/moderation.js | 1 + client/coral-admin/src/graphql/fragments.js | 0 .../fragments/assetMetricsView.graphql | 12 - .../src/graphql/fragments/commentView.graphql | 31 --- .../src/graphql/queries/assetsQuery.graphql | 6 - .../graphql/queries/getQueueCounts.graphql | 22 -- .../coral-admin/src/graphql/queries/index.js | 116 ---------- .../src/graphql/queries/loadMore.graphql | 13 -- .../src/graphql/queries/metricsQuery.graphql | 10 - .../src/graphql/queries/modQueueQuery.graphql | 68 ------ .../queries/modUserFlaggedQuery.graphql | 26 --- .../src/graphql/queries/userDetail.graphql | 13 -- client/coral-admin/src/reducers/moderation.js | 3 + .../routes/Community/containers/Community.js | 42 +++- .../routes/Dashboard/containers/Dashboard.js | 37 ++- .../{InstallContainer.js => Install.js} | 0 .../coral-admin/src/routes/Install/index.js | 2 +- .../Moderation/components/Moderation.js | 14 +- .../Moderation/components/UserDetail.js | 2 +- .../Moderation/containers/Moderation.js | 215 +++++++++++++++++- .../Moderation/containers/UserDetail.js | 27 ++- 22 files changed, 322 insertions(+), 344 deletions(-) create mode 100644 client/coral-admin/src/graphql/fragments.js delete mode 100644 client/coral-admin/src/graphql/fragments/assetMetricsView.graphql delete mode 100644 client/coral-admin/src/graphql/fragments/commentView.graphql delete mode 100644 client/coral-admin/src/graphql/queries/assetsQuery.graphql delete mode 100644 client/coral-admin/src/graphql/queries/getQueueCounts.graphql delete mode 100644 client/coral-admin/src/graphql/queries/index.js delete mode 100644 client/coral-admin/src/graphql/queries/loadMore.graphql delete mode 100644 client/coral-admin/src/graphql/queries/metricsQuery.graphql delete mode 100644 client/coral-admin/src/graphql/queries/modQueueQuery.graphql delete mode 100644 client/coral-admin/src/graphql/queries/modUserFlaggedQuery.graphql delete mode 100644 client/coral-admin/src/graphql/queries/userDetail.graphql rename client/coral-admin/src/routes/Install/containers/{InstallContainer.js => Install.js} (100%) diff --git a/client/coral-admin/src/actions/moderation.js b/client/coral-admin/src/actions/moderation.js index 268ab36b8..4b0b0538a 100644 --- a/client/coral-admin/src/actions/moderation.js +++ b/client/coral-admin/src/actions/moderation.js @@ -27,3 +27,9 @@ export const hideShortcutsNote = () => { export const viewUserDetail = (userId) => ({type: actions.VIEW_USER_DETAIL, userId}); export const hideUserDetail = () => ({type: actions.HIDE_USER_DETAIL}); + +export const setSortOrder = (order) => ({ + type: actions.SET_SORT_ORDER, + order +}); + diff --git a/client/coral-admin/src/constants/moderation.js b/client/coral-admin/src/constants/moderation.js index b960d95a2..3586b1a75 100644 --- a/client/coral-admin/src/constants/moderation.js +++ b/client/coral-admin/src/constants/moderation.js @@ -7,3 +7,4 @@ export const SHOW_SUSPEND_USER_DIALOG = 'SHOW_SUSPEND_USER_DIALOG'; export const HIDE_SUSPEND_USER_DIALOG = 'HIDE_SUSPEND_USER_DIALOG'; export const VIEW_USER_DETAIL = 'VIEW_USER_DETAIL'; export const HIDE_USER_DETAIL = 'HIDE_USER_DETAIL'; +export const SET_SORT_ORDER = 'MODERATION_SET_SORT_ORDER'; diff --git a/client/coral-admin/src/graphql/fragments.js b/client/coral-admin/src/graphql/fragments.js new file mode 100644 index 000000000..e69de29bb diff --git a/client/coral-admin/src/graphql/fragments/assetMetricsView.graphql b/client/coral-admin/src/graphql/fragments/assetMetricsView.graphql deleted file mode 100644 index 726194143..000000000 --- a/client/coral-admin/src/graphql/fragments/assetMetricsView.graphql +++ /dev/null @@ -1,12 +0,0 @@ -fragment metrics on Asset { - id - title - url - author - created_at - commentCount - action_summaries { - actionCount - actionableItemCount - } -} diff --git a/client/coral-admin/src/graphql/fragments/commentView.graphql b/client/coral-admin/src/graphql/fragments/commentView.graphql deleted file mode 100644 index 1f3b8b1d3..000000000 --- a/client/coral-admin/src/graphql/fragments/commentView.graphql +++ /dev/null @@ -1,31 +0,0 @@ -fragment commentView on Comment { - id - body - created_at - status - user { - id - name: username - status - } - asset { - id - title - url - } - action_summaries { - count - ... on FlagActionSummary { - reason - } - } - actions { - ... on FlagAction { - reason - message - user { - username - } - } - } -} diff --git a/client/coral-admin/src/graphql/queries/assetsQuery.graphql b/client/coral-admin/src/graphql/queries/assetsQuery.graphql deleted file mode 100644 index 37950692d..000000000 --- a/client/coral-admin/src/graphql/queries/assetsQuery.graphql +++ /dev/null @@ -1,6 +0,0 @@ -query Assets { - assets { - id - title - } -} diff --git a/client/coral-admin/src/graphql/queries/getQueueCounts.graphql b/client/coral-admin/src/graphql/queries/getQueueCounts.graphql deleted file mode 100644 index 4a7c00d87..000000000 --- a/client/coral-admin/src/graphql/queries/getQueueCounts.graphql +++ /dev/null @@ -1,22 +0,0 @@ -query Counts ($asset_id: ID) { - allCount: commentCount(query: { - asset_id: $asset_id - }) - acceptedCount: commentCount(query: { - statuses: [ACCEPTED], - asset_id: $asset_id - }) - premodCount: commentCount(query: { - statuses: [PREMOD], - asset_id: $asset_id - }) - rejectedCount: commentCount(query: { - statuses: [REJECTED], - asset_id: $asset_id - }) - flaggedCount: commentCount(query: { - action_type: FLAG, - asset_id: $asset_id, - statuses: [NONE, PREMOD] - }) -} diff --git a/client/coral-admin/src/graphql/queries/index.js b/client/coral-admin/src/graphql/queries/index.js deleted file mode 100644 index ae94d70c3..000000000 --- a/client/coral-admin/src/graphql/queries/index.js +++ /dev/null @@ -1,116 +0,0 @@ -import {graphql} from 'react-apollo'; - -import MOD_QUEUE_QUERY from './modQueueQuery.graphql'; -import MOD_QUEUE_LOAD_MORE from './loadMore.graphql'; -import MOD_USER_FLAGGED_QUERY from './modUserFlaggedQuery.graphql'; -import METRICS from './metricsQuery.graphql'; -import USER_DETAIL from './userDetail.graphql'; -import GET_QUEUE_COUNTS from './getQueueCounts.graphql'; - -export const modQueueQuery = graphql(MOD_QUEUE_QUERY, { - options: ({params: {id = null}}) => { - return { - variables: { - asset_id: id, - sort: 'REVERSE_CHRONOLOGICAL' - } - }; - }, - props: ({ownProps: {params: {id = null}}, data}) => ({ - data, - modQueueResort: modQueueResort(id, data.fetchMore), - loadMore: loadMore(data.fetchMore) - }) -}); - -export const getMetrics = graphql(METRICS, { - options: ({settings: {dashboardWindowStart, dashboardWindowEnd}}) => { - - return { - variables: { - from: dashboardWindowStart, - to: dashboardWindowEnd - } - }; - } -}); - -export const loadMore = (fetchMore) => ({limit = 10, cursor, sort, tab, asset_id}) => { - let variables = { - limit, - cursor, - sort, - asset_id - }; - switch(tab) { - case 'all': - variables.statuses = null; - break; - case 'accepted': - variables.statuses = ['ACCEPTED']; - break; - case 'premod': - variables.statuses = ['PREMOD']; - break; - case 'flagged': - variables.statuses = ['NONE', 'PREMOD']; - variables.action_type = 'FLAG'; - break; - case 'rejected': - variables.statuses = ['REJECTED']; - break; - } - return fetchMore({ - query: MOD_QUEUE_LOAD_MORE, - variables, - updateQuery: (oldData, {fetchMoreResult:{comments}}) => { - return { - ...oldData, - [tab]: [ - ...oldData[tab], - ...comments - ] - }; - } - }); -}; - -export const modUserFlaggedQuery = graphql(MOD_USER_FLAGGED_QUERY, { - options: ({params: {action_type = 'FLAG'}}) => { - return { - variables: { - action_type: action_type - } - }; - } -}); - -export const modQueueResort = (id, fetchMore) => (sort) => { - return fetchMore({ - query: MOD_QUEUE_QUERY, - variables: { - asset_id: id, - sort - }, - updateQuery: (oldData, {fetchMoreResult:{data}}) => data - }); -}; - -export const getUserDetail = graphql(USER_DETAIL, { - options: ({id}) => { - return { - variables: {author_id: id} - }; - } -}); - -export const getQueueCounts = graphql(GET_QUEUE_COUNTS, { - options: ({params: {id = null}}) => { - return { - pollInterval: 5000, - variables: { - asset_id: id - } - }; - } -}); diff --git a/client/coral-admin/src/graphql/queries/loadMore.graphql b/client/coral-admin/src/graphql/queries/loadMore.graphql deleted file mode 100644 index a42c7b2bf..000000000 --- a/client/coral-admin/src/graphql/queries/loadMore.graphql +++ /dev/null @@ -1,13 +0,0 @@ -#import "../fragments/commentView.graphql" - -query LoadMoreModQueue($limit: Int = 10, $cursor: Date, $sort: SORT_ORDER, $asset_id: ID, $statuses:[COMMENT_STATUS!], $action_type: ACTION_TYPE) { - comments(query: {limit: $limit, cursor: $cursor, asset_id: $asset_id, statuses: $statuses, sort: $sort, action_type: $action_type}) { - ...commentView - action_summaries { - count - ... on FlagActionSummary { - reason - } - } - } -} diff --git a/client/coral-admin/src/graphql/queries/metricsQuery.graphql b/client/coral-admin/src/graphql/queries/metricsQuery.graphql deleted file mode 100644 index 17fac3034..000000000 --- a/client/coral-admin/src/graphql/queries/metricsQuery.graphql +++ /dev/null @@ -1,10 +0,0 @@ -#import "../fragments/assetMetricsView.graphql" - -query Metrics ($from: Date!, $to: Date!) { - assetsByFlag: assetMetrics(from: $from, to: $to, sort: FLAG) { - ...metrics - } - assetsByActivity: assetMetrics(from: $from, to: $to, sort: ACTIVITY) { - ...metrics - } -} diff --git a/client/coral-admin/src/graphql/queries/modQueueQuery.graphql b/client/coral-admin/src/graphql/queries/modQueueQuery.graphql deleted file mode 100644 index 6bfcf81ec..000000000 --- a/client/coral-admin/src/graphql/queries/modQueueQuery.graphql +++ /dev/null @@ -1,68 +0,0 @@ -#import "../fragments/commentView.graphql" - -query ModQueue ($asset_id: ID, $sort: SORT_ORDER) { - all: comments(query: { - statuses: [NONE, PREMOD, ACCEPTED, REJECTED], - asset_id: $asset_id, - sort: $sort - }) { - ...commentView - } - accepted: comments(query: { - statuses: [ACCEPTED], - asset_id: $asset_id, - sort: $sort - }) { - ...commentView - } - premod: comments(query: { - statuses: [PREMOD], - asset_id: $asset_id, - sort: $sort - }) { - ...commentView - } - flagged: comments(query: { - action_type: FLAG, - asset_id: $asset_id, - statuses: [NONE, PREMOD], - sort: $sort - }) { - ...commentView - } - rejected: comments(query: { - statuses: [REJECTED], - asset_id: $asset_id, - sort: $sort - }) { - ...commentView - } - assets: assets { - id - title - url - } - allCount: commentCount(query: { - asset_id: $asset_id - }) - acceptedCount: commentCount(query: { - statuses: [ACCEPTED], - asset_id: $asset_id - }) - premodCount: commentCount(query: { - statuses: [PREMOD], - asset_id: $asset_id - }) - rejectedCount: commentCount(query: { - statuses: [REJECTED], - asset_id: $asset_id - }) - flaggedCount: commentCount(query: { - action_type: FLAG, - asset_id: $asset_id, - statuses: [NONE, PREMOD] - }) - settings { - organizationName - } -} diff --git a/client/coral-admin/src/graphql/queries/modUserFlaggedQuery.graphql b/client/coral-admin/src/graphql/queries/modUserFlaggedQuery.graphql deleted file mode 100644 index c99d94583..000000000 --- a/client/coral-admin/src/graphql/queries/modUserFlaggedQuery.graphql +++ /dev/null @@ -1,26 +0,0 @@ -query Users ($action_type: ACTION_TYPE) { - users (query:{action_type: $action_type}){ - id - username - status - roles - actions{ - id - created_at - ... on FlagAction { - reason - message - user { - id - username - } - } - } - action_summaries { - count - ... on FlagActionSummary { - reason - } - } - } -} diff --git a/client/coral-admin/src/graphql/queries/userDetail.graphql b/client/coral-admin/src/graphql/queries/userDetail.graphql deleted file mode 100644 index c375b80ff..000000000 --- a/client/coral-admin/src/graphql/queries/userDetail.graphql +++ /dev/null @@ -1,13 +0,0 @@ -query UserDetail ($author_id: ID!) { - user(id: $author_id) { - id - username - created_at - profiles { - id - provider - } - } - totalComments: commentCount(query: {author_id: $author_id}) - rejectedComments: commentCount(query: {author_id: $author_id, statuses: [REJECTED]}) -} diff --git a/client/coral-admin/src/reducers/moderation.js b/client/coral-admin/src/reducers/moderation.js index 4bcd82d47..10cbe0eca 100644 --- a/client/coral-admin/src/reducers/moderation.js +++ b/client/coral-admin/src/reducers/moderation.js @@ -10,6 +10,7 @@ const initialState = fromJS({ userDetailId: null, banDialog: false, shortcutsNoteVisible: window.localStorage.getItem('coral:shortcutsNote') || 'show', + sortOrder: 'REVERSE_CHRONOLOGICAL', suspendUserDialog: { show: false, userId: null, @@ -64,6 +65,8 @@ export default function moderation (state = initialState, action) { return state.set('userDetailId', action.userId); case actions.HIDE_USER_DETAIL: return state.set('userDetailId', null); + case actions.SET_SORT_ORDER: + return state.set('sortOrder', action.order); default : return state; } diff --git a/client/coral-admin/src/routes/Community/containers/Community.js b/client/coral-admin/src/routes/Community/containers/Community.js index 9167e2cd1..582b929ce 100644 --- a/client/coral-admin/src/routes/Community/containers/Community.js +++ b/client/coral-admin/src/routes/Community/containers/Community.js @@ -1,9 +1,8 @@ import React, {Component} from 'react'; import {connect} from 'react-redux'; import {bindActionCreators} from 'redux'; -import {compose} from 'react-apollo'; +import {compose, graphql, gql} from 'react-apollo'; -import {modUserFlaggedQuery} from 'coral-admin/src/graphql/queries'; import {banUser, setUserStatus, rejectUsername} from 'coral-admin/src/graphql/mutations'; import { @@ -31,6 +30,43 @@ class CommunityContainer extends Component { } } +export const withQuery = graphql(gql` + query Users($action_type: ACTION_TYPE) { + users(query:{action_type: $action_type}){ + id + username + status + roles + actions{ + id + created_at + ... on FlagAction { + reason + message + user { + id + username + } + } + } + action_summaries { + count + ... on FlagActionSummary { + reason + } + } + } + } +`, { + options: ({params: {action_type = 'FLAG'}}) => { + return { + variables: { + action_type: action_type + } + }; + } +}); + const mapStateToProps = (state) => ({ community: state.community.toJS() }); @@ -48,7 +84,7 @@ const mapDispatchToProps = (dispatch) => export default compose( connect(mapStateToProps, mapDispatchToProps), - modUserFlaggedQuery, + withQuery, banUser, setUserStatus, rejectUsername diff --git a/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js b/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js index 79f0b964f..17b15064a 100644 --- a/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js +++ b/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js @@ -1,8 +1,7 @@ import React from 'react'; -import {compose} from 'react-apollo'; import {connect} from 'react-redux'; -import {getMetrics} from 'coral-admin/src/graphql/queries'; import Dashboard from '../components/Dashboard'; +import {compose, graphql, gql} from 'react-apollo'; import {Spinner} from 'coral-ui'; @@ -20,6 +19,38 @@ class DashboardContainer extends React.Component { } } +export const withQuery = graphql(gql` + query Metrics($from: Date!, $to: Date!) { + assetsByFlag: assetMetrics(from: $from, to: $to, sort: FLAG) { + ...metrics + } + assetsByActivity: assetMetrics(from: $from, to: $to, sort: ACTIVITY) { + ...metrics + } + } + fragment metrics on Asset { + id + title + url + author + created_at + commentCount + action_summaries { + actionCount + actionableItemCount + } + } +`, { + options: ({settings: {dashboardWindowStart, dashboardWindowEnd}}) => { + return { + variables: { + from: dashboardWindowStart, + to: dashboardWindowEnd + } + }; + } +}); + const mapStateToProps = (state) => { return { settings: state.settings.toJS(), @@ -29,5 +60,5 @@ const mapStateToProps = (state) => { export default compose( connect(mapStateToProps), - getMetrics + withQuery, )(DashboardContainer); diff --git a/client/coral-admin/src/routes/Install/containers/InstallContainer.js b/client/coral-admin/src/routes/Install/containers/Install.js similarity index 100% rename from client/coral-admin/src/routes/Install/containers/InstallContainer.js rename to client/coral-admin/src/routes/Install/containers/Install.js diff --git a/client/coral-admin/src/routes/Install/index.js b/client/coral-admin/src/routes/Install/index.js index 5c47e4060..94c7bf93f 100644 --- a/client/coral-admin/src/routes/Install/index.js +++ b/client/coral-admin/src/routes/Install/index.js @@ -1 +1 @@ -export {default} from './containers/InstallContainer.js'; +export {default} from './containers/Install.js'; diff --git a/client/coral-admin/src/routes/Moderation/components/Moderation.js b/client/coral-admin/src/routes/Moderation/components/Moderation.js index 10f775cd7..b3c5d68af 100644 --- a/client/coral-admin/src/routes/Moderation/components/Moderation.js +++ b/client/coral-admin/src/routes/Moderation/components/Moderation.js @@ -12,14 +12,13 @@ import ModerationMenu from './ModerationMenu'; import ModerationHeader from './ModerationHeader'; import NotFoundAsset from './NotFoundAsset'; import ModerationKeysModal from '../../../components/ModerationKeysModal'; -import UserDetail from './UserDetail'; +import UserDetail from '../containers/UserDetail'; const lang = new I18n(translations); export default class Moderation extends Component { state = { selectedIndex: 0, - sort: 'REVERSE_CHRONOLOGICAL' } componentWillMount() { @@ -76,11 +75,6 @@ export default class Moderation extends Component { } } - selectSort = (sort) => { - this.setState({sort}); - this.props.modQueueResort(sort); - } - suspendUser = async (args) => { this.props.hideSuspendUserDialog(); try { @@ -174,8 +168,8 @@ export default class Moderation extends Component { premodCount={data.premodCount} rejectedCount={data.rejectedCount} flaggedCount={data.flaggedCount} - selectSort={this.selectSort} - sort={this.state.sort} + selectSort={this.props.setSortOrder} + sort={this.props.moderation.sortOrder} /> { diff --git a/client/coral-admin/src/routes/Moderation/containers/Moderation.js b/client/coral-admin/src/routes/Moderation/containers/Moderation.js index 722b6a0b4..6c707a534 100644 --- a/client/coral-admin/src/routes/Moderation/containers/Moderation.js +++ b/client/coral-admin/src/routes/Moderation/containers/Moderation.js @@ -1,10 +1,9 @@ import React, {Component} from 'react'; import {connect} from 'react-redux'; import {bindActionCreators} from 'redux'; -import {compose} from 'react-apollo'; +import {compose, graphql, gql} from 'react-apollo'; import isEqual from 'lodash/isEqual'; -import {modQueueQuery, getQueueCounts} from '../../../graphql/queries'; import {banUser, setCommentStatus, suspendUser} from '../../../graphql/mutations'; import {fetchSettings} from 'actions/settings'; @@ -18,7 +17,8 @@ import { hideSuspendUserDialog, hideShortcutsNote, viewUserDetail, - hideUserDetail + hideUserDetail, + setSortOrder, } from 'actions/moderation'; import {Spinner} from 'coral-ui'; @@ -36,6 +36,46 @@ class ModerationContainer extends Component { } } + loadMore = ({limit = 10, cursor, sort, tab, asset_id}) => { + let variables = { + limit, + cursor, + sort, + asset_id + }; + switch(tab) { + case 'all': + variables.statuses = null; + break; + case 'accepted': + variables.statuses = ['ACCEPTED']; + break; + case 'premod': + variables.statuses = ['PREMOD']; + break; + case 'flagged': + variables.statuses = ['NONE', 'PREMOD']; + variables.action_type = 'FLAG'; + break; + case 'rejected': + variables.statuses = ['REJECTED']; + break; + } + return this.props.data.fetchMore({ + query: LOAD_MORE_QUERY, + variables, + updateQuery: (oldData, {fetchMoreResult:{comments}}) => { + return { + ...oldData, + [tab]: [ + ...oldData[tab], + ...comments + ] + }; + } + }); + }; + render () { const {data} = this.props; @@ -46,10 +86,172 @@ class ModerationContainer extends Component { if (data.error) { return
Error
; } - return ; + return ; } } +const commentView = gql` + fragment commentView on Comment { + id + body + created_at + status + user { + id + name: username + status + } + asset { + id + title + url + } + action_summaries { + count + ... on FlagActionSummary { + reason + } + } + actions { + ... on FlagAction { + reason + message + user { + username + } + } + } + } +`; + +const LOAD_MORE_QUERY = gql` + query LoadMoreModQueue($limit: Int = 10, $cursor: Date, $sort: SORT_ORDER, $asset_id: ID, $statuses:[COMMENT_STATUS!], $action_type: ACTION_TYPE) { + comments(query: {limit: $limit, cursor: $cursor, asset_id: $asset_id, statuses: $statuses, sort: $sort, action_type: $action_type}) { + ...commentView + action_summaries { + count + ... on FlagActionSummary { + reason + } + } + } + } + ${commentView} +`; + +const withQuery = graphql(gql` + query ModQueue($asset_id: ID, $sort: SORT_ORDER) { + all: comments(query: { + statuses: [NONE, PREMOD, ACCEPTED, REJECTED], + asset_id: $asset_id, + sort: $sort + }) { + ...commentView + } + accepted: comments(query: { + statuses: [ACCEPTED], + asset_id: $asset_id, + sort: $sort + }) { + ...commentView + } + premod: comments(query: { + statuses: [PREMOD], + asset_id: $asset_id, + sort: $sort + }) { + ...commentView + } + flagged: comments(query: { + action_type: FLAG, + asset_id: $asset_id, + statuses: [NONE, PREMOD], + sort: $sort + }) { + ...commentView + } + rejected: comments(query: { + statuses: [REJECTED], + asset_id: $asset_id, + sort: $sort + }) { + ...commentView + } + assets: assets { + id + title + url + } + allCount: commentCount(query: { + asset_id: $asset_id + }) + acceptedCount: commentCount(query: { + statuses: [ACCEPTED], + asset_id: $asset_id + }) + premodCount: commentCount(query: { + statuses: [PREMOD], + asset_id: $asset_id + }) + rejectedCount: commentCount(query: { + statuses: [REJECTED], + asset_id: $asset_id + }) + flaggedCount: commentCount(query: { + action_type: FLAG, + asset_id: $asset_id, + statuses: [NONE, PREMOD] + }) + settings { + organizationName + } + } + ${commentView} +`, { + options: ({params: {id = null}, moderation: {sortOrder}}) => { + return { + variables: { + asset_id: id, + sort: sortOrder, + } + }; + }, +}); + +const withQueueCountPolling = graphql(gql` + query Counts($asset_id: ID) { + allCount: commentCount(query: { + asset_id: $asset_id + }) + acceptedCount: commentCount(query: { + statuses: [ACCEPTED], + asset_id: $asset_id + }) + premodCount: commentCount(query: { + statuses: [PREMOD], + asset_id: $asset_id + }) + rejectedCount: commentCount(query: { + statuses: [REJECTED], + asset_id: $asset_id + }) + flaggedCount: commentCount(query: { + action_type: FLAG, + asset_id: $asset_id, + statuses: [NONE, PREMOD] + }) + } +`, { + options: ({params: {id = null}}) => { + return { + pollInterval: 5000, + variables: { + asset_id: id + } + }; + } +}); + const mapStateToProps = (state) => ({ moderation: state.moderation.toJS(), settings: state.settings.toJS(), @@ -70,14 +272,15 @@ const mapDispatchToProps = (dispatch) => ({ hideSuspendUserDialog, viewUserDetail, hideUserDetail, + setSortOrder, }, dispatch), }); export default compose( connect(mapStateToProps, mapDispatchToProps), setCommentStatus, - getQueueCounts, banUser, suspendUser, - modQueueQuery, + withQueueCountPolling, + withQuery, )(ModerationContainer); diff --git a/client/coral-admin/src/routes/Moderation/containers/UserDetail.js b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js index 6923eb96e..f9dc3eb0b 100644 --- a/client/coral-admin/src/routes/Moderation/containers/UserDetail.js +++ b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js @@ -1,6 +1,5 @@ import React, {PropTypes} from 'react'; -import {compose} from 'react-apollo'; -import {getUserDetail} from 'coral-admin/src/graphql/queries'; +import {compose, graphql, gql} from 'react-apollo'; import UserDetail from '../components/UserDetail'; class UserDetailContainer extends React.Component { @@ -14,6 +13,28 @@ class UserDetailContainer extends React.Component { } } +export const withQuery = graphql(gql` + query UserDetail($author_id: ID!) { + user(id: $author_id) { + id + username + created_at + profiles { + id + provider + } + } + totalComments: commentCount(query: {author_id: $author_id}) + rejectedComments: commentCount(query: {author_id: $author_id, statuses: [REJECTED]}) + } +`, { + options: ({id}) => { + return { + variables: {author_id: id} + }; + } +}); + export default compose( - getUserDetail + withQuery, )(UserDetailContainer);