diff --git a/src/components/SettingsBar.tsx b/src/components/SettingsBar.tsx index 3d96cd6..c7d75a2 100644 --- a/src/components/SettingsBar.tsx +++ b/src/components/SettingsBar.tsx @@ -124,20 +124,6 @@ function SettingsBarContent() { useToggleShowSideBarShortcut.set(shortcut) }, []) - const showReloadHint = React.useCallback( - () => - useReloadHint.set( - - Saved,{' '} - window.location.reload()}> - reload - {' '} - to apply. - , - ), - [], - ) - return ( <>

Settings

@@ -207,11 +193,7 @@ function SettingsBarContent() {

More Options

{moreFields.map(field => ( - +
))} diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index cf38dc8..8ff4539 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -54,7 +54,10 @@ const RawGitako: React.FC = function RawGitako(props) { const onPJAXEnd = React.useCallback(() => { DOMHelper.unmountTopProgressBar() props.setMetaData({ ...props.metaData, ...URLHelper.parse() }) - }, [props.metaData]) + // TODO: update state to re-trigger DOM effects + // if (configContext.val.copyFileButton) DOMHelper.attachCopyFileBtn() + // if (configContext.val.copySnippetButton) DOMHelper.attachCopySnippet() + }, [props.metaData, configContext.val]) React.useEffect(() => { if (props.disabled) return @@ -69,14 +72,12 @@ const RawGitako: React.FC = function RawGitako(props) { }, [props.metaData, configContext.val.intelligentToggle]) React.useEffect(() => { - const { copyFileButton } = configContext.val - if (copyFileButton) return DOMHelper.attachCopyFileBtn() - }, [props.metaData]) + if (configContext.val.copyFileButton) return DOMHelper.attachCopyFileBtn() + }, [configContext.val.copyFileButton]) React.useEffect(() => { - const { copySnippetButton } = configContext.val - if (copySnippetButton) DOMHelper.attachCopySnippet() - }, [props.metaData]) + if (configContext.val.copySnippetButton) return DOMHelper.attachCopySnippet() + }, [configContext.val.copySnippetButton]) // init again when setting new accessToken useDidUpdate(() => props.init(), [accessToken]) diff --git a/src/utils/DOMHelper.ts b/src/utils/DOMHelper.ts index 3de1476..b736540 100644 --- a/src/utils/DOMHelper.ts +++ b/src/utils/DOMHelper.ts @@ -7,7 +7,6 @@ import { CopyFileButton } from 'components/CopyFileButton' import * as NProgress from 'nprogress' import * as PJAX from 'pjax' import * as React from 'react' -import * as ReactDOM from 'react-dom' import { renderReact } from './general' NProgress.configure({ showSpinner: false }) @@ -210,15 +209,13 @@ export function attachCopyFileBtn() { } const buttons: HTMLElement[] = [] - buttonGroups.forEach(buttonGroup => { + buttonGroups.forEach(async buttonGroup => { if (!buttonGroup.lastElementChild) return - const portal = ReactDOM.createPortal(React.createElement(CopyFileButton), buttonGroup) - // creating a element for mounting button into button group, somehow hack - const seedElementForButton = document.createElement('a') - buttonGroup.appendChild(seedElementForButton) - ReactDOM.render(portal, seedElementForButton) - buttonGroup.removeChild(seedElementForButton) - buttons.push(seedElementForButton) + const button = await renderReact(React.createElement(CopyFileButton)) + if (button instanceof HTMLElement) { + buttonGroup.appendChild(button) + buttons.push(button) + } }) return () => buttons.forEach(button => { @@ -249,7 +246,8 @@ export function attachCopySnippet() { const readmeArticleSelector = '.repository-content div#readme article' return $( readmeArticleSelector, - readmeElement => + readmeElement => { + const buttons: HTMLElement[] = [] readmeElement.addEventListener('mouseover', async ({ target }) => { if (target instanceof Element && target.nodeName === 'PRE') { if ( @@ -269,11 +267,19 @@ export function attachCopySnippet() { const clippyElement = await renderReact( React.createElement(Clippy, { codeSnippetElement: target }), ) - target.parentNode.insertBefore(clippyElement, target) + if (clippyElement instanceof HTMLElement) { + target.parentNode.insertBefore(clippyElement, target) + buttons.push(clippyElement) + } } } } - }), + }) + return () => + buttons.forEach(button => { + button.parentElement?.removeChild(button) + }) + }, () => { const plainReadmeSelector = '.repository-content div#readme .plain' $(plainReadmeSelector, undefined, () =>