aretherecookies-mobile/js/AuthManager.js

109 lines
2.2 KiB
JavaScript
Raw Permalink Normal View History

2018-01-01 15:52:03 -06:00
//@flow
import { type Auth0User, loginAuth0, createAuth0User, resetAuth0Password } from './apis/Auth0';
2018-01-01 15:52:03 -06:00
import moment from 'moment';
2019-09-26 16:48:07 -05:00
import AsyncStorage from '@react-native-community/async-storage';
2018-01-01 15:52:03 -06:00
export const AUTH_PROVIDER_FACEBOOK: 'facebook' = 'facebook';
2018-05-11 16:42:27 -05:00
export const AUTH_PROVIDER_GOOGLE: 'google' = 'google';
2018-08-25 12:13:09 -05:00
export const AUTH_PROVIDER_AUTH0: 'auth0' = 'auth0';
2018-01-01 15:52:03 -06:00
2018-08-25 12:13:09 -05:00
export type AUTH_PROVIDER =
| typeof AUTH_PROVIDER_FACEBOOK
| typeof AUTH_PROVIDER_GOOGLE
| typeof AUTH_PROVIDER_AUTH0;
2018-01-01 15:52:03 -06:00
export type User = {
2020-03-29 19:47:33 +00:00
id: string,
2018-01-01 15:52:03 -06:00
name: string,
token: string,
tokenExpires: number,
email: string,
photo: string,
provider: AUTH_PROVIDER,
};
2020-03-29 19:47:33 +00:00
export type EmailAndPassword = {
email: string,
password: string,
};
2018-01-01 15:52:03 -06:00
class AuthManager {
user: ?User;
getToken = () => {
return this.user && this.user.token;
};
2020-03-29 19:47:33 +00:00
getEmail = () => {
return this.user && this.user.email;
};
2020-03-29 19:47:33 +00:00
getId = () => {
return this.user && this.user.id;
};
getAuthHeader = () => {
const { token } = this.user || {};
return { authorization: `auth0-token ${token || ''}` };
};
2018-01-01 15:52:03 -06:00
isLoggedIn = () => {
if (!this.user) {
return false;
}
const { token, tokenExpires } = this.user;
return token && +moment(tokenExpires) >= +moment();
};
2018-08-25 12:13:09 -05:00
setAuth0User = (auth0User: Auth0User) => {
if (!auth0User) {
this.setUser({});
2018-08-25 12:13:09 -05:00
return;
}
this.setUser({
2020-03-29 19:47:33 +00:00
email: auth0User.email,
2018-08-25 12:13:09 -05:00
token: auth0User.accessToken,
tokenExpires: +moment().add(auth0User.expiresIn, 'seconds'),
2020-03-29 19:47:33 +00:00
id: auth0User.idToken,
});
};
2020-03-29 19:47:33 +00:00
setUser = user => {
if (!user.token || +moment(user.tokenExpires) <= +moment()) {
this.user = null;
AsyncStorage.removeItem('user');
} else {
2020-03-29 19:47:33 +00:00
this.user = user;
AsyncStorage.setItem('user', JSON.stringify(this.user));
}
2018-08-25 12:13:09 -05:00
};
checkIsAuthed = async () => {
const user = JSON.parse(await AsyncStorage.getItem('user'));
if (user) {
this.setUser(user);
}
2020-03-29 19:47:33 +00:00
return this.isLoggedIn();
};
authenticate = async ({ email, password }) => {
this.setAuth0User(await loginAuth0({ email, password }));
2018-01-01 15:52:03 -06:00
};
deauthenticate = () => {
this.user = null;
return AsyncStorage.removeItem('user');
};
createUser = async user => {
return createAuth0User(user);
};
resetPassword = () => {
return resetAuth0Password();
};
2018-01-01 15:52:03 -06:00
}
export default new AuthManager();