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 && 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;
 | 
						|
  }
 | 
						|
};
 |