[RN] If recent-list knows a domain, then the app knows it

This commit is contained in:
Lyubo Marinov 2018-05-14 12:37:48 -05:00
parent 5e8ecc5fee
commit d4dea22576
4 changed files with 110 additions and 36 deletions

View File

@ -2,10 +2,25 @@
/**
* Action type to signal a new addition to the list.
*
* {
* type: _STORE_CURRENT_CONFERENCE,
* locationURL: Object
* }
*
* @protected
*/
export const STORE_CURRENT_CONFERENCE = Symbol('STORE_CURRENT_CONFERENCE');
export const _STORE_CURRENT_CONFERENCE = Symbol('_STORE_CURRENT_CONFERENCE');
/**
* Action type to signal that a new conference duration info is available.
*
* {
* type: _UPDATE_CONFERENCE_DURATION,
* locationURL: Object
* }
*
* @protected
*/
export const UPDATE_CONFERENCE_DURATION = Symbol('UPDATE_CONFERENCE_DURATION');
export const _UPDATE_CONFERENCE_DURATION
= Symbol('_UPDATE_CONFERENCE_DURATION');

View File

@ -1,22 +1,23 @@
// @flow
import {
STORE_CURRENT_CONFERENCE,
UPDATE_CONFERENCE_DURATION
_STORE_CURRENT_CONFERENCE,
_UPDATE_CONFERENCE_DURATION
} from './actionTypes';
/**
* Action to initiate a new addition to the list.
*
* @param {Object} locationURL - The current location URL.
* @protected
* @returns {{
* type: STORE_CURRENT_CONFERENCE,
* type: _STORE_CURRENT_CONFERENCE,
* locationURL: Object
* }}
*/
export function storeCurrentConference(locationURL: Object) {
export function _storeCurrentConference(locationURL: Object) {
return {
type: STORE_CURRENT_CONFERENCE,
type: _STORE_CURRENT_CONFERENCE,
locationURL
};
}
@ -25,14 +26,15 @@ export function storeCurrentConference(locationURL: Object) {
* Action to initiate the update of the duration of the last conference.
*
* @param {Object} locationURL - The current location URL.
* @protected
* @returns {{
* type: UPDATE_CONFERENCE_DURATION,
* type: _UPDATE_CONFERENCE_DURATION,
* locationURL: Object
* }}
*/
export function updateConferenceDuration(locationURL: Object) {
export function _updateConferenceDuration(locationURL: Object) {
return {
type: UPDATE_CONFERENCE_DURATION,
type: _UPDATE_CONFERENCE_DURATION,
locationURL
};
}

View File

@ -1,9 +1,12 @@
// @flow
import { APP_WILL_MOUNT } from '../app';
import { CONFERENCE_WILL_LEAVE, SET_ROOM } from '../base/conference';
import { addKnownDomains } from '../base/known-domains';
import { MiddlewareRegistry } from '../base/redux';
import { parseURIString } from '../base/util';
import { storeCurrentConference, updateConferenceDuration } from './actions';
import { _storeCurrentConference, _updateConferenceDuration } from './actions';
/**
* Middleware that captures joined rooms so they can be saved into
@ -14,45 +17,99 @@ import { storeCurrentConference, updateConferenceDuration } from './actions';
*/
MiddlewareRegistry.register(store => next => action => {
switch (action.type) {
case APP_WILL_MOUNT:
return _appWillMount(store, next, action);
case CONFERENCE_WILL_LEAVE:
_updateConferenceDuration(store);
break;
return _conferenceWillLeave(store, next, action);
case SET_ROOM:
_maybeStoreCurrentConference(store, action);
break;
return _setRoom(store, next, action);
}
return next(action);
});
/**
* Notifies the feature recent-list that the redux action {@link APP_WILL_MOUNT}
* is being dispatched in a specific redux store.
*
* @param {Store} store - The redux store in which the specified action is being
* dispatched.
* @param {Dispatch} next - The redux {@code dispatch} function to dispatch the
* specified action to the specified store.
* @param {Action} action - The redux action {@code APP_WILL_MOUNT} which is
* being dispatched in the specified redux store.
* @private
* @returns {*} The result returned by {@code next(action)}.
*/
function _appWillMount({ dispatch, getState }, next, action) {
const result = next(action);
// It's an opportune time to transfer the feature recent-list's knowledge
// about "known domains" (which is local to the feature) to the feature
// base/known-domains (which is global to the app).
//
// XXX Since the feature recent-list predates the feature calendar-sync and,
// consequently, the feature known-domains, it's possible for the feature
// known-list to know of domains which the feature known-domains is yet to
// discover.
const knownDomains = [];
for (const { conference } of getState()['features/recent-list']) {
const uri = parseURIString(conference);
let host;
uri && (host = uri.host) && knownDomains.push(host);
}
knownDomains.length && dispatch(addKnownDomains(knownDomains));
return result;
}
/**
* Updates the duration of the last conference stored in the list.
*
* @param {Store} store - The redux store.
* @param {Dispatch} next - The redux {@code dispatch} function.
* @param {Action} action - The redux action {@link CONFERENCE_WILL_LEAVE}.
* @private
* @returns {*} The result returned by {@code next(action)}.
*/
function _conferenceWillLeave({ dispatch, getState }, next, action) {
dispatch(
_updateConferenceDuration(
getState()['features/base/connection'].locationURL));
return next(action);
}
/**
* Checks if there is a current conference (upon SET_ROOM action), and saves it
* if necessary.
*
* @param {Store} store - The redux store.
* @param {Dispatch} next - The redux {@code dispatch} function.
* @param {Action} action - The redux action.
* @param {Action} action - The redux action {@link SET_ROOM}.
* @private
* @returns {void}
* @returns {*} The result returned by {@code next(action)}.
*/
function _maybeStoreCurrentConference({ dispatch, getState }, { room }) {
if (room) {
function _setRoom({ dispatch, getState }, next, action) {
if (action.room) {
const { locationURL } = getState()['features/base/connection'];
dispatch(storeCurrentConference(locationURL));
if (locationURL) {
dispatch(_storeCurrentConference(locationURL));
// Whatever domain the feature recent-list knows about, the app as a
// whole should know about.
//
// XXX Technically, _storeCurrentConference could be turned into an
// asynchronous action creator which dispatches both
// _STORE_CURRENT_CONFERENCE and addKnownDomains but...
dispatch(addKnownDomains(locationURL.host));
}
}
}
/**
* Updates the duration of the last conference stored in the list.
*
* @param {Store} store - The redux store.
* @private
* @returns {void}
*/
function _updateConferenceDuration({ dispatch, getState }) {
const { locationURL } = getState()['features/base/connection'];
dispatch(updateConferenceDuration(locationURL));
return next(action);
}

View File

@ -6,8 +6,8 @@ import { ReducerRegistry } from '../base/redux';
import { PersistenceRegistry } from '../base/storage';
import {
STORE_CURRENT_CONFERENCE,
UPDATE_CONFERENCE_DURATION
_STORE_CURRENT_CONFERENCE,
_UPDATE_CONFERENCE_DURATION
} from './actionTypes';
const logger = require('jitsi-meet-logger').getLogger(__filename);
@ -54,10 +54,10 @@ ReducerRegistry.register(
case APP_WILL_MOUNT:
return _appWillMount(state);
case STORE_CURRENT_CONFERENCE:
case _STORE_CURRENT_CONFERENCE:
return _storeCurrentConference(state, action);
case UPDATE_CONFERENCE_DURATION:
case _UPDATE_CONFERENCE_DURATION:
return _updateConferenceDuration(state, action);
default: