You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.4 KiB
96 lines
2.4 KiB
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; |
|
} |
|
};
|
|
|