diff --git a/src/utils/DOMHelper.js b/src/utils/DOMHelper.js index 139b326..7b6361b 100644 --- a/src/utils/DOMHelper.js +++ b/src/utils/DOMHelper.js @@ -20,10 +20,17 @@ function setBodyIndent(shouldShowGitako) { } } +function $(selector, existCallback, otherwise) { + const element = document.querySelector(selector) + if (element) { + return existCallback ? existCallback(element) : element + } + return otherwise ? otherwise() : null +} + function isInCodePage() { const branchListSelector = '.branch-select-menu' - const listElement = document.querySelector(branchListSelector) - return Boolean(listElement) + return Boolean($(branchListSelector)) } function getBranches() { @@ -34,8 +41,7 @@ function getBranches() { function getCurrentBranch() { const selectedBranchSelector = '.select-menu.branch-select-menu .select-menu-modal .select-menu-list .select-menu-item.selected svg.select-menu-item-icon + span' - const selectedBranchElement = document.querySelector(selectedBranchSelector) - return selectedBranchElement ? selectedBranchElement.textContent.trim() : null + return $(selectedBranchSelector, element => element.textContent.trim()) } /** @@ -44,10 +50,10 @@ function getCurrentBranch() { */ function insertLogoMountPoint() { const logoSelector = '.gitako .gitako-logo' - const logoElement = document.querySelector(logoSelector) - if (logoElement) { - return logoElement - } + return $(logoSelector) || createLogoMountPoint() +} + +function createLogoMountPoint() { const logoMountElement = document.createElement('div') logoMountElement.setAttribute('class', 'gitako-logo-mount-point') document.body.appendChild(logoMountElement) @@ -60,13 +66,9 @@ function insertLogoMountPoint() { */ function scrollToRepoContent() { const fileNavigationSelector = '.file-navigation.js-zeroclipboard-container' - const fileNavigationElement = document.querySelector(fileNavigationSelector) - // cannot to use behavior: smooth here as it will scroll horizontally - if (fileNavigationElement) { - fileNavigationElement.scrollIntoView() - } else { - document.body.scrollIntoView() - } + const scrollTarget = $(fileNavigationSelector) || document.body + // do NOT use behavior: smooth here as it will scroll horizontally + return scrollTarget.scrollIntoView() } /** @@ -121,36 +123,25 @@ const PAGE_TYPES = { * TODO: distinguish type 'preview' */ function getCurrentPageType() { - const blobWrapperSelector = '.repository-content .file .blob-wrapper' - const blobWrapperElement = document.querySelector(blobWrapperSelector) - if (blobWrapperElement) { - if (blobWrapperElement.querySelector('table')) { - return PAGE_TYPES.RAW_TEXT - } - } else { - const readmeSelector = '.repository-content .readme' - const readmeElement = document.querySelector(readmeSelector) - if (readmeElement) { - return PAGE_TYPES.RENDERED - } - } - return PAGE_TYPES.OTHERS + const blobWrapperSelector = '.repository-content .file .blob-wrapper table' + const readmeSelector = '.repository-content .readme' + return $(blobWrapperSelector, () => PAGE_TYPES.RAW_TEXT) + || $(readmeSelector, () => PAGE_TYPES.RENDERED) + || PAGE_TYPES.OTHERS } export const REPO_TYPE_PRIVATE = 'private' export const REPO_TYPE_PUBLIC = 'public' function getRepoPageType() { const headerSelector = `#js-repo-pjax-container .pagehead.repohead h1` - const header = document.querySelector(headerSelector) - if (header) { + return $(headerSelector, header => { const repoPageTypes = [REPO_TYPE_PRIVATE, REPO_TYPE_PUBLIC] for (const repoPageType of repoPageTypes) { if (header.classList.contains(repoPageType)) { return repoPageType } } - } - return null + }) } /** @@ -164,7 +155,7 @@ function attachCopyFileBtn() { function getCodeElement() { if (getCurrentPageType() === PAGE_TYPES.RAW_TEXT) { const codeContentSelector = '.repository-content .file .data table' - return document.querySelector(codeContentSelector) + return $(codeContentSelector) } } @@ -269,14 +260,11 @@ const clippy = createClippy() let currentCodeSnippetElement function attachCopySnippet() { const readmeSelector = '.repository-content #readme article' - const readmeElement = document.querySelector(readmeSelector) - if (readmeElement) { + return $(readmeSelector, readmeElement => readmeElement.addEventListener('mouseover', ({ target }) => { // only move clippy when mouse is over a new snippet(
)
if (target.nodeName === 'PRE') {
- if (
- currentCodeSnippetElement !== target
- ) {
+ if (currentCodeSnippetElement !== target) {
currentCodeSnippetElement = target
/**
*
@@ -290,7 +278,7 @@ function attachCopySnippet() {
}
}
})
- }
+ )
}
/**
@@ -298,25 +286,16 @@ function attachCopySnippet() {
*/
function focusFileExplorer() {
const sideBarContentSelector = '.gitako-side-bar .file-explorer'
- const sideBarElement = document.querySelector(sideBarContentSelector)
- if (sideBarElement) {
- sideBarElement.focus()
- }
-}
-
-function getSearchInput() {
- const searchInputSelector = '.search-input'
- const searchInputElement = document.querySelector(searchInputSelector)
- return searchInputElement
+ $(sideBarContentSelector, sideBarElement => sideBarElement.focus())
}
function focusSearchInput() {
- const searchInputElement = getSearchInput()
- if (searchInputElement) {
+ const searchInputSelector = '.search-input'
+ $(searchInputSelector, searchInputElement => {
if (document.activeElement !== searchInputElement) {
searchInputElement.focus()
}
- }
+ })
}
/**