export const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP';
export const NOTIFICATIONS_LOAD_PENDING = 'NOTIFICATIONS_LOAD_PENDING';
+export const NOTIFICATIONS_MOUNT = 'NOTIFICATIONS_MOUNT';
+export const NOTIFICATIONS_UNMOUNT = 'NOTIFICATIONS_UNMOUNT';
+
defineMessages({
mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' },
group: { id: 'notifications.group', defaultMessage: '{count} notifications' },
dispatch(saveSettings());
};
};
+
+export const mountNotifications = () => ({
+ type: NOTIFICATIONS_MOUNT,
+});
+
+export const unmountNotifications = () => ({
+ type: NOTIFICATIONS_UNMOUNT,
+});
this.clearMouseIdleTimer();
this.detachScrollListener();
this.detachIntersectionObserver();
+
detachFullscreenListener(this.onFullScreenChange);
+
+ if (this.props.onScrollToTop) {
+ this.props.onScrollToTop();
+ }
}
onFullScreenChange = () => {
import ImmutablePropTypes from 'react-immutable-proptypes';
import Column from '../../components/column';
import ColumnHeader from '../../components/column_header';
-import { expandNotifications, scrollTopNotifications, loadPending } from '../../actions/notifications';
+import { expandNotifications, scrollTopNotifications, loadPending, mountNotifications, unmountNotifications } from '../../actions/notifications';
import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
import NotificationContainer from './containers/notification_container';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
trackScroll: true,
};
+ componentWillMount() {
+ this.props.dispatch(mountNotifications());
+ }
+
componentWillUnmount () {
this.handleLoadOlder.cancel();
this.handleScrollToTop.cancel();
this.handleScroll.cancel();
this.props.dispatch(scrollTopNotifications(false));
+ this.props.dispatch(unmountNotifications());
}
handleLoadGap = (maxId) => {
NOTIFICATIONS_CLEAR,
NOTIFICATIONS_SCROLL_TOP,
NOTIFICATIONS_LOAD_PENDING,
+ NOTIFICATIONS_MOUNT,
+ NOTIFICATIONS_UNMOUNT,
} from '../actions/notifications';
import {
ACCOUNT_BLOCK_SUCCESS,
items: ImmutableList(),
hasMore: true,
top: false,
+ mounted: false,
unread: 0,
isLoading: false,
});
});
const normalizeNotification = (state, notification, usePendingItems) => {
- const top = state.get('top');
+ const top = state.get('top');
+ const mounted = state.get('mounted');
- if (usePendingItems || !top || !state.get('pendingItems').isEmpty()) {
+ if (usePendingItems || (!top && mounted) || !state.get('pendingItems').isEmpty()) {
return state.update('pendingItems', list => list.unshift(notificationToMap(notification))).update('unread', unread => unread + 1);
}
return state.withMutations(mutable => {
if (!items.isEmpty()) {
- usePendingItems = isLoadingRecent && (usePendingItems || !mutable.get('top') || !mutable.get('pendingItems').isEmpty());
+ usePendingItems = isLoadingRecent && (usePendingItems || (!mutable.get('top') && mutable.get('mounted')) || !mutable.get('pendingItems').isEmpty());
mutable.update(usePendingItems ? 'pendingItems' : 'items', list => {
const lastIndex = 1 + list.findLastIndex(
return action.timeline === 'home' ?
state.update(action.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(null) : items) :
state;
+ case NOTIFICATIONS_MOUNT:
+ return state.set('mounted', true);
+ case NOTIFICATIONS_UNMOUNT:
+ return state.set('mounted', false);
default:
return state;
}