1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-10-18 20:09:08 +02:00
unleash.unleash/frontend/src/component/app.jsx

315 lines
12 KiB
React
Raw Normal View History

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import {
Layout,
Drawer,
Header,
Navigation,
Content,
Footer,
FooterSection,
FooterDropDownSection,
FooterLinkList,
Grid,
Cell,
Icon,
2016-12-04 11:56:41 +01:00
} from 'react-mdl';
2016-12-05 17:04:00 +01:00
import { Link } from 'react-router';
import styles from './styles.scss';
2016-11-10 14:26:24 +01:00
import ErrorContainer from './error/error-container';
import UserContainer from './user/user-container';
2016-11-25 15:37:06 +01:00
import ShowUserContainer from './user/show-user-container';
2016-12-29 11:55:25 +01:00
import { ScrollContainer } from 'react-router-scroll';
function replace(input, params) {
2016-12-05 17:04:00 +01:00
if (!params) {
return input;
}
Object.keys(params).forEach(key => {
input = input.replace(`:${key}`, params[key]);
});
return input;
}
2016-11-10 14:26:24 +01:00
export default class App extends Component {
static propTypes = {
location: PropTypes.object.isRequired,
params: PropTypes.object.isRequired,
routes: PropTypes.array.isRequired,
};
2016-11-10 14:26:24 +01:00
2016-12-04 11:56:41 +01:00
static contextTypes = {
router: PropTypes.object,
};
2016-11-10 14:26:24 +01:00
componentWillReceiveProps(nextProps) {
2016-12-05 17:10:32 +01:00
if (this.props.location.pathname !== nextProps.location.pathname) {
2016-12-11 19:30:56 +01:00
clearTimeout(this.timer);
this.timer = setTimeout(() => {
const layout = document.querySelector('.mdl-js-layout');
const drawer = document.querySelector('.mdl-layout__drawer');
// hack, might get a built in alternative later
if (drawer.classList.contains('is-visible')) {
layout.MaterialLayout.toggleDrawer();
}
}, 10);
2016-12-05 17:10:32 +01:00
}
}
getSections() {
2016-12-05 17:04:00 +01:00
const { routes, params } = this.props;
const unique = {};
const result = routes
.splice(1)
.map(routeEntry => ({
name: replace(routeEntry.pageTitle, params),
link: replace(routeEntry.link || routeEntry.path, params),
}))
.filter(entry => {
if (!unique[entry.link]) {
unique[entry.link] = true;
return true;
}
return false;
});
2016-12-05 17:04:00 +01:00
2016-12-05 17:15:55 +01:00
// mutate document.title:
document.title = result
.map(e => e.name)
2016-12-05 17:16:51 +01:00
.reverse()
.concat('Unleash')
.join(' ');
2016-12-05 17:15:55 +01:00
return result;
}
getTitleWithLinks() {
2016-12-05 17:15:55 +01:00
const result = this.getSections();
2016-12-05 17:04:00 +01:00
return (
<span>
{result.map((entry, index) => (
<span
key={entry.link + index}
className={
index > 0 ? 'mdl-layout--large-screen-only' : ''
}
>
{index > 0 ? ' ' : null}
<Link
className={[
styles.headerTitleLink,
'mdl-color-text--primary-contrast',
].join(' ')}
to={entry.link}
>
{entry.name}
</Link>
</span>
2016-12-05 17:04:00 +01:00
))}
</span>
);
}
render() {
const shouldUpdateScroll = (prevRouterProps, { location }) => {
if (
prevRouterProps &&
location.pathname !== prevRouterProps.location.pathname
) {
return location.action === 'POP';
} else {
return [0, 0];
}
};
const createListItem = (
path,
caption,
icon,
isDrawerNavigation = false
) => {
const linkColor =
isDrawerNavigation && this.context.router.isActive(path)
? 'mdl-color-text--black'
: 'mdl-color-text--grey-900';
const iconColor =
isDrawerNavigation && this.context.router.isActive(path)
? 'mdl-color-text--black'
: 'mdl-color-text--grey-600';
return (
<Link
to={path}
className={
isDrawerNavigation &&
[styles.navigationLink, linkColor].join(' ')
}
>
{icon && (
<Icon
name={icon}
className={
isDrawerNavigation &&
[styles.navigationIcon, iconColor].join(' ')
}
/>
)}
{caption}
</Link>
);
};
2016-12-04 11:56:41 +01:00
return (
2017-03-01 21:53:25 +01:00
<div className={styles.container}>
2016-12-04 11:56:41 +01:00
<UserContainer />
<Layout fixedHeader>
2016-12-05 17:04:00 +01:00
<Header title={this.getTitleWithLinks()}>
2016-12-04 11:56:41 +01:00
<Navigation>
<ShowUserContainer />
</Navigation>
</Header>
<Drawer className="mdl-color--white">
<span
className={[
styles.drawerTitle,
'mdl-layout-title',
].join(' ')}
>
<img
src="public/logo.png"
width="32"
height="32"
className={styles.drawerTitleLogo}
/>
<span className={styles.drawerTitleText}>
Unleash
</span>
</span>
<hr />
<Navigation className={styles.navigation}>
{createListItem(
'/features',
'Feature Toggles',
'list',
true
)}
{createListItem(
'/strategies',
'Strategies',
'extension',
true
)}
{createListItem(
'/history',
'Event History',
'history',
true
)}
{createListItem(
'/archive',
'Archived Toggles',
'archive',
true
)}
{createListItem(
'/applications',
'Applications',
'apps',
true
)}
</Navigation>
<hr />
<Navigation className={styles.navigation}>
<a
href="https://github.com/Unleash"
target="_blank"
className={[
styles.navigationLink,
'mdl-color-text--grey-900',
].join(' ')}
>
<i
className={[
'material-icons',
styles.navigationIcon,
styles.iconGitHub,
].join(' ')}
/>GitHub
</a>
2016-12-04 11:56:41 +01:00
</Navigation>
</Drawer>
<ScrollContainer
scrollKey="container"
shouldUpdateScroll={shouldUpdateScroll}
>
2017-06-29 08:36:10 +02:00
<Content className="mdl-color--grey-50">
<Grid noSpacing className={styles.content}>
<Cell col={12}>
{this.props.children}
<ErrorContainer />
</Cell>
</Grid>
<Footer size="mega">
<FooterSection type="middle">
<FooterDropDownSection title="Menu">
<FooterLinkList>
{createListItem(
'/features',
'Feature Toggles'
)}
{createListItem(
'/strategies',
'Strategies'
)}
{createListItem(
'/history',
'Event History'
)}
{createListItem(
'/archive',
'Archived Toggles'
)}
{createListItem(
'/applications',
'Applications'
)}
2017-06-29 08:36:10 +02:00
</FooterLinkList>
</FooterDropDownSection>
<FooterDropDownSection title="Clients">
<FooterLinkList>
<a href="https://github.com/Unleash/unleash-client-node/">
Node.js
</a>
<a href="https://github.com/Unleash/unleash-client-java/">
Java
</a>
<a href="https://github.com/Unleash/unleash-client-go/">
Go
</a>
2017-06-29 08:36:10 +02:00
</FooterLinkList>
</FooterDropDownSection>
</FooterSection>
<FooterSection type="bottom" logo="Unleash">
2016-12-04 11:56:41 +01:00
<FooterLinkList>
<a
href="https://github.com/Unleash/unleash/"
target="_blank"
>
2016-12-04 11:56:41 +01:00
GitHub
2017-06-29 08:36:10 +02:00
</a>
<a
href="https://finn.no"
target="_blank"
>
<small>A product by</small> FINN.no
</a>
2017-06-29 08:36:10 +02:00
</FooterLinkList>
</FooterSection>
</Footer>
</Content>
2016-12-29 11:55:25 +01:00
</ScrollContainer>
2016-12-04 11:56:41 +01:00
</Layout>
</div>
);
2016-11-10 14:26:24 +01:00
}
}