Search component

This commit is contained in:
Eugen Rochko
2016-11-13 13:04:18 +01:00
parent 8152584cf5
commit f0bdfadab7
8 changed files with 291 additions and 4 deletions

View File

@ -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:

View File

@ -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
});

View File

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