summaryrefslogtreecommitdiff
path: root/source/features/revert-file.tsx
diff options
context:
space:
mode:
authorGravatar yakov116 <16872793+yakov116@users.noreply.github.com> 2020-06-16 12:04:47 -0400
committerGravatar GitHub <noreply@github.com> 2020-06-16 18:04:47 +0200
commitf658e6f22dd1de5b335221620da0ca5ac225e581 (patch)
treef3a506d95ef2875def135a7443e04d1f5d1de56f /source/features/revert-file.tsx
parentaf1ca4dfea0c6c11feabc8b44e998040cd2787ac (diff)
downloadrefined-github-f658e6f22dd1de5b335221620da0ca5ac225e581.tar.gz
refined-github-f658e6f22dd1de5b335221620da0ca5ac225e581.tar.zst
refined-github-f658e6f22dd1de5b335221620da0ca5ac225e581.zip
Rename `revert-file` to `restore-file` (#3238)
Diffstat (limited to 'source/features/revert-file.tsx')
-rw-r--r--source/features/revert-file.tsx150
1 files changed, 0 insertions, 150 deletions
diff --git a/source/features/revert-file.tsx b/source/features/revert-file.tsx
deleted file mode 100644
index aca9cfc7..00000000
--- a/source/features/revert-file.tsx
+++ /dev/null
@@ -1,150 +0,0 @@
-import React from 'dom-chef';
-import select from 'select-dom';
-import onetime from 'onetime';
-import delegate from 'delegate-it';
-import * as pageDetect from 'github-url-detection';
-
-import features from '.';
-import * as api from '../github-helpers/api';
-import fetchDom from '../helpers/fetch-dom';
-import postForm from '../helpers/post-form';
-import {getDiscussionNumber, getRepoGQL, getRepoURL, getCurrentBranch} from '../github-helpers';
-
-function showError(menuItem: HTMLButtonElement, error: string): void {
- menuItem.disabled = true;
- menuItem.style.background = 'none'; // Disables hover background color
- menuItem.textContent = error;
-}
-
-/**
-Get the current base commit of this PR. It should change after rebases and merges in this PR.
-This value is not consistently available on the page (appears in `/files` but not when only 1 commit is selected)
-*/
-const getBaseReference = onetime(async (): Promise<string> => {
- const {repository} = await api.v4(`
- repository(${getRepoGQL()}) {
- pullRequest(number: ${getDiscussionNumber()!}) {
- baseRefOid
- }
- }
- `);
- return repository.pullRequest.baseRefOid;
-});
-
-async function getFile(filePath: string): Promise<{isTruncated: boolean; text: string} | null> {
- const {repository} = await api.v4(`
- repository(${getRepoGQL()}) {
- file: object(expression: "${await getBaseReference()}:${filePath}") {
- ... on Blob {
- isTruncated
- text
- }
- }
- }
- `);
- return repository.file;
-}
-
-async function deleteFile(menuItem: Element): Promise<void> {
- menuItem.textContent = 'Deleting…';
-
- const deleteFileLink = select<HTMLAnchorElement>('a[aria-label^="Delete this"]', menuItem.parentElement!)!;
- const form = await fetchDom<HTMLFormElement>(deleteFileLink.href, '#new_blob');
- await postForm(form!);
-}
-
-async function commitFileContent(menuItem: Element, content: string, filePath: string): Promise<void> {
- let {pathname} = menuItem.previousElementSibling as HTMLAnchorElement;
- // Check if file was deleted by PR
- if (menuItem.closest('[data-file-deleted="true"]')) {
- menuItem.textContent = 'Undeleting…';
- pathname = `/${getRepoURL()}/new/${getCurrentBranch()}?filename=` + filePath;
- } else {
- menuItem.textContent = 'Committing…';
- }
-
- // This is either an `edit` or `create` form
- const form = (await fetchDom<HTMLFormElement>(pathname, '.js-blob-form'))!;
- form.elements.value.value = content; // Revert content (`value` is the name of the file content field)
- form.elements.message.value = (form.elements.message as HTMLInputElement).placeholder
- .replace(/^Update/, 'Revert')
- .replace(/^Create/, 'Restore');
- await postForm(form);
-}
-
-const filesReverted = new WeakSet<HTMLButtonElement>();
-async function handleRevertFileClick(event: delegate.Event<MouseEvent, HTMLButtonElement>): Promise<void> {
- const menuItem = event.delegateTarget;
-
- // Only allow one click
- if (filesReverted.has(menuItem)) {
- return;
- }
-
- filesReverted.add(menuItem);
-
- menuItem.textContent = 'Reverting…';
- event.preventDefault();
- event.stopPropagation();
-
- try {
- const filePath = menuItem.closest<HTMLDivElement>('[data-path]')!.dataset.path!;
- const file = await getFile(filePath);
-
- if (!file) {
- // The file was created by this PR. Revert === Delete.
- // If there was a way to tell if a file was created by the PR, we could skip `getFile`
- await deleteFile(menuItem);
- return;
- }
-
- if (file.isTruncated) {
- showError(menuItem, 'Revert failed: File too big');
- return;
- }
-
- await commitFileContent(menuItem, file.text, filePath);
-
- // Hide file from view
- menuItem.closest('.file')!.remove();
- } catch (error) {
- showError(menuItem, 'Revert failed. See console for details');
- throw error;
- }
-}
-
-function handleMenuOpening({delegateTarget: dropdown}: delegate.Event): void {
- const editFile = select<HTMLAnchorElement>('[aria-label^="Change this"]', dropdown);
- if (!editFile || select.exists('.rgh-revert-file', dropdown)) {
- return;
- }
-
- editFile.after(
- <button
- className="pl-5 dropdown-item btn-link rgh-revert-file"
- style={{whiteSpace: 'pre-wrap'}}
- role="menuitem"
- type="button"
- >
- Revert changes
- </button>
- );
-}
-
-function init(): void {
- // `useCapture` required to be fired before GitHub's handlers
- delegate(document, '.file-header .js-file-header-dropdown', 'toggle', handleMenuOpening, true);
- delegate(document, '.rgh-revert-file', 'click', handleRevertFileClick, true);
-}
-
-void features.add({
- id: __filebasename,
- description: 'Adds button to revert all the changes to a file in a PR.',
- screenshot: 'https://user-images.githubusercontent.com/1402241/62826118-73b7bb00-bbe0-11e9-9449-2dd64c469bb9.gif'
-}, {
- include: [
- pageDetect.isPRFiles,
- pageDetect.isPRCommit
- ],
- init
-});