mirror of
https://github.com/elyby/accounts-frontend.git
synced 2024-12-16 10:19:03 +05:30
Добавлена первичная вёрстка для профиля пользователя
This commit is contained in:
parent
e94b04551d
commit
d725bc2bfe
105
src/components/profile/Category.jsx
Normal file
105
src/components/profile/Category.jsx
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import { FormattedMessage as Message, FormattedRelative as Relative } from 'react-intl';
|
||||||
|
|
||||||
|
import styles from './category.scss';
|
||||||
|
|
||||||
|
export class Category extends Component {
|
||||||
|
static displayName = 'Logout';
|
||||||
|
|
||||||
|
render() {
|
||||||
|
var { user } = this.props;
|
||||||
|
var changePassDate = Date.now() - (1000 * 60 * 60 * 24 * 30 * 3);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h2 className={styles.title}>
|
||||||
|
Настройки аккаунта Ely.by
|
||||||
|
</h2>
|
||||||
|
<div className={styles.content}>
|
||||||
|
<div className={styles.description}>
|
||||||
|
Благодаря аккаунту Ely.by вы можете получить доступ ко многим ресурсам, связанным с Minecraft.
|
||||||
|
Берегите свой аккаунт, используйте надёжный пароль и регулярно его меняйте.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.options}>
|
||||||
|
<div className={styles.item}>
|
||||||
|
<h3 className={styles.optionsTitle}>Персональные данные</h3>
|
||||||
|
<p className={styles.optionsDescription}>
|
||||||
|
Здесь вы можете сменить ключевые параметры вашего аккаунта. Обратите внимание, что для
|
||||||
|
всех действий необходимо подтверждение при помощи ввода пароля.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.paramItem}>
|
||||||
|
<div className={styles.paramRow}>
|
||||||
|
<div className={styles.paramName}>Ник:</div>
|
||||||
|
<div className={styles.paramValue}>{user.username}</div>
|
||||||
|
<div className={styles.paramAction}>
|
||||||
|
<a href="#">
|
||||||
|
<span className={styles.paramEditIcon} />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.paramMessage}>
|
||||||
|
Найден аккаунт Mojang с таким же ником и, по правилам проекта, его владелец вправе
|
||||||
|
потребовать восстановления контроля над ником.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.paramItem}>
|
||||||
|
<div className={styles.paramRow}>
|
||||||
|
<div className={styles.paramName}>E-mail:</div>
|
||||||
|
<div className={styles.paramValue}>{user.email}</div>
|
||||||
|
<div className={styles.paramAction}>
|
||||||
|
<a href="#">
|
||||||
|
<span className={styles.paramEditIcon} />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.paramItem}>
|
||||||
|
<div className={styles.paramRow}>
|
||||||
|
<div className={styles.paramName}>Пароль:</div>
|
||||||
|
<div className={styles.paramValue}>
|
||||||
|
Изменён <Relative value={changePassDate} />
|
||||||
|
</div>
|
||||||
|
<div className={styles.paramAction}>
|
||||||
|
<a href="#">
|
||||||
|
<span className={styles.paramEditIcon} />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{user.shouldChangePassword ? (
|
||||||
|
<div className={styles.paramMessage}>
|
||||||
|
Для пароля применяется старый алгоритм хэширования<br />
|
||||||
|
Пожалуйста, смените пароль.
|
||||||
|
</div>
|
||||||
|
) : ''}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.paramItem}>
|
||||||
|
<div className={styles.paramRow}>
|
||||||
|
<div className={styles.paramName}>Двухфакторная аутентификация:</div>
|
||||||
|
<div className={styles.paramValue}>Не включена</div>
|
||||||
|
<div className={styles.paramAction}>
|
||||||
|
<a href="#">
|
||||||
|
<span className={styles.paramEditIcon} />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.paramItem}>
|
||||||
|
<div className={styles.paramRow}>
|
||||||
|
<div className={styles.paramName}>UUID:</div>
|
||||||
|
<div className={styles.uuidValue}>{user.uuid || 'df936908-b2e1-544d-96f8-2977ec213022'}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
121
src/components/profile/category.scss
Normal file
121
src/components/profile/category.scss
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
@import '~components/ui/fonts.scss';
|
||||||
|
@import '~components/ui/colors.scss';
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-family: $font-family-title;
|
||||||
|
font-size: 30px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.description {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.4;
|
||||||
|
color: #9a9a9a;
|
||||||
|
width: 340px;
|
||||||
|
padding: 12px 20px 0 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.options {
|
||||||
|
background: #fff;
|
||||||
|
flex-grow: 1;
|
||||||
|
max-width: 416px;
|
||||||
|
border-bottom: 10px solid #ddd8ce;
|
||||||
|
}
|
||||||
|
|
||||||
|
.optionsTitle {
|
||||||
|
position: relative;
|
||||||
|
font-size: 24px;
|
||||||
|
font-family: $font-family-title;
|
||||||
|
padding-bottom: 9px;
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
height: 3px;
|
||||||
|
width: 86px;
|
||||||
|
|
||||||
|
background: $green;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.optionsDescription {
|
||||||
|
font-size: 13px;
|
||||||
|
color: #9a9a9a;
|
||||||
|
line-height: 1.25;
|
||||||
|
margin-top: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item {
|
||||||
|
padding: 30px;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.paramItem {
|
||||||
|
composes: item;
|
||||||
|
|
||||||
|
$padding: 20px;
|
||||||
|
|
||||||
|
padding-top: $padding;
|
||||||
|
padding-bottom: $padding;
|
||||||
|
|
||||||
|
color: #666666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.paramRow {
|
||||||
|
display: flex;
|
||||||
|
align-items: baseline;
|
||||||
|
flex-basis: 0;
|
||||||
|
flex-grow: 1;
|
||||||
|
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.paramName {
|
||||||
|
width: 125px;
|
||||||
|
font-family: $font-family-title;
|
||||||
|
}
|
||||||
|
|
||||||
|
.paramValue {
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.uuidValue {
|
||||||
|
composes: paramName;
|
||||||
|
composes: paramValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.paramAction {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.paramEditIcon {
|
||||||
|
composes: pencil from 'components/ui/icons.scss';
|
||||||
|
|
||||||
|
color: $light;
|
||||||
|
transition: .4s;
|
||||||
|
|
||||||
|
a:hover & {
|
||||||
|
color: #444;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.paramMessage {
|
||||||
|
padding: 10px 40px 0 0;
|
||||||
|
|
||||||
|
color: $red;
|
||||||
|
font-size: 11px;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
@ -24,7 +24,7 @@ export default class User {
|
|||||||
goal: null, // the goal with wich user entered site
|
goal: null, // the goal with wich user entered site
|
||||||
isGuest: true,
|
isGuest: true,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
shouldChangePassword: false
|
shouldChangePassword: false // TODO: нужно ещё пробросить причину необходимости смены
|
||||||
};
|
};
|
||||||
|
|
||||||
const user = Object.keys(defaults).reduce((user, key) => {
|
const user = Object.keys(defaults).reduce((user, key) => {
|
||||||
|
@ -27,7 +27,7 @@ export default class LoggedInPanel extends Component {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={buttonGroups.horizontalGroup}>
|
<div className={buttonGroups.horizontalGroup}>
|
||||||
<Link to="/profile" className={classNames(buttons.green, buttonGroups.item)}>
|
<Link to="/" className={classNames(buttons.green, buttonGroups.item)}>
|
||||||
<span className={styles.userIcon} />
|
<span className={styles.userIcon} />
|
||||||
<span className={styles.userName}>{user.username}</span>
|
<span className={styles.userName}>{user.username}</span>
|
||||||
</Link>
|
</Link>
|
||||||
|
6
src/icons/webfont/pencil.svg
Normal file
6
src/icons/webfont/pencil.svg
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generated by IcoMoon.io -->
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<path d="M13.5 0c1.381 0 2.5 1.119 2.5 2.5 0 0.563-0.186 1.082-0.5 1.5l-1 1-3.5-3.5 1-1c0.418-0.314 0.937-0.5 1.5-0.5zM1 11.5l-1 4.5 4.5-1 9.25-9.25-3.5-3.5-9.25 9.25zM11.181 5.681l-7 7-0.862-0.862 7-7 0.862 0.862z"></path>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 543 B |
@ -2,6 +2,8 @@ import React, { Component } from 'react';
|
|||||||
|
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
|
|
||||||
|
import ProfilePage from 'pages/profile/ProfilePage';
|
||||||
|
|
||||||
import authFlow from 'services/authFlow';
|
import authFlow from 'services/authFlow';
|
||||||
|
|
||||||
class IndexPage extends Component {
|
class IndexPage extends Component {
|
||||||
@ -14,14 +16,9 @@ class IndexPage extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {user, children} = this.props;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h1>
|
<ProfilePage {...this.props} />
|
||||||
Hello {user.username}!
|
|
||||||
</h1>
|
|
||||||
{children}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
33
src/pages/profile/ProfilePage.jsx
Normal file
33
src/pages/profile/ProfilePage.jsx
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import React, { Component, PropTypes } from 'react';
|
||||||
|
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
|
||||||
|
import { Category } from 'components/profile/Category';
|
||||||
|
|
||||||
|
import styles from './profile.scss';
|
||||||
|
|
||||||
|
class ProfilePage extends Component {
|
||||||
|
static displayName = 'AuthPage';
|
||||||
|
static propTypes = {
|
||||||
|
/*client: PropTypes.shape({
|
||||||
|
id: PropTypes.string.isRequired,
|
||||||
|
name: PropTypes.string.isRequired,
|
||||||
|
description: PropTypes.string.isRequired
|
||||||
|
})*/
|
||||||
|
};
|
||||||
|
|
||||||
|
state = {
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className={styles.content}>
|
||||||
|
<Category {...this.props} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default connect((state) => ({
|
||||||
|
//client: state.auth.client
|
||||||
|
}))(ProfilePage);
|
5
src/pages/profile/profile.scss
Normal file
5
src/pages/profile/profile.scss
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
@import "~components/ui/colors.scss";
|
||||||
|
|
||||||
|
.content {
|
||||||
|
margin-top: 55px;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user