Skip to content

Commit 8314c2f

Browse files
Umair Sarfrazcvarley100
andauthored
feat: group confirmations state notifications for internal transfers (#549)
* feat: group confirmations state notifications for internal transfers * hotfix: correctly pass sender account alias * fix: transaction string Co-authored-by: Charlie Varley <[email protected]>
1 parent 25ff1d6 commit 8314c2f

File tree

2 files changed

+59
-7
lines changed

2 files changed

+59
-7
lines changed

packages/shared/lib/wallet.ts

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ type WalletState = {
5959
balanceOverview: Writable<BalanceOverview>
6060
accounts: Writable<WalletAccount[]>
6161
accountsLoaded: Writable<boolean>
62+
confirmedInternalMessageIds: Writable<{ [key: string]: number }>
6263
}
6364

6465
type BalanceTimestamp = {
@@ -95,6 +96,7 @@ export const wallet = writable<WalletState>({
9596
}),
9697
accounts: writable<WalletAccount[]>([]),
9798
accountsLoaded: writable<boolean>(false),
99+
confirmedInternalMessageIds: writable<{ [key: string]: number }>({})
98100
})
99101

100102
export const resetWallet = () => {
@@ -361,12 +363,13 @@ export const initialiseListeners = () => {
361363
onSuccess(response) {
362364
const accounts = get(wallet).accounts
363365
const account = get(accounts).find((account) => account.id === response.payload.accountId)
364-
const message = response.payload.message
365-
const messageKey = response.payload.confirmed ? 'confirmed' : 'failed'
366366

367+
const message = response.payload.message
368+
const confirmed = response.payload.confirmed;
367369
const essence = message.payload.data.essence
368370

369-
if (response.payload.confirmed && !essence.data.internal) {
371+
372+
if (confirmed && !essence.data.internal) {
370373
const { balanceOverview } = get(wallet);
371374
const overview = get(balanceOverview);
372375

@@ -380,8 +383,10 @@ export const initialiseListeners = () => {
380383
);
381384
}
382385

386+
// Update state
383387
const accountMessage = account.messages.find((_message) => _message.id === message.id)
384388
accountMessage.confirmed = response.payload.confirmed
389+
385390
accounts.update((storedAccounts) => {
386391
return storedAccounts.map((storedAccount) => {
387392
if (storedAccount.id === account.id) {
@@ -402,11 +407,57 @@ export const initialiseListeners = () => {
402407
})
403408
})
404409

405-
const notificationMessage = localize(`notifications.${messageKey}`)
406-
.replace('{{value}}', formatUnit(message.payload.data.essence.data.value))
407-
.replace('{{account}}', account.alias)
410+
// Notify user
411+
const messageKey = confirmed ? 'confirmed' : 'failed'
412+
413+
const _notify = (senderAccountAlias: string | null = null) => {
414+
let notificationMessage
415+
416+
if (senderAccountAlias) {
417+
notificationMessage = localize(`notifications.${messageKey}Internal`)
418+
.replace('{{value}}', formatUnit(message.payload.data.essence.data.value))
419+
.replace('{{senderAccount}}', senderAccountAlias)
420+
.replace('{{receiverAccount}}', account.alias)
421+
} else {
422+
notificationMessage = localize(`notifications.${messageKey}`)
423+
.replace('{{value}}', formatUnit(message.payload.data.essence.data.value))
424+
.replace('{{account}}', account.alias)
425+
}
426+
427+
showSystemNotification({ type: "info", message: notificationMessage })
428+
}
429+
430+
const { confirmedInternalMessageIds } = get(wallet)
431+
const messageIds = get(confirmedInternalMessageIds)
432+
433+
// If this event is emitted because a message failed, then this message will only exist on the sender account
434+
// Therefore, show the notification (no need to group).
435+
if (!confirmed) {
436+
_notify()
437+
} else {
438+
// If this is an external message, notify (no need to group)
439+
if (!essence.data.internal) {
440+
_notify();
441+
} else {
442+
// If this is an internal message, check if we have already receive confirmation state of this message
443+
if (Object.keys(messageIds).includes(message.id)) {
444+
_notify(
445+
get(accounts).find((account) => account.index === messageIds[message.id]).alias
446+
);
447+
448+
confirmedInternalMessageIds.update((ids) => {
449+
delete ids[message.id]
450+
451+
return ids;
452+
})
453+
} else {
454+
// Otherwise, add the message id and do not notify yet
455+
messageIds[message.id] = account.index
456+
}
457+
}
458+
}
459+
408460

409-
showSystemNotification({ type: "info", message: notificationMessage })
410461
},
411462
onError(error) {
412463
console.error(error)

packages/shared/locales/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,7 @@
577577
"notifications": {
578578
"valueTx": "Receiving {{value}} to {{account}}",
579579
"confirmed": "Outgoing {{value}} from {{account}} has confirmed",
580+
"confirmedInternal": "{{value}} from {{senderAccount}} to {{receiverAccount}} has confirmed",
580581
"failed": "Outgoing {{value}} from {{account}} has failed",
581582
"downloadingUpdate": "Downloading update",
582583
"updateReady": "Update ready",

0 commit comments

Comments
 (0)