/* @flow */ import * as CONNECT from 'actions/constants/TrezorConnect'; import * as WALLET from 'actions/constants/wallet'; import * as TOKEN from 'actions/constants/token'; import type { Action, TrezorDevice } from 'flowtype'; export type Token = { loaded: boolean, +deviceState: string, +network: string, +name: string, +symbol: string, +address: string, +ethAddress: string, // foreign key +decimals: number, balance: string, }; export type State = Array; const initialState: State = []; const create = (state: State, token: Token): State => { const newState: State = [...state]; newState.push(token); return newState; }; const forget = (state: State, device: TrezorDevice): State => state.filter(t => t.deviceState !== device.state); const clear = (state: State, devices: Array): State => { let newState: State = [...state]; devices.forEach(d => { newState = forget(newState, d); }); return newState; }; const remove = (state: State, token: Token): State => state.filter( t => !( t.ethAddress === token.ethAddress && t.address === token.address && t.deviceState === token.deviceState ) ); export default (state: State = initialState, action: Action): State => { switch (action.type) { case TOKEN.FROM_STORAGE: return action.payload; case TOKEN.ADD: return create(state, action.payload); case TOKEN.REMOVE: return remove(state, action.token); case TOKEN.SET_BALANCE: return action.payload; case CONNECT.FORGET: case CONNECT.FORGET_SINGLE: case CONNECT.FORGET_SILENT: case CONNECT.RECEIVE_WALLET_TYPE: return forget(state, action.device); case WALLET.CLEAR_UNAVAILABLE_DEVICE_DATA: return clear(state, action.devices); default: return state; } };