/ src / modules / Vote / Vote.reducer.js
Vote.reducer.js
  1  import voteInitialState from '../../common/data/vote'
  2  import reducerUtil from '../../common/utils/reducer'
  3  import BlockchainSDK from '../../common/blockchain'
  4  
  5  import { showAlertAction } from '../Alert/Alert.reducer'
  6  import {
  7    onStartProgressAction,
  8    onReceiveTransactionInfoAction,
  9    checkTransactionStatusAction,
 10  } from '../TransactionStatus/TransactionStatus.recuder'
 11  import {
 12    TYPE_UPVOTE,
 13    TYPE_DOWNVOTE,
 14  } from '../TransactionStatus/TransactionStatus.utilities'
 15  
 16  const SHOW_UP_VOTE_AFTER_CHECK = 'VOTE_SHOW_UP_VOTE_AFTER_CHECK'
 17  const SHOW_DOWN_VOTE_AFTER_CHEECK = 'VOTE_SHOW_DOWN_VOTE_AFTER_CHEECK'
 18  const CLOSE_VOTE = 'VOTE_CLOSE_VOTE'
 19  const SWITCH_TO_UPVOTE = 'VOTE_SWITCH_TO_UPVOTE'
 20  const SWITCH_TO_DOWNVOTE = 'VOTE_SWITCH_TO_DOWNVOTE'
 21  const ON_INPUT_SNT_VALUE = 'VOTE_ON_INPUT_SNT_VALUE'
 22  const UPDATE_AFTER_UP_VOTING_VALUES = 'VOTE_UPDATE_AFTER_UP_VOTING_VALUES'
 23  const UPDATE_AFTER_DOWN_VOTING_VALUES = 'VOTE_UPDATE_AFTER_DOWN_VOTING_VALUES'
 24  
 25  export const showUpVoteActionAfterCheck = dapp => {
 26    window.location.hash = 'vote'
 27    return {
 28      type: SHOW_UP_VOTE_AFTER_CHECK,
 29      payload: dapp,
 30    }
 31  }
 32  
 33  export const showDownVoteActionAfterCheck = dapp => {
 34    window.location.hash = 'vote'
 35    return {
 36      type: SHOW_DOWN_VOTE_AFTER_CHEECK,
 37      payload: dapp,
 38    }
 39  }
 40  
 41  export const showUpVoteAction = dapp => {
 42    return (dispatch, getState) => {
 43      const state = getState()
 44      if (state.transactionStatus.progress) {
 45        dispatch(
 46          showAlertAction(
 47            'There is an active transaction. Please wait for it to finish and then you could be able to vote',
 48          ),
 49        )
 50      } else dispatch(showUpVoteActionAfterCheck(dapp))
 51    }
 52  }
 53  
 54  export const showDownVoteAction = dapp => {
 55    return (dispatch, getState) => {
 56      const state = getState()
 57      if (state.transactionStatus.progress) {
 58        dispatch(
 59          showAlertAction(
 60            'There is an active transaction. Please wait for it to finish and then you could be able to vote',
 61          ),
 62        )
 63      } else dispatch(showDownVoteActionAfterCheck(dapp))
 64    }
 65  }
 66  
 67  export const switchToUpvoteAction = () => ({
 68    type: SWITCH_TO_UPVOTE,
 69    payload: null,
 70  })
 71  
 72  export const switchToUpDownvoteAction = () => ({
 73    type: SWITCH_TO_DOWNVOTE,
 74    payload: null,
 75  })
 76  
 77  export const closeVoteAction = () => {
 78    window.history.back()
 79    return {
 80      type: CLOSE_VOTE,
 81      payload: null,
 82    }
 83  }
 84  
 85  export const onInputSntValueAction = sntValue => ({
 86    type: ON_INPUT_SNT_VALUE,
 87    payload: sntValue,
 88  })
 89  
 90  export const updateAfterUpVotingValuesAction = rating => ({
 91    type: UPDATE_AFTER_UP_VOTING_VALUES,
 92    payload: rating,
 93  })
 94  
 95  export const updateAfterDownVotingValuesAction = (rating, sntValue) => ({
 96    type: UPDATE_AFTER_DOWN_VOTING_VALUES,
 97    payload: { rating, sntValue },
 98  })
 99  
100  export const fetchVoteRatingAction = (dapp, isUpvote, sntValue) => {
101    return async (dispatch, getState) => {
102      let rating
103      let downVoteSntValue = 0
104      if (isUpvote === true) {
105        try {
106          const blockchain = await BlockchainSDK.getInstance()
107          rating = await blockchain.DiscoverService.upVoteEffect(
108            dapp.id,
109            sntValue,
110          )
111          rating = parseInt(rating, 10)
112        } catch (e) {
113          return
114        }
115      } else {
116        // rating = parseInt(dapp.sntValue * 0.99, 10)
117        try {
118          const blockchain = await BlockchainSDK.getInstance()
119          const downVoteEffect = await blockchain.DiscoverService.downVoteCost(
120            dapp.id,
121          )
122          // balanceDownBy, votesRequired, cost
123          rating = parseInt(downVoteEffect.vR, 10)
124          downVoteSntValue = downVoteEffect.c
125        } catch (e) {
126          return
127        }
128      }
129  
130      const state = getState()
131      const voteState = state.vote
132      if (voteState.dapp !== dapp) return
133      if (voteState.isUpvote !== isUpvote) return
134      if (isUpvote) {
135        if (voteState.sntValue !== sntValue.toString()) return
136        if (sntValue === 0) return
137        dispatch(updateAfterUpVotingValuesAction(rating))
138      } else {
139        dispatch(updateAfterDownVotingValuesAction(rating, downVoteSntValue))
140      }
141    }
142  }
143  
144  export const upVoteAction = (dapp, amount) => {
145    return async dispatch => {
146      dispatch(closeVoteAction())
147      dispatch(
148        onStartProgressAction(
149          dapp.name,
150          dapp.image,
151          `↑ Upvote by ${amount} SNT`,
152          TYPE_UPVOTE,
153        ),
154      )
155      try {
156        const blockchain = await BlockchainSDK.getInstance()
157        const tx = await blockchain.DiscoverService.upVote(dapp.id, amount)
158        dispatch(onReceiveTransactionInfoAction(dapp.id, tx))
159        dispatch(checkTransactionStatusAction(tx))
160      } catch (e) {
161        dispatch(showAlertAction(e.message))
162      }
163    }
164  }
165  
166  export const downVoteAction = (dapp, amount) => {
167    return async dispatch => {
168      const msg = amount !== '0' ? ` by ${amount} SNT` : ''
169  
170      dispatch(closeVoteAction())
171      dispatch(
172        onStartProgressAction(
173          dapp.name,
174          dapp.image,
175          `↓ Downvote${msg}`,
176          TYPE_DOWNVOTE,
177        ),
178      )
179      try {
180        const blockchain = await BlockchainSDK.getInstance()
181        const tx = await blockchain.DiscoverService.downVote(dapp.id)
182        dispatch(onReceiveTransactionInfoAction(dapp.id, tx))
183        dispatch(checkTransactionStatusAction(tx))
184      } catch (e) {
185        dispatch(showAlertAction(e.message))
186      }
187    }
188  }
189  
190  const showUpVoteAfterCheck = (state, dapp) => {
191    return Object.assign({}, state, {
192      visible: true,
193      dapp,
194      sntValue: '0',
195      isUpvote: true,
196      afterVoteRating: null,
197    })
198  }
199  
200  const showDownVoteAfterCheck = (state, dapp) => {
201    return Object.assign({}, state, {
202      visible: true,
203      dapp,
204      sntValue: '0',
205      isUpvote: false,
206      afterVoteRating: null,
207    })
208  }
209  
210  const closeVote = state => {
211    return Object.assign({}, state, {
212      visible: false,
213      dapp: null,
214    })
215  }
216  
217  const switchToUpvote = state => {
218    return Object.assign({}, state, {
219      isUpvote: true,
220      sntValue: '0',
221      afterVoteRating: null,
222    })
223  }
224  
225  const switchToDownvote = state => {
226    return Object.assign({}, state, {
227      isUpvote: false,
228      sntValue: '0',
229      afterVoteRating: null,
230    })
231  }
232  
233  const onInputSntValue = (state, sntValue) => {
234    return Object.assign({}, state, {
235      sntValue,
236    })
237  }
238  
239  const updateAfterUpVotingValues = (state, rating) => {
240    return Object.assign({}, state, {
241      afterVoteRating: rating,
242    })
243  }
244  
245  const updateAfterDownVotingValues = (state, payload) => {
246    const { rating, sntValue } = payload
247    return Object.assign({}, state, {
248      afterVoteRating: rating,
249      sntValue,
250    })
251  }
252  
253  const map = {
254    [SHOW_UP_VOTE_AFTER_CHECK]: showUpVoteAfterCheck,
255    [SHOW_DOWN_VOTE_AFTER_CHEECK]: showDownVoteAfterCheck,
256    [CLOSE_VOTE]: closeVote,
257    [SWITCH_TO_UPVOTE]: switchToUpvote,
258    [SWITCH_TO_DOWNVOTE]: switchToDownvote,
259    [ON_INPUT_SNT_VALUE]: onInputSntValue,
260    [UPDATE_AFTER_UP_VOTING_VALUES]: updateAfterUpVotingValues,
261    [UPDATE_AFTER_DOWN_VOTING_VALUES]: updateAfterDownVotingValues,
262  }
263  
264  export default reducerUtil(map, voteInitialState)