UNPKG

patternplate-client

Version:

Universal javascript client application for patternplate

59 lines (45 loc) 1.48 kB
import Fuse from 'fuse.js'; import * as helpers from './helpers'; import handleDependentActions from '../../actions/handle-dependent-actions'; const defaultValue = []; const dependencies = ['expanded', 'navigation']; const searchMatchReducer = handleDependentActions({ '@@router/LOCATION_CHANGE': locationChangeHandler }, {defaultValue, dependencies}); export default searchMatchReducer; function locationChangeHandler(state, action, dependencies) { const {navigation, expanded} = dependencies; const {search = ''} = action.payload.query; if (!expanded) { return navigation; } // Check for a matching folder first // e.g. atoms/ => atoms /* const folder = helpers.searchFolder(search, navigation, {expanded: true}); if (folder) { return folder; } */ const stems = helpers.createStems(search); const tokens = helpers.createTokens(search); const patterns = helpers.getPatterns(navigation, tokens); const ids = stems.length > 0 ? createFuse(patterns, stems).search(stems.join(' ')) : patterns.map(pattern => pattern.id); // Boil down to single pattern if a fully qualified id has been entered const [direct] = ids.filter(id => id === search); const matches = direct ? [direct] : ids; return helpers.filterPatterns(navigation, matches); } function createFuse(patterns) { return new Fuse(patterns, { id: 'id', threshold: 0.3, keys: [ 'id', 'manifest.name', 'manifest.displayName', 'manifest.tags', 'manifest.flag' ] }); }