From 32c0b5f03ca9854f5e0faf9b3631c9f0fb7b306c Mon Sep 17 00:00:00 2001 From: EnixCoda Date: Thu, 21 Feb 2019 11:06:26 +0800 Subject: [PATCH] refactor: switch listener in dispatch Also disable listeners when gitako fail --- src/components/SideBar.tsx | 11 +++++------ src/driver/core/SideBar.ts | 29 ++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 2130b32..0dede10 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -23,6 +23,7 @@ class Gitako extends React.PureComponent { compressSingletonFolder: true, copyFileButton: true, copySnippetButton: true, + disabled: false, } componentWillMount() { @@ -31,15 +32,13 @@ class Gitako extends React.PureComponent { } componentDidMount() { - const { onPJAXEnd, onKeyDown } = this.props - window.addEventListener('pjax:complete', onPJAXEnd) - window.addEventListener('keydown', onKeyDown) + const { useListeners } = this.props + useListeners(true) } componentWillUnmount() { - const { onPJAXEnd, onKeyDown } = this.props - window.removeEventListener('pjax:complete', onPJAXEnd) - window.removeEventListener('keydown', onKeyDown) + const { useListeners } = this.props + useListeners(false) } renderAccessDeniedError() { diff --git a/src/driver/core/SideBar.ts b/src/driver/core/SideBar.ts index ec127a8..725f293 100644 --- a/src/driver/core/SideBar.ts +++ b/src/driver/core/SideBar.ts @@ -1,4 +1,4 @@ -import DOMHelper, { REPO_TYPE_PRIVATE } from 'utils/DOMHelper' +import DOMHelper from 'utils/DOMHelper' import GitHubHelper, { NOT_FOUND, BAD_CREDENTIALS, @@ -38,13 +38,15 @@ export type ConnectorState = { copyFileButton: boolean copySnippetButton: boolean logoContainerElement: Element | null + disabled: boolean init: () => void onPJAXEnd: () => void + onKeyDown: (e: KeyboardEvent) => string toggleShowSideBar: () => void toggleShowSettings: () => void + useListeners: (on: boolean) => void onAccessTokenChange: SettingsBar['props']['onAccessTokenChange'] - onKeyDown: (e: KeyboardEvent) => string onShortcutChange: SettingsBar['props']['onShortcutChange'] setCopyFile: SettingsBar['props']['setCopyFile'] setCopySnippet: SettingsBar['props']['setCopySnippet'] @@ -53,7 +55,10 @@ export type ConnectorState = { const init: MethodCreator = dispatch => async () => { try { - if (!URLHelper.isInRepoPage()) return + if (!URLHelper.isInRepoPage()) { + dispatch.set({ disabled: true }) + return + } dispatch.set({ logoContainerElement: DOMHelper.insertLogoMountPoint(), }) @@ -146,6 +151,7 @@ const handleError: MethodCreator = dispatch => a dispatch.call(setShowSettings, true) dispatch.call(setShouldShow, true) } else { + dispatch.call(useListeners, false) dispatch.call(setError, 'Gitako ate a bug, but it should recovery soon!') throw err } @@ -240,6 +246,22 @@ const setCopySnippet: MethodCreator< [ConnectorState['copySnippetButton']] > = dispatch => copySnippetButton => dispatch.set({ copySnippetButton }) +const useListeners: MethodCreator = dispatch => { + const $onPJAXEnd = dispatch.call.bind(dispatch, onPJAXEnd) + const $onKeyDown = dispatch.call.bind(dispatch, onKeyDown) + return on => { + dispatch.get(({ disabled }, _) => { + if (on && !disabled) { + window.addEventListener('pjax:complete', $onPJAXEnd) + window.addEventListener('keydown', $onKeyDown) + } else { + window.removeEventListener('pjax:complete', $onPJAXEnd) + window.removeEventListener('keydown', $onKeyDown) + } + }) + } +} + export default { init, onPJAXEnd, @@ -256,4 +278,5 @@ export default { setCopySnippet, setError, handleError, + useListeners, }