From 2ae46802d74c622f1039d6d780eedfbf30277909 Mon Sep 17 00:00:00 2001 From: Aurélien Bompard Date: Nov 28 2017 16:07:06 +0000 Subject: [PATCH 1/2] Reload widgets when the SSE reconnects --- diff --git a/hubs/static/client/app/core/actions/sse.js b/hubs/static/client/app/core/actions/sse.js index 6fc4a66..5d15860 100644 --- a/hubs/static/client/app/core/actions/sse.js +++ b/hubs/static/client/app/core/actions/sse.js @@ -1,11 +1,30 @@ export const SSE_CONNECTED = 'SSE_CONNECTED'; export const SSE_DISCONNECTED = 'SSE_DISCONNECTED'; +export const SSE_RECONNECTED = 'SSE_RECONNECTED'; export function sseConnected(source) { - return { - type: SSE_CONNECTED, - readyState: source.readyState + return (dispatch, getState) => { + const state = getState(); + const currentReadyState = state.sse.readyState; + if (currentReadyState === 0) { + // Don't dispatch "reconnected" on initial connection (where + // readyState is 2). + return dispatch({ + type: SSE_RECONNECTED, + readyState: source.readyState, + allWidgets: [ + // ask all widgets to reload: + ...state.entities.widgets.left, + ...state.entities.widgets.right, + ], + }); + } else { + return dispatch({ + type: SSE_CONNECTED, + readyState: source.readyState + }); + } }; } diff --git a/hubs/static/client/app/core/reducers/sse.js b/hubs/static/client/app/core/reducers/sse.js index fb2b7d9..b2b2c3e 100644 --- a/hubs/static/client/app/core/reducers/sse.js +++ b/hubs/static/client/app/core/reducers/sse.js @@ -1,6 +1,7 @@ import { SSE_CONNECTED, - SSE_DISCONNECTED + SSE_DISCONNECTED, + SSE_RECONNECTED, } from '../actions/sse'; @@ -10,6 +11,7 @@ export default function sseReducer(state={ }, action) { switch (action.type) { case SSE_CONNECTED: + case SSE_RECONNECTED: if (state.connected) { return state; // No change } diff --git a/hubs/static/client/app/core/reducers/widgets.js b/hubs/static/client/app/core/reducers/widgets.js index 014b85c..0ceaf9d 100644 --- a/hubs/static/client/app/core/reducers/widgets.js +++ b/hubs/static/client/app/core/reducers/widgets.js @@ -12,7 +12,10 @@ import { WIDGET_MOVE_REQUEST, WIDGET_MOVE_FAILURE, WIDGET_OPEN_CONFIG, WIDGET_CLOSE_CONFIG, } from '../actions/widget'; -import { WIDGET_NEEDS_UPDATE } from '../actions/sse'; +import { + WIDGET_NEEDS_UPDATE, + SSE_RECONNECTED, + } from '../actions/sse'; import singleWidgetReducer from './widget'; @@ -77,6 +80,8 @@ function widgetsNeedUpdate(state=[], action) { case WIDGET_PUT_SUCCESS: case WIDGET_NEEDS_UPDATE: return [...state, action.widgetId]; + case SSE_RECONNECTED: + return action.allWidgets; default: return state } From 82a53ad87cc50e6f86aa0fd0dd9dd82576b835d6 Mon Sep 17 00:00:00 2001 From: Aurélien Bompard Date: Nov 28 2017 16:07:06 +0000 Subject: [PATCH 2/2] IRC Widget: inform Redux that it needs no update --- diff --git a/hubs/static/client/app/widgets/irc/Widget.js b/hubs/static/client/app/widgets/irc/Widget.js index 56edd85..2dfbcf3 100644 --- a/hubs/static/client/app/widgets/irc/Widget.js +++ b/hubs/static/client/app/widgets/irc/Widget.js @@ -1,12 +1,18 @@ import React from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; +import { widgetWillUpdate } from "../../core/actions/widget"; import WidgetChrome from '../../components/WidgetChrome'; import ChatClient from './ChatClient'; import "./IRCWidget.css"; class IRCWidget extends React.Component { + componentDidMount() { + // There's nothing to update, notify the Redux that we're done. + this.props.dispatch(widgetWillUpdate(this.props.widget.idx)) + } + render() { const domain = this.props.hub.config.chat_domain; const channel = this.props.hub.config.chat_channel;