diff --git a/src/lib/analytics.tsx b/src/lib/analytics.tsx index d0a8f12436..5943dbc60f 100644 --- a/src/lib/analytics.tsx +++ b/src/lib/analytics.tsx @@ -4,6 +4,8 @@ import { createClient, AnalyticsProvider, useAnalytics as useAnalyticsOrig, + ClientMethods, + JsonMap, } from '@segment/analytics-react-native' import {RootStoreModel, AppInfo} from 'state/models/root-store' import {useStores} from 'state/models/root-store' @@ -16,20 +18,20 @@ const segmentClient = createClient({ export function useAnalytics() { const store = useStores() - const methods = useAnalyticsOrig() + const methods: ClientMethods = useAnalyticsOrig() return React.useMemo(() => { if (store.session.hasSession) { return methods } // dont send analytics pings for anonymous users return { - screen: () => {}, - track: () => {}, - identify: () => {}, - flush: () => {}, - group: () => {}, - alias: () => {}, - reset: () => {}, + screen: (name: string, properties?: JsonMap) => Promise, + track: (event: string, properties?: JsonMap) => Promise, + identify: (userId?: string, userTraits?: UserTraits) => Promise, + flush: () => Promise, + group: (groupId: string, groupTraits?: GroupTraits) => Promise, + alias: (newUserId: string) => Promise, + reset: (resetAnonymousId?: boolean) => Promise, } }, [store, methods]) } diff --git a/src/lib/analytics/types.ts b/src/lib/analytics/types.ts new file mode 100644 index 0000000000..758e5b6d42 --- /dev/null +++ b/src/lib/analytics/types.ts @@ -0,0 +1,88 @@ +import { + ClientMethods, + GroupTraits, + JsonMap, + UserTraits, +} from '@segment/analytics-react-native' + +export type IAnalyticsEvent = { + name: keyof TrackPropertiesMap + properties: TrackPropertiesMap[keyof TrackPropertiesMap] +} + +export interface IAnalyticsProvider extends ClientMethods { + screen: (name: string, properties?: JsonMap) => Promise + track: (event: string, properties?: JsonMap) => Promise + identify: (userId?: string, userTraits?: UserTraits) => Promise + flush: () => Promise + group: (groupId: string, groupTraits?: GroupTraits) => Promise + alias: (newUserId: string) => Promise + reset: (resetAnonymousId?: boolean) => Promise +} + +export interface TrackPropertiesMap { + // LOGIN / SIGN UP events + 'Sing In': {resumedSession: boolean} + 'Create Account': {} + 'SignIn:ForgotPassowrd': {} + 'SignIn:PressedSelectService': {} + // COMPOSER / CREATE POST events + 'Create Post': {imageCount: string} + 'Composer:PastedPhotos': {} + 'Composer:CameraOpened': {} + 'Composer:GalleryOpened': {} + 'HomeScreen:PressCompose': {} + 'ProfileScreen:PressCompose': {} + // EDIT PROFILE events + 'EditHandle:ViewCustomForm': {} + 'EditHandle:ViewProvidedForm': {} + 'EditHandle:SetNewHandle': {} + 'EditProfile:AvatarSelected': {} + 'EditProfile:BannerSelected': {} + 'EditProfile:Save': {} + // FEED events + 'Feed:onRefresh': {} + 'Feed:onEndReached': {} + // FEED ITEM events + 'FeedItem:PostReply': {} + 'FeedItem:PostRepost': {} + 'FeedItem:PostLike': {} + 'FeedItem:PostDelete': {} + // PROFILE HEADER events + 'ProfileHeaeder:EditProfileButtonClicked': {} + 'ProfileHeader:FollowersButtonClicked': {} + 'ProfileHeader:FollowsButtonClicked': {} + 'ProfileHeader:ShareButtonClicked': {} + 'ProfileHeader:MuteAccountButtonClicked': {} + 'ProfileHeader:UnmuteAccountButtonClicked': {} + 'ProfileHeader:ReportAccountButtonClicked': {} + 'ViewHeader:MenuButtonClicked': {} + // SETTINGS events + 'Settings:SwitchAccountButtonCLicked': {} + 'Settings:AddAccountButtonClicked': {} + 'Settings:ChangeHandleButtonClicked': {} + 'Settings:InvitecodesButtonClicked': {} + 'Settings:ContentfilteringButtonClicked': {} + 'Settings:SignOutButtonClicked': {} + // MENU events + 'Menu:ItemClicked': {url: string} + 'Menu:FeedbackClicked': {} + // MOBILE SHELL events + 'MobileShell:ProfileButtonPressed': {} + 'MobileShell:FeedButtonPressed': {} + 'MobileShell:SearchButtonPressed': {} + 'MobileShell:NotificationsButtonPressed': {} +} + +export interface ScreenPropertiesMap { + Login: {} + CreateAccount: {} + 'Choose Account': {} + 'Signin:ForgotPassword': {} + 'Signin:SetNewPasswordForm': {} + 'Signin:PasswordUpdatedForm': {} + Feed: {} + Notifications: {} + Profile: {} + Settings: {} +}