forked from GetStream/stream-react-example
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSearch.js
More file actions
123 lines (112 loc) · 2.47 KB
/
Copy pathSearch.js
File metadata and controls
123 lines (112 loc) · 2.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import { Search as SearchActions } from 'actions';
/**
* initialState
* @type {{active: null, recent: Array, hits: Array, term: string, total: number, results: Array}}
*/
const initialState = {
active: null,
recent: [],
hits: [],
term: '',
total: 0,
results: [],
};
/**
* Search
* Redux Reducer for Search action
* Reference: http://redux.js.org/docs/basics/Reducers.html
* @param state
* @param action
* @returns {*}
* @constructor
*/
function Search(state = initialState, action) {
switch (action.type) {
case SearchActions.TRIGGER:
if (action.response) {
return Object.assign({}, state, { active: action.search });
}
return state;
case SearchActions.SEARCH:
if (action.response) {
return Object.assign({}, state, {
term: action.term,
total: action.response.nbHits,
hits: [
...Object.values(
action.response.hits
.map(a => {
const keys = Object.keys(
a._highlightResult,
);
let type;
keys.forEach(key => {
if (
a._highlightResult[key]
.matchLevel != 'none'
) {
type = key;
}
});
let word;
switch (type) {
case 'hashtags':
word =
a._highlightResult[type]
.matchedWords[0];
break;
case 'location':
word = a.location;
break;
}
if (a.first_name) {
word = {
email: a.email,
id: a.id,
name: `${a.first_name} ${a.last_name &&
a.last_name.charAt(0)}.`,
};
type = 'user';
}
return {
word,
type,
};
})
.filter(a => a.word)
.reduce((prev, a) => {
const word = a.word.email || a.word;
if (prev[word + a.type]) {
prev[word + a.type].count++;
return prev;
}
prev[word + a.type] = {
word: a.word,
type: a.type,
count: 1,
};
return prev;
}, {}),
),
],
});
}
return state;
case SearchActions.RECENT:
if (action.response) {
return Object.assign({}, state, {
recent: [...action.response],
});
}
return state;
case SearchActions.RESULTS:
if (action.response) {
return Object.assign({}, state, {
results: [...action.response],
});
}
return state;
}
return state;
}
export default Search;