app/actions/commentActions.jsx
import moment from 'moment';
import { firebaseRef } from 'app/firebase/';
// - Import action types
import * as types from 'actionTypes';
// - Import actions
import * as globalActions from 'globalActions';
import * as notifyActions from 'notifyActions';
/* _____________ CRUD DB _____________ */
/**
* Add comment to database
* @param {object} newComment user comment
* @param {function} callBack will be fired when server responsed
*/
export const dbAddComment = (newComment, callBack) => {
return (dispatch, getState) => {
dispatch(globalActions.showTopLoading());
let uid = getState().authorize.uid;
let comment = {
postId: newComment.postId,
score: 0,
text: newComment.text,
creationDate: moment().unix(),
userDisplayName: getState().user.info[uid].fullName,
userAvatar: getState().user.info[uid].avatar,
userId: uid
};
let commentRef = firebaseRef.child(`postComments/${newComment.postId}`).push(comment);
return commentRef.then(() => {
dispatch(addComment(
{
comment,
postId: newComment.postId,
id: commentRef.key,
editorStatus: false
}));
callBack();
dispatch(globalActions.hideTopLoading());
if (newComment.ownerPostUserId !== uid)
dispatch(notifyActions.dbAddNotify(
{
description: 'Add comment on your post.',
url: `/${newComment.ownerPostUserId}/posts/${newComment.postId}`,
notifyRecieverUserId: newComment.ownerPostUserId, notifierUserId: uid
}));
}, (error) => {
dispatch(globalActions.showErrorMessage(error.message));
dispatch(globalActions.hideTopLoading());
})
}
}
// Get all comments from database
export const dbGetComments = () => {
return (dispatch, getState) => {
let uid = getState().authorize.uid;
if (uid) {
let commentsRef = firebaseRef.child(`postComments`);
return commentsRef.on('value', (snapshot) => {
let comments = snapshot.val() || {};
dispatch(addCommentList(comments));
});
}
}
}
/**
* Update a comment from database
* @param {string} id of comment
* @param {string} postId is the identifier of the post which comment belong to
*/
export const dbUpdateComment = (id, postId, text) => {
return (dispatch, getState) => {
dispatch(globalActions.showTopLoading());
// Get current user id
let uid = getState().authorize.uid;
// Write the new data simultaneously in the list
let updates = {};
let comment = getState().comment.postComments[postId][id];
updates[`postComments/${postId}/${id}`] = {
postId: postId,
score: comment.score,
text: text,
creationDate: comment.creationDate,
userDisplayName: comment.userDisplayName,
userAvatar: comment.userAvatar,
userId: uid
};
return firebaseRef.update(updates).then((result) => {
dispatch(updateComment({ id, postId, text, editorStatus: false }));
dispatch(globalActions.hideTopLoading());
}, (error) => {
dispatch(globalActions.showErrorMessage(error.message));
dispatch(globalActions.hideTopLoading());
});
}
}
/**
* Delete a comment from database
* @param {string} id of comment
* @param {string} postId is the identifier of the post which comment belong to
*/
export const dbDeleteComment = (id, postId) => {
return (dispatch, getState) => {
dispatch(globalActions.showTopLoading());
// Get current user id
let uid = getState().authorize.uid;
// Write the new data simultaneously in the list
let updates = {};
updates[`postComments/${postId}/${id}`] = null;
return firebaseRef.update(updates).then((result) => {
dispatch(deleteComment(id, postId));
dispatch(globalActions.hideTopLoading());
}, (error) => {
dispatch(globalActions.showErrorMessage(error.message));
dispatch(globalActions.hideTopLoading());
});
}
}
/* _____________ CRUD State _____________ */
/**
* Add comment
* @param {object} data
*/
export const addComment = (data) => {
return {
type: types.ADD_COMMENT,
payload: data
};
}
/**
* Update comment
* @param {object} data
*/
export const updateComment = (data) => {
return {
type: types.UPDATE_COMMENT,
payload: data
};
}
/**
* Add comment list
* @param {[object]} postComments an array of comments
*/
export const addCommentList = (postComments) => {
return {
type: types.ADD_COMMENT_LIST,
payload: postComments
};
}
/**
* Delete a comment
* @param {string} id of comment
* @param {string} postId is the identifier of the post which comment belong to
*/
export const deleteComment = (id, postId) => {
return { type: types.DELETE_COMMENT, payload: { id, postId } };
}
// Clear all data
export const clearAllData = () => {
return {
type: types.CLEAR_ALL_DATA_COMMENT
};
}
export const openCommentEditor = (comment) => {
return {
type: types.OPEN_COMMENT_EDITOR,
payload: comment
};
}
export const closeCommentEditor = (comment) => {
return {
type: types.CLOSE_COMMENT_EDITOR,
payload: comment
};
}