Keep track of which timelines are connected live to avoid redundant
refreshes on navigation
This commit is contained in:
parent
3618cc04ff
commit
aaa4d1b0fb
|
@ -14,6 +14,9 @@ export const TIMELINE_EXPAND_FAIL = 'TIMELINE_EXPAND_FAIL';
|
||||||
|
|
||||||
export const TIMELINE_SCROLL_TOP = 'TIMELINE_SCROLL_TOP';
|
export const TIMELINE_SCROLL_TOP = 'TIMELINE_SCROLL_TOP';
|
||||||
|
|
||||||
|
export const TIMELINE_CONNECT = 'TIMELINE_CONNECT';
|
||||||
|
export const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT';
|
||||||
|
|
||||||
export function refreshTimelineSuccess(timeline, statuses, skipLoading, next) {
|
export function refreshTimelineSuccess(timeline, statuses, skipLoading, next) {
|
||||||
return {
|
return {
|
||||||
type: TIMELINE_REFRESH_SUCCESS,
|
type: TIMELINE_REFRESH_SUCCESS,
|
||||||
|
@ -76,6 +79,11 @@ export function refreshTimeline(timeline, id = null) {
|
||||||
let skipLoading = false;
|
let skipLoading = false;
|
||||||
|
|
||||||
if (newestId !== null && getState().getIn(['timelines', timeline, 'loaded']) && (id === null || getState().getIn(['timelines', timeline, 'id']) === id)) {
|
if (newestId !== null && getState().getIn(['timelines', timeline, 'loaded']) && (id === null || getState().getIn(['timelines', timeline, 'id']) === id)) {
|
||||||
|
if (id === null && getState().getIn(['timelines', timeline, 'online'])) {
|
||||||
|
// Skip refreshing when timeline is live anyway
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
params = { ...params, since_id: newestId };
|
params = { ...params, since_id: newestId };
|
||||||
skipLoading = true;
|
skipLoading = true;
|
||||||
}
|
}
|
||||||
|
@ -162,3 +170,17 @@ export function scrollTopTimeline(timeline, top) {
|
||||||
top
|
top
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function connectTimeline(timeline) {
|
||||||
|
return {
|
||||||
|
type: TIMELINE_CONNECT,
|
||||||
|
timeline
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function disconnectTimeline(timeline) {
|
||||||
|
return {
|
||||||
|
type: TIMELINE_DISCONNECT,
|
||||||
|
timeline
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
|
@ -4,7 +4,9 @@ import {
|
||||||
refreshTimelineSuccess,
|
refreshTimelineSuccess,
|
||||||
updateTimeline,
|
updateTimeline,
|
||||||
deleteFromTimelines,
|
deleteFromTimelines,
|
||||||
refreshTimeline
|
refreshTimeline,
|
||||||
|
connectTimeline,
|
||||||
|
disconnectTimeline
|
||||||
} from '../actions/timelines';
|
} from '../actions/timelines';
|
||||||
import { updateNotifications, refreshNotifications } from '../actions/notifications';
|
import { updateNotifications, refreshNotifications } from '../actions/notifications';
|
||||||
import createBrowserHistory from 'history/lib/createBrowserHistory';
|
import createBrowserHistory from 'history/lib/createBrowserHistory';
|
||||||
|
@ -70,6 +72,14 @@ const Mastodon = React.createClass({
|
||||||
|
|
||||||
this.subscription = createStream(accessToken, 'user', {
|
this.subscription = createStream(accessToken, 'user', {
|
||||||
|
|
||||||
|
connected () {
|
||||||
|
store.dispatch(connectTimeline('home'));
|
||||||
|
},
|
||||||
|
|
||||||
|
disconnected () {
|
||||||
|
store.dispatch(disconnectTimeline('home'));
|
||||||
|
},
|
||||||
|
|
||||||
received (data) {
|
received (data) {
|
||||||
switch(data.event) {
|
switch(data.event) {
|
||||||
case 'update':
|
case 'update':
|
||||||
|
@ -85,6 +95,7 @@ const Mastodon = React.createClass({
|
||||||
},
|
},
|
||||||
|
|
||||||
reconnected () {
|
reconnected () {
|
||||||
|
store.dispatch(connectTimeline('home'));
|
||||||
store.dispatch(refreshTimeline('home'));
|
store.dispatch(refreshTimeline('home'));
|
||||||
store.dispatch(refreshNotifications());
|
store.dispatch(refreshNotifications());
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,9 @@ import Column from '../ui/components/column';
|
||||||
import {
|
import {
|
||||||
refreshTimeline,
|
refreshTimeline,
|
||||||
updateTimeline,
|
updateTimeline,
|
||||||
deleteFromTimelines
|
deleteFromTimelines,
|
||||||
|
connectTimeline,
|
||||||
|
disconnectTimeline
|
||||||
} from '../../actions/timelines';
|
} from '../../actions/timelines';
|
||||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||||
import ColumnBackButtonSlim from '../../components/column_back_button_slim';
|
import ColumnBackButtonSlim from '../../components/column_back_button_slim';
|
||||||
|
@ -44,6 +46,18 @@ const CommunityTimeline = React.createClass({
|
||||||
|
|
||||||
subscription = createStream(accessToken, 'public:local', {
|
subscription = createStream(accessToken, 'public:local', {
|
||||||
|
|
||||||
|
connected () {
|
||||||
|
dispatch(connectTimeline('community'));
|
||||||
|
},
|
||||||
|
|
||||||
|
reconnected () {
|
||||||
|
dispatch(connectTimeline('community'));
|
||||||
|
},
|
||||||
|
|
||||||
|
disconnected () {
|
||||||
|
dispatch(disconnectTimeline('community'));
|
||||||
|
},
|
||||||
|
|
||||||
received (data) {
|
received (data) {
|
||||||
switch(data.event) {
|
switch(data.event) {
|
||||||
case 'update':
|
case 'update':
|
||||||
|
|
|
@ -5,7 +5,9 @@ import Column from '../ui/components/column';
|
||||||
import {
|
import {
|
||||||
refreshTimeline,
|
refreshTimeline,
|
||||||
updateTimeline,
|
updateTimeline,
|
||||||
deleteFromTimelines
|
deleteFromTimelines,
|
||||||
|
connectTimeline,
|
||||||
|
disconnectTimeline
|
||||||
} from '../../actions/timelines';
|
} from '../../actions/timelines';
|
||||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||||
import ColumnBackButtonSlim from '../../components/column_back_button_slim';
|
import ColumnBackButtonSlim from '../../components/column_back_button_slim';
|
||||||
|
@ -44,6 +46,18 @@ const PublicTimeline = React.createClass({
|
||||||
|
|
||||||
subscription = createStream(accessToken, 'public', {
|
subscription = createStream(accessToken, 'public', {
|
||||||
|
|
||||||
|
connected () {
|
||||||
|
dispatch(connectTimeline('public'));
|
||||||
|
},
|
||||||
|
|
||||||
|
reconnected () {
|
||||||
|
dispatch(connectTimeline('public'));
|
||||||
|
},
|
||||||
|
|
||||||
|
disconnected () {
|
||||||
|
dispatch(disconnectTimeline('public'));
|
||||||
|
},
|
||||||
|
|
||||||
received (data) {
|
received (data) {
|
||||||
switch(data.event) {
|
switch(data.event) {
|
||||||
case 'update':
|
case 'update':
|
||||||
|
|
|
@ -7,7 +7,9 @@ import {
|
||||||
TIMELINE_EXPAND_SUCCESS,
|
TIMELINE_EXPAND_SUCCESS,
|
||||||
TIMELINE_EXPAND_REQUEST,
|
TIMELINE_EXPAND_REQUEST,
|
||||||
TIMELINE_EXPAND_FAIL,
|
TIMELINE_EXPAND_FAIL,
|
||||||
TIMELINE_SCROLL_TOP
|
TIMELINE_SCROLL_TOP,
|
||||||
|
TIMELINE_CONNECT,
|
||||||
|
TIMELINE_DISCONNECT
|
||||||
} from '../actions/timelines';
|
} from '../actions/timelines';
|
||||||
import {
|
import {
|
||||||
REBLOG_SUCCESS,
|
REBLOG_SUCCESS,
|
||||||
|
@ -35,6 +37,7 @@ const initialState = Immutable.Map({
|
||||||
path: () => '/api/v1/timelines/home',
|
path: () => '/api/v1/timelines/home',
|
||||||
next: null,
|
next: null,
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
|
online: false,
|
||||||
loaded: false,
|
loaded: false,
|
||||||
top: true,
|
top: true,
|
||||||
unread: 0,
|
unread: 0,
|
||||||
|
@ -45,6 +48,7 @@ const initialState = Immutable.Map({
|
||||||
path: () => '/api/v1/timelines/public',
|
path: () => '/api/v1/timelines/public',
|
||||||
next: null,
|
next: null,
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
|
online: false,
|
||||||
loaded: false,
|
loaded: false,
|
||||||
top: true,
|
top: true,
|
||||||
unread: 0,
|
unread: 0,
|
||||||
|
@ -56,6 +60,7 @@ const initialState = Immutable.Map({
|
||||||
next: null,
|
next: null,
|
||||||
params: { local: true },
|
params: { local: true },
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
|
online: false,
|
||||||
loaded: false,
|
loaded: false,
|
||||||
top: true,
|
top: true,
|
||||||
unread: 0,
|
unread: 0,
|
||||||
|
@ -300,6 +305,10 @@ export default function timelines(state = initialState, action) {
|
||||||
return filterTimelines(state, action.relationship, action.statuses);
|
return filterTimelines(state, action.relationship, action.statuses);
|
||||||
case TIMELINE_SCROLL_TOP:
|
case TIMELINE_SCROLL_TOP:
|
||||||
return updateTop(state, action.timeline, action.top);
|
return updateTop(state, action.timeline, action.top);
|
||||||
|
case TIMELINE_CONNECT:
|
||||||
|
return state.setIn([action.timeline, 'online'], true);
|
||||||
|
case TIMELINE_DISCONNECT:
|
||||||
|
return state.setIn([action.timeline, 'online'], false);
|
||||||
default:
|
default:
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue