From 4eef94fcd61d3c8de05e4280a87362081565d2f7 Mon Sep 17 00:00:00 2001 From: gbuomprisco Date: Fri, 26 Jul 2024 21:09:02 +0200 Subject: [PATCH] Refactor analytics event handling and manager setup Updated event handling in `analytics-provider.tsx` to return results, enhancing consistency. Added a new function `registerActiveServices` in `analytics-manager.ts` for initializing active services, streamlining provider setup. Clarified types for `AnalyticsProviderFactory` to accept optional configuration. --- apps/web/components/analytics-provider.tsx | 12 ++++++------ packages/analytics/src/analytics-manager.ts | 21 +++++++++++++++++++++ packages/analytics/src/types.ts | 2 +- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/apps/web/components/analytics-provider.tsx b/apps/web/components/analytics-provider.tsx index 8ccdf82cb..395c78f50 100644 --- a/apps/web/components/analytics-provider.tsx +++ b/apps/web/components/analytics-provider.tsx @@ -15,7 +15,7 @@ import { type AnalyticsMapping< T extends ConsumerProvidedEventTypes = NonNullable, > = { - [K in AppEventType]?: (event: AppEvent) => void; + [K in AppEventType]?: (event: AppEvent) => unknown; }; /** @@ -51,17 +51,17 @@ const analyticsMapping: AnalyticsMapping = { const userId = event.payload.userId; if (userId) { - analytics.identify(userId); + return analytics.identify(userId); } }, 'user.signedUp': (event) => { - analytics.trackEvent(event.type, event.payload); + return analytics.trackEvent(event.type, event.payload); }, 'checkout.started': (event) => { - analytics.trackEvent(event.type, event.payload); + return analytics.trackEvent(event.type, event.payload); }, 'user.updated': (event) => { - analytics.trackEvent(event.type, event.payload); + return analytics.trackEvent(event.type, event.payload); }, }; @@ -83,7 +83,7 @@ export function AnalyticsProvider(props: React.PropsWithChildren) { * Hook to report page views to the analytics service * @param reportAnalyticsFn */ -function useReportPageView(reportAnalyticsFn: (url: string) => void) { +function useReportPageView(reportAnalyticsFn: (url: string) => unknown) { const pathname = usePathname(); const searchParams = useSearchParams(); diff --git a/packages/analytics/src/analytics-manager.ts b/packages/analytics/src/analytics-manager.ts index 92d8d912c..d6927354b 100644 --- a/packages/analytics/src/analytics-manager.ts +++ b/packages/analytics/src/analytics-manager.ts @@ -22,6 +22,27 @@ export function createAnalyticsManager( return Array.from(activeServices.values()); }; + const registerActiveServices = ( + options: CreateAnalyticsManagerOptions, + ) => { + Object.keys(options.providers).forEach((provider) => { + const providerKey = provider as keyof typeof options.providers; + const factory = options.providers[providerKey]; + + if (!factory) { + console.warn( + `Analytics provider '${provider}' not registered. Skipping initialization.`, + ); + + return; + } + + activeServices.set(provider as T, factory()); + }); + }; + + registerActiveServices(options); + return { addProvider: ( provider: T, diff --git a/packages/analytics/src/types.ts b/packages/analytics/src/types.ts index b2aa1a496..9923c36b6 100644 --- a/packages/analytics/src/types.ts +++ b/packages/analytics/src/types.ts @@ -24,7 +24,7 @@ export interface AnalyticsService extends TrackPageView, TrackEvent, Identify { } export type AnalyticsProviderFactory = ( - config: Config, + config?: Config, ) => AnalyticsService; export interface CreateAnalyticsManagerOptions<