add overlay with calculated height based on leftmenu body height

pull/467/head
slowbackspace 5 years ago
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,28 +129,36 @@ 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}> <>
{this.showMenuItems() && <MenuItems device={selectedDevice} {...this.props} />} <Wrapper ref={this.myRef}>
{this.showDivider() && <StyledDivider hasBorder textLeft="Other devices" />} {this.showMenuItems() && <MenuItems device={selectedDevice} {...this.props} />}
<DeviceList {this.showDivider() && <StyledDivider hasBorder textLeft="Other devices" />}
devices={devices} <DeviceList
selectedDevice={selectedDevice} devices={devices}
onSelectDevice={onSelectDevice} selectedDevice={selectedDevice}
forgetDevice={forgetDevice} onSelectDevice={onSelectDevice}
forgetDevice={forgetDevice}
/>
{deviceUtils.isWebUSB(transport) && (
<ButtonWrapper>
<StyledButton isWebUsb>
<FormattedMessage {...l10nCommonMessages.TR_CHECK_FOR_DEVICES} />
</StyledButton>
</ButtonWrapper>
)}
</Wrapper>
<Overlay
onClick={() => {
toggleDeviceDropdown(!dropdownOpened);
}}
height={this.props.overlayHeight}
/> />
{deviceUtils.isWebUSB(transport) && ( </>
<ButtonWrapper>
<StyledButton isWebUsb>
<FormattedMessage {...l10nCommonMessages.TR_CHECK_FOR_DEVICES} />
</StyledButton>
</ButtonWrapper>
)}
</Wrapper>
); );
} }
} }

@ -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…
Cancel
Save