mirror of https://github.com/mastodon/mastodon
make each filter flush notifications and load new ones, fixing pagination
This commit is contained in:
parent
f99883c020
commit
0a9de4a2cb
|
@ -8,6 +8,7 @@ import {
|
||||||
importFetchedStatuses,
|
importFetchedStatuses,
|
||||||
} from './importer';
|
} from './importer';
|
||||||
import { defineMessages } from 'react-intl';
|
import { defineMessages } from 'react-intl';
|
||||||
|
import { List as ImmutableList } from 'immutable';
|
||||||
import { unescapeHTML } from '../utils/html';
|
import { unescapeHTML } from '../utils/html';
|
||||||
import { getFilters, regexFromFilters } from '../selectors';
|
import { getFilters, regexFromFilters } from '../selectors';
|
||||||
|
|
||||||
|
@ -18,6 +19,8 @@ export const NOTIFICATIONS_EXPAND_REQUEST = 'NOTIFICATIONS_EXPAND_REQUEST';
|
||||||
export const NOTIFICATIONS_EXPAND_SUCCESS = 'NOTIFICATIONS_EXPAND_SUCCESS';
|
export const NOTIFICATIONS_EXPAND_SUCCESS = 'NOTIFICATIONS_EXPAND_SUCCESS';
|
||||||
export const NOTIFICATIONS_EXPAND_FAIL = 'NOTIFICATIONS_EXPAND_FAIL';
|
export const NOTIFICATIONS_EXPAND_FAIL = 'NOTIFICATIONS_EXPAND_FAIL';
|
||||||
|
|
||||||
|
export const NOTIFICATIONS_FILTER_SET = 'NOTIFICATIONS_FILTER_SET'
|
||||||
|
|
||||||
export const NOTIFICATIONS_CLEAR = 'NOTIFICATIONS_CLEAR';
|
export const NOTIFICATIONS_CLEAR = 'NOTIFICATIONS_CLEAR';
|
||||||
export const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP';
|
export const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP';
|
||||||
|
|
||||||
|
@ -88,10 +91,16 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
|
||||||
|
|
||||||
const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS();
|
const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS();
|
||||||
|
|
||||||
|
const excludeTypesFromFilter = filter => {
|
||||||
|
const allTypes = ImmutableList(['follow', 'favourite', 'reblog', 'mention']);
|
||||||
|
return allTypes.filterNot(item => item === filter).toJS();
|
||||||
|
};
|
||||||
|
|
||||||
const noOp = () => {};
|
const noOp = () => {};
|
||||||
|
|
||||||
export function expandNotifications({ maxId } = {}, done = noOp) {
|
export function expandNotifications({ maxId } = {}, done = noOp) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']);
|
||||||
const notifications = getState().get('notifications');
|
const notifications = getState().get('notifications');
|
||||||
const isLoadingMore = !!maxId;
|
const isLoadingMore = !!maxId;
|
||||||
|
|
||||||
|
@ -102,7 +111,9 @@ export function expandNotifications({ maxId } = {}, done = noOp) {
|
||||||
|
|
||||||
const params = {
|
const params = {
|
||||||
max_id: maxId,
|
max_id: maxId,
|
||||||
exclude_types: excludeTypesFromSettings(getState()),
|
exclude_types: activeFilter === 'all'
|
||||||
|
? excludeTypesFromSettings(getState())
|
||||||
|
: excludeTypesFromFilter(activeFilter),
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!maxId && notifications.get('items').size > 0) {
|
if (!maxId && notifications.get('items').size > 0) {
|
||||||
|
@ -167,3 +178,14 @@ export function scrollTopNotifications(top) {
|
||||||
top,
|
top,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function setFilter (filterType) {
|
||||||
|
return dispatch => {
|
||||||
|
dispatch({
|
||||||
|
type: NOTIFICATIONS_FILTER_SET,
|
||||||
|
path: ['notifications', 'quickFilter', 'active'],
|
||||||
|
value: filterType,
|
||||||
|
});
|
||||||
|
dispatch(expandNotifications());
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import FilterBar from '../components/filter_bar';
|
import FilterBar from '../components/filter_bar';
|
||||||
import { changeSetting } from '../../../actions/settings';
|
import { setFilter } from '../../../actions/notifications';
|
||||||
|
|
||||||
const makeMapStateToProps = state => ({
|
const makeMapStateToProps = state => ({
|
||||||
selectedFilter: state.getIn(['settings', 'notifications', 'quickFilter', 'active']),
|
selectedFilter: state.getIn(['settings', 'notifications', 'quickFilter', 'active']),
|
||||||
|
@ -9,7 +9,7 @@ const makeMapStateToProps = state => ({
|
||||||
|
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
selectFilter (newActiveFilter) {
|
selectFilter (newActiveFilter) {
|
||||||
dispatch(changeSetting(['notifications', 'quickFilter', 'active'], newActiveFilter));
|
dispatch(setFilter(newActiveFilter));
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -21,12 +21,15 @@ const messages = defineMessages({
|
||||||
});
|
});
|
||||||
|
|
||||||
const getNotifications = createSelector([
|
const getNotifications = createSelector([
|
||||||
|
// TODO: Remove the first two arguments and simplify
|
||||||
state => state.getIn(['settings', 'notifications', 'quickFilter', 'show']),
|
state => state.getIn(['settings', 'notifications', 'quickFilter', 'show']),
|
||||||
state => state.getIn(['settings', 'notifications', 'quickFilter', 'active']),
|
state => state.getIn(['settings', 'notifications', 'quickFilter', 'active']),
|
||||||
state => ImmutableList(state.getIn(['settings', 'notifications', 'shows']).filter(item => !item).keys()),
|
state => ImmutableList(state.getIn(['settings', 'notifications', 'shows']).filter(item => !item).keys()),
|
||||||
state => state.getIn(['notifications', 'items']),
|
state => state.getIn(['notifications', 'items']),
|
||||||
], (showFilterBar, allowedType, excludedTypes, notifications) => {
|
], (showFilterBar, allowedType, excludedTypes, notifications) => {
|
||||||
if (!showFilterBar || allowedType === 'all') {
|
if (!showFilterBar || allowedType === 'all') {
|
||||||
|
// used if user changed the notification settings after loading the notifications from the server
|
||||||
|
// otherwise a list of notifications will come pre-filtered from the backend
|
||||||
return notifications.filterNot(item => item !== null && excludedTypes.includes(item.get('type')));
|
return notifications.filterNot(item => item !== null && excludedTypes.includes(item.get('type')));
|
||||||
}
|
}
|
||||||
return notifications.filter(item => item !== null && allowedType === item.get('type'));
|
return notifications.filter(item => item !== null && allowedType === item.get('type'));
|
||||||
|
|
|
@ -3,6 +3,7 @@ import {
|
||||||
NOTIFICATIONS_EXPAND_SUCCESS,
|
NOTIFICATIONS_EXPAND_SUCCESS,
|
||||||
NOTIFICATIONS_EXPAND_REQUEST,
|
NOTIFICATIONS_EXPAND_REQUEST,
|
||||||
NOTIFICATIONS_EXPAND_FAIL,
|
NOTIFICATIONS_EXPAND_FAIL,
|
||||||
|
NOTIFICATIONS_FILTER_SET,
|
||||||
NOTIFICATIONS_CLEAR,
|
NOTIFICATIONS_CLEAR,
|
||||||
NOTIFICATIONS_SCROLL_TOP,
|
NOTIFICATIONS_SCROLL_TOP,
|
||||||
} from '../actions/notifications';
|
} from '../actions/notifications';
|
||||||
|
@ -98,6 +99,8 @@ export default function notifications(state = initialState, action) {
|
||||||
return state.set('isLoading', true);
|
return state.set('isLoading', true);
|
||||||
case NOTIFICATIONS_EXPAND_FAIL:
|
case NOTIFICATIONS_EXPAND_FAIL:
|
||||||
return state.set('isLoading', false);
|
return state.set('isLoading', false);
|
||||||
|
case NOTIFICATIONS_FILTER_SET:
|
||||||
|
return state.set('items', ImmutableList()).set('hasMore', true);
|
||||||
case NOTIFICATIONS_SCROLL_TOP:
|
case NOTIFICATIONS_SCROLL_TOP:
|
||||||
return updateTop(state, action.top);
|
return updateTop(state, action.top);
|
||||||
case NOTIFICATIONS_UPDATE:
|
case NOTIFICATIONS_UPDATE:
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { SETTING_CHANGE, SETTING_SAVE } from '../actions/settings';
|
import { SETTING_CHANGE, SETTING_SAVE } from '../actions/settings';
|
||||||
|
import { NOTIFICATIONS_FILTER_SET } from '../actions/notifications';
|
||||||
import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE, COLUMN_PARAMS_CHANGE } from '../actions/columns';
|
import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE, COLUMN_PARAMS_CHANGE } from '../actions/columns';
|
||||||
import { STORE_HYDRATE } from '../actions/store';
|
import { STORE_HYDRATE } from '../actions/store';
|
||||||
import { EMOJI_USE } from '../actions/emojis';
|
import { EMOJI_USE } from '../actions/emojis';
|
||||||
|
@ -118,6 +119,7 @@ export default function settings(state = initialState, action) {
|
||||||
switch(action.type) {
|
switch(action.type) {
|
||||||
case STORE_HYDRATE:
|
case STORE_HYDRATE:
|
||||||
return hydrate(state, action.state.get('settings'));
|
return hydrate(state, action.state.get('settings'));
|
||||||
|
case NOTIFICATIONS_FILTER_SET:
|
||||||
case SETTING_CHANGE:
|
case SETTING_CHANGE:
|
||||||
return state
|
return state
|
||||||
.setIn(action.path, action.value)
|
.setIn(action.path, action.value)
|
||||||
|
|
Loading…
Reference in New Issue