From 10c44a0e209c0dd54e5c0291efd7ec124dc512c2 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 21 Jan 2026 20:55:55 -0600 Subject: [PATCH] Clean up core analytics file --- src/Navigation.tsx | 2 +- src/analytics/index.tsx | 27 +++++++++++++------ src/analytics/utils.ts | 22 ++++++++++++++- .../moderation/ReportDialog/index.tsx | 2 +- src/lib/hooks/useNotificationHandler.ts | 2 +- src/state/feed-feedback.tsx | 2 +- 6 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/Navigation.tsx b/src/Navigation.tsx index adfe26ddcd..578ee71cb5 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -880,7 +880,7 @@ let lastHandledNotificationDateDedupe: number | undefined function RoutesContainer({children}: React.PropsWithChildren<{}>) { const ax = useAnalytics() - const notyLogger = ax.logger.useContext(ax.logger.Context.Notifications) + const notyLogger = ax.logger.useChild(ax.logger.Context.Notifications) const theme = useColorSchemeStyle(DefaultTheme, DarkTheme) const {currentAccount, accounts} = useSession() const {onPressSwitchAccount} = useAccountSwitcher() diff --git a/src/analytics/index.tsx b/src/analytics/index.tsx index 5a0005a7d4..9208999150 100644 --- a/src/analytics/index.tsx +++ b/src/analytics/index.tsx @@ -18,6 +18,7 @@ import { import {type Metrics, metrics} from '#/analytics/metrics' import * as refParams from '#/analytics/misc/refParams' import {type MergeableMetadata, type Metadata} from '#/analytics/types' +import {getMetadataForLogger} from '#/analytics/utils' import * as env from '#/env' import {useGeolocation} from '#/geolocation' import {device} from '#/storage' @@ -34,9 +35,15 @@ type LoggerType = { warn: Logger['warn'] error: Logger['error'] /** - * Creates a clone of the existing logger and overrides the `context` value + * Clones the existing logger and overrides the `context` value. Existing + * metadata is inherited. + * + * ```ts + * const ax = useAnalytics() + * const logger = ax.logger.useChild(ax.logger.Context.Notifications) + * ``` */ - useContext: (context: Exclude) => LoggerType + useChild: (context: Exclude) => LoggerType Context: typeof Logger.Context } export type AnalyticsContextType = { @@ -66,7 +73,7 @@ function createLogger( log: logger.log.bind(logger), warn: logger.warn.bind(logger), error: logger.error.bind(logger), - useContext: (context: Exclude) => { + useChild: (context: Exclude) => { return useMemo(() => createLogger(context, metadata), [context, metadata]) }, Context: Logger.Context, @@ -131,13 +138,18 @@ export function AnalyticsContext({ const combinedMetadata = { ...parentContext.metadata, ...metadata, + base: { + ...parentContext.metadata.base, + sessionId, + }, + geolocation, } - combinedMetadata.base.sessionId = sessionId - combinedMetadata.geolocation = geolocation const context: AnalyticsBaseContextType = { ...parentContext, - // TODO trim down metadata - logger: createLogger(Logger.Context.Default, combinedMetadata), + logger: createLogger( + Logger.Context.Default, + getMetadataForLogger(combinedMetadata), + ), metadata: combinedMetadata, metric: (event, payload, extraMetadata) => { parentContext.metric(event, payload, { @@ -202,7 +214,6 @@ export function useAnalyticsBase() { export function useAnalytics() { const ctx = useContext(Context) if (!('feature' in ctx) || !('Features' in ctx)) { - console.log(ctx) throw new Error( 'useAnalytics must be used within an AnalyticsFeaturesContext', ) diff --git a/src/analytics/utils.ts b/src/analytics/utils.ts index 3638ae5f9a..8d94c4661f 100644 --- a/src/analytics/utils.ts +++ b/src/analytics/utils.ts @@ -2,7 +2,11 @@ import {useMemo} from 'react' import {BSKY_SERVICE} from '#/lib/constants' import {type SessionAccount} from '#/state/session' -import {type MergeableMetadata, type SessionMetadata} from '#/analytics/types' +import { + type MergeableMetadata, + type Metadata, + type SessionMetadata, +} from '#/analytics/types' /** * Thin `useMemo` wrapper that marks the metadata as memoized and provides a @@ -27,3 +31,19 @@ export function accountToSessionMetadata( } } } + +export function getMetadataForLogger({ + base, + geolocation, + session, +}: Metadata): Record { + return { + deviceId: base.deviceId, + sessionId: base.sessionId, + platform: base.platform, + appVersion: base.appVersion, + countryCode: geolocation.countryCode, + regionCode: geolocation.regionCode, + isBskyPds: session?.isBskyPds || 'anonymous', + } +} diff --git a/src/components/moderation/ReportDialog/index.tsx b/src/components/moderation/ReportDialog/index.tsx index d975c69d47..305ff36290 100644 --- a/src/components/moderation/ReportDialog/index.tsx +++ b/src/components/moderation/ReportDialog/index.tsx @@ -103,7 +103,7 @@ function Invalid() { function Inner(props: ReportDialogProps) { const ax = useAnalytics() - const logger = ax.logger.useContext(ax.logger.Context.ReportDialog) + const logger = ax.logger.useChild(ax.logger.Context.ReportDialog) const t = useTheme() const {_} = useLingui() const ref = React.useRef(null) diff --git a/src/lib/hooks/useNotificationHandler.ts b/src/lib/hooks/useNotificationHandler.ts index 72c4fd1312..e06b46211c 100644 --- a/src/lib/hooks/useNotificationHandler.ts +++ b/src/lib/hooks/useNotificationHandler.ts @@ -77,7 +77,7 @@ let lastHandledNotificationDateDedupe = 0 export function useNotificationsHandler() { const ax = useAnalytics() - const logger = ax.logger.useContext(ax.logger.Context.Notifications) + const logger = ax.logger.useChild(ax.logger.Context.Notifications) const queryClient = useQueryClient() const {currentAccount, accounts} = useSession() const {onPressSwitchAccount} = useAccountSwitcher() diff --git a/src/state/feed-feedback.tsx b/src/state/feed-feedback.tsx index 7d4ac284a6..56981103f7 100644 --- a/src/state/feed-feedback.tsx +++ b/src/state/feed-feedback.tsx @@ -64,7 +64,7 @@ export function useFeedFeedback( hasSession: boolean, ) { const ax = useAnalytics() - const logger = ax.logger.useContext(ax.logger.Context.FeedFeedback) + const logger = ax.logger.useChild(ax.logger.Context.FeedFeedback) const agent = useAgent() const feed =