Skip to content

Commit 6cf5fa7

Browse files
committed
Fix a problem where too many reviewers were showing for a submitter and the Reopen Review button not working
1 parent d2891bf commit 6cf5fa7

File tree

2 files changed

+81
-64
lines changed

2 files changed

+81
-64
lines changed

src/apps/review/src/lib/components/TableReviewAppeals/TableReviewAppeals.tsx

Lines changed: 6 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import { useRole, useRoleProps, useSubmissionDownloadAccess } from '../../hooks'
2929
import type { UseSubmissionDownloadAccessResult } from '../../hooks/useSubmissionDownloadAccess'
3030
import {
3131
ChallengeDetailContextModel,
32-
ChallengeInfo,
3332
MappingReviewAppeal,
3433
ReviewAppContextModel,
3534
SubmissionInfo,
@@ -92,18 +91,14 @@ function createReopenActionButtons(
9291
aggregatedReviews: AggregatedReviewDetail[] | undefined,
9392
{
9493
canManageCompletedReviews,
95-
getLatestChallengeInfo,
9694
isReopening,
9795
openReopenDialog,
9896
pendingReopen,
99-
setIsReviewPhaseClosedModalOpen,
10097
}: {
10198
canManageCompletedReviews: boolean
102-
getLatestChallengeInfo: () => Promise<ChallengeInfo | undefined>
10399
isReopening: boolean
104100
openReopenDialog: (submission: SubmissionRow, review: AggregatedReviewDetail) => void
105101
pendingReopen: { review?: AggregatedReviewDetail } | undefined
106-
setIsReviewPhaseClosedModalOpen: (isOpen: boolean) => void
107102
},
108103
): JSX.Element[] {
109104
if (!canManageCompletedReviews) {
@@ -126,14 +121,7 @@ function createReopenActionButtons(
126121

127122
const isTargetReview = pendingReopen?.review?.reviewInfo?.id === reviewInfo.id
128123

129-
async function handleReopenClick(): Promise<void> {
130-
const latestChallengeInfo = await getLatestChallengeInfo()
131-
132-
if (!isReviewPhase(latestChallengeInfo)) {
133-
setIsReviewPhaseClosedModalOpen(true)
134-
return
135-
}
136-
124+
function handleReopenClick(): void {
137125
openReopenDialog(submission, {
138126
...rv,
139127
reviewInfo,
@@ -426,11 +414,6 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
426414
submission?: SubmissionRow
427415
isOwnReview?: boolean
428416
} | undefined>(undefined)
429-
const [
430-
isReviewPhaseClosedModalOpen,
431-
setIsReviewPhaseClosedModalOpen,
432-
] = useState(false)
433-
434417
const myResourceIds = useMemo(
435418
() => new Set(myResources.map(resource => resource.id)),
436419
[myResources],
@@ -459,25 +442,6 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
459442
],
460443
)
461444

462-
const getLatestChallengeInfo = useCallback(async (): Promise<ChallengeInfo | undefined> => {
463-
const challengeId = challengeInfo?.id
464-
465-
if (!challengeId) {
466-
return challengeInfo
467-
}
468-
469-
try {
470-
const updatedChallengeInfo = await mutate(
471-
`challengeBaseUrl/challenges/${challengeId}`,
472-
) as ChallengeInfo | undefined
473-
474-
return updatedChallengeInfo ?? challengeInfo
475-
} catch (error) {
476-
handleError(error)
477-
return challengeInfo
478-
}
479-
}, [challengeInfo])
480-
481445
const openReopenDialog = useCallback((submission: SubmissionRow, review: AggregatedReviewDetail) => {
482446
const resourceId = review.reviewInfo?.resourceId
483447
?? review.resourceId
@@ -494,11 +458,6 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
494458
setPendingReopen(undefined)
495459
}, [])
496460

497-
const closeReviewPhaseClosedModal = useCallback(() => {
498-
setIsReviewPhaseClosedModalOpen(false)
499-
window.location.reload()
500-
}, [])
501-
502461
const handleConfirmReopen = useCallback(async () => {
503462
const reviewId = pendingReopen?.review?.reviewInfo?.id
504463

@@ -510,7 +469,7 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
510469
setIsReopening(true)
511470

512471
try {
513-
await updateReview(reviewId, { status: 'IN_PROGRESS' })
472+
await updateReview(reviewId, { committed: false, status: 'PENDING' })
514473
toast.success('Scorecard reopened.')
515474
closeReopenDialog()
516475

@@ -700,8 +659,10 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
700659
label: 'Review Score',
701660
renderer: (data: SubmissionRow) => {
702661
const scoreDisplay = data.aggregated?.averageFinalScoreDisplay
703-
const isReviewInProgress = data.review?.status === 'IN_PROGRESS'
704-
if (!scoreDisplay || isReviewInProgress) {
662+
const reviewStatus = (data.review?.status ?? '').toUpperCase()
663+
const isReviewPending = ['IN_PROGRESS', 'PENDING'].includes(reviewStatus)
664+
665+
if (!scoreDisplay || isReviewPending) {
705666
return (
706667
<span className={styles.statusBadgePending}>
707668
Pending Review
@@ -985,11 +946,9 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
985946
data.aggregated?.reviews,
986947
{
987948
canManageCompletedReviews,
988-
getLatestChallengeInfo,
989949
isReopening,
990950
openReopenDialog,
991951
pendingReopen,
992-
setIsReviewPhaseClosedModalOpen,
993952
},
994953
)
995954

@@ -1511,8 +1470,6 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
15111470
historyByMember,
15121471
shouldShowHistoryActions,
15131472
myResources,
1514-
getLatestChallengeInfo,
1515-
setIsReviewPhaseClosedModalOpen,
15161473
])
15171474

15181475
/* eslint-enable indent, padding-line-between-statements */
@@ -1623,16 +1580,6 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
16231580
: REOPEN_MESSAGE_OTHER}
16241581
</div>
16251582
</ConfirmModal>
1626-
<ConfirmModal
1627-
title='Review Phase Closed'
1628-
open={isReviewPhaseClosedModalOpen}
1629-
onClose={closeReviewPhaseClosedModal}
1630-
onConfirm={closeReviewPhaseClosedModal}
1631-
withoutCancel
1632-
action='OK'
1633-
>
1634-
<div>Review is no longer open for this challenge</div>
1635-
</ConfirmModal>
16361583
</TableWrapper>
16371584
)
16381585
}

src/apps/review/src/lib/hooks/useFetchScreeningReview.ts

Lines changed: 75 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,15 @@ function getNormalizedLowerCase(value?: string | null): string | undefined {
604604
return trimmedValue ? trimmedValue.toLowerCase() : undefined
605605
}
606606

607+
function isPhaseAllowedForReview(phaseName?: string | null): boolean {
608+
const normalized = getNormalizedLowerCase(phaseName)
609+
if (!normalized) {
610+
return true
611+
}
612+
613+
return normalized === 'review'
614+
}
615+
607616
function buildMetadataCriteria(detail: MetadataPhaseMatchDetail): string[] {
608617
if (!detail) {
609618
return []
@@ -852,6 +861,7 @@ export function useFetchScreeningReview(): useFetchScreeningReviewProps {
852861

853862
const {
854863
loginUserInfo,
864+
resourceRoleReviewer,
855865
}: ReviewAppContextModel = useContext(ReviewAppContext)
856866

857867
// get challenge info from challenge detail context
@@ -965,10 +975,19 @@ export function useFetchScreeningReview(): useFetchScreeningReviewProps {
965975
?.trim()
966976
.toLowerCase()
967977

978+
const reviewerRoleId = resourceRoleReviewer?.id
979+
968980
if (challengeReviewers && challengeReviewers.length) {
969981
const reviewerRoleResources = filter(
970982
challengeReviewers,
971-
reviewer => normalizeRoleName(reviewer.roleName) === 'reviewer',
983+
reviewer => {
984+
const normalizedRoleName = normalizeRoleName(reviewer.roleName)
985+
const matchesRoleName = normalizedRoleName === 'reviewer'
986+
const matchesRoleId = !normalizedRoleName && reviewerRoleId
987+
? reviewer.roleId === reviewerRoleId
988+
: false
989+
return matchesRoleName || matchesRoleId
990+
},
972991
)
973992

974993
results = (
@@ -984,13 +1003,24 @@ export function useFetchScreeningReview(): useFetchScreeningReviewProps {
9841003
if (!results.length) {
9851004
const reviewerResourceIds = new Set(
9861005
(resources ?? [])
987-
.filter(resource => normalizeRoleName(resource.roleName) === 'reviewer')
1006+
.filter(resource => {
1007+
const normalizedRoleName = normalizeRoleName(resource.roleName)
1008+
const matchesRoleName = normalizedRoleName === 'reviewer'
1009+
const matchesRoleId = !normalizedRoleName && reviewerRoleId
1010+
? resource.roleId === reviewerRoleId
1011+
: false
1012+
return matchesRoleName || matchesRoleId
1013+
})
9881014
.map(resource => resource.id)
9891015
.filter((id): id is string => Boolean(id)),
9901016
)
9911017

9921018
forEach(visibleChallengeSubmissions, challengeSubmission => {
9931019
forEach(challengeSubmission.review, review => {
1020+
if (!isPhaseAllowedForReview(review.phaseName)) {
1021+
return
1022+
}
1023+
9941024
const resourceId = review.resourceId
9951025
if (!resourceId) {
9961026
return
@@ -1015,6 +1045,7 @@ export function useFetchScreeningReview(): useFetchScreeningReviewProps {
10151045
actionChallengeRole,
10161046
loginUserInfo,
10171047
resources,
1048+
resourceRoleReviewer,
10181049
])
10191050

10201051
// fetch appeal response
@@ -1039,7 +1070,8 @@ export function useFetchScreeningReview(): useFetchScreeningReviewProps {
10391070
`reviewBaseUrl/reviews/${challengeId}/${reviewerKey}`,
10401071
{
10411072
fetcher: () => fetchChallengeReviews(challengeId ?? ''),
1042-
isPaused: () => !challengeId || !reviewerIds.length,
1073+
isPaused: () => !challengeId
1074+
|| (!reviewerIds.length && actionChallengeRole !== SUBMITTER),
10431075
},
10441076
)
10451077

@@ -1819,13 +1851,46 @@ export function useFetchScreeningReview(): useFetchScreeningReviewProps {
18191851
return challengeReviews ?? []
18201852
}
18211853

1854+
const allowedReviewerIds = reviewerIds.length ? new Set(reviewerIds) : undefined
1855+
18221856
if (challengeReviews && challengeReviews.length) {
1823-
return challengeReviews
1857+
const filteredReviews = (challengeReviews ?? []).filter(review => {
1858+
if (!review) {
1859+
return false
1860+
}
1861+
1862+
if (!isPhaseAllowedForReview(review.phaseName)) {
1863+
return false
1864+
}
1865+
1866+
if (allowedReviewerIds?.size) {
1867+
return Boolean(
1868+
review.resourceId && allowedReviewerIds.has(review.resourceId),
1869+
)
1870+
}
1871+
1872+
return true
1873+
})
1874+
1875+
if (filteredReviews.length) {
1876+
return filteredReviews
1877+
}
18241878
}
18251879

18261880
const fallbackReviews: BackendReview[] = []
18271881
forEach(visibleChallengeSubmissions, submission => {
18281882
forEach(submission.review, reviewItem => {
1883+
if (!isPhaseAllowedForReview(reviewItem?.phaseName)) {
1884+
return
1885+
}
1886+
1887+
const resourceId = reviewItem?.resourceId
1888+
if (allowedReviewerIds?.size) {
1889+
if (!resourceId || !allowedReviewerIds.has(resourceId)) {
1890+
return
1891+
}
1892+
}
1893+
18291894
if (reviewItem?.id) {
18301895
fallbackReviews.push({
18311896
...reviewItem,
@@ -1840,11 +1905,16 @@ export function useFetchScreeningReview(): useFetchScreeningReviewProps {
18401905
return fallbackReviews
18411906
}
18421907

1843-
return challengeReviews ?? []
1908+
const filteredByPhase = (challengeReviews ?? []).filter(review => (
1909+
review ? isPhaseAllowedForReview(review.phaseName) : false
1910+
))
1911+
1912+
return filteredByPhase
18441913
}, [
18451914
actionChallengeRole,
18461915
challengeReviews,
18471916
visibleChallengeSubmissions,
1917+
reviewerIds,
18481918
])
18491919

18501920
// get review data from challenge submissions

0 commit comments

Comments
 (0)