Home Reference Source

app/actions/authorizeActions.jsx

import { firebaseRef, firebaseAuth } from 'app/firebase/';
import moment from 'moment';
import { push } from 'react-router-redux';

// - Import action types
import * as types from 'actionTypes';

// - Import actions
import * as globalActions from 'globalActions';

/* _____________ CRUD DB _____________ */

/**
 * Log in user in server
 * @param {string} email 
 * @param {string} password 
 */
export var dbLogin = (email, password) => {
    return (dispatch, getState) => {

        // Encrypt password input to compare with that stored in db
        let bcrypt = require('bcryptjs');
        let ref = firebase.database().ref('/users');;
        ref.once('value', (snapshot) => {
            // find info of user with proper email
            let key;
            for (key in snapshot.val()) {
                let info = snapshot.val()[key]['info'];
                if (email.localeCompare(info.email) === 0) {
                    console.log(info.password);
                    if(info.password) {
                        password = bcrypt.compareSync(password, info.password) ? info.password : password;
                    }
                    break;
                };
            }
            // Log in user if input matches credentials in db
            return firebaseAuth().signInWithEmailAndPassword(email, password).then((result) => {
                dispatch(globalActions.showNotificationSuccess());
                dispatch(login(result.uid));
                dispatch(push('/'));
            }, (error) => dispatch(globalActions.showErrorMessage(error.code)))
        });
    }
}

// Log out user in server
export var dbLogout = () => {
    return (dispatch, getState) => {
        return firebaseAuth().signOut().then((result) => {
            dispatch(logout());
            dispatch(push('/login'));

        }, (error) => dispatch(globalActions.showErrorMessage(error.code)));
    }
}

/**
 * Register user in database
 * @param {object} user 
 */
export var dbSignup = (user) => {
    return (dispatch, getState) => {
        dispatch(globalActions.showNotificationRequest());
        return firebaseAuth().createUserWithEmailAndPassword(user.email, user.password).then((signupResult) => {
            firebaseRef.child(`users/${signupResult.uid}/info`).set({
                ...user,
                avatar: 'noImage'
            }).then((result) => {
                dispatch(globalActions.showNotificationSuccess())
            }, (error) => dispatch(globalActions.showErrorMessage(error.code)));

            dispatch(signup({
                uid: signupResult.uid,
                ...user
            }));

            dispatch(push('/'));
        }, (error) => dispatch(globalActions.showErrorMessage(error.code)))
    }

}

/**
 * Change user's password
 * @param {string} newPassword 
 */
export const dbUpdatePassword = (newPassword) => {
    return (dispatch, getState) => {
        dispatch(globalActions.showNotificationRequest());
        firebaseAuth().onAuthStateChanged((user) => {
            if (user) {
                user.updatePassword(newPassword).then(() => {
                    // Update successful.
                    dispatch(globalActions.showNotificationSuccess());
                    dispatch(updatePassword());
                    dispatch(push('/'));
                }, (error) => {
                    // An error happened.
                    switch (error.code) {
                        case 'auth/requires-recent-login':
                            dispatch(globalActions.showErrorMessage(error.code));
                            dispatch(dbLogout());
                            break;
                        default:
                    }
                })
            }

        })
    }
}

/* _____________ CRUD State _____________ */

/**
 * Loing user
 * @param {string} uid 
 */
export var login = (uid) => {
    return { type: types.LOGIN, authed: true, uid };
}

/**
 * Logout user
 */
export var logout = () => {
    return { type: types.LOGOUT };
}

/**
 *  Register user
 * @param {object} user 
 */
export var signup = (user) => {
    return {
        type: types.SIGNUP,
        ...user
    };
}

/**
 * Update user's password
 */
export const updatePassword = () => {
    return { type: types.UPDATE_PASSWORD };
}