ih-black-lion
Version:
State handler for Arus projects
94 lines (87 loc) • 2.52 kB
JavaScript
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;
}
}