UNPKG

ih-black-lion

Version:

State handler for Arus projects

94 lines (87 loc) 2.52 kB
import matchSorter from 'match-sorter'; import Fuse from 'fuse.js'; import { request, invalidate, toArray, receiveNested as receive } from '../boilerplate'; import { REQUEST_NAVCOL, RECEIVE_NAVCOL, INVALIDATE_NAVCOL, SEARCH_NAVCOL } from '../actionTypes'; const initState = { isFetching: false, didInvalidate: false, data: {}, }; function search(state, action) { const searchResults = []; if (action.searchString.length > 2) { for (const object in state.data) { const nav = state.data[object]; try { const fuse = new Fuse(toArray(nav.contents).filter(item => !item.contents), { keys: [ { name: 'label', weight: 0.9, }, { name: 'description', weight: 0.1, }, ], shouldSort: true, threshold: 0.3, location: 0, distance: 80, maxPatternLength: 32, minMatchCharLength: 2, include: ['score'], includeScore: true, }); const NavItems = fuse.search(action.searchString); toArray(nav.contents).filter(item => item.contents).map((item) => { fuse.set(toArray(item.contents)); fuse.search(action.searchString).map(childItem => NavItems.push(childItem)); }); if (NavItems.length > 0) { searchResults.push({ Name: nav.name, Label: nav.label, HasResults: NavItems.length > 0, NavItems, Score: NavItems.length > 0 ? NavItems.reduce((acc, item) => acc + item.score, 0) / NavItems.length : 0, }); } } catch (exception) { console.log(exception); } } } const returnResults = searchResults.sort((first, second) => { if (first.Score > second.Score) { return 1; } if (first.Score < second.Score) { return -1; } return 0; }); const nextState = { searchResults: returnResults, lastAction: { type: SEARCH_NAVCOL, }, }; return { ...state, ...nextState }; } export default function navCollectionReducer(state = initState, action) { switch (action.type) { case REQUEST_NAVCOL: return request(state, action); case RECEIVE_NAVCOL: return receive(state, action); case INVALIDATE_NAVCOL: return invalidate(state, action); case SEARCH_NAVCOL: return search(state, action); default: return state; } }