accounts-frontend/packages/app/components/profile/Profile.tsx

201 lines
9.1 KiB
TypeScript
Raw Normal View History

2019-12-07 16:58:52 +05:30
import React from 'react';
import { connect } from 'react-redux';
2019-11-11 14:10:05 +05:30
import { FormattedMessage as Message } from 'react-intl';
import { Link } from 'react-router-dom';
import { Helmet } from 'react-helmet-async';
import { ChangeLanguageLink } from 'app/components/languageSwitcher';
import { RelativeTime } from 'app/components/ui';
import { User } from 'app/components/user';
import RulesPage from 'app/pages/rules/RulesPage';
import { RootState } from 'app/reducers';
2019-11-11 14:10:05 +05:30
import ProfileField from './ProfileField';
import styles from './profile.scss';
import profileForm from './profileForm.scss';
type Props = {
2020-05-24 04:38:24 +05:30
user: User;
interfaceLocale: string;
};
class Profile extends React.PureComponent<Props> {
2020-05-24 04:38:24 +05:30
UUID: HTMLElement | null;
render() {
const { user, interfaceLocale } = this.props;
return (
<div data-testid="profile-index">
<Message key="accountPreferencesTitle" defaultMessage="Ely.by account preferences">
2020-05-24 04:38:24 +05:30
{(pageTitle: string) => (
<h2 className={styles.indexTitle}>
<Helmet title={pageTitle} />
{pageTitle}
</h2>
)}
</Message>
<div className={styles.indexContent}>
<div className={styles.descriptionColumn}>
<div className={styles.indexDescription}>
<Message
key="accountDescription"
defaultMessage="Ely.by account allows you to get access to many Minecraft resources. Please, take care of your account safety. Use secure password and change it regularly."
/>
2020-05-24 04:38:24 +05:30
</div>
</div>
<div className={styles.formColumn}>
<div className={profileForm.form}>
<div className={styles.item}>
<h3 className={profileForm.title}>
<Message key="personalData" defaultMessage="Personal data" />
2020-05-24 04:38:24 +05:30
</h3>
<p className={profileForm.description}>
<Message
key="preferencesDescription"
defaultMessage="Here you can change the key preferences of your account. Please note that all actions must be confirmed by entering a password."
/>
2020-05-24 04:38:24 +05:30
</p>
</div>
<ProfileField
link="/profile/change-username"
label={<Message key="nickname" defaultMessage="Nickname:" />}
2020-05-24 04:38:24 +05:30
value={user.username}
warningMessage={
user.hasMojangUsernameCollision ? (
<Message
key="mojangPriorityWarning"
defaultMessage="A Mojang account with the same nickname was found. According to {rules}, account owner has the right to demand the restoration of control over nickname."
2020-05-24 04:38:24 +05:30
values={{
rules: (
<Link
to={{
pathname: '/rules',
hash: `#${RulesPage.getRuleHash(1, 4)}`,
}}
>
<Message key="projectRules" defaultMessage="project rules" />
2020-05-24 04:38:24 +05:30
</Link>
),
}}
/>
) : (
''
)
}
/>
<ProfileField
link="/profile/change-email"
label={<Message key="email" defaultMessage="Email:" />}
2020-05-24 04:38:24 +05:30
value={user.email}
/>
<ProfileField
link="/profile/change-password"
label={<Message key="password" defaultMessage="Password:" />}
2020-05-24 04:38:24 +05:30
value={
<Message
key="changedAt"
defaultMessage="Changed {at}"
2020-05-24 04:38:24 +05:30
values={{
at: <RelativeTime timestamp={user.passwordChangedAt * 1000} />,
}}
/>
}
/>
<ProfileField
label={<Message key="siteLanguage" defaultMessage="Site language:" />}
2020-05-24 04:38:24 +05:30
value={<ChangeLanguageLink />}
warningMessage={
user.lang === interfaceLocale ? (
''
) : (
<Message
key="languageIsUnavailableWarning"
defaultMessage={
'The locale "{locale}" you\'ve used earlier isn\'t currently translated enough. If you want to continue using the selected language, please {participateInTheTranslation} of the project.'
}
2020-05-24 04:38:24 +05:30
values={{
locale: user.lang,
participateInTheTranslation: (
<a href="http://ely.by/translate" target="_blank">
<Message
key="participateInTheTranslation"
defaultMessage="participate in the translation"
/>
2020-05-24 04:38:24 +05:30
</a>
),
}}
/>
)
}
/>
2020-05-24 04:38:24 +05:30
<ProfileField
link="/profile/mfa"
label={<Message key="twoFactorAuth" defaultMessage="Twofactor auth:" />}
2020-05-24 04:38:24 +05:30
value={
user.isOtpEnabled ? (
<Message key="enabled" defaultMessage="Enabled" />
2020-05-24 04:38:24 +05:30
) : (
<Message key="disabled" defaultMessage="Disabled" />
2020-05-24 04:38:24 +05:30
)
}
/>
<ProfileField
label={<Message key="uuid" defaultMessage="UUID:" />}
2020-05-24 04:38:24 +05:30
value={
<span
className={styles.uuid}
ref={this.setUUID.bind(this)}
onMouseOver={this.handleUUIDMouseOver.bind(this)}
>
{user.uuid}
</span>
}
/>
</div>
</div>
</div>
</div>
2020-05-24 04:38:24 +05:30
);
}
2020-05-24 04:38:24 +05:30
handleUUIDMouseOver() {
if (!this.UUID) {
return;
}
const el = this.UUID;
2020-05-24 04:38:24 +05:30
try {
const selection = window.getSelection();
2019-12-07 16:58:52 +05:30
2020-05-24 04:38:24 +05:30
if (!selection) {
return;
}
2019-12-07 16:58:52 +05:30
2020-05-24 04:38:24 +05:30
const range = document.createRange();
range.selectNodeContents(el);
selection.removeAllRanges();
selection.addRange(range);
} catch (err) {
// the browser does not support an API
}
}
2020-05-24 04:38:24 +05:30
setUUID(el: HTMLElement | null) {
this.UUID = el;
}
}
2019-12-07 16:58:52 +05:30
export default connect(({ user, i18n }: RootState) => ({
2020-05-24 04:38:24 +05:30
user,
interfaceLocale: i18n.locale,
}))(Profile);