Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.34 KB | None | 0 0
  1. // @flow
  2. import React from 'react';
  3. // import PropTypes from 'prop-types'
  4. import { ApolloProvider, getDataFromTree } from 'react-apollo';
  5. import initApollo from 'lib/initApollo';
  6. import initRedux from 'lib/initRedux';
  7. import { CookiesProvider } from 'react-cookie';
  8.  
  9. import getMuiTheme from 'material-ui/styles/getMuiTheme';
  10. import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
  11. import { green100, green500, green700 } from 'material-ui/styles/colors';
  12.  
  13. const palette = {
  14. primary1Color: green500,
  15. primary2Color: green700,
  16. primary3Color: green100,
  17. };
  18.  
  19. export default ComposedComponent =>
  20. class WithData extends React.Component {
  21. static displayName = `WithData(${ComposedComponent.displayName})`;
  22. // static propTypes = {
  23. // serverState: PropTypes.object.isRequired
  24. // }
  25. // props = {
  26. // serverState: any,
  27. // };
  28.  
  29. static async getInitialProps(ctx) {
  30. let serverState = {};
  31. // console.log(ctx.req.universalCookies);
  32.  
  33. // Evaluate the composed component's getInitialProps()
  34. let composedInitialProps = {};
  35. if (ComposedComponent.getInitialProps) {
  36. composedInitialProps = await ComposedComponent.getInitialProps(ctx);
  37. }
  38.  
  39. const muiTheme = getMuiTheme(
  40. {
  41. palette,
  42. },
  43. {
  44. userAgent: ctx.req.headers['user-agent'],
  45. }
  46. );
  47.  
  48. // Run all graphql queries in the component tree
  49. // and extract the resulting data
  50. if (!process.browser) {
  51. const apollo = initApollo(ctx.req.universalCookies);
  52. const redux = initRedux(apollo);
  53. // Provide the `url` prop data in case a graphql query uses it
  54. const url = { query: ctx.query, pathname: ctx.pathname };
  55.  
  56. // Run all graphql queries
  57. const app = (
  58. // No need to use the Redux Provider
  59. // because Apollo sets up the store for us
  60. <CookiesProvider cookies={ctx.req.universalCookies}>
  61. <ApolloProvider client={apollo} store={redux}>
  62. <MuiThemeProvider muiTheme={muiTheme}>
  63. <ComposedComponent url={url} {...composedInitialProps} />
  64. </MuiThemeProvider>
  65. </ApolloProvider>
  66. </CookiesProvider>
  67. );
  68. await getDataFromTree(app);
  69.  
  70. // Extract query data from the store
  71. const state = redux.getState();
  72.  
  73. // No need to include other initial Redux state because when it
  74. // initialises on the client-side it'll create it again anyway
  75. serverState = {
  76. apollo: {
  77. // Make sure to only include Apollo's data state
  78. data: state.apollo.data,
  79. },
  80. };
  81. }
  82.  
  83. return {
  84. serverState,
  85. ...composedInitialProps,
  86. };
  87. }
  88.  
  89. constructor(props) {
  90. super(props);
  91. this.apollo = initApollo();
  92. this.redux = initRedux(this.apollo, this.props.serverState);
  93. this.muiTheme = getMuiTheme({
  94. palette,
  95. });
  96. }
  97.  
  98. render() {
  99. return (
  100. // No need to use the Redux Provider
  101. // because Apollo sets up the store for us
  102. <CookiesProvider>
  103. <ApolloProvider client={this.apollo} store={this.redux}>
  104. <MuiThemeProvider muiTheme={this.muiTheme}>
  105. <ComposedComponent {...this.props} />
  106. </MuiThemeProvider>
  107. </ApolloProvider>
  108. </CookiesProvider>
  109. );
  110. }
  111. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement