mirror of
https://github.com/trezor/trezor-wallet
synced 2025-01-25 23:41:07 +00:00
add overlay with calculated height based on leftmenu body height
This commit is contained in:
parent
58008eb6be
commit
5f883bfeb8
@ -6,7 +6,7 @@ import { FormattedMessage } from 'react-intl';
|
|||||||
|
|
||||||
import COLORS from 'config/colors';
|
import COLORS from 'config/colors';
|
||||||
import { FONT_SIZE, FONT_WEIGHT } from 'config/variables';
|
import { FONT_SIZE, FONT_WEIGHT } from 'config/variables';
|
||||||
import { SLIDE_DOWN } from 'config/animations';
|
import { SLIDE_DOWN, FADE_IN } from 'config/animations';
|
||||||
|
|
||||||
import Button from 'components/Button';
|
import Button from 'components/Button';
|
||||||
import * as deviceUtils from 'utils/device';
|
import * as deviceUtils from 'utils/device';
|
||||||
@ -14,10 +14,15 @@ import l10nCommonMessages from 'views/common.messages';
|
|||||||
import MenuItems from './components/MenuItems';
|
import MenuItems from './components/MenuItems';
|
||||||
import DeviceList from './components/DeviceList';
|
import DeviceList from './components/DeviceList';
|
||||||
|
|
||||||
import type { Props } from '../common';
|
import type { Props as BaseProps } from '../common';
|
||||||
|
|
||||||
import Divider from '../Divider';
|
import Divider from '../Divider';
|
||||||
|
|
||||||
|
type OwnProps = {
|
||||||
|
overlayHeight: number,
|
||||||
|
};
|
||||||
|
type Props = BaseProps & OwnProps;
|
||||||
|
|
||||||
const Wrapper = styled.div`
|
const Wrapper = styled.div`
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
@ -29,6 +34,14 @@ const Wrapper = styled.div`
|
|||||||
animation: ${SLIDE_DOWN} 0.25s cubic-bezier(0.17, 0.04, 0.03, 0.94) forwards;
|
animation: ${SLIDE_DOWN} 0.25s cubic-bezier(0.17, 0.04, 0.03, 0.94) forwards;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
const Overlay = styled.div`
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: ${props => `${props.height}px`};
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
animation: ${FADE_IN} 0.25s;
|
||||||
|
`;
|
||||||
|
|
||||||
const ButtonWrapper = styled.div`
|
const ButtonWrapper = styled.div`
|
||||||
margin: 10px 0;
|
margin: 10px 0;
|
||||||
padding: 0 10px;
|
padding: 0 10px;
|
||||||
@ -116,11 +129,12 @@ class DeviceMenu extends PureComponent<Props> {
|
|||||||
myRef: { current: ?HTMLDivElement };
|
myRef: { current: ?HTMLDivElement };
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { devices, onSelectDevice, forgetDevice } = this.props;
|
const { devices, onSelectDevice, forgetDevice, toggleDeviceDropdown } = this.props;
|
||||||
const { transport } = this.props.connect;
|
const { transport } = this.props.connect;
|
||||||
const { selectedDevice } = this.props.wallet;
|
const { selectedDevice, dropdownOpened } = this.props.wallet;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
<Wrapper ref={this.myRef}>
|
<Wrapper ref={this.myRef}>
|
||||||
{this.showMenuItems() && <MenuItems device={selectedDevice} {...this.props} />}
|
{this.showMenuItems() && <MenuItems device={selectedDevice} {...this.props} />}
|
||||||
{this.showDivider() && <StyledDivider hasBorder textLeft="Other devices" />}
|
{this.showDivider() && <StyledDivider hasBorder textLeft="Other devices" />}
|
||||||
@ -138,6 +152,13 @@ class DeviceMenu extends PureComponent<Props> {
|
|||||||
</ButtonWrapper>
|
</ButtonWrapper>
|
||||||
)}
|
)}
|
||||||
</Wrapper>
|
</Wrapper>
|
||||||
|
<Overlay
|
||||||
|
onClick={() => {
|
||||||
|
toggleDeviceDropdown(!dropdownOpened);
|
||||||
|
}}
|
||||||
|
height={this.props.overlayHeight}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import { SLIDE_RIGHT, SLIDE_LEFT } from 'config/animations';
|
|||||||
type Props = {
|
type Props = {
|
||||||
children?: React.Node,
|
children?: React.Node,
|
||||||
isOpen: ?boolean,
|
isOpen: ?boolean,
|
||||||
|
deviceMenuOpened: boolean,
|
||||||
};
|
};
|
||||||
|
|
||||||
type State = {
|
type State = {
|
||||||
@ -18,7 +19,7 @@ type State = {
|
|||||||
const AbsoluteWrapper = styled.aside`
|
const AbsoluteWrapper = styled.aside`
|
||||||
width: 320px;
|
width: 320px;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow-y: auto;
|
overflow-y: ${props => (props.deviceMenuOpened ? 'hidden' : 'auto')};
|
||||||
|
|
||||||
background: ${colors.MAIN};
|
background: ${colors.MAIN};
|
||||||
border-top-left-radius: 4px;
|
border-top-left-radius: 4px;
|
||||||
@ -28,7 +29,6 @@ const AbsoluteWrapper = styled.aside`
|
|||||||
|
|
||||||
@media screen and (max-width: ${SCREEN_SIZE.SM}) {
|
@media screen and (max-width: ${SCREEN_SIZE.SM}) {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
height: calc(100vh - 52px);
|
|
||||||
z-index: 200;
|
z-index: 200;
|
||||||
top: 52px;
|
top: 52px;
|
||||||
/* Prevents firing SLIDE_LEFT anim on page load. */
|
/* Prevents firing SLIDE_LEFT anim on page load. */
|
||||||
@ -47,12 +47,19 @@ const SidebarWrapper = styled.div`
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
||||||
|
@media screen and (max-width: ${SCREEN_SIZE.SM}) {
|
||||||
|
height: calc(100vh - 52px);
|
||||||
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export default class Sidebar extends React.PureComponent<Props, State> {
|
export default class Sidebar extends React.PureComponent<Props, State> {
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<AbsoluteWrapper isOpen={this.props.isOpen}>
|
<AbsoluteWrapper
|
||||||
|
isOpen={this.props.isOpen}
|
||||||
|
deviceMenuOpened={this.props.deviceMenuOpened}
|
||||||
|
>
|
||||||
<SidebarWrapper>{this.props.children}</SidebarWrapper>
|
<SidebarWrapper>{this.props.children}</SidebarWrapper>
|
||||||
</AbsoluteWrapper>
|
</AbsoluteWrapper>
|
||||||
);
|
);
|
||||||
|
@ -59,6 +59,7 @@ const TransitionContentWrapper = styled.div`
|
|||||||
const Footer = styled.div.attrs(props => ({
|
const Footer = styled.div.attrs(props => ({
|
||||||
style: { position: props.position },
|
style: { position: props.position },
|
||||||
}))`
|
}))`
|
||||||
|
flex: 0 0 auto;
|
||||||
width: 320px;
|
width: 320px;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
background: ${colors.MAIN};
|
background: ${colors.MAIN};
|
||||||
@ -162,18 +163,21 @@ type State = {
|
|||||||
animationType: ?string,
|
animationType: ?string,
|
||||||
clicked: boolean,
|
clicked: boolean,
|
||||||
bodyMinHeight: number,
|
bodyMinHeight: number,
|
||||||
|
bodyHeight: number,
|
||||||
};
|
};
|
||||||
|
|
||||||
class LeftNavigation extends React.PureComponent<Props, State> {
|
class LeftNavigation extends React.PureComponent<Props, State> {
|
||||||
constructor(props: Props) {
|
constructor(props: Props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.deviceMenuRef = React.createRef();
|
this.deviceMenuRef = React.createRef();
|
||||||
|
this.leftMenuBodyRef = React.createRef();
|
||||||
const { location } = this.props.router;
|
const { location } = this.props.router;
|
||||||
const hasNetwork = location && location.state && location.state.network;
|
const hasNetwork = location && location.state && location.state.network;
|
||||||
this.state = {
|
this.state = {
|
||||||
animationType: hasNetwork ? 'slide-left' : null,
|
animationType: hasNetwork ? 'slide-left' : null,
|
||||||
clicked: false,
|
clicked: false,
|
||||||
bodyMinHeight: 0,
|
bodyMinHeight: 0,
|
||||||
|
bodyHeight: 0,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,10 +234,17 @@ class LeftNavigation extends React.PureComponent<Props, State> {
|
|||||||
bodyMinHeight: this.deviceMenuRef.current.getMenuHeight(),
|
bodyMinHeight: this.deviceMenuRef.current.getMenuHeight(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (this.leftMenuBodyRef.current) {
|
||||||
|
this.setState({
|
||||||
|
bodyHeight: this.leftMenuBodyRef.current.getBoundingClientRect().height,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
deviceMenuRef: { current: any };
|
deviceMenuRef: { current: any };
|
||||||
|
|
||||||
|
leftMenuBodyRef: { current: any };
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { props } = this;
|
const { props } = this;
|
||||||
let menu;
|
let menu;
|
||||||
@ -269,7 +280,10 @@ class LeftNavigation extends React.PureComponent<Props, State> {
|
|||||||
onClick={props.toggleSidebar}
|
onClick={props.toggleSidebar}
|
||||||
animated
|
animated
|
||||||
/>
|
/>
|
||||||
<Sidebar isOpen={props.wallet.showSidebar}>
|
<Sidebar
|
||||||
|
isOpen={props.wallet.showSidebar}
|
||||||
|
deviceMenuOpened={this.props.wallet.dropdownOpened}
|
||||||
|
>
|
||||||
<Header
|
<Header
|
||||||
isSelected
|
isSelected
|
||||||
testId="Main__page__device__header"
|
testId="Main__page__device__header"
|
||||||
@ -362,8 +376,14 @@ class LeftNavigation extends React.PureComponent<Props, State> {
|
|||||||
}
|
}
|
||||||
{...this.props}
|
{...this.props}
|
||||||
/>
|
/>
|
||||||
<Body minHeight={this.state.bodyMinHeight}>
|
<Body ref={this.leftMenuBodyRef} minHeight={this.state.bodyMinHeight}>
|
||||||
{dropdownOpened && <DeviceMenu ref={this.deviceMenuRef} {...this.props} />}
|
{dropdownOpened && (
|
||||||
|
<DeviceMenu
|
||||||
|
ref={this.deviceMenuRef}
|
||||||
|
overlayHeight={this.state.bodyHeight}
|
||||||
|
{...this.props}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
{isDeviceAccessible && menu}
|
{isDeviceAccessible && menu}
|
||||||
</Body>
|
</Body>
|
||||||
<Footer data-test="Main__page__footer" key="sticky-footer">
|
<Footer data-test="Main__page__footer" key="sticky-footer">
|
||||||
|
Loading…
Reference in New Issue
Block a user