(Fix) #423 - Pending transaction confirmation loop (#637)

* Fixs duplicated notifications

* Implements feedback, now the displayed txHash are stored on localstorage and once the first time we notify the user about it, they won't never appear again

* Uses the last time the user logged in

* Fix safe version null check
Fixs date string comparison
Adds the safe address to the check of last time logged in
This commit is contained in:
Agustin Pane 2020-03-25 08:31:35 -03:00 committed by GitHub
parent 6b6aba041b
commit 5d7fa6428f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 53 additions and 8 deletions

View File

@ -18,9 +18,49 @@ import { ADD_TRANSACTIONS } from '~/routes/safe/store/actions/addTransactions'
import updateSafe from '~/routes/safe/store/actions/updateSafe'
import { safeParamAddressFromStateSelector, safesMapSelector } from '~/routes/safe/store/selectors'
import { type GlobalState } from '~/store/'
import { loadFromStorage, saveToStorage } from '~/utils/storage'
const watchedActions = [ADD_TRANSACTIONS, ADD_INCOMING_TRANSACTIONS, ADD_SAFE]
const sendAwaitingTransactionNotification = async (
dispatch: Function,
safeAddress: string,
awaitingTxsSubmissionDateList: List[],
notificationKey: string,
notificationClickedCb: Function,
) => {
const LAST_TIME_USED_LOGGED_IN_ID = 'LAST_TIME_USED_LOGGED_IN_ID'
if (!dispatch || !safeAddress || !awaitingTxsSubmissionDateList || !notificationKey) {
return
}
if (awaitingTxsSubmissionDateList.size === 0) {
return
}
let lastTimeUserLoggedInForSafes = (await loadFromStorage(LAST_TIME_USED_LOGGED_IN_ID)) || []
let lastTimeUserLoggedIn =
lastTimeUserLoggedInForSafes && lastTimeUserLoggedInForSafes[safeAddress]
? lastTimeUserLoggedInForSafes[safeAddress]
: null
const filteredDuplicatedAwaitingTxList = awaitingTxsSubmissionDateList.filter(submissionDate => {
return lastTimeUserLoggedIn ? new Date(submissionDate) > new Date(lastTimeUserLoggedIn) : true
})
if (filteredDuplicatedAwaitingTxList.size === 0) {
return
}
dispatch(
enqueueSnackbar(enhanceSnackbarForAction(NOTIFICATIONS.TX_WAITING_MSG, notificationKey, notificationClickedCb)),
)
lastTimeUserLoggedInForSafes = {
...lastTimeUserLoggedInForSafes,
[safeAddress]: lastTimeUserLoggedIn || new Date(),
}
await saveToStorage(LAST_TIME_USED_LOGGED_IN_ID, lastTimeUserLoggedInForSafes)
}
const notificationsMiddleware = (store: Store<GlobalState>) => (next: Function) => async (action: Action<*>) => {
const handledAction = next(action)
const { dispatch } = store
@ -41,23 +81,28 @@ const notificationsMiddleware = (store: Store<GlobalState>) => (next: Function)
cancellationTransactionsByNonce,
userAddress,
)
const awaitingTransactionsList = awaitingTransactions.get(safeAddress, List([]))
const awaitingTxsSubmissionDateList = awaitingTransactions
.get(safeAddress, List([]))
.map(tx => tx.submissionDate)
const safes = safesMapSelector(state)
const currentSafe = safes.get(safeAddress)
if (!isUserOwner(currentSafe, userAddress) || awaitingTransactionsList.size === 0) {
if (!isUserOwner(currentSafe, userAddress) || awaitingTxsSubmissionDateList.size === 0) {
break
}
const notificationKey = `${safeAddress}-${userAddress}`
const notificationKey = `${safeAddress}-awaiting`
const onNotificationClicked = () => {
dispatch(closeSnackbarAction({ key: notificationKey }))
dispatch(push(`/safes/${safeAddress}/transactions`))
}
dispatch(
enqueueSnackbar(
enhanceSnackbarForAction(NOTIFICATIONS.TX_WAITING_MSG, notificationKey, onNotificationClicked),
),
await sendAwaitingTransactionNotification(
dispatch,
safeAddress,
awaitingTxsSubmissionDateList,
notificationKey,
onNotificationClicked,
)
break