Show suggested follows on search screen in mobile layout (#9010)
Reminder: Suggestions were added in #7918 and are based on who you interact with who you do not follow. E.g. if you boost someone a lot from seeing other people's boosts of that person, it makes sense you might be interested in following the original source; or if you reply to someone a lot, maybe you'd want to follow them Each suggestion can be dismissedth-downstream
parent
4b8c72a3fb
commit
541fda5fc8
@ -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