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/voteActions.jsx
2017-07-06 11:20:18 +04:30

131 lines
3.0 KiB
JavaScript

// - Import react components
import {createAction as action} from 'redux-actions'
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 vote to database
* @param {string} postId is the identifier of the post which user vote
*/
export const dbAddVote = (postId,ownerPostUserId) => {
return (dispatch, getState) => {
var uid = getState().authorize.uid
var vote = {
postId: postId,
creationDate: moment().unix(),
userDisplayName: getState().user.info[uid].fullName,
userAvatar: getState().user.info[uid].avatar,
userId: uid
}
var voteRef = firebaseRef.child(`postVotes/${postId}`).push(vote)
return voteRef.then(() => {
dispatch(addVote(
{
vote,
postId: postId,
id: voteRef.key
}))
if(uid !== ownerPostUserId)
dispatch(notifyActions.dbAddNotify(
{
description:'Vote on your post.',
url:`/${ownerPostUserId}/posts/${postId}`,
notifyRecieverUserId:ownerPostUserId,notifierUserId:uid
}))
}, (error) => dispatch(globalActions.showErrorMessage(error.message)))
}
}
/**
* Get all votes from database
*/
export const dbGetVotes = () => {
return (dispatch, getState) => {
var uid = getState().authorize.uid
if (uid) {
var votesRef = firebaseRef.child(`postVotes`);
return votesRef.on('value',(snapshot) => {
var votes = snapshot.val() || {};
dispatch(addVoteList(votes))
})
}
}
}
/**
* Delete a vote from database
* @param {string} id of vote
* @param {string} postId is the identifier of the post which vote belong to
*/
export const dbDeleteVote = (postId) => {
return (dispatch, getState) => {
// Get current user id
var uid = getState().authorize.uid
// Write the new data simultaneously in the list
var updates = {};
let votes = getState().vote.postVotes[postId]
let id = Object.keys(votes).filter((key)=> votes[key].userId === uid)[0]
console.log(' Id : ',id)
updates[`postVotes/${postId}/${id}`] = null;
return firebaseRef.update(updates).then((result) => {
dispatch(deleteVote({id, postId}))
}, (error) => dispatch(globalActions.showErrorMessage(error.message)))
}
}
/**
* Add a vote
* @param {object} data
*/
export const addVote = (data) => {
return { type: types.ADD_VOTE, payload: data }
}
/**
* delete a vote
* @param {object} data
*/
export const deleteVote = (data) => {
return { type: types.DELETE_VOTE, payload: data }
}
/**
* Ad a list of vote
* @param {object} data
*/
export const addVoteList = (data) => {
return { type: types.ADD_VOTE_LIST, payload: data }
}
/**
* Clear all data
*/
export const clearAllvotes = () => {
return { type: types.CLEAR_ALL_DATA_VOTE }
}