From 8982159f117ceb6bdf7bcb0f3c15d41e47ab8e54 Mon Sep 17 00:00:00 2001 From: sballesteros Date: Thu, 21 Nov 2019 19:26:21 -0800 Subject: [PATCH] switch to infinite scroll for moderate #11 --- src/components/moderate.css | 1 + src/components/moderate.js | 34 ++-- src/components/moderation-card.css | 8 + src/components/moderation-card.js | 305 +++++++++++++++++++++-------- src/ddocs/ddoc-docs.js | 2 + src/hooks/api-hooks.js | 22 ++- 6 files changed, 263 insertions(+), 109 deletions(-) diff --git a/src/components/moderate.css b/src/components/moderate.css index 8e445fd..a528d19 100644 --- a/src/components/moderate.css +++ b/src/components/moderate.css @@ -1,6 +1,7 @@ .moderate { padding: calc(var(--header-bar-height) + var(--lgrd)) var(--mgrd) var(--lgrd); max-width: 900px; + min-height: 100vh; margin: 0 auto; & .moderate__header { diff --git a/src/components/moderate.js b/src/components/moderate.js index 92540ad..fe96dec 100644 --- a/src/components/moderate.js +++ b/src/components/moderate.js @@ -1,6 +1,5 @@ import React, { useState, useEffect } from 'react'; import { Helmet } from 'react-helmet-async'; -import { MdChevronRight, MdFirstPage } from 'react-icons/md'; import { useUser } from '../contexts/user-context'; import { getId } from '../utils/jsonld'; import HeaderBar from './header-bar'; @@ -16,7 +15,9 @@ export default function Moderate() { const search = createModerationQs({ bookmark }); - const [results, progress] = useActionsSearchResults(search); + // TODO set of exluded content + + const [results, progress] = useActionsSearchResults(search, !!bookmark); const [isOpenedMap, setIsOpenedMap] = useState( results.rows.reduce((map, row) => { @@ -33,6 +34,10 @@ export default function Moderate() { ); }, [results]); + useEffect(() => { + window.scrollTo(0, 0); + }, []); + return (
@@ -45,10 +50,9 @@ export default function Moderate() { Moderate Content {results.total_rows} Flagged Reviews + {results.total_rows === 0 && !progress.isActive ? ( -
No activity yet.
- ) : bookmark && results.bookmark === bookmark && !progress.isActive ? ( -
No more activity.
+
No reported reviews.
) : (
    @@ -58,6 +62,7 @@ export default function Moderate() { user={user} reviewAction={doc} isOpened={isOpenedMap[getId(doc)] || false} + isLockedBy={undefined /* TODO wire */} onOpen={() => { setIsOpenedMap( results.rows.reduce((map, row) => { @@ -66,6 +71,10 @@ export default function Moderate() { }, {}) ); }} + onSuccess={moderationAction => { + // TODO add a `exclude` params to the search qs so that we refresh the results in a safe way + console.log('moderationAction', moderationAction); + }} onClose={() => { setIsOpenedMap( results.rows.reduce((map, row) => { @@ -83,26 +92,17 @@ export default function Moderate() {
    {/* Cloudant returns the same bookmark when it hits the end of the list */} - {!!bookmark && ( - - )} - {!!( results.rows.length < results.total_rows && results.bookmark !== bookmark ) && ( )}
    diff --git a/src/components/moderation-card.css b/src/components/moderation-card.css index 96f9f16..b137d3d 100644 --- a/src/components/moderation-card.css +++ b/src/components/moderation-card.css @@ -170,3 +170,11 @@ margin-left: var(--sgrd); } } + + +.moderation-card-modal { + & textarea { + width: 100%; + margin: var(--xsgrd) 0 var(--mgrd) 0; + } +} diff --git a/src/components/moderation-card.js b/src/components/moderation-card.js index 9bf2a2d..722d57f 100644 --- a/src/components/moderation-card.js +++ b/src/components/moderation-card.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import classNames from 'classnames'; import { MdExpandLess, MdExpandMore, MdLock } from 'react-icons/md'; import { format } from 'date-fns'; -import { getId } from '../utils/jsonld'; +import { getId, unprefix } from '../utils/jsonld'; import Collapse from './collapse'; import IconButton from './icon-button'; import Value from './value'; @@ -19,22 +19,24 @@ export default function ModerationCard({ user, reviewAction, isOpened, + isLockedBy, onOpen, - onClose + onClose, + onSuccess }) { - const [isModalOpen, setIsModalOpen] = useState(false); - const [role, fetchRoleProgress] = useRole(reviewAction.agent); + const [modalFrame, setModalFrame] = useState(null); + const [reviewActionAgent, fetchReviewActionAgentProgress] = useRole( + reviewAction.agent + ); + const [lockerRole, fetchLockerRole] = useRole(isLockedBy); const reports = getActiveReports(reviewAction); const textAnswers = getTextAnswers(reviewAction); - /* !TODO: @sballesteros wire the lock state of the card here */ - const isLocked = false; - return (
    {/* The card body */} @@ -45,7 +47,8 @@ export default function ModerationCard({ className="moderation-card__header-badge" /> - {role && role.name} + {reviewActionAgent && + (reviewActionAgent.name || unprefix(getId(reviewActionAgent)))}
    @@ -123,18 +126,22 @@ export default function ModerationCard({
+ {user.isAdmin && + reviewActionAgent && + !reviewActionAgent.isModerated && ( + + )} - - {isModalOpen && ( + {modalFrame && ( { - setIsModalOpen(false); + setModalFrame(null); }} + onSuccess={onSuccess} /> )}
- {isLocked && ( + {!!lockerRole && (
@@ -169,11 +178,13 @@ export default function ModerationCard({ This report is currently being reviewed by another moderator. - {/*!TODO: @sballesteros wire the badge here */} + - + - [Moderator Name] + {lockerRole + ? lockerRole.name || unprefix(getId(lockerRole)) + : null}
@@ -206,85 +217,205 @@ ModerationCard.propTypes = { }) ).isRequired }).isRequired, + isLockedBy: PropTypes.string, // the roleId of a moderator currently viewing the card isOpened: PropTypes.bool.isRequired, onOpen: PropTypes.func.isRequired, - onClose: PropTypes.func.isRequired + onClose: PropTypes.func.isRequired, + onSuccess: PropTypes.func.isRequired }; -function ModerationCardModal({ onClose, reviewAction, user }) { - const [frame, setFrame] = useState('action'); +function ModerationCardModal({ + onClose, + onSuccess, + reviewAction, + user, + defaultFrame +}) { + const [frame, setFrame] = useState(defaultFrame); const [post, postProgress] = usePostAction(); const ref = useRef(); return ( - {frame === 'action' ? ( - -

- Retracting the review will prevent reader to see its content or - existence. -

+
+ {frame === 'ModerateRapidPREreviewAction' ? ( + +

+ Retracting the review will prevent reader to see its content or + existence. +

- + -