diff --git a/keymaps/git.cson b/keymaps/git.cson index 661df96f14..2cfc2172a4 100644 --- a/keymaps/git.cson +++ b/keymaps/git.cson @@ -144,9 +144,9 @@ 'ctrl-=': 'github:more-context' 'ctrl--': 'github:less-context' -'.platform-darwin .github-Review-reply atom-text-editor': +'.platform-darwin .github-Reviews atom-text-editor': 'cmd-enter': 'github:submit-comment' -'.platform-win32 .github-Review-reply atom-text-editor': +'.platform-win32 .github-Reviews atom-text-editor': 'ctrl-enter': 'github:submit-comment' -'.platform-linux .github-Review-reply atom-text-editor': +'.platform-linux .github-Reviews atom-text-editor': 'ctrl-enter': 'github:submit-comment' diff --git a/lib/containers/__generated__/aggregatedReviewsContainerRefetchQuery.graphql.js b/lib/containers/__generated__/aggregatedReviewsContainerRefetchQuery.graphql.js index ed22ebd6b6..d263535af8 100644 --- a/lib/containers/__generated__/aggregatedReviewsContainerRefetchQuery.graphql.js +++ b/lib/containers/__generated__/aggregatedReviewsContainerRefetchQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash c78b6c8ea15f58b1de06a29e203fd1ad + * @relayHash 8ba50287839e4a5fa5c1e882deaa661a */ /* eslint-disable */ @@ -83,6 +83,7 @@ fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { cursor node { id + body bodyHTML state submittedAt @@ -97,6 +98,7 @@ fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { id } } + viewerCanUpdate authorAssociation ...emojiReactionsController_reactable __typename @@ -151,9 +153,11 @@ fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThrea } } bodyHTML + body isMinimized state viewerCanReact + viewerCanUpdate path position createdAt @@ -315,39 +319,53 @@ v8 = { v9 = { "kind": "ScalarField", "alias": null, - "name": "state", + "name": "bodyHTML", "args": null, "storageKey": null }, v10 = { "kind": "ScalarField", "alias": null, - "name": "lastEditedAt", + "name": "state", "args": null, "storageKey": null }, v11 = { "kind": "ScalarField", "alias": null, - "name": "bodyHTML", + "name": "lastEditedAt", "args": null, "storageKey": null }, v12 = { "kind": "ScalarField", "alias": null, - "name": "avatarUrl", + "name": "body", "args": null, "storageKey": null }, v13 = { "kind": "ScalarField", "alias": null, - "name": "authorAssociation", + "name": "avatarUrl", "args": null, "storageKey": null }, v14 = { + "kind": "ScalarField", + "alias": null, + "name": "viewerCanUpdate", + "args": null, + "storageKey": null +}, +v15 = { + "kind": "ScalarField", + "alias": null, + "name": "authorAssociation", + "args": null, + "storageKey": null +}, +v16 = { "kind": "LinkedField", "alias": null, "name": "reactionGroups", @@ -390,14 +408,14 @@ v14 = { } ] }, -v15 = { +v17 = { "kind": "ScalarField", "alias": null, "name": "viewerCanReact", "args": null, "storageKey": null }, -v16 = [ +v18 = [ { "kind": "Variable", "name": "after", @@ -411,7 +429,7 @@ v16 = [ "type": "Int" } ], -v17 = [ +v19 = [ { "kind": "Variable", "name": "after", @@ -602,6 +620,7 @@ return { (v4/*: any*/), (v3/*: any*/), (v9/*: any*/), + (v10/*: any*/), { "kind": "ScalarField", "alias": null, @@ -609,8 +628,8 @@ return { "args": null, "storageKey": null }, - (v10/*: any*/), (v11/*: any*/), + (v12/*: any*/), { "kind": "LinkedField", "alias": null, @@ -622,14 +641,15 @@ return { "selections": [ (v2/*: any*/), (v5/*: any*/), - (v12/*: any*/), + (v13/*: any*/), (v4/*: any*/), (v3/*: any*/) ] }, - (v13/*: any*/), (v14/*: any*/), (v15/*: any*/), + (v16/*: any*/), + (v17/*: any*/), (v2/*: any*/) ] } @@ -651,7 +671,7 @@ return { "alias": null, "name": "reviewThreads", "storageKey": null, - "args": (v16/*: any*/), + "args": (v18/*: any*/), "concreteType": "PullRequestReviewThreadConnection", "plural": false, "selections": [ @@ -715,7 +735,7 @@ return { "alias": null, "name": "comments", "storageKey": null, - "args": (v17/*: any*/), + "args": (v19/*: any*/), "concreteType": "PullRequestReviewCommentConnection", "plural": false, "selections": [ @@ -742,28 +762,23 @@ return { { "kind": "ScalarField", "alias": null, - "name": "position", + "name": "path", "args": null, "storageKey": null }, (v3/*: any*/), - (v11/*: any*/), - { - "kind": "ScalarField", - "alias": null, - "name": "isMinimized", - "args": null, - "storageKey": null - }, (v9/*: any*/), - (v15/*: any*/), + (v12/*: any*/), { "kind": "ScalarField", "alias": null, - "name": "path", + "name": "isMinimized", "args": null, "storageKey": null }, + (v10/*: any*/), + (v17/*: any*/), + (v14/*: any*/), { "kind": "LinkedField", "alias": null, @@ -774,12 +789,19 @@ return { "plural": false, "selections": [ (v2/*: any*/), - (v12/*: any*/), + (v13/*: any*/), (v5/*: any*/), (v4/*: any*/), (v3/*: any*/) ] }, + { + "kind": "ScalarField", + "alias": null, + "name": "position", + "args": null, + "storageKey": null + }, { "kind": "ScalarField", "alias": null, @@ -787,10 +809,10 @@ return { "args": null, "storageKey": null }, - (v10/*: any*/), + (v11/*: any*/), (v4/*: any*/), - (v13/*: any*/), - (v14/*: any*/), + (v15/*: any*/), + (v16/*: any*/), (v2/*: any*/) ] } @@ -802,7 +824,7 @@ return { "kind": "LinkedHandle", "alias": null, "name": "comments", - "args": (v17/*: any*/), + "args": (v19/*: any*/), "handle": "connection", "key": "ReviewCommentsAccumulator_comments", "filters": null @@ -818,7 +840,7 @@ return { "kind": "LinkedHandle", "alias": null, "name": "reviewThreads", - "args": (v16/*: any*/), + "args": (v18/*: any*/), "handle": "connection", "key": "ReviewThreadsAccumulator_reviewThreads", "filters": null @@ -833,7 +855,7 @@ return { "operationKind": "query", "name": "aggregatedReviewsContainerRefetchQuery", "id": null, - "text": "query aggregatedReviewsContainerRefetchQuery(\n $prId: ID!\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n) {\n pullRequest: node(id: $prId) {\n __typename\n ...prCheckoutController_pullRequest\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n id\n }\n}\n\nfragment prCheckoutController_pullRequest on PullRequest {\n number\n headRefName\n headRepository {\n name\n url\n sshUrl\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n isMinimized\n state\n viewerCanReact\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", + "text": "query aggregatedReviewsContainerRefetchQuery(\n $prId: ID!\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n) {\n pullRequest: node(id: $prId) {\n __typename\n ...prCheckoutController_pullRequest\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n id\n }\n}\n\nfragment prCheckoutController_pullRequest on PullRequest {\n number\n headRefName\n headRepository {\n name\n url\n sshUrl\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", "metadata": {} } }; diff --git a/lib/containers/__generated__/commentDecorationsContainerQuery.graphql.js b/lib/containers/__generated__/commentDecorationsContainerQuery.graphql.js index 6a2394c3d5..005dfe1cbd 100644 --- a/lib/containers/__generated__/commentDecorationsContainerQuery.graphql.js +++ b/lib/containers/__generated__/commentDecorationsContainerQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 02603333f5d8b5bed9e192b81fe49e1d + * @relayHash dd01fba0da8ae082c8dda29a05109406 */ /* eslint-disable */ @@ -116,6 +116,7 @@ fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { cursor node { id + body bodyHTML state submittedAt @@ -130,6 +131,7 @@ fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { id } } + viewerCanUpdate authorAssociation ...emojiReactionsController_reactable __typename @@ -184,9 +186,11 @@ fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThrea } } bodyHTML + body isMinimized state viewerCanReact + viewerCanUpdate path position createdAt @@ -441,39 +445,53 @@ v14 = { v15 = { "kind": "ScalarField", "alias": null, - "name": "state", + "name": "bodyHTML", "args": null, "storageKey": null }, v16 = { "kind": "ScalarField", "alias": null, - "name": "lastEditedAt", + "name": "state", "args": null, "storageKey": null }, v17 = { "kind": "ScalarField", "alias": null, - "name": "bodyHTML", + "name": "lastEditedAt", "args": null, "storageKey": null }, v18 = { "kind": "ScalarField", "alias": null, - "name": "avatarUrl", + "name": "body", "args": null, "storageKey": null }, v19 = { "kind": "ScalarField", "alias": null, - "name": "authorAssociation", + "name": "avatarUrl", "args": null, "storageKey": null }, v20 = { + "kind": "ScalarField", + "alias": null, + "name": "viewerCanUpdate", + "args": null, + "storageKey": null +}, +v21 = { + "kind": "ScalarField", + "alias": null, + "name": "authorAssociation", + "args": null, + "storageKey": null +}, +v22 = { "kind": "LinkedField", "alias": null, "name": "reactionGroups", @@ -510,14 +528,14 @@ v20 = { } ] }, -v21 = { +v23 = { "kind": "ScalarField", "alias": null, "name": "viewerCanReact", "args": null, "storageKey": null }, -v22 = [ +v24 = [ { "kind": "Variable", "name": "after", @@ -531,7 +549,7 @@ v22 = [ "type": "Int" } ], -v23 = [ +v25 = [ { "kind": "Variable", "name": "after", @@ -755,6 +773,7 @@ return { (v11/*: any*/), (v9/*: any*/), (v15/*: any*/), + (v16/*: any*/), { "kind": "ScalarField", "alias": null, @@ -762,8 +781,8 @@ return { "args": null, "storageKey": null }, - (v16/*: any*/), (v17/*: any*/), + (v18/*: any*/), { "kind": "LinkedField", "alias": null, @@ -775,14 +794,15 @@ return { "selections": [ (v7/*: any*/), (v8/*: any*/), - (v18/*: any*/), + (v19/*: any*/), (v11/*: any*/), (v9/*: any*/) ] }, - (v19/*: any*/), (v20/*: any*/), (v21/*: any*/), + (v22/*: any*/), + (v23/*: any*/), (v7/*: any*/) ] } @@ -804,7 +824,7 @@ return { "alias": null, "name": "reviewThreads", "storageKey": null, - "args": (v22/*: any*/), + "args": (v24/*: any*/), "concreteType": "PullRequestReviewThreadConnection", "plural": false, "selections": [ @@ -868,7 +888,7 @@ return { "alias": null, "name": "comments", "storageKey": null, - "args": (v23/*: any*/), + "args": (v25/*: any*/), "concreteType": "PullRequestReviewCommentConnection", "plural": false, "selections": [ @@ -895,28 +915,23 @@ return { { "kind": "ScalarField", "alias": null, - "name": "position", + "name": "path", "args": null, "storageKey": null }, (v9/*: any*/), - (v17/*: any*/), - { - "kind": "ScalarField", - "alias": null, - "name": "isMinimized", - "args": null, - "storageKey": null - }, (v15/*: any*/), - (v21/*: any*/), + (v18/*: any*/), { "kind": "ScalarField", "alias": null, - "name": "path", + "name": "isMinimized", "args": null, "storageKey": null }, + (v16/*: any*/), + (v23/*: any*/), + (v20/*: any*/), { "kind": "LinkedField", "alias": null, @@ -927,12 +942,19 @@ return { "plural": false, "selections": [ (v7/*: any*/), - (v18/*: any*/), + (v19/*: any*/), (v8/*: any*/), (v11/*: any*/), (v9/*: any*/) ] }, + { + "kind": "ScalarField", + "alias": null, + "name": "position", + "args": null, + "storageKey": null + }, { "kind": "ScalarField", "alias": null, @@ -940,10 +962,10 @@ return { "args": null, "storageKey": null }, - (v16/*: any*/), + (v17/*: any*/), (v11/*: any*/), - (v19/*: any*/), - (v20/*: any*/), + (v21/*: any*/), + (v22/*: any*/), (v7/*: any*/) ] } @@ -955,7 +977,7 @@ return { "kind": "LinkedHandle", "alias": null, "name": "comments", - "args": (v23/*: any*/), + "args": (v25/*: any*/), "handle": "connection", "key": "ReviewCommentsAccumulator_comments", "filters": null @@ -971,7 +993,7 @@ return { "kind": "LinkedHandle", "alias": null, "name": "reviewThreads", - "args": (v22/*: any*/), + "args": (v24/*: any*/), "handle": "connection", "key": "ReviewThreadsAccumulator_reviewThreads", "filters": null @@ -992,7 +1014,7 @@ return { "operationKind": "query", "name": "commentDecorationsContainerQuery", "id": null, - "text": "query commentDecorationsContainerQuery(\n $headOwner: String!\n $headName: String!\n $headRef: String!\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n $first: Int!\n) {\n repository(owner: $headOwner, name: $headName) {\n ref(qualifiedName: $headRef) {\n associatedPullRequests(first: $first, states: [OPEN]) {\n totalCount\n nodes {\n number\n headRefOid\n ...commentDecorationsController_pullRequests\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n id\n }\n }\n id\n }\n id\n }\n}\n\nfragment commentDecorationsController_pullRequests on PullRequest {\n number\n headRefName\n headRefOid\n headRepository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n isMinimized\n state\n viewerCanReact\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", + "text": "query commentDecorationsContainerQuery(\n $headOwner: String!\n $headName: String!\n $headRef: String!\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n $first: Int!\n) {\n repository(owner: $headOwner, name: $headName) {\n ref(qualifiedName: $headRef) {\n associatedPullRequests(first: $first, states: [OPEN]) {\n totalCount\n nodes {\n number\n headRefOid\n ...commentDecorationsController_pullRequests\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n id\n }\n }\n id\n }\n id\n }\n}\n\nfragment commentDecorationsController_pullRequests on PullRequest {\n number\n headRefName\n headRefOid\n headRepository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", "metadata": {} } }; diff --git a/lib/containers/__generated__/issueishDetailContainerQuery.graphql.js b/lib/containers/__generated__/issueishDetailContainerQuery.graphql.js index b9a7e78432..bb02a1008f 100644 --- a/lib/containers/__generated__/issueishDetailContainerQuery.graphql.js +++ b/lib/containers/__generated__/issueishDetailContainerQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash eb1ea33ff74de88d12e58a6460d0c6e1 + * @relayHash 34f8b51405d59e5439667b9079f86537 */ /* eslint-disable */ @@ -628,6 +628,7 @@ fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { cursor node { id + body bodyHTML state submittedAt @@ -642,6 +643,7 @@ fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { id } } + viewerCanUpdate authorAssociation ...emojiReactionsController_reactable __typename @@ -696,9 +698,11 @@ fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThrea } } bodyHTML + body isMinimized state viewerCanReact + viewerCanUpdate path position createdAt @@ -912,39 +916,46 @@ v10 = { v11 = { "kind": "ScalarField", "alias": null, - "name": "state", + "name": "bodyHTML", "args": null, "storageKey": null }, v12 = { "kind": "ScalarField", "alias": null, - "name": "lastEditedAt", + "name": "state", "args": null, "storageKey": null }, v13 = { "kind": "ScalarField", "alias": null, - "name": "bodyHTML", + "name": "lastEditedAt", "args": null, "storageKey": null }, v14 = { "kind": "ScalarField", "alias": null, - "name": "login", + "name": "body", "args": null, "storageKey": null }, v15 = { "kind": "ScalarField", "alias": null, - "name": "avatarUrl", + "name": "login", "args": null, "storageKey": null }, v16 = { + "kind": "ScalarField", + "alias": null, + "name": "avatarUrl", + "args": null, + "storageKey": null +}, +v17 = { "kind": "LinkedField", "alias": null, "name": "author", @@ -954,20 +965,27 @@ v16 = { "plural": false, "selections": [ (v3/*: any*/), - (v14/*: any*/), (v15/*: any*/), + (v16/*: any*/), (v5/*: any*/), (v4/*: any*/) ] }, -v17 = { +v18 = { + "kind": "ScalarField", + "alias": null, + "name": "viewerCanUpdate", + "args": null, + "storageKey": null +}, +v19 = { "kind": "ScalarField", "alias": null, "name": "authorAssociation", "args": null, "storageKey": null }, -v18 = [ +v20 = [ { "kind": "ScalarField", "alias": null, @@ -976,7 +994,7 @@ v18 = [ "storageKey": null } ], -v19 = { +v21 = { "kind": "LinkedField", "alias": null, "name": "reactionGroups", @@ -1007,18 +1025,18 @@ v19 = { "args": null, "concreteType": "ReactingUserConnection", "plural": false, - "selections": (v18/*: any*/) + "selections": (v20/*: any*/) } ] }, -v20 = { +v22 = { "kind": "ScalarField", "alias": null, "name": "viewerCanReact", "args": null, "storageKey": null }, -v21 = [ +v23 = [ { "kind": "Variable", "name": "after", @@ -1032,11 +1050,11 @@ v21 = [ "type": "Int" } ], -v22 = [ - (v14/*: any*/), +v24 = [ + (v15/*: any*/), (v4/*: any*/) ], -v23 = [ +v25 = [ { "kind": "Variable", "name": "after", @@ -1050,40 +1068,40 @@ v23 = [ "type": "Int" } ], -v24 = { +v26 = { "kind": "ScalarField", "alias": null, - "name": "position", + "name": "path", "args": null, "storageKey": null }, -v25 = { +v27 = { "kind": "ScalarField", "alias": null, - "name": "path", + "name": "position", "args": null, "storageKey": null }, -v26 = { +v28 = { "kind": "ScalarField", "alias": null, "name": "createdAt", "args": null, "storageKey": null }, -v27 = { +v29 = { "kind": "ScalarField", "alias": null, "name": "name", "args": null, "storageKey": null }, -v28 = [ +v30 = [ (v3/*: any*/), - (v14/*: any*/), + (v15/*: any*/), (v4/*: any*/) ], -v29 = { +v31 = { "kind": "LinkedField", "alias": null, "name": "owner", @@ -1091,23 +1109,23 @@ v29 = { "args": null, "concreteType": null, "plural": false, - "selections": (v28/*: any*/) + "selections": (v30/*: any*/) }, -v30 = { +v32 = { "kind": "ScalarField", "alias": null, "name": "title", "args": null, "storageKey": null }, -v31 = { +v33 = { "kind": "ScalarField", "alias": null, "name": "number", "args": null, "storageKey": null }, -v32 = [ +v34 = [ { "kind": "Variable", "name": "after", @@ -1121,7 +1139,7 @@ v32 = [ "type": "Int" } ], -v33 = { +v35 = { "kind": "LinkedField", "alias": null, "name": "pageInfo", @@ -1134,20 +1152,20 @@ v33 = { (v7/*: any*/) ] }, -v34 = { +v36 = { "kind": "ScalarField", "alias": null, "name": "isCrossRepository", "args": null, "storageKey": null }, -v35 = [ +v37 = [ (v3/*: any*/), - (v14/*: any*/), (v15/*: any*/), + (v16/*: any*/), (v4/*: any*/) ], -v36 = { +v38 = { "kind": "InlineFragment", "type": "CrossReferencedEvent", "selections": [ @@ -1158,7 +1176,7 @@ v36 = { "args": null, "storageKey": null }, - (v34/*: any*/), + (v36/*: any*/), { "kind": "LinkedField", "alias": null, @@ -1167,7 +1185,7 @@ v36 = { "args": null, "concreteType": null, "plural": false, - "selections": (v35/*: any*/) + "selections": (v37/*: any*/) }, { "kind": "LinkedField", @@ -1188,8 +1206,8 @@ v36 = { "concreteType": "Repository", "plural": false, "selections": [ - (v27/*: any*/), (v29/*: any*/), + (v31/*: any*/), (v4/*: any*/), { "kind": "ScalarField", @@ -1205,8 +1223,8 @@ v36 = { "kind": "InlineFragment", "type": "PullRequest", "selections": [ - (v31/*: any*/), - (v30/*: any*/), + (v33/*: any*/), + (v32/*: any*/), (v5/*: any*/), { "kind": "ScalarField", @@ -1221,8 +1239,8 @@ v36 = { "kind": "InlineFragment", "type": "Issue", "selections": [ - (v31/*: any*/), - (v30/*: any*/), + (v33/*: any*/), + (v32/*: any*/), (v5/*: any*/), { "kind": "ScalarField", @@ -1237,13 +1255,13 @@ v36 = { } ] }, -v37 = [ +v39 = [ (v3/*: any*/), + (v16/*: any*/), (v15/*: any*/), - (v14/*: any*/), (v4/*: any*/) ], -v38 = { +v40 = { "kind": "InlineFragment", "type": "IssueComment", "selections": [ @@ -1255,14 +1273,14 @@ v38 = { "args": null, "concreteType": null, "plural": false, - "selections": (v37/*: any*/) + "selections": (v39/*: any*/) }, - (v13/*: any*/), - (v26/*: any*/), + (v11/*: any*/), + (v28/*: any*/), (v5/*: any*/) ] }, -v39 = { +v41 = { "kind": "LinkedField", "alias": null, "name": "user", @@ -1270,16 +1288,16 @@ v39 = { "args": null, "concreteType": "User", "plural": false, - "selections": (v22/*: any*/) + "selections": (v24/*: any*/) }, -v40 = { +v42 = { "kind": "ScalarField", "alias": "sha", "name": "oid", "args": null, "storageKey": null }, -v41 = { +v43 = { "kind": "InlineFragment", "type": "Commit", "selections": [ @@ -1292,9 +1310,9 @@ v41 = { "concreteType": "GitActor", "plural": false, "selections": [ - (v27/*: any*/), - (v39/*: any*/), - (v15/*: any*/) + (v29/*: any*/), + (v41/*: any*/), + (v16/*: any*/) ] }, { @@ -1306,9 +1324,9 @@ v41 = { "concreteType": "GitActor", "plural": false, "selections": [ - (v27/*: any*/), - (v15/*: any*/), - (v39/*: any*/) + (v29/*: any*/), + (v16/*: any*/), + (v41/*: any*/) ] }, { @@ -1318,7 +1336,7 @@ v41 = { "args": null, "storageKey": null }, - (v40/*: any*/), + (v42/*: any*/), { "kind": "ScalarField", "alias": null, @@ -1342,7 +1360,7 @@ v41 = { } ] }, -v42 = [ +v44 = [ { "kind": "Variable", "name": "after", @@ -1356,7 +1374,7 @@ v42 = [ "type": "Int" } ], -v43 = [ +v45 = [ { "kind": "Variable", "name": "after", @@ -1370,21 +1388,21 @@ v43 = [ "type": "Int" } ], -v44 = { +v46 = { "kind": "ScalarField", "alias": null, "name": "status", "args": null, "storageKey": null }, -v45 = { +v47 = { "kind": "ScalarField", "alias": null, "name": "conclusion", "args": null, "storageKey": null }, -v46 = [ +v48 = [ { "kind": "Variable", "name": "after", @@ -1398,7 +1416,7 @@ v46 = [ "type": "Int" } ], -v47 = [ +v49 = [ { "kind": "ScalarField", "alias": null, @@ -1408,7 +1426,7 @@ v47 = [ }, (v4/*: any*/) ], -v48 = { +v50 = { "kind": "LinkedField", "alias": null, "name": "commit", @@ -1416,9 +1434,9 @@ v48 = { "args": null, "concreteType": "Commit", "plural": false, - "selections": (v47/*: any*/) + "selections": (v49/*: any*/) }, -v49 = { +v51 = { "kind": "LinkedField", "alias": null, "name": "actor", @@ -1426,7 +1444,7 @@ v49 = { "args": null, "concreteType": null, "plural": false, - "selections": (v37/*: any*/) + "selections": (v39/*: any*/) }; return { "kind": "Request", @@ -1632,6 +1650,7 @@ return { (v5/*: any*/), (v4/*: any*/), (v11/*: any*/), + (v12/*: any*/), { "kind": "ScalarField", "alias": null, @@ -1639,12 +1658,13 @@ return { "args": null, "storageKey": null }, - (v12/*: any*/), (v13/*: any*/), - (v16/*: any*/), + (v14/*: any*/), (v17/*: any*/), + (v18/*: any*/), (v19/*: any*/), - (v20/*: any*/), + (v21/*: any*/), + (v22/*: any*/), (v3/*: any*/) ] } @@ -1666,7 +1686,7 @@ return { "alias": null, "name": "reviewThreads", "storageKey": null, - "args": (v21/*: any*/), + "args": (v23/*: any*/), "concreteType": "PullRequestReviewThreadConnection", "plural": false, "selections": [ @@ -1706,7 +1726,7 @@ return { "args": null, "concreteType": "User", "plural": false, - "selections": (v22/*: any*/) + "selections": (v24/*: any*/) }, { "kind": "ScalarField", @@ -1727,7 +1747,7 @@ return { "alias": null, "name": "comments", "storageKey": null, - "args": (v23/*: any*/), + "args": (v25/*: any*/), "concreteType": "PullRequestReviewCommentConnection", "plural": false, "selections": [ @@ -1751,9 +1771,10 @@ return { "concreteType": "PullRequestReviewComment", "plural": false, "selections": [ - (v24/*: any*/), + (v26/*: any*/), (v4/*: any*/), - (v13/*: any*/), + (v11/*: any*/), + (v14/*: any*/), { "kind": "ScalarField", "alias": null, @@ -1761,9 +1782,9 @@ return { "args": null, "storageKey": null }, - (v11/*: any*/), - (v20/*: any*/), - (v25/*: any*/), + (v12/*: any*/), + (v22/*: any*/), + (v18/*: any*/), { "kind": "LinkedField", "alias": null, @@ -1774,17 +1795,18 @@ return { "plural": false, "selections": [ (v3/*: any*/), + (v16/*: any*/), (v15/*: any*/), - (v14/*: any*/), (v5/*: any*/), (v4/*: any*/) ] }, - (v26/*: any*/), - (v12/*: any*/), + (v27/*: any*/), + (v28/*: any*/), + (v13/*: any*/), (v5/*: any*/), - (v17/*: any*/), (v19/*: any*/), + (v21/*: any*/), (v3/*: any*/) ] } @@ -1796,7 +1818,7 @@ return { "kind": "LinkedHandle", "alias": null, "name": "comments", - "args": (v23/*: any*/), + "args": (v25/*: any*/), "handle": "connection", "key": "ReviewCommentsAccumulator_comments", "filters": null @@ -1812,7 +1834,7 @@ return { "kind": "LinkedHandle", "alias": null, "name": "reviewThreads", - "args": (v21/*: any*/), + "args": (v23/*: any*/), "handle": "connection", "key": "ReviewThreadsAccumulator_reviewThreads", "filters": null @@ -1822,8 +1844,8 @@ return { ] }, (v4/*: any*/), - (v27/*: any*/), (v29/*: any*/), + (v31/*: any*/), { "kind": "LinkedField", "alias": "issue", @@ -1839,22 +1861,22 @@ return { "kind": "InlineFragment", "type": "Issue", "selections": [ - (v11/*: any*/), - (v30/*: any*/), + (v12/*: any*/), + (v32/*: any*/), (v5/*: any*/), - (v31/*: any*/), - (v13/*: any*/), - (v16/*: any*/), + (v33/*: any*/), + (v11/*: any*/), + (v17/*: any*/), { "kind": "LinkedField", "alias": null, "name": "timeline", "storageKey": null, - "args": (v32/*: any*/), + "args": (v34/*: any*/), "concreteType": "IssueTimelineConnection", "plural": false, "selections": [ - (v33/*: any*/), + (v35/*: any*/), { "kind": "LinkedField", "alias": null, @@ -1876,9 +1898,9 @@ return { "selections": [ (v3/*: any*/), (v4/*: any*/), - (v36/*: any*/), (v38/*: any*/), - (v41/*: any*/) + (v40/*: any*/), + (v43/*: any*/) ] } ] @@ -1889,13 +1911,13 @@ return { "kind": "LinkedHandle", "alias": null, "name": "timeline", - "args": (v32/*: any*/), + "args": (v34/*: any*/), "handle": "connection", "key": "IssueTimelineController_timeline", "filters": null }, - (v19/*: any*/), - (v20/*: any*/) + (v21/*: any*/), + (v22/*: any*/) ] } ] @@ -1915,8 +1937,8 @@ return { "kind": "InlineFragment", "type": "PullRequest", "selections": [ - (v13/*: any*/), - (v30/*: any*/), + (v11/*: any*/), + (v32/*: any*/), { "kind": "ScalarField", "alias": null, @@ -1933,7 +1955,7 @@ return { "concreteType": "Repository", "plural": false, "selections": [ - (v27/*: any*/), + (v29/*: any*/), (v5/*: any*/), { "kind": "ScalarField", @@ -1942,12 +1964,12 @@ return { "args": null, "storageKey": null }, - (v29/*: any*/), + (v31/*: any*/), (v4/*: any*/) ] }, (v5/*: any*/), - (v34/*: any*/), + (v36/*: any*/), { "kind": "ScalarField", "alias": null, @@ -1955,8 +1977,8 @@ return { "args": null, "storageKey": null }, - (v11/*: any*/), - (v31/*: any*/), + (v12/*: any*/), + (v33/*: any*/), { "kind": "ScalarField", "alias": null, @@ -1972,19 +1994,19 @@ return { "args": null, "concreteType": "PullRequestCommitConnection", "plural": false, - "selections": (v18/*: any*/) + "selections": (v20/*: any*/) }, - (v16/*: any*/), + (v17/*: any*/), { "kind": "LinkedField", "alias": null, "name": "commits", "storageKey": null, - "args": (v42/*: any*/), + "args": (v44/*: any*/), "concreteType": "PullRequestCommitConnection", "plural": false, "selections": [ - (v33/*: any*/), + (v35/*: any*/), { "kind": "LinkedField", "alias": null, @@ -2023,8 +2045,8 @@ return { "concreteType": "GitActor", "plural": false, "selections": [ - (v15/*: any*/), - (v27/*: any*/), + (v16/*: any*/), + (v29/*: any*/), { "kind": "ScalarField", "alias": null, @@ -2055,7 +2077,7 @@ return { "args": null, "storageKey": null }, - (v40/*: any*/), + (v42/*: any*/), (v5/*: any*/) ] }, @@ -2071,7 +2093,7 @@ return { "kind": "LinkedHandle", "alias": null, "name": "commits", - "args": (v42/*: any*/), + "args": (v44/*: any*/), "handle": "connection", "key": "prCommitsView_commits", "filters": null @@ -2128,7 +2150,7 @@ return { "concreteType": "Status", "plural": false, "selections": [ - (v11/*: any*/), + (v12/*: any*/), { "kind": "LinkedField", "alias": null, @@ -2139,7 +2161,7 @@ return { "plural": true, "selections": [ (v4/*: any*/), - (v11/*: any*/), + (v12/*: any*/), { "kind": "ScalarField", "alias": null, @@ -2172,7 +2194,7 @@ return { "alias": null, "name": "checkSuites", "storageKey": null, - "args": (v43/*: any*/), + "args": (v45/*: any*/), "concreteType": "CheckSuiteConnection", "plural": false, "selections": [ @@ -2197,8 +2219,8 @@ return { "plural": false, "selections": [ (v4/*: any*/), - (v44/*: any*/), - (v45/*: any*/), + (v46/*: any*/), + (v47/*: any*/), { "kind": "LinkedField", "alias": null, @@ -2208,7 +2230,7 @@ return { "concreteType": "App", "plural": false, "selections": [ - (v27/*: any*/), + (v29/*: any*/), (v4/*: any*/) ] }, @@ -2217,7 +2239,7 @@ return { "alias": null, "name": "checkRuns", "storageKey": null, - "args": (v46/*: any*/), + "args": (v48/*: any*/), "concreteType": "CheckRunConnection", "plural": false, "selections": [ @@ -2242,10 +2264,10 @@ return { "plural": false, "selections": [ (v4/*: any*/), - (v44/*: any*/), - (v45/*: any*/), - (v27/*: any*/), - (v30/*: any*/), + (v46/*: any*/), + (v47/*: any*/), + (v29/*: any*/), + (v32/*: any*/), { "kind": "ScalarField", "alias": null, @@ -2278,7 +2300,7 @@ return { "kind": "LinkedHandle", "alias": null, "name": "checkRuns", - "args": (v46/*: any*/), + "args": (v48/*: any*/), "handle": "connection", "key": "CheckRunsAccumulator_checkRuns", "filters": null @@ -2294,7 +2316,7 @@ return { "kind": "LinkedHandle", "alias": null, "name": "checkSuites", - "args": (v43/*: any*/), + "args": (v45/*: any*/), "handle": "connection", "key": "CheckSuiteAccumulator_checkSuites", "filters": null @@ -2316,7 +2338,7 @@ return { "args": null, "concreteType": null, "plural": false, - "selections": (v28/*: any*/) + "selections": (v30/*: any*/) }, { "kind": "LinkedField", @@ -2327,7 +2349,7 @@ return { "concreteType": "Repository", "plural": false, "selections": [ - (v29/*: any*/), + (v31/*: any*/), (v4/*: any*/) ] }, @@ -2336,11 +2358,11 @@ return { "alias": null, "name": "timeline", "storageKey": null, - "args": (v32/*: any*/), + "args": (v34/*: any*/), "concreteType": "PullRequestTimelineConnection", "plural": false, "selections": [ - (v33/*: any*/), + (v35/*: any*/), { "kind": "LinkedField", "alias": null, @@ -2362,12 +2384,12 @@ return { "selections": [ (v3/*: any*/), (v4/*: any*/), - (v36/*: any*/), + (v38/*: any*/), { "kind": "InlineFragment", "type": "CommitCommentThread", "selections": [ - (v48/*: any*/), + (v50/*: any*/), { "kind": "LinkedField", "alias": null, @@ -2411,13 +2433,13 @@ return { "args": null, "concreteType": null, "plural": false, - "selections": (v35/*: any*/) + "selections": (v37/*: any*/) }, - (v48/*: any*/), - (v13/*: any*/), + (v50/*: any*/), + (v11/*: any*/), + (v28/*: any*/), (v26/*: any*/), - (v25/*: any*/), - (v24/*: any*/) + (v27/*: any*/) ] } ] @@ -2430,7 +2452,7 @@ return { "kind": "InlineFragment", "type": "HeadRefForcePushedEvent", "selections": [ - (v49/*: any*/), + (v51/*: any*/), { "kind": "LinkedField", "alias": null, @@ -2439,7 +2461,7 @@ return { "args": null, "concreteType": "Commit", "plural": false, - "selections": (v47/*: any*/) + "selections": (v49/*: any*/) }, { "kind": "LinkedField", @@ -2449,17 +2471,17 @@ return { "args": null, "concreteType": "Commit", "plural": false, - "selections": (v47/*: any*/) + "selections": (v49/*: any*/) }, - (v26/*: any*/) + (v28/*: any*/) ] }, { "kind": "InlineFragment", "type": "MergedEvent", "selections": [ - (v49/*: any*/), - (v48/*: any*/), + (v51/*: any*/), + (v50/*: any*/), { "kind": "ScalarField", "alias": null, @@ -2467,11 +2489,11 @@ return { "args": null, "storageKey": null }, - (v26/*: any*/) + (v28/*: any*/) ] }, - (v38/*: any*/), - (v41/*: any*/) + (v40/*: any*/), + (v43/*: any*/) ] } ] @@ -2482,13 +2504,13 @@ return { "kind": "LinkedHandle", "alias": null, "name": "timeline", - "args": (v32/*: any*/), + "args": (v34/*: any*/), "handle": "connection", "key": "prTimelineContainer_timeline", "filters": null }, - (v19/*: any*/), - (v20/*: any*/) + (v21/*: any*/), + (v22/*: any*/) ] } ] @@ -2501,7 +2523,7 @@ return { "operationKind": "query", "name": "issueishDetailContainerQuery", "id": null, - "text": "query issueishDetailContainerQuery(\n $repoOwner: String!\n $repoName: String!\n $issueishNumber: Int!\n $timelineCount: Int!\n $timelineCursor: String\n $commitCount: Int!\n $commitCursor: String\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n repository(owner: $repoOwner, name: $repoName) {\n issueish: issueOrPullRequest(number: $issueishNumber) {\n __typename\n ... on PullRequest {\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n }\n ... on Node {\n id\n }\n }\n ...issueishDetailController_repository_3iQpNL\n id\n }\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment issueishDetailController_repository_3iQpNL on Repository {\n ...issueDetailView_repository\n ...prCheckoutController_repository\n ...prDetailView_repository\n name\n owner {\n __typename\n login\n id\n }\n issue: issueOrPullRequest(number: $issueishNumber) {\n __typename\n ... on Issue {\n title\n number\n ...issueDetailView_issue_3D8CP9\n }\n ... on Node {\n id\n }\n }\n pullRequest: issueOrPullRequest(number: $issueishNumber) {\n __typename\n ... on PullRequest {\n title\n number\n ...prCheckoutController_pullRequest\n ...prDetailView_pullRequest_1UVrY8\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment issueDetailView_repository on Repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment prCheckoutController_repository on Repository {\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment prDetailView_repository on Repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment issueDetailView_issue_3D8CP9 on Issue {\n id\n __typename\n url\n state\n number\n title\n bodyHTML\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n ...issueTimelineController_issue_3D8CP9\n ...emojiReactionsView_reactable\n}\n\nfragment prCheckoutController_pullRequest on PullRequest {\n number\n headRefName\n headRepository {\n name\n url\n sshUrl\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment prDetailView_pullRequest_1UVrY8 on PullRequest {\n id\n __typename\n url\n isCrossRepository\n changedFiles\n state\n number\n title\n bodyHTML\n baseRefName\n headRefName\n countedCommits: commits {\n totalCount\n }\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n ...prCommitsView_pullRequest_38TpXw\n ...prStatusesView_pullRequest_1oGSNs\n ...prTimelineController_pullRequest_3D8CP9\n ...emojiReactionsController_reactable\n}\n\nfragment prCommitsView_pullRequest_38TpXw on PullRequest {\n url\n commits(first: $commitCount, after: $commitCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n commit {\n id\n ...prCommitView_item\n }\n id\n __typename\n }\n }\n }\n}\n\nfragment prStatusesView_pullRequest_1oGSNs on PullRequest {\n id\n recentCommits: commits(last: 1) {\n edges {\n node {\n commit {\n status {\n state\n contexts {\n id\n state\n ...prStatusContextView_context\n }\n id\n }\n ...checkSuitesAccumulator_commit_1oGSNs\n id\n }\n id\n }\n }\n }\n}\n\nfragment prTimelineController_pullRequest_3D8CP9 on PullRequest {\n url\n ...headRefForcePushedEventView_issueish\n timeline(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...commitsView_nodes\n ...issueCommentView_item\n ...mergedEventView_item\n ...headRefForcePushedEventView_item\n ...commitCommentThreadView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment headRefForcePushedEventView_issueish on PullRequest {\n headRefName\n headRepositoryOwner {\n __typename\n login\n id\n }\n repository {\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment commitsView_nodes on Commit {\n id\n author {\n name\n user {\n login\n id\n }\n }\n ...commitView_commit\n}\n\nfragment issueCommentView_item on IssueComment {\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n bodyHTML\n createdAt\n url\n}\n\nfragment mergedEventView_item on MergedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n mergeRefName\n createdAt\n}\n\nfragment headRefForcePushedEventView_item on HeadRefForcePushedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n beforeCommit {\n oid\n id\n }\n afterCommit {\n oid\n id\n }\n createdAt\n}\n\nfragment commitCommentThreadView_item on CommitCommentThread {\n commit {\n oid\n id\n }\n comments(first: 100) {\n edges {\n node {\n id\n ...commitCommentView_item\n }\n }\n }\n}\n\nfragment crossReferencedEventsView_nodes on CrossReferencedEvent {\n id\n referencedAt\n isCrossRepository\n actor {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n source {\n __typename\n ... on RepositoryNode {\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n ...crossReferencedEventView_item\n}\n\nfragment crossReferencedEventView_item on CrossReferencedEvent {\n id\n isCrossRepository\n source {\n __typename\n ... on Issue {\n number\n title\n url\n issueState: state\n }\n ... on PullRequest {\n number\n title\n url\n prState: state\n }\n ... on RepositoryNode {\n repository {\n name\n isPrivate\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment commitCommentView_item on CommitComment {\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n bodyHTML\n createdAt\n path\n position\n}\n\nfragment commitView_commit on Commit {\n author {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n committer {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n authoredByCommitter\n sha: oid\n message\n messageHeadlineHTML\n commitUrl\n}\n\nfragment prStatusContextView_context on StatusContext {\n context\n description\n state\n targetUrl\n}\n\nfragment checkSuitesAccumulator_commit_1oGSNs on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_Rvfr1\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n\nfragment prCommitView_item on Commit {\n committer {\n avatarUrl\n name\n date\n }\n messageHeadline\n messageBody\n shortSha: abbreviatedOid\n sha: oid\n url\n}\n\nfragment issueTimelineController_issue_3D8CP9 on Issue {\n url\n timeline(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...commitsView_nodes\n ...issueCommentView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n isMinimized\n state\n viewerCanReact\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n", + "text": "query issueishDetailContainerQuery(\n $repoOwner: String!\n $repoName: String!\n $issueishNumber: Int!\n $timelineCount: Int!\n $timelineCursor: String\n $commitCount: Int!\n $commitCursor: String\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n repository(owner: $repoOwner, name: $repoName) {\n issueish: issueOrPullRequest(number: $issueishNumber) {\n __typename\n ... on PullRequest {\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n }\n ... on Node {\n id\n }\n }\n ...issueishDetailController_repository_3iQpNL\n id\n }\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment issueishDetailController_repository_3iQpNL on Repository {\n ...issueDetailView_repository\n ...prCheckoutController_repository\n ...prDetailView_repository\n name\n owner {\n __typename\n login\n id\n }\n issue: issueOrPullRequest(number: $issueishNumber) {\n __typename\n ... on Issue {\n title\n number\n ...issueDetailView_issue_3D8CP9\n }\n ... on Node {\n id\n }\n }\n pullRequest: issueOrPullRequest(number: $issueishNumber) {\n __typename\n ... on PullRequest {\n title\n number\n ...prCheckoutController_pullRequest\n ...prDetailView_pullRequest_1UVrY8\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment issueDetailView_repository on Repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment prCheckoutController_repository on Repository {\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment prDetailView_repository on Repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment issueDetailView_issue_3D8CP9 on Issue {\n id\n __typename\n url\n state\n number\n title\n bodyHTML\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n ...issueTimelineController_issue_3D8CP9\n ...emojiReactionsView_reactable\n}\n\nfragment prCheckoutController_pullRequest on PullRequest {\n number\n headRefName\n headRepository {\n name\n url\n sshUrl\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment prDetailView_pullRequest_1UVrY8 on PullRequest {\n id\n __typename\n url\n isCrossRepository\n changedFiles\n state\n number\n title\n bodyHTML\n baseRefName\n headRefName\n countedCommits: commits {\n totalCount\n }\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n ...prCommitsView_pullRequest_38TpXw\n ...prStatusesView_pullRequest_1oGSNs\n ...prTimelineController_pullRequest_3D8CP9\n ...emojiReactionsController_reactable\n}\n\nfragment prCommitsView_pullRequest_38TpXw on PullRequest {\n url\n commits(first: $commitCount, after: $commitCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n commit {\n id\n ...prCommitView_item\n }\n id\n __typename\n }\n }\n }\n}\n\nfragment prStatusesView_pullRequest_1oGSNs on PullRequest {\n id\n recentCommits: commits(last: 1) {\n edges {\n node {\n commit {\n status {\n state\n contexts {\n id\n state\n ...prStatusContextView_context\n }\n id\n }\n ...checkSuitesAccumulator_commit_1oGSNs\n id\n }\n id\n }\n }\n }\n}\n\nfragment prTimelineController_pullRequest_3D8CP9 on PullRequest {\n url\n ...headRefForcePushedEventView_issueish\n timeline(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...commitsView_nodes\n ...issueCommentView_item\n ...mergedEventView_item\n ...headRefForcePushedEventView_item\n ...commitCommentThreadView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment headRefForcePushedEventView_issueish on PullRequest {\n headRefName\n headRepositoryOwner {\n __typename\n login\n id\n }\n repository {\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment commitsView_nodes on Commit {\n id\n author {\n name\n user {\n login\n id\n }\n }\n ...commitView_commit\n}\n\nfragment issueCommentView_item on IssueComment {\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n bodyHTML\n createdAt\n url\n}\n\nfragment mergedEventView_item on MergedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n mergeRefName\n createdAt\n}\n\nfragment headRefForcePushedEventView_item on HeadRefForcePushedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n beforeCommit {\n oid\n id\n }\n afterCommit {\n oid\n id\n }\n createdAt\n}\n\nfragment commitCommentThreadView_item on CommitCommentThread {\n commit {\n oid\n id\n }\n comments(first: 100) {\n edges {\n node {\n id\n ...commitCommentView_item\n }\n }\n }\n}\n\nfragment crossReferencedEventsView_nodes on CrossReferencedEvent {\n id\n referencedAt\n isCrossRepository\n actor {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n source {\n __typename\n ... on RepositoryNode {\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n ...crossReferencedEventView_item\n}\n\nfragment crossReferencedEventView_item on CrossReferencedEvent {\n id\n isCrossRepository\n source {\n __typename\n ... on Issue {\n number\n title\n url\n issueState: state\n }\n ... on PullRequest {\n number\n title\n url\n prState: state\n }\n ... on RepositoryNode {\n repository {\n name\n isPrivate\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment commitCommentView_item on CommitComment {\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n bodyHTML\n createdAt\n path\n position\n}\n\nfragment commitView_commit on Commit {\n author {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n committer {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n authoredByCommitter\n sha: oid\n message\n messageHeadlineHTML\n commitUrl\n}\n\nfragment prStatusContextView_context on StatusContext {\n context\n description\n state\n targetUrl\n}\n\nfragment checkSuitesAccumulator_commit_1oGSNs on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_Rvfr1\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n\nfragment prCommitView_item on Commit {\n committer {\n avatarUrl\n name\n date\n }\n messageHeadline\n messageBody\n shortSha: abbreviatedOid\n sha: oid\n url\n}\n\nfragment issueTimelineController_issue_3D8CP9 on Issue {\n url\n timeline(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...commitsView_nodes\n ...issueCommentView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/containers/__generated__/reviewsContainerQuery.graphql.js b/lib/containers/__generated__/reviewsContainerQuery.graphql.js index f1adb901d9..cf0ec3271a 100644 --- a/lib/containers/__generated__/reviewsContainerQuery.graphql.js +++ b/lib/containers/__generated__/reviewsContainerQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash c5fc2c138b012df8081c275fb687ae7b + * @relayHash 08df4a78972ce536e88298bb6478d0e8 */ /* eslint-disable */ @@ -119,6 +119,7 @@ fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { cursor node { id + body bodyHTML state submittedAt @@ -133,6 +134,7 @@ fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { id } } + viewerCanUpdate authorAssociation ...emojiReactionsController_reactable __typename @@ -187,9 +189,11 @@ fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThrea } } bodyHTML + body isMinimized state viewerCanReact + viewerCanUpdate path position createdAt @@ -414,39 +418,53 @@ v12 = { v13 = { "kind": "ScalarField", "alias": null, - "name": "state", + "name": "bodyHTML", "args": null, "storageKey": null }, v14 = { "kind": "ScalarField", "alias": null, - "name": "lastEditedAt", + "name": "state", "args": null, "storageKey": null }, v15 = { "kind": "ScalarField", "alias": null, - "name": "bodyHTML", + "name": "lastEditedAt", "args": null, "storageKey": null }, v16 = { "kind": "ScalarField", "alias": null, - "name": "avatarUrl", + "name": "body", "args": null, "storageKey": null }, v17 = { "kind": "ScalarField", "alias": null, - "name": "authorAssociation", + "name": "avatarUrl", "args": null, "storageKey": null }, v18 = { + "kind": "ScalarField", + "alias": null, + "name": "viewerCanUpdate", + "args": null, + "storageKey": null +}, +v19 = { + "kind": "ScalarField", + "alias": null, + "name": "authorAssociation", + "args": null, + "storageKey": null +}, +v20 = { "kind": "LinkedField", "alias": null, "name": "reactionGroups", @@ -489,14 +507,14 @@ v18 = { } ] }, -v19 = { +v21 = { "kind": "ScalarField", "alias": null, "name": "viewerCanReact", "args": null, "storageKey": null }, -v20 = [ +v22 = [ { "kind": "Variable", "name": "after", @@ -510,7 +528,7 @@ v20 = [ "type": "Int" } ], -v21 = [ +v23 = [ { "kind": "Variable", "name": "after", @@ -686,6 +704,7 @@ return { (v9/*: any*/), (v7/*: any*/), (v13/*: any*/), + (v14/*: any*/), { "kind": "ScalarField", "alias": null, @@ -693,8 +712,8 @@ return { "args": null, "storageKey": null }, - (v14/*: any*/), (v15/*: any*/), + (v16/*: any*/), { "kind": "LinkedField", "alias": null, @@ -706,14 +725,15 @@ return { "selections": [ (v5/*: any*/), (v6/*: any*/), - (v16/*: any*/), + (v17/*: any*/), (v9/*: any*/), (v7/*: any*/) ] }, - (v17/*: any*/), (v18/*: any*/), (v19/*: any*/), + (v20/*: any*/), + (v21/*: any*/), (v5/*: any*/) ] } @@ -735,7 +755,7 @@ return { "alias": null, "name": "reviewThreads", "storageKey": null, - "args": (v20/*: any*/), + "args": (v22/*: any*/), "concreteType": "PullRequestReviewThreadConnection", "plural": false, "selections": [ @@ -799,7 +819,7 @@ return { "alias": null, "name": "comments", "storageKey": null, - "args": (v21/*: any*/), + "args": (v23/*: any*/), "concreteType": "PullRequestReviewCommentConnection", "plural": false, "selections": [ @@ -826,28 +846,23 @@ return { { "kind": "ScalarField", "alias": null, - "name": "position", + "name": "path", "args": null, "storageKey": null }, (v7/*: any*/), - (v15/*: any*/), - { - "kind": "ScalarField", - "alias": null, - "name": "isMinimized", - "args": null, - "storageKey": null - }, (v13/*: any*/), - (v19/*: any*/), + (v16/*: any*/), { "kind": "ScalarField", "alias": null, - "name": "path", + "name": "isMinimized", "args": null, "storageKey": null }, + (v14/*: any*/), + (v21/*: any*/), + (v18/*: any*/), { "kind": "LinkedField", "alias": null, @@ -858,12 +873,19 @@ return { "plural": false, "selections": [ (v5/*: any*/), - (v16/*: any*/), + (v17/*: any*/), (v6/*: any*/), (v9/*: any*/), (v7/*: any*/) ] }, + { + "kind": "ScalarField", + "alias": null, + "name": "position", + "args": null, + "storageKey": null + }, { "kind": "ScalarField", "alias": null, @@ -871,10 +893,10 @@ return { "args": null, "storageKey": null }, - (v14/*: any*/), + (v15/*: any*/), (v9/*: any*/), - (v17/*: any*/), - (v18/*: any*/), + (v19/*: any*/), + (v20/*: any*/), (v5/*: any*/) ] } @@ -886,7 +908,7 @@ return { "kind": "LinkedHandle", "alias": null, "name": "comments", - "args": (v21/*: any*/), + "args": (v23/*: any*/), "handle": "connection", "key": "ReviewCommentsAccumulator_comments", "filters": null @@ -902,7 +924,7 @@ return { "kind": "LinkedHandle", "alias": null, "name": "reviewThreads", - "args": (v20/*: any*/), + "args": (v22/*: any*/), "handle": "connection", "key": "ReviewThreadsAccumulator_reviewThreads", "filters": null @@ -959,7 +981,7 @@ return { "selections": [ (v7/*: any*/), (v6/*: any*/), - (v16/*: any*/) + (v17/*: any*/) ] } ] @@ -968,7 +990,7 @@ return { "operationKind": "query", "name": "reviewsContainerQuery", "id": null, - "text": "query reviewsContainerQuery(\n $repoOwner: String!\n $repoName: String!\n $prNumber: Int!\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n) {\n repository(owner: $repoOwner, name: $repoName) {\n ...reviewsController_repository\n pullRequest(number: $prNumber) {\n headRefOid\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n ...reviewsController_pullRequest\n id\n }\n id\n }\n viewer {\n ...reviewsController_viewer\n id\n }\n}\n\nfragment reviewsController_repository on Repository {\n ...prCheckoutController_repository\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment reviewsController_pullRequest on PullRequest {\n id\n ...prCheckoutController_pullRequest\n}\n\nfragment reviewsController_viewer on User {\n id\n login\n avatarUrl\n}\n\nfragment prCheckoutController_pullRequest on PullRequest {\n number\n headRefName\n headRepository {\n name\n url\n sshUrl\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n isMinimized\n state\n viewerCanReact\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment prCheckoutController_repository on Repository {\n name\n owner {\n __typename\n login\n id\n }\n}\n", + "text": "query reviewsContainerQuery(\n $repoOwner: String!\n $repoName: String!\n $prNumber: Int!\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n) {\n repository(owner: $repoOwner, name: $repoName) {\n ...reviewsController_repository\n pullRequest(number: $prNumber) {\n headRefOid\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n ...reviewsController_pullRequest\n id\n }\n id\n }\n viewer {\n ...reviewsController_viewer\n id\n }\n}\n\nfragment reviewsController_repository on Repository {\n ...prCheckoutController_repository\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment reviewsController_pullRequest on PullRequest {\n id\n ...prCheckoutController_pullRequest\n}\n\nfragment reviewsController_viewer on User {\n id\n login\n avatarUrl\n}\n\nfragment prCheckoutController_pullRequest on PullRequest {\n number\n headRefName\n headRepository {\n name\n url\n sshUrl\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment prCheckoutController_repository on Repository {\n name\n owner {\n __typename\n login\n id\n }\n}\n", "metadata": {} } }; diff --git a/lib/containers/accumulators/__generated__/reviewCommentsAccumulatorQuery.graphql.js b/lib/containers/accumulators/__generated__/reviewCommentsAccumulatorQuery.graphql.js index de2e349eaa..48cd182bbd 100644 --- a/lib/containers/accumulators/__generated__/reviewCommentsAccumulatorQuery.graphql.js +++ b/lib/containers/accumulators/__generated__/reviewCommentsAccumulatorQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash e03fe8d7e5ac69de56d1ba99eb403ce7 + * @relayHash c99d31c7feadf71f8680cfcf559b8aa4 */ /* eslint-disable */ @@ -63,9 +63,11 @@ fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThrea } } bodyHTML + body isMinimized state viewerCanReact + viewerCanUpdate path position createdAt @@ -289,7 +291,7 @@ return { { "kind": "ScalarField", "alias": null, - "name": "position", + "name": "path", "args": null, "storageKey": null }, @@ -301,6 +303,13 @@ return { "args": null, "storageKey": null }, + { + "kind": "ScalarField", + "alias": null, + "name": "body", + "args": null, + "storageKey": null + }, { "kind": "ScalarField", "alias": null, @@ -325,7 +334,7 @@ return { { "kind": "ScalarField", "alias": null, - "name": "path", + "name": "viewerCanUpdate", "args": null, "storageKey": null }, @@ -357,6 +366,13 @@ return { (v3/*: any*/) ] }, + { + "kind": "ScalarField", + "alias": null, + "name": "position", + "args": null, + "storageKey": null + }, { "kind": "ScalarField", "alias": null, @@ -448,7 +464,7 @@ return { "operationKind": "query", "name": "reviewCommentsAccumulatorQuery", "id": null, - "text": "query reviewCommentsAccumulatorQuery(\n $id: ID!\n $commentCount: Int!\n $commentCursor: String\n) {\n node(id: $id) {\n __typename\n ... on PullRequestReviewThread {\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n }\n id\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n isMinimized\n state\n viewerCanReact\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", + "text": "query reviewCommentsAccumulatorQuery(\n $id: ID!\n $commentCount: Int!\n $commentCursor: String\n) {\n node(id: $id) {\n __typename\n ... on PullRequestReviewThread {\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n }\n id\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", "metadata": {} } }; diff --git a/lib/containers/accumulators/__generated__/reviewCommentsAccumulator_reviewThread.graphql.js b/lib/containers/accumulators/__generated__/reviewCommentsAccumulator_reviewThread.graphql.js index a049a16ac9..d38d6de545 100644 --- a/lib/containers/accumulators/__generated__/reviewCommentsAccumulator_reviewThread.graphql.js +++ b/lib/containers/accumulators/__generated__/reviewCommentsAccumulator_reviewThread.graphql.js @@ -30,9 +30,11 @@ export type reviewCommentsAccumulator_reviewThread = {| +url: any, |}, +bodyHTML: any, + +body: string, +isMinimized: boolean, +state: PullRequestReviewCommentState, +viewerCanReact: boolean, + +viewerCanUpdate: boolean, +path: string, +position: ?number, +createdAt: any, @@ -157,7 +159,7 @@ return { { "kind": "ScalarField", "alias": null, - "name": "position", + "name": "path", "args": null, "storageKey": null }, @@ -169,6 +171,13 @@ return { "args": null, "storageKey": null }, + { + "kind": "ScalarField", + "alias": null, + "name": "body", + "args": null, + "storageKey": null + }, { "kind": "ScalarField", "alias": null, @@ -193,7 +202,7 @@ return { { "kind": "ScalarField", "alias": null, - "name": "path", + "name": "viewerCanUpdate", "args": null, "storageKey": null }, @@ -223,6 +232,13 @@ return { (v1/*: any*/) ] }, + { + "kind": "ScalarField", + "alias": null, + "name": "position", + "args": null, + "storageKey": null + }, { "kind": "ScalarField", "alias": null, @@ -267,5 +283,5 @@ return { }; })(); // prettier-ignore -(node/*: any*/).hash = '6a1d075c882842171dfeaf52d4241b35'; +(node/*: any*/).hash = '2716996f7cb548d6f3a3894f5d51193a'; module.exports = node; diff --git a/lib/containers/accumulators/__generated__/reviewSummariesAccumulatorQuery.graphql.js b/lib/containers/accumulators/__generated__/reviewSummariesAccumulatorQuery.graphql.js index 51f21c212d..ef6cef0038 100644 --- a/lib/containers/accumulators/__generated__/reviewSummariesAccumulatorQuery.graphql.js +++ b/lib/containers/accumulators/__generated__/reviewSummariesAccumulatorQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash d8874c903550e8d84d57fb2ec3a2b26b + * @relayHash 8744660481fe58cf58f55c9cc75a3b10 */ /* eslint-disable */ @@ -55,6 +55,7 @@ fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { cursor node { id + body bodyHTML state submittedAt @@ -69,6 +70,7 @@ fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { id } } + viewerCanUpdate authorAssociation ...emojiReactionsController_reactable __typename @@ -287,6 +289,13 @@ return { "selections": [ (v4/*: any*/), (v3/*: any*/), + { + "kind": "ScalarField", + "alias": null, + "name": "bodyHTML", + "args": null, + "storageKey": null + }, { "kind": "ScalarField", "alias": null, @@ -311,7 +320,7 @@ return { { "kind": "ScalarField", "alias": null, - "name": "bodyHTML", + "name": "body", "args": null, "storageKey": null }, @@ -343,6 +352,13 @@ return { (v3/*: any*/) ] }, + { + "kind": "ScalarField", + "alias": null, + "name": "viewerCanUpdate", + "args": null, + "storageKey": null + }, { "kind": "ScalarField", "alias": null, @@ -426,7 +442,7 @@ return { "operationKind": "query", "name": "reviewSummariesAccumulatorQuery", "id": null, - "text": "query reviewSummariesAccumulatorQuery(\n $url: URI!\n $reviewCount: Int!\n $reviewCursor: String\n) {\n resource(url: $url) {\n __typename\n ... on PullRequest {\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", + "text": "query reviewSummariesAccumulatorQuery(\n $url: URI!\n $reviewCount: Int!\n $reviewCursor: String\n) {\n resource(url: $url) {\n __typename\n ... on PullRequest {\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", "metadata": {} } }; diff --git a/lib/containers/accumulators/__generated__/reviewSummariesAccumulator_pullRequest.graphql.js b/lib/containers/accumulators/__generated__/reviewSummariesAccumulator_pullRequest.graphql.js index 2653d8e2ab..3f42cee6d8 100644 --- a/lib/containers/accumulators/__generated__/reviewSummariesAccumulator_pullRequest.graphql.js +++ b/lib/containers/accumulators/__generated__/reviewSummariesAccumulator_pullRequest.graphql.js @@ -24,6 +24,7 @@ export type reviewSummariesAccumulator_pullRequest = {| +cursor: string, +node: ?{| +id: string, + +body: string, +bodyHTML: any, +state: PullRequestReviewState, +submittedAt: ?any, @@ -34,6 +35,7 @@ export type reviewSummariesAccumulator_pullRequest = {| +avatarUrl: any, +url: any, |}, + +viewerCanUpdate: boolean, +authorAssociation: CommentAuthorAssociation, +$fragmentRefs: emojiReactionsController_reactable$ref, |}, @@ -143,6 +145,7 @@ return { "concreteType": "PullRequestReview", "plural": false, "selections": [ + (v0/*: any*/), { "kind": "ScalarField", "alias": null, @@ -178,7 +181,13 @@ return { "args": null, "storageKey": null }, - (v0/*: any*/), + { + "kind": "ScalarField", + "alias": null, + "name": "body", + "args": null, + "storageKey": null + }, { "kind": "LinkedField", "alias": null, @@ -205,6 +214,13 @@ return { (v0/*: any*/) ] }, + { + "kind": "ScalarField", + "alias": null, + "name": "viewerCanUpdate", + "args": null, + "storageKey": null + }, { "kind": "ScalarField", "alias": null, @@ -234,5 +250,5 @@ return { }; })(); // prettier-ignore -(node/*: any*/).hash = '1da33e7396e8427d0a9bcec503f5b25d'; +(node/*: any*/).hash = '4ac732c2325cedd6e8e90bb5c140cc1a'; module.exports = node; diff --git a/lib/containers/accumulators/__generated__/reviewThreadsAccumulatorQuery.graphql.js b/lib/containers/accumulators/__generated__/reviewThreadsAccumulatorQuery.graphql.js index 3ac5f6b86d..587d70d35f 100644 --- a/lib/containers/accumulators/__generated__/reviewThreadsAccumulatorQuery.graphql.js +++ b/lib/containers/accumulators/__generated__/reviewThreadsAccumulatorQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 3b12f0de40249adb03e03e305bb72247 + * @relayHash 77537dff567439551ae3355cb2972939 */ /* eslint-disable */ @@ -92,9 +92,11 @@ fragment reviewCommentsAccumulator_reviewThread_1UlnwR on PullRequestReviewThrea } } bodyHTML + body isMinimized state viewerCanReact + viewerCanUpdate path position createdAt @@ -412,7 +414,7 @@ return { { "kind": "ScalarField", "alias": null, - "name": "position", + "name": "path", "args": null, "storageKey": null }, @@ -424,6 +426,13 @@ return { "args": null, "storageKey": null }, + { + "kind": "ScalarField", + "alias": null, + "name": "body", + "args": null, + "storageKey": null + }, { "kind": "ScalarField", "alias": null, @@ -448,7 +457,7 @@ return { { "kind": "ScalarField", "alias": null, - "name": "path", + "name": "viewerCanUpdate", "args": null, "storageKey": null }, @@ -474,6 +483,13 @@ return { (v3/*: any*/) ] }, + { + "kind": "ScalarField", + "alias": null, + "name": "position", + "args": null, + "storageKey": null + }, { "kind": "ScalarField", "alias": null, @@ -581,7 +597,7 @@ return { "operationKind": "query", "name": "reviewThreadsAccumulatorQuery", "id": null, - "text": "query reviewThreadsAccumulatorQuery(\n $url: URI!\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n) {\n resource(url: $url) {\n __typename\n ... on PullRequest {\n ...reviewThreadsAccumulator_pullRequest_3dVVow\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_3dVVow on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1UlnwR\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1UlnwR on PullRequestReviewThread {\n id\n comments(first: $commentCount) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n isMinimized\n state\n viewerCanReact\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", + "text": "query reviewThreadsAccumulatorQuery(\n $url: URI!\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n) {\n resource(url: $url) {\n __typename\n ... on PullRequest {\n ...reviewThreadsAccumulator_pullRequest_3dVVow\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_3dVVow on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1UlnwR\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1UlnwR on PullRequestReviewThread {\n id\n comments(first: $commentCount) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", "metadata": {} } }; diff --git a/lib/containers/accumulators/review-comments-accumulator.js b/lib/containers/accumulators/review-comments-accumulator.js index 1bebdffed1..57f3089e9b 100644 --- a/lib/containers/accumulators/review-comments-accumulator.js +++ b/lib/containers/accumulators/review-comments-accumulator.js @@ -70,9 +70,11 @@ export default createPaginationContainer(BareReviewCommentsAccumulator, { url } bodyHTML + body isMinimized state viewerCanReact + viewerCanUpdate path position createdAt diff --git a/lib/containers/accumulators/review-summaries-accumulator.js b/lib/containers/accumulators/review-summaries-accumulator.js index 6d51c135b4..f5f11a965f 100644 --- a/lib/containers/accumulators/review-summaries-accumulator.js +++ b/lib/containers/accumulators/review-summaries-accumulator.js @@ -70,6 +70,7 @@ export default createPaginationContainer(BareReviewSummariesAccumulator, { cursor node { id + body bodyHTML state submittedAt @@ -80,6 +81,7 @@ export default createPaginationContainer(BareReviewSummariesAccumulator, { avatarUrl url } + viewerCanUpdate authorAssociation ...emojiReactionsController_reactable } diff --git a/lib/containers/reviews-container.js b/lib/containers/reviews-container.js index cf76c4b841..90fa732da4 100644 --- a/lib/containers/reviews-container.js +++ b/lib/containers/reviews-container.js @@ -40,6 +40,7 @@ export default class ReviewsContainer extends React.Component { config: PropTypes.object.isRequired, commands: PropTypes.object.isRequired, tooltips: PropTypes.object.isRequired, + confirm: PropTypes.func.isRequired, // Action methods reportRelayError: PropTypes.func.isRequired, diff --git a/lib/controllers/reviews-controller.js b/lib/controllers/reviews-controller.js index 2ba9e7263b..1438f5baae 100644 --- a/lib/controllers/reviews-controller.js +++ b/lib/controllers/reviews-controller.js @@ -11,6 +11,8 @@ import submitReviewMutation from '../mutations/submit-pr-review'; import deleteReviewMutation from '../mutations/delete-pr-review'; import resolveReviewThreadMutation from '../mutations/resolve-review-thread'; import unresolveReviewThreadMutation from '../mutations/unresolve-review-thread'; +import updatePrReviewCommentMutation from '../mutations/update-pr-review-comment'; +import updatePrReviewSummaryMutation from '../mutations/update-pr-review-summary'; import IssueishDetailItem from '../items/issueish-detail-item'; import {addEvent} from '../reporter-proxy'; @@ -64,6 +66,7 @@ export class BareReviewsController extends React.Component { config: PropTypes.object.isRequired, commands: PropTypes.object.isRequired, tooltips: PropTypes.object.isRequired, + confirm: PropTypes.func.isRequired, // Action methods reportRelayError: PropTypes.func.isRequired, @@ -144,6 +147,8 @@ export class BareReviewsController extends React.Component { resolveThread={this.resolveThread} unresolveThread={this.unresolveThread} addSingleComment={this.addSingleComment} + updateComment={this.updateComment} + updateSummary={this.updateSummary} {...this.props} /> )} @@ -342,6 +347,32 @@ export class BareReviewsController extends React.Component { this.setState({postingToThreadID: null}); } } + + updateComment = async (commentId, commentBody) => { + try { + await updatePrReviewCommentMutation(this.props.relay.environment, { + commentId, + commentBody, + }); + addEvent('update-review-comment', {package: 'github'}); + } catch (error) { + this.props.reportRelayError('Unable to update comment', error); + throw error; + } + } + + updateSummary = async (reviewId, reviewBody) => { + try { + await updatePrReviewSummaryMutation(this.props.relay.environment, { + reviewId, + reviewBody, + }); + addEvent('update-review-summary', {package: 'github'}); + } catch (error) { + this.props.reportRelayError('Unable to update review summary', error); + throw error; + } + } } export default createFragmentContainer(BareReviewsController, { diff --git a/lib/controllers/root-controller.js b/lib/controllers/root-controller.js index 4cfb211e62..5f82ceb5f9 100644 --- a/lib/controllers/root-controller.js +++ b/lib/controllers/root-controller.js @@ -463,6 +463,7 @@ export default class RootController extends React.Component { tooltips={this.props.tooltips} config={this.props.config} commands={this.props.commandRegistry} + confirm={this.props.confirm} reportRelayError={this.reportRelayError} /> )} diff --git a/lib/items/reviews-item.js b/lib/items/reviews-item.js index a69b7190c4..855db0251c 100644 --- a/lib/items/reviews-item.js +++ b/lib/items/reviews-item.js @@ -25,6 +25,7 @@ export default class ReviewsItem extends React.Component { config: PropTypes.object.isRequired, commands: PropTypes.object.isRequired, tooltips: PropTypes.object.isRequired, + confirm: PropTypes.func.isRequired, // Action methods reportRelayError: PropTypes.func.isRequired, diff --git a/lib/mutations/__generated__/addPrReviewCommentMutation.graphql.js b/lib/mutations/__generated__/addPrReviewCommentMutation.graphql.js index 004a50d995..4858d90159 100644 --- a/lib/mutations/__generated__/addPrReviewCommentMutation.graphql.js +++ b/lib/mutations/__generated__/addPrReviewCommentMutation.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 5665661d41495c80bd3a332f2b4c92f7 + * @relayHash 7db74054a2685fc13fab5c05bd711dca */ /* eslint-disable */ @@ -32,9 +32,11 @@ export type addPrReviewCommentMutationResponse = {| +avatarUrl: any, +login: string, |}, + +body: string, +bodyHTML: any, +isMinimized: boolean, +viewerCanReact: boolean, + +viewerCanUpdate: boolean, +path: string, +position: ?number, +createdAt: any, @@ -69,9 +71,11 @@ mutation addPrReviewCommentMutation( id } } + body bodyHTML isMinimized viewerCanReact + viewerCanUpdate path position createdAt @@ -122,7 +126,7 @@ v1 = [ v2 = { "kind": "ScalarField", "alias": null, - "name": "position", + "name": "path", "args": null, "storageKey": null }, @@ -136,67 +140,81 @@ v3 = { v4 = { "kind": "ScalarField", "alias": null, - "name": "bodyHTML", + "name": "body", "args": null, "storageKey": null }, v5 = { "kind": "ScalarField", "alias": null, - "name": "isMinimized", + "name": "bodyHTML", "args": null, "storageKey": null }, v6 = { "kind": "ScalarField", "alias": null, - "name": "viewerCanReact", + "name": "isMinimized", "args": null, "storageKey": null }, v7 = { "kind": "ScalarField", "alias": null, - "name": "path", + "name": "viewerCanReact", "args": null, "storageKey": null }, v8 = { "kind": "ScalarField", "alias": null, - "name": "avatarUrl", + "name": "viewerCanUpdate", "args": null, "storageKey": null }, v9 = { "kind": "ScalarField", "alias": null, - "name": "login", + "name": "avatarUrl", "args": null, "storageKey": null }, v10 = { "kind": "ScalarField", "alias": null, - "name": "createdAt", + "name": "login", "args": null, "storageKey": null }, v11 = { "kind": "ScalarField", "alias": null, - "name": "lastEditedAt", + "name": "position", "args": null, "storageKey": null }, v12 = { "kind": "ScalarField", "alias": null, - "name": "url", + "name": "createdAt", "args": null, "storageKey": null }, v13 = { + "kind": "ScalarField", + "alias": null, + "name": "lastEditedAt", + "args": null, + "storageKey": null +}, +v14 = { + "kind": "ScalarField", + "alias": null, + "name": "url", + "args": null, + "storageKey": null +}, +v15 = { "kind": "ScalarField", "alias": null, "name": "authorAssociation", @@ -245,6 +263,7 @@ return { (v5/*: any*/), (v6/*: any*/), (v7/*: any*/), + (v8/*: any*/), { "kind": "LinkedField", "alias": null, @@ -254,14 +273,15 @@ return { "concreteType": null, "plural": false, "selections": [ - (v8/*: any*/), - (v9/*: any*/) + (v9/*: any*/), + (v10/*: any*/) ] }, - (v10/*: any*/), (v11/*: any*/), (v12/*: any*/), (v13/*: any*/), + (v14/*: any*/), + (v15/*: any*/), { "kind": "FragmentSpread", "name": "emojiReactionsController_reactable", @@ -313,6 +333,7 @@ return { (v5/*: any*/), (v6/*: any*/), (v7/*: any*/), + (v8/*: any*/), { "kind": "LinkedField", "alias": null, @@ -329,15 +350,16 @@ return { "args": null, "storageKey": null }, - (v8/*: any*/), (v9/*: any*/), + (v10/*: any*/), (v3/*: any*/) ] }, - (v10/*: any*/), (v11/*: any*/), (v12/*: any*/), (v13/*: any*/), + (v14/*: any*/), + (v15/*: any*/), { "kind": "LinkedField", "alias": null, @@ -393,11 +415,11 @@ return { "operationKind": "mutation", "name": "addPrReviewCommentMutation", "id": null, - "text": "mutation addPrReviewCommentMutation(\n $input: AddPullRequestReviewCommentInput!\n) {\n addPullRequestReviewComment(input: $input) {\n commentEdge {\n node {\n id\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n bodyHTML\n isMinimized\n viewerCanReact\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", + "text": "mutation addPrReviewCommentMutation(\n $input: AddPullRequestReviewCommentInput!\n) {\n addPullRequestReviewComment(input: $input) {\n commentEdge {\n node {\n id\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n body\n bodyHTML\n isMinimized\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", "metadata": {} } }; })(); // prettier-ignore -(node/*: any*/).hash = '75ec864a015eb9def27a9f6fcd181c83'; +(node/*: any*/).hash = '0485900371928de8c6b843560dfe441c'; module.exports = node; diff --git a/lib/mutations/__generated__/addPrReviewMutation.graphql.js b/lib/mutations/__generated__/addPrReviewMutation.graphql.js index 6f617762f9..b11d90861f 100644 --- a/lib/mutations/__generated__/addPrReviewMutation.graphql.js +++ b/lib/mutations/__generated__/addPrReviewMutation.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 7307f4d80765c6cfa54e21823c6b8e91 + * @relayHash 4efdc36d8dc992dc727d9021a1a10601 */ /* eslint-disable */ @@ -33,9 +33,12 @@ export type addPrReviewMutationResponse = {| +reviewEdge: ?{| +node: ?{| +id: string, + +body: string, +bodyHTML: any, +state: PullRequestReviewState, +submittedAt: ?any, + +viewerCanReact: boolean, + +viewerCanUpdate: boolean, +author: ?{| +login: string, +avatarUrl: any, @@ -60,9 +63,12 @@ mutation addPrReviewMutation( reviewEdge { node { id + body bodyHTML state submittedAt + viewerCanReact + viewerCanUpdate author { __typename login @@ -122,32 +128,53 @@ v2 = { v3 = { "kind": "ScalarField", "alias": null, - "name": "bodyHTML", + "name": "body", "args": null, "storageKey": null }, v4 = { "kind": "ScalarField", "alias": null, - "name": "state", + "name": "bodyHTML", "args": null, "storageKey": null }, v5 = { "kind": "ScalarField", "alias": null, - "name": "submittedAt", + "name": "state", "args": null, "storageKey": null }, v6 = { "kind": "ScalarField", "alias": null, - "name": "login", + "name": "submittedAt", "args": null, "storageKey": null }, v7 = { + "kind": "ScalarField", + "alias": null, + "name": "viewerCanReact", + "args": null, + "storageKey": null +}, +v8 = { + "kind": "ScalarField", + "alias": null, + "name": "viewerCanUpdate", + "args": null, + "storageKey": null +}, +v9 = { + "kind": "ScalarField", + "alias": null, + "name": "login", + "args": null, + "storageKey": null +}, +v10 = { "kind": "ScalarField", "alias": null, "name": "avatarUrl", @@ -194,6 +221,9 @@ return { (v3/*: any*/), (v4/*: any*/), (v5/*: any*/), + (v6/*: any*/), + (v7/*: any*/), + (v8/*: any*/), { "kind": "LinkedField", "alias": null, @@ -203,8 +233,8 @@ return { "concreteType": null, "plural": false, "selections": [ - (v6/*: any*/), - (v7/*: any*/) + (v9/*: any*/), + (v10/*: any*/) ] }, { @@ -256,6 +286,9 @@ return { (v3/*: any*/), (v4/*: any*/), (v5/*: any*/), + (v6/*: any*/), + (v7/*: any*/), + (v8/*: any*/), { "kind": "LinkedField", "alias": null, @@ -272,8 +305,8 @@ return { "args": null, "storageKey": null }, - (v6/*: any*/), - (v7/*: any*/), + (v9/*: any*/), + (v10/*: any*/), (v2/*: any*/) ] }, @@ -319,13 +352,6 @@ return { ] } ] - }, - { - "kind": "ScalarField", - "alias": null, - "name": "viewerCanReact", - "args": null, - "storageKey": null } ] } @@ -339,11 +365,11 @@ return { "operationKind": "mutation", "name": "addPrReviewMutation", "id": null, - "text": "mutation addPrReviewMutation(\n $input: AddPullRequestReviewInput!\n) {\n addPullRequestReview(input: $input) {\n reviewEdge {\n node {\n id\n bodyHTML\n state\n submittedAt\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n ...emojiReactionsController_reactable\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", + "text": "mutation addPrReviewMutation(\n $input: AddPullRequestReviewInput!\n) {\n addPullRequestReview(input: $input) {\n reviewEdge {\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n viewerCanReact\n viewerCanUpdate\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n ...emojiReactionsController_reactable\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", "metadata": {} } }; })(); // prettier-ignore -(node/*: any*/).hash = '765a0aef6c6805d1733e99f53db0e82b'; +(node/*: any*/).hash = 'd2960bba4729b6c3e91e249ea582fec1'; module.exports = node; diff --git a/lib/mutations/__generated__/updatePrReviewCommentMutation.graphql.js b/lib/mutations/__generated__/updatePrReviewCommentMutation.graphql.js new file mode 100644 index 0000000000..31f2d725af --- /dev/null +++ b/lib/mutations/__generated__/updatePrReviewCommentMutation.graphql.js @@ -0,0 +1,147 @@ +/** + * @flow + * @relayHash aab1d07dc9efcbeed502454b63049d1e + */ + +/* eslint-disable */ + +'use strict'; + +/*:: +import type { ConcreteRequest } from 'relay-runtime'; +export type UpdatePullRequestReviewCommentInput = {| + pullRequestReviewCommentId: string, + body: string, + clientMutationId?: ?string, +|}; +export type updatePrReviewCommentMutationVariables = {| + input: UpdatePullRequestReviewCommentInput +|}; +export type updatePrReviewCommentMutationResponse = {| + +updatePullRequestReviewComment: ?{| + +pullRequestReviewComment: ?{| + +id: string, + +lastEditedAt: ?any, + +body: string, + +bodyHTML: any, + |} + |} +|}; +export type updatePrReviewCommentMutation = {| + variables: updatePrReviewCommentMutationVariables, + response: updatePrReviewCommentMutationResponse, +|}; +*/ + + +/* +mutation updatePrReviewCommentMutation( + $input: UpdatePullRequestReviewCommentInput! +) { + updatePullRequestReviewComment(input: $input) { + pullRequestReviewComment { + id + lastEditedAt + body + bodyHTML + } + } +} +*/ + +const node/*: ConcreteRequest*/ = (function(){ +var v0 = [ + { + "kind": "LocalArgument", + "name": "input", + "type": "UpdatePullRequestReviewCommentInput!", + "defaultValue": null + } +], +v1 = [ + { + "kind": "LinkedField", + "alias": null, + "name": "updatePullRequestReviewComment", + "storageKey": null, + "args": [ + { + "kind": "Variable", + "name": "input", + "variableName": "input", + "type": "UpdatePullRequestReviewCommentInput!" + } + ], + "concreteType": "UpdatePullRequestReviewCommentPayload", + "plural": false, + "selections": [ + { + "kind": "LinkedField", + "alias": null, + "name": "pullRequestReviewComment", + "storageKey": null, + "args": null, + "concreteType": "PullRequestReviewComment", + "plural": false, + "selections": [ + { + "kind": "ScalarField", + "alias": null, + "name": "id", + "args": null, + "storageKey": null + }, + { + "kind": "ScalarField", + "alias": null, + "name": "lastEditedAt", + "args": null, + "storageKey": null + }, + { + "kind": "ScalarField", + "alias": null, + "name": "body", + "args": null, + "storageKey": null + }, + { + "kind": "ScalarField", + "alias": null, + "name": "bodyHTML", + "args": null, + "storageKey": null + } + ] + } + ] + } +]; +return { + "kind": "Request", + "fragment": { + "kind": "Fragment", + "name": "updatePrReviewCommentMutation", + "type": "Mutation", + "metadata": null, + "argumentDefinitions": (v0/*: any*/), + "selections": (v1/*: any*/) + }, + "operation": { + "kind": "Operation", + "name": "updatePrReviewCommentMutation", + "argumentDefinitions": (v0/*: any*/), + "selections": (v1/*: any*/) + }, + "params": { + "operationKind": "mutation", + "name": "updatePrReviewCommentMutation", + "id": null, + "text": "mutation updatePrReviewCommentMutation(\n $input: UpdatePullRequestReviewCommentInput!\n) {\n updatePullRequestReviewComment(input: $input) {\n pullRequestReviewComment {\n id\n lastEditedAt\n body\n bodyHTML\n }\n }\n}\n", + "metadata": {} + } +}; +})(); +// prettier-ignore +(node/*: any*/).hash = 'd7b4e823f4604a2b193a1faceb3fcfca'; +module.exports = node; diff --git a/lib/mutations/__generated__/updatePrReviewSummaryMutation.graphql.js b/lib/mutations/__generated__/updatePrReviewSummaryMutation.graphql.js new file mode 100644 index 0000000000..3c2067bcc8 --- /dev/null +++ b/lib/mutations/__generated__/updatePrReviewSummaryMutation.graphql.js @@ -0,0 +1,147 @@ +/** + * @flow + * @relayHash ae10f7769abb8c6656ba8db88412a554 + */ + +/* eslint-disable */ + +'use strict'; + +/*:: +import type { ConcreteRequest } from 'relay-runtime'; +export type UpdatePullRequestReviewInput = {| + pullRequestReviewId: string, + body: string, + clientMutationId?: ?string, +|}; +export type updatePrReviewSummaryMutationVariables = {| + input: UpdatePullRequestReviewInput +|}; +export type updatePrReviewSummaryMutationResponse = {| + +updatePullRequestReview: ?{| + +pullRequestReview: ?{| + +id: string, + +lastEditedAt: ?any, + +body: string, + +bodyHTML: any, + |} + |} +|}; +export type updatePrReviewSummaryMutation = {| + variables: updatePrReviewSummaryMutationVariables, + response: updatePrReviewSummaryMutationResponse, +|}; +*/ + + +/* +mutation updatePrReviewSummaryMutation( + $input: UpdatePullRequestReviewInput! +) { + updatePullRequestReview(input: $input) { + pullRequestReview { + id + lastEditedAt + body + bodyHTML + } + } +} +*/ + +const node/*: ConcreteRequest*/ = (function(){ +var v0 = [ + { + "kind": "LocalArgument", + "name": "input", + "type": "UpdatePullRequestReviewInput!", + "defaultValue": null + } +], +v1 = [ + { + "kind": "LinkedField", + "alias": null, + "name": "updatePullRequestReview", + "storageKey": null, + "args": [ + { + "kind": "Variable", + "name": "input", + "variableName": "input", + "type": "UpdatePullRequestReviewInput!" + } + ], + "concreteType": "UpdatePullRequestReviewPayload", + "plural": false, + "selections": [ + { + "kind": "LinkedField", + "alias": null, + "name": "pullRequestReview", + "storageKey": null, + "args": null, + "concreteType": "PullRequestReview", + "plural": false, + "selections": [ + { + "kind": "ScalarField", + "alias": null, + "name": "id", + "args": null, + "storageKey": null + }, + { + "kind": "ScalarField", + "alias": null, + "name": "lastEditedAt", + "args": null, + "storageKey": null + }, + { + "kind": "ScalarField", + "alias": null, + "name": "body", + "args": null, + "storageKey": null + }, + { + "kind": "ScalarField", + "alias": null, + "name": "bodyHTML", + "args": null, + "storageKey": null + } + ] + } + ] + } +]; +return { + "kind": "Request", + "fragment": { + "kind": "Fragment", + "name": "updatePrReviewSummaryMutation", + "type": "Mutation", + "metadata": null, + "argumentDefinitions": (v0/*: any*/), + "selections": (v1/*: any*/) + }, + "operation": { + "kind": "Operation", + "name": "updatePrReviewSummaryMutation", + "argumentDefinitions": (v0/*: any*/), + "selections": (v1/*: any*/) + }, + "params": { + "operationKind": "mutation", + "name": "updatePrReviewSummaryMutation", + "id": null, + "text": "mutation updatePrReviewSummaryMutation(\n $input: UpdatePullRequestReviewInput!\n) {\n updatePullRequestReview(input: $input) {\n pullRequestReview {\n id\n lastEditedAt\n body\n bodyHTML\n }\n }\n}\n", + "metadata": {} + } +}; +})(); +// prettier-ignore +(node/*: any*/).hash = 'ce6fa7b9b5a5709f8cc8001aa7ba8a15'; +module.exports = node; diff --git a/lib/mutations/add-pr-review-comment.js b/lib/mutations/add-pr-review-comment.js index 959013c127..e27db2642f 100644 --- a/lib/mutations/add-pr-review-comment.js +++ b/lib/mutations/add-pr-review-comment.js @@ -4,6 +4,8 @@ import {commitMutation, graphql} from 'react-relay'; import {ConnectionHandler} from 'relay-runtime'; import moment from 'moment'; +import {renderMarkdown} from '../helpers'; + const mutation = graphql` mutation addPrReviewCommentMutation($input: AddPullRequestReviewCommentInput!) { addPullRequestReviewComment(input: $input) { @@ -14,9 +16,11 @@ const mutation = graphql` avatarUrl login } + body bodyHTML isMinimized viewerCanReact + viewerCanUpdate path position createdAt @@ -57,10 +61,12 @@ export default (environment, {body, inReplyTo, reviewID, threadID, viewerID, pat const id = `add-pr-review-comment:comment:${placeholderID++}`; const comment = store.create(id, 'PullRequestReviewComment'); comment.setValue(id, 'id'); - comment.setValue(`${body}`, 'bodyHTML'); + comment.setValue(body, 'body'); + comment.setValue(renderMarkdown(body), 'bodyHTML'); comment.setValue(false, 'isMinimized'); comment.setValue(false, 'viewerCanMinimize'); comment.setValue(false, 'viewerCanReact'); + comment.setValue(false, 'viewerCanUpdate'); comment.setValue(moment().toISOString(), 'createdAt'); comment.setValue(null, 'lastEditedAt'); comment.setValue('NONE', 'authorAssociation'); diff --git a/lib/mutations/add-pr-review.js b/lib/mutations/add-pr-review.js index 41631f4c6a..44ad116dac 100644 --- a/lib/mutations/add-pr-review.js +++ b/lib/mutations/add-pr-review.js @@ -3,15 +3,20 @@ import {commitMutation, graphql} from 'react-relay'; import {ConnectionHandler} from 'relay-runtime'; +import {renderMarkdown} from '../helpers'; + const mutation = graphql` mutation addPrReviewMutation($input: AddPullRequestReviewInput!) { addPullRequestReview(input: $input) { reviewEdge { node { id + body bodyHTML state submittedAt + viewerCanReact + viewerCanUpdate author { login avatarUrl @@ -54,8 +59,11 @@ export default (environment, {body, event, pullRequestID, viewerID}) => { const review = store.create(id, 'PullRequestReview'); review.setValue(id, 'id'); review.setValue('PENDING', 'state'); - review.setValue(body || '...', 'bodyHTML'); + review.setValue(body, 'body'); + review.setValue(body ? renderMarkdown(body) : '...', 'bodyHTML'); review.setLinkedRecords([], 'reactionGroups'); + review.setValue(false, 'viewerCanReact'); + review.setValue(false, 'viewerCanUpdate'); let author; if (viewerID) { diff --git a/lib/mutations/update-pr-review-comment.js b/lib/mutations/update-pr-review-comment.js new file mode 100644 index 0000000000..72ab054325 --- /dev/null +++ b/lib/mutations/update-pr-review-comment.js @@ -0,0 +1,52 @@ +/* istanbul ignore file */ + +import {commitMutation, graphql} from 'react-relay'; +import moment from 'moment'; + +import {renderMarkdown} from '../helpers'; + +const mutation = graphql` + mutation updatePrReviewCommentMutation($input: UpdatePullRequestReviewCommentInput!) { + updatePullRequestReviewComment(input: $input) { + pullRequestReviewComment { + id + lastEditedAt + body + bodyHTML + } + } + } +`; + +export default (environment, {commentId, commentBody}) => { + const variables = { + input: { + pullRequestReviewCommentId: commentId, + body: commentBody, + }, + }; + + const optimisticResponse = { + updatePullRequestReviewComment: { + pullRequestReviewComment: { + id: commentId, + lastEditedAt: moment().toISOString(), + body: commentBody, + bodyHTML: renderMarkdown(commentBody), + }, + }, + }; + + return new Promise((resolve, reject) => { + commitMutation( + environment, + { + mutation, + variables, + optimisticResponse, + onCompleted: resolve, + onError: reject, + }, + ); + }); +}; diff --git a/lib/mutations/update-pr-review-summary.js b/lib/mutations/update-pr-review-summary.js new file mode 100644 index 0000000000..b8740201cd --- /dev/null +++ b/lib/mutations/update-pr-review-summary.js @@ -0,0 +1,52 @@ +/* istanbul ignore file */ + +import {commitMutation, graphql} from 'react-relay'; +import moment from 'moment'; + +import {renderMarkdown} from '../helpers'; + +const mutation = graphql` + mutation updatePrReviewSummaryMutation($input: UpdatePullRequestReviewInput!) { + updatePullRequestReview(input: $input) { + pullRequestReview { + id + lastEditedAt + body + bodyHTML + } + } + } +`; + +export default (environment, {reviewId, reviewBody}) => { + const variables = { + input: { + pullRequestReviewId: reviewId, + body: reviewBody, + }, + }; + + const optimisticResponse = { + updatePullRequestReview: { + pullRequestReview: { + id: reviewId, + lastEditedAt: moment().toISOString(), + body: reviewBody, + bodyHTML: renderMarkdown(reviewBody), + }, + }, + }; + + return new Promise((resolve, reject) => { + commitMutation( + environment, + { + mutation, + variables, + optimisticResponse, + onCompleted: resolve, + onError: reject, + }, + ); + }); +}; diff --git a/lib/views/actionable-review-view.js b/lib/views/actionable-review-view.js new file mode 100644 index 0000000000..aa92696ed1 --- /dev/null +++ b/lib/views/actionable-review-view.js @@ -0,0 +1,175 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import cx from 'classnames'; +import {remote, shell} from 'electron'; +import {TextBuffer} from 'atom'; +import AtomTextEditor from '../atom/atom-text-editor'; +import RefHolder from '../models/ref-holder'; +import {addEvent} from '../reporter-proxy'; +import Commands, {Command} from '../atom/commands'; +const {Menu, MenuItem} = remote; + +export default class ActionableReviewView extends React.Component { + static propTypes = { + // Model + originalContent: PropTypes.object.isRequired, + isPosting: PropTypes.bool, + + // Atom environment + commands: PropTypes.object.isRequired, + confirm: PropTypes.func.isRequired, + + // Action methods + contentUpdater: PropTypes.func.isRequired, + createMenu: PropTypes.func, + createMenuItem: PropTypes.func, + + // Render prop + render: PropTypes.func.isRequired, + } + + static defaultProps = { + createMenu: /* istanbul ignore next */ () => new Menu(), + createMenuItem: /* istanbul ignore next */ (...args) => new MenuItem(...args), + } + + constructor(props) { + super(props); + this.refEditor = new RefHolder(); + this.refRoot = new RefHolder(); + this.buffer = new TextBuffer(); + this.state = {editing: false}; + } + + componentDidUpdate(prevProps, prevState) { + if (this.state.editing && !prevState.editing) { + this.buffer.setText(this.props.originalContent.body); + this.refEditor.map(e => e.getElement().focus()); + } + } + + render() { + return this.state.editing ? this.renderEditor() : this.props.render(this.showActionsMenu); + } + + renderEditor() { + const className = cx('github-Review-editable', {'github-Review-editable--disabled': this.props.isPosting}); + + return ( +
+ {this.renderCommands()} + + +
+ ); + } + + renderCommands() { + return ( + + + + + ); + } + + onCancel = () => { + if (this.buffer.getText() === this.props.originalContent.body) { + this.setState({editing: false}); + } else { + const choice = this.props.confirm({ + message: 'Are you sure you want to discard your unsaved changes?', + buttons: ['OK', 'Cancel'], + }); + if (choice === 0) { + this.setState({editing: false}); + } + } + } + + onSubmitUpdate = async () => { + const text = this.buffer.getText(); + if (text === this.props.originalContent.body || text === '') { + this.setState({editing: false}); + return; + } + + try { + await this.props.contentUpdater(this.props.originalContent.id, text); + this.setState({editing: false}); + } catch (e) { + this.buffer.setText(text); + } + } + + reportAbuse = (commentUrl, author) => { + return new Promise((resolve, reject) => { + const url = 'https://github.com/contact/report-content?report=' + + `${encodeURIComponent(author)}&content_url=${encodeURIComponent(commentUrl)}`; + shell.openExternal(url, {}, err => { + if (err) { reject(err); } else { + resolve(); + addEvent('report-abuse', {package: 'github', component: this.constructor.name}); + } + }); + }); + } + + openOnGitHub = url => { + return new Promise((resolve, reject) => { + shell.openExternal(url, {}, err => { + if (err) { reject(err); } else { + resolve(); + addEvent('open-comment-in-browser', {package: 'github', component: this.constructor.name}); + } + }); + }); + } + + showActionsMenu = (event, content, author) => { + event.preventDefault(); + + const menu = this.props.createMenu(); + + if (content.viewerCanUpdate) { + menu.append(this.props.createMenuItem({ + label: 'Edit', + click: () => this.setState({editing: true}), + })); + } + + menu.append(this.props.createMenuItem({ + label: 'Open on GitHub', + click: () => this.openOnGitHub(content.url), + })); + + menu.append(this.props.createMenuItem({ + label: 'Report abuse', + click: () => this.reportAbuse(content.url, author.login), + })); + + menu.popup(remote.getCurrentWindow()); + } +} diff --git a/lib/views/review-comment-view.js b/lib/views/review-comment-view.js new file mode 100644 index 0000000000..d68569857e --- /dev/null +++ b/lib/views/review-comment-view.js @@ -0,0 +1,108 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import cx from 'classnames'; + +import RefHolder from '../models/ref-holder'; +import Timeago from './timeago'; +import Octicon from '../atom/octicon'; +import GithubDotcomMarkdown from './github-dotcom-markdown'; +import EmojiReactionsController from '../controllers/emoji-reactions-controller'; +import {GHOST_USER} from '../helpers'; +import ActionableReviewView from './actionable-review-view'; + +export default class ReviewCommentView extends React.Component { + static propTypes = { + // Model + comment: PropTypes.object.isRequired, + isPosting: PropTypes.bool.isRequired, + + // Atom environment + confirm: PropTypes.func.isRequired, + tooltips: PropTypes.object.isRequired, + commands: PropTypes.object.isRequired, + + // Render props + renderEditedLink: PropTypes.func.isRequired, + renderAuthorAssociation: PropTypes.func.isRequired, + + // Action methods + openIssueish: PropTypes.func.isRequired, + openIssueishLinkInNewTab: PropTypes.func.isRequired, + updateComment: PropTypes.func.isRequired, + reportRelayError: PropTypes.func.isRequired, + } + + constructor(props) { + super(props); + this.refEditor = new RefHolder(); + } + + render() { + return ( + ); + } + + renderComment = showActionsMenu => { + const comment = this.props.comment; + + if (comment.isMinimized) { + return ( +
+ + This comment was hidden +
+ ); + } + + const commentClass = cx('github-Review-comment', {'github-Review-comment--pending': comment.state === 'PENDING'}); + const author = comment.author || GHOST_USER; + + return ( +
+
+
+ {author.login} + + {author.login} + + + + + {this.props.renderEditedLink(comment)} + {this.props.renderAuthorAssociation(comment)} + {comment.state === 'PENDING' && ( + pending + )} +
+ showActionsMenu(event, comment, author)} + /> +
+
+ + +
+
+ ); + } + +} diff --git a/lib/views/reviews-view.js b/lib/views/reviews-view.js index 576cdde62f..3cad2e26ba 100644 --- a/lib/views/reviews-view.js +++ b/lib/views/reviews-view.js @@ -13,9 +13,11 @@ import EmojiReactionsController from '../controllers/emoji-reactions-controller' import {checkoutStates} from '../controllers/pr-checkout-controller'; import GithubDotcomMarkdown from './github-dotcom-markdown'; import PatchPreviewView from './patch-preview-view'; +import ReviewCommentView from './review-comment-view'; +import ActionableReviewView from './actionable-review-view'; import CheckoutButton from './checkout-button'; -import Timeago from './timeago'; import Octicon from '../atom/octicon'; +import Timeago from './timeago'; import RefHolder from '../models/ref-holder'; import {toNativePathSep, GHOST_USER} from '../helpers'; import {addEvent} from '../reporter-proxy'; @@ -78,6 +80,7 @@ export default class ReviewsView extends React.Component { config: PropTypes.object.isRequired, commands: PropTypes.object.isRequired, tooltips: PropTypes.object.isRequired, + confirm: PropTypes.func.isRequired, // Action methods openFile: PropTypes.func.isRequired, @@ -95,6 +98,8 @@ export default class ReviewsView extends React.Component { resolveThread: PropTypes.func.isRequired, unresolveThread: PropTypes.func.isRequired, addSingleComment: PropTypes.func.isRequired, + updateComment: PropTypes.func.isRequired, + updateSummary: PropTypes.func.isRequired, reportRelayError: PropTypes.func.isRequired, } @@ -265,31 +270,48 @@ export default class ReviewsView extends React.Component { return (
-
-
- - {author.login} - {author.login} - {copy} - {this.renderEditedLink(review)} - {this.renderAuthorAssociation(review)} -
- -
-
- - -
+ { + return ( + +
+
+ + {author.login} + {author.login} + {copy} + {this.renderEditedLink(review)} + {this.renderAuthorAssociation(review)} +
+ + showActionsMenu(event, review, author)} + /> +
+
+ + +
+
+ ); + }} + />
); } @@ -459,7 +481,24 @@ export default class ReviewsView extends React.Component {
- {comments.map(this.renderComment)} + {comments.map(comment => { + return ( + + ); + })}
{ - if (comment.isMinimized) { - return ( -
- - This comment was hidden -
- ); - } - - const commentClass = cx('github-Review-comment', {'github-Review-comment--pending': comment.state === 'PENDING'}); - const author = comment.author || GHOST_USER; - - return ( -
-
-
- {author.login} - - {author.login} - - - - - {this.renderEditedLink(comment)} - {this.renderAuthorAssociation(comment)} - {comment.state === 'PENDING' && ( - pending - )} -
- - - -
-
- - -
-
- ); - } - openFile = evt => { if (!this.props.checkoutOp.isEnabled()) { const target = evt.currentTarget; diff --git a/styles/review.less b/styles/review.less index 2911a708cd..86d3744724 100644 --- a/styles/review.less +++ b/styles/review.less @@ -15,6 +15,13 @@ overflow-y: hidden; height: 100%; + atom-text-editor { + padding: @component-padding/2; + border-top: 1px solid @base-border-color; + border-bottom: 1px solid @base-border-color; + border-radius: @component-border-radius; + } + // Top Header ------------------------------------------ &-topHeader { @@ -333,12 +340,6 @@ // Diff ------------------ - atom-text-editor { - padding: @component-padding/2; - border-top: 1px solid @base-border-color; - border-bottom: 1px solid @base-border-color; - } - &-diffLine { padding: 0 @component-padding/2; line-height: 1.75; @@ -412,10 +413,15 @@ font-weight: 500; } - &-timeAgo, &-reportAbuseLink, &-edited { + &-timeAgo, &-actionsMenu, &-edited { color: @text-color-subtle; } + &-actionsMenu::before { + margin-right: 0; + margin-left: @component-padding/2; + } + &-pendingBadge { margin-left: @component-padding; } @@ -432,7 +438,7 @@ } } - &-reply { + &-reply, &-editable { margin-top: @component-padding; atom-text-editor { @@ -458,6 +464,16 @@ padding: 0 2*@component-padding; } + &-editable-footer { + margin: @component-padding/2 0 @component-padding 0; + display: flex; + justify-content: flex-end; + + .btn { + margin-left: @component-padding/2; + } + } + // Footer ------------------ diff --git a/test/builder/graphql/mutations.js b/test/builder/graphql/mutations.js index 3bf3455424..b0332c6f83 100644 --- a/test/builder/graphql/mutations.js +++ b/test/builder/graphql/mutations.js @@ -19,10 +19,18 @@ export const AddPullRequestReviewCommentPayloadBuilder = createSpecBuilderClass( commentEdge: {linked: CommentEdgeBuilder}, }); +export const UpdatePullRequestReviewCommentPayloadBuilder = createSpecBuilderClass('UpdatePullRequestReviewCommentPayload', { + pullRequestReviewComment: {linked: CommentBuilder}, +}); + export const SubmitPullRequestReviewPayloadBuilder = createSpecBuilderClass('SubmitPullRequestReviewPayload', { pullRequestReview: {linked: ReviewBuilder}, }); +export const UpdatePullRequestReviewPayloadBuilder = createSpecBuilderClass('UpdatePullRequestReviewPayload', { + pullRequestReview: {linked: ReviewBuilder}, +}); + export const DeletePullRequestReviewPayloadBuilder = createSpecBuilderClass('DeletePullRequestReviewPayload', { pullRequestReview: {linked: ReviewBuilder, nullable: true}, }); diff --git a/test/builder/graphql/pr.js b/test/builder/graphql/pr.js index fc272e1996..5752169ab8 100644 --- a/test/builder/graphql/pr.js +++ b/test/builder/graphql/pr.js @@ -34,6 +34,7 @@ export const CommentBuilder = createSpecBuilderClass('PullRequestReviewComment', url: {default: 'https://github.com/atom/github/pull/1829/files#r242224689'}, createdAt: {default: '2018-12-27T17:51:17Z'}, lastEditedAt: {default: null, nullable: true}, + body: {default: 'Lorem ipsum dolor sit amet, te urbanitas appellantur est.'}, bodyHTML: {default: 'Lorem ipsum dolor sit amet, te urbanitas appellantur est.'}, replyTo: {default: null, nullable: true}, isMinimized: {default: false}, @@ -41,6 +42,7 @@ export const CommentBuilder = createSpecBuilderClass('PullRequestReviewComment', state: {default: 'SUBMITTED'}, viewerCanReact: {default: true}, viewerCanMinimize: {default: true}, + viewerCanUpdate: {default: true}, authorAssociation: {default: 'NONE'}, }, 'Node & Comment & Deletable & Updatable & UpdatableComment & Reactable & RepositoryNode'); @@ -62,11 +64,13 @@ export const ReviewBuilder = createSpecBuilderClass('PullRequestReview', { submittedAt: {default: '2018-12-28T20:40:55Z'}, lastEditedAt: {default: null, nullable: true}, url: {default: 'https://github.com/atom/github/pull/1995#pullrequestreview-223120384'}, + body: {default: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit'}, bodyHTML: {default: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit'}, state: {default: 'COMMENTED'}, author: {linked: UserBuilder, default: null, nullable: true}, comments: {linked: CommentConnectionBuilder}, viewerCanReact: {default: true}, + viewerCanUpdate: {default: true}, reactionGroups: {linked: ReactionGroupBuilder, plural: true, singularName: 'reactionGroup'}, authorAssociation: {default: 'NONE'}, }, 'Node & Comment & Deletable & Updatable & UpdatableComment & Reactable & RepositoryNode'); diff --git a/test/builder/graphql/query.js b/test/builder/graphql/query.js index 5d65773d1f..e24fdb3348 100644 --- a/test/builder/graphql/query.js +++ b/test/builder/graphql/query.js @@ -8,7 +8,9 @@ import {PullRequestBuilder} from './pr'; import { AddPullRequestReviewPayloadBuilder, AddPullRequestReviewCommentPayloadBuilder, + UpdatePullRequestReviewCommentPayloadBuilder, SubmitPullRequestReviewPayloadBuilder, + UpdatePullRequestReviewPayloadBuilder, DeletePullRequestReviewPayloadBuilder, ResolveReviewThreadPayloadBuilder, UnresolveReviewThreadPayloadBuilder, @@ -46,9 +48,11 @@ const QueryBuilder = createSpecBuilderClass('Query', { // Mutations addPullRequestReview: {linked: AddPullRequestReviewPayloadBuilder}, - addPullRequestReviewComment: {linked: AddPullRequestReviewCommentPayloadBuilder}, submitPullRequestReview: {linked: SubmitPullRequestReviewPayloadBuilder}, + updatePullRequestReview: {linked: UpdatePullRequestReviewPayloadBuilder}, deletePullRequestReview: {linked: DeletePullRequestReviewPayloadBuilder}, + addPullRequestReviewComment: {linked: AddPullRequestReviewCommentPayloadBuilder}, + updatePullRequestReviewComment: {linked: UpdatePullRequestReviewCommentPayloadBuilder}, resolveReviewThread: {linked: ResolveReviewThreadPayloadBuilder}, unresolveReviewThread: {linked: UnresolveReviewThreadPayloadBuilder}, addReaction: {linked: AddReactionPayloadBuilder}, diff --git a/test/containers/reviews-container.test.js b/test/containers/reviews-container.test.js index f7ec0d53d8..903922ec00 100644 --- a/test/containers/reviews-container.test.js +++ b/test/containers/reviews-container.test.js @@ -65,6 +65,8 @@ describe('ReviewsContainer', function() { config: atomEnv.config, commands: atomEnv.commands, tooltips: atomEnv.tooltips, + confirm: () => {}, + reportRelayError: () => {}, ...override, diff --git a/test/controllers/reviews-controller.test.js b/test/controllers/reviews-controller.test.js index e9c3b3c6a9..cfd6a4c65b 100644 --- a/test/controllers/reviews-controller.test.js +++ b/test/controllers/reviews-controller.test.js @@ -27,6 +27,8 @@ import deletePrReviewMutation from '../../lib/mutations/__generated__/deletePrRe import submitPrReviewMutation from '../../lib/mutations/__generated__/submitPrReviewMutation.graphql'; import resolveThreadMutation from '../../lib/mutations/__generated__/resolveReviewThreadMutation.graphql'; import unresolveThreadMutation from '../../lib/mutations/__generated__/unresolveReviewThreadMutation.graphql'; +import updateReviewCommentMutation from '../../lib/mutations/__generated__/updatePrReviewCommentMutation.graphql'; +import updatePrReviewMutation from '../../lib/mutations/__generated__/updatePrReviewSummaryMutation.graphql'; describe('ReviewsController', function() { let atomEnv, relayEnv, localRepository, noop, clock; @@ -79,6 +81,7 @@ describe('ReviewsController', function() { config: atomEnv.config, commands: atomEnv.commands, tooltips: atomEnv.tooltips, + confirm: () => {}, reportRelayError: () => {}, ...override, @@ -130,6 +133,50 @@ describe('ReviewsController', function() { assert.isNull(opWrapper.find(ReviewsView).prop('scrollToThreadID')); }); + it('does not unset a different scrollToThreadID if two highlight actions collide', function() { + clock = sinon.useFakeTimers(); + const wrapper = shallow(buildApp()); + let opWrapper = wrapper.find(PullRequestCheckoutController).renderProp('children')(noop); + + assert.deepEqual(opWrapper.find(ReviewsView).prop('threadIDsOpen'), new Set([])); + wrapper.setProps({initThreadID: 'hang-by-a-thread'}); + opWrapper = wrapper.find(PullRequestCheckoutController).renderProp('children')(noop); + + assert.deepEqual( + Array.from(opWrapper.find(ReviewsView).prop('threadIDsOpen')), + ['hang-by-a-thread'], + ); + assert.deepEqual( + Array.from(opWrapper.find(ReviewsView).prop('highlightedThreadIDs')), + ['hang-by-a-thread'], + ); + assert.isTrue(opWrapper.find(ReviewsView).prop('commentSectionOpen')); + assert.strictEqual(opWrapper.find(ReviewsView).prop('scrollToThreadID'), 'hang-by-a-thread'); + + clock.tick(1000); + wrapper.setProps({initThreadID: 'caught-in-a-web'}); + opWrapper = wrapper.find(PullRequestCheckoutController).renderProp('children')(noop); + + assert.deepEqual( + Array.from(opWrapper.find(ReviewsView).prop('threadIDsOpen')), + ['hang-by-a-thread', 'caught-in-a-web'], + ); + assert.deepEqual( + Array.from(opWrapper.find(ReviewsView).prop('highlightedThreadIDs')), + ['hang-by-a-thread', 'caught-in-a-web'], + ); + assert.isTrue(opWrapper.find(ReviewsView).prop('commentSectionOpen')); + assert.strictEqual(opWrapper.find(ReviewsView).prop('scrollToThreadID'), 'caught-in-a-web'); + + clock.tick(1000); + opWrapper = wrapper.find(PullRequestCheckoutController).renderProp('children')(noop); + assert.deepEqual( + Array.from(opWrapper.find(ReviewsView).prop('highlightedThreadIDs')), + ['caught-in-a-web'], + ); + assert.strictEqual(opWrapper.find(ReviewsView).prop('scrollToThreadID'), 'caught-in-a-web'); + }); + describe('openIssueish', function() { it('opens an IssueishDetailItem for a different issueish', async function() { const wrapper = shallow(buildApp({ @@ -603,6 +650,98 @@ describe('ReviewsController', function() { }); }); + describe('editing review comments', function() { + it('calls the review comment update mutation and increments a metric', async function() { + const reportRelayError = sinon.spy(); + sinon.stub(reporterProxy, 'addEvent'); + + expectRelayQuery({ + name: updateReviewCommentMutation.operation.name, + variables: { + input: {pullRequestReviewCommentId: 'comment-0', body: 'new text'}, + }, + }, op => relayResponseBuilder(op).build()).resolve(); + + const wrapper = shallow(buildApp({reportRelayError})) + .find(PullRequestCheckoutController) + .renderProp('children')(noop); + + await wrapper.find(ReviewsView).prop('updateComment')('comment-0', 'new text'); + + assert.isFalse(reportRelayError.called); + assert.isTrue(reporterProxy.addEvent.calledWith('update-review-comment', {package: 'github'})); + }); + + it('creates a notification and and re-throws the error if the comment cannot be updated', async function() { + const reportRelayError = sinon.spy(); + sinon.stub(reporterProxy, 'addEvent'); + + expectRelayQuery({ + name: updateReviewCommentMutation.operation.name, + variables: { + input: {pullRequestReviewCommentId: 'comment-0', body: 'new text'}, + }, + }, op => relayResponseBuilder(op).addError('not right now').build()).resolve(); + + const wrapper = shallow(buildApp({reportRelayError})) + .find(PullRequestCheckoutController) + .renderProp('children')(noop); + + await assert.isRejected( + wrapper.find(ReviewsView).prop('updateComment')('comment-0', 'new text'), + ); + + assert.isTrue(reportRelayError.calledWith('Unable to update comment')); + assert.isFalse(reporterProxy.addEvent.called); + }); + }); + + describe('editing review summaries', function() { + it('calls the review summary update mutation and increments a metric', async function() { + const reportRelayError = sinon.spy(); + sinon.stub(reporterProxy, 'addEvent'); + + expectRelayQuery({ + name: updatePrReviewMutation.operation.name, + variables: { + input: {pullRequestReviewId: 'review-0', body: 'stuff'}, + }, + }, op => relayResponseBuilder(op).build()).resolve(); + + const wrapper = shallow(buildApp({reportRelayError})) + .find(PullRequestCheckoutController) + .renderProp('children')(noop); + + await wrapper.find(ReviewsView).prop('updateSummary')('review-0', 'stuff'); + + assert.isFalse(reportRelayError.called); + assert.isTrue(reporterProxy.addEvent.calledWith('update-review-summary', {package: 'github'})); + }); + + it('creates a notification and and re-throws the error if the summary cannot be updated', async function() { + const reportRelayError = sinon.spy(); + sinon.stub(reporterProxy, 'addEvent'); + + expectRelayQuery({ + name: updatePrReviewMutation.operation.name, + variables: { + input: {pullRequestReviewId: 'review-0', body: 'stuff'}, + }, + }, op => relayResponseBuilder(op).addError('not right now').build()).resolve(); + + const wrapper = shallow(buildApp({reportRelayError})) + .find(PullRequestCheckoutController) + .renderProp('children')(noop); + + await assert.isRejected( + wrapper.find(ReviewsView).prop('updateSummary')('review-0', 'stuff'), + ); + + assert.isTrue(reportRelayError.calledWith('Unable to update review summary')); + assert.isFalse(reporterProxy.addEvent.called); + }); + }); + describe('action methods', function() { let wrapper, openFilesTab, onTabSelected; diff --git a/test/views/actionable-review-view.test.js b/test/views/actionable-review-view.test.js new file mode 100644 index 0000000000..0c5474cec0 --- /dev/null +++ b/test/views/actionable-review-view.test.js @@ -0,0 +1,321 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import {shell} from 'electron'; + +import ActionableReviewView from '../../lib/views/actionable-review-view'; +import * as reporterProxy from '../../lib/reporter-proxy'; + +describe('ActionableReviewView', function() { + let atomEnv, mockEvent, mockMenu; + + beforeEach(function() { + atomEnv = global.buildAtomEnvironment(); + + mockEvent = { + preventDefault: sinon.spy(), + }; + + mockMenu = { + append: sinon.spy(), + popup: sinon.spy(), + }; + + sinon.stub(reporterProxy, 'addEvent'); + }); + + afterEach(function() { + atomEnv.destroy(); + }); + + function buildApp(override = {}) { + const props = { + originalContent: {body: 'original'}, + isPosting: false, + commands: atomEnv.commands, + confirm: () => {}, + contentUpdater: () => {}, + render: () =>
, + createMenu: () => mockMenu, + createMenuItem: opts => opts, + ...override, + }; + + return ; + } + + describe('out of editing mode', function() { + it('calls its render prop with a menu-creation function', function() { + const render = sinon.stub().returns(
); + const wrapper = shallow(buildApp({render})); + + assert.isTrue(wrapper.exists('.done')); + + const [showActionsMenu] = render.lastCall.args; + showActionsMenu(mockEvent, {}, {}); + assert.isTrue(mockEvent.preventDefault.called); + assert.isTrue(mockMenu.popup.called); + }); + + describe('the menu', function() { + function triggerMenu(content, author) { + const items = []; + + const wrapper = shallow(buildApp({ + createMenuItem: itemOpts => items.push(itemOpts), + render: showActionsMenu => showActionsMenu(mockEvent, content, author), + })); + + return {items, wrapper}; + } + + it("opens the content object's URL with 'Open on GitHub'", async function() { + sinon.stub(shell, 'openExternal').callsArg(2); + + const item = triggerMenu({url: 'https://github.com'}, {}).items.find(i => i.label === 'Open on GitHub'); + await item.click(); + + assert.isTrue(shell.openExternal.calledWith('https://github.com', {})); + assert.isTrue(reporterProxy.addEvent.calledWith('open-comment-in-browser')); + }); + + it("rejects the promise when 'Open on GitHub' fails", async function() { + sinon.stub(shell, 'openExternal').callsArgWith(2, new Error("I don't feel like it")); + + const item = triggerMenu({url: 'https://github.com'}, {}).items.find(i => i.label === 'Open on GitHub'); + await assert.isRejected(item.click()); + assert.isFalse(reporterProxy.addEvent.called); + }); + + it('opens a prepopulated abuse-reporting link with "Report abuse"', async function() { + sinon.stub(shell, 'openExternal').callsArg(2); + + const item = triggerMenu({url: 'https://github.com/a/b'}, {login: 'tyrion'}) + .items.find(i => i.label === 'Report abuse'); + await item.click(); + + assert.isTrue(shell.openExternal.calledWith( + 'https://github.com/contact/report-content?report=tyrion&content_url=https%3A%2F%2Fgithub.com%2Fa%2Fb', + {}, + )); + assert.isTrue(reporterProxy.addEvent.calledWith('report-abuse')); + }); + + it("rejects the promise when 'Report abuse' fails", async function() { + sinon.stub(shell, 'openExternal').callsArgWith(2, new Error('nah')); + + const item = triggerMenu({url: 'https://github.com/a/b'}, {login: 'tyrion'}) + .items.find(i => i.label === 'Report abuse'); + await assert.isRejected(item.click()); + assert.isFalse(reporterProxy.addEvent.called); + }); + + it('includes an "edit" item only if the content is editable', function() { + assert.isTrue(triggerMenu({viewerCanUpdate: true}, {}).items.some(item => item.label === 'Edit')); + assert.isFalse(triggerMenu({viewerCanUpdate: false}, {}).items.some(item => item.label === 'Edit')); + }); + + it('enters the editing state if the "edit" item is chosen', function() { + const {items, wrapper} = triggerMenu({viewerCanUpdate: true}, {}); + assert.isFalse(wrapper.exists('.github-Review-editable')); + + items.find(i => i.label === 'Edit').click(); + wrapper.update(); + assert.isTrue(wrapper.exists('.github-Review-editable')); + }); + }); + }); + + describe('in editing mode', function() { + let mockEditor, mockEditorElement; + + beforeEach(function() { + mockEditorElement = {focus: sinon.spy()}; + mockEditor = {getElement: () => mockEditorElement}; + }); + + function shallowEditMode(override = {}) { + let editCallback; + const wrapper = shallow(buildApp({ + ...override, + render: showActionsMenu => { + showActionsMenu(mockEvent, {viewerCanUpdate: true}, {}); + if (override.render) { + return override.render(); + } else { + return
; + } + }, + createMenuItem: opts => { + if (opts.label === 'Edit') { + editCallback = opts.click; + } + }, + })); + + wrapper.instance().refEditor.setter(mockEditor); + + editCallback(); + return wrapper.update(); + } + + it('displays a focused editor prepopulated with the original content body and control buttons', function() { + const wrapper = shallowEditMode({ + originalContent: {body: 'this is what it said before'}, + }); + + const editor = wrapper.find('AtomTextEditor'); + assert.strictEqual(editor.prop('buffer').getText(), 'this is what it said before'); + assert.isFalse(editor.prop('readOnly')); + + assert.isTrue(mockEditorElement.focus.called); + + assert.isFalse(wrapper.find('.github-Review-editableCancelButton').prop('disabled')); + assert.isFalse(wrapper.find('.github-Review-updateCommentButton').prop('disabled')); + }); + + it('does not repopulate the buffer when the edit state has not changed', function() { + const wrapper = shallowEditMode({ + originalContent: {body: 'this is what it said before'}, + }); + + assert.strictEqual( + wrapper.find('AtomTextEditor').prop('buffer').getText(), + 'this is what it said before', + ); + assert.strictEqual(mockEditorElement.focus.callCount, 1); + + wrapper.setProps({originalContent: {body: 'nope'}}); + + assert.strictEqual( + wrapper.find('AtomTextEditor').prop('buffer').getText(), + 'this is what it said before', + ); + assert.strictEqual(mockEditorElement.focus.callCount, 1); + }); + + it('disables the editor and buttons while posting is in progress', function() { + const wrapper = shallowEditMode({isPosting: true}); + + assert.isTrue(wrapper.exists('.github-Review-editable--disabled')); + assert.isTrue(wrapper.find('AtomTextEditor').prop('readOnly')); + assert.isTrue(wrapper.find('.github-Review-editableCancelButton').prop('disabled')); + assert.isTrue(wrapper.find('.github-Review-updateCommentButton').prop('disabled')); + }); + + describe('when the submit button is clicked', function() { + it('does nothing and exits edit mode when the buffer is unchanged', async function() { + const contentUpdater = sinon.stub().resolves(); + + const wrapper = shallowEditMode({ + originalContent: {id: 'id-0', body: 'original'}, + contentUpdater, + render: () =>
, + }); + + await wrapper.find('.github-Review-updateCommentButton').prop('onClick')(); + assert.isFalse(contentUpdater.called); + assert.isTrue(wrapper.exists('.non-editable')); + }); + + it('does nothing and exits edit mode when the buffer is empty', async function() { + const contentUpdater = sinon.stub().resolves(); + + const wrapper = shallowEditMode({ + originalContent: {id: 'id-0', body: 'original'}, + contentUpdater, + render: () =>
, + }); + + wrapper.find('AtomTextEditor').prop('buffer').setText(''); + await wrapper.find('.github-Review-updateCommentButton').prop('onClick')(); + assert.isFalse(contentUpdater.called); + assert.isTrue(wrapper.exists('.non-editable')); + }); + + it('calls the contentUpdater function and exits edit mode when the buffer has changed', async function() { + const contentUpdater = sinon.stub().resolves(); + + const wrapper = shallowEditMode({ + originalContent: {id: 'id-0', body: 'original'}, + contentUpdater, + render: () =>
, + }); + + wrapper.find('AtomTextEditor').prop('buffer').setText('different'); + await wrapper.find('.github-Review-updateCommentButton').prop('onClick')(); + assert.isTrue(contentUpdater.calledWith('id-0', 'different')); + + assert.isTrue(wrapper.exists('.non-editable')); + }); + + it('remains in editing mode and preserves the buffer text when unsuccessful', async function() { + const contentUpdater = sinon.stub().rejects(new Error('oh no')); + + const wrapper = shallowEditMode({ + originalContent: {id: 'id-0', body: 'original'}, + contentUpdater, + render: () =>
, + }); + + wrapper.find('AtomTextEditor').prop('buffer').setText('different'); + await wrapper.find('.github-Review-updateCommentButton').prop('onClick')(); + assert.isTrue(contentUpdater.calledWith('id-0', 'different')); + + assert.strictEqual(wrapper.find('AtomTextEditor').prop('buffer').getText(), 'different'); + }); + }); + + describe('when the cancel button is clicked', function() { + it('reverts to non-editing mode when the text is unchanged', async function() { + const confirm = sinon.stub().returns(0); + + const wrapper = shallowEditMode({ + originalContent: {id: 'id-0', body: 'original'}, + confirm, + render: () =>
, + }); + + await wrapper.find('.github-Review-editableCancelButton').prop('onClick')(); + assert.isFalse(confirm.called); + assert.isTrue(wrapper.exists('.original')); + }); + + describe('when the text has changed', function() { + it('reverts to non-editing mode when the user confirms', async function() { + const confirm = sinon.stub().returns(0); + const contentUpdater = sinon.stub().resolves(); + + const wrapper = shallowEditMode({ + originalContent: {id: 'id-0', body: 'original'}, + confirm, + contentUpdater, + render: () =>
, + }); + + wrapper.find('AtomTextEditor').prop('buffer').setText('new text'); + await wrapper.find('.github-Review-editableCancelButton').prop('onClick')(); + assert.isTrue(confirm.called); + assert.isFalse(contentUpdater.called); + assert.isFalse(wrapper.exists('.github-Review-editable')); + assert.isTrue(wrapper.exists('.original')); + }); + + it('remains in editing mode when the user cancels', async function() { + const confirm = sinon.stub().returns(1); + + const wrapper = shallowEditMode({ + originalContent: {id: 'id-0', body: 'original'}, + confirm, + render: () =>
, + }); + + wrapper.find('AtomTextEditor').prop('buffer').setText('new text'); + await wrapper.find('.github-Review-editableCancelButton').prop('onClick')(); + assert.isTrue(confirm.called); + assert.isTrue(wrapper.exists('.github-Review-editable')); + assert.isFalse(wrapper.exists('.original')); + }); + }); + }); + }); +}); diff --git a/test/views/review-comment-view.test.js b/test/views/review-comment-view.test.js new file mode 100644 index 0000000000..d0550d667f --- /dev/null +++ b/test/views/review-comment-view.test.js @@ -0,0 +1,163 @@ +import React from 'react'; +import {shallow} from 'enzyme'; + +import ReviewCommentView from '../../lib/views/review-comment-view'; +import ActionableReviewView from '../../lib/views/actionable-review-view'; +import EmojiReactionsController from '../../lib/controllers/emoji-reactions-controller'; +import {GHOST_USER} from '../../lib/helpers'; + +describe('ReviewCommentView', function() { + let atomEnv; + + beforeEach(function() { + atomEnv = global.buildAtomEnvironment(); + }); + + afterEach(function() { + atomEnv.destroy(); + }); + + function buildApp(override = {}) { + const props = { + comment: {}, + isPosting: false, + confirm: () => {}, + tooltips: atomEnv.tooltips, + commands: atomEnv.commands, + renderEditedLink: () =>
, + renderAuthorAssociation: () =>
, + openIssueish: () => {}, + openIssueishLinkInNewTab: () => {}, + updateComment: () => {}, + reportRelayError: () => {}, + ...override, + }; + + return ; + } + + it('passes most props through to an ActionableReviewView', function() { + const comment = {id: 'comment0'}; + const confirm = () => {}; + const updateComment = () => {}; + + const wrapper = shallow(buildApp({ + comment, + isPosting: true, + confirm, + updateComment, + })); + + const arv = wrapper.find(ActionableReviewView); + assert.strictEqual(arv.prop('originalContent'), comment); + assert.isTrue(arv.prop('isPosting')); + assert.strictEqual(arv.prop('confirm'), confirm); + assert.strictEqual(arv.prop('contentUpdater'), updateComment); + }); + + describe('review comment data for non-edit mode', function() { + it('renders a placeholder message for minimized comments', function() { + const comment = { + id: 'comment0', + isMinimized: true, + }; + const showActionsMenu = sinon.spy(); + + const wrapper = shallow(buildApp({comment})) + .find(ActionableReviewView) + .renderProp('render')(showActionsMenu); + + assert.isTrue(wrapper.exists('.github-Review-comment--hidden')); + }); + + it('renders review comment data for non-edit mode', function() { + const comment = { + id: 'comment0', + isMinimized: false, + state: 'SUBMITTED', + author: { + login: 'me', + url: 'https://github.com/me', + avatarUrl: 'https://avatars.r.us/1234', + }, + createdAt: '2019-01-01T10:00:00Z', + bodyHTML: '

hi

', + }; + const showActionsMenu = sinon.spy(); + + const wrapper = shallow(buildApp({ + comment, + renderEditedLink: c => { + assert.strictEqual(c, comment); + return
; + }, + renderAuthorAssociation: c => { + assert.strictEqual(c, comment); + return
; + }, + })) + .find(ActionableReviewView) + .renderProp('render')(showActionsMenu); + + assert.isTrue(wrapper.exists('.github-Review-comment')); + assert.isFalse(wrapper.exists('.github-Review-comment--pending')); + assert.strictEqual(wrapper.find('.github-Review-avatar').prop('src'), comment.author.avatarUrl); + assert.strictEqual(wrapper.find('.github-Review-username').prop('href'), comment.author.url); + assert.strictEqual(wrapper.find('.github-Review-username').text(), comment.author.login); + assert.strictEqual(wrapper.find('Timeago').prop('time'), comment.createdAt); + assert.isTrue(wrapper.exists('.renderEditedLink')); + assert.isTrue(wrapper.exists('.renderAuthorAssociation')); + + wrapper.find('Octicon[icon="ellipses"]').simulate('click'); + assert.isTrue(showActionsMenu.calledWith(sinon.match.any, comment, comment.author)); + + assert.strictEqual(wrapper.find('GithubDotcomMarkdown').prop('html'), comment.bodyHTML); + assert.strictEqual(wrapper.find(EmojiReactionsController).prop('reactable'), comment); + }); + + it('uses a ghost user for comments with no author', function() { + const comment = { + id: 'comment0', + isMinimized: false, + state: 'SUBMITTED', + createdAt: '2019-01-01T10:00:00Z', + bodyHTML: '

hi

', + }; + const showActionsMenu = sinon.spy(); + + const wrapper = shallow(buildApp({comment})) + .find(ActionableReviewView) + .renderProp('render')(showActionsMenu); + + assert.isTrue(wrapper.exists('.github-Review-comment')); + assert.strictEqual(wrapper.find('.github-Review-avatar').prop('src'), GHOST_USER.avatarUrl); + assert.strictEqual(wrapper.find('.github-Review-username').prop('href'), GHOST_USER.url); + assert.strictEqual(wrapper.find('.github-Review-username').text(), GHOST_USER.login); + + wrapper.find('Octicon[icon="ellipses"]').simulate('click'); + assert.isTrue(showActionsMenu.calledWith(sinon.match.any, comment, GHOST_USER)); + }); + + it('includes a badge to mark pending comments', function() { + const comment = { + id: 'comment0', + isMinimized: false, + state: 'PENDING', + author: { + login: 'me', + url: 'https://github.com/me', + avatarUrl: 'https://avatars.r.us/1234', + }, + createdAt: '2019-01-01T10:00:00Z', + bodyHTML: '

hi

', + }; + + const wrapper = shallow(buildApp({comment})) + .find(ActionableReviewView) + .renderProp('render')(() => {}); + + assert.isTrue(wrapper.exists('.github-Review-comment--pending')); + assert.isTrue(wrapper.exists('.github-Review-pendingBadge')); + }); + }); +}); diff --git a/test/views/reviews-view.test.js b/test/views/reviews-view.test.js index dfa53c7da1..e71341d5b4 100644 --- a/test/views/reviews-view.test.js +++ b/test/views/reviews-view.test.js @@ -115,7 +115,7 @@ describe('ReviewsView', function() { assert.lengthOf(wrapper.find('details.github-Review'), 2); }); - it('displays ghost user information if author is null', function() { + it('displays ghost user information in review summary if author is null', function() { const {summaries, commentThreads} = aggregatedReviewsBuilder() .addReviewSummary(r => r.id(0)) .addReviewThread(t => t.addComment().addComment()) @@ -123,23 +123,14 @@ describe('ReviewsView', function() { const wrapper = shallow(buildApp({summaries, commentThreads})); + const showActionMenu = () => {}; + const summary = wrapper.find('.github-ReviewSummary').find('ActionableReviewView').renderProp('render')(showActionMenu); + // summary - assert.strictEqual(wrapper.find('.github-ReviewSummary-username').text(), GHOST_USER.login); - assert.strictEqual(wrapper.find('.github-ReviewSummary-username').prop('href'), GHOST_USER.url); - assert.strictEqual(wrapper.find('.github-ReviewSummary-avatar').prop('src'), GHOST_USER.avatarUrl); - assert.strictEqual(wrapper.find('.github-ReviewSummary-avatar').prop('alt'), GHOST_USER.login); - - // root comment - assert.strictEqual(wrapper.find('.github-Review-username').at(0).text(), GHOST_USER.login); - assert.strictEqual(wrapper.find('.github-Review-username').at(0).prop('href'), GHOST_USER.url); - assert.strictEqual(wrapper.find('.github-Review-avatar').at(0).prop('src'), GHOST_USER.avatarUrl); - assert.strictEqual(wrapper.find('.github-Review-avatar').at(0).prop('alt'), GHOST_USER.login); - - // non-root comment - assert.strictEqual(wrapper.find('.github-Review-username').at(1).text(), GHOST_USER.login); - assert.strictEqual(wrapper.find('.github-Review-username').at(1).prop('href'), GHOST_USER.url); - assert.strictEqual(wrapper.find('.github-Review-avatar').at(1).prop('src'), GHOST_USER.avatarUrl); - assert.strictEqual(wrapper.find('.github-Review-avatar').at(1).prop('alt'), GHOST_USER.login); + assert.strictEqual(summary.find('.github-ReviewSummary-username').text(), GHOST_USER.login); + assert.strictEqual(summary.find('.github-ReviewSummary-username').prop('href'), GHOST_USER.url); + assert.strictEqual(summary.find('.github-ReviewSummary-avatar').prop('src'), GHOST_USER.avatarUrl); + assert.strictEqual(summary.find('.github-ReviewSummary-avatar').prop('alt'), GHOST_USER.login); }); it('displays an author association badge for review summaries', function() { @@ -153,45 +144,20 @@ describe('ReviewsView', function() { .addReviewSummary(r => r.id(6).authorAssociation('NONE')) .build(); + const showActionMenu = () => {}; const wrapper = shallow(buildApp({summaries, commentThreads})); - - const reviews = wrapper.find('.github-ReviewSummary'); - assert.lengthOf(reviews, 7); - assert.strictEqual(reviews.at(0).find('.github-Review-authorAssociationBadge').text(), 'Member'); - assert.strictEqual(reviews.at(1).find('.github-Review-authorAssociationBadge').text(), 'Owner'); - assert.strictEqual(reviews.at(2).find('.github-Review-authorAssociationBadge').text(), 'Collaborator'); - assert.strictEqual(reviews.at(3).find('.github-Review-authorAssociationBadge').text(), 'Contributor'); - assert.strictEqual(reviews.at(4).find('.github-Review-authorAssociationBadge').text(), 'First-time contributor'); - assert.strictEqual(reviews.at(5).find('.github-Review-authorAssociationBadge').text(), 'First-timer'); - assert.isFalse(reviews.at(6).exists('.github-Review-authorAssociationBadge')); - }); - - it('displays an author association badge for review thread comments', function() { - const {summaries, commentThreads} = aggregatedReviewsBuilder() - .addReviewSummary(r => r.id(0)) - .addReviewThread(t => { - t.thread(t0 => t0.id('abcd')); - t.addComment(c => c.id(0).authorAssociation('MEMBER')); - t.addComment(c => c.id(1).authorAssociation('OWNER')); - t.addComment(c => c.id(2).authorAssociation('COLLABORATOR')); - t.addComment(c => c.id(3).authorAssociation('CONTRIBUTOR')); - t.addComment(c => c.id(4).authorAssociation('FIRST_TIME_CONTRIBUTOR')); - t.addComment(c => c.id(5).authorAssociation('FIRST_TIMER')); - t.addComment(c => c.id(6).authorAssociation('NONE')); - }) - .build(); - - const wrapper = shallow(buildApp({summaries, commentThreads})); - - const comments = wrapper.find('.github-Review-comment'); - assert.lengthOf(comments, 7); - assert.strictEqual(comments.at(0).find('.github-Review-authorAssociationBadge').text(), 'Member'); - assert.strictEqual(comments.at(1).find('.github-Review-authorAssociationBadge').text(), 'Owner'); - assert.strictEqual(comments.at(2).find('.github-Review-authorAssociationBadge').text(), 'Collaborator'); - assert.strictEqual(comments.at(3).find('.github-Review-authorAssociationBadge').text(), 'Contributor'); - assert.strictEqual(comments.at(4).find('.github-Review-authorAssociationBadge').text(), 'First-time contributor'); - assert.strictEqual(comments.at(5).find('.github-Review-authorAssociationBadge').text(), 'First-timer'); - assert.isFalse(comments.at(6).exists('.github-Review-authorAssociationBadge')); + assert.lengthOf(wrapper.find('.github-ReviewSummary'), 7); + const reviews = wrapper.find('.github-ReviewSummary').map(review => + review.find('ActionableReviewView').renderProp('render')(showActionMenu), + ); + + assert.strictEqual(reviews[0].find('.github-Review-authorAssociationBadge').text(), 'Member'); + assert.strictEqual(reviews[1].find('.github-Review-authorAssociationBadge').text(), 'Owner'); + assert.strictEqual(reviews[2].find('.github-Review-authorAssociationBadge').text(), 'Collaborator'); + assert.strictEqual(reviews[3].find('.github-Review-authorAssociationBadge').text(), 'Contributor'); + assert.strictEqual(reviews[4].find('.github-Review-authorAssociationBadge').text(), 'First-time contributor'); + assert.strictEqual(reviews[5].find('.github-Review-authorAssociationBadge').text(), 'First-timer'); + assert.isFalse(reviews[6].exists('.github-Review-authorAssociationBadge')); }); it('calls openIssueish when clicking on an issueish link in a review summary', function() { @@ -204,11 +170,13 @@ describe('ReviewsView', function() { .build(); const wrapper = shallow(buildApp({openIssueish, summaries})); + const showActionMenu = () => {}; + const review = wrapper.find('ActionableReviewView').renderProp('render')(showActionMenu); - wrapper.find('GithubDotcomMarkdown').prop('switchToIssueish')('aaa', 'bbb', 123); + review.find('GithubDotcomMarkdown').prop('switchToIssueish')('aaa', 'bbb', 123); assert.isTrue(openIssueish.calledWith('aaa', 'bbb', 123)); - wrapper.find('GithubDotcomMarkdown').prop('openIssueishLinkInNewTab')({ + review.find('GithubDotcomMarkdown').prop('openIssueishLinkInNewTab')({ target: {dataset: {url: 'https://github.com/ccc/ddd/issues/654'}}, }); assert.isTrue(openIssueish.calledWith('ccc', 'ddd', 654)); @@ -308,15 +276,9 @@ describe('ReviewsView', function() { it('renders threads with comments', function() { const threads = wrapper.find('details.github-Review'); assert.lengthOf(threads, 3); - assert.lengthOf(threads.at(0).find('.github-Review-comment'), 2); - assert.lengthOf(threads.at(1).find('.github-Review-comment'), 2); - assert.lengthOf(threads.at(2).find('.github-Review-comment'), 1); - }); - - it('hides minimized comment content', function() { - const thread = wrapper.find('details.github-Review').at(0); - const comment = thread.find('.github-Review-comment--hidden'); - assert.strictEqual(comment.find('em').text(), 'This comment was hidden'); + assert.lengthOf(threads.at(0).find('ReviewCommentView'), 2); + assert.lengthOf(threads.at(1).find('ReviewCommentView'), 2); + assert.lengthOf(threads.at(2).find('ReviewCommentView'), 1); }); it('groups comments by their resolved status', function() { @@ -338,41 +300,15 @@ describe('ReviewsView', function() { .build(); wrapper.setProps({...updatedProps}); + const showActionMenu = () => {}; - const updatedSummary = wrapper.find('.github-ReviewSummary').at(0); + const updatedSummary = wrapper.find('.github-ReviewSummary').at(0).find('ActionableReviewView').renderProp('render')(showActionMenu); assert.isTrue(updatedSummary.exists('.github-Review-edited')); const editedWrapper = updatedSummary.find('a.github-Review-edited'); assert.strictEqual(editedWrapper.text(), 'edited'); assert.strictEqual(editedWrapper.prop('href'), commentUrl); }); - it('indicates that a thread comment has been edited', function() { - const comment = wrapper.find('details.github-Review').at(0).find('.github-Review-comment').at(0); - assert.isFalse(comment.exists('.github-Review-edited')); - - const commentUrl = 'https://github.com/atom/github/pull/1995#discussion_r272475592'; - const updatedProps = aggregatedReviewsBuilder() - .addReviewSummary(r => r.id(0)) - .addReviewThread(t => { - t.thread(t0 => t0.id('abcd')); - t.addComment(c => - c.id(0).path('dir/file0').position(10).bodyHTML('i have opinions.').author(a => a.login('user0').avatarUrl('user0.jpg')) - .lastEditedAt('2018-12-27T17:51:17Z').url(commentUrl), - ); - t.addComment(c => - c.id(1).path('file0').position(10).bodyHTML('i disagree.').author(a => a.login('user1').avatarUrl('user1.jpg')).isMinimized(true), - ); - }) - .build(); - - wrapper.setProps({...updatedProps}); - - const updatedComment = wrapper.find('details.github-Review').at(0).find('.github-Review-comment').at(0); - assert.isTrue(updatedComment.exists('.github-Review-edited')); - const editedWrapper = updatedComment.find('a.github-Review-edited'); - assert.strictEqual(editedWrapper.text(), 'edited'); - assert.strictEqual(editedWrapper.prop('href'), commentUrl); - }); }); describe('each thread', function() { @@ -405,18 +341,6 @@ describe('ReviewsView', function() { assert.isTrue(unresolveThread.called); }); - it('displays a pending badge when the comment is part of a pending review', function() { - const thread = wrapper.find('details.github-Review').at(1); - - const comment0 = thread.find('.github-Review-comment').at(0); - assert.isFalse(comment0.hasClass('github-Review-comment--pending')); - assert.isFalse(comment0.exists('.github-Review-pendingBadge')); - - const comment1 = thread.find('.github-Review-comment').at(1); - assert.isTrue(comment1.hasClass('github-Review-comment--pending')); - assert.isTrue(comment1.exists('.github-Review-pendingBadge')); - }); - it('omits the / when there is no directory', function() { const thread = wrapper.find('details.github-Review').at(1); assert.isFalse(thread.exists('.github-Review-path')); @@ -489,15 +413,6 @@ describe('ReviewsView', function() { }); }); - it('each comment displays correct data', function() { - const comment = wrapper.find('.github-Review-comment').at(0); - assert.strictEqual(comment.find('.github-Review-avatar').prop('src'), 'user0.jpg'); - assert.strictEqual(comment.find('.github-Review-avatar').prop('alt'), 'user0'); - assert.strictEqual(comment.find('.github-Review-username').prop('href'), 'https://github.com/user0'); - assert.strictEqual(comment.find('.github-Review-username').text(), 'user0'); - assert.strictEqual(comment.find('GithubDotcomMarkdown').prop('html'), 'i have opinions.'); - }); - it('each comment displays reply button', function() { const submitSpy = sinon.spy(wrapper.instance(), 'submitReply'); const buttons = wrapper.find('.github-Review-replyButton'); @@ -538,18 +453,6 @@ describe('ReviewsView', function() { )); }); - it('handles issueish link clicks on comment bodies', function() { - const comment = wrapper.find('.github-Review-comment').at(2); - - comment.find('GithubDotcomMarkdown').prop('switchToIssueish')('aaa', 'bbb', 100); - assert.isTrue(openIssueish.calledWith('aaa', 'bbb', 100)); - - comment.find('GithubDotcomMarkdown').prop('openIssueishLinkInNewTab')({ - target: {dataset: {url: 'https://github.com/ccc/ddd/pulls/1'}}, - }); - assert.isTrue(openIssueish.calledWith('ccc', 'ddd', 1)); - }); - it('renders progress bar', function() { assert.isTrue(wrapper.find('.github-Reviews-progress').exists()); assert.strictEqual(wrapper.find('.github-Reviews-count').text(), 'Resolved 1 of 3');