cluedin-widget
Version:
This project contains all the pages needed for browsing entities and searching them. The aim is to replace the CluedIn.Webapp project with this one when all the pages ( including the Admin page ) will be ported to REACT.
133 lines (119 loc) • 4.41 kB
JavaScript
import constants from '../constants';
import iso from '../../iso';
const initialState = {
initialSearchQuery: void 0,
searchResult: void 0,
isFetchingSearch: false,
suggestedSearches: [],
suggestedSearchQuery: '',
selectedFilters: [],
sortDirection: void 0,
pageNumber: 0,
isFetchingNextPage: false,
isFetchingInitialSearch: false,
initialFacets: void 0,
isFetchingAggregationSearch: false,
aggregationSearchId: void 0,
aggregationSearchResult: {},
searchOptions: {},
entityFacets: {},
typeSearch: void 0,
};
export default function update(state = initialState, action = {}) {
switch (action.type) {
case constants.search.REQUEST_INITIAL_SEARCH:
let searchOptions = action.data.query;
return Object.assign({}, state, {
initialSearchQuery: action.data.q,
searchResult: void 0,
selectedFilters: [],
sortDirection: void 0,
pageNumber: 0,
isFetchingNextPage: false,
isFetchingInitialSearch: true,
initialFacets: {},
searchOptions,
});
case constants.search.RECEIVE_INITIAL_SEARCH:
let initialFacetsFromInitialSearch = (action.data.searchResult) ? action.data.searchResult.Facets : {};
return Object.assign({}, state, {
searchResult: action.data.searchResult,
isFetchingInitialSearch: false,
initialFacets: Object.assign({}, initialFacetsFromInitialSearch),
});
case constants.search.REQUEST_SEARCH:
return Object.assign({}, state, {
isFetchingSearch: true,
selectedFilters: action.data.filters,
sortDirection: action.data.sortingDirection,
typeSearch: action.data.type,
});
case constants.search.RECEIVE_SEARCH:
return Object.assign({}, state, {
searchResult: action.data.searchResult,
isFetchingSearch: false,
});
case constants.search.RECEIVE_SUGGESTED_SEARCH:
return Object.assign({}, state, {
suggestedSearches: action.data.suggestedSearches,
suggestedSearchQuery: action.data.suggestedSearchQuery,
});
case constants.search.REQUEST_SEARCH_WITH_FILTER:
let oldSelectedFiltersFiltered = iso.collection.filter(state.selectedFilters, (f) => {
return action.data.searchFilter.filterType !== f.filterType;
});
return Object.assign({}, state, {
isFetchingSearch: true,
selectedFilters: [...oldSelectedFiltersFiltered, action.data.searchFilter],
});
case constants.search.RECEIVE_SEARCH_WITH_FILTER:
return Object.assign({}, state, {
searchResult: action.data.searchResult,
isFetchingSearch: false,
});
case constants.search.REQUEST_REMOVE_FILTER_SEARCH:
let filteredSelectedFilters = iso.collection.filter(state.selectedFilters, (f) => {
return f.filterType !== action.data.filterType;
});
return Object.assign({}, state, {
isFetchingSearch: true,
selectedFilters: [...filteredSelectedFilters],
});
case constants.search.RECEIVE_REMOVE_FILTER_SEARCH:
return Object.assign({}, state, {
searchResult: action.data.searchResult,
isFetchingSearch: false,
});
case constants.search.REQUEST_NEXT_PAGE_NUMBER:
return Object.assign({}, state, {
isFetchingNextPage: true,
pageNumber: action.data.pageNumber,
});
case constants.search.RECEIVE_NEXT_PAGE_NUMBER:
if (state.searchResult && state.searchResult.Hits) {
let allHits = state.searchResult.Hits.concat(action.data.searchResult.Hits);
state.searchResult.Hits = [...allHits];
}
return Object.assign({}, state, {
searchResult: Object.assign({}, state.searchResult),
isFetchingNextPage: false,
});
case constants.search.REQUEST_AGGREGATION_SEARCH:
return Object.assign({}, state, {
isFetchingAggregationSearch: true,
aggregationSearchId: action.data.id,
aggregationSearchResult: {},
});
case constants.search.RECEIVE_AGGREGATION_SEARCH:
return Object.assign({}, state, {
isFetchingAggregationSearch: false,
aggregationSearchResult: action.data.searchResult,
});
case constants.search.RECEIVE_ENTITY_FACETS:
return Object.assign({}, state, {
entityFacets: action.data.facets,
});
default:
return state;
}
};