Integrate user traits into event payloads

Extends the user traits (e.g., email) in dispatch events and integrates monitoring to identify users alongside emitting events. Additionally, ensures the analytics service captures these traits when identifying users.
This commit is contained in:
gbuomprisco
2024-08-16 11:00:37 +02:00
parent 9b114454e6
commit 8647c13896
3 changed files with 30 additions and 18 deletions

View File

@@ -2,15 +2,15 @@
import { useEffect } from 'react';
import { usePathname, useSearchParams } from 'next/navigation';
import { analytics } from '@kit/analytics';
import {
AppEvent,
AppEventType,
ConsumerProvidedEventTypes,
useAppEvents,
} from '@kit/shared/events';
import { AppEvent, AppEventType, ConsumerProvidedEventTypes, useAppEvents } from '@kit/shared/events';
type AnalyticsMapping<
T extends ConsumerProvidedEventTypes = NonNullable<unknown>,
@@ -48,10 +48,10 @@ function useAnalyticsMapping<T extends ConsumerProvidedEventTypes>(
*/
const analyticsMapping: AnalyticsMapping = {
'user.signedIn': (event) => {
const userId = event.payload.userId;
const { userId, ...traits } = event.payload;
if (userId) {
return analytics.identify(userId);
return analytics.identify(userId, traits);
}
},
'user.signedUp': (event) => {

View File

@@ -2,6 +2,7 @@
import { useCallback } from 'react';
import { useMonitoring } from '@kit/monitoring/hooks';
import { useAppEvents } from '@kit/shared/events';
import { useAuthChangeListener } from '@kit/supabase/hooks/use-auth-change-listener';
@@ -13,7 +14,9 @@ export function AuthProvider(props: React.PropsWithChildren) {
useAuthChangeListener({
appHomePath: pathsConfig.app.home,
onEvent: (event, session) => {
dispatchEvent(event, session?.user.id);
dispatchEvent(event, session?.user.id, {
email: session?.user.email ?? '',
});
},
});
@@ -22,27 +25,36 @@ export function AuthProvider(props: React.PropsWithChildren) {
function useDispatchAppEventFromAuthEvent() {
const { emit } = useAppEvents();
const monitoring = useMonitoring();
return useCallback(
(type: string, userId: string | undefined) => {
(
type: string,
userId: string | undefined,
traits: Record<string, string> = {},
) => {
switch (type) {
case 'SIGNED_IN':
emit({
type: 'user.signedIn',
payload: { userId: userId! },
});
if (userId) {
emit({
type: 'user.signedIn',
payload: { userId, ...traits },
});
monitoring.identifyUser({ id: userId, ...traits });
}
break;
case 'USER_UPDATED':
emit({
type: 'user.updated',
payload: { userId: userId! },
payload: { userId: userId!, ...traits },
});
break;
}
},
[emit],
[emit, monitoring],
);
}