diff options
author | Shin'ya Ueoka <ueokande@i-beam.org> | 2019-05-07 21:16:47 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-07 21:16:47 +0900 |
commit | 05ef6a8ca35aaa801c11eb6b4896caa3690058af (patch) | |
tree | 2c7708ca91ac2b462cc86aa28612e3d3943496f3 /src/console/reducers/index.ts | |
parent | 457d954e08923b4accd28a919c72d0b61db1bb98 (diff) | |
parent | 27d0a7f37d24a0ad68a8ccb7dee18fc1d00eea58 (diff) |
Merge pull request #578 from ueokande/move-to-typescript
Move to TypeScript
Diffstat (limited to 'src/console/reducers/index.ts')
-rw-r--r-- | src/console/reducers/index.ts | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/console/reducers/index.ts b/src/console/reducers/index.ts new file mode 100644 index 0000000..b6be483 --- /dev/null +++ b/src/console/reducers/index.ts @@ -0,0 +1,115 @@ +import * as actions from '../actions'; + +export interface State { + mode: string; + messageText: string; + consoleText: string; + completionSource: string; + completions: any[], + select: number; + viewIndex: number; +} + +const defaultState = { + mode: '', + messageText: '', + consoleText: '', + completionSource: '', + completions: [], + select: -1, + viewIndex: 0, +}; + +const nextSelection = (state: State): number => { + if (state.completions.length === 0) { + return -1; + } + if (state.select < 0) { + return 0; + } + + let length = state.completions + .map(g => g.items.length) + .reduce((x, y) => x + y); + if (state.select + 1 < length) { + return state.select + 1; + } + return -1; +}; + +const prevSelection = (state: State): number => { + let length = state.completions + .map(g => g.items.length) + .reduce((x, y) => x + y); + if (state.select < 0) { + return length - 1; + } + return state.select - 1; +}; + +const nextConsoleText = (completions: any[], select: number, defaults: any) => { + if (select < 0) { + return defaults; + } + let items = completions.map(g => g.items).reduce((g1, g2) => g1.concat(g2)); + return items[select].content; +}; + +// eslint-disable-next-line max-lines-per-function +export default function reducer( + state: State = defaultState, + action: actions.ConsoleAction, +): State { + switch (action.type) { + case actions.CONSOLE_HIDE: + return { ...state, + mode: '', }; + case actions.CONSOLE_SHOW_COMMAND: + return { ...state, + mode: 'command', + consoleText: action.text, + completions: []}; + case actions.CONSOLE_SHOW_FIND: + return { ...state, + mode: 'find', + consoleText: '', + completions: []}; + case actions.CONSOLE_SHOW_ERROR: + return { ...state, + mode: 'error', + messageText: action.text, }; + case actions.CONSOLE_SHOW_INFO: + return { ...state, + mode: 'info', + messageText: action.text, }; + case actions.CONSOLE_HIDE_COMMAND: + return { + ...state, + mode: state.mode === 'command' || state.mode === 'find' ? '' : state.mode, + }; + case actions.CONSOLE_SET_CONSOLE_TEXT: + return { ...state, + consoleText: action.consoleText, }; + case actions.CONSOLE_SET_COMPLETIONS: + return { ...state, + completions: action.completions, + completionSource: action.completionSource, + select: -1 }; + case actions.CONSOLE_COMPLETION_NEXT: { + let select = nextSelection(state); + return { ...state, + select: select, + consoleText: nextConsoleText( + state.completions, select, state.completionSource) }; + } + case actions.CONSOLE_COMPLETION_PREV: { + let select = prevSelection(state); + return { ...state, + select: select, + consoleText: nextConsoleText( + state.completions, select, state.completionSource) }; + } + default: + return state; + } +} |