/ common / features / wallet / reducer.ts
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  }