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)