aboutsummaryrefslogtreecommitdiff
path: root/src/console/reducers/index.ts
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2019-05-07 21:16:47 +0900
committerGitHub <noreply@github.com>2019-05-07 21:16:47 +0900
commit05ef6a8ca35aaa801c11eb6b4896caa3690058af (patch)
tree2c7708ca91ac2b462cc86aa28612e3d3943496f3 /src/console/reducers/index.ts
parent457d954e08923b4accd28a919c72d0b61db1bb98 (diff)
parent27d0a7f37d24a0ad68a8ccb7dee18fc1d00eea58 (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.ts115
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;
+ }
+}