commit
8f3096b846
@ -0,0 +1,52 @@ |
|||||||
|
import api from '../api'; |
||||||
|
import { importFetchedAccounts } from './importer'; |
||||||
|
|
||||||
|
export const SUGGESTIONS_FETCH_REQUEST = 'SUGGESTIONS_FETCH_REQUEST'; |
||||||
|
export const SUGGESTIONS_FETCH_SUCCESS = 'SUGGESTIONS_FETCH_SUCCESS'; |
||||||
|
export const SUGGESTIONS_FETCH_FAIL = 'SUGGESTIONS_FETCH_FAIL'; |
||||||
|
|
||||||
|
export const SUGGESTIONS_DISMISS = 'SUGGESTIONS_DISMISS'; |
||||||
|
|
||||||
|
export function fetchSuggestions() { |
||||||
|
return (dispatch, getState) => { |
||||||
|
dispatch(fetchSuggestionsRequest()); |
||||||
|
|
||||||
|
api(getState).get('/api/v1/suggestions').then(response => { |
||||||
|
dispatch(importFetchedAccounts(response.data)); |
||||||
|
dispatch(fetchSuggestionsSuccess(response.data)); |
||||||
|
}).catch(error => dispatch(fetchSuggestionsFail(error))); |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
export function fetchSuggestionsRequest() { |
||||||
|
return { |
||||||
|
type: SUGGESTIONS_FETCH_REQUEST, |
||||||
|
skipLoading: true, |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
export function fetchSuggestionsSuccess(accounts) { |
||||||
|
return { |
||||||
|
type: SUGGESTIONS_FETCH_SUCCESS, |
||||||
|
accounts, |
||||||
|
skipLoading: true, |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
export function fetchSuggestionsFail(error) { |
||||||
|
return { |
||||||
|
type: SUGGESTIONS_FETCH_FAIL, |
||||||
|
error, |
||||||
|
skipLoading: true, |
||||||
|
skipAlert: true, |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
export const dismissSuggestion = accountId => (dispatch, getState) => { |
||||||
|
dispatch({ |
||||||
|
type: SUGGESTIONS_DISMISS, |
||||||
|
id: accountId, |
||||||
|
}); |
||||||
|
|
||||||
|
api(getState).delete(`/api/v1/suggestions/${accountId}`); |
||||||
|
}; |
@ -1,8 +1,15 @@ |
|||||||
import { connect } from 'react-redux'; |
import { connect } from 'react-redux'; |
||||||
import SearchResults from '../components/search_results'; |
import SearchResults from '../components/search_results'; |
||||||
|
import { fetchSuggestions, dismissSuggestion } from '../../../actions/suggestions'; |
||||||
|
|
||||||
const mapStateToProps = state => ({ |
const mapStateToProps = state => ({ |
||||||
results: state.getIn(['search', 'results']), |
results: state.getIn(['search', 'results']), |
||||||
|
suggestions: state.getIn(['suggestions', 'items']), |
||||||
}); |
}); |
||||||
|
|
||||||
export default connect(mapStateToProps)(SearchResults); |
const mapDispatchToProps = dispatch => ({ |
||||||
|
fetchSuggestions: () => dispatch(fetchSuggestions()), |
||||||
|
dismissSuggestion: account => dispatch(dismissSuggestion(account.get('id'))), |
||||||
|
}); |
||||||
|
|
||||||
|
export default connect(mapStateToProps, mapDispatchToProps)(SearchResults); |
||||||
|
@ -0,0 +1,30 @@ |
|||||||
|
import { |
||||||
|
SUGGESTIONS_FETCH_REQUEST, |
||||||
|
SUGGESTIONS_FETCH_SUCCESS, |
||||||
|
SUGGESTIONS_FETCH_FAIL, |
||||||
|
SUGGESTIONS_DISMISS, |
||||||
|
} from '../actions/suggestions'; |
||||||
|
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'; |
||||||
|
|
||||||
|
const initialState = ImmutableMap({ |
||||||
|
items: ImmutableList(), |
||||||
|
isLoading: false, |
||||||
|
}); |
||||||
|
|
||||||
|
export default function suggestionsReducer(state = initialState, action) { |
||||||
|
switch(action.type) { |
||||||
|
case SUGGESTIONS_FETCH_REQUEST: |
||||||
|
return state.set('isLoading', true); |
||||||
|
case SUGGESTIONS_FETCH_SUCCESS: |
||||||
|
return state.withMutations(map => { |
||||||
|
map.set('items', fromJS(action.accounts.map(x => x.id))); |
||||||
|
map.set('isLoading', false); |
||||||
|
}); |
||||||
|
case SUGGESTIONS_FETCH_FAIL: |
||||||
|
return state.set('isLoading', false); |
||||||
|
case SUGGESTIONS_DISMISS: |
||||||
|
return state.update('items', list => list.filterNot(id => id === action.id)); |
||||||
|
default: |
||||||
|
return state; |
||||||
|
} |
||||||
|
}; |
Loading…
Reference in new issue