* Replace browserify with webpack * Add react-intl-translations-manager * Do not minify in development, add offline-plugin for ServiceWorker background cache updates * Adjust tests and dependencies * Fix production deployments * Fix tests * More optimizations * Improve travis cache for npm stuff * Re-run travis * Add back support for custom.scss as before * Remove offline-plugin and babili * Fix issue with Immutable.List().unshift(...values) not working as expected * Make travis load schema instead of running all migrations in sequence * Fix missing React import in WarningContainer. Optimize rendering performance by using ImmutablePureComponent instead of React.PureComponent. ImmutablePureComponent uses Immutable.is() to compare props. Replace dynamic callback bindings in <UI /> * Add react definitions to places that use JSX * Add Procfile.dev for running rails, webpack and streaming API at the same time
		
			
				
	
	
		
			96 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import {
 | |
|   SEARCH_CHANGE,
 | |
|   SEARCH_CLEAR,
 | |
|   SEARCH_FETCH_SUCCESS,
 | |
|   SEARCH_SHOW
 | |
| } from '../actions/search';
 | |
| import { COMPOSE_MENTION, COMPOSE_REPLY } from '../actions/compose';
 | |
| import Immutable from 'immutable';
 | |
| 
 | |
| const initialState = Immutable.Map({
 | |
|   value: '',
 | |
|   submitted: false,
 | |
|   hidden: false,
 | |
|   results: Immutable.Map()
 | |
| });
 | |
| 
 | |
| const normalizeSuggestions = (state, value, accounts, hashtags, statuses) => {
 | |
|   let newSuggestions = [];
 | |
| 
 | |
|   if (accounts.length > 0) {
 | |
|     newSuggestions.push({
 | |
|       title: 'account',
 | |
|       items: accounts.map(item => ({
 | |
|         type: 'account',
 | |
|         id: item.id,
 | |
|         value: item.acct
 | |
|       }))
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   if (value.indexOf('@') === -1 && value.indexOf(' ') === -1 || hashtags.length > 0) {
 | |
|     let hashtagItems = hashtags.map(item => ({
 | |
|       type: 'hashtag',
 | |
|       id: item,
 | |
|       value: `#${item}`
 | |
|     }));
 | |
| 
 | |
|     if (value.indexOf('@') === -1 && value.indexOf(' ') === -1 && !value.startsWith('http://') && !value.startsWith('https://') && hashtags.indexOf(value) === -1) {
 | |
|       hashtagItems.unshift({
 | |
|         type: 'hashtag',
 | |
|         id: value,
 | |
|         value: `#${value}`
 | |
|       });
 | |
|     }
 | |
| 
 | |
|     if (hashtagItems.length > 0) {
 | |
|       newSuggestions.push({
 | |
|         title: 'hashtag',
 | |
|         items: hashtagItems
 | |
|       });
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (statuses.length > 0) {
 | |
|     newSuggestions.push({
 | |
|       title: 'status',
 | |
|       items: statuses.map(item => ({
 | |
|         type: 'status',
 | |
|         id: item.id,
 | |
|         value: item.id
 | |
|       }))
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   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_CLEAR:
 | |
|     return state.withMutations(map => {
 | |
|       map.set('value', '');
 | |
|       map.set('results', Immutable.Map());
 | |
|       map.set('submitted', false);
 | |
|       map.set('hidden', false);
 | |
|     });
 | |
|   case SEARCH_SHOW:
 | |
|     return state.set('hidden', false);
 | |
|   case COMPOSE_REPLY:
 | |
|   case COMPOSE_MENTION:
 | |
|     return state.set('hidden', true);
 | |
|   case SEARCH_FETCH_SUCCESS:
 | |
|     return state.set('results', Immutable.Map({
 | |
|       accounts: Immutable.List(action.results.accounts.map(item => item.id)),
 | |
|       statuses: Immutable.List(action.results.statuses.map(item => item.id)),
 | |
|       hashtags: Immutable.List(action.results.hashtags)
 | |
|     })).set('submitted', true);
 | |
|   default:
 | |
|     return state;
 | |
|   }
 | |
| };
 |