[Glitch] Fix public timelines being broken by new toots when they are not mounted
Port be1c634b2b to glitch-soc
			
			
This commit is contained in:
		
				
					committed by
					
						 Thibaut Girka
						Thibaut Girka
					
				
			
			
				
	
			
			
			
						parent
						
							5528719bc9
						
					
				
				
					commit
					6fe48dd050
				
			| @@ -175,7 +175,9 @@ export function submitCompose(routerHistory) { | ||||
|       // To make the app more responsive, immediately get the status 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 })); | ||||
|         } | ||||
|       }; | ||||
|   | ||||
| @@ -3,6 +3,7 @@ import { | ||||
|   updateTimeline, | ||||
|   deleteFromTimelines, | ||||
|   expandHomeTimeline, | ||||
|   connectTimeline, | ||||
|   disconnectTimeline, | ||||
| } from './timelines'; | ||||
| import { updateNotifications, expandNotifications } from './notifications'; | ||||
| @@ -15,7 +16,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)); | ||||
|       }, | ||||
|   | ||||
| @@ -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) { | ||||
| @@ -145,6 +146,13 @@ export function scrollTopTimeline(timeline, top) { | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| export function connectTimeline(timeline) { | ||||
|   return { | ||||
|     type: TIMELINE_CONNECT, | ||||
|     timeline, | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| export function disconnectTimeline(timeline) { | ||||
|   return { | ||||
|     type: TIMELINE_DISCONNECT, | ||||
|   | ||||
| @@ -6,6 +6,7 @@ import { | ||||
|   TIMELINE_EXPAND_REQUEST, | ||||
|   TIMELINE_EXPAND_FAIL, | ||||
|   TIMELINE_SCROLL_TOP, | ||||
|   TIMELINE_CONNECT, | ||||
|   TIMELINE_DISCONNECT, | ||||
| } from 'flavours/glitch/actions/timelines'; | ||||
| import { | ||||
| @@ -20,6 +21,7 @@ const initialState = ImmutableMap(); | ||||
|  | ||||
| const initialTimeline = ImmutableMap({ | ||||
|   unread: 0, | ||||
|   online: false, | ||||
|   top: true, | ||||
|   isLoading: false, | ||||
|   hasMore: true, | ||||
| @@ -137,14 +139,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; | ||||
|   | ||||
| @@ -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(); | ||||
|       }, | ||||
|  | ||||
|     }); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user