@vega/review-tool
Version:
130 lines (116 loc) • 3.65 kB
JavaScript
import React from 'react'
import {map, switchMap} from 'rxjs/operators'
import {combineLatest} from 'rxjs'
import TrashIcon from 'part:@lyra/base/trash-icon'
import Button from 'part:@lyra/components/buttons/default'
import lyraClient from 'part:@lyra/base/client'
import {observePaths} from 'part:@lyra/base/preview'
import {withPropsStream} from 'react-props-stream'
import EditReviewItem from '../EditReviewItem'
import styles from './styles/ManageReviewItem.css'
import InviteLinkForReviewer from './InviteLinkForReviewer'
import {currentUser$} from 'part:@vega/datastores/user'
const recommendationMapping = {
publish: 'Publish',
'publish-with-revisions': 'Publish with revisions',
reject: 'Reject'
}
function inferStatus(reviewItem) {
if (reviewItem.completedAt) {
return `Verdict: ${recommendationMapping[reviewItem.recommendation] ||
'unknown'}`
}
if (reviewItem.acceptState) {
return `In progress…` //capitalize(reviewItem.acceptState)
}
return 'Review pending…'
}
function loadProps(props$) {
const reviewer$ = props$.pipe(
switchMap(props =>
observePaths(props.reviewItem.reviewer, ['name', 'identity'])
)
)
return combineLatest(props$, reviewer$, currentUser$).pipe(
map(([props, reviewer, currentUser]) => ({
...props,
readOnly: reviewer._id !== currentUser._id,
reviewer,
currentUser
}))
)
}
type Props = {
reviewItem: any,
reviewer: any,
readOnly: boolean,
isCompleted: boolean
}
type State = {
isEditReviewerNameOpen: boolean
}
class ManageReviewItem extends React.PureComponent<Props, State> {
state = {
isExpanded: false
}
handleDelete = () => {
// eslint-disable-next-line no-alert
if (window.confirm('Delete this review?')) {
const {reviewItem} = this.props
lyraClient.delete(reviewItem._id)
}
}
handleToggleExpand = () => {
const {isExpanded} = this.state
this.setState({isExpanded: !isExpanded})
}
render() {
const {reviewItem, reviewer, readOnly, isCompleted} = this.props
const {isExpanded} = this.state
const status = inferStatus(reviewItem)
const hasAccepted = reviewer.identity
return (
<li className={styles.reviewItem}>
<div className={styles.header}>
<div className={styles.reviewerName}>Review by {reviewer.name}</div>
<div className={styles.statusCollection}>
<span className={hasAccepted ? styles.accepted : styles.pending}>
Invitation {hasAccepted ? 'accepted' : 'pending'}
</span>
<span
className={
reviewItem.completedAt ? styles.accepted : styles.pending
}
>
{status}
</span>
<Button
kind="simple"
color="danger"
title="Delete"
icon={TrashIcon}
onClick={this.handleDelete}
/>
</div>
</div>
{!isCompleted && <InviteLinkForReviewer reviewer={reviewer} />}
{!readOnly && <TrashIcon onClick={this.handleDelete} />}
<div className={styles.collapse} onClick={this.handleToggleExpand}>
<div className={styles.collapsedPointer}>
{isExpanded ? '▼' : '►'}
</div>
<div>View</div>
</div>
{isExpanded && (
<EditReviewItem
reviewItem={reviewItem}
readOnly={readOnly}
reviewer={reviewer}
isCompleted={isCompleted}
/>
)}
</li>
)
}
}
export default withPropsStream(loadProps, ManageReviewItem)