Skip to content

Commit c636a4b

Browse files
vetalcoregreatertomimchappell
authored
feat: [lw-11532] add analytics for shared wallet (#1462)
* feat: [lw-11532] add analytics for shared wallet * feat: [lw-11532] resolve pr comments * feat: [lw-11532] resolve pr comments * feat: [lw-11532] resolve pr comments * fix: resolve sdet comments * fix: resolve sdet comments * chore: resolve sonarcloud issues * fix: improve beta optin and optout analytics --------- Co-authored-by: John Oshalusi <[email protected]> Co-authored-by: Michael Chappell <[email protected]>
1 parent a393618 commit c636a4b

File tree

15 files changed

+270
-58
lines changed

15 files changed

+270
-58
lines changed

apps/browser-extension-wallet/src/views/browser-view/components/TransactionCTAsBox/TransactionCTAsBox.tsx

+10-3
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,25 @@ export const TransactionCTAsBox = (): React.ReactElement => {
2727
};
2828

2929
const openSend = () => {
30-
// eslint-disable-next-line camelcase
31-
analytics.sendEventToPostHog(PostHogAction.SendClick, { trigger_point: SendFlowTriggerPoints.SEND_BUTTON });
30+
isSharedWallet
31+
? analytics.sendEventToPostHog(PostHogAction.SharedWalletsSendClick)
32+
: // eslint-disable-next-line camelcase
33+
analytics.sendEventToPostHog(PostHogAction.SendClick, { trigger_point: SendFlowTriggerPoints.SEND_BUTTON });
3234
openSendTransactionDrawer();
3335
setTriggerPoint(SendFlowTriggerPoints.SEND_BUTTON);
3436
};
3537

38+
const onCoSignClick = () => {
39+
analytics.sendEventToPostHog(PostHogAction.SharedWalletsCosignClick);
40+
openCoSignTransactionDrawer();
41+
};
42+
3643
return (
3744
<TransactionCTAs
3845
buttonClassName={styles.btn}
3946
onSendClick={openSend}
4047
onReceiveClick={openReceive}
41-
onCoSignClick={isSharedWallet ? openCoSignTransactionDrawer : undefined}
48+
onCoSignClick={isSharedWallet ? onCoSignClick : undefined}
4249
/>
4350
);
4451
};

apps/browser-extension-wallet/src/views/browser-view/features/send-transaction/components/ImportSharedWalletTransaction.tsx

+4
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@ import { useBuiltTxState } from '../store';
55
import { Serialization } from '@cardano-sdk/core';
66
import { Wallet } from '@lace/cardano';
77
import { useWalletState } from '@hooks/useWalletState';
8+
import { useAnalyticsContext } from '@providers';
9+
import { PostHogAction } from '@providers/AnalyticsProvider/analyticsTracker';
810

911
export const ImportSharedWalletTransaction = (): JSX.Element => {
1012
const [config] = useDrawer();
1113
const { setBuiltTxData } = useBuiltTxState();
1214
const walletState = useWalletState();
15+
const analytics = useAnalyticsContext();
1316

1417
return (
1518
<CoSignEntry
19+
onImportError={() => analytics.sendEventToPostHog(PostHogAction.SharedWalletsCosignTxImportJsonError)}
1620
// eslint-disable-next-line react/jsx-handler-names
1721
onCancel={config.onClose}
1822
onContinue={async (txData) => {

apps/browser-extension-wallet/src/views/browser-view/features/send-transaction/components/SendTransactionDrawer/Footer.tsx

+53-12
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable no-magic-numbers */
12
/* eslint-disable camelcase */
23
/* eslint-disable max-statements */
34
/* eslint-disable unicorn/no-null */
@@ -102,29 +103,48 @@ export const Footer = withAddressBookContext(
102103
const sendAnalytics = useCallback(() => {
103104
switch (currentSection.currentSection) {
104105
case Sections.FORM: {
105-
sendEventToPostHog(PostHogAction.SendTransactionDataReviewTransactionClick);
106+
const event = isSharedWallet
107+
? 'SharedWalletsSendTxDataReviewTxClick'
108+
: 'SendTransactionDataReviewTransactionClick';
109+
sendEventToPostHog(PostHogAction[event]);
106110
break;
107111
}
108112
case Sections.SUMMARY: {
109-
sendEventToPostHog(PostHogAction.SendTransactionSummaryConfirmClick);
113+
const event = isSharedWallet
114+
? 'SharedWalletsSendTxSummaryConfirmClick'
115+
: 'SendTransactionSummaryConfirmClick';
116+
builtTxData.importedSharedWalletTx
117+
? sendEventToPostHog(PostHogAction.SharedWalletsCosignTxSummaryConfirmClick)
118+
: sendEventToPostHog(PostHogAction[event]);
110119
break;
111120
}
112121
case Sections.CONFIRMATION: {
113-
sendEventToPostHog(PostHogAction.SendTransactionConfirmationConfirmClick);
122+
const event = isSharedWallet
123+
? 'SharedWalletsSendTxConfirmationConfirmClick'
124+
: 'SendTransactionConfirmationConfirmClick';
125+
sendEventToPostHog(PostHogAction[event]);
114126
break;
115127
}
116128
case Sections.SUCCESS_TX: {
117-
sendEventToPostHog(PostHogAction.SendAllDoneViewTransactionClick);
129+
const event = isSharedWallet ? 'SharedWalletsSendAllDoneViewTxClick' : 'SendAllDoneViewTransactionClick';
130+
sendEventToPostHog(PostHogAction[event]);
118131
break;
119132
}
120133
case Sections.UNAUTHORIZED_TX:
121134
case Sections.FAIL_TX: {
122-
sendEventToPostHog(PostHogAction.SendSomethingWentWrongBackClick);
135+
const event = isSharedWallet
136+
? 'SharedWalletsSendSomethingWentWrongBackClick'
137+
: 'SendSomethingWentWrongBackClick';
138+
sendEventToPostHog(PostHogAction[event]);
139+
break;
140+
}
141+
case Sections.IMPORT_SHARED_WALLET_TRANSACTION_JSON: {
142+
sendEventToPostHog(PostHogAction.SharedWalletsCosignTxContinueClick);
123143
break;
124144
}
125145
}
126146
// eslint-disable-next-line react-hooks/exhaustive-deps
127-
}, [currentSection.currentSection, isPopupView]);
147+
}, [currentSection.currentSection, isPopupView, isSharedWallet]);
128148

129149
const handleReviewAddress = useCallback(
130150
(result: keyof typeof ACTIONS) => {
@@ -301,7 +321,8 @@ export const Footer = withAddressBookContext(
301321
return handleVerifyPass();
302322
}
303323
case txHasSucceeded: {
304-
return onCloseSubmitedTransaction();
324+
// Tab is closed sooner than analytics are sent
325+
return setTimeout(() => onCloseSubmitedTransaction(), 300);
305326
}
306327
case txHasFailed: {
307328
setSubmitingTxState({ isPasswordValid: true });
@@ -327,13 +348,33 @@ export const Footer = withAddressBookContext(
327348
]);
328349

329350
const handleClose = () => {
330-
if (currentSection.currentSection === Sections.SUCCESS_TX) {
331-
sendEventToPostHog(PostHogAction.SendAllDoneCloseClick);
332-
} else if (currentSection.currentSection === Sections.FAIL_TX) {
333-
sendEventToPostHog(PostHogAction.SendSomethingWentWrongCancelClick);
351+
switch (currentSection.currentSection) {
352+
case Sections.SUCCESS_TX: {
353+
const event = isSharedWallet ? 'SharedWalletsSendAllDoneCloseClick' : 'SendAllDoneCloseClick';
354+
sendEventToPostHog(PostHogAction[event]);
355+
break;
356+
}
357+
case Sections.FAIL_TX: {
358+
const event = isSharedWallet
359+
? 'SharedWalletsSendSomethingWentWrongCancelClick'
360+
: 'SendSomethingWentWrongCancelClick';
361+
sendEventToPostHog(PostHogAction[event]);
362+
break;
363+
}
364+
case Sections.IMPORT_SHARED_WALLET_TRANSACTION_JSON: {
365+
sendEventToPostHog(PostHogAction.SharedWalletsCosignTxCancelClick);
366+
break;
367+
}
368+
case Sections.SUMMARY: {
369+
sendEventToPostHog(PostHogAction.SharedWalletsCosignTxSummaryCancelClick);
370+
break;
371+
}
372+
// No default
334373
}
335374

336-
onClose();
375+
setTimeout(() => {
376+
onClose();
377+
}, 300);
337378
};
338379

339380
const confirmDisable = useMemo(

apps/browser-extension-wallet/src/views/browser-view/features/send-transaction/components/SendTransactionDrawer/HeaderView.tsx

+19-9
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ export const HeaderNavigation = ({
136136
const [isMultipleSelectionAvailable, setMultipleSelection] = useMultipleSelection();
137137
const { selectedTokenList, resetTokenList } = useSelectedTokenList();
138138
const { triggerPoint } = useAnalyticsSendFlowTriggerPoint();
139+
const { isSharedWallet } = useWalletStore();
139140

140141
const shouldRenderArrow = isPopupView
141142
? [...sectionsWithArrowIcon, Sections.FORM].includes(section.currentSection)
@@ -169,17 +170,26 @@ export const HeaderNavigation = ({
169170

170171
const onCrossIconClick = () => {
171172
if (section.currentSection === Sections.SUCCESS_TX) {
172-
analytics.sendEventToPostHog(PostHogAction.SendAllDoneXClick, {
173-
trigger_point: triggerPoint,
174-
[TX_CREATION_TYPE_KEY]: TxCreationType.Internal
175-
});
173+
analytics.sendEventToPostHog(
174+
PostHogAction[isSharedWallet ? 'SharedWalletsSendAllDoneXClick' : 'SendAllDoneXClick'],
175+
{
176+
trigger_point: triggerPoint,
177+
[TX_CREATION_TYPE_KEY]: TxCreationType.Internal
178+
}
179+
);
176180
} else if (section.currentSection === Sections.FAIL_TX || section.currentSection === Sections.UNAUTHORIZED_TX) {
177-
analytics.sendEventToPostHog(PostHogAction.SendSomethingWentWrongXClick, {
178-
trigger_point: triggerPoint,
179-
[TX_CREATION_TYPE_KEY]: TxCreationType.Internal
180-
});
181+
analytics.sendEventToPostHog(
182+
PostHogAction[isSharedWallet ? 'SharedWalletsSendSomethingWentWrongXClick' : 'SendSomethingWentWrongXClick'],
183+
{
184+
trigger_point: triggerPoint,
185+
[TX_CREATION_TYPE_KEY]: TxCreationType.Internal
186+
}
187+
);
181188
}
182-
onClose();
189+
setTimeout(() => {
190+
onClose();
191+
// eslint-disable-next-line no-magic-numbers
192+
}, 300);
183193
};
184194

185195
const { uiOutputs } = useCoinStateSelector(FIRST_ROW);

apps/browser-extension-wallet/src/views/browser-view/features/send-transaction/components/TransactionFail.tsx

+10-5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { PostHogAction, TX_CREATION_TYPE_KEY, TxCreationType } from '@providers/
66
import styles from './TransactionSuccessView.module.scss';
77
import { useAnalyticsSendFlowTriggerPoint } from '../store';
88
import { WarningBanner } from '@lace/common';
9+
import { useWalletStore } from '@src/stores';
910

1011
interface TransactionFailProps {
1112
showCustomApiBanner?: boolean;
@@ -15,13 +16,17 @@ export const TransactionFail = ({ showCustomApiBanner = false }: TransactionFail
1516
const { t } = useTranslation();
1617
const analytics = useAnalyticsContext();
1718
const { triggerPoint } = useAnalyticsSendFlowTriggerPoint();
19+
const { isSharedWallet } = useWalletStore();
1820

1921
useEffect(() => {
20-
analytics.sendEventToPostHog(PostHogAction.SendSomethingWentWrongView, {
21-
// eslint-disable-next-line camelcase
22-
trigger_point: triggerPoint,
23-
[TX_CREATION_TYPE_KEY]: TxCreationType.Internal
24-
});
22+
analytics.sendEventToPostHog(
23+
PostHogAction[isSharedWallet ? 'SharedWalletsSendSomethingWentWrongView' : 'SendSomethingWentWrongView'],
24+
{
25+
// eslint-disable-next-line camelcase
26+
trigger_point: triggerPoint,
27+
[TX_CREATION_TYPE_KEY]: TxCreationType.Internal
28+
}
29+
);
2530
// eslint-disable-next-line react-hooks/exhaustive-deps
2631
}, []);
2732

apps/browser-extension-wallet/src/views/browser-view/features/send-transaction/components/TransactionSuccessView.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export const TransactionSuccessView = ({ footerSlot }: { footerSlot?: React.Reac
6565
);
6666
const recipientTypesUnique = uniq(recipientTypes);
6767
const recipientSourceUnique = uniq(recipientSources);
68-
analytics.sendEventToPostHog(PostHogAction.SendAllDoneView, {
68+
analytics.sendEventToPostHog(PostHogAction[isSharedWallet ? 'SharedWalletsSendAllDoneView' : 'SendAllDoneView'], {
6969
// eslint-disable-next-line camelcase
7070
trigger_point: triggerPoint,
7171
tokens: customAnalyticsProperties,

apps/browser-extension-wallet/src/views/browser-view/features/settings/components/SettingsPreferences/SettingsPreferences.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ export const SettingsPreferences = ({ popupView = false }: SettingsPreferencesPr
5252
await posthog.setOptedInBeta(isOptedIn);
5353
setIsOptInBeta(isOptedIn);
5454

55-
await analytics.sendEventToPostHog(PostHogAction.SettingsBetaProgramClick, { isOptedIn });
55+
await analytics.sendEventToPostHog(
56+
isOptedIn ? PostHogAction.SettingsBetaProgramOptInClick : PostHogAction.SettingsBetaProgramOptOutClick
57+
);
5658
};
5759

5860
return (

apps/browser-extension-wallet/src/views/browser-view/features/shared-wallet/SharedWallet.tsx

+48-4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import { useWalletStore } from '@stores';
1818
import { WalletType } from '@cardano-sdk/web-extension';
1919
import { config } from '@src/config';
2020
import { Wallet } from '@lace/cardano';
21+
import { useAnalyticsContext } from '@providers';
22+
import { PostHogAction } from '@providers/AnalyticsProvider/analyticsTracker';
2123

2224
const { CHAIN } = config();
2325
const DEFAULT_CHAIN_ID = Wallet.Cardano.ChainIds[CHAIN];
@@ -29,6 +31,7 @@ type CreateWalletParams = {
2931
};
3032

3133
export const SharedWallet = (): JSX.Element => {
34+
const analytics = useAnalyticsContext();
3235
const history = useHistory();
3336
const { walletRepository, generateSharedWalletKey, saveSharedWalletKey, createInMemorySharedWallet } =
3437
useWalletManager();
@@ -89,6 +92,9 @@ export const SharedWallet = (): JSX.Element => {
8992
activeWalletName={walletInfo?.name || ''}
9093
activeWalletType={activeWalletType}
9194
generateKey={generateKey}
95+
onGenerateKeys={() => analytics.sendEventToPostHog(PostHogAction.SharedWalletsGenerateKeyClick)}
96+
onCopyKeys={() => analytics.sendEventToPostHog(PostHogAction.SharedWalletsGenerateCopyKeyClick)}
97+
onClose={async () => await analytics.sendEventToPostHog(PostHogAction.SharedWalletsGenerateCloseClick)}
9298
navigateToParentFlow={() => history.push(walletRoutePaths.sharedWallet.root)}
9399
/>
94100
)}
@@ -105,6 +111,29 @@ export const SharedWallet = (): JSX.Element => {
105111
exitTheFlow={() => history.push(walletRoutePaths.sharedWallet.root)}
106112
sharedWalletKey={sharedWalletKey}
107113
onCreateSharedWallet={handleCreateWallet}
114+
onWalletNameNextClick={() => {
115+
analytics.sendEventToPostHog(PostHogAction.SharedWalletsCreateWalletNameNextClick);
116+
}}
117+
onAddCosignersNextClick={() => {
118+
analytics.sendEventToPostHog(PostHogAction.SharedWalletsCreateAddCosignersNextClick);
119+
}}
120+
onImportantInfoNextClick={() => {
121+
analytics.sendEventToPostHog(PostHogAction.SharedWalletsCreateImportantInfoContinueClick);
122+
}}
123+
onImportantInfoBackClick={() => {
124+
analytics.sendEventToPostHog(PostHogAction.SharedWalletsCreateImportantInfoBackClick);
125+
}}
126+
onDefineQuorumNextClick={() => {
127+
analytics.sendEventToPostHog(PostHogAction.SharedWalletsCreateDefineQuorumNextClick);
128+
}}
129+
onDefineQuorumDownloadClick={() => {
130+
analytics.sendEventToPostHog(PostHogAction.SharedWalletsCreateDefineQuorumDownloadClick);
131+
}}
132+
onOpenSharedWalletClick={() => {
133+
analytics.sendEventToPostHog(
134+
PostHogAction.SharedWalletsCreateShareWalletDetailsOpenSharedWalletClick
135+
);
136+
}}
108137
/>
109138
)}
110139
/>
@@ -115,10 +144,16 @@ export const SharedWallet = (): JSX.Element => {
115144
path={walletRoutePaths.sharedWallet.import}
116145
render={() => (
117146
<SharedWalletRestorationFlow
118-
onRestoreSharedWallet={handleCreateWallet}
147+
onRestoreSharedWallet={async (data: CreateWalletParams) => {
148+
await analytics.sendEventToPostHog(PostHogAction.SharedWalletsLocateWalletOpenWalletClick);
149+
await handleCreateWallet(data);
150+
}}
119151
sharedKeys={sharedWalletKey}
120152
exitTheFlow={() => history.push(walletRoutePaths.sharedWallet.root)}
121153
navigateToAppHome={() => setBackgroundPage()}
154+
onImportJsonError={async () =>
155+
await analytics.sendEventToPostHog(PostHogAction.SharedWalletsLocateWalletImportJsonError)
156+
}
122157
/>
123158
)}
124159
/>
@@ -128,9 +163,18 @@ export const SharedWallet = (): JSX.Element => {
128163
path={walletRoutePaths.sharedWallet.root}
129164
render={() => (
130165
<AddSharedWalletMainPageFlow
131-
onCreateSharedWalletClick={() => history.push(walletRoutePaths.sharedWallet.create)}
132-
onImportSharedWalletClick={() => history.push(walletRoutePaths.sharedWallet.import)}
133-
onKeysGenerateClick={() => history.push(walletRoutePaths.sharedWallet.generateKeys)}
166+
onCreateSharedWalletClick={async () => {
167+
await analytics.sendEventToPostHog(PostHogAction.SharedWalletsCreateClick);
168+
history.push(walletRoutePaths.sharedWallet.create);
169+
}}
170+
onImportSharedWalletClick={async () => {
171+
await analytics.sendEventToPostHog(PostHogAction.SharedWalletsConnectClick);
172+
history.push(walletRoutePaths.sharedWallet.import);
173+
}}
174+
onKeysGenerateClick={async () => {
175+
await analytics.sendEventToPostHog(PostHogAction.SharedWalletsGenerateClick);
176+
history.push(walletRoutePaths.sharedWallet.generateKeys);
177+
}}
134178
sharedWalletKey={sharedWalletKey}
135179
/>
136180
)}

0 commit comments

Comments
 (0)