Home Reference Source

app/actions/voteActions.jsx

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) => {
        let uid = getState().authorize.uid;
        let vote = {
            postId: postId,
            creationDate: moment().unix(),
            userDisplayName: getState().user.info[uid].fullName,
            userAvatar: getState().user.info[uid].avatar,
            userId: uid
        };

        let 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) => {
        let uid = getState().authorize.uid;
        if (uid) {
            let votesRef = firebaseRef.child(`postVotes`);

            return votesRef.on('value', (snapshot) => {
                let 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
        let uid = getState().authorize.uid;

        // Write the new data simultaneously in the list
        let 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 };
}