This repository has been archived on 2025-09-03. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
resolver/app/actions/commentActions.ts

237 lines
6.3 KiB
TypeScript

// - Import react components
import moment from 'moment'
// - Import domain
import { Comment } from 'domain/comments'
import { SocialError } from 'domain/common'
// - Import action types
import { CommentActionType } from 'constants/commentActionType'
// - Import actions
import * as globalActions from 'actions/globalActions'
import * as notifyActions from 'actions/notifyActions'
import { IServiceProvider, ServiceProvide } from 'factories'
import { ICommentService } from 'services/comments'
const serviceProvider: IServiceProvider = new ServiceProvide()
const commentService: ICommentService = serviceProvider.createCommentService()
/* _____________ CRUD DB _____________ */
/**
* Add comment to database
* @param {object} ownerPostUserId the identifier of the user who is the owner of the post which comment belong to
* @param {object} newComment user comment
* @param {function} callBack will be fired when server responsed
*/
export const dbAddComment = (ownerPostUserId: string,newComment: Comment, callBack: Function) => {
return (dispatch: any, getState: Function) => {
dispatch(globalActions.showTopLoading())
let uid: string = getState().authorize.uid
let comment: Comment = {
score : 0,
creationDate : moment().unix(),
userDisplayName : getState().user.info[uid].fullName,
userAvatar : getState().user.info[uid].avatar,
userId : uid,
postId: newComment.postId,
text: newComment.text
}
return commentService.addComment(newComment.postId,comment)
.then((commentKey: string) => {
dispatch(addComment({id: commentKey! ,...comment}))
callBack()
dispatch(globalActions.hideTopLoading())
if (ownerPostUserId && ownerPostUserId !== uid) {
dispatch(notifyActions.dbAddNotification(
{
description: 'Add comment on your post.',
url: `/${ownerPostUserId}/posts/${comment.postId}`,
notifyRecieverUserId: ownerPostUserId, notifierUserId: uid,
isSeen: false
}))
}
}, (error: SocialError) => {
dispatch(globalActions.showErrorMessage(error.message))
dispatch(globalActions.hideTopLoading())
})
}
}
/**
* Get all comments from database
*/
export const dbGetComments = () => {
return (dispatch: any, getState: Function) => {
let uid: string = getState().authorize.uid
if (uid) {
return commentService.getComments()
.then((comments: {[postId: string]: {[commentId: string]: Comment}}) => {
dispatch(addCommentList(comments))
})
.catch((error: SocialError) => {
dispatch(globalActions.showErrorMessage(error.message))
})
}
}
}
/**
* Update a comment from database
* @param {string} id of comment
* @param {string} postId is the identifier of the post which comment belong to
* @param {string} text is the text of comment
*/
export const dbUpdateComment = (id: string, postId: string, text: string) => {
return (dispatch: any, getState: Function) => {
dispatch(globalActions.showTopLoading())
// Get current user id
let uid: string = getState().authorize.uid
// Write the new data simultaneously in the list
let comment: Comment = getState().comment.postComments[postId][id]
let updatedComment: Comment = {
postId: postId,
score: comment.score,
text: text,
creationDate: comment.creationDate,
userDisplayName: comment.userDisplayName,
userAvatar: comment.userAvatar,
userId: uid
}
return commentService.updateComment(uid,postId,updatedComment)
.then(() => {
dispatch(updateComment( id, postId, text))
dispatch(globalActions.hideTopLoading())
}, (error: SocialError) => {
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: string, postId: string) => {
return (dispatch: any, getState: Function) => {
if (id === undefined || id === null) {
dispatch(globalActions.showErrorMessage('comment id can not be null or undefined'))
}
console.log('====================================')
console.log(id,postId)
console.log('====================================')
dispatch(globalActions.showTopLoading())
// Get current user id
let uid: string = getState().authorize.uid
return commentService.deleteComment(id,postId)
.then(() => {
dispatch(deleteComment(id, postId))
dispatch(globalActions.hideTopLoading())
}, (error: SocialError) => {
dispatch(globalActions.showErrorMessage(error.message))
dispatch(globalActions.hideTopLoading())
})
}
}
/* _____________ CRUD State _____________ */
/**
* Add comment
* @param {Comment} data
*/
export const addComment = (comment: Comment) => {
return {
type: CommentActionType.ADD_COMMENT,
payload: comment
}
}
/**
*
* @param id comment identifier
* @param postId post identefier which comment belong to
* @param text the new text for comment
*/
export const updateComment = ( id: string, postId: string, text: string) => {
return {
type: CommentActionType.UPDATE_COMMENT,
payload: {id, postId, text}
}
}
/**
* Add comment list
* @param {[postId: string]: {[commentId: string] : Comment}} postComments an array of comments
*/
export const addCommentList = (postComments: {[postId: string]: {[commentId: string]: Comment}}) => {
return {
type: CommentActionType.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: string, postId: string) => {
return { type: CommentActionType.DELETE_COMMENT, payload: { id, postId } }
}
/**
* Clear all data
*/
export const clearAllData = () => {
return {
type: CommentActionType.CLEAR_ALL_DATA_COMMENT
}
}
export const openCommentEditor = (comment: Comment) => {
return {
type: CommentActionType.OPEN_COMMENT_EDITOR,
payload: comment
}
}
export const closeCommentEditor = (comment: Comment) => {
return {
type: CommentActionType.CLOSE_COMMENT_EDITOR,
payload: comment
}
}