60 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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;
 | |
|   }
 | |
| };
 |