From 6e71f653a3eb698f639c2a50da731e836e5aaa97 Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 4 Sep 2025 19:24:07 +0100 Subject: [PATCH 1/6] Layout for analytics opt-in feature --- src/background/Wallet/GlobalPreferences.ts | 3 + src/ui/features/onboarding/Onboarding.tsx | 9 ++ .../onboarding/ShareData/ShareData.tsx | 119 ++++++++++++++++++ src/ui/features/onboarding/ShareData/index.ts | 1 + .../features/onboarding/Welcome/Welcome.tsx | 2 - src/ui/pages/Settings/Settings.tsx | 57 +++++++++ 6 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 src/ui/features/onboarding/ShareData/ShareData.tsx create mode 100644 src/ui/features/onboarding/ShareData/index.ts diff --git a/src/background/Wallet/GlobalPreferences.ts b/src/background/Wallet/GlobalPreferences.ts index 022c1d530e..2d45240dca 100644 --- a/src/background/Wallet/GlobalPreferences.ts +++ b/src/background/Wallet/GlobalPreferences.ts @@ -5,6 +5,7 @@ import { getRemoteConfigValue } from 'src/modules/remote-config'; import { removeEmptyValues } from 'src/shared/removeEmptyValues'; import { equal } from 'src/modules/fast-deep-equal'; import { difference } from 'src/shared/difference'; +import { PLATFORM } from 'src/env/config'; import type { WalletNameFlag } from './model/WalletNameFlag'; const HALF_DAY = 1000 * 60 * 60 * 12; @@ -26,6 +27,7 @@ export interface State { recognizableConnectButtons?: boolean; providerInjection?: ProviderInjection; autoLockTimeout?: number | 'none'; + analyticsEnabled?: boolean | null; walletNameFlags?: Record; } @@ -58,6 +60,7 @@ export class GlobalPreferences extends PersistentStore { recognizableConnectButtons: true, providerInjection: {}, walletNameFlags: {}, + analyticsEnabled: PLATFORM === 'chrome' ? true : null, autoLockTimeout: HALF_DAY, }; diff --git a/src/ui/features/onboarding/Onboarding.tsx b/src/ui/features/onboarding/Onboarding.tsx index b072a6ff64..850c4a0a09 100644 --- a/src/ui/features/onboarding/Onboarding.tsx +++ b/src/ui/features/onboarding/Onboarding.tsx @@ -9,6 +9,7 @@ import { Hardware } from './Hardware'; import { SessionExpired } from './shared/SessionExpired'; import { PageLayout } from './shared/PageLayout'; import { Backup } from './Backup'; +import { ShareData } from './ShareData'; export function Onboarding() { const navigate = useNavigate(); @@ -26,6 +27,14 @@ export function Onboarding() { + + + } + /> + diff --git a/src/ui/features/onboarding/ShareData/ShareData.tsx b/src/ui/features/onboarding/ShareData/ShareData.tsx new file mode 100644 index 0000000000..359472a852 --- /dev/null +++ b/src/ui/features/onboarding/ShareData/ShareData.tsx @@ -0,0 +1,119 @@ +import React, { useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { VStack } from 'src/ui/ui-kit/VStack'; +import { UIText } from 'src/ui/ui-kit/UIText'; +import { Button } from 'src/ui/ui-kit/Button'; +import { useGlobalPreferences } from 'src/ui/features/preferences/usePreferences'; +import { useWindowSizeStore } from 'src/ui/shared/useWindowSizeStore'; +import { UnstyledAnchor } from 'src/ui/ui-kit/UnstyledAnchor'; +import { useOnboardingSession } from '../shared/useOnboardingSession'; +import * as helpersStyles from '../shared/helperStyles.module.css'; + +export function ShareData() { + const navigate = useNavigate(); + const { globalPreferences, setGlobalPreferences, query } = + useGlobalPreferences(); + const { isNarrowView } = useWindowSizeStore(); + + useOnboardingSession({ navigateOnExistingUser: 'success' }); + + // Check if analyticsEnabled is already set and navigate to welcome + useEffect(() => { + if (!query.isLoading && globalPreferences?.analyticsEnabled != null) { + navigate('/onboarding/welcome'); + } + }, [query.isLoading, globalPreferences?.analyticsEnabled, navigate]); + + const handleAnalyticsChoice = (enabled: boolean) => { + setGlobalPreferences({ + analyticsEnabled: enabled, + }); + navigate('/onboarding/welcome'); + }; + + if (query.isLoading) { + return null; + } + + return ( + + + + + Privacy and +
Data Collection +
+ + Share anonymous usage data (such as app interactions, feature usage, + and performance metrics) to help us make Zerion better for everyone. +
+
+ Turning off data collection will not impact your user experience. + You can change this setting anytime in Privacy settings. +
+
+ Read more in our{' '} + + Privacy Policy + + . +
+
+ + + + + +
+
+ ); +} diff --git a/src/ui/features/onboarding/ShareData/index.ts b/src/ui/features/onboarding/ShareData/index.ts new file mode 100644 index 0000000000..875d5dad25 --- /dev/null +++ b/src/ui/features/onboarding/ShareData/index.ts @@ -0,0 +1 @@ +export { ShareData } from './ShareData'; diff --git a/src/ui/features/onboarding/Welcome/Welcome.tsx b/src/ui/features/onboarding/Welcome/Welcome.tsx index 0a3a8e9529..4c95e1f151 100644 --- a/src/ui/features/onboarding/Welcome/Welcome.tsx +++ b/src/ui/features/onboarding/Welcome/Welcome.tsx @@ -16,7 +16,6 @@ import CreateImg from 'url:../assets/option_create.png'; import ImportImg from 'url:../assets/option_import.png'; import HardwareImg from 'url:../assets/option_hardware.png'; import * as helpersStyles from '../shared/helperStyles.module.css'; -import { useOnboardingSession } from '../shared/useOnboardingSession'; import { ReferralProgramHandler } from '../../referral-program/WebAppMessageHandler'; import * as styles from './styles.module.css'; @@ -222,7 +221,6 @@ function Banner() { export function Welcome() { const { isNarrowView } = useWindowSizeStore(); - useOnboardingSession({ navigateOnExistingUser: 'success' }); const { data: loyaltyEnabled } = useRemoteConfigValue( 'extension_loyalty_enabled' diff --git a/src/ui/pages/Settings/Settings.tsx b/src/ui/pages/Settings/Settings.tsx index 9b63410054..d0187fbbd9 100644 --- a/src/ui/pages/Settings/Settings.tsx +++ b/src/ui/pages/Settings/Settings.tsx @@ -250,6 +250,14 @@ function SettingsMain() { + + + + + Privacy + + + @@ -501,6 +509,47 @@ function DeveloperTools() { ); } +function Privacy() { + const { globalPreferences, setGlobalPreferences } = useGlobalPreferences(); + useBackgroundKind({ kind: 'white' }); + + return ( + + + + + { + setGlobalPreferences({ + analyticsEnabled: event.target.checked, + }); + }} + detailText={ + + Help us improve our app experience by sharing anonymous statistics + about how you use Zerion. We will not associate any of this to you + and your personal data will not be sent to us. Read more in our{' '} + + Privacy Policy + + . + + } + /> + + + + ); +} + function Experiments() { const { preferences, setPreferences } = usePreferences(); useBackgroundKind({ kind: 'white' }); @@ -565,6 +614,14 @@ export function Settings() { } /> + + + + } + /> Date: Thu, 4 Sep 2025 19:53:41 +0100 Subject: [PATCH 2/6] guard all analytics events with global preferences --- src/shared/analytics/analytics.background.ts | 175 ++++++++++++++---- src/shared/analytics/analytics.client.ts | 21 +++ src/shared/analytics/shared/UserLifecycle.ts | 5 + src/ui/features/preferences/usePreferences.ts | 7 + 4 files changed, 175 insertions(+), 33 deletions(-) diff --git a/src/shared/analytics/analytics.background.ts b/src/shared/analytics/analytics.background.ts index 768ee47e96..8a605569f3 100644 --- a/src/shared/analytics/analytics.background.ts +++ b/src/shared/analytics/analytics.background.ts @@ -3,7 +3,10 @@ import { LoginActivity, type Account } from 'src/background/account/Account'; import { emitter } from 'src/background/events'; import { INTERNAL_SYMBOL_CONTEXT } from 'src/background/Wallet/Wallet'; import { INTERNAL_ORIGIN } from 'src/background/constants'; -import { getWalletNameFlagsChange } from 'src/background/Wallet/GlobalPreferences'; +import { + getWalletNameFlagsChange, + globalPreferences, +} from 'src/background/Wallet/GlobalPreferences'; import { dnaServiceEmitter } from 'src/modules/dna-service/dna.background'; import { estimateSessionExpiry } from 'src/background/user-activity'; import { @@ -99,23 +102,34 @@ function trackAppEvents({ account }: { account: Account }) { return createBaseParams(params); }; - emitter.on('requestAccountsResolved', ({ origin, address, explicitly }) => { - if (!explicitly) { - return; + emitter.on( + 'requestAccountsResolved', + async ({ origin, address, explicitly }) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } + if (!explicitly) { + return; + } + const params = createParams({ + request_name: 'dapp_connection', + dapp_domain: origin, + wallet_address: address, + ecosystem: toEcosystemProperty(getAddressType(address)), + eip6963_supported: eip6963Dapps.has(origin), + }); + sendToMetabase('dapp_connection', params); + const mixpanelParams = omit(params, ['request_name', 'wallet_address']); + mixpanelTrack('DApp: DApp Connection', mixpanelParams); } - const params = createParams({ - request_name: 'dapp_connection', - dapp_domain: origin, - wallet_address: address, - ecosystem: toEcosystemProperty(getAddressType(address)), - eip6963_supported: eip6963Dapps.has(origin), - }); - sendToMetabase('dapp_connection', params); - const mixpanelParams = omit(params, ['request_name', 'wallet_address']); - mixpanelTrack('DApp: DApp Connection', mixpanelParams); - }); + ); emitter.on('unlockedAppOpened', async () => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } await waitForAnalyticsIdSet(); const params = createParams({ request_name: 'unlocked_app_opened' }); /** @@ -131,6 +145,10 @@ function trackAppEvents({ account }: { account: Account }) { }); emitter.on('screenView', async (data) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } await waitForAnalyticsIdSet(); const params = createParams({ request_name: 'screen_view', @@ -150,6 +168,10 @@ function trackAppEvents({ account }: { account: Account }) { }); emitter.on('screenView', async (params) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } await waitForAnalyticsIdSet(); const gaParams = await prepareGaParams({ page_title: params.title, @@ -158,7 +180,11 @@ function trackAppEvents({ account }: { account: Account }) { gaCollect('page_view', gaParams); }); - emitter.on('buttonClicked', (data) => { + emitter.on('buttonClicked', async (data) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const { buttonName, buttonScope, pathname, walletAddress } = data; const params = createParams({ request_name: 'button_clicked', @@ -171,7 +197,11 @@ function trackAppEvents({ account }: { account: Account }) { mixpanelTrack(event_name, mixpanelParams); }); - emitter.on('bannerClicked', (data) => { + emitter.on('bannerClicked', async (data) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const { bannerName, pathname, walletAddress } = data; const params = createParams({ request_name: 'banner_clicked', @@ -185,6 +215,10 @@ function trackAppEvents({ account }: { account: Account }) { }); emitter.on('assetClicked', async (data) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const { assetId, pathname, section } = data; const assetData = await queryFungibleInfo({ @@ -204,7 +238,11 @@ function trackAppEvents({ account }: { account: Account }) { mixpanelTrack(event_name, mixpanelParams); }); - emitter.on('daylightAction', ({ event_name, ...data }) => { + emitter.on('daylightAction', async ({ event_name, ...data }) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const params = createParams({ request_name: 'daylight_action', wallet_address: data.address, @@ -214,7 +252,11 @@ function trackAppEvents({ account }: { account: Account }) { sendToMetabase('daylight_action', params); }); - emitter.on('globalError', ({ name, message }) => { + emitter.on('globalError', async ({ name, message }) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const params = createParams({ request_name: 'client_error', type: name, @@ -313,15 +355,27 @@ function trackAppEvents({ account }: { account: Account }) { statsigTrack('Transaction: Signed Transaction', mixpanelParams); }; - emitter.on('transactionSent', (result, context) => - trackTransactionSign({ status: 'success', result, context }) - ); + emitter.on('transactionSent', async (result, context) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } + trackTransactionSign({ status: 'success', result, context }); + }); - emitter.on('transactionFailed', (errorMessage, context) => - trackTransactionSign({ status: 'failed', errorMessage, context }) - ); + emitter.on('transactionFailed', async (errorMessage, context) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } + trackTransactionSign({ status: 'failed', errorMessage, context }); + }); emitter.on('transactionFormed', async (context) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const { formState, quote, @@ -457,15 +511,27 @@ function trackAppEvents({ account }: { account: Account }) { mixpanelTrack('Transaction: Signed Message', mixpanelParams); } - emitter.on('typedDataSigned', ({ typedData, ...rest }) => { + emitter.on('typedDataSigned', async ({ typedData, ...rest }) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } handleSign({ type: 'typedDataSigned', ...rest }); }); - emitter.on('messageSigned', ({ message, ...rest }) => { + emitter.on('messageSigned', async ({ message, ...rest }) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } handleSign({ type: 'messageSigned', ...rest }); }); // TODO: add networks-related analytics - emitter.on('addEthereumChain', ({ values: [chainConfig], origin }) => { + emitter.on('addEthereumChain', async ({ values: [chainConfig], origin }) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const wallet_address = getCurrentAddress(); const params = createParams({ request_name: 'custom_evm_network_created', @@ -481,7 +547,11 @@ function trackAppEvents({ account }: { account: Account }) { }); emitter.on('globalPreferencesChange', (state, prevState) => { - onIdle(() => { + onIdle(async () => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const { enabled: newlyEnabled, disabled: newlyDisabled } = getWalletNameFlagsChange(state, prevState); @@ -504,7 +574,11 @@ function trackAppEvents({ account }: { account: Account }) { }); }); - emitter.on('holdToSignPreferenceChange', (active) => { + emitter.on('holdToSignPreferenceChange', async (active) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const params = createParams({ request_name: 'hold_to_sign_prerefence', active, @@ -513,7 +587,11 @@ function trackAppEvents({ account }: { account: Account }) { mixpanelTrack('Experiments: Hold Sign Button', mixpanelParams); }); - emitter.on('walletCreated', ({ walletContainer, origin }) => { + emitter.on('walletCreated', async ({ walletContainer, origin }) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } for (const wallet of walletContainer.wallets) { const type = origin === WalletOrigin.extension @@ -541,6 +619,10 @@ function trackAppEvents({ account }: { account: Account }) { }); emitter.on('firstScreenView', async () => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } await waitForAnalyticsIdSet(); statsigTrack('General: Launch first time'); mixpanelTrack('General: Launch first time', {}); @@ -553,6 +635,10 @@ function trackAppEvents({ account }: { account: Account }) { }); emitter.on('backgroundScriptInitialized', async () => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } // We want to check whether background script got restarted in a way // that has led to an unexpected logout. // The browser restart is considered an expected logout. @@ -598,6 +684,10 @@ function trackAppEvents({ account }: { account: Account }) { }); dnaServiceEmitter.on('registerError', async (error, action) => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const request_name = 'client_error'; const message = getError(error).message; const type = 'dna action'; @@ -605,7 +695,11 @@ function trackAppEvents({ account }: { account: Account }) { sendToMetabase(request_name, params); }); - emitter.on('cloudflareChallengeIssued', () => { + emitter.on('cloudflareChallengeIssued', async () => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const params = createParams({ request_name: 'cloudflare_challenge_issued', }); @@ -621,10 +715,25 @@ export function initialize({ account }: { account: Account }) { initializeApiV4Analytics({ willSendRequest: createAddProviderHook({ getWalletProvider }), }); - const handleUserId = () => mixpanelIdentify(account); + const handleUserId = async () => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } + mixpanelIdentify(account); + }; account.on('authenticated', () => handleUserId()); if (account.getUser()) { handleUserId(); } + globalPreferences.on('change', (prevState, newState) => { + if ( + newState.analyticsEnabled && + !prevState.analyticsEnabled && + account.getUser() + ) { + handleUserId(); + } + }); return trackAppEvents({ account }); } diff --git a/src/shared/analytics/analytics.client.ts b/src/shared/analytics/analytics.client.ts index d473e805e7..6b94f63ce7 100644 --- a/src/shared/analytics/analytics.client.ts +++ b/src/shared/analytics/analytics.client.ts @@ -2,6 +2,7 @@ import { emitter } from 'src/ui/shared/events'; import { getWalletGroupByAddress } from 'src/ui/shared/requests/getWalletGroupByAddress'; import { readCachedCurrentAddress } from 'src/ui/shared/user-address/useAddressParams'; import { walletPort } from 'src/ui/shared/channels'; +import { fetchGlobalPreferences } from 'src/ui/features/preferences/usePreferences'; import { HandshakeFailed } from '../errors/errors'; import { rejectAfterDelay } from '../rejectAfterDelay'; import { createParams, sendToMetabase } from './analytics'; @@ -36,6 +37,10 @@ function trackAppEvents({ return { wallet_address: address?.toLowerCase(), wallet_provider } as const; } emitter.on('signingError', async (signatureType, message) => { + const preferences = await fetchGlobalPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const params = createParams({ request_name: 'client_error', type: signatureType, @@ -46,6 +51,10 @@ function trackAppEvents({ }); emitter.on('error', async (error) => { + const preferences = await fetchGlobalPreferences(); + if (!preferences.analyticsEnabled) { + return; + } if (error instanceof HandshakeFailed) { const params = createParams({ request_name: 'client_error', @@ -67,6 +76,10 @@ function trackAppEvents({ }); emitter.on('networksSearchResponse', async (query, resultsCount) => { + const preferences = await fetchGlobalPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const params = createParams({ request_name: 'network_search', query, @@ -85,6 +98,10 @@ function trackAppEvents({ }); emitter.on('errorScreenView', async (data) => { + const preferences = await fetchGlobalPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const params = createParams({ request_name: 'client_error', type: 'global error', @@ -96,6 +113,10 @@ function trackAppEvents({ }); emitter.on('loaderScreenView', async (data) => { + const preferences = await fetchGlobalPreferences(); + if (!preferences.analyticsEnabled) { + return; + } const params = createParams({ request_name: 'client_error', type: 'global error', diff --git a/src/shared/analytics/shared/UserLifecycle.ts b/src/shared/analytics/shared/UserLifecycle.ts index 76cf0a29a9..8c501ee694 100644 --- a/src/shared/analytics/shared/UserLifecycle.ts +++ b/src/shared/analytics/shared/UserLifecycle.ts @@ -1,4 +1,5 @@ import { emitter } from 'src/background/events'; +import { globalPreferences } from 'src/background/Wallet/GlobalPreferences'; import { PersistentStore } from 'src/modules/persistent-store'; interface State { @@ -23,6 +24,10 @@ class UserLifecycleStore extends PersistentStore { super(initialState, key); emitter.on('screenView', async () => { + const preferences = await globalPreferences.getPreferences(); + if (!preferences.analyticsEnabled) { + return; + } await this.ready(); this.setState((state) => { if (state.installedEvent == null) { diff --git a/src/ui/features/preferences/usePreferences.ts b/src/ui/features/preferences/usePreferences.ts index 81ad13f06f..09df5a4355 100644 --- a/src/ui/features/preferences/usePreferences.ts +++ b/src/ui/features/preferences/usePreferences.ts @@ -46,6 +46,13 @@ async function setGlobalPreferences(preferences: GlobalPreferences) { walletPort.request('setGlobalPreferences', { preferences }); } +export async function fetchGlobalPreferences() { + return queryClient.fetchQuery({ + queryKey: ['wallet/getGlobalPreferences'], + queryFn: () => walletPort.request('getGlobalPreferences'), + }); +} + export function useGlobalPreferences() { const query = useQuery({ queryKey: ['wallet/getGlobalPreferences'], From 26fbbf4a0d86db65ef94e13b2c8c37df3fef1fef Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 4 Sep 2025 19:54:11 +0100 Subject: [PATCH 3/6] disable analytics by default for all platforms --- src/background/Wallet/GlobalPreferences.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/background/Wallet/GlobalPreferences.ts b/src/background/Wallet/GlobalPreferences.ts index 2d45240dca..f554cb53d9 100644 --- a/src/background/Wallet/GlobalPreferences.ts +++ b/src/background/Wallet/GlobalPreferences.ts @@ -5,7 +5,7 @@ import { getRemoteConfigValue } from 'src/modules/remote-config'; import { removeEmptyValues } from 'src/shared/removeEmptyValues'; import { equal } from 'src/modules/fast-deep-equal'; import { difference } from 'src/shared/difference'; -import { PLATFORM } from 'src/env/config'; +// import { PLATFORM } from 'src/env/config'; import type { WalletNameFlag } from './model/WalletNameFlag'; const HALF_DAY = 1000 * 60 * 60 * 12; @@ -60,7 +60,7 @@ export class GlobalPreferences extends PersistentStore { recognizableConnectButtons: true, providerInjection: {}, walletNameFlags: {}, - analyticsEnabled: PLATFORM === 'chrome' ? true : null, + analyticsEnabled: null, autoLockTimeout: HALF_DAY, }; From 0fe2a240a41c3a3d22d1a099e32e3d1f95a1d59c Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 5 Sep 2025 11:58:54 +0100 Subject: [PATCH 4/6] Bug fixes --- src/shared/analytics/analytics.background.ts | 4 ++-- .../onboarding/ShareData/ShareData.tsx | 23 ++++++++++++------- .../referral-program/WebAppMessageHandler.tsx | 2 +- src/ui/pages/Settings/Settings.tsx | 2 +- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/shared/analytics/analytics.background.ts b/src/shared/analytics/analytics.background.ts index 8a605569f3..c03bf52bdf 100644 --- a/src/shared/analytics/analytics.background.ts +++ b/src/shared/analytics/analytics.background.ts @@ -726,9 +726,9 @@ export function initialize({ account }: { account: Account }) { if (account.getUser()) { handleUserId(); } - globalPreferences.on('change', (prevState, newState) => { + globalPreferences.on('change', (state, prevState) => { if ( - newState.analyticsEnabled && + state.analyticsEnabled && !prevState.analyticsEnabled && account.getUser() ) { diff --git a/src/ui/features/onboarding/ShareData/ShareData.tsx b/src/ui/features/onboarding/ShareData/ShareData.tsx index 359472a852..2349f793ed 100644 --- a/src/ui/features/onboarding/ShareData/ShareData.tsx +++ b/src/ui/features/onboarding/ShareData/ShareData.tsx @@ -6,6 +6,7 @@ import { Button } from 'src/ui/ui-kit/Button'; import { useGlobalPreferences } from 'src/ui/features/preferences/usePreferences'; import { useWindowSizeStore } from 'src/ui/shared/useWindowSizeStore'; import { UnstyledAnchor } from 'src/ui/ui-kit/UnstyledAnchor'; +import { useMutation } from '@tanstack/react-query'; import { useOnboardingSession } from '../shared/useOnboardingSession'; import * as helpersStyles from '../shared/helperStyles.module.css'; @@ -24,12 +25,16 @@ export function ShareData() { } }, [query.isLoading, globalPreferences?.analyticsEnabled, navigate]); - const handleAnalyticsChoice = (enabled: boolean) => { - setGlobalPreferences({ - analyticsEnabled: enabled, - }); - navigate('/onboarding/welcome'); - }; + const handleAnalyticsChoiceMutation = useMutation({ + mutationFn: async (enabled: boolean) => { + return setGlobalPreferences({ + analyticsEnabled: enabled, + }); + }, + onSuccess: () => { + navigate('/onboarding/welcome'); + }, + }); if (query.isLoading) { return null; @@ -97,7 +102,8 @@ export function ShareData() {