cspace-ui
Version:
CollectionSpace user interface for browsers
127 lines (114 loc) • 3.99 kB
JSX
import React from 'react';
import PropTypes from 'prop-types';
import Immutable from 'immutable';
import { defineMessages, FormattedMessage } from 'react-intl';
import Notification from '../notification/Notification';
import styles from '../../../styles/cspace-ui/AuthStatus.css';
const propTypes = {
isPending: PropTypes.bool,
isSuccess: PropTypes.bool,
error: PropTypes.instanceOf(Immutable.Map),
username: PropTypes.string,
};
const messages = defineMessages({
pending: {
id: 'authStatus.pending',
description: 'Message displayed while login is in progress.',
defaultMessage: 'Finishing sign in...',
},
success: {
id: 'authStatus.success',
description: 'Message displayed when login completes successfully.',
defaultMessage: 'Signed in as {username}.',
},
error: {
id: 'authStatus.error',
description: 'Generic login error message. Displayed when a more specific error message is not available.',
defaultMessage: 'Sign in failed.',
},
ERR_AUTH_CODE_REQUEST_NOT_FOUND: {
id: 'authStatus.ERR_AUTH_CODE_REQUEST_NOT_FOUND',
description: 'Error message displayed when an invalid authorization code request ID was received.',
defaultMessage: 'Sign in failed. The authorization code does not belong to an active sign in request.',
},
ERR_BAD_REQUEST: {
id: 'authStatus.ERR_BAD_REQUEST',
description: 'Error message displayed when a bad request response was received during login.',
defaultMessage: 'Sign in failed. The CollectionSpace server received a bad request.',
},
ERR_ACCOUNT_INACTIVE: {
id: 'authStatus.ERR_ACCOUNT_INACTIVE',
description: 'Error message displayed when the account is inactive during login.',
defaultMessage: 'Sign in failed. The account is inactive.',
},
ERR_ACCOUNT_INVALID: {
id: 'authStatus.ERR_ACCOUNT_INVALID',
description: 'Error message displayed when the account is in an invalid state during login.',
defaultMessage: 'Sign in failed. The account is in an invalid state.',
},
ERR_ACCOUNT_NOT_FOUND: {
id: 'authStatus.ERR_ACCOUNT_NOT_FOUND',
description: 'Error message displayed when the account is not found during login.',
defaultMessage: 'Sign in failed. Account not found.',
},
ERR_INVALID_CREDENTIALS: {
id: 'authStatus.ERR_INVALID_CREDENTIALS',
description: 'Error message displayed when incorrect credentials were entered during login.',
defaultMessage: 'Sign in failed. Incorrect username/password.',
},
ERR_NETWORK: {
id: 'authStatus.ERR_NETWORK',
description: 'Error message displayed when there is a network error during login.',
defaultMessage: 'Sign in failed. Unable to reach the CollectionSpace server.',
},
ERR_WRONG_TENANT: {
id: 'authStatus.ERR_WRONG_TENANT',
description: 'Error message displayed when the logged in user belongs to the wrong tenant.',
defaultMessage: 'Sign in failed. The user is not registered to this CollectionSpace tenant.',
},
});
const renderStatus = (username, isSuccess, isPending) => {
let messageKey;
if (isPending) {
messageKey = 'pending';
} else if (isSuccess) {
messageKey = 'success';
}
if (!messageKey) {
return null;
}
return (
<p><FormattedMessage {...messages[messageKey]} values={{ username }} /></p>
);
};
const renderError = (error, isPending) => {
if (isPending || !error) {
return undefined;
}
const messageKey = error.get('code') || 'error';
return (
<Notification
id="authStatus.error"
items={[{
message: messages[messageKey] || messages.error,
}]}
showCloseButton={false}
status="error"
/>
);
};
export default function AuthStatus(props) {
const {
error,
isPending,
isSuccess,
username,
} = props;
return (
<div className={styles.common}>
{renderStatus(username, isSuccess, isPending)}
{renderError(error, isPending)}
</div>
);
}
AuthStatus.propTypes = propTypes;