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;
  }
};