@empathyco/x-components
Version:
Empathy X Components
171 lines (168 loc) • 5.54 kB
JavaScript
import { isFacetFilter } from '@empathyco/x-types';
import { setConfig, mergeConfig } from '../../../store/utils/config-store.utils.js';
import '@empathyco/x-utils';
import { setQuery } from '../../../store/utils/query.utils.js';
import { setStatus } from '../../../store/utils/status-store.utils.js';
import { groupItemsBy } from '../../../utils/array.js';
import { UNKNOWN_FACET_KEY } from '../../facets/store/constants.js';
import { cancelFetchAndSaveSearchResponse, fetchAndSaveSearchResponse } from './actions/fetch-and-save-search-response.action.js';
import { fetchSearchResponse } from './actions/fetch-search-response.action.js';
import { increasePageAppendingResults } from './actions/increase-page-apending-results.action.js';
import { resetRequestOnRefinement } from './actions/reset-request-on-refinement.action.js';
import { saveOrigin } from './actions/save-origin.action.js';
import { saveSearchResponse } from './actions/save-search-response.action.js';
import { setUrlParams } from './actions/set-url-params.action.js';
import { query } from './getters/query.getter.js';
import { request } from './getters/request.getter.js';
/**
* {@link XStoreModule} For the search module.
*
* @internal
*/
const searchXStoreModule = {
state: () => ({
...resettableState(),
selectedFilters: {},
params: {},
config: {
pageSize: 24,
pageMode: 'infinite_scroll',
},
status: 'initial',
isNoResults: false,
fromNoResultsWithFilters: false,
}),
getters: {
request,
query,
},
mutations: {
appendResults(state, results) {
state.results = [...state.results, ...results];
},
resetState(state) {
Object.assign(state, resettableState());
},
resetStateForReload(state) {
const { query, facets, sort, page, ...resettable } = resettableState();
Object.assign(state, resettable);
},
setQuery,
setResults(state, results) {
state.results = results;
},
setPartialResults(state, partialResults) {
state.partialResults = partialResults;
},
setFacets(state, facets) {
state.facets = facets;
},
setRelatedTags(state, relatedTags) {
state.relatedTags = relatedTags;
},
setSelectedFilters(state, selectedFilters) {
state.selectedFilters = groupItemsBy(selectedFilters, filter => isFacetFilter(filter) ? filter.facetId : UNKNOWN_FACET_KEY);
},
setBanners(state, banners) {
state.banners = banners;
},
setPromoteds(state, promoteds) {
state.promoteds = promoteds;
},
setSpellcheck(state, spellcheckedQuery) {
state.spellcheckedQuery = spellcheckedQuery;
},
setTotalResults(state, totalResults) {
state.totalResults = totalResults;
},
setSort(state, sort) {
state.sort = sort;
},
setPage(state, page) {
state.page = page;
},
setConfig,
mergeConfig,
setIsAppendResults(state, isAppendResults) {
state.isAppendResults = isAppendResults;
},
setIsNoResults(state, isNoResults) {
state.isNoResults = isNoResults;
},
setFromNoResultsWithFilters(state, fromNoResultsWithFilters) {
state.fromNoResultsWithFilters = fromNoResultsWithFilters;
},
setStatus,
setParams(state, params) {
state.params = params;
},
setOrigin(state, origin = null) {
state.origin = origin;
},
setRedirections(state, redirections) {
state.redirections = redirections;
},
setQueryTagging(state, queryTagging) {
state.queryTagging = queryTagging;
},
setDisplayTagging(state, displayTagging) {
state.displayTagging = displayTagging;
},
updateResult(state, result) {
const stateResult = state.results.find(stateResult => result.id === stateResult.id);
if (stateResult) {
Object.assign(stateResult, result);
}
},
setStats(state, stats) {
state.stats = stats;
},
},
actions: {
cancelFetchAndSaveSearchResponse,
fetchSearchResponse,
fetchAndSaveSearchResponse,
increasePageAppendingResults,
resetRequestOnRefinement,
saveSearchResponse,
setUrlParams,
saveOrigin,
},
};
/**
* Function to return the "resettable" part of the state. This will be used in the `resetState`
* mutation to reset to the initial state.
*
* @returns The "resettable" part of the {@link SearchState}.
*
* @internal
*/
function resettableState() {
return {
query: '',
results: [],
partialResults: [],
facets: [],
relatedTags: [],
banners: [],
promoteds: [],
totalResults: 0,
spellcheckedQuery: '',
sort: '',
page: 1,
origin: null,
isAppendResults: false,
redirections: [],
queryTagging: {
url: '',
params: {},
},
displayTagging: {
url: '',
params: {},
},
stats: {},
};
}
export { resettableState, searchXStoreModule };
//# sourceMappingURL=module.js.map