Initial sign in flow
This commit is contained in:
committed by
Mrugesh Mohapatra
parent
653d2bc454
commit
4ba0bb2f89
@ -1,120 +0,0 @@
|
|||||||
// import auth0 from 'auth0-js';
|
|
||||||
// import { navigateTo } from 'gatsby-link';
|
|
||||||
|
|
||||||
// import { ajax$ } from '../templates/Challenges/utils/ajax-stream';
|
|
||||||
|
|
||||||
// const AUTH0_DOMAIN = 'freecodecamp.auth0.com';
|
|
||||||
// const AUTH0_CLIENT_ID = 'vF70CJZyPKbZR4y0avecXXLkfyMNnyKn';
|
|
||||||
|
|
||||||
// export default class Auth {
|
|
||||||
// constructor() {
|
|
||||||
// this.login = this.login.bind(this);
|
|
||||||
// this.logout = this.logout.bind(this);
|
|
||||||
// this.handleAuthentication = this.handleAuthentication.bind(this);
|
|
||||||
// this.isAuthenticated = this.isAuthenticated.bind(this);
|
|
||||||
|
|
||||||
// this.sessionEmail = '';
|
|
||||||
// }
|
|
||||||
|
|
||||||
// auth0 = new auth0.WebAuth({
|
|
||||||
// domain: AUTH0_DOMAIN,
|
|
||||||
// clientID: AUTH0_CLIENT_ID,
|
|
||||||
// redirectUri: 'http://localhost:8000/callback',
|
|
||||||
// audience: `https://${AUTH0_DOMAIN}/api/v2/`,
|
|
||||||
// responseType: 'token id_token',
|
|
||||||
// scope: 'openid profile email'
|
|
||||||
// });
|
|
||||||
|
|
||||||
// login() {
|
|
||||||
// this.auth0.authorize();
|
|
||||||
// }
|
|
||||||
|
|
||||||
// logout() {
|
|
||||||
// localStorage.removeItem('access_token');
|
|
||||||
// localStorage.removeItem('id_token');
|
|
||||||
// localStorage.removeItem('expires_at');
|
|
||||||
// localStorage.removeItem('user');
|
|
||||||
// }
|
|
||||||
|
|
||||||
// handleAuthentication() {
|
|
||||||
// if (typeof window !== 'undefined') {
|
|
||||||
// this.auth0.parseHash((err, authResult) => {
|
|
||||||
// if (authResult && authResult.accessToken && authResult.idToken) {
|
|
||||||
// this.setSession(authResult);
|
|
||||||
// } else if (err) {
|
|
||||||
// console.error(err);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // Return to the homepage after authentication.
|
|
||||||
// navigateTo('/');
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// isAuthenticated() {
|
|
||||||
// const expiresAt = JSON.parse(localStorage.getItem('expires_at'));
|
|
||||||
// const isAuth = new Date().getTime() < expiresAt;
|
|
||||||
|
|
||||||
// // isAuth && this.getFCCUser();
|
|
||||||
// return isAuth;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// setSession(authResult) {
|
|
||||||
// const expiresAt = JSON.stringify(
|
|
||||||
// authResult.expiresIn * 9000 + new Date().getTime()
|
|
||||||
// );
|
|
||||||
// localStorage.setItem('access_token', authResult.accessToken);
|
|
||||||
// localStorage.setItem('id_token', authResult.idToken);
|
|
||||||
// localStorage.setItem('expires_at', expiresAt);
|
|
||||||
|
|
||||||
// this.auth0.client.userInfo(authResult.accessToken, (err, user) => {
|
|
||||||
// if (err) {
|
|
||||||
// console.error(err);
|
|
||||||
// }
|
|
||||||
// localStorage.setItem('user', JSON.stringify(user));
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
|
|
||||||
// getFCCUser() {
|
|
||||||
// const token = localStorage.getItem('access_token');
|
|
||||||
// if (!token) {
|
|
||||||
// console.warn('no token found');
|
|
||||||
// }
|
|
||||||
// const { email } = JSON.parse(localStorage.getItem('user'));
|
|
||||||
// const headers = {
|
|
||||||
// Authorization: `Bearer ${token}`
|
|
||||||
// };
|
|
||||||
// const body = { email };
|
|
||||||
// ajax$({
|
|
||||||
// url: '/api/auth/auth0/login',
|
|
||||||
// headers,
|
|
||||||
// body
|
|
||||||
// }).subscribe(
|
|
||||||
// resp => {
|
|
||||||
// console.info('YES');
|
|
||||||
// console.log(resp);
|
|
||||||
// },
|
|
||||||
// err => {
|
|
||||||
// console.warn('NO?');
|
|
||||||
// console.log(err.message);
|
|
||||||
// },
|
|
||||||
// () => {
|
|
||||||
// console.log('done');
|
|
||||||
// }
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// getUser() {
|
|
||||||
// if (localStorage.getItem('user')) {
|
|
||||||
// return JSON.parse(localStorage.getItem('user'));
|
|
||||||
// }
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// getUserName() {
|
|
||||||
// if (this.getUser()) {
|
|
||||||
// return this.getUser().name;
|
|
||||||
// }
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// }
|
|
@ -21,13 +21,14 @@ function Header() {
|
|||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
alt='Logo - freeCodeCamp | Learn to code'
|
alt='Logo - freeCodeCamp | Learn to code'
|
||||||
src={
|
src={'https://s3.amazonaws.com/freecodecamp/freecodecamp_logo.svg'}
|
||||||
'https://s3.amazonaws.com/freecodecamp/freecodecamp_logo.svg'
|
|
||||||
}
|
|
||||||
title='freeCodeCamp | Learn to code'
|
title='freeCodeCamp | Learn to code'
|
||||||
/>
|
/>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
<Link to='/sign-in'>
|
||||||
|
<button>Sign In</button>
|
||||||
|
</Link>
|
||||||
</header>
|
</header>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
64
packages/learn/src/pages/sign-in.js
Normal file
64
packages/learn/src/pages/sign-in.js
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
import React, { PureComponent } from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { bindActionCreators } from 'redux';
|
||||||
|
|
||||||
|
import { signIn } from '../redux/app';
|
||||||
|
|
||||||
|
const mapStateToProps = () => ({});
|
||||||
|
|
||||||
|
const mapDispatchToProps = dispatch =>
|
||||||
|
bindActionCreators(
|
||||||
|
{
|
||||||
|
signIn
|
||||||
|
},
|
||||||
|
dispatch
|
||||||
|
);
|
||||||
|
|
||||||
|
const propTypes = {
|
||||||
|
signIn: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
class SignInPage extends PureComponent {
|
||||||
|
constructor(...props) {
|
||||||
|
super(...props);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
userEmail: ''
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
handleEmailChange = e => {
|
||||||
|
e.persist();
|
||||||
|
return this.setState(state => ({ ...state, userEmail: e.target.value }));
|
||||||
|
};
|
||||||
|
|
||||||
|
handleSubmit = e => {
|
||||||
|
e.preventDefault();
|
||||||
|
const { userEmail } = this.state;
|
||||||
|
this.props.signIn(userEmail);
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { userEmail } = this.state;
|
||||||
|
console.log(window.location.origin);
|
||||||
|
return (
|
||||||
|
<div id='sigin-view'>
|
||||||
|
<h2>Start coding</h2>
|
||||||
|
<form onSubmit={this.handleSubmit}>
|
||||||
|
<input
|
||||||
|
name='userEmail'
|
||||||
|
onChange={this.handleEmailChange}
|
||||||
|
type='email'
|
||||||
|
value={userEmail}
|
||||||
|
/>
|
||||||
|
<button type='submit'>Submit</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SignInPage.displayName = 'SignInPage';
|
||||||
|
SignInPage.propTypes = propTypes;
|
||||||
|
|
||||||
|
export default connect(mapStateToProps, mapDispatchToProps)(SignInPage);
|
@ -1,11 +1,21 @@
|
|||||||
import { createAction, handleActions } from 'redux-actions';
|
import { createAction, handleActions } from 'redux-actions';
|
||||||
|
|
||||||
import { createTypes } from '../../../utils/stateManagment';
|
import { createTypes } from '../../../utils/stateManagment';
|
||||||
|
import signInEpic from './sign-in-epic';
|
||||||
|
|
||||||
const ns = 'app';
|
const ns = 'app';
|
||||||
|
|
||||||
|
export const epics = [signInEpic];
|
||||||
|
|
||||||
export const types = createTypes(
|
export const types = createTypes(
|
||||||
['fetchUser', 'fetchUserComplete', 'fetchUserError'],
|
[
|
||||||
|
'fetchUser',
|
||||||
|
'fetchUserComplete',
|
||||||
|
'fetchUserError',
|
||||||
|
'signIn',
|
||||||
|
'signInComplete',
|
||||||
|
'signInError'
|
||||||
|
],
|
||||||
ns
|
ns
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -13,6 +23,10 @@ const initialState = {
|
|||||||
user: {}
|
user: {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const signIn = createAction(types.signIn);
|
||||||
|
export const signInComplete = createAction(types.signInComplete);
|
||||||
|
export const signInError = createAction(types.signInError);
|
||||||
|
|
||||||
export const fetchUser = createAction(types.fetchUser);
|
export const fetchUser = createAction(types.fetchUser);
|
||||||
export const fetchUserComplete = createAction(types.fetchUserComplete);
|
export const fetchUserComplete = createAction(types.fetchUserComplete);
|
||||||
export const fecthUserError = createAction(types.fetchUserError);
|
export const fecthUserError = createAction(types.fetchUserError);
|
||||||
|
31
packages/learn/src/redux/app/sign-in-epic.js
Normal file
31
packages/learn/src/redux/app/sign-in-epic.js
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import { ajax } from 'rxjs/observable/dom/ajax';
|
||||||
|
import { map } from 'rxjs/operators/map';
|
||||||
|
import { catchError } from 'rxjs/operators/catchError';
|
||||||
|
import { switchMap } from 'rxjs/operators/switchMap';
|
||||||
|
import { ofType } from 'redux-observable';
|
||||||
|
|
||||||
|
import { types, signInComplete, signInError } from './';
|
||||||
|
|
||||||
|
export default function signInEpic(action$, _, { window }) {
|
||||||
|
return action$.pipe(
|
||||||
|
ofType(types.signIn),
|
||||||
|
switchMap(({ payload }) => {
|
||||||
|
const request = {
|
||||||
|
url: 'http://localhost:3000/passwordless-auth',
|
||||||
|
method: 'POST',
|
||||||
|
body: { email: payload, returnTo: window.location.origin }
|
||||||
|
};
|
||||||
|
|
||||||
|
return ajax(request).pipe(
|
||||||
|
map(resp => {
|
||||||
|
console.log('RES', resp);
|
||||||
|
return signInComplete();
|
||||||
|
}),
|
||||||
|
catchError(e => {
|
||||||
|
console.warn(e);
|
||||||
|
return signInError(e);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
@ -6,8 +6,11 @@ import {
|
|||||||
import { combineEpics, createEpicMiddleware } from 'redux-observable';
|
import { combineEpics, createEpicMiddleware } from 'redux-observable';
|
||||||
import { routerReducer as router, routerMiddleware } from 'react-router-redux';
|
import { routerReducer as router, routerMiddleware } from 'react-router-redux';
|
||||||
|
|
||||||
import { reducer as app } from './app';
|
import { reducer as app, epics as appEpics } from './app';
|
||||||
import { reducer as challenge, epics } from '../templates/Challenges/redux';
|
import {
|
||||||
|
reducer as challenge,
|
||||||
|
epics as challengeEpics
|
||||||
|
} from '../templates/Challenges/redux';
|
||||||
import { reducer as map } from '../components/Map/redux';
|
import { reducer as map } from '../components/Map/redux';
|
||||||
|
|
||||||
const rootReducer = combineReducers({
|
const rootReducer = combineReducers({
|
||||||
@ -17,7 +20,7 @@ const rootReducer = combineReducers({
|
|||||||
router
|
router
|
||||||
});
|
});
|
||||||
|
|
||||||
const rootEpic = combineEpics(...epics);
|
const rootEpic = combineEpics(...appEpics, ...challengeEpics);
|
||||||
|
|
||||||
const epicMiddleware = createEpicMiddleware(rootEpic, {
|
const epicMiddleware = createEpicMiddleware(rootEpic, {
|
||||||
dependencies: {
|
dependencies: {
|
||||||
|
Reference in New Issue
Block a user