Bluesky app fork with some witchin' additions 💫
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Improve type checking for metrics events (#2632)

authored by

Eric Bailey and committed by
GitHub
15740413 bc502eda

+42 -37
+18 -8
src/lib/analytics/analytics.tsx
··· 6 6 import {Native} from 'sentry-expo' 7 7 8 8 import {useSession, SessionAccount} from '#/state/session' 9 - import {TrackEvent, AnalyticsMethods} from './types' 9 + import {ScreenPropertiesMap, TrackPropertiesMap} from './types' 10 10 import {logger} from '#/logger' 11 11 12 12 type AppInfo = { ··· 29 29 return segmentClient 30 30 } 31 31 32 - export const track: TrackEvent = async (...args) => { 33 - await getClient().track(...args) 32 + export const track = async <E extends keyof TrackPropertiesMap>( 33 + event: E, 34 + properties?: TrackPropertiesMap[E], 35 + ) => { 36 + await getClient().track(event, properties) 34 37 } 35 38 36 - export function useAnalytics(): AnalyticsMethods { 39 + export function useAnalytics() { 37 40 const {hasSession} = useSession() 41 + 38 42 return React.useMemo(() => { 39 43 if (hasSession) { 40 44 return { 41 - async screen(...args) { 42 - await getClient().screen(...args) 45 + async screen<E extends keyof ScreenPropertiesMap>( 46 + event: E, 47 + properties?: ScreenPropertiesMap[E], 48 + ) { 49 + await getClient().screen(event, properties) 43 50 }, 44 - async track(...args) { 45 - await getClient().track(...args) 51 + async track<E extends keyof TrackPropertiesMap>( 52 + event: E, 53 + properties?: TrackPropertiesMap[E], 54 + ) { 55 + await getClient().track(event, properties) 46 56 }, 47 57 } 48 58 }
+18 -8
src/lib/analytics/analytics.web.tsx
··· 3 3 import {sha256} from 'js-sha256' 4 4 import {Browser} from 'sentry-expo' 5 5 6 - import {TrackEvent, AnalyticsMethods} from './types' 6 + import {ScreenPropertiesMap, TrackPropertiesMap} from './types' 7 7 import {useSession, SessionAccount} from '#/state/session' 8 8 import {logger} from '#/logger' 9 9 ··· 29 29 return segmentClient 30 30 } 31 31 32 - export const track: TrackEvent = async (...args) => { 33 - await getClient().track(...args) 32 + export const track = async <E extends keyof TrackPropertiesMap>( 33 + event: E, 34 + properties?: TrackPropertiesMap[E], 35 + ) => { 36 + await getClient().track(event, properties) 34 37 } 35 38 36 - export function useAnalytics(): AnalyticsMethods { 39 + export function useAnalytics() { 37 40 const {hasSession} = useSession() 41 + 38 42 return React.useMemo(() => { 39 43 if (hasSession) { 40 44 return { 41 - async screen(...args) { 42 - await getClient().screen(...args) 45 + async screen<E extends keyof ScreenPropertiesMap>( 46 + event: E, 47 + properties?: ScreenPropertiesMap[E], 48 + ) { 49 + await getClient().screen(event, properties) 43 50 }, 44 - async track(...args) { 45 - await getClient().track(...args) 51 + async track<E extends keyof TrackPropertiesMap>( 52 + event: E, 53 + properties?: TrackPropertiesMap[E], 54 + ) { 55 + await getClient().track(event, properties) 46 56 }, 47 57 } 48 58 }
+6 -21
src/lib/analytics/types.ts
··· 1 - export type TrackEvent = ( 2 - event: keyof TrackPropertiesMap, 3 - properties?: TrackPropertiesMap[keyof TrackPropertiesMap], 4 - ) => Promise<void> 5 - 6 - export type ScreenEvent = ( 7 - name: keyof ScreenPropertiesMap, 8 - properties?: ScreenPropertiesMap[keyof ScreenPropertiesMap], 9 - ) => Promise<void> 10 - 11 - interface TrackPropertiesMap { 1 + export type TrackPropertiesMap = { 12 2 // LOGIN / SIGN UP events 13 3 'Sign In': {resumedSession: boolean} // CAN BE SERVER 14 4 'Create Account': {} // CAN BE SERVER ··· 16 6 'Signin:PressedForgotPassword': {} 17 7 'Signin:PressedSelectService': {} 18 8 // COMPOSER / CREATE POST events 19 - 'Create Post': {imageCount: string} // CAN BE SERVER 9 + 'Create Post': {imageCount: string | number} // CAN BE SERVER 20 10 'Composer:PastedPhotos': {} 21 11 'Composer:CameraOpened': {} 22 12 'Composer:GalleryOpened': {} ··· 108 98 'CustomFeed:Share': {} 109 99 'CustomFeed:Pin': { 110 100 uri: string 111 - name: string 101 + name?: string 112 102 } 113 103 'CustomFeed:Unpin': { 114 104 uri: string 115 - name: string 105 + name?: string 116 106 } 117 107 'CustomFeed:Reorder': { 118 108 uri: string 119 - name: string 109 + name?: string 120 110 index: number 121 111 } 122 112 'CustomFeed:LoadMore': {} ··· 165 155 'OnboardingV2:Skip': {} 166 156 } 167 157 168 - interface ScreenPropertiesMap { 158 + export type ScreenPropertiesMap = { 169 159 Login: {} 170 160 CreateAccount: {} 171 161 'Choose Account': {} ··· 184 174 MutedAccounts: {} 185 175 SavedFeeds: {} 186 176 } 187 - 188 - export type AnalyticsMethods = { 189 - screen: ScreenEvent 190 - track: TrackEvent 191 - }