+ {user && !user.isVerified && (
+
refreshUser(user.id)} />
+ )}
+
{() => (
<>
@@ -228,6 +234,7 @@ Dashboard.propTypes = {
supervisor: PropTypes.bool,
superadmin: PropTypes.bool,
loadAsync: PropTypes.func.isRequired,
+ refreshUser: PropTypes.func.isRequired,
userId: PropTypes.string,
memberGroups: PropTypes.object.isRequired,
fetchManyGroupsStatus: PropTypes.string,
@@ -251,6 +258,7 @@ export default withLinks(
},
(dispatch, { match: { params } }) => ({
loadAsync: userId => Dashboard.loadAsync(params, dispatch, { userId }),
+ refreshUser: userId => dispatch(fetchUser(userId)),
})
)(injectIntl(Dashboard))
);
diff --git a/src/pages/EditUser/EditUser.js b/src/pages/EditUser/EditUser.js
index 3cef8b1fd..36fe723a0 100644
--- a/src/pages/EditUser/EditUser.js
+++ b/src/pages/EditUser/EditUser.js
@@ -2,7 +2,7 @@ import React, { Component } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
-import { FormattedMessage, injectIntl } from 'react-intl';
+import { FormattedMessage } from 'react-intl';
import { Row, Col } from 'react-bootstrap';
import { defaultMemoize } from 'reselect';
@@ -17,12 +17,11 @@ import {
import { getUser, isLoggedAsSuperAdmin } from '../../redux/selectors/users';
import Page from '../../components/layout/Page';
import { UserNavigation } from '../../components/layout/Navigation';
+import NotVerifiedEmailCallout from '../../components/Users/NotVerifiedEmailCallout';
import Button, { TheButtonGroup } from '../../components/widgets/TheButton';
-import Callout from '../../components/widgets/Callout';
-import { LocalIcon, TransferIcon, EditUserIcon, RefreshIcon } from '../../components/icons';
+import { LocalIcon, TransferIcon, EditUserIcon } from '../../components/icons';
import { isStudentRole } from '../../components/helpers/usersRoles';
import AllowUserButtonContainer from '../../containers/AllowUserButtonContainer';
-import ResendVerificationEmail from '../../containers/ResendVerificationEmailContainer';
import EditUserProfileForm from '../../components/forms/EditUserProfileForm';
import EditUserSettingsForm from '../../components/forms/EditUserSettingsForm';
@@ -72,7 +71,6 @@ class EditUser extends Component {
lastToken,
takeOver,
refreshUser,
- intl: { locale },
} = this.props;
return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
)}
@@ -225,7 +194,6 @@ EditUser.propTypes = {
generateToken: PropTypes.func.isRequired,
setRole: PropTypes.func.isRequired,
takeOver: PropTypes.func.isRequired,
- intl: PropTypes.object,
};
export default connect(
@@ -265,4 +233,4 @@ export default connect(
setRole: role => dispatch(setRole(userId, role)),
takeOver: userId => dispatch(takeOver(userId)),
})
-)(injectIntl(EditUser));
+)(EditUser);
diff --git a/src/pages/Instance/Instance.js b/src/pages/Instance/Instance.js
index d335e3ea7..6c59fd616 100644
--- a/src/pages/Instance/Instance.js
+++ b/src/pages/Instance/Instance.js
@@ -17,6 +17,8 @@ import AddLicenceFormContainer from '../../containers/AddLicenceFormContainer';
import EditGroupForm, { EDIT_GROUP_FORM_EMPTY_INITIAL_VALUES } from '../../components/forms/EditGroupForm';
import { EditIcon, InstanceIcon } from '../../components/icons';
import FetchManyResourceRenderer from '../../components/helpers/FetchManyResourceRenderer';
+import ResourceRenderer from '../../components/helpers/ResourceRenderer';
+import NotVerifiedEmailCallout from '../../components/Users/NotVerifiedEmailCallout';
import { fetchUser } from '../../redux/modules/users';
import { fetchInstanceIfNeeded } from '../../redux/modules/instances';
@@ -24,7 +26,7 @@ import { instanceSelector, isAdminOfInstance } from '../../redux/selectors/insta
import { createGroup, fetchAllGroups } from '../../redux/modules/groups';
import { notArchivedGroupsSelector, fetchManyGroupsStatus } from '../../redux/selectors/groups';
import { loggedInUserIdSelector } from '../../redux/selectors/auth';
-import { isLoggedAsSuperAdmin } from '../../redux/selectors/users';
+import { isLoggedAsSuperAdmin, getUser } from '../../redux/selectors/users';
import { transformLocalizedTextsFormData, getLocalizedName } from '../../helpers/localizedData';
import { resourceStatus } from '../../redux/helpers/resourceManager';
@@ -58,6 +60,8 @@ class Instance extends Component {
params: { instanceId },
},
userId,
+ user,
+ refreshUser,
instance,
groups,
fetchGroupsStatus,
@@ -83,6 +87,13 @@ class Instance extends Component {
windowTitle={instance => getLocalizedName(instance.rootGroup, locale)}>
{data => (
+
+ {user =>
+ user &&
+ !user.isVerified && refreshUser(userId)} />
+ }
+
+
{isSuperAdmin && (
@@ -163,12 +174,14 @@ class Instance extends Component {
Instance.propTypes = {
loadAsync: PropTypes.func.isRequired,
+ refreshUser: PropTypes.func.isRequired,
match: PropTypes.shape({
params: PropTypes.shape({
instanceId: PropTypes.string.isRequired,
}),
}).isRequired,
userId: PropTypes.string.isRequired,
+ user: ImmutablePropTypes.map,
instance: ImmutablePropTypes.map,
groups: ImmutablePropTypes.map,
fetchGroupsStatus: PropTypes.string,
@@ -195,6 +208,7 @@ export default withLinks(
const userId = loggedInUserIdSelector(state);
return {
userId,
+ user: getUser(userId)(state),
instance: instanceSelector(state, instanceId),
groups: notArchivedGroupsSelector(state),
fetchGroupsStatus: fetchManyGroupsStatus(state),
@@ -225,6 +239,7 @@ export default withLinks(
})
).then(() => Promise.all([dispatch(fetchAllGroups()), dispatch(fetchUser(userId))])),
loadAsync: fetchGroupsStatus => Instance.loadAsync({ instanceId, fetchGroupsStatus }, dispatch),
+ refreshUser: userId => dispatch(fetchUser(userId)),
})
)(injectIntl(Instance))
);
diff --git a/src/pages/SisIntegration/SisIntegration.js b/src/pages/SisIntegration/SisIntegration.js
index 9231cecf5..2c7ec18b5 100644
--- a/src/pages/SisIntegration/SisIntegration.js
+++ b/src/pages/SisIntegration/SisIntegration.js
@@ -21,9 +21,11 @@ import Box from '../../components/widgets/Box/Box';
import ResourceRenderer from '../../components/helpers/ResourceRenderer';
import Button, { TheButtonGroup } from '../../components/widgets/TheButton';
import Callout from '../../components/widgets/Callout';
+import NotVerifiedEmailCallout from '../../components/Users/NotVerifiedEmailCallout';
import { fetchAllTerms, create, deleteTerm, editTerm } from '../../redux/modules/sisTerms';
import { createGroup, fetchAllGroups, setArchived } from '../../redux/modules/groups';
+import { fetchUser } from '../../redux/modules/users';
import { loggedInUserSelector, getLoggedInUserEffectiveRole } from '../../redux/selectors/users';
import { fetchManyStatus, readySisTermsSelector } from '../../redux/selectors/sisTerms';
import { notArchivedGroupsSelector } from '../../redux/selectors/groups';
@@ -188,8 +190,17 @@ class SisIntegration extends Component {
}
render() {
- const { loggedInUser, effectiveRole, fetchStatus, adminOfGroups, allGroups, createNewTerm, deleteTerm, sisTerms } =
- this.props;
+ const {
+ loggedInUser,
+ effectiveRole,
+ fetchStatus,
+ adminOfGroups,
+ allGroups,
+ createNewTerm,
+ deleteTerm,
+ sisTerms,
+ refreshUser,
+ } = this.props;
return (
+ {user && !user.isVerified && (
+ refreshUser(user.id)} />
+ )}
+
}>
({
).then(),
setArchived: groupId => dispatch(setArchived(groupId, true)),
refreshGroups: () => dispatch(fetchAllGroups()),
+ refreshUser: userId => dispatch(fetchUser(userId)),
});
export default connect(mapStateToProps, mapDispatchToProps)(injectIntl(SisIntegration));