From 333898d677441aad482b1d2fa18f94d93f3636a2 Mon Sep 17 00:00:00 2001 From: EnixCoda Date: Sat, 24 Aug 2019 22:03:09 +0800 Subject: [PATCH] feat: init sequence, conditional reload hint --- src/components/SettingsBar.tsx | 49 +++++++++++++++++++--------------- src/driver/connect.ts | 6 +++++ src/driver/core/SideBar.ts | 25 +++++++++++++++-- 3 files changed, 56 insertions(+), 24 deletions(-) diff --git a/src/components/SettingsBar.tsx b/src/components/SettingsBar.tsx index 7f0f34d..6349a8b 100644 --- a/src/components/SettingsBar.tsx +++ b/src/components/SettingsBar.tsx @@ -112,7 +112,7 @@ export default class SettingsBar extends React.PureComponent { throw new Error(`Cannot resolve token response: '${JSON.stringify(res)}'`) } window.history.pushState({}, 'removed code', window.location.pathname.replace(/#.*$/, '')) - this.setState({ accessToken }, () => this.saveToken()) + this.setState({ accessToken }, () => this.saveToken('')) } } @@ -131,7 +131,16 @@ export default class SettingsBar extends React.PureComponent { } } - saveToken = async () => { + saveToken = async ( + hint: State['accessTokenHint'] = ( + + window.location.reload()}> + Reload + {' '} + to activate! + + ), + ) => { const { onAccessTokenChange } = this.props const { accessToken } = this.state if (accessToken) { @@ -139,14 +148,7 @@ export default class SettingsBar extends React.PureComponent { onAccessTokenChange(accessToken) this.setState({ accessToken: '', - accessTokenHint: ( - - window.location.reload()}> - Reload - {' '} - to activate! - - ), + accessTokenHint: hint, }) } } @@ -222,18 +224,21 @@ export default class SettingsBar extends React.PureComponent {
-

Access Token

- - Create token - - - Why & how to create it? - -
+

+ Access Token + +  (?) + +

+ {!hasAccessToken && ( + + Create with OAuth + + )}
(mapping: Sources) } } } + +export function promisifyGetState( + get: PreDispatch, +): () => Promise { + return () => new Promise(resolve => get(state => resolve(state))) +} diff --git a/src/driver/core/SideBar.ts b/src/driver/core/SideBar.ts index 70aed34..cba88d4 100644 --- a/src/driver/core/SideBar.ts +++ b/src/driver/core/SideBar.ts @@ -11,7 +11,7 @@ import GitHubHelper, { import configHelper from 'utils/configHelper' import URLHelper from 'utils/URLHelper' import keyHelper from 'utils/keyHelper' -import { MethodCreator } from 'driver/connect' +import { MethodCreator, promisifyGetState } from 'driver/connect' import { Props } from 'components/SideBar' import SettingsBar from 'components/SettingsBar' @@ -40,6 +40,7 @@ export type ConnectorState = { copySnippetButton: boolean logoContainerElement: Element | null disabled: boolean + initializingPromise: Promise | null init: () => void onPJAXEnd: () => void @@ -55,12 +56,24 @@ export type ConnectorState = { } const init: MethodCreator = dispatch => async () => { + const { initializingPromise } = await promisifyGetState(dispatch.get)() + if (initializingPromise) await initializingPromise + + let done: any = null // cannot use type `(() => void) | null` here + dispatch.set({ + initializingPromise: new Promise(resolve => { + done = () => resolve() + }), + }) + try { if (!URLHelper.isInRepoPage()) { dispatch.set({ disabled: true }) return } dispatch.set({ + errorDueToAuth: false, + showSettings: false, logoContainerElement: DOMHelper.insertLogoMountPoint(), }) let detectedBranchName @@ -139,6 +152,8 @@ const init: MethodCreator = dispatch => async () => { DOMHelper.markGitakoReadyState() } catch (err) { dispatch.call(handleError, err) + } finally { + if (done) done() } } @@ -219,7 +234,13 @@ const onAccessTokenChange: MethodCreator< Props, ConnectorState, [ConnectorState['accessToken']] -> = dispatch => accessToken => dispatch.set({ accessToken }) +> = dispatch => accessToken => { + dispatch.set({ accessToken }) + // reload when setting new accessToken + if (accessToken) { + dispatch.call(init) + } +} const onShortcutChange: MethodCreator< Props,