reducer.ts
1 import { translateRaw } from 'translations'; 2 import { IWallet } from 'libs/wallet'; 3 import * as types from './types'; 4 5 export const INITIAL_STATE: types.WalletState = { 6 inst: null, 7 config: null, 8 balance: { isPending: false, wei: null }, 9 tokens: {}, 10 isWalletPending: false, 11 isPasswordPending: false, 12 isTokensLoading: false, 13 tokensError: null, 14 hasSavedWalletTokens: true, 15 recentAddresses: [] 16 }; 17 18 export const RECENT_ADDRESS_LIMIT = 10; 19 20 function addRecentAddress(addresses: string[], newWallet: IWallet | null) { 21 if (!newWallet) { 22 return addresses; 23 } 24 // Push new address onto the front 25 const newAddresses = [newWallet.getAddressString(), ...addresses]; 26 // Dedupe addresses, limit length 27 return newAddresses 28 .filter((addr, idx) => newAddresses.indexOf(addr) === idx) 29 .splice(0, RECENT_ADDRESS_LIMIT); 30 } 31 32 function setWallet(state: types.WalletState, action: types.SetWalletAction): types.WalletState { 33 return { 34 ...state, 35 inst: action.payload, 36 config: INITIAL_STATE.config, 37 balance: INITIAL_STATE.balance, 38 tokens: INITIAL_STATE.tokens, 39 recentAddresses: addRecentAddress(state.recentAddresses, action.payload) 40 }; 41 } 42 43 function setBalancePending(state: types.WalletState): types.WalletState { 44 return { ...state, balance: { ...state.balance, isPending: true } }; 45 } 46 47 function setBalanceFullfilled( 48 state: types.WalletState, 49 action: types.SetBalanceFullfilledAction 50 ): types.WalletState { 51 return { 52 ...state, 53 balance: { wei: action.payload, isPending: false } 54 }; 55 } 56 57 function setBalanceRejected(state: types.WalletState): types.WalletState { 58 return { ...state, balance: { ...state.balance, isPending: false } }; 59 } 60 61 function setWalletPending( 62 state: types.WalletState, 63 action: types.SetWalletPendingAction 64 ): types.WalletState { 65 return { ...state, isWalletPending: action.payload }; 66 } 67 68 function setPasswordPending(state: types.WalletState): types.WalletState { 69 return { ...state, isPasswordPending: true }; 70 } 71 72 function setTokenBalancesPending(state: types.WalletState): types.WalletState { 73 return { 74 ...state, 75 tokens: {}, 76 isTokensLoading: true, 77 tokensError: null 78 }; 79 } 80 81 function setTokenBalancePending(state: types.WalletState): types.WalletState { 82 return { 83 ...state, 84 isTokensLoading: true, 85 tokensError: null 86 }; 87 } 88 89 function setTokenBalanceFufilled( 90 state: types.WalletState, 91 action: types.SetTokenBalanceFulfilledAction 92 ): types.WalletState { 93 return { 94 ...state, 95 tokens: { ...state.tokens, ...action.payload }, 96 isTokensLoading: false 97 }; 98 } 99 100 function setTokenBalanceRejected(state: types.WalletState): types.WalletState { 101 return { 102 ...state, 103 isTokensLoading: false, 104 tokensError: translateRaw('SCAN_TOKENS_FAIL') 105 }; 106 } 107 108 function setTokenBalancesFulfilled( 109 state: types.WalletState, 110 action: types.SetTokenBalancesFulfilledAction 111 ): types.WalletState { 112 return { 113 ...state, 114 tokens: action.payload, 115 isTokensLoading: false 116 }; 117 } 118 119 function setTokenBalancesRejected(state: types.WalletState): types.WalletState { 120 return { 121 ...state, 122 isTokensLoading: false, 123 tokensError: translateRaw('SCAN_TOKENS_FAIL') 124 }; 125 } 126 127 function scanWalletForTokens(state: types.WalletState): types.WalletState { 128 return { 129 ...state, 130 hasSavedWalletTokens: false 131 }; 132 } 133 134 function setWalletTokens(state: types.WalletState): types.WalletState { 135 return { 136 ...state, 137 hasSavedWalletTokens: true 138 }; 139 } 140 141 function setWalletConfig( 142 state: types.WalletState, 143 action: types.SetWalletConfigAction 144 ): types.WalletState { 145 return { 146 ...state, 147 config: action.payload 148 }; 149 } 150 151 function resetWallet(state: types.WalletState): types.WalletState { 152 return { 153 ...INITIAL_STATE, 154 recentAddresses: state.recentAddresses 155 }; 156 } 157 158 export function walletReducer( 159 state: types.WalletState = INITIAL_STATE, 160 action: types.WalletAction 161 ): types.WalletState { 162 switch (action.type) { 163 case types.WalletActions.SET: 164 return setWallet(state, action); 165 case types.WalletActions.RESET: 166 return resetWallet(state); 167 case types.WalletActions.SET_BALANCE_PENDING: 168 return setBalancePending(state); 169 case types.WalletActions.SET_BALANCE_FULFILLED: 170 return setBalanceFullfilled(state, action); 171 case types.WalletActions.SET_BALANCE_REJECTED: 172 return setBalanceRejected(state); 173 case types.WalletActions.SET_PENDING: 174 return setWalletPending(state, action); 175 case types.WalletActions.SET_TOKEN_BALANCES_PENDING: 176 return setTokenBalancesPending(state); 177 case types.WalletActions.SET_TOKEN_BALANCES_FULFILLED: 178 return setTokenBalancesFulfilled(state, action); 179 case types.WalletActions.SET_TOKEN_BALANCES_REJECTED: 180 return setTokenBalancesRejected(state); 181 case types.WalletActions.SET_TOKEN_BALANCE_PENDING: 182 return setTokenBalancePending(state); 183 case types.WalletActions.SET_TOKEN_BALANCE_FULFILLED: 184 return setTokenBalanceFufilled(state, action); 185 case types.WalletActions.SET_TOKEN_BALANCE_REJECTED: 186 return setTokenBalanceRejected(state); 187 case types.WalletActions.SCAN_WALLET_FOR_TOKENS: 188 return scanWalletForTokens(state); 189 case types.WalletActions.SET_WALLET_TOKENS: 190 return setWalletTokens(state); 191 case types.WalletActions.SET_CONFIG: 192 return setWalletConfig(state, action); 193 case types.WalletActions.SET_PASSWORD_PENDING: 194 return setPasswordPending(state); 195 default: 196 return state; 197 } 198 }