From 5fc83905128232ff866dfc779ffa6205ff780f63 Mon Sep 17 00:00:00 2001 From: tommasini Date: Tue, 18 Feb 2025 23:11:33 +0000 Subject: [PATCH] Handle better errors by getting tags in pre-init --- app/util/sentry/tags/index.test.ts | 25 ++++++++++ app/util/sentry/tags/index.ts | 74 ++++++++++++++++-------------- 2 files changed, 65 insertions(+), 34 deletions(-) diff --git a/app/util/sentry/tags/index.test.ts b/app/util/sentry/tags/index.test.ts index b6f5808ef5aa..96e40474890b 100644 --- a/app/util/sentry/tags/index.test.ts +++ b/app/util/sentry/tags/index.test.ts @@ -350,5 +350,30 @@ describe('Tags Utils', () => { expect(tags).toBeUndefined(); }); + + it('returns null and captures exception when an error occurs', () => { + const state = { + ...initialRootState, + engine: { + backgroundState: { + ...backgroundState, + AccountsController: Object.create( + {}, + { + someProperty: { + get: () => { + throw new Error('Test error'); + }, + }, + }, + ), + }, + }, + } as unknown as RootState; + + const tags = getTraceTags(state); + + expect(tags).toBeNull(); + }); }); }); diff --git a/app/util/sentry/tags/index.ts b/app/util/sentry/tags/index.ts index 7d0a2ceabf2d..b1509c311427 100644 --- a/app/util/sentry/tags/index.ts +++ b/app/util/sentry/tags/index.ts @@ -5,44 +5,50 @@ import { selectAllTokensFlat } from '../../../selectors/tokensController'; import { getNotificationsList } from '../../../selectors/notifications'; import { selectTransactions } from '../../../selectors/transactionController'; import { selectPendingApprovals } from '../../../selectors/approvalController'; +import { captureException } from '@sentry/react-native'; export function getTraceTags(state: RootState) { - if (!state?.engine?.backgroundState?.AccountsController) return; - if (!state?.engine?.backgroundState?.NftController) return; - if (!state?.engine?.backgroundState?.NftController?.allNfts) return; - if (!state?.engine?.backgroundState?.NotificationServicesController) return; - if ( - !state?.engine?.backgroundState?.NotificationServicesController - ?.metamaskNotificationsList - ) - return; - if (!state?.engine?.backgroundState?.TokensController) return; - if (!state?.engine?.backgroundState?.TokensController?.allTokens) return; - if (!state?.engine?.backgroundState?.TransactionController) return; - if (!state?.engine?.backgroundState?.TransactionController?.transactions) - return; - if (!state?.engine?.backgroundState?.ApprovalController) return; + try { + if (!state?.engine?.backgroundState?.AccountsController) return; + if (!state?.engine?.backgroundState?.NftController) return; + if (!state?.engine?.backgroundState?.NftController?.allNfts) return; + if (!state?.engine?.backgroundState?.NotificationServicesController) return; + if ( + !state?.engine?.backgroundState?.NotificationServicesController + ?.metamaskNotificationsList + ) + return; + if (!state?.engine?.backgroundState?.TokensController) return; + if (!state?.engine?.backgroundState?.TokensController?.allTokens) return; + if (!state?.engine?.backgroundState?.TransactionController) return; + if (!state?.engine?.backgroundState?.TransactionController?.transactions) + return; + if (!state?.engine?.backgroundState?.ApprovalController) return; - if (!Object.keys(state?.engine?.backgroundState).length) return; + if (!Object.keys(state?.engine?.backgroundState).length) return; - const unlocked = state.user.userLoggedIn; - const accountCount = selectInternalAccounts(state)?.length; - const nftCount = selectAllNftsFlat(state)?.length; - const notificationCount = getNotificationsList(state)?.length; - const tokenCount = selectAllTokensFlat(state)?.length; - const transactionCount = selectTransactions(state)?.length; - const pendingApprovals = selectPendingApprovals(state); - const pendingApprovalsValues = Object.values(pendingApprovals ?? {}); + const unlocked = state.user.userLoggedIn; + const accountCount = selectInternalAccounts(state)?.length; + const nftCount = selectAllNftsFlat(state)?.length; + const notificationCount = getNotificationsList(state)?.length; + const tokenCount = selectAllTokensFlat(state)?.length; + const transactionCount = selectTransactions(state)?.length; + const pendingApprovals = selectPendingApprovals(state); + const pendingApprovalsValues = Object.values(pendingApprovals ?? {}); - const firstApprovalType = pendingApprovalsValues?.[0]?.type; + const firstApprovalType = pendingApprovalsValues?.[0]?.type; - return { - 'wallet.account_count': accountCount, - 'wallet.nft_count': nftCount, - 'wallet.notification_count': notificationCount, - 'wallet.pending_approval': firstApprovalType, - 'wallet.token_count': tokenCount, - 'wallet.transaction_count': transactionCount, - 'wallet.unlocked': unlocked, - }; + return { + 'wallet.account_count': accountCount, + 'wallet.nft_count': nftCount, + 'wallet.notification_count': notificationCount, + 'wallet.pending_approval': firstApprovalType, + 'wallet.token_count': tokenCount, + 'wallet.transaction_count': transactionCount, + 'wallet.unlocked': unlocked, + }; + } catch (error) { + captureException(`Error getting tags: ${error}`); + return null; + } }