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