Fix up metrics and mutations

This commit is contained in:
Eric Bailey
2026-01-14 09:05:39 -06:00
parent 981bd2ff3d
commit 26399b27d0
12 changed files with 126 additions and 42 deletions
+1 -1
View File
@@ -73,7 +73,7 @@
"icons:optimize": "svgo -f ./assets/icons"
},
"dependencies": {
"@atproto/api": "^0.18.13",
"@atproto/api": "^0.18.15",
"@bitdrift/react-native": "^0.6.8",
"@braintree/sanitize-url": "^6.0.2",
"@bsky.app/alf": "^0.1.6",
@@ -50,7 +50,7 @@ export function DiscoverFeedLiveEventFeedsAndTrendingBanner() {
<>
<View style={[a.px_lg, a.pt_md, a.pb_xs]}>
<View>
<LiveEventFeedCardWide feed={feed} />
<LiveEventFeedCardWide feed={feed} metricContext="discover" />
<Button
label={_(msg`Configure live event banner`)}
@@ -88,7 +88,11 @@ export function DiscoverFeedLiveEventFeedsAndTrendingBanner() {
</View>
</View>
<LiveEventFeedOptionsMenu feed={feed} control={optionsMenuControl} />
<LiveEventFeedOptionsMenu
feed={feed}
control={optionsMenuControl}
metricContext="discover"
/>
</>
)
}
@@ -11,7 +11,7 @@ export function ExploreScreenLiveEventFeedsBanner() {
if (!feed) return null
return (
<View style={[a.p_lg, a.border_b, t.atoms.border_contrast_low]}>
<LiveEventFeedCardWide feed={feed} />
<LiveEventFeedCardWide feed={feed} metricContext="explore" />
</View>
)
}
@@ -6,14 +6,24 @@ import {msg, Trans} from '@lingui/macro'
import {useLingui} from '@lingui/react'
import {isBskyCustomFeedUrl} from '#/lib/strings/url-helpers'
import {logger} from '#/logger'
import {atoms as a, useBreakpoints, utils} from '#/alf'
import {Link} from '#/components/Link'
import {Text} from '#/components/Typography'
import {type LiveEventFeed} from '#/features/liveEvents/types'
import {
type LiveEventFeed,
type LiveEventFeedMetricContext,
} from '#/features/liveEvents/types'
const roundedStyles = [a.rounded_lg, a.curve_continuous]
export function LiveEventFeedCardWide({feed}: {feed: LiveEventFeed}) {
export function LiveEventFeedCardWide({
feed,
metricContext,
}: {
feed: LiveEventFeed
metricContext: LiveEventFeedMetricContext
}) {
const {_} = useLingui()
const {gtPhone} = useBreakpoints()
@@ -30,7 +40,13 @@ export function LiveEventFeedCardWide({feed}: {feed: LiveEventFeed}) {
<Link
to={url}
label={_(msg`Live event happening now: ${feed.title}`)}
style={[a.w_full]}>
style={[a.w_full]}
onPress={() => {
logger.metric('liveEvents:feed:click', {
feed: feed.url,
context: metricContext,
})
}}>
{({hovered, pressed}) => (
<View style={[roundedStyles, a.shadow_md, a.w_full]}>
<View
@@ -16,16 +16,21 @@ import {
type LiveEventPreferencesAction,
useUpdateLiveEventPreferences,
} from '#/features/liveEvents/preferences'
import {type LiveEventFeed} from '#/features/liveEvents/types'
import {
type LiveEventFeed,
type LiveEventFeedMetricContext,
} from '#/features/liveEvents/types'
export {useDialogControl} from '#/components/Dialog'
export function LiveEventFeedOptionsMenu({
control,
feed,
metricContext,
}: {
control: Dialog.DialogControlProps
feed: LiveEventFeed
metricContext: LiveEventFeedMetricContext
}) {
const {_} = useLingui()
return (
@@ -34,7 +39,7 @@ export function LiveEventFeedOptionsMenu({
<Dialog.ScrollableInner
label={_(msg`Configure live event banner`)}
style={[web({maxWidth: 400})]}>
<Inner control={control} feed={feed} />
<Inner control={control} feed={feed} metricContext={metricContext} />
<Dialog.Close />
</Dialog.ScrollableInner>
</Dialog.Outer>
@@ -44,9 +49,11 @@ export function LiveEventFeedOptionsMenu({
function Inner({
control,
feed,
metricContext,
}: {
control: Dialog.DialogControlProps
feed: LiveEventFeed
metricContext: LiveEventFeedMetricContext
}) {
const {_} = useLingui()
const canUndo = useRef(true)
@@ -57,6 +64,8 @@ function Inner({
error: rawError,
variables,
} = useUpdateLiveEventPreferences({
feed,
metricContext,
onSuccess() {
toast.show(
<toast.Outer>
@@ -16,7 +16,9 @@ export function LiveEventFeedsSettingsToggle() {
isPending,
data: updatedPrefs,
mutate: update,
} = useUpdateLiveEventPreferences()
} = useUpdateLiveEventPreferences({
metricContext: 'settings',
})
const hideAllFeeds = !!(updatedPrefs || prefs)?.hideAllFeeds
return (
+33 -8
View File
@@ -9,6 +9,11 @@ import {
usePreferencesQuery,
} from '#/state/queries/preferences'
import {useAgent} from '#/state/session'
import * as env from '#/env'
import {
type LiveEventFeed,
type LiveEventFeedMetricContext,
} from '#/features/liveEvents/types'
export type LiveEventPreferencesAction = Parameters<
Agent['updateLiveEventPreferences']
@@ -46,7 +51,9 @@ function useWebOnlyDebugLiveEventPreferences() {
}, [agent, queryClient])
}
export function useUpdateLiveEventPreferences(props?: {
export function useUpdateLiveEventPreferences(props: {
feed?: LiveEventFeed
metricContext: LiveEventFeedMetricContext
onSuccess?: () => void
onError?: (error: Error) => void
}) {
@@ -64,19 +71,37 @@ export function useUpdateLiveEventPreferences(props?: {
const updated = await agent.updateLiveEventPreferences(action)
switch (action.type) {
case 'hideFeed': {
logger.metric('liveEventFeeds:hideFeed', {feedId: action.id})
break
}
case 'hideFeed':
case 'unhideFeed': {
logger.metric('liveEventFeeds:unhideFeed', {feedId: action.id})
if (!props.feed) {
if (env.IS_DEV) {
throw new Error(
'props.feed is required when calling hideFeed or unhideFeed',
)
}
break
}
logger.metric(
action.type === 'hideFeed'
? 'liveEvents:feed:hide'
: 'liveEvents:feed:unhide',
{
feed: props.feed.url,
context: props.metricContext,
},
)
break
}
case 'toggleHideAllFeeds': {
if (updated!.hideAllFeeds) {
logger.metric('liveEventFeed:hideAllFeeds', {})
logger.metric('liveEvents:hideAllFeeds', {
context: props.metricContext,
})
} else {
logger.metric('liveEventFeed:unhideAllFeeds', {})
logger.metric('liveEvents:unhideAllFeeds', {
context: props.metricContext,
})
}
break
}
+7
View File
@@ -10,6 +10,7 @@ export type LiveEventFeedImage = {
export type LiveEventFeed = {
id: string
preview: boolean
title: string
url: string
images: Record<LiveEventFeedImageLayout, LiveEventFeedImage>
@@ -18,3 +19,9 @@ export type LiveEventFeed = {
export type LiveEventsWorkerResponse = {
feeds: LiveEventFeed[]
}
export type LiveEventFeedMetricContext =
| 'explore'
| 'discover'
| 'sidebar'
| 'settings'
+2
View File
@@ -16,6 +16,8 @@ import {enabledLogLevels} from '#/logger/util'
import {isNative} from '#/platform/detection'
import {ENV} from '#/env'
export {type MetricEvents as Metrics} from '#/logger/metrics'
const TRANSPORTS: Transport[] = (function configureTransports() {
switch (ENV) {
case 'production': {
+19 -4
View File
@@ -1,5 +1,6 @@
import {type NotificationReason} from '#/lib/hooks/useNotificationHandler'
import {type FeedDescriptor} from '#/state/queries/post-feed'
import {type LiveEventFeedMetricContext} from '#/features/liveEvents/types'
export type MetricEvents = {
// App events
@@ -789,8 +790,22 @@ export type MetricEvents = {
// user pressed the remove all data button
'contacts:settings:removeData': {}
'liveEventFeeds:hideFeed': {feedId: string}
'liveEventFeeds:unhideFeed': {feedId: string}
'liveEventFeed:hideAllFeeds': {}
'liveEventFeed:unhideAllFeeds': {}
'liveEvents:feed:click': {
feed: string
context: LiveEventFeedMetricContext
}
'liveEvents:feed:hide': {
feed: string
context: LiveEventFeedMetricContext
}
'liveEvents:feed:unhide': {
feed: string
context: LiveEventFeedMetricContext
}
'liveEvents:hideAllFeeds': {
context: LiveEventFeedMetricContext
}
'liveEvents:unhideAllFeeds': {
context: LiveEventFeedMetricContext
}
}
+4
View File
@@ -45,4 +45,8 @@ export const DEFAULT_LOGGED_OUT_PREFERENCES: UsePreferencesQueryResponse = {
verificationPrefs: {
hideBadges: false,
},
liveEventPreferences: {
hideAllFeeds: false,
hiddenFeedIds: [],
},
}
+20 -20
View File
@@ -82,12 +82,12 @@
"@atproto/xrpc" "^0.7.6"
"@atproto/xrpc-server" "^0.10.0"
"@atproto/api@^0.18.13":
version "0.18.13"
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.18.13.tgz#63eee310e6715752eb87748323cf9ab57dd91e4b"
integrity sha512-CULZ01pSJDltLS/Gc9MMrhFzB6OM3ezyZw7KoeLT/sBfwgA1ddA4mWdTh7DIRosPRigXtA05bnoiCutZbQDo+Q==
"@atproto/api@^0.18.15":
version "0.18.15"
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.18.15.tgz#25ce82081216bdefbf5397220de76ac3ba9e3f5d"
integrity sha512-GeaTP7HMRZa8jD6trMuTACa8t2jkFtRmcwWgrB0FT7l9jVCXrKpYupWeIeauEgWHNwWUUiaq3LmCox+HBy8ZMQ==
dependencies:
"@atproto/common-web" "^0.4.11"
"@atproto/common-web" "^0.4.12"
"@atproto/lexicon" "^0.6.0"
"@atproto/syntax" "^0.4.2"
"@atproto/xrpc" "^0.7.7"
@@ -208,13 +208,13 @@
pino-http "^8.2.1"
typed-emitter "^2.1.0"
"@atproto/common-web@^0.4.11":
version "0.4.11"
resolved "https://registry.yarnpkg.com/@atproto/common-web/-/common-web-0.4.11.tgz#eb41dc02c1ea4221388630e193d181fb098186e0"
integrity sha512-VHejNmSABU8/03VrQ3e36AmT5U3UIeio+qSUqCrO1oNgrJcWfGy1rpj0FVtUugWF8Un29+yzkukzWGZfXL70rQ==
"@atproto/common-web@^0.4.12":
version "0.4.12"
resolved "https://registry.yarnpkg.com/@atproto/common-web/-/common-web-0.4.12.tgz#04135bef480d9e12cfef124ee45d8236764e7509"
integrity sha512-3aCJemqM/fkHQrVPbTCHCdiVstKFI+2LkFLvUhO6XZP0EqUZa/rg/CIZBKTFUWu9I5iYiaEiXL9VwcDRpEevSw==
dependencies:
"@atproto/lex-data" "0.0.7"
"@atproto/lex-json" "0.0.7"
"@atproto/lex-data" "0.0.8"
"@atproto/lex-json" "0.0.8"
zod "^3.23.8"
"@atproto/common-web@^0.4.4", "@atproto/common-web@^0.4.6":
@@ -415,10 +415,10 @@
uint8arrays "3.0.0"
unicode-segmenter "^0.14.0"
"@atproto/lex-data@0.0.7":
version "0.0.7"
resolved "https://registry.yarnpkg.com/@atproto/lex-data/-/lex-data-0.0.7.tgz#6aa87423f6d47849bec8ff3ca0b00ce93964adc8"
integrity sha512-W/Q5o9o7n2Sv3UywckChu01X5lwQUtaiiOkGJLnRsdkQTyC6813nPgY+p2sG7NwwM+82lu+FUV9fE/Ul3VqaJw==
"@atproto/lex-data@0.0.8":
version "0.0.8"
resolved "https://registry.yarnpkg.com/@atproto/lex-data/-/lex-data-0.0.8.tgz#46cc261efbfa6cc05bf04439d2d73cd8386b467d"
integrity sha512-1Y5tz7BkS7380QuLNXaE8GW8Xba+mRWugt8BKM4BUFYjjUZdmirU8lr72iM4XlEBrzRu8Cfvj+MbsbYaZv+IgA==
dependencies:
"@atproto/syntax" "0.4.2"
multiformats "^9.9.0"
@@ -451,12 +451,12 @@
"@atproto/lex-data" "0.0.3"
tslib "^2.8.1"
"@atproto/lex-json@0.0.7":
version "0.0.7"
resolved "https://registry.yarnpkg.com/@atproto/lex-json/-/lex-json-0.0.7.tgz#c06e1fc3e06d739bbb74694f5d846055bed37866"
integrity sha512-bjNPD5M/MhLfjNM7tcxuls80UgXpHqxdOxDXEUouAtZQV/nIDhGjmNUvKxOmOgnDsiZRnT2g5y3onrnjH3a44g==
"@atproto/lex-json@0.0.8":
version "0.0.8"
resolved "https://registry.yarnpkg.com/@atproto/lex-json/-/lex-json-0.0.8.tgz#03290762d9368b029488ee0a0766d1a34063255c"
integrity sha512-w1Qmkae1QhmNz+i1Zm3xr3jp0UPPRENmdlpU0qIrdxWDo9W4Mzkeyc3eSoa+Zs+zN8xkRSQw7RLZte/B7Ipdwg==
dependencies:
"@atproto/lex-data" "0.0.7"
"@atproto/lex-data" "0.0.8"
tslib "^2.8.1"
"@atproto/lex-resolver@0.0.5":