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/postActions.ts

317 lines
7.9 KiB
TypeScript

// - Import react components
import { Action } from 'redux'
// - Import domain
import { Post } from 'domain/posts'
import { SocialError } from 'domain/common'
// - Import utility components
import moment from 'moment'
// - Import action types
import { PostActionType } from 'constants/postActionType'
// - Import actions
import * as globalActions from 'actions/globalActions'
import { IServiceProvider, ServiceProvide } from 'factories'
import { IPostService } from 'services/posts'
const serviceProvider: IServiceProvider = new ServiceProvide()
const postService: IPostService = serviceProvider.createPostService()
/* _____________ CRUD DB _____________ */
/**
* Add a normal post
* @param {any} newPost
* @param {Function} callBack
*/
export let dbAddPost = (newPost: any, callBack: Function) => {
return (dispatch: any, getState: Function) => {
let uid: string = getState().authorize.uid
let post: Post = {
postTypeId: 0,
creationDate: moment().unix(),
deleteDate: 0,
score: 0,
viewCount: 0,
body: newPost.body,
ownerUserId: uid,
ownerDisplayName: newPost.name,
ownerAvatar: newPost.avatar,
lastEditDate: 0,
tags: newPost.tags || [],
commentCounter: 0,
image: '',
imageFullPath: '',
video: '',
disableComments: newPost.disableComments,
disableSharing: newPost.disableSharing,
deleted: false
}
return postService.addPost(uid,post).then((postKey: string) => {
dispatch(addPost(uid, {
...post,
id: postKey
}))
callBack()
})
.catch((error: SocialError) => dispatch(globalActions.showErrorMessage(error.message)))
}
}
/**
* Add a post with image
* @param {object} newPost
* @param {function} callBack
*/
export const dbAddImagePost = (newPost: any, callBack: Function) => {
return (dispatch: any, getState: Function) => {
dispatch(globalActions.showTopLoading())
let uid: string = getState().authorize.uid
let post: Post = {
postTypeId: 1,
creationDate: moment().unix(),
deleteDate: 0,
score: 0,
viewCount: 0,
body: newPost.body,
ownerUserId: uid,
ownerDisplayName: newPost.name,
ownerAvatar: newPost.avatar,
lastEditDate: 0,
tags: newPost.tags || [],
commentCounter: 0,
image: newPost.image || '',
imageFullPath: newPost.imageFullPath || '',
video: '',
disableComments: newPost.disableComments ? newPost.disableComments : false,
disableSharing: newPost.disableSharing ? newPost.disableSharing : false,
deleted: false
}
return postService.addPost(uid,post).then((postKey: string) => {
dispatch(addPost(uid, {
...post,
id: postKey
}))
callBack()
dispatch(globalActions.hideTopLoading())
})
.catch((error: SocialError) => dispatch(globalActions.showErrorMessage(error.message)))
}
}
/**
* Update a post from database
* @param {object} newPost
* @param {func} callBack //TODO: anti pattern should change to parent state or move state to redux
*/
export const dbUpdatePost = (newPost: any, callBack: Function) => {
console.log(newPost)
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 updates: any = {}
let post: Post = getState().post.userPosts[uid][newPost.id]
let updatedPost: Post = {
postTypeId: post.postTypeId,
creationDate: post.creationDate,
deleteDate: 0,
score: post.score,
viewCount: post.viewCount,
body: newPost.body ? newPost.body : post.body || '',
ownerUserId: uid,
ownerDisplayName: post.ownerDisplayName,
ownerAvatar: post.ownerAvatar,
lastEditDate: moment().unix(),
tags: newPost.tags ? newPost.tags : (post.tags || []),
commentCounter: post.commentCounter,
image: newPost.image ? newPost.image : post.image,
imageFullPath: newPost.imageFullPath!,
video: '',
disableComments: newPost.disableComments !== undefined ? newPost.disableComments : (post.disableComments ? post.disableComments : false),
disableSharing: newPost.disableSharing !== undefined ? newPost.disableSharing : (post.disableSharing ? post.disableSharing : false),
deleted: false
}
return postService.updatePost(uid,newPost.id,updatedPost).then(() => {
dispatch(updatePost(uid, { id: newPost.id, ...updatedPost }))
callBack()
dispatch(globalActions.hideTopLoading())
})
.catch((error: SocialError) => {
dispatch(globalActions.showErrorMessage(error.message))
dispatch(globalActions.hideTopLoading())
})
}
}
/**
* Delete a post from database
* @param {string} id is post identifier
*/
export const dbDeletePost = (id: string) => {
return (dispatch: any, getState: Function) => {
dispatch(globalActions.showTopLoading())
// Get current user id
let uid: string = getState().authorize.uid
return postService.deletePost(uid,id).then(() => {
dispatch(deletePost(uid, id))
dispatch(globalActions.hideTopLoading())
})
.catch((error: SocialError) => {
dispatch(globalActions.showErrorMessage(error.message))
dispatch(globalActions.hideTopLoading())
})
}
}
/**
* Get all user posts from data base
*/
export const dbGetPosts = () => {
return (dispatch: any, getState: Function) => {
let uid: string = getState().authorize.uid
if (uid) {
return postService.getPosts(uid).then((posts: { [postId: string]: Post }) => {
dispatch(addPosts(uid, posts))
})
.catch((error: SocialError) => {
dispatch(globalActions.showErrorMessage(error.message))
})
}
}
}
/**
* Get all user posts from data base
* @param uid post owner identifier
* @param postId post identifier
*/
export const dbGetPostById = (uid: string, postId: string) => {
return (dispatch: any, getState: Function) => {
if (uid) {
return postService.getPostById(uid,postId).then((post: Post) => {
dispatch(addPost(uid, post))
})
.catch((error: SocialError) => {
dispatch(globalActions.showErrorMessage(error.message))
})
}
}
}
/**
* Get all user posts from data base by user id
* @param uid posts owner identifier
*/
export const dbGetPostsByUserId = (uid: string) => {
return (dispatch: any, getState: Function) => {
if (uid) {
return postService.getPosts(uid).then((posts: { [postId: string]: Post }) => {
dispatch(addPosts(uid, posts))
})
}
}
}
/* _____________ CRUD State _____________ */
/**
* Add a normal post
* @param {string} uid is user identifier
* @param {Post} post
*/
export const addPost = (uid: string, post: Post) => {
return {
type: PostActionType.ADD_POST,
payload: { uid, post }
}
}
/**
* Update a post
* @param {string} uid is user identifier
* @param {Post} post
*/
export const updatePost = (uid: string, post: Post) => {
return {
type: PostActionType.UPDATE_POST,
payload: { uid, post }
}
}
/**
* Delete a post
* @param {string} uid is user identifier
* @param {string} id is post identifier
*/
export const deletePost = (uid: string, id: string) => {
return {
type: PostActionType.DELETE_POST,
payload: { uid, id }
}
}
/**
* Add a list of post
* @param {string} uid
* @param {[object]} posts
*/
export const addPosts = (uid: string, posts: { [postId: string]: Post }) => {
return {
type: PostActionType.ADD_LIST_POST,
payload: { uid, posts }
}
}
/**
* Clea all data in post store
*/
export const clearAllData = () => {
return {
type: PostActionType.CLEAR_ALL_DATA_POST
}
}
/**
* Add a post with image
* @param {object} post
*/
export const addImagePost = (uid: string, post: any) => {
return {
type: PostActionType.ADD_IMAGE_POST,
payload: { uid, post }
}
}