BodyWrapper.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { bindActionCreators } from 'redux';
  4. import { connect } from 'react-redux';
  5. import styled from 'styled-components';
  6. import cookie from 'js-cookie';
  7. import Header from '../Header';
  8. import PageLoading from '../PageLoading';
  9. import { renewAuthUser, hidePageLoading } from '../../actions';
  10. import { initGA, logPageView } from '../../helpers/analytics';
  11. const Wrapper = styled.div`
  12. position: relative;
  13. min-height: 100vh;
  14. display: flex;
  15. flex-direction: column;
  16. align-items: center;
  17. box-sizing: border-box;
  18. * {
  19. box-sizing: border-box;
  20. }
  21. *::-moz-focus-inner {
  22. border: none;
  23. }
  24. @media only screen and (max-width: 448px) {
  25. font-size: 14px;
  26. }
  27. `;
  28. const ContentWrapper = styled.div`
  29. min-height: 100vh;
  30. width: 100%;
  31. flex: 0 0 auto;
  32. display: flex;
  33. align-items: center;
  34. flex-direction: column;
  35. box-sizing: border-box;
  36. `;
  37. class BodyWrapper extends React.Component {
  38. componentDidMount() {
  39. if (process.env.GOOGLE_ANALYTICS_ID) {
  40. if (!window.GA_INITIALIZED) {
  41. initGA();
  42. window.GA_INITIALIZED = true;
  43. }
  44. logPageView();
  45. }
  46. const token = cookie.get('token');
  47. this.props.hidePageLoading();
  48. if (!token || this.props.norenew) return null;
  49. return this.props.renewAuthUser(token);
  50. }
  51. render() {
  52. const { children, pageLoading } = this.props;
  53. const content = pageLoading ? <PageLoading /> : children;
  54. return (
  55. <Wrapper>
  56. <ContentWrapper>
  57. <Header />
  58. {content}
  59. </ContentWrapper>
  60. </Wrapper>
  61. );
  62. }
  63. }
  64. BodyWrapper.propTypes = {
  65. children: PropTypes.node.isRequired,
  66. hidePageLoading: PropTypes.func.isRequired,
  67. norenew: PropTypes.bool,
  68. pageLoading: PropTypes.bool.isRequired,
  69. renewAuthUser: PropTypes.func.isRequired,
  70. };
  71. BodyWrapper.defaultProps = {
  72. norenew: false,
  73. };
  74. const mapStateToProps = ({ loading: { page: pageLoading } }) => ({ pageLoading });
  75. const mapDispatchToProps = dispatch => ({
  76. hidePageLoading: bindActionCreators(hidePageLoading, dispatch),
  77. renewAuthUser: bindActionCreators(renewAuthUser, dispatch),
  78. });
  79. export default connect(
  80. mapStateToProps,
  81. mapDispatchToProps
  82. )(BodyWrapper);