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(