mirror of
https://github.com/mastodon/mastodon
synced 2024-12-05 10:18:16 +09:00
7cee27f517
skip ActionCable for follow/unfollow/block events, instead clear UI from blocked account's posts instantly if block request succeeds. Add forgotten i18n for sensitive content
65 lines
2.0 KiB
JavaScript
65 lines
2.0 KiB
JavaScript
import {
|
|
NOTIFICATIONS_UPDATE,
|
|
NOTIFICATIONS_REFRESH_SUCCESS,
|
|
NOTIFICATIONS_EXPAND_SUCCESS
|
|
} from '../actions/notifications';
|
|
import { ACCOUNT_BLOCK_SUCCESS } from '../actions/accounts';
|
|
import Immutable from 'immutable';
|
|
|
|
const initialState = Immutable.Map({
|
|
items: Immutable.List(),
|
|
next: null,
|
|
loaded: false
|
|
});
|
|
|
|
const notificationToMap = notification => Immutable.Map({
|
|
id: notification.id,
|
|
type: notification.type,
|
|
account: notification.account.id,
|
|
status: notification.status ? notification.status.id : null
|
|
});
|
|
|
|
const normalizeNotification = (state, notification) => {
|
|
return state.update('items', list => list.unshift(notificationToMap(notification)));
|
|
};
|
|
|
|
const normalizeNotifications = (state, notifications, next) => {
|
|
let items = Immutable.List();
|
|
const loaded = state.get('loaded');
|
|
|
|
notifications.forEach((n, i) => {
|
|
items = items.set(i, notificationToMap(n));
|
|
});
|
|
|
|
return state.update('items', list => loaded ? list.unshift(...items) : list.push(...items)).set('next', next).set('loaded', true);
|
|
};
|
|
|
|
const appendNormalizedNotifications = (state, notifications, next) => {
|
|
let items = Immutable.List();
|
|
|
|
notifications.forEach((n, i) => {
|
|
items = items.set(i, notificationToMap(n));
|
|
});
|
|
|
|
return state.update('items', list => list.push(...items)).set('next', next);
|
|
};
|
|
|
|
const filterNotifications = (state, relationship) => {
|
|
return state.update('items', list => list.filterNot(item => item.get('account') === relationship.id));
|
|
};
|
|
|
|
export default function notifications(state = initialState, action) {
|
|
switch(action.type) {
|
|
case NOTIFICATIONS_UPDATE:
|
|
return normalizeNotification(state, action.notification);
|
|
case NOTIFICATIONS_REFRESH_SUCCESS:
|
|
return normalizeNotifications(state, action.notifications, action.next);
|
|
case NOTIFICATIONS_EXPAND_SUCCESS:
|
|
return appendNormalizedNotifications(state, action.notifications, action.next);
|
|
case ACCOUNT_BLOCK_SUCCESS:
|
|
return filterNotifications(state, action.relationship);
|
|
default:
|
|
return state;
|
|
}
|
|
};
|