import * as actions from "../actions"; import Completions from "../Completions"; import CompletionType from "../../shared/CompletionType"; export interface State { mode: string; messageText: string; consoleText: string; completionTypes: CompletionType[]; completionSource: string; completions: Completions; select: number; viewIndex: number; } const defaultState = { mode: "", messageText: "", consoleText: "", completionTypes: [], completionSource: "", completions: [], select: -1, viewIndex: 0, }; const nextSelection = (state: State): number => { if (state.completions.length === 0) { return -1; } if (state.select < 0) { return 0; } const 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 => { const 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; } const 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, completionTypes: action.completionTypes, 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: { const select = nextSelection(state); return { ...state, select: select, consoleText: nextConsoleText( state.completions, select, state.completionSource ), }; } case actions.CONSOLE_COMPLETION_PREV: { const select = prevSelection(state); return { ...state, select: select, consoleText: nextConsoleText( state.completions, select, state.completionSource ), }; } default: return state; } }