app/actions/userActions.jsx
import { firebaseRef } from 'app/firebase/';
// - Import action types
import * as types from 'actionTypes';
// - Import actions
import * as globalActions from 'globalActions';
import * as userActions from 'userActions';
/* _____________ CRUD DB _____________ */
// Get user info from database
export const dbGetUserInfo = () => {
console.log("OUTPUT: in dbGetUserInfo");
return (dispatch, getState) => {
let uid = getState().authorize.uid;
if (uid) {
let userInfoRef = firebaseRef.child(`users/${uid}/info`);
return userInfoRef.once('value').then((snapshot) => {
let userInfo = snapshot.val() || {};
dispatch(addUserInfo(uid, {
avatar: userInfo.avatar,
email: userInfo.email,
fullName: userInfo.fullName,
banner: userInfo.banner,
tagLine: userInfo.tagLine,
password: userInfo.password
}));
}, error => console.log(error));
}
};
}
/**
* Get user info from database
* @param {string} uid
*/
export const dbGetUserInfoByUserId = (uid, sw) => {
console.log("OUTPUT: in dbGetUserInfoByUserId");
return (dispatch, getState) => {
if (uid) {
let userInfoRef = firebaseRef.child(`users/${uid}/info`);
return userInfoRef.once('value').then((snapshot) => {
let userInfo = snapshot.val() || {};
dispatch(addUserInfo(uid, {
avatar: userInfo.avatar,
email: userInfo.email,
fullName: userInfo.fullName,
banner: userInfo.banner,
tagLine: userInfo.tagLine,
password: userInfo.password
}));
switch (sw) {
case 'header':
dispatch(globalActions.setHeaderTitle(userInfo.fullName));
break;
default:
break;
}
}, error => console.log(error));
}
};
}
/**
* Updata user information
* @param {object} newInfo
*/
export const dbUpdateUserInfo = (newInfo) => {
console.log("OUTPUT: in dbUpdateUserInfo");
return (dispatch, getState) => {
// Get current user id
let uid = getState().authorize.uid;
// Write the new data simultaneously in the list
let updates = {};
let info = getState().user.info[uid];
let updatedInfo = {
avatar: newInfo.avatar || info.avatar || '',
banner: newInfo.banner || info.banner || 'https://firebasestorage.googleapis.com/v0/b/open-social-33d92.appspot.com/o/images%2F751145a1-9488-46fd-a97e-04018665a6d3.JPG?alt=media&token=1a1d5e21-5101-450e-9054-ea4a20e06c57',
email: newInfo.email || info.email || '',
fullName: newInfo.fullName || info.fullName || '',
tagLine: newInfo.tagLine || info.tagLine || '',
password: info.password || ''
};
updates[`users/${uid}/info`] = updatedInfo;
return firebaseRef.update(updates).then((result) => {
dispatch(updateUserInfo(uid, updatedInfo));
dispatch(closeEditProfile());
}, (error) => {
dispatch(globalActions.showErrorMessage(error.message));
});
};
}
// - Get people info from database
export const dbGetPeopleInfo = () => {
console.log("OUTPUT: in dbGetPeopleInfo");
return (dispatch, getState) => {
let uid = getState().authorize.uid;
if (uid) {
let peopleRef = firebaseRef.child(`users`);
return peopleRef.once('value').then((snapshot) => {
let people = snapshot.val() || {};
let parsedPeople = {};
Object.keys(people).forEach((userId) => {
if (userId !== uid) {
let userInfo = people[userId].info;
parsedPeople[userId] = {
avatar: userInfo.avatar,
email: userInfo.email,
fullName: userInfo.fullName,
banner: userInfo.banner,
tagLine: userInfo.tagLine,
password: userInfo.password
};
}
});
dispatch(addPeopleInfo(parsedPeople));
}, error => console.log(error));
}
};
}
/* _____________ CRUD State _____________ */
/**
* Add user information
* @param {string} uid is the user identifier
* @param {object} info is the information about user
*/
export const addUserInfo = (uid, info) => {
return {
type: types.ADD_USER_INFO,
payload: { uid, info }
};
}
/**
* Add people information
* @param {[object]} infoList is the lst of information about users
*/
export const addPeopleInfo = (infoList) => {
return {
type: types.ADD_PEOPLE_INFO,
payload: infoList
};
}
/**
* Update user information
* @param {string} uid is the user identifier
* @param {object} info is the information about user
*/
export const updateUserInfo = (uid, info) => {
return {
type: types.UPDATE_USER_INFO,
payload: { uid, info }
};
}
/**
* User info
* @param {object} info
*/
export const userInfo = (info) => {
return {
type: types.USER_INFO,
info
};
}
export const clearAllData = () => {
return {
type: types.CLEAR_ALL_DATA_USER
};
}
// Open edit profile
export const openEditProfile = () => {
return {
type: types.OPEN_EDIT_PROFILE
};
}
// Close edit profile
export const closeEditProfile = () => {
return {
type: types.CLOSE_EDIT_PROFILE
};
}