refactor: sync get state

This commit is contained in:
EnixCoda 2019-08-27 22:38:07 +08:00
parent c648f8b82a
commit 9251b2a3ac
No known key found for this signature in database
GPG key ID: 0C1A07377913A1DD
4 changed files with 24 additions and 38 deletions

View file

@ -31,9 +31,9 @@ class FileExplorer extends React.Component<Props & ConnectorState> {
}
componentWillMount() {
const { init, setUpTree, treeData } = this.props
const { init, setUpTree, treeData, metaData, compressSingletonFolder, accessToken } = this.props
init()
setUpTree(treeData)
setUpTree({ treeData, metaData, compressSingletonFolder, accessToken })
}
componentDidMount() {
@ -43,8 +43,8 @@ class FileExplorer extends React.Component<Props & ConnectorState> {
componentWillReceiveProps(nextProps: Props & ConnectorState) {
if (nextProps.treeData !== this.props.treeData) {
const { setUpTree } = nextProps
setUpTree()
const { setUpTree, treeData, metaData, compressSingletonFolder, accessToken } = nextProps
setUpTree({ treeData, metaData, compressSingletonFolder, accessToken })
}
}

View file

@ -34,10 +34,7 @@ function run<M extends Method>([method, args]: [M, Parameters<M>]) {
}
export type DispatchState<Props, State> = React.Component<Props, State>['setState']
export type PreDispatch<Props, State> = (
dispatchCallback: (state: State, props: Props) => Props | Promise<void> | void,
callback?: () => void,
) => void
export type GetState<State> = () => State
export type TriggerOtherMethod<Props, State> = <Args, MC extends MethodCreator<Props, State, Args>>(
methodCreator: MC,
...args: Parameters<ReturnType<MC>>
@ -45,7 +42,7 @@ export type TriggerOtherMethod<Props, State> = <Args, MC extends MethodCreator<P
export type Dispatch<Props, State> = {
set: DispatchState<Props, State>
get: PreDispatch<Props, State>
get: GetState<State>
call: TriggerOtherMethod<Props, State>
}
@ -81,13 +78,7 @@ function link<P, S>(instance: React.Component<P, S>, sources: Sources<P, S>): Wr
const dispatchState: DispatchState<P, S> = (updater, callback) => {
instance.setState(updater, callback)
}
const prepareState: PreDispatch<P, S> = async updater => {
try {
await updater(instance.state, instance.props)
} catch (error) {
raiseError(error)
}
}
const prepareState: GetState<S> = () => instance.state
const dispatch: Dispatch<P, S> = {
call: dispatchCall,
get: prepareState,
@ -124,8 +115,3 @@ export default function connect<BaseP, ExtraP>(mapping: Sources<BaseP, ExtraP>)
}
}
export function promisifyGetState<Props, State>(
get: PreDispatch<Props, State>,
): () => Promise<State> {
return () => new Promise(resolve => get(state => resolve(state)))
}

View file

@ -125,8 +125,11 @@ function handleParsed(root: TreeNode, parsed: Parsed) {
})
}
const setUpTree: MethodCreator<Props, ConnectorState> = dispatch => () =>
dispatch.get(async (_, { treeData, metaData, compressSingletonFolder, accessToken }) => {
const setUpTree: MethodCreator<
Props,
ConnectorState,
[Pick<Props, 'treeData' | 'metaData' | 'compressSingletonFolder' | 'accessToken'>]
> = dispatch => async ({ treeData, metaData, compressSingletonFolder, accessToken }) => {
if (!treeData) return
dispatch.call(setStateText, 'Rendering File List...')
const { root, gitModules } = treeParser.parse(treeData, metaData)
@ -153,7 +156,7 @@ const setUpTree: MethodCreator<Props, ConnectorState> = dispatch => () =>
tasksAfterRender.push(DOMHelper.focusSearchInput)
dispatch.call(setStateText, '')
dispatch.call(goTo, URLHelper.getCurrentPath(metaData.branchName))
})
}
const execAfterRender: MethodCreator<Props, ConnectorState> = dispatch => () => {
for (const task of tasksAfterRender) {
@ -175,8 +178,8 @@ const handleKeyDown: MethodCreator<
Props,
ConnectorState,
[React.KeyboardEvent]
> = dispatch => event =>
dispatch.get(({ searched, visibleNodes }) => {
> = dispatch => event => {
const { searched, visibleNodes } = dispatch.get()
if (!visibleNodes) return
const { nodes, focusedNode, expandedNodes, depths } = visibleNodes
function handleVerticalMove(index: number) {
@ -278,7 +281,7 @@ const handleKeyDown: MethodCreator<
}
}
}
})
}
const onFocusSearchBar: MethodCreator<Props, ConnectorState> = dispatch => () =>
dispatch.call(focusNode, null, false)
@ -337,12 +340,12 @@ const toggleNodeExpansion: MethodCreator<Props, ConnectorState, [TreeNode, boole
const focusNode: MethodCreator<Props, ConnectorState, [TreeNode | null, boolean]> = dispatch => (
node: TreeNode | null,
skipScroll = false,
) =>
dispatch.get(({ visibleNodes }) => {
) => {
const { visibleNodes } = dispatch.get()
if (!visibleNodes) return
visibleNodesGenerator.focusNode(node)
dispatch.call(updateVisibleNodes)
})
}
const onNodeClick: MethodCreator<Props, ConnectorState, [TreeNode]> = dispatch => node => {
if (node.type === 'tree') {

View file

@ -56,7 +56,7 @@ export type ConnectorState = {
}
const init: MethodCreator<Props, ConnectorState> = dispatch => async () => {
const { initializingPromise } = await promisifyGetState(dispatch.get)()
const { initializingPromise } = dispatch.get()
if (initializingPromise) await initializingPromise
let done: any = null // cannot use type `(() => void) | null` here
@ -178,28 +178,26 @@ const handleError: MethodCreator<Props, ConnectorState, [Error]> = dispatch => a
}
const onPJAXEnd: MethodCreator<Props, ConnectorState> = dispatch => () => {
dispatch.get(({ metaData, copyFileButton, copySnippetButton }) => {
const { metaData, copyFileButton, copySnippetButton } = dispatch.get()
DOMHelper.unmountTopProgressBar()
DOMHelper.decorateGitHubPageContent({ copyFileButton, copySnippetButton })
const mergedMetaData = { ...metaData, ...URLHelper.parse() }
dispatch.call(setShouldShow, URLHelper.isInCodePage(mergedMetaData))
dispatch.call(setMetaData, mergedMetaData)
})
}
const onKeyDown: MethodCreator<Props, ConnectorState, [KeyboardEvent]> = dispatch => e => {
dispatch.get(({ toggleShowSideBarShortcut }) => {
const { toggleShowSideBarShortcut } = dispatch.get()
if (toggleShowSideBarShortcut) {
const keys = keyHelper.parseEvent(e)
if (keys === toggleShowSideBarShortcut) {
dispatch.call(toggleShowSideBar)
}
}
})
}
const toggleShowSideBar: MethodCreator<Props, ConnectorState> = dispatch => () =>
dispatch.get(({ shouldShow }) => dispatch.call(setShouldShow, !shouldShow))
dispatch.call(setShouldShow, !dispatch.get().shouldShow)
const setShouldShow: MethodCreator<
Props,
@ -276,7 +274,7 @@ const useListeners: MethodCreator<Props, ConnectorState, [boolean]> = dispatch =
const $onPJAXEnd = dispatch.call.bind(dispatch, onPJAXEnd)
const $onKeyDown = dispatch.call.bind(dispatch, onKeyDown)
return on => {
dispatch.get(({ disabled }, _) => {
const { disabled } = dispatch.get()
if (on && !disabled) {
window.addEventListener('pjax:complete', $onPJAXEnd)
window.addEventListener('keydown', $onKeyDown)
@ -284,7 +282,6 @@ const useListeners: MethodCreator<Props, ConnectorState, [boolean]> = dispatch =
window.removeEventListener('pjax:complete', $onPJAXEnd)
window.removeEventListener('keydown', $onKeyDown)
}
})
}
}