require('./Layout.css'); const React = require('react'); const PropTypes = require('prop-types'); const { Switch, Route, Link, withRouter } = require('react-router-dom'); const { Motion, spring } = require('react-motion'); const WindowSize = require('./WindowSize'); const About = require('./About'); const Stats = require('./Stats'); const Home = require('./Home'); class Layout extends React.Component { static propTypes = { location: PropTypes.object, children: PropTypes.node }; state = { underlineLeft: 0, underlineWidth: 0, useSpring: false, stats: null }; adjustUnderline = (useSpring = false) => { let itemIndex; switch (this.props.location.pathname) { case '/stats': itemIndex = 1; break; case '/about': itemIndex = 2; break; case '/': default: itemIndex = 0; } const itemNodes = this.listNode.querySelectorAll('li'); const currentNode = itemNodes[itemIndex]; this.setState({ underlineLeft: currentNode.offsetLeft, underlineWidth: currentNode.offsetWidth, useSpring }); }; componentDidMount() { this.adjustUnderline(); fetch('/api/stats?period=last-month') .then(res => res.json()) .then(stats => this.setState({ stats })); if (window.localStorage) { const savedStats = window.localStorage.savedStats; if (savedStats) this.setState({ stats: JSON.parse(savedStats) }); window.onbeforeunload = () => { localStorage.savedStats = JSON.stringify(this.state.stats); }; } } componentDidUpdate(prevProps) { if (prevProps.location.pathname !== this.props.location.pathname) this.adjustUnderline(true); } render() { const { underlineLeft, underlineWidth, useSpring } = this.state; const style = { left: useSpring ? spring(underlineLeft, { stiffness: 220 }) : underlineLeft, width: useSpring ? spring(underlineWidth) : underlineWidth }; return (

unpkg

} />
); } } module.exports = withRouter(Layout);