PluginProbe
ElasticPress / 5.3.5
ElasticPress v5.3.5
5.3.5 5.3.4 3.6.5 3.6.6 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.4.1 4.5.0 4.5.1 4.5.2 4.6.0 4.6.1 4.7.0 4.7.1 4.7.2 5.0.0 5.0.1 5.0.2 All 108 releases
elasticpress / assets / js / api-search / src / reducer.js

reducer.js in ElasticPress 5.3.5, at assets/js/api-search/src/reducer.js

112 lines 2.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * Internal dependencies.
3 */
4 import { getArgsWithoutConstraints } from './utilities';
5
6 /**
7 * Reducer function.
8 *
9 * @param {object} state Current state.
10 * @param {object} action Action data.
11 * @returns {object} Updated state.
12 */
13 export default (state, action) => {
14 const newState = { ...state, isPoppingState: false };
15
16 switch (action.type) {
17 case 'CLEAR_CONSTRAINTS': {
18 const clearedArgs = getArgsWithoutConstraints(newState.args, newState.argsSchema);
19
20 newState.args = clearedArgs;
21 newState.args.offset = 0;
22
23 break;
24 }
25 case 'CLEAR_RESULTS': {
26 newState.aggregations = {};
27 newState.searchResults = [];
28 newState.totalResults = 0;
29 break;
30 }
31 case 'SEARCH': {
32 const { updateDefaults, ...args } = action.args;
33
34 newState.args = { ...newState.args, ...args, offset: 0 };
35 newState.isOn = true;
36
37 if (updateDefaults && args.post_type.length) {
38 newState.argsSchema.post_type.default = args.post_type;
39 }
40
41 break;
42 }
43 case 'SEARCH_FOR': {
44 const clearedArgs = getArgsWithoutConstraints(newState.args, newState.argsSchema);
45
46 newState.args = clearedArgs;
47 newState.args.search = action.searchTerm;
48 newState.args.offset = 0;
49 newState.isOn = true;
50
51 break;
52 }
53 case 'SET_IS_LOADING': {
54 newState.isLoading = action.isLoading;
55 break;
56 }
57 case 'TURN_OFF': {
58 newState.args = { ...newState.args };
59 newState.isOn = false;
60 break;
61 }
62 case 'SET_RESULTS': {
63 const {
64 hits: { hits, total },
65 aggregations,
66 suggest,
67 } = action.response;
68
69 newState.isFirstSearch = false;
70
71 /**
72 * Total number of items.
73 */
74 const totalNumber = typeof total === 'number' ? total : total.value;
75
76 newState.aggregations = aggregations;
77 newState.searchResults = hits;
78 newState.searchTerm = newState.args.search;
79 newState.totalResults = totalNumber;
80 newState.suggestedTerms = suggest?.ep_suggestion?.[0]?.options || [];
81
82 break;
83 }
84 case 'NEXT_PAGE': {
85 newState.args.offset += newState.args.per_page;
86 break;
87 }
88 case 'PREVIOUS_PAGE': {
89 newState.args.offset = Math.max(newState.args.offset - newState.args.per_page, 0);
90 break;
91 }
92 case 'SET_OFFSET': {
93 const offset = Number.isFinite(action.offset) ? action.offset : 0;
94 newState.args.offset = Math.max(offset, 0);
95 break;
96 }
97 case 'POP_STATE': {
98 const { isOn, args } = action.args;
99
100 newState.args = args;
101 newState.isOn = isOn;
102 newState.isPoppingState = true;
103
104 break;
105 }
106 default:
107 break;
108 }
109
110 return newState;
111 };
112