UNPKG

example-viewer

Version:

A presentation tool for code examples.

70 lines (65 loc) 1.88 kB
import set from "lodash/fp/set"; import { getFiles } from "./getFiles"; // The Redux reducer. export default function (state, action){ state = state || {}; switch (action.type) { case "REQUEST_INDEX": return Object.assign(state, { indexFetching: true }); case "RECEIVE_INDEX": return Object.assign(state, { indexFetching: false, index: action.data }); case "NAVIGATE": return Object.assign(state, { params: action.params || { unit: 1, module: 1, example: 1 } }); case "RECEIVE_FILE": case "EDIT_FILE": return set([ "index", "units", action.params.unit - 1, // Use zero-based index. "modules", action.params.module - 1, "examples", action.params.example - 1, "files", action.filename ], action.content, state); case "NEXT": return go(state, 1); case "PREVIOUS": return go(state, -1); case "SAVED": return set("notify", action, state); case "INSERT": state = set([ "index", "units", state.params.unit - 1, // Use zero-based index. "modules", state.params.module - 1, "examples", state.params.example, // In the next example, "files" ], getFiles(state), state); // set files of the current example. return go(state, 1); default: return state; } }; // Goes to the next or previous example. function go(state, increment){ // Update the example param in the state. const example = state.params.example + increment; state = set("params.example", example, state); // Update the notification in the state. const FORWARD = (increment === 1); return set("notify", { message: FORWARD ? "→" : "←", position: FORWARD ? 0.75 : 0.25, size: 30, time: Date.now() }, state); }