Parcourir la source

Fix public timelines being broken by new toots when they are not mounted (#10131)

master
Eugen Rochko il y a 5 ans
committed by GitHub
Parent
révision
be1c634b2b
Aucune clé connue n'a été trouvée dans la base pour cette signature ID de la clé GPG: 4AEE18F83AFDEB23
5 fichiers modifiés avec 28 ajouts et 7 suppressions
  1. +3
    -1
      app/javascript/mastodon/actions/compose.js
  2. +6
    -0
      app/javascript/mastodon/actions/streaming.js
  3. +8
    -0
      app/javascript/mastodon/actions/timelines.js
  4. +5
    -4
      app/javascript/mastodon/reducers/timelines.js
  5. +6
    -2
      app/javascript/mastodon/stream.js

+ 3
- 1
app/javascript/mastodon/actions/compose.js Voir le fichier

@@ -158,7 +158,9 @@ export function submitCompose(routerHistory) {
// into the columns

const insertIfOnline = timelineId => {
if (getState().getIn(['timelines', timelineId, 'items', 0]) !== null) {
const timeline = getState().getIn(['timelines', timelineId]);

if (timeline && timeline.get('items').size > 0 && timeline.getIn(['items', 0]) !== null && timeline.get('online')) {
dispatch(updateTimeline(timelineId, { ...response.data }));
}
};


+ 6
- 0
app/javascript/mastodon/actions/streaming.js Voir le fichier

@@ -3,6 +3,7 @@ import {
updateTimeline,
deleteFromTimelines,
expandHomeTimeline,
connectTimeline,
disconnectTimeline,
} from './timelines';
import { updateNotifications, expandNotifications } from './notifications';
@@ -16,7 +17,12 @@ export function connectTimelineStream (timelineId, path, pollingRefresh = null,

return connectStream (path, pollingRefresh, (dispatch, getState) => {
const locale = getState().getIn(['meta', 'locale']);

return {
onConnect() {
dispatch(connectTimeline(timelineId));
},

onDisconnect() {
dispatch(disconnectTimeline(timelineId));
},


+ 8
- 0
app/javascript/mastodon/actions/timelines.js Voir le fichier

@@ -12,6 +12,7 @@ export const TIMELINE_EXPAND_FAIL = 'TIMELINE_EXPAND_FAIL';

export const TIMELINE_SCROLL_TOP = 'TIMELINE_SCROLL_TOP';

export const TIMELINE_CONNECT = 'TIMELINE_CONNECT';
export const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT';

export function updateTimeline(timeline, status, accept) {
@@ -143,6 +144,13 @@ export function scrollTopTimeline(timeline, top) {
};
};

export function connectTimeline(timeline) {
return {
type: TIMELINE_CONNECT,
timeline,
};
};

export function disconnectTimeline(timeline) {
return {
type: TIMELINE_DISCONNECT,


+ 5
- 4
app/javascript/mastodon/reducers/timelines.js Voir le fichier

@@ -6,6 +6,7 @@ import {
TIMELINE_EXPAND_REQUEST,
TIMELINE_EXPAND_FAIL,
TIMELINE_SCROLL_TOP,
TIMELINE_CONNECT,
TIMELINE_DISCONNECT,
} from '../actions/timelines';
import {
@@ -20,6 +21,7 @@ const initialState = ImmutableMap();

const initialTimeline = ImmutableMap({
unread: 0,
online: false,
top: true,
isLoading: false,
hasMore: true,
@@ -142,14 +144,13 @@ export default function timelines(state = initialState, action) {
return filterTimeline('home', state, action.relationship, action.statuses);
case TIMELINE_SCROLL_TOP:
return updateTop(state, action.timeline, action.top);
case TIMELINE_CONNECT:
return state.update(action.timeline, initialTimeline, map => map.set('online', true));
case TIMELINE_DISCONNECT:
return state.update(
action.timeline,
initialTimeline,
map => map.update(
'items',
items => items.first() ? items.unshift(null) : items
)
map => map.set('online', false).update('items', items => items.first() ? items.unshift(null) : items)
);
default:
return state;


+ 6
- 2
app/javascript/mastodon/stream.js Voir le fichier

@@ -2,11 +2,11 @@ import WebSocketClient from 'websocket.js';

const randomIntUpTo = max => Math.floor(Math.random() * Math.floor(max));

export function connectStream(path, pollingRefresh = null, callbacks = () => ({ onDisconnect() {}, onReceive() {} })) {
export function connectStream(path, pollingRefresh = null, callbacks = () => ({ onConnect() {}, onDisconnect() {}, onReceive() {} })) {
return (dispatch, getState) => {
const streamingAPIBaseURL = getState().getIn(['meta', 'streaming_api_base_url']);
const accessToken = getState().getIn(['meta', 'access_token']);
const { onDisconnect, onReceive } = callbacks(dispatch, getState);
const { onConnect, onDisconnect, onReceive } = callbacks(dispatch, getState);

let polling = null;

@@ -28,6 +28,8 @@ export function connectStream(path, pollingRefresh = null, callbacks = () => ({
if (pollingRefresh) {
clearPolling();
}

onConnect();
},

disconnected () {
@@ -47,6 +49,8 @@ export function connectStream(path, pollingRefresh = null, callbacks = () => ({
clearPolling();
pollingRefresh(dispatch);
}

onConnect();
},

});


Chargement…
Annuler
Enregistrer