diff --git a/packages/component-faraday-selectors/src/index.js b/packages/component-faraday-selectors/src/index.js index 226cee8a46d7dffe0f8f6d756b6211da1e8eff6c..9db2953a800268d97bc121d22fb58e0b7b04aaf0 100644 --- a/packages/component-faraday-selectors/src/index.js +++ b/packages/component-faraday-selectors/src/index.js @@ -30,18 +30,34 @@ export const currentUserIs = ({ currentUser: { user } }, role) => { } } -const cannotInviteReviewersStatuses = ['draft', 'rejected', 'published'] +const canInviteReviewersStatuses = [ + 'heAssigned', + 'reviewersInvited', + 'underReview', + 'reviewCompleted', +] export const canInviteReviewers = (state, collection) => { - if ( - cannotInviteReviewersStatuses.includes(get(collection, 'status', 'draft')) - ) + if (!canInviteReviewersStatuses.includes(get(collection, 'status', 'draft'))) return false const user = selectCurrentUser(state) - const isStaff = currentUserIs(state, 'isAdmin') + const isAdmin = currentUserIs(state, 'isAdmin') const { isAccepted, id: heId } = get(collection, 'handlingEditor', {}) - return isAccepted && (user.id === heId || isStaff) + return isAccepted && (user.id === heId || isAdmin) +} + +const cannotViewReviewersDetails = [ + 'draft', + 'technicalChecks', + 'submitted', + 'heInvited', +] +export const canViewReviewersDetails = (state, collection = {}) => { + if (cannotViewReviewersDetails.includes(get(collection, 'status', 'draft'))) { + return false + } + return canViewReports(state, collection.id) } export const getUserToken = ({ currentUser }) => @@ -90,7 +106,7 @@ export const canOverrideTechnicalChecks = (state, collection) => { return canOverrideTechnicalChecksStatuses.includes(status) } -export const canSeeReviewersReports = (state, collectionId) => { +export const canViewReports = (state, collectionId) => { const isHE = isHEToManuscript(state, collectionId) const isEiC = currentUserIs(state, 'adminEiC') return isHE || isEiC diff --git a/packages/component-faraday-ui/src/EditorialReportCard.js b/packages/component-faraday-ui/src/EditorialReportCard.js new file mode 100644 index 0000000000000000000000000000000000000000..d23b06d23b4561eec995de328a4afd99b2175a09 --- /dev/null +++ b/packages/component-faraday-ui/src/EditorialReportCard.js @@ -0,0 +1,100 @@ +import React, { Fragment } from 'react' +import { get } from 'lodash' +import { withProps, withHandlers, compose } from 'recompose' +import styled from 'styled-components' +import { th } from '@pubsweet/ui-toolkit' +import { DateParser } from '@pubsweet/ui' + +import { Label, Item, Row, Text, Tag } from './' +import { getReportComments } from './helpers' + +const EditorialReportCard = ({ + journal, + publicReport, + privateReport, + recommendation, + reviewerName, + reviewerRole, + report: { submittedOn, reviewer }, +}) => ( + <Root> + <Row justify="space-between" mb={2}> + <Item vertical> + <Label mb={1 / 2}>Decision</Label> + <Text>{recommendation}</Text> + </Item> + + <Item justify="flex-end"> + {reviewer && ( + <Fragment> + <Text mr={1 / 2}>{reviewerName}</Text> + <Tag mr={2}>{reviewerRole}</Tag> + </Fragment> + )} + <DateParser timestamp={submittedOn}> + {date => <Text>{date}</Text>} + </DateParser> + </Item> + </Row> + + {publicReport && ( + <Row mb={2}> + <Item vertical> + <Label mb={1 / 2}>Message For Author</Label> + <Text>{publicReport}</Text> + </Item> + </Row> + )} + + {privateReport && ( + <Row mb={2}> + <Item vertical> + <Label mb={1 / 2}>Message For Editorial Team</Label> + <Text>{privateReport}</Text> + </Item> + </Row> + )} + </Root> +) + +export default compose( + withHandlers({ + getReviewerRole: ({ report }) => () => { + if (get(report, 'reviewer.handlingEditor')) { + return 'HE' + } + return get(report, 'reviewer.editorInChief') ? 'EiC' : '' + }, + getReviewerName: ({ report }) => () => + `${get(report, 'reviewer.firstName', '')} ${get( + report, + 'reviewer.lastName', + '', + )}`, + getRecommendationLabel: ({ + report, + journal: { recommendations = [] }, + }) => () => + get( + recommendations.find(r => r.value === report.recommendation), + 'label', + ), + }), + withProps( + ({ report, getReviewerRole, getReviewerName, getRecommendationLabel }) => ({ + recommendation: getRecommendationLabel(), + publicReport: getReportComments({ report, isPublic: true }), + privateReport: getReportComments({ report, isPublic: false }), + reviewerName: getReviewerName(), + reviewerRole: getReviewerRole(), + }), + ), +)(EditorialReportCard) + +// #region styles +const Root = styled.div` + box-shadow: ${th('boxShadow')}; + padding: calc(${th('gridUnit')} * 2); + margin: ${th('gridUnit')}; +` +// #endregion diff --git a/packages/component-faraday-ui/src/EditorialReportCard.md b/packages/component-faraday-ui/src/EditorialReportCard.md new file mode 100644 index 0000000000000000000000000000000000000000..26fd9dce55e7c917e5944b6baf617a3384c50407 --- /dev/null +++ b/packages/component-faraday-ui/src/EditorialReportCard.md @@ -0,0 +1,156 @@ +Editorial Report Card + +Card with message for the author + +```js +const report = { + id: '71effdc0-ccb1-4ea9-9422-dcc9f8713347', + userId: '9ac5b5b5-252c-4933-9e66-72ec7c644a5c', + comments: [ + { + files: [], + public: true, + content: 'Public report here. Message for the author.', + }, + ], + createdOn: 1538053564396, + updatedOn: 1538053600643, + submittedOn: 1538053600624, + recommendation: 'publish', + recommendationType: 'editorialRecommendation', + reviewer: { + id: '9ac5b5b5-252c-4933-9e66-72ec7c644a5c', + type: 'user', + lastName: 'John', + firstName: 'Doe', + editorInChief: true, + handlingEditor: true, + }, +} +const journal = { + recommendations: [ + { + value: 'publish', + label: 'Publish', + }, + { + value: 'major', + label: 'Major revision', + }, + { + value: 'minor', + label: 'Minor revision', + }, + { + value: 'reject', + label: 'Reject', + }, + ], +} +;<EditorialReportCard report={report} journal={journal} /> +``` + +Card with message for the editorial team + +```js +const report = { + id: '71effdc0-ccb1-4ea9-9422-dcc9f8713347', + userId: '9ac5b5b5-252c-4933-9e66-72ec7c644a5c', + comments: [ + { + files: [], + public: false, + content: 'Confidential note is here. Message for editorial team.', + }, + ], + createdOn: 1538053564396, + updatedOn: 1538053600643, + submittedOn: 1538053600624, + recommendation: 'publish', + recommendationType: 'editorialRecommendation', + reviewer: { + id: '9ac5b5b5-252c-4933-9e66-72ec7c644a5c', + type: 'user', + lastName: 'John', + firstName: 'Doe', + editorInChief: true, + handlingEditor: false, + }, +} +const journal = { + recommendations: [ + { + value: 'publish', + label: 'Publish', + }, + { + value: 'major', + label: 'Major revision', + }, + { + value: 'minor', + label: 'Minor revision', + }, + { + value: 'reject', + label: 'Reject', + }, + ], +} +;<EditorialReportCard report={report} journal={journal} /> +``` + +Card with message for the editorial team and for the author + +```js +const report = { + id: '71effdc0-ccb1-4ea9-9422-dcc9f8713347', + userId: '9ac5b5b5-252c-4933-9e66-72ec7c644a5c', + comments: [ + { + files: [], + public: false, + content: 'Confidential note is here. Message for editorial team.', + }, + { + files: [], + public: true, + content: 'Public report here. Message for the author.', + }, + ], + createdOn: 1538053564396, + updatedOn: 1538053600643, + submittedOn: 1538053600624, + recommendation: 'publish', + recommendationType: 'editorialRecommendation', + reviewer: { + id: '9ac5b5b5-252c-4933-9e66-72ec7c644a5c', + type: 'user', + lastName: 'John', + firstName: 'Doe', + editorInChief: false, + handlingEditor: true, + }, +} +const journal = { + recommendations: [ + { + value: 'publish', + label: 'Publish', + }, + { + value: 'major', + label: 'Major revision', + }, + { + value: 'minor', + label: 'Minor revision', + }, + { + value: 'reject', + label: 'Reject', + }, + ], +} +;<EditorialReportCard report={report} journal={journal} /> +``` diff --git a/packages/component-faraday-ui/src/ManuscriptCard.js b/packages/component-faraday-ui/src/ManuscriptCard.js index 4c71c77f4190a961d472b0c9f96e921933ff5fd2..1ac9337dd68815a3a0255cdb72d0b2dfe52bbdc2 100644 --- a/packages/component-faraday-ui/src/ManuscriptCard.js +++ b/packages/component-faraday-ui/src/ManuscriptCard.js @@ -25,7 +25,7 @@ const ManuscriptCard = ({ onDelete, canDelete, onCardClick, - canSeeReviewersReports, + canViewReports, fragment = {}, manuscriptType = {}, collection: { visibleStatus = 'Draft', handlingEditor, customId, id: collId }, @@ -77,7 +77,7 @@ const ManuscriptCard = ({ <Text ml={1} mr={3} whiteSpace="nowrap"> {get(handlingEditor, 'name', 'Unassigned')} </Text> - {canSeeReviewersReports && ( + {canViewReports && ( <Fragment> <Label mr={1}>Reviewers Reports</Label> <ReviewerBreakdown fragment={fragment} label="Reviewer Reports" /> @@ -139,6 +139,7 @@ const MainContainer = styled.div` padding: calc(${th('gridUnit')} * 2); padding-bottom: ${th('gridUnit')}; width: calc(100% - (${th('gridUnit')} * 5 / 2)); + overflow: hidden; ${Row} { [data-tooltipped] { diff --git a/packages/component-faraday-ui/src/contextualBoxes/ReviewerDetails.js b/packages/component-faraday-ui/src/contextualBoxes/ReviewerDetails.js index e0b21c0c3f670da5fdeb160ac4ac71bf9d13bbe7..68bec9548dd8d3b3b8dd4eb2043db43409d26c90 100644 --- a/packages/component-faraday-ui/src/contextualBoxes/ReviewerDetails.js +++ b/packages/component-faraday-ui/src/contextualBoxes/ReviewerDetails.js @@ -25,35 +25,38 @@ const ReviewerDetails = ({ fragment, invitations, previewFile, - currentUser, downloadFile, - canSeeReports, + canInviteReviewers, onInviteReviewer, onResendReviewerInvite, onRevokeReviewerInvite, toggle, expanded, -}) => ( - <ContextualBox - expanded={expanded} - label="Reviewer details" - rightChildren={<ReviewerBreakdown fitContent fragment={fragment} mr={1} />} - scrollIntoView - toggle={toggle} - > - <Tabs> - {({ selectedTab, changeTab }) => ( - <Fragment> - <TabsHeader> - <TabButton - ml={1} - mr={1} - onClick={() => changeTab(0)} - selected={selectedTab === 0} - > - <H4>Reviewer Details</H4> - </TabButton> - {canSeeReports && ( + canViewReviewersDetails, +}) => + canViewReviewersDetails ? ( + <ContextualBox + expanded={expanded} + label="Reviewer Details & Reports" + rightChildren={ + <ReviewerBreakdown fitContent fragment={fragment} mr={1} /> + } + startExpanded + toggle={toggle} + > + <Tabs> + {({ selectedTab, changeTab }) => ( + <Fragment> + <TabsHeader> + <TabButton + ml={1} + mr={1} + onClick={() => changeTab(0)} + selected={selectedTab === 0} + > + <H4>Reviewer Details</H4> + </TabButton> + <TabButton ml={1} mr={1} @@ -63,24 +66,24 @@ const ReviewerDetails = ({ <H4>Reviewer Reports</H4> <Tag mr={1}>{reports.length}</Tag> </TabButton> - )} - </TabsHeader> - <TabContent> - {selectedTab === 0 && ( - <Fragment> - <InviteReviewers - modalKey="invite-reviewers" - onInvite={onInviteReviewer} - /> - <ReviewersTable - invitations={invitations} - onResendReviewerInvite={onResendReviewerInvite} - onRevokeReviewerInvite={onRevokeReviewerInvite} - /> - </Fragment> - )} - {canSeeReports && - selectedTab === 1 && ( + </TabsHeader> + <TabContent> + {selectedTab === 0 && ( + <Fragment> + {canInviteReviewers && ( + <InviteReviewers + modalKey="invite-reviewers" + onInvite={onInviteReviewer} + /> + )} + <ReviewersTable + invitations={invitations} + onResendReviewerInvite={onResendReviewerInvite} + onRevokeReviewerInvite={onRevokeReviewerInvite} + /> + </Fragment> + )} + {selectedTab === 1 && ( <Fragment> {reports.length === 0 && ( <Text align="center">No reports submitted yet.</Text> @@ -98,12 +101,12 @@ const ReviewerDetails = ({ ))} </Fragment> )} - </TabContent> - </Fragment> - )} - </Tabs> - </ContextualBox> -) + </TabContent> + </Fragment> + )} + </Tabs> + </ContextualBox> + ) : null export default compose( withFilePreview, @@ -117,8 +120,11 @@ export default compose( reports: reviewerReports.filter(r => r.submittedOn), })), withProps(({ currentUser }) => ({ - canSeeReports: - get(currentUser, 'isEIC', false) || get(currentUser, 'isHE', false), + canInviteReviewers: get(currentUser, 'permissions.canInviteReviewers'), + canViewReviewersDetails: get( + currentUser, + 'permissions.canViewReviewersDetails', + ), })), )(ReviewerDetails) diff --git a/packages/component-faraday-ui/src/helpers/utils.js b/packages/component-faraday-ui/src/helpers/utils.js index f99bf88b7a695cb0e7891211f0471bcf93a52f8c..898fd3ebc62282763a1331fd359f9d8da85a732c 100644 --- a/packages/component-faraday-ui/src/helpers/utils.js +++ b/packages/component-faraday-ui/src/helpers/utils.js @@ -1,5 +1,12 @@ -import { get } from 'lodash' +import { get, chain } from 'lodash' export const handleError = fn => e => { fn(get(JSON.parse(e.response), 'error', 'Oops! Something went wrong!')) } + +export const getReportComments = ({ report, isPublic = false }) => + chain(report) + .get('comments', []) + .find(c => c.public === isPublic) + .get('content') + .value() diff --git a/packages/component-faraday-ui/src/index.js b/packages/component-faraday-ui/src/index.js index 88eb9e4be5129fb6851cb9f74ff01c2e35c24301..9c505e4d598f0482be74d0c8d9de774572327b8d 100644 --- a/packages/component-faraday-ui/src/index.js +++ b/packages/component-faraday-ui/src/index.js @@ -44,6 +44,7 @@ export { default as UserProfile } from './UserProfile' export { default as WizardAuthors } from './WizardAuthors' export { default as WizardFiles } from './WizardFiles' export { default as TextTooltip } from './TextTooltip' +export { default as EditorialReportCard } from './EditorialReportCard' export * from './OverrideAlert' export * from './manuscriptDetails' diff --git a/packages/component-manuscript/src/components/EditorialCommentCard.js b/packages/component-manuscript/src/components/EditorialCommentCard.js new file mode 100644 index 0000000000000000000000000000000000000000..aa9187971fa82db28b3a3896b7fafb78c4520622 --- /dev/null +++ b/packages/component-manuscript/src/components/EditorialCommentCard.js @@ -0,0 +1,17 @@ +import React from 'react' +import { + EditorialReportCard, + ContextualBox, + withFilePreview, + withFileDownload, +} from 'pubsweet-component-faraday-ui' + +const EditorialCommentCard = ({ journal, reports = [] }) => ( + <ContextualBox label="Editorial Comments" mb={2}> + {reports.map(report => ( + <EditorialReportCard journal={journal} key={report.id} report={report} /> + ))} + </ContextualBox> +) + +export default withFileDownload(withFilePreview(EditorialCommentCard)) diff --git a/packages/component-manuscript/src/components/ManuscriptLayout.js b/packages/component-manuscript/src/components/ManuscriptLayout.js index d0178984f703984f8f8e74a5929eaa8252450192..131e0cdc7053d6466f13752236426cac540db1c4 100644 --- a/packages/component-manuscript/src/components/ManuscriptLayout.js +++ b/packages/component-manuscript/src/components/ManuscriptLayout.js @@ -3,6 +3,7 @@ import styled from 'styled-components' import { isEmpty, get, last } from 'lodash' import { Text, + paddingHelper, ReviewerDetails, ManuscriptHeader, ManuscriptAssignHE, @@ -11,11 +12,11 @@ import { ResponseToInvitation, ManuscriptEicDecision, EditorialRecommendation, - paddingHelper, } from 'pubsweet-component-faraday-ui' import ReviewerReportCard from './ReviewReportCard' import ReviewerReportForm from './ReviewerReportForm' +import EditorialCommentCard from './EditorialCommentCard' const eicDecisions = [ { value: 'return-to-handling-editor', label: 'Return to Handling Editor' }, @@ -99,6 +100,14 @@ const ManuscriptLayout = ({ getSignedUrl={getSignedUrl} /> + {get(currentUser, 'permissions.canViewReports', true) && + !!editorialRecommendations.length && ( + <EditorialCommentCard + journal={journal} + reports={editorialRecommendations} + /> + )} + {submittedOwnRecommendation && ( <ReviewerReportCard getSignedUrl={getSignedUrl} @@ -156,7 +165,6 @@ const ManuscriptLayout = ({ {get(currentUser, 'permissions.canMakeDecision', false) && ( <ManuscriptEicDecision formValues={get(formValues, 'eicDecision')} - isFetching={isFetching.recommendationsFetching} messagesLabel={messagesLabel} mt={2} options={ @@ -177,7 +185,7 @@ const ManuscriptLayout = ({ /> )} - {get(currentUser, 'permissions.canInviteReviewers', false) && ( + {get(currentUser, 'permissions.canViewReviewersDetails', false) && ( <ReviewerDetails currentUser={currentUser} expanded={reviewerDetailsExpanded} diff --git a/packages/component-manuscript/src/components/ManuscriptPage.js b/packages/component-manuscript/src/components/ManuscriptPage.js index 6481bd89d1c29366c1b526bb9222165d66fe2400..717de92e57092dbb211bfd403ad816d004661ed3 100644 --- a/packages/component-manuscript/src/components/ManuscriptPage.js +++ b/packages/component-manuscript/src/components/ManuscriptPage.js @@ -30,10 +30,15 @@ import { hasManuscriptFailure, clearCustomError, } from 'pubsweet-components-faraday/src/redux/errors' -import { selectEditorialRecommendations } from 'pubsweet-components-faraday/src/redux/recommendations' +import { + createRecommendation, + selectReviewRecommendations, + selectEditorialRecommendations, +} from 'pubsweet-components-faraday/src/redux/recommendations' import { getUserToken, currentUserIs, + canViewReports, canMakeRevision, canMakeDecision, isHEToManuscript, @@ -43,6 +48,7 @@ import { currentUserIsReviewer, parseCollectionDetails, canMakeHERecommendation, + canViewReviewersDetails, pendingReviewerInvitation, canOverrideTechnicalChecks, getOwnPendingRecommendation, @@ -63,11 +69,6 @@ import { selectHandlingEditors, handlingEditorDecision, } from '../redux/editors' -import { - createRecommendation, - recommendationsFetching, - selectReviewRecommendations, -} from '../redux/recommendations' export default compose( setDisplayName('ManuscriptPage'), @@ -155,17 +156,18 @@ export default compose( statuses: get(journal, 'statuses', {}), }), canAssignHE: canAssignHE(state, match.params.project), + canViewReports: canViewReports(state, match.params.project), canInviteReviewers: canInviteReviewers(state, collection), canMakeRecommendation: !isUndefined(pendingOwnRecommendation), canMakeRevision: canMakeRevision(state, collection, fragment), canMakeDecision: canMakeDecision(state, collection, fragment), canEditManuscript: canEditManuscript(state, collection, fragment), + canViewReviewersDetails: canViewReviewersDetails(state, collection), canOverrideTechChecks: canOverrideTechnicalChecks(state, collection), }, }, isFetching: { editorsFetching: selectFetching(state), - recommendationsFetching: recommendationsFetching(state), }, formValues: { eicDecision: getFormValues('eic-decision')(state), diff --git a/packages/component-manuscript/src/components/ReviewsAndReports.js b/packages/component-manuscript/src/components/ReviewsAndReports.js index 06eedd8921407c034aa768186a012ecf821d19dc..d2efda6e7b5bca2101fa9f7b0dfdbbb7e7a9c8c9 100644 --- a/packages/component-manuscript/src/components/ReviewsAndReports.js +++ b/packages/component-manuscript/src/components/ReviewsAndReports.js @@ -15,7 +15,7 @@ import { } from 'pubsweet-components-faraday/src/redux/reviewers' import { selectReviewRecommendations } from 'pubsweet-components-faraday/src/redux/recommendations' import { - canSeeReviewersReports, + canViewReports, currentUserIsAuthor, } from 'pubsweet-component-faraday-selectors' @@ -44,12 +44,12 @@ const ReviewsAndReports = ({ isReviewer, mappedReviewers, mappedRecommendations, - canSeeReviewersReports, + canViewReports, reviewerRecommendation, recommendations = [], }) => ( <Fragment> - {canSeeReviewersReports && ( + {canViewReports && ( <Root id="reviews-and-reports"> <Expandable label="Reviewers & Reports" @@ -108,7 +108,7 @@ export default compose( isReviewer: currentUserIsReviewer(state, version.id), isAuthor: currentUserIsAuthor(state, version.id), recommendations: selectReviewRecommendations(state, version.id), - canSeeReviewersReports: canSeeReviewersReports(state, project.id), + canViewReports: canViewReports(state, project.id), }), { getCollectionReviewers }, ), @@ -134,15 +134,15 @@ export default compose( })), lifecycle({ componentDidMount() { - const { getReviewers, canSeeReviewersReports } = this.props - canSeeReviewersReports && getReviewers() + const { getReviewers, canViewReports } = this.props + canViewReports && getReviewers() }, componentWillReceiveProps(nextProps) { - const { match, canSeeReviewersReports, getReviewers } = this.props + const { match, canViewReports, getReviewers } = this.props const version = get(match, 'params.version') const nextVersion = get(nextProps, 'match.params.version') if (version !== nextVersion) { - canSeeReviewersReports && getReviewers() + canViewReports && getReviewers() } }, }), diff --git a/packages/component-manuscript/src/redux/recommendations.js b/packages/component-manuscript/src/redux/recommendations.js index 2f57b4f376b8397c225abeec02a51badd3522b6f..2d40db4a29ae1d53a7c05b870f97c3ca8a57eca2 100644 --- a/packages/component-manuscript/src/redux/recommendations.js +++ b/packages/component-manuscript/src/redux/recommendations.js @@ -18,8 +18,6 @@ export const selectReviewRecommendations = (state, fragmentId) => ), })) -export const recommendationsFetching = state => - get(state, 'recommendations', false) // #endregion // #region Actions diff --git a/packages/components-faraday/src/components/Dashboard/DashboardItems.js b/packages/components-faraday/src/components/Dashboard/DashboardItems.js index aad166bb291c64506465e89e1e1b306a578f427f..f40111b657f9d73f7da239ad2086c80daf5dd76d 100644 --- a/packages/components-faraday/src/components/Dashboard/DashboardItems.js +++ b/packages/components-faraday/src/components/Dashboard/DashboardItems.js @@ -7,26 +7,18 @@ import { th } from '@pubsweet/ui-toolkit' import { withRouter } from 'react-router-dom' import { compose, setDisplayName, withHandlers } from 'recompose' import { ManuscriptCard, Row } from 'pubsweet-component-faraday-ui' -import { canSeeReviewersReports } from 'pubsweet-component-faraday-selectors' +import { canViewReports } from 'pubsweet-component-faraday-selectors' import withVersion from './withVersion' const DashboardItem = compose( withVersion, connect((state, { collection }) => ({ - canSeeReviewersReports: canSeeReviewersReports( - state, - get(collection, 'id', ''), - ), + canViewReports: canViewReports(state, get(collection, 'id', '')), })), )(ManuscriptCard) -const DashboardItems = ({ - list, - onClick, - deleteProject, - canSeeReviewersReports, -}) => ( +const DashboardItems = ({ list, onClick, deleteProject, canViewReports }) => ( <Root> {!list.length ? ( <Row justify="center" mt={4}> diff --git a/packages/components-faraday/src/redux/recommendations.js b/packages/components-faraday/src/redux/recommendations.js index 6664e13581d87fa4d18f43431edf3a5062c76abe..ea1df6c5e97c81f983f539077f648629967cadb9 100644 --- a/packages/components-faraday/src/redux/recommendations.js +++ b/packages/components-faraday/src/redux/recommendations.js @@ -6,14 +6,23 @@ export const selectRecommendations = (state, fragmentId) => get(state, `fragments.${fragmentId}.recommendations`, []) export const selectEditorialRecommendations = (state, fragmentId) => - selectRecommendations(state, fragmentId).filter( - r => r.recommendationType === 'editorRecommendation' && r.comments, - ) - + selectRecommendations(state, fragmentId) + .filter(r => r.recommendationType === 'editorRecommendation' && r.comments) + .map(r => ({ + ...r, + reviewer: get(state, 'users.users', []).find( + user => user.id === r.userId, + ), + })) export const selectReviewRecommendations = (state, fragmentId) => - selectRecommendations(state, fragmentId).filter( - r => r.recommendationType === 'review', - ) + selectRecommendations(state, fragmentId) + .filter(r => r.recommendationType === 'review') + .map(r => ({ + ...r, + reviewer: get(state, 'users.users', []).find( + user => user.id === r.userId, + ), + })) // #endregion // #region Actions