mirror of
https://github.com/EnixCoda/Gitako.git
synced 2026-03-11 08:54:44 +00:00
refactor: sync get state
This commit is contained in:
parent
c648f8b82a
commit
9251b2a3ac
4 changed files with 24 additions and 38 deletions
|
|
@ -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 })
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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') {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue