From a4adf7283d1353fd851bab0bff2fc46802d22b07 Mon Sep 17 00:00:00 2001 From: Stuart Taylor Date: Wed, 30 May 2018 10:11:14 +0100 Subject: [PATCH] Redirect non-emailVerified users to www (#108) --- packages/learn/gatsby-node.js | 10 ++++++++++ packages/learn/sample.env | 7 +------ packages/learn/src/redux/app/fetch-user-epic.js | 11 +++++++++-- packages/learn/src/redux/app/hard-go-to-epic.js | 15 +++++++++++++++ packages/learn/src/redux/app/index.js | 6 +++++- packages/learn/src/redux/store.js | 1 + 6 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 packages/learn/src/redux/app/hard-go-to-epic.js diff --git a/packages/learn/gatsby-node.js b/packages/learn/gatsby-node.js index 356c9e1aa3..d9d374eb33 100644 --- a/packages/learn/gatsby-node.js +++ b/packages/learn/gatsby-node.js @@ -1,3 +1,4 @@ +require('dotenv').config(); const path = require('path'); const CopyWebpackPlugin = require('copy-webpack-plugin'); @@ -102,6 +103,7 @@ exports.createPages = ({ graphql, boundActionCreators }) => { }); }; +const webpack = require('webpack'); const generateBabelConfig = require('gatsby/dist/utils/babel-config'); exports.modifyWebpackConfig = ({ config, stage }) => { @@ -134,6 +136,14 @@ exports.modifyWebpackConfig = ({ config, stage }) => { } ] ]); + config.plugin('DefinePlugin', webpack.DefinePlugin, [ + { + HOME_PATH: JSON.stringify( + process.env.HOME_PATH || + 'http://localhost:3000' + ) + } +]); }); }; /* eslint-disable prefer-object-spread/prefer-object-spread */ diff --git a/packages/learn/sample.env b/packages/learn/sample.env index fd4ce6074b..0275ed6aec 100644 --- a/packages/learn/sample.env +++ b/packages/learn/sample.env @@ -1,6 +1 @@ -AUTH0_DOMAIN=.auth0.com -AUTH0_CLIENT_ID=this-is-me -AUTH0_NAMESPACE='https://auth-ns.freecodecamp.org/' - -DEV_SERVICE_PATH='http://localhost:3000/services' -PROD_SERVICE_PATH='' \ No newline at end of file +HOME_PATH='http://localhost:3000' \ No newline at end of file diff --git a/packages/learn/src/redux/app/fetch-user-epic.js b/packages/learn/src/redux/app/fetch-user-epic.js index 1adedb919b..d8090d71cc 100644 --- a/packages/learn/src/redux/app/fetch-user-epic.js +++ b/packages/learn/src/redux/app/fetch-user-epic.js @@ -1,6 +1,7 @@ +/* global HOME_PATH */ import { of } from 'rxjs/observable/of'; import { ofType } from 'redux-observable'; -import { types, fetchUserComplete } from './'; +import { types, fetchUserComplete, hardGoTo } from './'; import { switchMap, filter, @@ -17,7 +18,13 @@ function fetchUserEpic(action$, _, { services }) { switchMap(() => { return services.readService$({ service: 'user' }).pipe( filter(({ entities, result }) => entities && !!result), - map(fetchUserComplete), + map(response => { + const { entities: { user }, result } = response; + if (!user[result].emailVerified) { + return hardGoTo(HOME_PATH); + } + return fetchUserComplete(result); + }), defaultIfEmpty({ type: 'no-user' }), catchError(err => { console.log(err); diff --git a/packages/learn/src/redux/app/hard-go-to-epic.js b/packages/learn/src/redux/app/hard-go-to-epic.js new file mode 100644 index 0000000000..89bee5db51 --- /dev/null +++ b/packages/learn/src/redux/app/hard-go-to-epic.js @@ -0,0 +1,15 @@ +/* global HOME_PATH */ +import { ofType } from 'redux-observable'; +import { tap, ignoreElements } from 'rxjs/operators'; + +import { types } from './'; + +export default function hardGoToEpic(action$, _, { location }) { + return action$.pipe( + ofType(types.hardGoTo), + tap(({ payload = HOME_PATH }) => { + location.href = payload; + }), + ignoreElements() + ); +} diff --git a/packages/learn/src/redux/app/index.js b/packages/learn/src/redux/app/index.js index 6ac2ef7fab..d99b3eee7b 100644 --- a/packages/learn/src/redux/app/index.js +++ b/packages/learn/src/redux/app/index.js @@ -3,16 +3,18 @@ import { createAction, handleActions } from 'redux-actions'; import { createTypes } from '../../../utils/stateManagment'; import { types as challenge } from '../../templates/Challenges/redux'; import fecthUserEpic from './fetch-user-epic'; +import hardGoToEpic from './hard-go-to-epic'; const ns = 'app'; -export const epics = [fecthUserEpic]; +export const epics = [fecthUserEpic, hardGoToEpic]; export const types = createTypes( [ 'fetchUser', 'fetchUserComplete', 'fetchUserError', + 'hardGoTo', 'updateUserSignedIn', 'toggleMapModal' ], @@ -30,6 +32,8 @@ export const fetchUser = createAction(types.fetchUser); export const fetchUserComplete = createAction(types.fetchUserComplete); export const fecthUserError = createAction(types.fetchUserError); +export const hardGoTo = createAction(types.hardGoTo); + export const toggleMapModal = createAction(types.toggleMapModal); export const updateUserSignedIn = createAction(types.updateUserSignedIn); diff --git a/packages/learn/src/redux/store.js b/packages/learn/src/redux/store.js index 9e4dcb3d18..d22d60b0c6 100644 --- a/packages/learn/src/redux/store.js +++ b/packages/learn/src/redux/store.js @@ -37,6 +37,7 @@ const rootEpic = combineEpics(analyticsEpic, ...appEpics, ...challengeEpics); const epicMiddleware = createEpicMiddleware(rootEpic, { dependencies: { window: typeof window !== 'undefined' ? window : {}, + location: typeof window !== 'undefined' ? window.location : {}, document: typeof window !== 'undefined' ? document : {}, services: servicesCreator(serviceOptions) }