about summary refs log tree commit diff
path: root/app/assets/javascripts/components/reducers
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-11-13 13:04:18 +0100
committerEugen Rochko <eugen@zeonfederated.com>2016-11-13 13:04:18 +0100
commitf0bdfadab7e5293b3f7855b6707a1fa95ea76ca6 (patch)
tree21ea4e75a0e8398eed1f738c40eecab9c1ea65c9 /app/assets/javascripts/components/reducers
parent8152584cf57c2b5a797d73f5afac0bba3c904f6d (diff)
Search component
Diffstat (limited to 'app/assets/javascripts/components/reducers')
-rw-r--r--app/assets/javascripts/components/reducers/accounts.jsx2
-rw-r--r--app/assets/javascripts/components/reducers/index.jsx4
-rw-r--r--app/assets/javascripts/components/reducers/search.jsx60
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;
+  }
+};