[RN] If calendar-sync knows a domain, then the app knows it
This commit is contained in:
parent
ee94d79ee6
commit
46bc63b79e
|
@ -1,16 +1,5 @@
|
||||||
// @flow
|
// @flow
|
||||||
|
|
||||||
/**
|
|
||||||
* Action to add a new domain to the list of domain known to the feature
|
|
||||||
* calendar-sync.
|
|
||||||
*
|
|
||||||
* {
|
|
||||||
* type: ADD_KNOWN_DOMAIN,
|
|
||||||
* knownDomain: string
|
|
||||||
* }
|
|
||||||
*/
|
|
||||||
export const ADD_KNOWN_DOMAIN = Symbol('ADD_KNOWN_DOMAIN');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Action to refresh (re-fetch) the entry list.
|
* Action to refresh (re-fetch) the entry list.
|
||||||
*
|
*
|
||||||
|
|
|
@ -3,26 +3,9 @@
|
||||||
import {
|
import {
|
||||||
SET_CALENDAR_AUTHORIZATION,
|
SET_CALENDAR_AUTHORIZATION,
|
||||||
SET_CALENDAR_EVENTS,
|
SET_CALENDAR_EVENTS,
|
||||||
ADD_KNOWN_DOMAIN,
|
|
||||||
REFRESH_CALENDAR
|
REFRESH_CALENDAR
|
||||||
} from './actionTypes';
|
} from './actionTypes';
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends an action to add a new known domain if not present yet.
|
|
||||||
*
|
|
||||||
* @param {string} knownDomain - The new domain.
|
|
||||||
* @returns {{
|
|
||||||
* type: ADD_KNOWN_DOMAIN,
|
|
||||||
* knownDomain: string
|
|
||||||
* }}
|
|
||||||
*/
|
|
||||||
export function addKnownDomain(knownDomain: string) {
|
|
||||||
return {
|
|
||||||
type: ADD_KNOWN_DOMAIN,
|
|
||||||
knownDomain
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends an action to refresh the entry list (fetches new data).
|
* Sends an action to refresh the entry list (fetches new data).
|
||||||
*
|
*
|
||||||
|
|
|
@ -3,13 +3,12 @@
|
||||||
import RNCalendarEvents from 'react-native-calendar-events';
|
import RNCalendarEvents from 'react-native-calendar-events';
|
||||||
|
|
||||||
import { APP_WILL_MOUNT } from '../app';
|
import { APP_WILL_MOUNT } from '../app';
|
||||||
import { SET_ROOM } from '../base/conference';
|
import { ADD_KNOWN_DOMAINS } from '../base/domains';
|
||||||
import { MiddlewareRegistry } from '../base/redux';
|
import { MiddlewareRegistry } from '../base/redux';
|
||||||
import { APP_LINK_SCHEME, parseURIString } from '../base/util';
|
import { APP_LINK_SCHEME, parseURIString } from '../base/util';
|
||||||
import { APP_STATE_CHANGED } from '../mobile/background';
|
import { APP_STATE_CHANGED } from '../mobile/background';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
addKnownDomain,
|
|
||||||
setCalendarAuthorization,
|
setCalendarAuthorization,
|
||||||
setCalendarEvents
|
setCalendarEvents
|
||||||
} from './actions';
|
} from './actions';
|
||||||
|
@ -18,8 +17,19 @@ import { CALENDAR_ENABLED } from './constants';
|
||||||
|
|
||||||
const logger = require('jitsi-meet-logger').getLogger(__filename);
|
const logger = require('jitsi-meet-logger').getLogger(__filename);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The no. of days to fetch.
|
||||||
|
*/
|
||||||
const FETCH_END_DAYS = 10;
|
const FETCH_END_DAYS = 10;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The no. of days to go back when fetching.
|
||||||
|
*/
|
||||||
const FETCH_START_DAYS = -1;
|
const FETCH_START_DAYS = -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The max number of events to fetch from the calendar.
|
||||||
|
*/
|
||||||
const MAX_LIST_LENGTH = 10;
|
const MAX_LIST_LENGTH = 10;
|
||||||
|
|
||||||
CALENDAR_ENABLED
|
CALENDAR_ENABLED
|
||||||
|
@ -31,18 +41,14 @@ CALENDAR_ENABLED
|
||||||
_maybeClearAccessStatus(store, action);
|
_maybeClearAccessStatus(store, action);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ADD_KNOWN_DOMAINS:
|
||||||
case APP_WILL_MOUNT:
|
case APP_WILL_MOUNT:
|
||||||
_ensureDefaultServer(store);
|
|
||||||
_fetchCalendarEntries(store, false, false);
|
_fetchCalendarEntries(store, false, false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REFRESH_CALENDAR:
|
case REFRESH_CALENDAR:
|
||||||
_fetchCalendarEntries(store, true, action.forcePermission);
|
_fetchCalendarEntries(store, true, action.forcePermission);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SET_ROOM:
|
|
||||||
_parseAndAddKnownDomain(store);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -95,20 +101,6 @@ function _ensureCalendarAccess(promptForPermission, dispatch) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Ensures presence of the default server in the known domains list.
|
|
||||||
*
|
|
||||||
* @param {Object} store - The redux store.
|
|
||||||
* @private
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
function _ensureDefaultServer({ dispatch, getState }) {
|
|
||||||
const defaultURL
|
|
||||||
= parseURIString(getState()['features/app'].app._getDefaultURL());
|
|
||||||
|
|
||||||
dispatch(addKnownDomain(defaultURL.host));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads the user's calendar and updates the stored entries if need be.
|
* Reads the user's calendar and updates the stored entries if need be.
|
||||||
*
|
*
|
||||||
|
@ -124,9 +116,10 @@ function _fetchCalendarEntries(
|
||||||
{ dispatch, getState },
|
{ dispatch, getState },
|
||||||
maybePromptForPermission,
|
maybePromptForPermission,
|
||||||
forcePermission) {
|
forcePermission) {
|
||||||
const state = getState()['features/calendar-sync'];
|
const featureState = getState()['features/calendar-sync'];
|
||||||
|
const knownDomains = getState()['features/base/domains'];
|
||||||
const promptForPermission
|
const promptForPermission
|
||||||
= (maybePromptForPermission && !state.authorization)
|
= (maybePromptForPermission && !featureState.authorization)
|
||||||
|| forcePermission;
|
|| forcePermission;
|
||||||
|
|
||||||
_ensureCalendarAccess(promptForPermission, dispatch)
|
_ensureCalendarAccess(promptForPermission, dispatch)
|
||||||
|
@ -145,7 +138,7 @@ function _fetchCalendarEntries(
|
||||||
.then(events =>
|
.then(events =>
|
||||||
_updateCalendarEntries(
|
_updateCalendarEntries(
|
||||||
events,
|
events,
|
||||||
state.knownDomains,
|
knownDomains,
|
||||||
dispatch))
|
dispatch))
|
||||||
.catch(error =>
|
.catch(error =>
|
||||||
logger.error('Error fetching calendar.', error));
|
logger.error('Error fetching calendar.', error));
|
||||||
|
@ -199,20 +192,6 @@ function _getURLFromEvent(event, knownDomains) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the domain name of a room upon join and stores it in the known
|
|
||||||
* domain list, if not present yet.
|
|
||||||
*
|
|
||||||
* @param {Object} store - The redux store.
|
|
||||||
* @private
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
function _parseAndAddKnownDomain({ dispatch, getState }) {
|
|
||||||
const { locationURL } = getState()['features/base/connection'];
|
|
||||||
|
|
||||||
dispatch(addKnownDomain(locationURL.host));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the calendar entries in Redux when new list is received.
|
* Updates the calendar entries in Redux when new list is received.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
// @flow
|
// @flow
|
||||||
|
|
||||||
import { ReducerRegistry } from '../base/redux';
|
import { ReducerRegistry } from '../base/redux';
|
||||||
import { PersistenceRegistry } from '../base/storage';
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
ADD_KNOWN_DOMAIN,
|
|
||||||
SET_CALENDAR_AUTHORIZATION,
|
SET_CALENDAR_AUTHORIZATION,
|
||||||
SET_CALENDAR_EVENTS
|
SET_CALENDAR_EVENTS
|
||||||
} from './actionTypes';
|
} from './actionTypes';
|
||||||
|
@ -17,24 +15,14 @@ const DEFAULT_STATE = {
|
||||||
* need to re-request the calendar permission from the user.
|
* need to re-request the calendar permission from the user.
|
||||||
*/
|
*/
|
||||||
authorization: undefined,
|
authorization: undefined,
|
||||||
events: [],
|
events: []
|
||||||
knownDomains: []
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const MAX_DOMAIN_LIST_SIZE = 10;
|
|
||||||
|
|
||||||
const STORE_NAME = 'features/calendar-sync';
|
const STORE_NAME = 'features/calendar-sync';
|
||||||
|
|
||||||
CALENDAR_ENABLED
|
|
||||||
&& PersistenceRegistry.register(STORE_NAME, {
|
|
||||||
knownDomains: true
|
|
||||||
});
|
|
||||||
|
|
||||||
CALENDAR_ENABLED
|
CALENDAR_ENABLED
|
||||||
&& ReducerRegistry.register(STORE_NAME, (state = DEFAULT_STATE, action) => {
|
&& ReducerRegistry.register(STORE_NAME, (state = DEFAULT_STATE, action) => {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
case ADD_KNOWN_DOMAIN:
|
|
||||||
return _addKnownDomain(state, action);
|
|
||||||
|
|
||||||
case SET_CALENDAR_AUTHORIZATION:
|
case SET_CALENDAR_AUTHORIZATION:
|
||||||
return {
|
return {
|
||||||
|
@ -52,41 +40,3 @@ CALENDAR_ENABLED
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds a new domain to the known domain list if not present yet.
|
|
||||||
*
|
|
||||||
* @param {Object} state - The redux state.
|
|
||||||
* @param {Object} action - The redux action.
|
|
||||||
* @private
|
|
||||||
* @returns {Object}
|
|
||||||
*/
|
|
||||||
function _addKnownDomain(state, action) {
|
|
||||||
let { knownDomain } = action;
|
|
||||||
|
|
||||||
if (knownDomain) {
|
|
||||||
knownDomain = knownDomain.toLowerCase();
|
|
||||||
|
|
||||||
let { knownDomains } = state;
|
|
||||||
|
|
||||||
if (knownDomains.indexOf(knownDomain) === -1) {
|
|
||||||
// Add the specified known domain and at the same time avoid
|
|
||||||
// modifying the knownDomains Array instance referenced by the
|
|
||||||
// current redux state.
|
|
||||||
knownDomains = [
|
|
||||||
...state.knownDomains,
|
|
||||||
knownDomain
|
|
||||||
];
|
|
||||||
|
|
||||||
// Ensure the list doesn't exceed a/the maximum size.
|
|
||||||
knownDomains.splice(0, knownDomains.length - MAX_DOMAIN_LIST_SIZE);
|
|
||||||
|
|
||||||
return {
|
|
||||||
...state,
|
|
||||||
knownDomains
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue