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