RC-4: create authService
This commit is contained in:
137
src/app/services/authService.js
Normal file
137
src/app/services/authService.js
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
import FuseUtils from '@fuse/utils/FuseUtils';
|
||||||
|
import _ from '@lodash';
|
||||||
|
import * as firebaseAuth from 'firebase/auth';
|
||||||
|
import * as firebaseDb from 'firebase/database';
|
||||||
|
|
||||||
|
export default class AuthService extends FuseUtils.EventEmitter {
|
||||||
|
#auth;
|
||||||
|
|
||||||
|
#db;
|
||||||
|
|
||||||
|
init(authInstance, dbInstance) {
|
||||||
|
this.#auth = authInstance;
|
||||||
|
this.#db = dbInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
createUser = ({ displayName, email, password }) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
firebaseAuth
|
||||||
|
.createUserWithEmailAndPassword(this.#auth, email, password)
|
||||||
|
.then((userCredential) => firebaseAuth.updateProfile(userCredential.user, { displayName }))
|
||||||
|
.then(() => {
|
||||||
|
const userRef = firebaseDb.ref(this.#db, `users/${this.#auth.currentUser.uid}`);
|
||||||
|
const value = { role: 'user', data: { displayName, email } };
|
||||||
|
|
||||||
|
return firebaseDb.set(userRef, value);
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
resolve();
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
signInWithEmailAndPassword = ({ email, password, remember }) => {
|
||||||
|
const persistence = remember
|
||||||
|
? firebaseAuth.browserLocalPersistence
|
||||||
|
: firebaseAuth.browserSessionPersistence;
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
firebaseAuth
|
||||||
|
.setPersistence(this.#auth, persistence)
|
||||||
|
.then(() => firebaseAuth.signInWithEmailAndPassword(this.#auth, email, password))
|
||||||
|
.then((userCredential) => {
|
||||||
|
resolve(userCredential.user);
|
||||||
|
const { user } = userCredential;
|
||||||
|
this.emit('onLogin', {
|
||||||
|
role: 'user',
|
||||||
|
data: { displayName: user.displayName, photoURL: user.photoURL, email: user.email },
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
updateUserData = (user) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
if (_.isEmpty(user)) {
|
||||||
|
reject(Error('User data is empty'));
|
||||||
|
}
|
||||||
|
|
||||||
|
const userRef = firebaseDb.ref(this.#db, `users/${this.#auth.currentUser.uid}`);
|
||||||
|
const value = { data: { ...user } };
|
||||||
|
|
||||||
|
firebaseDb
|
||||||
|
.set(userRef, value)
|
||||||
|
.then(() => {
|
||||||
|
if (user.email) {
|
||||||
|
return firebaseAuth.updateEmail(this.#auth, user.email);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
resolve();
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
logout = () => {
|
||||||
|
this.#auth
|
||||||
|
.signOut()
|
||||||
|
.then(() => {
|
||||||
|
this.emit('onLogout', 'Logged out');
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.warn('Logout error: ', error);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
getUserData = (userId) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const userRef = firebaseDb.ref(this.#db, `users/${userId}`);
|
||||||
|
firebaseDb.onValue(
|
||||||
|
userRef,
|
||||||
|
(snapshot) => {
|
||||||
|
const user = snapshot.val();
|
||||||
|
resolve(user);
|
||||||
|
},
|
||||||
|
(error) => {
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
sendPasswordResetEmail = (email) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
if (email) {
|
||||||
|
reject(Error('Email is empty'));
|
||||||
|
}
|
||||||
|
|
||||||
|
firebaseAuth
|
||||||
|
.sendPasswordResetEmail(this.#auth, email)
|
||||||
|
.then(() => {
|
||||||
|
resolve();
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
onAuthStateChanged = (callback) => {
|
||||||
|
if (!this.#auth) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.#auth.onAuthStateChanged(callback);
|
||||||
|
};
|
||||||
|
}
|
||||||
18
src/app/services/index.js
Normal file
18
src/app/services/index.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import AuthService from './authService';
|
||||||
|
import FirebaseService from './firebaseService';
|
||||||
|
// TODO: change to firebase secrets or to use firebase functions
|
||||||
|
const firebaseConfig = {
|
||||||
|
apiKey: 'AIzaSyBqMGmOF0-DkYDpnsmZwpf5S8w5cL3fBb8',
|
||||||
|
authDomain: 'rental-calculator-13a9e.firebaseapp.com',
|
||||||
|
databaseURL: 'https://rental-calculator-13a9e-default-rtdb.firebaseio.com',
|
||||||
|
projectId: 'rental-calculator-13a9e',
|
||||||
|
storageBucket: 'rental-calculator-13a9e.appspot.com',
|
||||||
|
messagingSenderId: '479612883365',
|
||||||
|
appId: '1:479612883365:web:fde2d2632ce4c42ce5184c',
|
||||||
|
measurementId: 'G-JW7J8ZQ9FJ',
|
||||||
|
};
|
||||||
|
|
||||||
|
const firebase = new FirebaseService(firebaseConfig);
|
||||||
|
const authService = new AuthService();
|
||||||
|
|
||||||
|
export { authService, firebase };
|
||||||
Reference in New Issue
Block a user