diff --git a/src/components/PullRequestStatus.tsx b/src/components/PullRequestStatus.tsx index a8b1d8bd..16dfa70d 100644 --- a/src/components/PullRequestStatus.tsx +++ b/src/components/PullRequestStatus.tsx @@ -8,7 +8,7 @@ import { OutgoingState, PullRequestState, } from "../filtering/status"; -import { CheckStatus } from "../github-api/api"; +import { CheckStatus, ReviewDecision } from "../github-api/api"; const StateBox = styled.div` padding: 0 8px; @@ -48,12 +48,18 @@ const MERGEABLE = ( ); -const APPROVED_BY_EVERONE = ( +const APPROVED_BY_EVERYONE = ( Approved by everyone ); +const APPROVED = ( + + Approved + +); + const CHECK_STATUS_PASSED = ( Checks Pass @@ -131,9 +137,23 @@ function getCheckStatusBadge(checkStatus?: CheckStatus): JSX.Element[] { } } +function getReviewDecisionBadge(reviewDecision: ReviewDecision): JSX.Element[] { + switch (reviewDecision) { + case "APPROVED": + return [APPROVED]; + case "CHANGES_REQUESTED": + return [CHANGES_REQUESTED]; + case "REVIEW_REQUIRED": + return [WAITING_FOR_REVIEW]; + } + + return []; +} + function getIncomingStateBadges(state: IncomingState): JSX.Element[] { const badges: JSX.Element[] = []; badges.push(...getCheckStatusBadge(state.checkStatus)); + badges.push(...getReviewDecisionBadge(state.reviewDecision)); if (state.newReviewRequested) { badges.push(UNREVIEWED); @@ -146,6 +166,7 @@ function getIncomingStateBadges(state: IncomingState): JSX.Element[] { if (state.newCommit) { badges.push(NEW_COMMIT); } + return badges; } @@ -156,15 +177,23 @@ function getOutgoingStateBadges(state: OutgoingState): JSX.Element[] { if (state.mergeable) { badges.push(MERGEABLE); } - if (state.approvedByEveryone) { - badges.push(APPROVED_BY_EVERONE); - } else if (state.changesRequested) { - badges.push(CHANGES_REQUESTED); - } else { - badges.push(WAITING_FOR_REVIEW); - if (state.noReviewers) { - badges.push(NO_REVIEWER_ASSIGNED); - } + + switch (state.reviewDecision) { + case "APPROVED": + badges.push(APPROVED); + if (state.approvedByEveryone) { + badges.push(APPROVED_BY_EVERYONE); + } + break; + case "CHANGES_REQUESTED": + badges.push(CHANGES_REQUESTED); + break; + case "REVIEW_REQUIRED": + badges.push(WAITING_FOR_REVIEW); + if (state.noReviewers) { + badges.push(NO_REVIEWER_ASSIGNED); + } + break; } return badges; diff --git a/src/filtering/status.spec.ts b/src/filtering/status.spec.ts index 31843cae..40985631 100644 --- a/src/filtering/status.spec.ts +++ b/src/filtering/status.spec.ts @@ -19,6 +19,7 @@ describe("pullRequestState", () => { newCommit: false, authorResponded: false, directlyAdded: true, + reviewDecision: "REVIEW_REQUIRED", teams: [], }); @@ -42,6 +43,7 @@ describe("pullRequestState", () => { newCommit: false, authorResponded: false, directlyAdded: false, + reviewDecision: "REVIEW_REQUIRED", teams: ["team"], }); @@ -62,6 +64,7 @@ describe("pullRequestState", () => { newCommit: false, authorResponded: true, directlyAdded: false, + reviewDecision: "REVIEW_REQUIRED", teams: [], }); @@ -82,6 +85,7 @@ describe("pullRequestState", () => { newCommit: true, authorResponded: false, directlyAdded: false, + reviewDecision: "REVIEW_REQUIRED", teams: [], }); @@ -103,6 +107,7 @@ describe("pullRequestState", () => { newCommit: true, authorResponded: true, directlyAdded: false, + reviewDecision: "REVIEW_REQUIRED", teams: [], }); @@ -122,6 +127,7 @@ describe("pullRequestState", () => { newCommit: false, authorResponded: false, directlyAdded: false, + reviewDecision: "REVIEW_REQUIRED", teams: [], }); @@ -141,6 +147,7 @@ describe("pullRequestState", () => { newCommit: false, authorResponded: false, directlyAdded: false, + reviewDecision: "REVIEW_REQUIRED", teams: [], }); }); @@ -192,6 +199,7 @@ describe("pullRequestState", () => { changesRequested: false, mergeable: false, approvedByEveryone: false, + reviewDecision: "REVIEW_REQUIRED", }); expect( @@ -206,6 +214,7 @@ describe("pullRequestState", () => { changesRequested: false, mergeable: false, approvedByEveryone: false, + reviewDecision: "REVIEW_REQUIRED", }); expect( @@ -224,6 +233,7 @@ describe("pullRequestState", () => { changesRequested: false, mergeable: false, approvedByEveryone: false, + reviewDecision: "REVIEW_REQUIRED", }); expect( @@ -246,6 +256,7 @@ describe("pullRequestState", () => { changesRequested: false, mergeable: true, approvedByEveryone: false, + reviewDecision: "REVIEW_REQUIRED", }); expect( @@ -268,6 +279,7 @@ describe("pullRequestState", () => { changesRequested: false, mergeable: false, approvedByEveryone: true, + reviewDecision: "REVIEW_REQUIRED", }); expect( @@ -290,6 +302,7 @@ describe("pullRequestState", () => { changesRequested: false, mergeable: false, approvedByEveryone: false, + reviewDecision: "REVIEW_REQUIRED", }); expect( @@ -312,6 +325,7 @@ describe("pullRequestState", () => { changesRequested: false, mergeable: false, approvedByEveryone: false, + reviewDecision: "REVIEW_REQUIRED", }); }); }); diff --git a/src/filtering/status.ts b/src/filtering/status.ts index a3c22ed1..c3239271 100644 --- a/src/filtering/status.ts +++ b/src/filtering/status.ts @@ -1,4 +1,4 @@ -import { CheckStatus } from "../github-api/api"; +import { CheckStatus, ReviewDecision } from "../github-api/api"; import { PullRequest, ReviewState } from "../storage/loaded-state"; import { userPreviouslyReviewed } from "./reviewed"; import { @@ -48,6 +48,7 @@ function incomingPullRequestState( directlyAdded: (pr.requestedReviewers || []).includes(currentUserLogin), teams: pr.requestedTeams || [], checkStatus: pr.checkStatus, + reviewDecision: pr.reviewDecision, }; } @@ -113,6 +114,7 @@ function outgoingPullRequestState( mergeable: pr.mergeable === true, approvedByEveryone: states.has("APPROVED") && states.size === 1, checkStatus: pr.checkStatus, + reviewDecision: pr.reviewDecision, }; } @@ -162,6 +164,11 @@ export interface IncomingState { * Current check status of tests. */ checkStatus?: CheckStatus; + + /** + * Current review decision. + */ + reviewDecision: ReviewDecision; } /** @@ -213,6 +220,11 @@ export interface OutgoingState { * Current check status of tests. */ checkStatus?: CheckStatus; + + /** + * Current review decision. + */ + reviewDecision: ReviewDecision; } export function isReviewRequired(