82 lines
2.0 KiB
JavaScript
82 lines
2.0 KiB
JavaScript
/* @flow */
|
|
|
|
import XHRInterceptor from 'react-native/Libraries/Network/XHRInterceptor';
|
|
|
|
import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../../base/app';
|
|
import { MiddlewareRegistry } from '../../base/redux';
|
|
|
|
import {
|
|
_ADD_NETWORK_REQUEST,
|
|
_REMOVE_ALL_NETWORK_REQUESTS,
|
|
_REMOVE_NETWORK_REQUEST
|
|
} from './actionTypes';
|
|
|
|
/**
|
|
* Middleware which captures app startup and conference actions in order to
|
|
* clear the image cache.
|
|
*
|
|
* @returns {Function}
|
|
*/
|
|
MiddlewareRegistry.register(store => next => action => {
|
|
const result = next(action);
|
|
|
|
switch (action.type) {
|
|
case APP_WILL_MOUNT:
|
|
_startNetInterception(store);
|
|
break;
|
|
|
|
case APP_WILL_UNMOUNT:
|
|
_stopNetInterception(store);
|
|
break;
|
|
}
|
|
|
|
return result;
|
|
});
|
|
|
|
/**
|
|
* Starts intercepting network requests. Only XHR requests are supported at the
|
|
* moment.
|
|
*
|
|
* Ongoing request information is kept in redux, and it's removed as soon as a
|
|
* given request is complete.
|
|
*
|
|
* @param {Object} store - The redux store.
|
|
* @private
|
|
* @returns {void}
|
|
*/
|
|
function _startNetInterception({ dispatch }) {
|
|
XHRInterceptor.setOpenCallback((method, url, xhr) => dispatch({
|
|
type: _ADD_NETWORK_REQUEST,
|
|
request: xhr,
|
|
|
|
// The following are not really necessary read anywhere at the time of
|
|
// this writing but are provided anyway if the reducer chooses to
|
|
// remember them:
|
|
method,
|
|
url
|
|
}));
|
|
XHRInterceptor.setResponseCallback((...args) => dispatch({
|
|
type: _REMOVE_NETWORK_REQUEST,
|
|
|
|
// XXX The XHR is the last argument of the responseCallback.
|
|
request: args[args.length - 1]
|
|
}));
|
|
|
|
XHRInterceptor.enableInterception();
|
|
}
|
|
|
|
/**
|
|
* Stops intercepting network requests.
|
|
*
|
|
* @param {Object} store - The redux store.
|
|
* @private
|
|
* @returns {void}
|
|
*/
|
|
function _stopNetInterception({ dispatch }) {
|
|
XHRInterceptor.disableInterception();
|
|
|
|
dispatch({
|
|
type: _REMOVE_ALL_NETWORK_REQUESTS
|
|
});
|
|
}
|