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)