├── diagrams ├── 01 │ ├── .gitkeep │ └── diagrams.xml ├── 02 │ ├── .gitkeep │ └── diagrams.xml ├── 03 │ ├── .gitkeep │ └── diagrams.xml ├── 04 │ ├── .gitkeep │ └── diagrams.xml ├── 05 │ ├── .gitkeep │ └── diagrams.xml ├── 06 │ ├── .gitkeep │ └── diagrams.xml ├── 07 │ ├── .gitkeep │ └── diagrams.xml └── README.md ├── api ├── .gitignore ├── middlewares │ └── requireLogin.js ├── models │ └── User.js ├── config │ ├── prod.js │ └── keys.js ├── package.json ├── routes │ ├── authRoutes.js │ └── userRoutes.js ├── services │ └── passport.js └── index.js ├── server ├── .gitignore ├── src │ ├── client │ │ ├── pages │ │ │ ├── NotFoundPage.js │ │ │ ├── HomePage.js │ │ │ ├── AdminsListPage.js │ │ │ └── UsersListPage.js │ │ ├── reducers │ │ │ ├── usersReducer.js │ │ │ ├── adminsReducer.js │ │ │ ├── authReducer.js │ │ │ └── index.js │ │ ├── App.js │ │ ├── Routes.js │ │ ├── components │ │ │ ├── hocs │ │ │ │ └── requireAuth.js │ │ │ └── Header.js │ │ ├── actions │ │ │ └── index.js │ │ └── client.js │ ├── helpers │ │ ├── createStore.js │ │ └── renderer.js │ └── index.js ├── webpack.base.js ├── webpack.client.js ├── webpack.server.js ├── package.json └── build │ └── bundle.js ├── .gitignore └── README.md /diagrams/01/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /diagrams/02/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /diagrams/03/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /diagrams/04/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /diagrams/05/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /diagrams/06/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /diagrams/07/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /api/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | -------------------------------------------------------------------------------- /server/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | build 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | bundle.js 4 | dev.js 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ReactSSRCasts 2 | 3 | Companion repo for a course hosted on Udemy.com 4 | -------------------------------------------------------------------------------- /api/middlewares/requireLogin.js: -------------------------------------------------------------------------------- 1 | module.exports = (req, res, next) => { 2 | if (!req.user) { 3 | return res.status(401).send({ error: 'You must log in!' }); 4 | } 5 | 6 | next(); 7 | }; 8 | -------------------------------------------------------------------------------- /api/models/User.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const { Schema } = mongoose; 3 | 4 | const userSchema = new Schema({ 5 | googleId: String 6 | }); 7 | 8 | mongoose.model('users', userSchema); 9 | -------------------------------------------------------------------------------- /api/config/prod.js: -------------------------------------------------------------------------------- 1 | // prod.js - production keys here!! 2 | module.exports = { 3 | googleClientID: process.env.GOOGLE_CLIENT_ID, 4 | googleClientSecret: process.env.GOOGLE_CLIENT_SECRET, 5 | mongoURI: process.env.MONGO_URI, 6 | cookieKey: process.env.COOKIE_KEY 7 | }; 8 | -------------------------------------------------------------------------------- /server/src/client/pages/NotFoundPage.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const NotFoundPage = ({ staticContext = {} }) => { 4 | staticContext.notFound = true; 5 | return

Ooops, route not found.

; 6 | }; 7 | 8 | export default { 9 | component: NotFoundPage 10 | }; 11 | -------------------------------------------------------------------------------- /server/src/client/reducers/usersReducer.js: -------------------------------------------------------------------------------- 1 | import { FETCH_USERS } from '../actions'; 2 | 3 | export default (state = [], action) => { 4 | switch (action.type) { 5 | case FETCH_USERS: 6 | return action.payload.data; 7 | default: 8 | return state; 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /server/src/client/reducers/adminsReducer.js: -------------------------------------------------------------------------------- 1 | import { FETCH_ADMINS } from '../actions'; 2 | 3 | export default (state = [], action) => { 4 | switch (action.type) { 5 | case FETCH_ADMINS: 6 | return action.payload.data; 7 | default: 8 | return state; 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /server/src/client/reducers/authReducer.js: -------------------------------------------------------------------------------- 1 | import { FETCH_CURRENT_USER } from '../actions'; 2 | 3 | export default function(state = null, action) { 4 | switch (action.type) { 5 | case FETCH_CURRENT_USER: 6 | return action.payload.data || false; 7 | default: 8 | return state; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /api/config/keys.js: -------------------------------------------------------------------------------- 1 | // keys.js - figure out what set of credentials to return 2 | if (process.env.NODE_ENV === 'production') { 3 | // we are in production - return the prod set of keys 4 | module.exports = require('./prod'); 5 | } else { 6 | // we are in development - return the dev keys!!! 7 | module.exports = require('./dev'); 8 | } 9 | -------------------------------------------------------------------------------- /server/src/client/pages/HomePage.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Home = () => { 4 | return ( 5 |
6 |

Welcome

7 |

Check out these awesome features

8 |
9 | ); 10 | }; 11 | 12 | export default { 13 | component: Home 14 | }; 15 | -------------------------------------------------------------------------------- /server/src/client/reducers/index.js: -------------------------------------------------------------------------------- 1 | import { combineReducers } from 'redux'; 2 | import usersReducer from './usersReducer'; 3 | import authReducer from './authReducer'; 4 | import adminsReducer from './adminsReducer'; 5 | 6 | export default combineReducers({ 7 | users: usersReducer, 8 | auth: authReducer, 9 | admins: adminsReducer 10 | }); 11 | -------------------------------------------------------------------------------- /server/src/client/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { renderRoutes } from 'react-router-config'; 3 | import Header from './components/Header'; 4 | import { fetchCurrentUser } from './actions'; 5 | 6 | const App = ({ route }) => { 7 | return ( 8 |
9 |
10 | {renderRoutes(route.routes)} 11 |
12 | ); 13 | }; 14 | 15 | export default { 16 | component: App, 17 | loadData: ({ dispatch }) => dispatch(fetchCurrentUser()) 18 | }; 19 | -------------------------------------------------------------------------------- /server/webpack.base.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | // Tell webpack to run babel on every file it runs through 3 | module: { 4 | rules: [ 5 | { 6 | test: /\.js?$/, 7 | loader: 'babel-loader', 8 | exclude: /node_modules/, 9 | options: { 10 | presets: [ 11 | 'react', 12 | 'stage-0', 13 | ['env', { targets: { browsers: ['last 2 versions'] } }] 14 | ] 15 | } 16 | } 17 | ] 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /server/webpack.client.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const merge = require('webpack-merge'); 3 | const baseConfig = require('./webpack.base.js'); 4 | 5 | const config = { 6 | // Tell webpack the root file of our 7 | // server application 8 | entry: './src/client/client.js', 9 | 10 | // Tell webpack where to put the output file 11 | // that is generated 12 | output: { 13 | filename: 'bundle.js', 14 | path: path.resolve(__dirname, 'public') 15 | } 16 | }; 17 | 18 | module.exports = merge(baseConfig, config); 19 | -------------------------------------------------------------------------------- /diagrams/README.md: -------------------------------------------------------------------------------- 1 | All diagrams are authored using https://www.draw.io/ 2 | 3 | ## You can edit diagrams on your own! 4 | - Go to https://github.com/StephenGrider/ReactSSRCasts/new/master/diagrams 5 | - Open the folder containing the set of diagrams you want to edit 6 | - Click on the ‘.xml’ file 7 | - Click the ‘raw’ button 8 | - Copy the URL 9 | - Go to https://www.draw.io/ 10 | - On the ‘Save Diagrams To…’ window click ‘Decide later’ at the bottom 11 | - Click ‘File’ -> ‘Import From’ -> ‘URL’ 12 | - Paste the link to the XML file 13 | - Tada! 14 | -------------------------------------------------------------------------------- /server/src/helpers/createStore.js: -------------------------------------------------------------------------------- 1 | import { createStore, applyMiddleware } from 'redux'; 2 | import thunk from 'redux-thunk'; 3 | import axios from 'axios'; 4 | import reducers from '../client/reducers'; 5 | 6 | export default req => { 7 | const axiosInstance = axios.create({ 8 | baseURL: 'http://react-ssr-api.herokuapp.com', 9 | headers: { cookie: req.get('cookie') || '' } 10 | }); 11 | 12 | const store = createStore( 13 | reducers, 14 | {}, 15 | applyMiddleware(thunk.withExtraArgument(axiosInstance)) 16 | ); 17 | 18 | return store; 19 | }; 20 | -------------------------------------------------------------------------------- /server/src/client/Routes.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import App from './App'; 3 | import HomePage from './pages/HomePage'; 4 | import UsersListPage from './pages/UsersListPage'; 5 | import NotFoundPage from './pages/NotFoundPage'; 6 | import AdminsListPage from './pages/AdminsListPage'; 7 | 8 | export default [ 9 | { 10 | ...App, 11 | routes: [ 12 | { 13 | ...HomePage, 14 | path: '/', 15 | exact: true 16 | }, 17 | { 18 | ...AdminsListPage, 19 | path: '/admins' 20 | }, 21 | { 22 | ...UsersListPage, 23 | path: '/users' 24 | }, 25 | { 26 | ...NotFoundPage 27 | } 28 | ] 29 | } 30 | ]; 31 | -------------------------------------------------------------------------------- /api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "engines": { 7 | "node": "8.1.1", 8 | "npm": "5.0.3" 9 | }, 10 | "scripts": { 11 | "start": "forever index.js", 12 | "server": "nodemon index.js", 13 | "dev": "npm run server" 14 | }, 15 | "author": "", 16 | "license": "ISC", 17 | "dependencies": { 18 | "body-parser": "^1.17.2", 19 | "cookie-session": "^2.0.0-beta.2", 20 | "cors": "^2.8.4", 21 | "express": "^4.15.3", 22 | "forever": "^0.15.3", 23 | "mongoose": "^4.11.1", 24 | "nodemon": "^1.11.0", 25 | "passport": "^0.3.2", 26 | "passport-google-oauth20": "^1.0.0" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /server/src/client/components/hocs/requireAuth.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { connect } from 'react-redux'; 3 | import { Redirect } from 'react-router-dom'; 4 | 5 | export default ChildComponent => { 6 | class RequireAuth extends Component { 7 | render() { 8 | switch (this.props.auth) { 9 | case false: 10 | return ; 11 | case null: 12 | return
Loading...
; 13 | default: 14 | return ; 15 | } 16 | } 17 | } 18 | 19 | function mapStateToProps({ auth }) { 20 | return { auth }; 21 | } 22 | 23 | return connect(mapStateToProps)(RequireAuth); 24 | }; 25 | -------------------------------------------------------------------------------- /server/webpack.server.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const merge = require('webpack-merge'); 3 | const baseConfig = require('./webpack.base.js'); 4 | const webpackNodeExternals = require('webpack-node-externals'); 5 | 6 | const config = { 7 | // Inform webpack that we're building a bundle 8 | // for nodeJS, rather than for the browser 9 | target: 'node', 10 | 11 | // Tell webpack the root file of our 12 | // server application 13 | entry: './src/index.js', 14 | 15 | // Tell webpack where to put the output file 16 | // that is generated 17 | output: { 18 | filename: 'bundle.js', 19 | path: path.resolve(__dirname, 'build') 20 | }, 21 | 22 | externals: [webpackNodeExternals()] 23 | }; 24 | 25 | module.exports = merge(baseConfig, config); 26 | -------------------------------------------------------------------------------- /api/routes/authRoutes.js: -------------------------------------------------------------------------------- 1 | const passport = require('passport'); 2 | 3 | module.exports = app => { 4 | app.get( 5 | '/auth/google', 6 | passport.authenticate('google', { 7 | scope: ['profile', 'email'] 8 | }) 9 | ); 10 | 11 | app.get( 12 | '/auth/google/callback', 13 | passport.authenticate('google'), 14 | (req, res) => { 15 | res.redirect('/'); 16 | } 17 | ); 18 | 19 | app.get( 20 | '/api/auth/google/callback', 21 | passport.authenticate('google'), 22 | (req, res) => { 23 | res.redirect('/'); 24 | } 25 | ); 26 | 27 | app.get('/logout', (req, res) => { 28 | req.logout(); 29 | res.redirect('/'); 30 | }); 31 | 32 | app.get('/current_user', (req, res) => { 33 | res.send(req.user); 34 | }); 35 | }; 36 | -------------------------------------------------------------------------------- /server/src/client/actions/index.js: -------------------------------------------------------------------------------- 1 | export const FETCH_USERS = 'fetch_users'; 2 | export const fetchUsers = () => async (dispatch, getState, api) => { 3 | const res = await api.get('/users'); 4 | 5 | dispatch({ 6 | type: FETCH_USERS, 7 | payload: res 8 | }); 9 | }; 10 | 11 | export const FETCH_CURRENT_USER = 'fetch_current_user'; 12 | export const fetchCurrentUser = () => async (dispatch, getState, api) => { 13 | const res = await api.get('/current_user'); 14 | 15 | dispatch({ 16 | type: FETCH_CURRENT_USER, 17 | payload: res 18 | }); 19 | }; 20 | 21 | export const FETCH_ADMINS = 'fetch_admins'; 22 | export const fetchAdmins = () => async (dispatch, getState, api) => { 23 | const res = await api.get('/admins'); 24 | 25 | dispatch({ 26 | type: FETCH_ADMINS, 27 | payload: res 28 | }); 29 | }; 30 | -------------------------------------------------------------------------------- /server/src/client/components/Header.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | import { connect } from 'react-redux'; 4 | 5 | const Header = ({ auth }) => { 6 | const authButton = auth ? ( 7 | Logout 8 | ) : ( 9 | Login 10 | ); 11 | 12 | return ( 13 | 29 | ); 30 | }; 31 | 32 | function mapStateToProps({ auth }) { 33 | return { auth }; 34 | } 35 | 36 | export default connect(mapStateToProps)(Header); 37 | -------------------------------------------------------------------------------- /server/src/client/client.js: -------------------------------------------------------------------------------- 1 | // Startup point for the client side application 2 | import 'babel-polyfill'; 3 | import React from 'react'; 4 | import ReactDOM from 'react-dom'; 5 | import { BrowserRouter } from 'react-router-dom'; 6 | import { createStore, applyMiddleware } from 'redux'; 7 | import thunk from 'redux-thunk'; 8 | import { Provider } from 'react-redux'; 9 | import { renderRoutes } from 'react-router-config'; 10 | import axios from 'axios'; 11 | import Routes from './Routes'; 12 | import reducers from './reducers'; 13 | 14 | const axiosInstance = axios.create({ 15 | baseURL: '/api' 16 | }); 17 | 18 | const store = createStore( 19 | reducers, 20 | window.INITIAL_STATE, 21 | applyMiddleware(thunk.withExtraArgument(axiosInstance)) 22 | ); 23 | 24 | ReactDOM.hydrate( 25 | 26 | 27 |
{renderRoutes(Routes)}
28 |
29 |
, 30 | document.querySelector('#root') 31 | ); 32 | -------------------------------------------------------------------------------- /server/src/client/pages/AdminsListPage.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { connect } from 'react-redux'; 3 | import { fetchAdmins } from '../actions'; 4 | import requireAuth from '../components/hocs/requireAuth'; 5 | 6 | class AdminsListPage extends Component { 7 | componentDidMount() { 8 | this.props.fetchAdmins(); 9 | } 10 | 11 | renderAdmins() { 12 | return this.props.admins.map(admin => { 13 | return
  • {admin.name}
  • ; 14 | }); 15 | } 16 | 17 | render() { 18 | return ( 19 |
    20 |

    Protected list of admins

    21 |
      {this.renderAdmins()}
    22 |
    23 | ); 24 | } 25 | } 26 | 27 | function mapStateToProps({ admins }) { 28 | return { admins }; 29 | } 30 | 31 | export default { 32 | component: connect(mapStateToProps, { fetchAdmins })( 33 | requireAuth(AdminsListPage) 34 | ), 35 | loadData: ({ dispatch }) => dispatch(fetchAdmins()) 36 | }; 37 | -------------------------------------------------------------------------------- /api/services/passport.js: -------------------------------------------------------------------------------- 1 | const passport = require('passport'); 2 | const GoogleStrategy = require('passport-google-oauth20').Strategy; 3 | const mongoose = require('mongoose'); 4 | const keys = require('../config/keys'); 5 | 6 | const User = mongoose.model('users'); 7 | 8 | passport.serializeUser((user, done) => { 9 | done(null, user.id); 10 | }); 11 | 12 | passport.deserializeUser((id, done) => { 13 | User.findById(id).then(user => { 14 | done(null, user); 15 | }); 16 | }); 17 | 18 | passport.use( 19 | new GoogleStrategy( 20 | { 21 | clientID: keys.googleClientID, 22 | clientSecret: keys.googleClientSecret, 23 | callbackURL: '/api/auth/google/callback', 24 | proxy: true 25 | }, 26 | async (accessToken, refreshToken, profile, done) => { 27 | const existingUser = await User.findOne({ googleId: profile.id }); 28 | 29 | if (existingUser) { 30 | return done(null, existingUser); 31 | } 32 | 33 | const user = await new User({ googleId: profile.id }).save(); 34 | done(null, user); 35 | } 36 | ) 37 | ); 38 | -------------------------------------------------------------------------------- /api/routes/userRoutes.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const requireLogin = require('../middlewares/requireLogin'); 3 | 4 | module.exports = app => { 5 | app.get('/users', (req, res) => { 6 | res.send(users); 7 | }); 8 | 9 | app.get('/users/xss', (req, res) => { 10 | res.send(usersXss); 11 | }); 12 | 13 | app.get('/admins', requireLogin, (req, res) => { 14 | res.send(admins); 15 | }); 16 | }; 17 | 18 | const users = [ 19 | { id: 1, name: 'Leanne Graham' }, 20 | { id: 2, name: 'Ervin Howell' }, 21 | { id: 3, name: 'Clementine Bauch' }, 22 | { id: 4, name: 'Patricia Lebsack' }, 23 | { id: 5, name: 'Chelsey Dietrich' } 24 | ]; 25 | 26 | const usersXss = [ 27 | { id: 1, name: '' }, 28 | { id: 2, name: 'Ervin Howell' }, 29 | { id: 3, name: 'Clementine Bauch' }, 30 | { id: 4, name: 'Patricia Lebsack' }, 31 | { id: 5, name: 'Chelsey Dietrich' } 32 | ]; 33 | 34 | const admins = [ 35 | { id: 1, name: 'Kurtis Weissnat' }, 36 | { id: 2, name: 'Nicholas Runolfsdottir' }, 37 | { id: 3, name: 'Gelann Reichert' }, 38 | { id: 4, name: 'Moriah Stanton' }, 39 | { id: 5, name: 'Rey Padberg' } 40 | ]; 41 | -------------------------------------------------------------------------------- /server/src/client/pages/UsersListPage.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { connect } from 'react-redux'; 3 | import { fetchUsers } from '../actions'; 4 | import { Helmet } from 'react-helmet'; 5 | 6 | class UsersList extends Component { 7 | componentDidMount() { 8 | this.props.fetchUsers(); 9 | } 10 | 11 | renderUsers() { 12 | return this.props.users.map(user => { 13 | return
  • {user.name}
  • ; 14 | }); 15 | } 16 | 17 | head() { 18 | return ( 19 | 20 | {`${this.props.users.length} Users Loaded`} 21 | 22 | 23 | ); 24 | } 25 | 26 | render() { 27 | return ( 28 |
    29 | {this.head()} 30 | Here's a big list of users: 31 |
      {this.renderUsers()}
    32 |
    33 | ); 34 | } 35 | } 36 | 37 | function mapStateToProps(state) { 38 | return { users: state.users }; 39 | } 40 | 41 | function loadData(store) { 42 | return store.dispatch(fetchUsers()); 43 | } 44 | 45 | export default { 46 | loadData, 47 | component: connect(mapStateToProps, { fetchUsers })(UsersList) 48 | }; 49 | -------------------------------------------------------------------------------- /server/src/helpers/renderer.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { renderToString } from 'react-dom/server'; 3 | import { StaticRouter } from 'react-router-dom'; 4 | import { Provider } from 'react-redux'; 5 | import { renderRoutes } from 'react-router-config'; 6 | import serialize from 'serialize-javascript'; 7 | import { Helmet } from 'react-helmet'; 8 | import Routes from '../client/Routes'; 9 | 10 | export default (req, store, context) => { 11 | const content = renderToString( 12 | 13 | 14 |
    {renderRoutes(Routes)}
    15 |
    16 |
    17 | ); 18 | 19 | const helmet = Helmet.renderStatic(); 20 | 21 | return ` 22 | 23 | 24 | ${helmet.title.toString()} 25 | ${helmet.meta.toString()} 26 | 27 | 28 | 29 |
    ${content}
    30 | 33 | 34 | 35 | 36 | `; 37 | }; 38 | -------------------------------------------------------------------------------- /server/src/index.js: -------------------------------------------------------------------------------- 1 | import 'babel-polyfill'; 2 | import express from 'express'; 3 | import { matchRoutes } from 'react-router-config'; 4 | import proxy from 'express-http-proxy'; 5 | import Routes from './client/Routes'; 6 | import renderer from './helpers/renderer'; 7 | import createStore from './helpers/createStore'; 8 | 9 | const app = express(); 10 | 11 | app.use( 12 | '/api', 13 | proxy('http://react-ssr-api.herokuapp.com', { 14 | proxyReqOptDecorator(opts) { 15 | opts.headers['x-forwarded-host'] = 'localhost:3000'; 16 | return opts; 17 | } 18 | }) 19 | ); 20 | app.use(express.static('public')); 21 | app.get('*', (req, res) => { 22 | const store = createStore(req); 23 | 24 | const promises = matchRoutes(Routes, req.path) 25 | .map(({ route }) => { 26 | return route.loadData ? route.loadData(store) : null; 27 | }) 28 | .map(promise => { 29 | if (promise) { 30 | return new Promise((resolve, reject) => { 31 | promise.then(resolve).catch(resolve); 32 | }); 33 | } 34 | }); 35 | 36 | Promise.all(promises).then(() => { 37 | const context = {}; 38 | const content = renderer(req, store, context); 39 | 40 | if (context.url) { 41 | return res.redirect(301, context.url); 42 | } 43 | if (context.notFound) { 44 | res.status(404); 45 | } 46 | 47 | res.send(content); 48 | }); 49 | }); 50 | 51 | app.listen(3000, () => { 52 | console.log('Listening on prot 3000'); 53 | }); 54 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-ssr", 3 | "version": "1.0.0", 4 | "description": "Server side rendering project", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "npm-run-all --parallel dev:*", 8 | "dev:server": "nodemon --watch build --exec \"node build/bundle.js\"", 9 | "dev:build-server": "webpack --config webpack.server.js --watch", 10 | "dev:build-client": "webpack --config webpack.client.js --watch" 11 | }, 12 | "author": "", 13 | "license": "ISC", 14 | "dependencies": { 15 | "axios": "0.16.2", 16 | "babel-cli": "6.26.0", 17 | "babel-core": "6.26.0", 18 | "babel-loader": "7.1.2", 19 | "babel-preset-env": "1.6.0", 20 | "babel-preset-es2015": "6.24.1", 21 | "babel-preset-es2017": "6.24.1", 22 | "babel-preset-react": "6.24.1", 23 | "babel-preset-stage-0": "6.24.1", 24 | "compression": "1.7.0", 25 | "concurrently": "3.5.0", 26 | "express": "4.15.4", 27 | "express-http-proxy": "1.0.6", 28 | "lodash": "4.17.4", 29 | "nodemon": "1.12.0", 30 | "npm-run-all": "4.1.1", 31 | "react": "16.0.0", 32 | "react-dom": "16.0.0", 33 | "react-helmet": "5.2.0", 34 | "react-redux": "5.0.6", 35 | "react-router-config": "1.0.0-beta.4", 36 | "react-router-dom": "4.2.2", 37 | "redux": "3.7.2", 38 | "redux-thunk": "2.2.0", 39 | "serialize-javascript": "1.4.0", 40 | "webpack": "3.5.6", 41 | "webpack-dev-server": "2.8.2", 42 | "webpack-merge": "4.1.0", 43 | "webpack-node-externals": "1.6.0" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /api/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const mongoose = require('mongoose'); 3 | const cookieSession = require('cookie-session'); 4 | const passport = require('passport'); 5 | const bodyParser = require('body-parser'); 6 | const cors = require('cors'); 7 | const keys = require('./config/keys'); 8 | require('./models/User'); 9 | require('./services/passport'); 10 | 11 | mongoose.Promise = global.Promise; 12 | mongoose.connect(keys.mongoURI); 13 | 14 | const app = express(); 15 | 16 | app.use(cors()); 17 | app.use(bodyParser.json()); 18 | app.use( 19 | cookieSession({ 20 | maxAge: 30 * 24 * 60 * 60 * 1000, 21 | keys: [keys.cookieKey] 22 | }) 23 | ); 24 | app.use(passport.initialize()); 25 | app.use(passport.session()); 26 | 27 | require('./routes/authRoutes')(app); 28 | require('./routes/userRoutes')(app); 29 | app.get('/', (req, res) => { 30 | let adminContent = ` 31 |
    32 | You don't appear to be logged in. You can log in by visiting 33 | the Authentication Route. You could 34 | also look at details about yourself at the Current User route 35 |
    36 | `; 37 | if (req.user) { 38 | adminContent = ` 39 |
    40 | You appear to be logged in, so you can visit the Admins route 41 | or you can Logout. 42 |
    43 | `; 44 | } 45 | res.send(` 46 |
    47 |

    Hi! Welcome to the React SSR API

    48 |
    49 | You can see the Users route 50 |
    51 | ${adminContent} 52 |
    53 | `); 54 | }); 55 | 56 | const PORT = process.env.PORT || 5000; 57 | app.listen(PORT); 58 | -------------------------------------------------------------------------------- /diagrams/07/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/06/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/04/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/02/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/01/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/05/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/03/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /server/build/bundle.js: -------------------------------------------------------------------------------- 1 | /******/ (function(modules) { // webpackBootstrap 2 | /******/ // The module cache 3 | /******/ var installedModules = {}; 4 | /******/ 5 | /******/ // The require function 6 | /******/ function __webpack_require__(moduleId) { 7 | /******/ 8 | /******/ // Check if module is in cache 9 | /******/ if(installedModules[moduleId]) { 10 | /******/ return installedModules[moduleId].exports; 11 | /******/ } 12 | /******/ // Create a new module (and put it into the cache) 13 | /******/ var module = installedModules[moduleId] = { 14 | /******/ i: moduleId, 15 | /******/ l: false, 16 | /******/ exports: {} 17 | /******/ }; 18 | /******/ 19 | /******/ // Execute the module function 20 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21 | /******/ 22 | /******/ // Flag the module as loaded 23 | /******/ module.l = true; 24 | /******/ 25 | /******/ // Return the exports of the module 26 | /******/ return module.exports; 27 | /******/ } 28 | /******/ 29 | /******/ 30 | /******/ // expose the modules object (__webpack_modules__) 31 | /******/ __webpack_require__.m = modules; 32 | /******/ 33 | /******/ // expose the module cache 34 | /******/ __webpack_require__.c = installedModules; 35 | /******/ 36 | /******/ // define getter function for harmony exports 37 | /******/ __webpack_require__.d = function(exports, name, getter) { 38 | /******/ if(!__webpack_require__.o(exports, name)) { 39 | /******/ Object.defineProperty(exports, name, { 40 | /******/ configurable: false, 41 | /******/ enumerable: true, 42 | /******/ get: getter 43 | /******/ }); 44 | /******/ } 45 | /******/ }; 46 | /******/ 47 | /******/ // getDefaultExport function for compatibility with non-harmony modules 48 | /******/ __webpack_require__.n = function(module) { 49 | /******/ var getter = module && module.__esModule ? 50 | /******/ function getDefault() { return module['default']; } : 51 | /******/ function getModuleExports() { return module; }; 52 | /******/ __webpack_require__.d(getter, 'a', getter); 53 | /******/ return getter; 54 | /******/ }; 55 | /******/ 56 | /******/ // Object.prototype.hasOwnProperty.call 57 | /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 58 | /******/ 59 | /******/ // __webpack_public_path__ 60 | /******/ __webpack_require__.p = ""; 61 | /******/ 62 | /******/ // Load entry module and return exports 63 | /******/ return __webpack_require__(__webpack_require__.s = 7); 64 | /******/ }) 65 | /************************************************************************/ 66 | /******/ ([ 67 | /* 0 */ 68 | /***/ (function(module, exports) { 69 | 70 | module.exports = require("react"); 71 | 72 | /***/ }), 73 | /* 1 */ 74 | /***/ (function(module, exports, __webpack_require__) { 75 | 76 | "use strict"; 77 | 78 | 79 | Object.defineProperty(exports, "__esModule", { 80 | value: true 81 | }); 82 | 83 | function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } 84 | 85 | var FETCH_USERS = exports.FETCH_USERS = 'fetch_users'; 86 | var fetchUsers = exports.fetchUsers = function fetchUsers() { 87 | return function () { 88 | var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(dispatch, getState, api) { 89 | var res; 90 | return regeneratorRuntime.wrap(function _callee$(_context) { 91 | while (1) { 92 | switch (_context.prev = _context.next) { 93 | case 0: 94 | _context.next = 2; 95 | return api.get('/users'); 96 | 97 | case 2: 98 | res = _context.sent; 99 | 100 | 101 | dispatch({ 102 | type: FETCH_USERS, 103 | payload: res 104 | }); 105 | 106 | case 4: 107 | case 'end': 108 | return _context.stop(); 109 | } 110 | } 111 | }, _callee, undefined); 112 | })); 113 | 114 | return function (_x, _x2, _x3) { 115 | return _ref.apply(this, arguments); 116 | }; 117 | }(); 118 | }; 119 | 120 | var FETCH_CURRENT_USER = exports.FETCH_CURRENT_USER = 'fetch_current_user'; 121 | var fetchCurrentUser = exports.fetchCurrentUser = function fetchCurrentUser() { 122 | return function () { 123 | var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(dispatch, getState, api) { 124 | var res; 125 | return regeneratorRuntime.wrap(function _callee2$(_context2) { 126 | while (1) { 127 | switch (_context2.prev = _context2.next) { 128 | case 0: 129 | _context2.next = 2; 130 | return api.get('/current_user'); 131 | 132 | case 2: 133 | res = _context2.sent; 134 | 135 | 136 | dispatch({ 137 | type: FETCH_CURRENT_USER, 138 | payload: res 139 | }); 140 | 141 | case 4: 142 | case 'end': 143 | return _context2.stop(); 144 | } 145 | } 146 | }, _callee2, undefined); 147 | })); 148 | 149 | return function (_x4, _x5, _x6) { 150 | return _ref2.apply(this, arguments); 151 | }; 152 | }(); 153 | }; 154 | 155 | var FETCH_ADMINS = exports.FETCH_ADMINS = 'fetch_admins'; 156 | var fetchAdmins = exports.fetchAdmins = function fetchAdmins() { 157 | return function () { 158 | var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(dispatch, getState, api) { 159 | var res; 160 | return regeneratorRuntime.wrap(function _callee3$(_context3) { 161 | while (1) { 162 | switch (_context3.prev = _context3.next) { 163 | case 0: 164 | _context3.next = 2; 165 | return api.get('/admins'); 166 | 167 | case 2: 168 | res = _context3.sent; 169 | 170 | 171 | dispatch({ 172 | type: FETCH_ADMINS, 173 | payload: res 174 | }); 175 | 176 | case 4: 177 | case 'end': 178 | return _context3.stop(); 179 | } 180 | } 181 | }, _callee3, undefined); 182 | })); 183 | 184 | return function (_x7, _x8, _x9) { 185 | return _ref3.apply(this, arguments); 186 | }; 187 | }(); 188 | }; 189 | 190 | /***/ }), 191 | /* 2 */ 192 | /***/ (function(module, exports) { 193 | 194 | module.exports = require("react-redux"); 195 | 196 | /***/ }), 197 | /* 3 */ 198 | /***/ (function(module, exports) { 199 | 200 | module.exports = require("react-router-config"); 201 | 202 | /***/ }), 203 | /* 4 */ 204 | /***/ (function(module, exports) { 205 | 206 | module.exports = require("react-router-dom"); 207 | 208 | /***/ }), 209 | /* 5 */ 210 | /***/ (function(module, exports, __webpack_require__) { 211 | 212 | "use strict"; 213 | 214 | 215 | Object.defineProperty(exports, "__esModule", { 216 | value: true 217 | }); 218 | 219 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 220 | 221 | var _react = __webpack_require__(0); 222 | 223 | var _react2 = _interopRequireDefault(_react); 224 | 225 | var _App = __webpack_require__(11); 226 | 227 | var _App2 = _interopRequireDefault(_App); 228 | 229 | var _HomePage = __webpack_require__(13); 230 | 231 | var _HomePage2 = _interopRequireDefault(_HomePage); 232 | 233 | var _UsersListPage = __webpack_require__(14); 234 | 235 | var _UsersListPage2 = _interopRequireDefault(_UsersListPage); 236 | 237 | var _NotFoundPage = __webpack_require__(15); 238 | 239 | var _NotFoundPage2 = _interopRequireDefault(_NotFoundPage); 240 | 241 | var _AdminsListPage = __webpack_require__(16); 242 | 243 | var _AdminsListPage2 = _interopRequireDefault(_AdminsListPage); 244 | 245 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 246 | 247 | exports.default = [_extends({}, _App2.default, { 248 | routes: [_extends({}, _HomePage2.default, { 249 | path: '/', 250 | exact: true 251 | }), _extends({}, _AdminsListPage2.default, { 252 | path: '/admins' 253 | }), _extends({}, _UsersListPage2.default, { 254 | path: '/users' 255 | }), _extends({}, _NotFoundPage2.default)] 256 | })]; 257 | 258 | /***/ }), 259 | /* 6 */ 260 | /***/ (function(module, exports) { 261 | 262 | module.exports = require("redux"); 263 | 264 | /***/ }), 265 | /* 7 */ 266 | /***/ (function(module, exports, __webpack_require__) { 267 | 268 | "use strict"; 269 | 270 | 271 | __webpack_require__(8); 272 | 273 | var _express = __webpack_require__(9); 274 | 275 | var _express2 = _interopRequireDefault(_express); 276 | 277 | var _reactRouterConfig = __webpack_require__(3); 278 | 279 | var _expressHttpProxy = __webpack_require__(10); 280 | 281 | var _expressHttpProxy2 = _interopRequireDefault(_expressHttpProxy); 282 | 283 | var _Routes = __webpack_require__(5); 284 | 285 | var _Routes2 = _interopRequireDefault(_Routes); 286 | 287 | var _renderer = __webpack_require__(18); 288 | 289 | var _renderer2 = _interopRequireDefault(_renderer); 290 | 291 | var _createStore = __webpack_require__(21); 292 | 293 | var _createStore2 = _interopRequireDefault(_createStore); 294 | 295 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 296 | 297 | var app = (0, _express2.default)(); 298 | 299 | app.use('/api', (0, _expressHttpProxy2.default)('http://react-ssr-api.herokuapp.com', { 300 | proxyReqOptDecorator: function proxyReqOptDecorator(opts) { 301 | opts.headers['x-forwarded-host'] = 'localhost:3000'; 302 | return opts; 303 | } 304 | })); 305 | app.use(_express2.default.static('public')); 306 | app.get('*', function (req, res) { 307 | var store = (0, _createStore2.default)(req); 308 | 309 | var promises = (0, _reactRouterConfig.matchRoutes)(_Routes2.default, req.path).map(function (_ref) { 310 | var route = _ref.route; 311 | 312 | return route.loadData ? route.loadData(store) : null; 313 | }).map(function (promise) { 314 | if (promise) { 315 | return new Promise(function (resolve, reject) { 316 | promise.then(resolve).catch(resolve); 317 | }); 318 | } 319 | }); 320 | 321 | Promise.all(promises).then(function () { 322 | var context = {}; 323 | var content = (0, _renderer2.default)(req, store, context); 324 | 325 | if (context.url) { 326 | return res.redirect(301, context.url); 327 | } 328 | if (context.notFound) { 329 | res.status(404); 330 | } 331 | 332 | res.send(content); 333 | }); 334 | }); 335 | 336 | app.listen(3000, function () { 337 | console.log('Listening on prot 3000'); 338 | }); 339 | 340 | /***/ }), 341 | /* 8 */ 342 | /***/ (function(module, exports) { 343 | 344 | module.exports = require("babel-polyfill"); 345 | 346 | /***/ }), 347 | /* 9 */ 348 | /***/ (function(module, exports) { 349 | 350 | module.exports = require("express"); 351 | 352 | /***/ }), 353 | /* 10 */ 354 | /***/ (function(module, exports) { 355 | 356 | module.exports = require("express-http-proxy"); 357 | 358 | /***/ }), 359 | /* 11 */ 360 | /***/ (function(module, exports, __webpack_require__) { 361 | 362 | "use strict"; 363 | 364 | 365 | Object.defineProperty(exports, "__esModule", { 366 | value: true 367 | }); 368 | 369 | var _react = __webpack_require__(0); 370 | 371 | var _react2 = _interopRequireDefault(_react); 372 | 373 | var _reactRouterConfig = __webpack_require__(3); 374 | 375 | var _Header = __webpack_require__(12); 376 | 377 | var _Header2 = _interopRequireDefault(_Header); 378 | 379 | var _actions = __webpack_require__(1); 380 | 381 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 382 | 383 | var App = function App(_ref) { 384 | var route = _ref.route; 385 | 386 | return _react2.default.createElement( 387 | 'div', 388 | null, 389 | _react2.default.createElement(_Header2.default, null), 390 | (0, _reactRouterConfig.renderRoutes)(route.routes) 391 | ); 392 | }; 393 | 394 | exports.default = { 395 | component: App, 396 | loadData: function loadData(_ref2) { 397 | var dispatch = _ref2.dispatch; 398 | return dispatch((0, _actions.fetchCurrentUser)()); 399 | } 400 | }; 401 | 402 | /***/ }), 403 | /* 12 */ 404 | /***/ (function(module, exports, __webpack_require__) { 405 | 406 | "use strict"; 407 | 408 | 409 | Object.defineProperty(exports, "__esModule", { 410 | value: true 411 | }); 412 | 413 | var _react = __webpack_require__(0); 414 | 415 | var _react2 = _interopRequireDefault(_react); 416 | 417 | var _reactRouterDom = __webpack_require__(4); 418 | 419 | var _reactRedux = __webpack_require__(2); 420 | 421 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 422 | 423 | var Header = function Header(_ref) { 424 | var auth = _ref.auth; 425 | 426 | var authButton = auth ? _react2.default.createElement( 427 | 'a', 428 | { href: '/api/logout' }, 429 | 'Logout' 430 | ) : _react2.default.createElement( 431 | 'a', 432 | { href: '/api/auth/google' }, 433 | 'Login' 434 | ); 435 | 436 | return _react2.default.createElement( 437 | 'nav', 438 | null, 439 | _react2.default.createElement( 440 | 'div', 441 | { className: 'nav-wrapper' }, 442 | _react2.default.createElement( 443 | _reactRouterDom.Link, 444 | { to: '/', className: 'brand-logo' }, 445 | 'React SSR' 446 | ), 447 | _react2.default.createElement( 448 | 'ul', 449 | { className: 'right' }, 450 | _react2.default.createElement( 451 | 'li', 452 | null, 453 | _react2.default.createElement( 454 | _reactRouterDom.Link, 455 | { to: '/users' }, 456 | 'Users' 457 | ) 458 | ), 459 | _react2.default.createElement( 460 | 'li', 461 | null, 462 | _react2.default.createElement( 463 | _reactRouterDom.Link, 464 | { to: '/admins' }, 465 | 'Admins' 466 | ) 467 | ), 468 | _react2.default.createElement( 469 | 'li', 470 | null, 471 | authButton 472 | ) 473 | ) 474 | ) 475 | ); 476 | }; 477 | 478 | function mapStateToProps(_ref2) { 479 | var auth = _ref2.auth; 480 | 481 | return { auth: auth }; 482 | } 483 | 484 | exports.default = (0, _reactRedux.connect)(mapStateToProps)(Header); 485 | 486 | /***/ }), 487 | /* 13 */ 488 | /***/ (function(module, exports, __webpack_require__) { 489 | 490 | "use strict"; 491 | 492 | 493 | Object.defineProperty(exports, "__esModule", { 494 | value: true 495 | }); 496 | 497 | var _react = __webpack_require__(0); 498 | 499 | var _react2 = _interopRequireDefault(_react); 500 | 501 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 502 | 503 | var Home = function Home() { 504 | return _react2.default.createElement( 505 | 'div', 506 | { className: 'center-align', style: { marginTop: '200px' } }, 507 | _react2.default.createElement( 508 | 'h3', 509 | null, 510 | 'Welcome' 511 | ), 512 | _react2.default.createElement( 513 | 'p', 514 | null, 515 | 'Check out these awesome features' 516 | ) 517 | ); 518 | }; 519 | 520 | exports.default = { 521 | component: Home 522 | }; 523 | 524 | /***/ }), 525 | /* 14 */ 526 | /***/ (function(module, exports, __webpack_require__) { 527 | 528 | "use strict"; 529 | 530 | 531 | Object.defineProperty(exports, "__esModule", { 532 | value: true 533 | }); 534 | 535 | var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 536 | 537 | var _react = __webpack_require__(0); 538 | 539 | var _react2 = _interopRequireDefault(_react); 540 | 541 | var _reactRedux = __webpack_require__(2); 542 | 543 | var _actions = __webpack_require__(1); 544 | 545 | var _reactHelmet = __webpack_require__(28); 546 | 547 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 548 | 549 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 550 | 551 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 552 | 553 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 554 | 555 | var UsersList = function (_Component) { 556 | _inherits(UsersList, _Component); 557 | 558 | function UsersList() { 559 | _classCallCheck(this, UsersList); 560 | 561 | return _possibleConstructorReturn(this, (UsersList.__proto__ || Object.getPrototypeOf(UsersList)).apply(this, arguments)); 562 | } 563 | 564 | _createClass(UsersList, [{ 565 | key: 'componentDidMount', 566 | value: function componentDidMount() { 567 | this.props.fetchUsers(); 568 | } 569 | }, { 570 | key: 'renderUsers', 571 | value: function renderUsers() { 572 | return this.props.users.map(function (user) { 573 | return _react2.default.createElement( 574 | 'li', 575 | { key: user.id }, 576 | user.name 577 | ); 578 | }); 579 | } 580 | }, { 581 | key: 'head', 582 | value: function head() { 583 | return _react2.default.createElement( 584 | _reactHelmet.Helmet, 585 | null, 586 | _react2.default.createElement( 587 | 'title', 588 | null, 589 | this.props.users.length + ' Users Loaded' 590 | ), 591 | _react2.default.createElement('meta', { property: 'og:title', content: 'Users App' }) 592 | ); 593 | } 594 | }, { 595 | key: 'render', 596 | value: function render() { 597 | return _react2.default.createElement( 598 | 'div', 599 | null, 600 | this.head(), 601 | 'Here\'s a big list of users:', 602 | _react2.default.createElement( 603 | 'ul', 604 | null, 605 | this.renderUsers() 606 | ) 607 | ); 608 | } 609 | }]); 610 | 611 | return UsersList; 612 | }(_react.Component); 613 | 614 | function mapStateToProps(state) { 615 | return { users: state.users }; 616 | } 617 | 618 | function loadData(store) { 619 | return store.dispatch((0, _actions.fetchUsers)()); 620 | } 621 | 622 | exports.default = { 623 | loadData: loadData, 624 | component: (0, _reactRedux.connect)(mapStateToProps, { fetchUsers: _actions.fetchUsers })(UsersList) 625 | }; 626 | 627 | /***/ }), 628 | /* 15 */ 629 | /***/ (function(module, exports, __webpack_require__) { 630 | 631 | "use strict"; 632 | 633 | 634 | Object.defineProperty(exports, "__esModule", { 635 | value: true 636 | }); 637 | 638 | var _react = __webpack_require__(0); 639 | 640 | var _react2 = _interopRequireDefault(_react); 641 | 642 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 643 | 644 | var NotFoundPage = function NotFoundPage(_ref) { 645 | var _ref$staticContext = _ref.staticContext, 646 | staticContext = _ref$staticContext === undefined ? {} : _ref$staticContext; 647 | 648 | staticContext.notFound = true; 649 | return _react2.default.createElement( 650 | 'h1', 651 | null, 652 | 'Ooops, route not found.' 653 | ); 654 | }; 655 | 656 | exports.default = { 657 | component: NotFoundPage 658 | }; 659 | 660 | /***/ }), 661 | /* 16 */ 662 | /***/ (function(module, exports, __webpack_require__) { 663 | 664 | "use strict"; 665 | 666 | 667 | Object.defineProperty(exports, "__esModule", { 668 | value: true 669 | }); 670 | 671 | var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 672 | 673 | var _react = __webpack_require__(0); 674 | 675 | var _react2 = _interopRequireDefault(_react); 676 | 677 | var _reactRedux = __webpack_require__(2); 678 | 679 | var _actions = __webpack_require__(1); 680 | 681 | var _requireAuth = __webpack_require__(17); 682 | 683 | var _requireAuth2 = _interopRequireDefault(_requireAuth); 684 | 685 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 686 | 687 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 688 | 689 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 690 | 691 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 692 | 693 | var AdminsListPage = function (_Component) { 694 | _inherits(AdminsListPage, _Component); 695 | 696 | function AdminsListPage() { 697 | _classCallCheck(this, AdminsListPage); 698 | 699 | return _possibleConstructorReturn(this, (AdminsListPage.__proto__ || Object.getPrototypeOf(AdminsListPage)).apply(this, arguments)); 700 | } 701 | 702 | _createClass(AdminsListPage, [{ 703 | key: 'componentDidMount', 704 | value: function componentDidMount() { 705 | this.props.fetchAdmins(); 706 | } 707 | }, { 708 | key: 'renderAdmins', 709 | value: function renderAdmins() { 710 | return this.props.admins.map(function (admin) { 711 | return _react2.default.createElement( 712 | 'li', 713 | { key: admin.id }, 714 | admin.name 715 | ); 716 | }); 717 | } 718 | }, { 719 | key: 'render', 720 | value: function render() { 721 | return _react2.default.createElement( 722 | 'div', 723 | null, 724 | _react2.default.createElement( 725 | 'h3', 726 | null, 727 | 'Protected list of admins' 728 | ), 729 | _react2.default.createElement( 730 | 'ul', 731 | null, 732 | this.renderAdmins() 733 | ) 734 | ); 735 | } 736 | }]); 737 | 738 | return AdminsListPage; 739 | }(_react.Component); 740 | 741 | function mapStateToProps(_ref) { 742 | var admins = _ref.admins; 743 | 744 | return { admins: admins }; 745 | } 746 | 747 | exports.default = { 748 | component: (0, _reactRedux.connect)(mapStateToProps, { fetchAdmins: _actions.fetchAdmins })((0, _requireAuth2.default)(AdminsListPage)), 749 | loadData: function loadData(_ref2) { 750 | var dispatch = _ref2.dispatch; 751 | return dispatch((0, _actions.fetchAdmins)()); 752 | } 753 | }; 754 | 755 | /***/ }), 756 | /* 17 */ 757 | /***/ (function(module, exports, __webpack_require__) { 758 | 759 | "use strict"; 760 | 761 | 762 | Object.defineProperty(exports, "__esModule", { 763 | value: true 764 | }); 765 | 766 | var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 767 | 768 | var _react = __webpack_require__(0); 769 | 770 | var _react2 = _interopRequireDefault(_react); 771 | 772 | var _reactRedux = __webpack_require__(2); 773 | 774 | var _reactRouterDom = __webpack_require__(4); 775 | 776 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 777 | 778 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 779 | 780 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 781 | 782 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 783 | 784 | exports.default = function (ChildComponent) { 785 | var RequireAuth = function (_Component) { 786 | _inherits(RequireAuth, _Component); 787 | 788 | function RequireAuth() { 789 | _classCallCheck(this, RequireAuth); 790 | 791 | return _possibleConstructorReturn(this, (RequireAuth.__proto__ || Object.getPrototypeOf(RequireAuth)).apply(this, arguments)); 792 | } 793 | 794 | _createClass(RequireAuth, [{ 795 | key: 'render', 796 | value: function render() { 797 | switch (this.props.auth) { 798 | case false: 799 | return _react2.default.createElement(_reactRouterDom.Redirect, { to: '/' }); 800 | case null: 801 | return _react2.default.createElement( 802 | 'div', 803 | null, 804 | 'Loading...' 805 | ); 806 | default: 807 | return _react2.default.createElement(ChildComponent, this.props); 808 | } 809 | } 810 | }]); 811 | 812 | return RequireAuth; 813 | }(_react.Component); 814 | 815 | function mapStateToProps(_ref) { 816 | var auth = _ref.auth; 817 | 818 | return { auth: auth }; 819 | } 820 | 821 | return (0, _reactRedux.connect)(mapStateToProps)(RequireAuth); 822 | }; 823 | 824 | /***/ }), 825 | /* 18 */ 826 | /***/ (function(module, exports, __webpack_require__) { 827 | 828 | "use strict"; 829 | 830 | 831 | Object.defineProperty(exports, "__esModule", { 832 | value: true 833 | }); 834 | 835 | var _react = __webpack_require__(0); 836 | 837 | var _react2 = _interopRequireDefault(_react); 838 | 839 | var _server = __webpack_require__(19); 840 | 841 | var _reactRouterDom = __webpack_require__(4); 842 | 843 | var _reactRedux = __webpack_require__(2); 844 | 845 | var _reactRouterConfig = __webpack_require__(3); 846 | 847 | var _serializeJavascript = __webpack_require__(20); 848 | 849 | var _serializeJavascript2 = _interopRequireDefault(_serializeJavascript); 850 | 851 | var _reactHelmet = __webpack_require__(28); 852 | 853 | var _Routes = __webpack_require__(5); 854 | 855 | var _Routes2 = _interopRequireDefault(_Routes); 856 | 857 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 858 | 859 | exports.default = function (req, store, context) { 860 | var content = (0, _server.renderToString)(_react2.default.createElement( 861 | _reactRedux.Provider, 862 | { store: store }, 863 | _react2.default.createElement( 864 | _reactRouterDom.StaticRouter, 865 | { location: req.path, context: context }, 866 | _react2.default.createElement( 867 | 'div', 868 | null, 869 | (0, _reactRouterConfig.renderRoutes)(_Routes2.default) 870 | ) 871 | ) 872 | )); 873 | 874 | var helmet = _reactHelmet.Helmet.renderStatic(); 875 | 876 | return '\n \n \n ' + helmet.title.toString() + '\n ' + helmet.meta.toString() + '\n \n \n \n
    ' + content + '
    \n \n \n \n \n '; 877 | }; 878 | 879 | /***/ }), 880 | /* 19 */ 881 | /***/ (function(module, exports) { 882 | 883 | module.exports = require("react-dom/server"); 884 | 885 | /***/ }), 886 | /* 20 */ 887 | /***/ (function(module, exports) { 888 | 889 | module.exports = require("serialize-javascript"); 890 | 891 | /***/ }), 892 | /* 21 */ 893 | /***/ (function(module, exports, __webpack_require__) { 894 | 895 | "use strict"; 896 | 897 | 898 | Object.defineProperty(exports, "__esModule", { 899 | value: true 900 | }); 901 | 902 | var _redux = __webpack_require__(6); 903 | 904 | var _reduxThunk = __webpack_require__(22); 905 | 906 | var _reduxThunk2 = _interopRequireDefault(_reduxThunk); 907 | 908 | var _axios = __webpack_require__(23); 909 | 910 | var _axios2 = _interopRequireDefault(_axios); 911 | 912 | var _reducers = __webpack_require__(24); 913 | 914 | var _reducers2 = _interopRequireDefault(_reducers); 915 | 916 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 917 | 918 | exports.default = function (req) { 919 | var axiosInstance = _axios2.default.create({ 920 | baseURL: 'http://react-ssr-api.herokuapp.com', 921 | headers: { cookie: req.get('cookie') || '' } 922 | }); 923 | 924 | var store = (0, _redux.createStore)(_reducers2.default, {}, (0, _redux.applyMiddleware)(_reduxThunk2.default.withExtraArgument(axiosInstance))); 925 | 926 | return store; 927 | }; 928 | 929 | /***/ }), 930 | /* 22 */ 931 | /***/ (function(module, exports) { 932 | 933 | module.exports = require("redux-thunk"); 934 | 935 | /***/ }), 936 | /* 23 */ 937 | /***/ (function(module, exports) { 938 | 939 | module.exports = require("axios"); 940 | 941 | /***/ }), 942 | /* 24 */ 943 | /***/ (function(module, exports, __webpack_require__) { 944 | 945 | "use strict"; 946 | 947 | 948 | Object.defineProperty(exports, "__esModule", { 949 | value: true 950 | }); 951 | 952 | var _redux = __webpack_require__(6); 953 | 954 | var _usersReducer = __webpack_require__(25); 955 | 956 | var _usersReducer2 = _interopRequireDefault(_usersReducer); 957 | 958 | var _authReducer = __webpack_require__(26); 959 | 960 | var _authReducer2 = _interopRequireDefault(_authReducer); 961 | 962 | var _adminsReducer = __webpack_require__(27); 963 | 964 | var _adminsReducer2 = _interopRequireDefault(_adminsReducer); 965 | 966 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 967 | 968 | exports.default = (0, _redux.combineReducers)({ 969 | users: _usersReducer2.default, 970 | auth: _authReducer2.default, 971 | admins: _adminsReducer2.default 972 | }); 973 | 974 | /***/ }), 975 | /* 25 */ 976 | /***/ (function(module, exports, __webpack_require__) { 977 | 978 | "use strict"; 979 | 980 | 981 | Object.defineProperty(exports, "__esModule", { 982 | value: true 983 | }); 984 | 985 | var _actions = __webpack_require__(1); 986 | 987 | exports.default = function () { 988 | var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; 989 | var action = arguments[1]; 990 | 991 | switch (action.type) { 992 | case _actions.FETCH_USERS: 993 | return action.payload.data; 994 | default: 995 | return state; 996 | } 997 | }; 998 | 999 | /***/ }), 1000 | /* 26 */ 1001 | /***/ (function(module, exports, __webpack_require__) { 1002 | 1003 | "use strict"; 1004 | 1005 | 1006 | Object.defineProperty(exports, "__esModule", { 1007 | value: true 1008 | }); 1009 | 1010 | exports.default = function () { 1011 | var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; 1012 | var action = arguments[1]; 1013 | 1014 | switch (action.type) { 1015 | case _actions.FETCH_CURRENT_USER: 1016 | return action.payload.data || false; 1017 | default: 1018 | return state; 1019 | } 1020 | }; 1021 | 1022 | var _actions = __webpack_require__(1); 1023 | 1024 | /***/ }), 1025 | /* 27 */ 1026 | /***/ (function(module, exports, __webpack_require__) { 1027 | 1028 | "use strict"; 1029 | 1030 | 1031 | Object.defineProperty(exports, "__esModule", { 1032 | value: true 1033 | }); 1034 | 1035 | var _actions = __webpack_require__(1); 1036 | 1037 | exports.default = function () { 1038 | var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; 1039 | var action = arguments[1]; 1040 | 1041 | switch (action.type) { 1042 | case _actions.FETCH_ADMINS: 1043 | return action.payload.data; 1044 | default: 1045 | return state; 1046 | } 1047 | }; 1048 | 1049 | /***/ }), 1050 | /* 28 */ 1051 | /***/ (function(module, exports) { 1052 | 1053 | module.exports = require("react-helmet"); 1054 | 1055 | /***/ }) 1056 | /******/ ]); --------------------------------------------------------------------------------