Improve type checking for metrics events (#2632)

zio/stable
Eric Bailey 2024-01-25 23:12:48 -06:00 committed by GitHub
parent bc502edae1
commit 157404132f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 42 additions and 37 deletions

View File

@ -6,7 +6,7 @@ import {sha256} from 'js-sha256'
import {Native} from 'sentry-expo'
import {useSession, SessionAccount} from '#/state/session'
import {TrackEvent, AnalyticsMethods} from './types'
import {ScreenPropertiesMap, TrackPropertiesMap} from './types'
import {logger} from '#/logger'
type AppInfo = {
@ -29,20 +29,30 @@ function getClient(): SegmentClient {
return segmentClient
}
export const track: TrackEvent = async (...args) => {
await getClient().track(...args)
export const track = async <E extends keyof TrackPropertiesMap>(
event: E,
properties?: TrackPropertiesMap[E],
) => {
await getClient().track(event, properties)
}
export function useAnalytics(): AnalyticsMethods {
export function useAnalytics() {
const {hasSession} = useSession()
return React.useMemo(() => {
if (hasSession) {
return {
async screen(...args) {
await getClient().screen(...args)
async screen<E extends keyof ScreenPropertiesMap>(
event: E,
properties?: ScreenPropertiesMap[E],
) {
await getClient().screen(event, properties)
},
async track(...args) {
await getClient().track(...args)
async track<E extends keyof TrackPropertiesMap>(
event: E,
properties?: TrackPropertiesMap[E],
) {
await getClient().track(event, properties)
},
}
}

View File

@ -3,7 +3,7 @@ import {createClient} from '@segment/analytics-react'
import {sha256} from 'js-sha256'
import {Browser} from 'sentry-expo'
import {TrackEvent, AnalyticsMethods} from './types'
import {ScreenPropertiesMap, TrackPropertiesMap} from './types'
import {useSession, SessionAccount} from '#/state/session'
import {logger} from '#/logger'
@ -29,20 +29,30 @@ function getClient(): SegmentClient {
return segmentClient
}
export const track: TrackEvent = async (...args) => {
await getClient().track(...args)
export const track = async <E extends keyof TrackPropertiesMap>(
event: E,
properties?: TrackPropertiesMap[E],
) => {
await getClient().track(event, properties)
}
export function useAnalytics(): AnalyticsMethods {
export function useAnalytics() {
const {hasSession} = useSession()
return React.useMemo(() => {
if (hasSession) {
return {
async screen(...args) {
await getClient().screen(...args)
async screen<E extends keyof ScreenPropertiesMap>(
event: E,
properties?: ScreenPropertiesMap[E],
) {
await getClient().screen(event, properties)
},
async track(...args) {
await getClient().track(...args)
async track<E extends keyof TrackPropertiesMap>(
event: E,
properties?: TrackPropertiesMap[E],
) {
await getClient().track(event, properties)
},
}
}

View File

@ -1,14 +1,4 @@
export type TrackEvent = (
event: keyof TrackPropertiesMap,
properties?: TrackPropertiesMap[keyof TrackPropertiesMap],
) => Promise<void>
export type ScreenEvent = (
name: keyof ScreenPropertiesMap,
properties?: ScreenPropertiesMap[keyof ScreenPropertiesMap],
) => Promise<void>
interface TrackPropertiesMap {
export type TrackPropertiesMap = {
// LOGIN / SIGN UP events
'Sign In': {resumedSession: boolean} // CAN BE SERVER
'Create Account': {} // CAN BE SERVER
@ -16,7 +6,7 @@ interface TrackPropertiesMap {
'Signin:PressedForgotPassword': {}
'Signin:PressedSelectService': {}
// COMPOSER / CREATE POST events
'Create Post': {imageCount: string} // CAN BE SERVER
'Create Post': {imageCount: string | number} // CAN BE SERVER
'Composer:PastedPhotos': {}
'Composer:CameraOpened': {}
'Composer:GalleryOpened': {}
@ -108,15 +98,15 @@ interface TrackPropertiesMap {
'CustomFeed:Share': {}
'CustomFeed:Pin': {
uri: string
name: string
name?: string
}
'CustomFeed:Unpin': {
uri: string
name: string
name?: string
}
'CustomFeed:Reorder': {
uri: string
name: string
name?: string
index: number
}
'CustomFeed:LoadMore': {}
@ -165,7 +155,7 @@ interface TrackPropertiesMap {
'OnboardingV2:Skip': {}
}
interface ScreenPropertiesMap {
export type ScreenPropertiesMap = {
Login: {}
CreateAccount: {}
'Choose Account': {}
@ -184,8 +174,3 @@ interface ScreenPropertiesMap {
MutedAccounts: {}
SavedFeeds: {}
}
export type AnalyticsMethods = {
screen: ScreenEvent
track: TrackEvent
}