mirror of
https://github.com/elyby/accounts-frontend.git
synced 2025-05-31 14:11:58 +05:30
Маленький рефакторинг PanelTransition
This commit is contained in:
@@ -9,10 +9,9 @@ import panelStyles from 'components/ui/panel.scss';
|
|||||||
import icons from 'components/ui/icons.scss';
|
import icons from 'components/ui/icons.scss';
|
||||||
|
|
||||||
|
|
||||||
const opacitySpringConfig = [200, 20];
|
const opacitySpringConfig = [300, 20];
|
||||||
const transformSpringConfig = [500, 50];
|
const transformSpringConfig = [500, 50];
|
||||||
|
const changeContextSpringConfig = [500, 20];
|
||||||
// TODO: сделать более быстрый фейд на горизонтальном скролле
|
|
||||||
|
|
||||||
export default class PanelTransition extends Component {
|
export default class PanelTransition extends Component {
|
||||||
state = {
|
state = {
|
||||||
@@ -31,8 +30,8 @@ export default class PanelTransition extends Component {
|
|||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
direction,
|
direction,
|
||||||
forceHeight: forceHeight,
|
forceHeight,
|
||||||
previousRoute: this.props.location
|
previousRoute
|
||||||
});
|
});
|
||||||
|
|
||||||
if (forceHeight) {
|
if (forceHeight) {
|
||||||
@@ -61,7 +60,7 @@ export default class PanelTransition extends Component {
|
|||||||
},
|
},
|
||||||
common: {
|
common: {
|
||||||
heightSpring: spring(forceHeight || height[path] || 0, transformSpringConfig),
|
heightSpring: spring(forceHeight || height[path] || 0, transformSpringConfig),
|
||||||
switchContextHeightSpring: spring(forceHeight || contextHeight, [500, 20])
|
switchContextHeightSpring: spring(forceHeight || contextHeight, changeContextSpringConfig)
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
willEnter={this.willEnter}
|
willEnter={this.willEnter}
|
||||||
@@ -69,46 +68,33 @@ export default class PanelTransition extends Component {
|
|||||||
>
|
>
|
||||||
{(items) => {
|
{(items) => {
|
||||||
var keys = Object.keys(items).filter((key) => key !== 'common');
|
var keys = Object.keys(items).filter((key) => key !== 'common');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<Panel>
|
<Panel>
|
||||||
<PanelHeader>
|
<PanelHeader>
|
||||||
<div style={{
|
{keys.map((key) => this.getHeader(key, items[key]))}
|
||||||
position: 'relative',
|
|
||||||
height: '59px',
|
|
||||||
overflow: 'hidden'
|
|
||||||
}}>
|
|
||||||
{keys.map((key) => this.getHeader(key, items[key]))}
|
|
||||||
</div>
|
|
||||||
</PanelHeader>
|
</PanelHeader>
|
||||||
<div style={{
|
<div style={{
|
||||||
overflow: 'hidden',
|
overflow: 'hidden',
|
||||||
height: forceHeight ? items.common.switchContextHeightSpring : 'auto'
|
height: forceHeight ? items.common.switchContextHeightSpring : 'auto'
|
||||||
}}>
|
}}>
|
||||||
<ReactHeight onHeightReady={this.updateContextHeight}>
|
<ReactHeight onHeightReady={this.updateContextHeight}>
|
||||||
<PanelBody style={{
|
<PanelBody>
|
||||||
overflow: 'hidden'
|
|
||||||
}}>
|
|
||||||
<div style={{
|
<div style={{
|
||||||
position: 'relative',
|
position: 'relative',
|
||||||
height: previousRoute ? `${items.common.heightSpring}px` : `${height[path]}px`
|
height: `${previousRoute ? items.common.heightSpring : height[path]}px`
|
||||||
}}>
|
}}>
|
||||||
{keys.map((key) => this.getBody(key, items[key]))}
|
{keys.map((key) => this.getBody(key, items[key]))}
|
||||||
</div>
|
</div>
|
||||||
</PanelBody>
|
</PanelBody>
|
||||||
<PanelFooter>
|
<PanelFooter>
|
||||||
<div style={{
|
{keys.map((key) => this.getFooter(key, items[key]))}
|
||||||
position: 'relative',
|
|
||||||
height: '50px',
|
|
||||||
overflow: 'hidden'
|
|
||||||
}}>
|
|
||||||
{keys.map((key) => this.getFooter(key, items[key]))}
|
|
||||||
</div>
|
|
||||||
</PanelFooter>
|
</PanelFooter>
|
||||||
</ReactHeight>
|
</ReactHeight>
|
||||||
</div>
|
</div>
|
||||||
</Panel>
|
</Panel>
|
||||||
<div className={helpLinksStyles} style={{position: 'relative', height: '20px'}}>
|
<div className={helpLinksStyles}>
|
||||||
{keys.map((key) => this.getLinks(key, items[key]))}
|
{keys.map((key) => this.getLinks(key, items[key]))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -119,23 +105,24 @@ export default class PanelTransition extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
willEnter = (key, styles) => {
|
willEnter = (key, styles) => {
|
||||||
var map = {
|
return this.getTransitionStyles(key, styles);
|
||||||
'/login': -1,
|
|
||||||
'/register': -1,
|
|
||||||
'/password': 1,
|
|
||||||
'/activation': 1,
|
|
||||||
'/oauth/permissions': -1
|
|
||||||
};
|
|
||||||
var sign = map[key];
|
|
||||||
|
|
||||||
return {
|
|
||||||
...styles,
|
|
||||||
transformSpring: spring(sign * 100, transformSpringConfig),
|
|
||||||
opacitySpring: spring(1, opacitySpringConfig)
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
willLeave = (key, styles) => {
|
willLeave = (key, styles) => {
|
||||||
|
return this.getTransitionStyles(key, styles, {isLeave: true});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} key
|
||||||
|
* @param {Object} styles
|
||||||
|
* @param {Object} [options]
|
||||||
|
* @param {Object} [options.isLeave=false] - true, if this is a leave transition
|
||||||
|
*
|
||||||
|
* @return {Object}
|
||||||
|
*/
|
||||||
|
getTransitionStyles(key, styles, options = {}) {
|
||||||
|
var {isLeave = false} = options;
|
||||||
|
|
||||||
var map = {
|
var map = {
|
||||||
'/login': -1,
|
'/login': -1,
|
||||||
'/register': -1,
|
'/register': -1,
|
||||||
@@ -147,10 +134,11 @@ export default class PanelTransition extends Component {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
...styles,
|
...styles,
|
||||||
|
pointerEvents: isLeave ? 'none' : 'auto',
|
||||||
transformSpring: spring(sign * 100, transformSpringConfig),
|
transformSpring: spring(sign * 100, transformSpringConfig),
|
||||||
opacitySpring: spring(0, opacitySpringConfig)
|
opacitySpring: spring(isLeave ? 0 : 1, opacitySpringConfig)
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
updateHeight = (height) => {
|
updateHeight = (height) => {
|
||||||
this.setState({
|
this.setState({
|
||||||
@@ -191,22 +179,16 @@ export default class PanelTransition extends Component {
|
|||||||
var {hasBackButton, transformSpring, Title} = props;
|
var {hasBackButton, transformSpring, Title} = props;
|
||||||
|
|
||||||
var style = {
|
var style = {
|
||||||
position: 'absolute',
|
...this.getDefaultTransitionStyles(props),
|
||||||
top: 0,
|
opacity: 1 // reset default
|
||||||
left: 0,
|
|
||||||
width: '100%'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
var scrollStyle = {
|
var scrollStyle = this.translate(transformSpring, 'Y');
|
||||||
WebkitTransform: `translateY(${transformSpring}%)`,
|
|
||||||
transform: `translateY(${transformSpring}%)`
|
|
||||||
};
|
|
||||||
|
|
||||||
var sideScrollStyle = {
|
var sideScrollStyle = {
|
||||||
position: 'relative',
|
position: 'relative',
|
||||||
zIndex: 2,
|
zIndex: 2,
|
||||||
WebkitTransform: `translateX(${-Math.abs(transformSpring)}%)`,
|
...this.translate(-Math.abs(transformSpring))
|
||||||
transform: `translateX(${-Math.abs(transformSpring)}%)`
|
|
||||||
};
|
};
|
||||||
|
|
||||||
var backButton = (
|
var backButton = (
|
||||||
@@ -226,13 +208,10 @@ export default class PanelTransition extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getBody(key, props) {
|
getBody(key, props) {
|
||||||
var {transformSpring, opacitySpring, Body} = props;
|
var {transformSpring, Body} = props;
|
||||||
var {direction} = this.state;
|
var {direction} = this.state;
|
||||||
|
|
||||||
var transform = {
|
var transform = this.translate(transformSpring, direction);
|
||||||
WebkitTransform: `translate${direction}(${transformSpring}%)`,
|
|
||||||
transform: `translate${direction}(${transformSpring}%)`
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
var verticalOrigin = 'top';
|
var verticalOrigin = 'top';
|
||||||
@@ -242,11 +221,9 @@ export default class PanelTransition extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var style = {
|
var style = {
|
||||||
position: 'absolute',
|
...this.getDefaultTransitionStyles(props),
|
||||||
|
top: 'auto', // reset default
|
||||||
[verticalOrigin]: 0,
|
[verticalOrigin]: 0,
|
||||||
left: 0,
|
|
||||||
width: '100%',
|
|
||||||
opacity: opacitySpring,
|
|
||||||
...transform
|
...transform
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -258,15 +235,9 @@ export default class PanelTransition extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getFooter(key, props) {
|
getFooter(key, props) {
|
||||||
var {opacitySpring, Footer} = props;
|
var {Footer} = props;
|
||||||
|
|
||||||
var style = {
|
var style = this.getDefaultTransitionStyles(props);
|
||||||
position: 'absolute',
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
width: '100%',
|
|
||||||
opacity: opacitySpring
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div key={`footer${key}`} style={style}>
|
<div key={`footer${key}`} style={style}>
|
||||||
@@ -276,15 +247,9 @@ export default class PanelTransition extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getLinks(key, props) {
|
getLinks(key, props) {
|
||||||
var {opacitySpring, Links} = props;
|
var {Links} = props;
|
||||||
|
|
||||||
var style = {
|
var style = this.getDefaultTransitionStyles(props);
|
||||||
position: 'absolute',
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
width: '100%',
|
|
||||||
opacity: opacitySpring
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div key={`links${key}`} style={style}>
|
<div key={`links${key}`} style={style}>
|
||||||
@@ -292,5 +257,39 @@ export default class PanelTransition extends Component {
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Object} props
|
||||||
|
* @param {string} props.pointerEvents
|
||||||
|
* @param {number} props.opacitySpring
|
||||||
|
*
|
||||||
|
* @return {Object}
|
||||||
|
*/
|
||||||
|
getDefaultTransitionStyles(props) {
|
||||||
|
var {pointerEvents, opacitySpring} = props;
|
||||||
|
|
||||||
|
return {
|
||||||
|
position: 'absolute',
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
width: '100%',
|
||||||
|
opacity: opacitySpring,
|
||||||
|
pointerEvents
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {number} value
|
||||||
|
* @param {string} direction='X' - X|Y
|
||||||
|
* @param {string} unit='%' - %|px etc
|
||||||
|
*
|
||||||
|
* @return {Object}
|
||||||
|
*/
|
||||||
|
translate(value, direction = 'X', unit = '%') {
|
||||||
|
return {
|
||||||
|
WebkitTransform: `translate${direction}(${value}${unit})`,
|
||||||
|
transform: `translate${direction}(${value}${unit})`
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -36,7 +36,8 @@ export default function Permissions() {
|
|||||||
</PanelBodyHeader>
|
</PanelBodyHeader>
|
||||||
<div className={styles.permissionsContainer}>
|
<div className={styles.permissionsContainer}>
|
||||||
<div className={styles.permissionsTitle}>
|
<div className={styles.permissionsTitle}>
|
||||||
<Message {...messages.theAppNeedsAccess} />
|
<Message {...messages.theAppNeedsAccess1} /><br />
|
||||||
|
<Message {...messages.theAppNeedsAccess2} />
|
||||||
</div>
|
</div>
|
||||||
<ul className={styles.permissionsList}>
|
<ul className={styles.permissionsList}>
|
||||||
<li>Authorization for Minecraft servers</li>
|
<li>Authorization for Minecraft servers</li>
|
||||||
|
@@ -11,10 +11,14 @@ export default defineMessages({
|
|||||||
defaultMessage: 'You authorized as:'
|
defaultMessage: 'You authorized as:'
|
||||||
},
|
},
|
||||||
|
|
||||||
theAppNeedsAccess: {
|
theAppNeedsAccess1: {
|
||||||
id: 'theAppNeedsAccess',
|
id: 'theAppNeedsAccess1',
|
||||||
// Мне нельзя html? Получите неразрывный пробел! ˅˅˅˅˅˅˅˅˅˅˅
|
defaultMessage: 'This application needs access'
|
||||||
defaultMessage: 'This applications needs access to your data'
|
},
|
||||||
|
|
||||||
|
theAppNeedsAccess2: {
|
||||||
|
id: 'theAppNeedsAccess2',
|
||||||
|
defaultMessage: 'to your data'
|
||||||
},
|
},
|
||||||
|
|
||||||
decline: {
|
decline: {
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
.helpLinks {
|
.helpLinks {
|
||||||
margin: 8px 0;
|
margin: 8px 0;
|
||||||
|
position: relative;
|
||||||
|
height: 20px;
|
||||||
|
|
||||||
color: #444;
|
color: #444;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
@@ -11,6 +11,8 @@ $headerHeight: 60px;
|
|||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
height: $headerHeight;
|
height: $headerHeight;
|
||||||
border-bottom: 1px solid lighter($black);
|
border-bottom: 1px solid lighter($black);
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
font-family: $font-family-title;
|
font-family: $font-family-title;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@@ -37,6 +39,7 @@ $bodyLeftRightPadding: 20px;
|
|||||||
$bodyTopBottomPadding: 15px;
|
$bodyTopBottomPadding: 15px;
|
||||||
|
|
||||||
.body {
|
.body {
|
||||||
|
overflow: hidden;
|
||||||
padding: $bodyTopBottomPadding $bodyLeftRightPadding;
|
padding: $bodyTopBottomPadding $bodyLeftRightPadding;
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
@@ -60,13 +63,11 @@ $bodyTopBottomPadding: 15px;
|
|||||||
}
|
}
|
||||||
|
|
||||||
.footer {
|
.footer {
|
||||||
display: flex;
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
height: 50px;
|
||||||
|
|
||||||
> * {
|
button {
|
||||||
flex-grow: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
button { // TODO: добавленно временно, пока не устаканится лейаут панелек
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user