summaryrefslogtreecommitdiff
path: root/source/features/quick-review.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'source/features/quick-review.tsx')
-rw-r--r--source/features/quick-review.tsx67
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,
+});