diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2016-11-13 13:04:18 +0100 |
---|---|---|
committer | Eugen Rochko <eugen@zeonfederated.com> | 2016-11-13 13:04:18 +0100 |
commit | f0bdfadab7e5293b3f7855b6707a1fa95ea76ca6 (patch) | |
tree | 21ea4e75a0e8398eed1f738c40eecab9c1ea65c9 /app/assets/javascripts/components/reducers | |
parent | 8152584cf57c2b5a797d73f5afac0bba3c904f6d (diff) |
Search component
Diffstat (limited to 'app/assets/javascripts/components/reducers')
-rw-r--r-- | app/assets/javascripts/components/reducers/accounts.jsx | 2 | ||||
-rw-r--r-- | app/assets/javascripts/components/reducers/index.jsx | 4 | ||||
-rw-r--r-- | app/assets/javascripts/components/reducers/search.jsx | 60 |
3 files changed, 65 insertions, 1 deletions
diff --git a/app/assets/javascripts/components/reducers/accounts.jsx b/app/assets/javascripts/components/reducers/accounts.jsx index 471e1b0aa..b20b3d0c5 100644 --- a/app/assets/javascripts/components/reducers/accounts.jsx +++ b/app/assets/javascripts/components/reducers/accounts.jsx @@ -26,6 +26,7 @@ import { STATUS_FETCH_SUCCESS, CONTEXT_FETCH_SUCCESS } from '../actions/statuses'; +import { SEARCH_SUGGESTIONS_READY } from '../actions/search'; import Immutable from 'immutable'; const normalizeAccount = (state, account) => state.set(account.id, Immutable.fromJS(account)); @@ -70,6 +71,7 @@ export default function accounts(state = initialState, action) { case REBLOGS_FETCH_SUCCESS: case FAVOURITES_FETCH_SUCCESS: case COMPOSE_SUGGESTIONS_READY: + case SEARCH_SUGGESTIONS_READY: return normalizeAccounts(state, action.accounts); case TIMELINE_REFRESH_SUCCESS: case TIMELINE_EXPAND_SUCCESS: diff --git a/app/assets/javascripts/components/reducers/index.jsx b/app/assets/javascripts/components/reducers/index.jsx index ccc9e8e8e..e2203cc1a 100644 --- a/app/assets/javascripts/components/reducers/index.jsx +++ b/app/assets/javascripts/components/reducers/index.jsx @@ -10,6 +10,7 @@ import user_lists from './user_lists'; import accounts from './accounts'; import statuses from './statuses'; import relationships from './relationships'; +import search from './search'; export default combineReducers({ timelines, @@ -22,5 +23,6 @@ export default combineReducers({ user_lists, accounts, statuses, - relationships + relationships, + search }); diff --git a/app/assets/javascripts/components/reducers/search.jsx b/app/assets/javascripts/components/reducers/search.jsx new file mode 100644 index 000000000..f3ee17f60 --- /dev/null +++ b/app/assets/javascripts/components/reducers/search.jsx @@ -0,0 +1,60 @@ +import { + SEARCH_CHANGE, + SEARCH_SUGGESTIONS_READY, + SEARCH_RESET +} from '../actions/search'; +import Immutable from 'immutable'; + +const initialState = Immutable.Map({ + value: '', + loaded_value: '', + suggestions: [] +}); + +const normalizeSuggestions = (state, value, accounts) => { + let newSuggestions = [ + { + title: 'Account', + items: accounts.map(item => ({ + type: 'account', + id: item.id, + value: item.acct + })) + } + ]; + + if (value.indexOf('@') === -1) { + newSuggestions.push({ + title: 'Hashtag', + items: [ + { + type: 'hashtag', + id: value, + value: `#${value}` + } + ] + }); + } + + return state.withMutations(map => { + map.set('suggestions', newSuggestions); + map.set('loaded_value', value); + }); +}; + +export default function search(state = initialState, action) { + switch(action.type) { + case SEARCH_CHANGE: + return state.set('value', action.value); + case SEARCH_SUGGESTIONS_READY: + return normalizeSuggestions(state, action.value, action.accounts); + case SEARCH_RESET: + return state.withMutations(map => { + map.set('suggestions', []); + map.set('value', ''); + map.set('loaded_value', ''); + }); + default: + return state; + } +}; |