Skip to content

Commit ca0fde8

Browse files
authored
feat 📈 (llm): add analytics for new accounts list (#8818)
📈 (llm): add analytics for new accounts list
1 parent d9d8f8b commit ca0fde8

File tree

9 files changed

+75
-15
lines changed

9 files changed

+75
-15
lines changed

.changeset/hot-taxis-explain.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"live-mobile": minor
3+
---
4+
5+
Add analytics for llm new account list ui

apps/ledger-live-mobile/src/components/NavigationHeaderBackButton.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Flex, Icons } from "@ledgerhq/native-ui";
2-
import { useNavigation } from "@react-navigation/native";
2+
import { NavigationProp, NavigationState, useNavigation } from "@react-navigation/native";
33
import React from "react";
44
import Touchable from "./Touchable";
55

@@ -8,7 +8,11 @@ type Props = {
88
* Function called when user presses on the back arrow.
99
* If undefined: default `navigation.goBack` is used.
1010
*/
11-
onPress?: () => void;
11+
onPress?: (
12+
nav: Omit<NavigationProp<ReactNavigation.RootParamList>, "getState"> & {
13+
getState(): NavigationState | undefined;
14+
},
15+
) => void;
1216
};
1317

1418
export const NavigationHeaderBackImage = () => (
@@ -25,7 +29,7 @@ export const NavigationHeaderBackButton: React.FC<Props> = React.memo(({ onPress
2529
return (
2630
<Touchable
2731
testID="navigation-header-back-button"
28-
onPress={() => (onPress ? onPress() : navigation.goBack())}
32+
onPress={() => (onPress ? onPress(navigation) : navigation.goBack())}
2933
>
3034
<NavigationHeaderBackImage />
3135
</Touchable>

apps/ledger-live-mobile/src/components/RootNavigator/AccountsNavigator.tsx

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useMemo } from "react";
1+
import React, { useCallback, useMemo } from "react";
22
import { createStackNavigator } from "@react-navigation/stack";
33
import { useTheme } from "styled-components/native";
44
import { useSelector } from "react-redux";
@@ -25,17 +25,47 @@ import type { AccountsNavigatorParamList } from "./types/AccountsNavigator";
2525
import { hasNoAccountsSelector } from "~/reducers/accounts";
2626
import AccountsList from "LLM/features/Accounts/screens/AccountsList";
2727
import { useFeature } from "@ledgerhq/live-common/featureFlags/index";
28+
import { NavigationHeaderBackButton } from "../NavigationHeaderBackButton";
29+
import { track } from "~/analytics";
30+
import { NavigationProp, NavigationState, useNavigation, useRoute } from "@react-navigation/native";
31+
import { TrackingEvent } from "LLM/features/Accounts/enums";
2832

2933
const Stack = createStackNavigator<AccountsNavigatorParamList>();
3034

35+
type NavType = Omit<NavigationProp<ReactNavigation.RootParamList>, "getState"> & {
36+
getState(): NavigationState | undefined;
37+
};
38+
39+
type ParamsType = {
40+
params?: { specificAccounts?: object[] };
41+
};
42+
3143
export default function AccountsNavigator() {
3244
const { colors } = useTheme();
3345
const stackNavConfig = useMemo(() => getStackNavigatorConfig(colors), [colors]);
3446
const accountListUIFF = useFeature("llmAccountListUI");
47+
const route = useRoute();
48+
const navigation = useNavigation();
3549

3650
const hasNoAccounts = useSelector(hasNoAccountsSelector);
3751
const readOnlyModeEnabled = useSelector(readOnlyModeEnabledSelector) && hasNoAccounts;
3852

53+
const onPressBack = useCallback(
54+
(nav: NavType) => {
55+
// Needed since we use the same screen for different purposes
56+
const params: ParamsType = navigation.getState()?.routes[1].params || {};
57+
const screenName = params?.params?.specificAccounts
58+
? TrackingEvent.AccountListSummary
59+
: TrackingEvent.AccountsList;
60+
track("button_clicked", {
61+
button: "Back",
62+
page: screenName || route.name,
63+
});
64+
nav.goBack();
65+
},
66+
[navigation, route.name],
67+
);
68+
3969
return (
4070
<Stack.Navigator screenOptions={stackNavConfig}>
4171
<Stack.Screen
@@ -84,6 +114,7 @@ export default function AccountsNavigator() {
84114
component={AccountsList}
85115
options={{
86116
headerTitle: "",
117+
headerLeft: () => <NavigationHeaderBackButton onPress={onPressBack} />,
87118
}}
88119
/>
89120
)}

apps/ledger-live-mobile/src/newArch/features/Accounts/Navigator.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useCallback, useMemo } from "react";
22
import { Platform } from "react-native";
33
import { createStackNavigator } from "@react-navigation/stack";
44
import { useTheme } from "styled-components/native";
5-
import { useRoute } from "@react-navigation/native";
5+
import { useNavigation, useRoute } from "@react-navigation/native";
66
import { ScreenName } from "~/const";
77
import { getStackNavigatorConfig } from "~/navigation/navigatorConfig";
88
import { track } from "~/analytics";
@@ -13,11 +13,13 @@ import ScanDeviceAccounts from "LLM/features/Accounts/screens/ScanDeviceAccounts
1313
import { AccountsListNavigator } from "./screens/AccountsList/types";
1414
import { useFeature } from "@ledgerhq/live-common/featureFlags/index";
1515
import AccountsList from "LLM/features/Accounts/screens/AccountsList";
16+
import { NavigationHeaderBackButton } from "~/components/NavigationHeaderBackButton";
1617

1718
export default function Navigator() {
1819
const { colors } = useTheme();
1920
const route = useRoute();
2021
const accountListUIFF = useFeature("llmAccountListUI");
22+
const navigation = useNavigation();
2123

2224
const onClose = useCallback(() => {
2325
track("button_clicked", {
@@ -34,6 +36,14 @@ export default function Navigator() {
3436
[colors, onClose],
3537
);
3638

39+
const onPressBack = useCallback(() => {
40+
track("button_clicked", {
41+
button: "Back",
42+
page: route.name,
43+
});
44+
navigation.goBack();
45+
}, [route, navigation]);
46+
3747
return (
3848
<Stack.Navigator
3949
screenOptions={{
@@ -65,6 +75,7 @@ export default function Navigator() {
6575
component={AccountsList}
6676
options={{
6777
headerTitle: "",
78+
headerLeft: () => <NavigationHeaderBackButton onPress={onPressBack} />,
6879
}}
6980
/>
7081
)}

apps/ledger-live-mobile/src/newArch/features/Accounts/components/AddAccountButton/index.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,15 @@ type Props = {
2424
sourceScreenName: string;
2525
onClick?: () => void;
2626
disabled?: boolean;
27+
currency?: string;
2728
};
2829

29-
const AddAccountButton: React.FC<Props> = ({ sourceScreenName, disabled, onClick }) => {
30+
const AddAccountButton: React.FC<Props> = ({ sourceScreenName, disabled, currency, onClick }) => {
3031
const { t } = useTranslation();
3132
const [isAddModalOpened, setAddModalOpened] = useState<boolean>(false);
3233

3334
const openAddModal = () => {
34-
track("button_clicked", { button: "Add a new account", page: sourceScreenName });
35+
track("button_clicked", { button: "Add a new account", page: sourceScreenName, currency });
3536
if (onClick) {
3637
onClick();
3738
return;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export enum TrackingEvent {
2+
AccountListSummary = "Account List Summary",
3+
AccountsList = "Accounts",
4+
}

apps/ledger-live-mobile/src/newArch/features/Accounts/screens/AccountsList/index.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { useFeature } from "@ledgerhq/live-common/featureFlags/index";
2424
import { useGroupedCurrenciesByProvider } from "@ledgerhq/live-common/deposit/index";
2525
import { LoadingBasedGroupedCurrencies, LoadingStatus } from "@ledgerhq/live-common/deposit/type";
2626
import { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets";
27-
27+
import { TrackingEvent } from "../../enums";
2828
type Props = StackNavigatorProps<AccountsListNavigator, ScreenName.AccountsList>;
2929

3030
export default function AccountsList({ route }: Props) {
@@ -103,10 +103,13 @@ export default function AccountsList({ route }: Props) {
103103
}, [currency, llmNetworkBasedAddAccountFlow?.enabled, navigation, provider, specificAccounts]);
104104

105105
const onClick = specificAccounts ? onAddAccount : undefined;
106-
106+
const pageTrackingEvent = specificAccounts
107+
? TrackingEvent.AccountListSummary
108+
: TrackingEvent.AccountsList;
109+
const currencyToTrack = specificAccounts ? currency?.name : undefined;
107110
return (
108111
<>
109-
<TrackScreen event="Accounts" />
112+
<TrackScreen name={pageTrackingEvent} source={sourceScreenName} currency={currencyToTrack} />
110113
<ReactNavigationPerformanceView screenName={ScreenName.AccountsList} interactive>
111114
<SafeAreaView edges={["left", "right", "bottom"]} isFlex style={{ marginHorizontal: 16 }}>
112115
{showHeader && (
@@ -129,7 +132,8 @@ export default function AccountsList({ route }: Props) {
129132
{canAddAccount && (
130133
<AddAccountButton
131134
disabled={isAddAccountCtaDisabled}
132-
sourceScreenName="Accounts"
135+
sourceScreenName={pageTrackingEvent}
136+
currency={currencyToTrack}
133137
onClick={onClick}
134138
/>
135139
)}

apps/ledger-live-mobile/src/newArch/features/Assets/screens/AssetsList/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export default function AssetsList({ route }: Props) {
2929

3030
return (
3131
<>
32-
<TrackScreen event="Accounts" />
32+
<TrackScreen name="Assets" source={sourceScreenName} />
3333
<ReactNavigationPerformanceView screenName={ScreenName.AssetsList} interactive>
3434
<SafeAreaView edges={["left", "right", "bottom"]} isFlex style={{ marginHorizontal: 16 }}>
3535
{showHeader && (

apps/ledger-live-mobile/src/screens/WalletCentricAsset/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,6 @@ const AssetScreen = ({ route }: NavigationProps) => {
109109
);
110110

111111
const onAddAccount = useCallback(() => {
112-
track("button_clicked", {
113-
button: "Add new",
114-
});
115112
if (llmNetworkBasedAddAccountFlow?.enabled && currency) {
116113
if (provider && provider?.currenciesByNetwork.length > 1) {
117114
navigation.navigate(NavigatorName.AssetSelection, {
@@ -131,6 +128,9 @@ const AssetScreen = ({ route }: NavigationProps) => {
131128
});
132129
}
133130
} else {
131+
track("button_clicked", {
132+
button: "Add new",
133+
});
134134
navigation.navigate(NavigatorName.AddAccounts, {
135135
screen: undefined,
136136
currency,

0 commit comments

Comments
 (0)