import React from "react"; import PropTypes from "prop-types"; import { Motion, spring } from "react-motion"; import { Switch, Route, Link, withRouter } from "react-router-dom"; import WindowSize from "./WindowSize"; import About from "./About"; import Stats from "./Stats"; import Home from "./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("/_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 (