[RN] Prefetch remote avatar images 2/2
This commit is contained in:
parent
97832e0eef
commit
0836f2cefd
|
@ -4,7 +4,30 @@ import { ImageCache } from 'react-native-img-cache';
|
||||||
|
|
||||||
import { APP_WILL_MOUNT } from '../../app';
|
import { APP_WILL_MOUNT } from '../../app';
|
||||||
import { CONFERENCE_FAILED, CONFERENCE_LEFT } from '../../base/conference';
|
import { CONFERENCE_FAILED, CONFERENCE_LEFT } from '../../base/conference';
|
||||||
|
import {
|
||||||
|
getAvatarURL,
|
||||||
|
getLocalParticipant,
|
||||||
|
getParticipantById,
|
||||||
|
PARTICIPANT_ID_CHANGED,
|
||||||
|
PARTICIPANT_JOINED,
|
||||||
|
PARTICIPANT_UPDATED
|
||||||
|
} from '../../base/participants';
|
||||||
import { MiddlewareRegistry } from '../../base/redux';
|
import { MiddlewareRegistry } from '../../base/redux';
|
||||||
|
import { prefetch } from '../../mobile/image-cache';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The indicator which determines whether avatar URLs are to be prefetched in
|
||||||
|
* the middleware here. Unless/until the implementation starts observing the
|
||||||
|
* redux store instead of the respective redux actions, the value should very
|
||||||
|
* likely be <tt>false</tt> because the middleware here is pretty much the last
|
||||||
|
* to get a chance to figure out that an avatar URL may be used. Besides, it is
|
||||||
|
* somewhat uninformed to download just about anything that may eventually be
|
||||||
|
* used or not.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @type {boolean}
|
||||||
|
*/
|
||||||
|
const _PREFETCH_AVATAR_URLS = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Middleware which captures app startup and conference actions in order to
|
* Middleware which captures app startup and conference actions in order to
|
||||||
|
@ -12,13 +35,51 @@ import { MiddlewareRegistry } from '../../base/redux';
|
||||||
*
|
*
|
||||||
* @returns {Function}
|
* @returns {Function}
|
||||||
*/
|
*/
|
||||||
MiddlewareRegistry.register(() => next => action => {
|
MiddlewareRegistry.register(({ getState }) => next => action => {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
case APP_WILL_MOUNT:
|
case APP_WILL_MOUNT:
|
||||||
case CONFERENCE_FAILED:
|
case CONFERENCE_FAILED:
|
||||||
case CONFERENCE_LEFT:
|
case CONFERENCE_LEFT:
|
||||||
ImageCache.get().clear();
|
ImageCache.get().clear();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PARTICIPANT_ID_CHANGED:
|
||||||
|
case PARTICIPANT_JOINED:
|
||||||
|
case PARTICIPANT_UPDATED: {
|
||||||
|
if (!_PREFETCH_AVATAR_URLS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = next(action);
|
||||||
|
|
||||||
|
// Initiate the downloads of participants' avatars as soon as possible.
|
||||||
|
|
||||||
|
// 1. Figure out the participant (instance).
|
||||||
|
let { participant } = action;
|
||||||
|
|
||||||
|
if (participant) {
|
||||||
|
if (participant.id) {
|
||||||
|
participant = getParticipantById(getState, participant.id);
|
||||||
|
} else if (participant.local) {
|
||||||
|
participant = getLocalParticipant(getState);
|
||||||
|
} else {
|
||||||
|
participant = undefined;
|
||||||
|
}
|
||||||
|
} else if (action.oldValue && action.newValue) {
|
||||||
|
participant = getParticipantById(getState, action.newValue);
|
||||||
|
}
|
||||||
|
if (participant) {
|
||||||
|
// 2. Get the participant's avatar URL.
|
||||||
|
const uri = getAvatarURL(participant);
|
||||||
|
|
||||||
|
if (uri) {
|
||||||
|
// 3. Initiate the download of the participant's avatar.
|
||||||
|
prefetch({ uri });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return next(action);
|
return next(action);
|
||||||
|
|
Loading…
Reference in New Issue