Keep track of which timelines are connected live to avoid redundant

refreshes on navigation
master
Eugen Rochko 8 years ago
parent 3618cc04ff
commit aaa4d1b0fb
  1. 22
      app/assets/javascripts/components/actions/timelines.jsx
  2. 13
      app/assets/javascripts/components/containers/mastodon.jsx
  3. 16
      app/assets/javascripts/components/features/community_timeline/index.jsx
  4. 16
      app/assets/javascripts/components/features/public_timeline/index.jsx
  5. 11
      app/assets/javascripts/components/reducers/timelines.jsx

@ -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;
} }

Loading…
Cancel
Save