From 7baf636cd1d693d786544518fd758fa62a9dbf9d Mon Sep 17 00:00:00 2001 From: kaito <80802871+kaitoo1@users.noreply.github.com> Date: Tue, 12 Sep 2023 17:15:26 +0900 Subject: [PATCH] [GAL-4259] include isBetaTester in events (#1902) * include isBetaTester in events * add function to web too --- .../src/contexts/MobileAnalyticsProvider.tsx | 11 ++++++- .../analytics/WebAnalyticsProvider.tsx | 18 ++++++++++- .../shared/src/contexts/AnalyticsContext.tsx | 31 ++++++++++++++----- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/apps/mobile/src/contexts/MobileAnalyticsProvider.tsx b/apps/mobile/src/contexts/MobileAnalyticsProvider.tsx index a651bd1b38..65893665b9 100644 --- a/apps/mobile/src/contexts/MobileAnalyticsProvider.tsx +++ b/apps/mobile/src/contexts/MobileAnalyticsProvider.tsx @@ -4,6 +4,7 @@ import { PropsWithChildren } from 'react'; import { env } from '~/env/runtime'; import AnalyticsProvider, { IdentifyFunction, + RegisterSuperPropertiesFunction, TrackFunction, } from '~/shared/contexts/AnalyticsContext'; @@ -29,9 +30,17 @@ const identify: IdentifyFunction = (userId) => { instance?.identify(userId); }; +const registerSuperProperties: RegisterSuperPropertiesFunction = (eventProps) => { + instance?.registerSuperProperties(eventProps); +}; + export function MobileAnalyticsProvider({ children }: PropsWithChildren) { return ( - + {children} ); diff --git a/apps/web/src/contexts/analytics/WebAnalyticsProvider.tsx b/apps/web/src/contexts/analytics/WebAnalyticsProvider.tsx index 5a64d4bae5..ebee6aa786 100644 --- a/apps/web/src/contexts/analytics/WebAnalyticsProvider.tsx +++ b/apps/web/src/contexts/analytics/WebAnalyticsProvider.tsx @@ -4,6 +4,7 @@ import { memo, ReactNode } from 'react'; import AnalyticsProvider, { IdentifyFunction, + RegisterSuperPropertiesFunction, TrackFunction, } from '~/shared/contexts/AnalyticsContext'; @@ -41,11 +42,26 @@ export const _identify: IdentifyFunction = (userId) => { } }; +export const _registerSuperProperties: RegisterSuperPropertiesFunction = (eventProps) => { + if (!mixpanelEnabled) return; + + try { + mixpanel.register(eventProps); + } catch (error: unknown) { + // mixpanel errors shouldn't disrupt app + captureException(error); + } +}; + type Props = { children: ReactNode }; const WebAnalyticsProvider = memo(({ children }: Props) => { return ( - + {children} ); diff --git a/packages/shared/src/contexts/AnalyticsContext.tsx b/packages/shared/src/contexts/AnalyticsContext.tsx index 87556913fe..0a34fe08b6 100644 --- a/packages/shared/src/contexts/AnalyticsContext.tsx +++ b/packages/shared/src/contexts/AnalyticsContext.tsx @@ -1,4 +1,12 @@ -import { createContext, memo, ReactNode, useCallback, useContext, useEffect } from 'react'; +import { + createContext, + memo, + ReactNode, + useCallback, + useContext, + useEffect, + useState, +} from 'react'; import { useRelayEnvironment } from 'react-relay'; import { fetchQuery, graphql } from 'relay-runtime'; @@ -39,6 +47,7 @@ const AnalyticsContextQueryNode = graphql` ... on Viewer { user { dbid + roles } } } @@ -47,15 +56,18 @@ const AnalyticsContextQueryNode = graphql` export type TrackFunction = (eventName: string, eventProps: EventProps) => void; export type IdentifyFunction = (userId: string) => void; +export type RegisterSuperPropertiesFunction = (eventProps: EventProps) => void; type Props = { children: ReactNode; track: TrackFunction; identify: IdentifyFunction; + registerSuperProperties: RegisterSuperPropertiesFunction; }; -const AnalyticsProvider = memo(({ children, identify, track }: Props) => { +const AnalyticsProvider = memo(({ children, identify, track, registerSuperProperties }: Props) => { const relayEnvironment = useRelayEnvironment(); + const [isBetaTester, setIsBetaTester] = useState(false); useEffect(() => { fetchQuery( @@ -66,22 +78,27 @@ const AnalyticsProvider = memo(({ children, identify, track }: Props) => { ) .toPromise() .then((query) => { - const userId = query?.viewer?.user?.dbid; + const user = query?.viewer?.user; + const userId = user?.dbid; // don't identify unauthenticated users if (!userId) { return; } - identify(userId); + + if (user.roles?.includes('BETA_TESTER')) { + setIsBetaTester(true); + registerSuperProperties({ isBetaTester: true }); + } }); - }, [identify, relayEnvironment]); + }, [identify, registerSuperProperties, relayEnvironment]); const handleTrack: HookTrackFunction = useCallback( (eventName, eventProps = {}) => { - track(eventName, eventProps); + track(eventName, { ...eventProps, isBetaTester }); }, - [track] + [isBetaTester, track] ); return {children};