UNPKG

everywherebible

Version:

A Bible app for slow connections

105 lines (96 loc) 2.73 kB
// @flow import type {Action, Preferences, Translation} from './actions'; import type {Reference} from './data/model'; import {chapterIndex, isEqual} from './data/model'; const RECENT_COUNT = 10; export type Toast = {|start: number, text: string|}; // TODO: find a better home export type State = {| +chapters: { +[Translation]: {[number]: string}, }, +recents: Array<Reference>, +preferences: Preferences, +toasts: Array<Toast>, |}; export const DEFAULT = { chapters: {kjv: {}, esv: {}}, recents: [], preferences: { enableFocusMode: false, enableNightMode: false, hasConfirmedFocusMode: false, translation: 'kjv', }, toasts: [], }; const updatedRecents = (reference: Reference, currentRecents: Array<Reference>) => { const withoutNewReference = currentRecents.filter(current => !isEqual(current, reference)); return withoutNewReference.length >= RECENT_COUNT? withoutNewReference.slice(0, RECENT_COUNT) : withoutNewReference; }; export default (state: State = DEFAULT, action: Action) => { switch (action.type) { case 'set-chapter-text': return { ...state, chapters: action.translation === 'kjv'? { kjv: { ...state.chapters.kjv, [chapterIndex(action.reference)]: action.text, }, esv: state.chapters.esv } : { kjv: state.chapters.kjv, esv: { ...state.chapters.esv, [chapterIndex(action.reference)]: action.text, }, }, }; case 'add-recent': return { ...state, recents: [ action.reference, ...updatedRecents(action.reference, state.recents), ], }; case 'set-recents': return {...state, recents: action.recents}; case 'enable-focus-mode': return { ...state, preferences: {...state.preferences, enableFocusMode: action.enabled}, }; case 'enable-night-mode': return { ...state, preferences: {...state.preferences, enableNightMode: action.enabled}, }; case 'set-preferences': return { ...state, preferences: {...state.preferences, ...action.preferences}, }; case 'add-toast': return { ...state, toasts: [ ...state.toasts.filter(t => Date.now() - t.start < 3000), {start: Date.now(), text: action.text}, ] }; case 'confirm-focus-mode': return { ...state, preferences: {...state.preferences, hasConfirmedFocusMode: true}, }; default: (action: empty); // eslint-disable-line return state; } };