//@flow import { type Auth0User, loginAuth0, createAuth0User, resetAuth0Password } from './apis/Auth0'; import moment from 'moment'; import AsyncStorage from '@react-native-community/async-storage'; export const AUTH_PROVIDER_FACEBOOK: 'facebook' = 'facebook'; export const AUTH_PROVIDER_GOOGLE: 'google' = 'google'; export const AUTH_PROVIDER_AUTH0: 'auth0' = 'auth0'; export type AUTH_PROVIDER = | typeof AUTH_PROVIDER_FACEBOOK | typeof AUTH_PROVIDER_GOOGLE | typeof AUTH_PROVIDER_AUTH0; export type User = { id: string, name: string, token: string, tokenExpires: number, email: string, photo: string, provider: AUTH_PROVIDER, }; export type EmailAndPassword = { email: string, password: string, }; class AuthManager { user: ?User; getToken = () => { return this.user && this.user.token; }; getEmail = () => { return this.user && this.user.email; }; getId = () => { return this.user && this.user.id; }; getAuthHeader = () => { const { token } = this.user || {}; return { authorization: `auth0-token ${token || ''}` }; }; isLoggedIn = () => { if (!this.user) { return false; } const { token, tokenExpires } = this.user; return token && +moment(tokenExpires) >= +moment(); }; setAuth0User = (auth0User: Auth0User) => { if (!auth0User) { this.setUser({}); return; } this.setUser({ email: auth0User.email, token: auth0User.accessToken, tokenExpires: +moment().add(auth0User.expiresIn, 'seconds'), id: auth0User.idToken, }); }; setUser = user => { if (!user.token || +moment(user.tokenExpires) <= +moment()) { this.user = null; AsyncStorage.removeItem('user'); } else { this.user = user; AsyncStorage.setItem('user', JSON.stringify(this.user)); } }; checkIsAuthed = async () => { const user = JSON.parse(await AsyncStorage.getItem('user')); if (user) { this.setUser(user); } return this.isLoggedIn(); }; authenticate = async ({ email, password }) => { this.setAuth0User(await loginAuth0({ email, password })); }; deauthenticate = () => { this.user = null; return AsyncStorage.removeItem('user'); }; createUser = async user => { return createAuth0User(user); }; resetPassword = () => { return resetAuth0Password(); }; } export default new AuthManager();