120 lines
2.9 KiB
TypeScript
120 lines
2.9 KiB
TypeScript
// - Import react components
|
|
import moment from 'moment'
|
|
import _ from 'lodash'
|
|
|
|
// - Import domain
|
|
import { User } from 'domain/users'
|
|
import { Comment } from 'domain/comments'
|
|
|
|
// - Import action types
|
|
import { CommentActionType } from 'constants/commentActionType'
|
|
|
|
import { CommentState } from './CommentState'
|
|
import { ICommentAction } from './ICommentAction'
|
|
|
|
/**
|
|
* Comment reducer
|
|
* @param state
|
|
* @param action
|
|
*/
|
|
export let commentReducer = (state: CommentState = new CommentState(), action: ICommentAction) => {
|
|
let { payload } = action
|
|
switch (action.type) {
|
|
|
|
/* _____________ CRUD _____________ */
|
|
case CommentActionType.ADD_COMMENT:
|
|
return {
|
|
...state,
|
|
postComments: {
|
|
...state.postComments,
|
|
[payload.postId]: {
|
|
...state.postComments![payload.postId],
|
|
[payload.id]: {
|
|
...payload,
|
|
editorStatus: false
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
case CommentActionType.ADD_COMMENT_LIST:
|
|
return {
|
|
...state,
|
|
postComments: {
|
|
...payload
|
|
},
|
|
loaded: true
|
|
}
|
|
case CommentActionType.UPDATE_COMMENT:
|
|
return {
|
|
...state,
|
|
postComments: {
|
|
...state.postComments,
|
|
[payload.postId]: {
|
|
...state.postComments![payload.postId],
|
|
[payload.id]: {
|
|
...state.postComments![payload.postId][payload.id],
|
|
text: payload.text,
|
|
editorStatus: false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
case CommentActionType.DELETE_COMMENT:
|
|
let parsedComments = {}
|
|
if (!state.postComments![payload.postId]) {
|
|
return state
|
|
}
|
|
Object.keys(state.postComments![payload.postId]).map((id) => {
|
|
if (id !== payload.id) {
|
|
_.merge(parsedComments, { [id]: { ...state.postComments![payload.postId][id] } })
|
|
}
|
|
|
|
})
|
|
return {
|
|
...state,
|
|
postComments: {
|
|
...state.postComments,
|
|
[payload.postId]: {
|
|
...parsedComments
|
|
}
|
|
}
|
|
}
|
|
case CommentActionType.CLOSE_COMMENT_EDITOR:
|
|
return {
|
|
...state,
|
|
postComments: {
|
|
...state.postComments,
|
|
[payload.postId]: {
|
|
...state.postComments![payload.postId],
|
|
[payload.id]: {
|
|
...state.postComments![payload.postId][payload.id],
|
|
editorStatus: false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
case CommentActionType.OPEN_COMMENT_EDITOR:
|
|
return {
|
|
...state,
|
|
postComments: {
|
|
...state.postComments,
|
|
[payload.postId]: {
|
|
...state.postComments![payload.postId],
|
|
[payload.id]: {
|
|
...state.postComments![payload.postId][payload.id],
|
|
editorStatus: true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
case CommentActionType.CLEAR_ALL_DATA_COMMENT:
|
|
return new CommentState()
|
|
default:
|
|
return state
|
|
|
|
}
|
|
|
|
}
|