/ src / modules / TransactionStatus / TransactionStatus.recuder.js
TransactionStatus.recuder.js
  1  import transactionStatusInitialState from '../../common/data/transaction-status'
  2  import reducerUtil from '../../common/utils/reducer'
  3  import {
  4    transactionStatusFetchedInstance,
  5    transactionStatusInitInstance,
  6    TYPE_NONE,
  7  } from './TransactionStatus.utilities'
  8  import { onUpdateDappDataAction } from '../Dapps/Dapps.reducer'
  9  import { showAlertAction } from '../Alert/Alert.reducer'
 10  import BlockchainSDK from '../../common/blockchain'
 11  
 12  const HIDE = 'TXS_HIDE'
 13  const ON_START_PROGRESS = 'TXS_ON_START_PROGRESS'
 14  const ON_RECEIVE_TRANSACTION_TX = 'TXS_ON_RECEIVE_TRANSACTION_TX'
 15  const ON_CHANGE_TRANSACTION_STATUS_DATA =
 16    'TXS_ON_CHANGE_TRANSACTION_STATUS_DATA'
 17  
 18  export const hideAction = () => ({
 19    type: HIDE,
 20    payload: null,
 21  })
 22  
 23  export const onStartProgressAction = (dappName, dappImg, desc, type) => ({
 24    type: ON_START_PROGRESS,
 25    payload: { dappName, dappImg, desc, type },
 26  })
 27  
 28  export const onReceiveTransactionInfoAction = (id, tx) => ({
 29    type: ON_RECEIVE_TRANSACTION_TX,
 30    payload: { id, tx },
 31  })
 32  
 33  // status 0/1/2 failed/success/pending
 34  export const onChangeTransactionStatusDataAction = transactionStatus => ({
 35    type: ON_CHANGE_TRANSACTION_STATUS_DATA,
 36    payload: transactionStatus,
 37  })
 38  
 39  export const checkTransactionStatusAction = tx => {
 40    return async dispatch => {
 41      let status = 2
 42      try {
 43        status = await BlockchainSDK.utils.getTxStatus(tx)
 44      } catch (e) {
 45        // if can't read current status from network assume it is still waiting
 46      }
 47      const statusInt = parseInt(status, 10)
 48      const transacationStatus = transactionStatusFetchedInstance()
 49      let dapp
 50  
 51      switch (statusInt) {
 52        case 0:
 53          transacationStatus.setFailed(true)
 54          break
 55        default:
 56        case 1:
 57          transacationStatus.setPublished(true)
 58          try {
 59            const blockchain = await BlockchainSDK.getInstance()
 60            dapp = await blockchain.DiscoverService.getDAppDataById(
 61              transacationStatus.dappId,
 62            )
 63            dapp = Object.assign(dapp.metadata, {
 64              id: dapp.id,
 65              sntValue: parseInt(dapp.effectiveBalance, 10),
 66            })
 67            dispatch(onUpdateDappDataAction(dapp))
 68          } catch (e) {
 69            dispatch(
 70              showAlertAction(e.message, 'OK', '', () => {
 71                window.location.reload()
 72              }),
 73            )
 74          }
 75          break
 76        case 2:
 77          transacationStatus.setProgress(true)
 78          setTimeout(() => {
 79            dispatch(checkTransactionStatusAction(tx))
 80          }, 2000)
 81          break
 82      }
 83  
 84      dispatch(onChangeTransactionStatusDataAction(transacationStatus))
 85    }
 86  }
 87  
 88  const hide = state => {
 89    const transacationStatus = transactionStatusFetchedInstance()
 90    transacationStatus.setDappName('')
 91    transacationStatus.setProgress(false)
 92    transacationStatus.setType(TYPE_NONE)
 93    return Object.assign({}, state, transacationStatus)
 94  }
 95  
 96  const onStartProgress = (state, payload) => {
 97    const { dappName, dappImg, desc, type } = payload
 98    const transacationStatus = transactionStatusInitInstance(
 99      dappName,
100      dappImg,
101      desc,
102      type,
103    )
104    transacationStatus.persistTransactionData()
105    return Object.assign({}, state, transacationStatus)
106  }
107  
108  const onReceiveTransactionInfo = (state, payload) => {
109    const { id, tx } = payload
110    const transacationStatus = transactionStatusFetchedInstance()
111    transacationStatus.setTransactionInfo(id, tx)
112    return Object.assign({}, state, transacationStatus)
113  }
114  
115  const onChangeTransactionStatusData = (state, transacationStatus) => {
116    return Object.assign({}, state, transacationStatus)
117  }
118  
119  const map = {
120    [HIDE]: hide,
121    [ON_START_PROGRESS]: onStartProgress,
122    [ON_RECEIVE_TRANSACTION_TX]: onReceiveTransactionInfo,
123    [ON_CHANGE_TRANSACTION_STATUS_DATA]: onChangeTransactionStatusData,
124  }
125  
126  export default reducerUtil(map, transactionStatusInitialState)