about summary refs log tree commit diff
path: root/app/assets/javascripts/components/reducers/search.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/components/reducers/search.jsx')
-rw-r--r--app/assets/javascripts/components/reducers/search.jsx60
1 files changed, 60 insertions, 0 deletions
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;
+  }
+};