2018-01-01 15:52:03 -06:00
|
|
|
//@flow
|
2019-02-09 18:58:16 +00:00
|
|
|
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 = {
|
|
|
|
|
name: string,
|
|
|
|
|
token: string,
|
|
|
|
|
tokenExpires: number,
|
|
|
|
|
email: string,
|
|
|
|
|
photo: string,
|
|
|
|
|
provider: AUTH_PROVIDER,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class AuthManager {
|
|
|
|
|
user: ?User;
|
|
|
|
|
|
|
|
|
|
getToken = () => {
|
|
|
|
|
return this.user && this.user.token;
|
|
|
|
|
};
|
|
|
|
|
|
2018-01-27 16:56:01 -06:00
|
|
|
getAuthHeader = () => {
|
|
|
|
|
const { token, provider } = this.user || {};
|
|
|
|
|
|
|
|
|
|
switch (provider) {
|
|
|
|
|
case AUTH_PROVIDER_FACEBOOK:
|
|
|
|
|
return { authorization: `facebook-token ${token}` };
|
|
|
|
|
default:
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
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) {
|
2019-02-09 18:58:16 +00:00
|
|
|
this.setUser({});
|
2018-08-25 12:13:09 -05:00
|
|
|
return;
|
|
|
|
|
}
|
2019-02-09 18:58:16 +00:00
|
|
|
|
|
|
|
|
this.setUser({
|
2018-08-25 12:13:09 -05:00
|
|
|
token: auth0User.accessToken,
|
|
|
|
|
tokenExpires: +moment().add(auth0User.expiresIn, 'seconds'),
|
2019-02-09 18:58:16 +00:00
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
setUser = ({ token, tokenExpires }) => {
|
|
|
|
|
if (!token || +moment(tokenExpires) <= +moment()) {
|
|
|
|
|
this.user = null;
|
|
|
|
|
AsyncStorage.removeItem('user');
|
|
|
|
|
} else {
|
|
|
|
|
this.user = { token, tokenExpires };
|
|
|
|
|
AsyncStorage.setItem('user', JSON.stringify(this.user));
|
|
|
|
|
}
|
2018-08-25 12:13:09 -05:00
|
|
|
};
|
|
|
|
|
|
2019-02-09 18:58:16 +00:00
|
|
|
checkIsAuthed = async () => {
|
|
|
|
|
const user = JSON.parse(await AsyncStorage.getItem('user'));
|
|
|
|
|
if (user) {
|
|
|
|
|
this.setUser(user);
|
|
|
|
|
return this.user;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
authenticate = async ({ email, password }) => {
|
|
|
|
|
this.setAuth0User(await loginAuth0({ email, password }));
|
2018-01-01 15:52:03 -06:00
|
|
|
};
|
2018-01-27 16:56:01 -06:00
|
|
|
|
|
|
|
|
deauthenticate = () => {
|
|
|
|
|
this.user = null;
|
2019-06-29 10:43:34 -05:00
|
|
|
return AsyncStorage.removeItem('user');
|
2018-01-27 16:56:01 -06:00
|
|
|
};
|
2019-02-09 18:58:16 +00:00
|
|
|
|
|
|
|
|
createUser = async user => {
|
|
|
|
|
return createAuth0User(user);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
resetPassword = () => {
|
|
|
|
|
return resetAuth0Password();
|
|
|
|
|
};
|
2018-01-01 15:52:03 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default new AuthManager();
|