UNPKG

jack-cli

Version:

Chop through that Git log wicked fast!

88 lines (73 loc) 1.62 kB
import { Action, BlessedElement, State, StateProperty, Status, UpdateFunction, View, } from '../types/types'; import { reducer } from './reducers'; export const INITIAL_STATE: State = { SHA: '', index: 0, indexesMatchingSearch: [], indexesWithSHAs: [], lines: [], markedSHA: '', search: '', status: Status.RETRIEVING_LOG, view: View.LIST, visibleLines: [], }; export interface Store { dispatch(action: Action): void; getState(): State; subscribe(updateFn: () => void): void; } const getStore = ( reducerFn: (state: State, action: Action) => State, ): Store => { let state: State = { ...INITIAL_STATE }; const subscribers: Array<() => void> = []; return { dispatch(action: Action) { state = reducerFn(state, action); subscribers.forEach((subscriber) => subscriber()); }, getState() { return { ...state }; }, subscribe(updateFn: () => void) { subscribers.push(updateFn); }, }; }; export const store: Store = getStore(reducer); export const doSubscribe = <T extends BlessedElement>( propertyNames: StateProperty[], element: T, updateFunction: UpdateFunction<T>, ) => { let lastState = store.getState(); store.subscribe(async () => { const modifiedProperties: StateProperty[] = []; const state = store.getState(); for (const propertyName of propertyNames) { if (state[propertyName] !== lastState[propertyName]) { modifiedProperties.push(propertyName); } } if ( modifiedProperties.length && !!(await updateFunction({ element, lastState, state, })) ) { element.screen.render(); } lastState = state; }); };