summaryrefslogtreecommitdiff
path: root/source/features/quick-comment-edit.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'source/features/quick-comment-edit.tsx')
-rw-r--r--source/features/quick-comment-edit.tsx46
1 files changed, 46 insertions, 0 deletions
diff --git a/source/features/quick-comment-edit.tsx b/source/features/quick-comment-edit.tsx
new file mode 100644
index 00000000..0b783da4
--- /dev/null
+++ b/source/features/quick-comment-edit.tsx
@@ -0,0 +1,46 @@
+import React from 'dom-chef';
+import select from 'select-dom';
+import onetime from 'onetime';
+import {observe} from 'selector-observer';
+import {PencilIcon} from '@primer/octicons-react';
+import * as pageDetect from 'github-url-detection';
+
+import features from '.';
+
+function canEditDiscussion(): boolean {
+ return pageDetect.isDiscussion() && select.exists('[title^="You are a maintainer"], [title^="You are a collaborator"]');
+}
+
+function init(): void {
+ // If true then the resulting selector will match all comments, otherwise it will only match those made by you
+ const preSelector = !pageDetect.isDiscussion() || canEditDiscussion() ? '' : '.current-user';
+ // Find editable comments first, then traverse to the correct position
+ observe(preSelector + '.js-comment.unminimized-comment .js-comment-update:not(.rgh-edit-comment)', {
+ add(comment) {
+ comment.classList.add('rgh-edit-comment');
+
+ comment
+ .closest('.js-comment')!
+ .querySelector('.timeline-comment-actions details:last-child')! // The dropdown
+ .before(
+ <button
+ type="button"
+ role="menuitem"
+ className={`timeline-comment-action btn-link js-comment-edit-button rgh-quick-comment-edit-button ${pageDetect.isDiscussion() ? 'js-discussions-comment-edit-button' : ''}`}
+ aria-label="Edit comment"
+ >
+ <PencilIcon/>
+ </button>,
+ );
+ },
+ });
+}
+
+void features.add(__filebasename, {
+ include: [
+ pageDetect.hasComments,
+ pageDetect.isDiscussion,
+ ],
+ deduplicate: 'has-rgh-inner',
+ init: onetime(init),
+});