diff options
Diffstat (limited to 'source/features/quick-review.tsx')
-rw-r--r-- | source/features/quick-review.tsx | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/source/features/quick-review.tsx b/source/features/quick-review.tsx new file mode 100644 index 00000000..1b11bd54 --- /dev/null +++ b/source/features/quick-review.tsx @@ -0,0 +1,67 @@ +import React from 'dom-chef'; +import select from 'select-dom'; +import delegate from 'delegate-it'; +import elementReady from 'element-ready'; +import * as pageDetect from 'github-url-detection'; + +import features from '.'; +import onReplacedElement from '../helpers/on-replaced-element'; + +async function addSidebarReviewButton(): Promise<void | false> { + const reviewFormUrl = new URL(location.href); + reviewFormUrl.pathname += '/files'; + reviewFormUrl.hash = 'submit-review'; + + const sidebarReviewsSection = await elementReady('[aria-label="Select reviewers"] .discussion-sidebar-heading'); + if (select.exists('[data-hotkey="v"]', sidebarReviewsSection)) { + return false; + } + + sidebarReviewsSection!.append( + <span style={{fontWeight: 'normal'}}> + – <a href={reviewFormUrl.href} className="btn-link muted-link Link--muted" data-hotkey="v">review now</a> + </span>, + ); +} + +function focusReviewTextarea({delegateTarget}: delegate.Event<Event, HTMLDetailsElement>): void { + if (delegateTarget.open) { + select('textarea', delegateTarget)!.focus(); + } +} + +async function initReviewButtonEnhancements(): Promise<void> { + delegate(document, '.js-reviews-container > details', 'toggle', focusReviewTextarea, true); + + const reviewDropdownButton = await elementReady('.js-reviews-toggle'); + if (reviewDropdownButton) { + reviewDropdownButton.dataset.hotkey = 'v'; + + // This feature should be native but isn't currently working #3681 + if (location.hash === '#submit-review') { + reviewDropdownButton.click(); + } + } +} + +void features.add(__filebasename, { + include: [ + pageDetect.isPRConversation, + ], + additionalListeners: [ + () => { + void onReplacedElement('#partial-discussion-sidebar', addSidebarReviewButton); + }, + ], + awaitDomReady: false, + init: addSidebarReviewButton, +}, { + shortcuts: { + v: 'Open PR review popup', + }, + include: [ + pageDetect.isPRFiles, + ], + awaitDomReady: false, + init: initReviewButtonEnhancements, +}); |