BodyWrapper.js 2.2 KB

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