diff options
author | 2020-06-16 12:04:47 -0400 | |
---|---|---|
committer | 2020-06-16 18:04:47 +0200 | |
commit | f658e6f22dd1de5b335221620da0ca5ac225e581 (patch) | |
tree | f3a506d95ef2875def135a7443e04d1f5d1de56f /source/features/revert-file.tsx | |
parent | af1ca4dfea0c6c11feabc8b44e998040cd2787ac (diff) | |
download | refined-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.tsx | 150 |
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 -}); |