William O'Beirne aa0f9cd455 Electron Redesign (#1505)
* Frameless Electron. Separate electron template. Generecize navigation link. Move nav info to config.

* Add controls for language and node, network status to sidebar.

* Sticky headers

* Move custom node modal into standalone component. Render modals via portal. Add custom node modal opening to electron node list.

* Conditional styling based on environment.

* Fix active node highlight

* Add frame back in, draggable only on OSX, fix sidebar scroll.

* Remove panel content after delay.

* Adjust window sizes

* Style desktop help nav icon

* Remove unused var

* Move style to param

* Remove unused

* Update snapshot

* Fix oversized stretching, zindex fighting

* Make electron work better with various screen sizes

* Remove not-working https option for electron

* Add beta banner

* Fix web footer

* Address changes
2018-04-16 18:30:58 -05:00

104 lines
2.9 KiB
TypeScript

import React from 'react';
import classnames from 'classnames';
import translate from 'translations';
import { navigationLinks } from 'config';
import NavigationLink from 'components/NavigationLink';
import LanguageSelect from './LanguageSelect';
import NodeSelect from './NodeSelect';
import NetworkStatus from './NetworkStatus';
import './ElectronNav.scss';
interface State {
panelContent: React.ReactElement<any> | null;
isPanelOpen: boolean;
}
export default class ElectronNav extends React.Component<{}, State> {
public state: State = {
panelContent: null,
isPanelOpen: false
};
public render() {
const { panelContent, isPanelOpen } = this.state;
return (
<div
className={classnames({
ElectronNav: true,
'is-panel-open': isPanelOpen
})}
>
<div className="ElectronNav-branding">
<div className="ElectronNav-branding-logo" />
<div className="ElectronNav-branding-beta">Beta Release</div>
</div>
<ul className="ElectronNav-links">
{navigationLinks.map(link => (
<NavigationLink
key={link.to}
link={link}
isHomepage={link === navigationLinks[0]}
className="ElectronNavLink"
/>
))}
</ul>
<div className="ElectronNav-controls">
<button className="ElectronNav-controls-btn" onClick={this.openLanguageSelect}>
Change Language
<i className="ElectronNav-controls-btn-icon fa fa-arrow-circle-right" />
</button>
<button className="ElectronNav-controls-btn" onClick={this.openNodeSelect}>
Change Network
<i className="ElectronNav-controls-btn-icon fa fa-arrow-circle-right" />
</button>
</div>
<div className="ElectronNav-status">
<NetworkStatus />
</div>
<div className="ElectronNav-panel">
<button className="ElectronNav-panel-back" onClick={this.closePanel}>
<i className="ElectronNav-panel-back-icon fa fa-arrow-circle-left" />
{translate('MODAL_BACK')}
</button>
<div className="ElectronNav-panel-content">{panelContent}</div>
</div>
</div>
);
}
private openLanguageSelect = () => {
const panelContent = <LanguageSelect closePanel={this.closePanel} />;
this.setState({
panelContent,
isPanelOpen: true
});
};
private openNodeSelect = () => {
const panelContent = <NodeSelect closePanel={this.closePanel} />;
this.setState({
panelContent,
isPanelOpen: true
});
};
private closePanel = () => {
const { panelContent } = this.state;
// Start closing panel
this.setState({ isPanelOpen: false });
// Remove content when out of sight
setTimeout(() => {
if (this.state.panelContent === panelContent) {
this.setState({ panelContent: null });
}
}, 300);
};
}