From 633f8738b68342e0212a1a3c32e129343bef8ca6 Mon Sep 17 00:00:00 2001 From: Mikhail Mikheev Date: Wed, 27 Mar 2019 19:30:32 +0400 Subject: [PATCH] save active tokens via immortaldb --- src/logic/tokens/store/actions/addTokens.js | 10 +++++---- .../tokens/store/actions/disableToken.js | 15 ++++++------- src/logic/tokens/store/actions/enableToken.js | 6 +++--- src/logic/tokens/store/actions/removeToken.js | 6 +++--- src/logic/tokens/utils/tokensStorage.js | 8 +++---- src/utils/singleton.js | 21 ++++++++++++++++++- 6 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/logic/tokens/store/actions/addTokens.js b/src/logic/tokens/store/actions/addTokens.js index 85886b3f..6559d639 100644 --- a/src/logic/tokens/store/actions/addTokens.js +++ b/src/logic/tokens/store/actions/addTokens.js @@ -3,14 +3,14 @@ import { Map, List } from 'immutable' import { createAction } from 'redux-actions' import type { Dispatch as ReduxDispatch } from 'redux' import { type Token } from '~/logic/tokens/store/model/token' -import { ensureOnce } from '~/utils/singleton' +import { ensureOnceAsync } from '~/utils/singleton' import { type GlobalState } from '~/store/index' import { setActiveTokenAddresses } from '~/logic/tokens/utils/tokensStorage' import { calculateActiveErc20TokensFrom } from '~/logic/tokens/utils/tokenHelpers' export const ADD_TOKENS = 'ADD_TOKENS' -const setTokensOnce = ensureOnce(setActiveTokenAddresses) +const setTokensOnce = ensureOnceAsync(setActiveTokenAddresses) type TokenProps = { safeAddress: string, @@ -25,11 +25,13 @@ const addTokens = createAction( }), ) -const saveTokens = (safeAddress: string, tokens: Map) => (dispatch: ReduxDispatch) => { +const saveTokens = (safeAddress: string, tokens: Map) => async ( + dispatch: ReduxDispatch, +) => { dispatch(addTokens(safeAddress, tokens)) const activeAddresses: List = calculateActiveErc20TokensFrom(tokens.toList()) - setTokensOnce(safeAddress, activeAddresses) + await setTokensOnce(safeAddress, activeAddresses) } export default saveTokens diff --git a/src/logic/tokens/store/actions/disableToken.js b/src/logic/tokens/store/actions/disableToken.js index 093911f6..9e26f8f1 100644 --- a/src/logic/tokens/store/actions/disableToken.js +++ b/src/logic/tokens/store/actions/disableToken.js @@ -7,19 +7,16 @@ import { removeFromActiveTokens } from '~/logic/tokens/utils/tokensStorage' export const DISABLE_TOKEN = 'DISABLE_TOKEN' -const disableToken = createAction( - DISABLE_TOKEN, - (safeAddress: string, tokenAddress: string) => ({ - safeAddress, - tokenAddress, - }), -) +const disableToken = createAction(DISABLE_TOKEN, (safeAddress: string, tokenAddress: string) => ({ + safeAddress, + tokenAddress, +})) -const hideToken = (safeAddress: string, token: Token) => (dispatch: ReduxDispatch) => { +const hideToken = (safeAddress: string, token: Token) => async (dispatch: ReduxDispatch) => { const { address } = token dispatch(disableToken(safeAddress, address)) - removeFromActiveTokens(safeAddress, address) + await removeFromActiveTokens(safeAddress, address) } export default hideToken diff --git a/src/logic/tokens/store/actions/enableToken.js b/src/logic/tokens/store/actions/enableToken.js index 4cedc56c..75c0ae38 100644 --- a/src/logic/tokens/store/actions/enableToken.js +++ b/src/logic/tokens/store/actions/enableToken.js @@ -12,12 +12,12 @@ const enableToken = createAction(ENABLE_TOKEN, (safeAddress: string, tokenAddres tokenAddress, })) -const setTokenEnabled = (safeAddress: string, token: Token) => (dispatch: ReduxDispatch) => { +const setTokenEnabled = (safeAddress: string, token: Token) => async (dispatch: ReduxDispatch) => { const { address } = token dispatch(enableToken(safeAddress, address)) - const activeTokens = getActiveTokenAddresses(safeAddress) - setActiveTokenAddresses(safeAddress, activeTokens.push(address)) + const activeTokens = await getActiveTokenAddresses(safeAddress) + await setActiveTokenAddresses(safeAddress, activeTokens.push(address)) } export default setTokenEnabled diff --git a/src/logic/tokens/store/actions/removeToken.js b/src/logic/tokens/store/actions/removeToken.js index 7f1a5a36..8398f3d7 100644 --- a/src/logic/tokens/store/actions/removeToken.js +++ b/src/logic/tokens/store/actions/removeToken.js @@ -20,12 +20,12 @@ const removeToken = createAction( }), ) -const deleteToken = (safeAddress: string, token: Token) => (dispatch: ReduxDispatch) => { +const deleteToken = (safeAddress: string, token: Token) => async (dispatch: ReduxDispatch) => { dispatch(removeToken(safeAddress, token)) const tokenAddress = token.get('address') - removeFromActiveTokens(safeAddress, tokenAddress) - removeTokenFromStorage(safeAddress, token) + await removeFromActiveTokens(safeAddress, tokenAddress) + await removeTokenFromStorage(safeAddress, token) } export default deleteToken diff --git a/src/logic/tokens/utils/tokensStorage.js b/src/logic/tokens/utils/tokensStorage.js index 128b08f4..babdde04 100644 --- a/src/logic/tokens/utils/tokensStorage.js +++ b/src/logic/tokens/utils/tokensStorage.js @@ -24,14 +24,14 @@ export const getActiveTokenAddresses = async (safeAddress: string): Promise> => { const key = getTokensKey(safeAddress) const data = await ImmortalDB.get(key) - return data ? List(data) : List() + return data ? List(JSON.parse(data)) : List() } export const setToken = async (safeAddress: string, token: Token) => { @@ -40,7 +40,7 @@ export const setToken = async (safeAddress: string, token: Token) => { try { const serializedState = JSON.stringify(data.push(token)) const key = getTokensKey(safeAddress) - ImmortalDB.set(key, serializedState) + await ImmortalDB.set(key, serializedState) } catch (err) { // eslint-disable-next-line console.log('Error adding token in localstorage') @@ -64,5 +64,5 @@ export const removeTokenFromStorage = async (safeAddress: string, token: Token) export const removeFromActiveTokens = async (safeAddress: string, tokenAddress: string) => { const activeTokens = await getActiveTokenAddresses(safeAddress) const index = activeTokens.indexOf(tokenAddress) - setActiveTokenAddresses(safeAddress, activeTokens.delete(index)) + await setActiveTokenAddresses(safeAddress, activeTokens.delete(index)) } diff --git a/src/utils/singleton.js b/src/utils/singleton.js index 8a685343..7bcdd956 100644 --- a/src/utils/singleton.js +++ b/src/utils/singleton.js @@ -4,7 +4,9 @@ export const ensureOnce = (fn: Function): Function => { let response return (...args) => { - if (executed) { return response } + if (executed) { + return response + } executed = true // eslint-disable-next-line @@ -13,3 +15,20 @@ export const ensureOnce = (fn: Function): Function => { return response } } + +export const ensureOnceAsync = (fn: Function): Function => { + let executed = false + let response + + return async (...args) => { + if (executed) { + return response + } + + executed = true + // eslint-disable-next-line + response = await fn.apply(undefined, args) + + return response + } +}