From a03e37673725467eaa3380558bfa2c2904880beb Mon Sep 17 00:00:00 2001 From: Ansh Nanda Date: Thu, 20 Apr 2023 23:47:48 -0700 Subject: [PATCH] fix types and update imports --- src/App.native.tsx | 2 +- src/App.web.tsx | 2 +- src/lib/{ => analytics}/analytics.tsx | 24 ++++++---- src/lib/{ => analytics}/analytics.web.tsx | 0 src/lib/analytics/types.ts | 47 +++++++------------ src/view/com/auth/LoggedOut.tsx | 2 +- src/view/com/auth/create/CreateAccount.tsx | 2 +- src/view/com/auth/login/Login.tsx | 2 +- src/view/com/composer/Composer.tsx | 2 +- .../com/composer/photos/OpenCameraBtn.tsx | 2 +- .../com/composer/photos/SelectPhotoBtn.tsx | 2 +- src/view/com/modals/ChangeHandle.tsx | 2 +- src/view/com/modals/EditProfile.tsx | 2 +- src/view/com/posts/Feed.tsx | 2 +- src/view/com/posts/FeedItem.tsx | 2 +- src/view/com/profile/ProfileHeader.tsx | 2 +- src/view/com/search/HeaderWithInput.tsx | 2 +- src/view/com/util/ViewHeader.tsx | 2 +- src/view/screens/Home.tsx | 2 +- src/view/screens/Notifications.tsx | 2 +- src/view/screens/Profile.tsx | 2 +- src/view/screens/Settings.tsx | 2 +- src/view/shell/Drawer.tsx | 2 +- src/view/shell/bottom-bar/BottomBar.tsx | 6 ++- 24 files changed, 57 insertions(+), 60 deletions(-) rename src/lib/{ => analytics}/analytics.tsx (86%) rename src/lib/{ => analytics}/analytics.web.tsx (100%) diff --git a/src/App.native.tsx b/src/App.native.tsx index e0e030cbc1..2e78a3d786 100644 --- a/src/App.native.tsx +++ b/src/App.native.tsx @@ -12,7 +12,7 @@ import * as view from './view/index' import {RootStoreModel, setupState, RootStoreProvider} from './state' import {Shell} from './view/shell' import * as notifee from 'lib/notifee' -import * as analytics from 'lib/analytics' +import * as analytics from 'lib/analytics/analytics' import * as Toast from './view/com/util/Toast' import {handleLink} from './Navigation' diff --git a/src/App.web.tsx b/src/App.web.tsx index e259a48e99..c83ebb30bb 100644 --- a/src/App.web.tsx +++ b/src/App.web.tsx @@ -2,7 +2,7 @@ import React, {useState, useEffect} from 'react' import {SafeAreaProvider} from 'react-native-safe-area-context' import {RootSiblingParent} from 'react-native-root-siblings' import * as view from './view/index' -import * as analytics from 'lib/analytics' +import * as analytics from 'lib/analytics/analytics' import {RootStoreModel, setupState, RootStoreProvider} from './state' import {Shell} from './view/shell/index' import {ToastContainer} from './view/com/util/Toast.web' diff --git a/src/lib/analytics.tsx b/src/lib/analytics/analytics.tsx similarity index 86% rename from src/lib/analytics.tsx rename to src/lib/analytics/analytics.tsx index 5943dbc60f..65151a296b 100644 --- a/src/lib/analytics.tsx +++ b/src/lib/analytics/analytics.tsx @@ -5,11 +5,11 @@ import { 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' import {sha256} from 'js-sha256' +import {ScreenEvent, TrackEvent} from './types' const segmentClient = createClient({ writeKey: '8I6DsgfiSLuoONyaunGoiQM7A6y2ybdI', @@ -21,17 +21,25 @@ export function useAnalytics() { const methods: ClientMethods = useAnalyticsOrig() return React.useMemo(() => { if (store.session.hasSession) { - return methods + return { + screen: methods.screen as ScreenEvent, + track: methods.track as TrackEvent, + identify: methods.identify, + flush: methods.flush, + group: methods.group, + alias: methods.alias, + reset: methods.reset, + } } // dont send analytics pings for anonymous users return { - screen: (name: string, properties?: JsonMap) => Promise, - track: (event: string, properties?: JsonMap) => Promise, - identify: (userId?: string, userTraits?: UserTraits) => Promise, + screen: () => Promise, + track: () => Promise, + identify: () => Promise, flush: () => Promise, - group: (groupId: string, groupTraits?: GroupTraits) => Promise, - alias: (newUserId: string) => Promise, - reset: (resetAnonymousId?: boolean) => Promise, + group: () => Promise, + alias: () => Promise, + reset: () => Promise, } }, [store, methods]) } diff --git a/src/lib/analytics.web.tsx b/src/lib/analytics/analytics.web.tsx similarity index 100% rename from src/lib/analytics.web.tsx rename to src/lib/analytics/analytics.web.tsx diff --git a/src/lib/analytics/types.ts b/src/lib/analytics/types.ts index 758e5b6d42..56cb9c4c90 100644 --- a/src/lib/analytics/types.ts +++ b/src/lib/analytics/types.ts @@ -1,31 +1,18 @@ -import { - ClientMethods, - GroupTraits, - JsonMap, - UserTraits, -} from '@segment/analytics-react-native' +export type TrackEvent = ( + event: keyof TrackPropertiesMap, + properties?: TrackPropertiesMap[keyof TrackPropertiesMap], +) => Promise -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 { +export type ScreenEvent = ( + name: keyof ScreenPropertiesMap, + properties?: ScreenPropertiesMap[keyof ScreenPropertiesMap], +) => Promise +interface TrackPropertiesMap { // LOGIN / SIGN UP events - 'Sing In': {resumedSession: boolean} + 'Sign In': {resumedSession: boolean} 'Create Account': {} - 'SignIn:ForgotPassowrd': {} - 'SignIn:PressedSelectService': {} + 'Signin:PressedForgotPassword': {} + 'Signin:PressedSelectService': {} // COMPOSER / CREATE POST events 'Create Post': {imageCount: string} 'Composer:PastedPhotos': {} @@ -49,7 +36,7 @@ export interface TrackPropertiesMap { 'FeedItem:PostLike': {} 'FeedItem:PostDelete': {} // PROFILE HEADER events - 'ProfileHeaeder:EditProfileButtonClicked': {} + 'ProfileHeader:EditProfileButtonClicked': {} 'ProfileHeader:FollowersButtonClicked': {} 'ProfileHeader:FollowsButtonClicked': {} 'ProfileHeader:ShareButtonClicked': {} @@ -58,7 +45,7 @@ export interface TrackPropertiesMap { 'ProfileHeader:ReportAccountButtonClicked': {} 'ViewHeader:MenuButtonClicked': {} // SETTINGS events - 'Settings:SwitchAccountButtonCLicked': {} + 'Settings:SwitchAccountButtonClicked': {} 'Settings:AddAccountButtonClicked': {} 'Settings:ChangeHandleButtonClicked': {} 'Settings:InvitecodesButtonClicked': {} @@ -68,13 +55,13 @@ export interface TrackPropertiesMap { 'Menu:ItemClicked': {url: string} 'Menu:FeedbackClicked': {} // MOBILE SHELL events - 'MobileShell:ProfileButtonPressed': {} - 'MobileShell:FeedButtonPressed': {} + 'MobileShell:MyProfileButtonPressed': {} + 'MobileShell:HomeButtonPressed': {} 'MobileShell:SearchButtonPressed': {} 'MobileShell:NotificationsButtonPressed': {} } -export interface ScreenPropertiesMap { +interface ScreenPropertiesMap { Login: {} CreateAccount: {} 'Choose Account': {} diff --git a/src/view/com/auth/LoggedOut.tsx b/src/view/com/auth/LoggedOut.tsx index 5d4b9451f0..e35706466d 100644 --- a/src/view/com/auth/LoggedOut.tsx +++ b/src/view/com/auth/LoggedOut.tsx @@ -7,7 +7,7 @@ import {ErrorBoundary} from 'view/com/util/ErrorBoundary' import {s} from 'lib/styles' import {usePalette} from 'lib/hooks/usePalette' import {useStores} from 'state/index' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {SplashScreen} from './SplashScreen' import {CenteredView} from '../util/Views' diff --git a/src/view/com/auth/create/CreateAccount.tsx b/src/view/com/auth/create/CreateAccount.tsx index 467b879487..612be6484e 100644 --- a/src/view/com/auth/create/CreateAccount.tsx +++ b/src/view/com/auth/create/CreateAccount.tsx @@ -8,7 +8,7 @@ import { View, } from 'react-native' import {observer} from 'mobx-react-lite' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {Text} from '../../util/text/Text' import {s, colors} from 'lib/styles' import {useStores} from 'state/index' diff --git a/src/view/com/auth/login/Login.tsx b/src/view/com/auth/login/Login.tsx index eff1642f0a..7c5b145f30 100644 --- a/src/view/com/auth/login/Login.tsx +++ b/src/view/com/auth/login/Login.tsx @@ -14,7 +14,7 @@ import { } from '@fortawesome/react-native-fontawesome' import * as EmailValidator from 'email-validator' import {BskyAgent} from '@atproto/api' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {Text} from '../../util/text/Text' import {UserAvatar} from '../../util/UserAvatar' import {s, colors} from 'lib/styles' diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 08f977f790..ffead4d234 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -14,7 +14,7 @@ import {useSafeAreaInsets} from 'react-native-safe-area-context' import LinearGradient from 'react-native-linear-gradient' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {RichText} from '@atproto/api' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {UserAutocompleteModel} from 'state/models/discovery/user-autocomplete' import {ExternalEmbed} from './ExternalEmbed' import {Text} from '../util/text/Text' diff --git a/src/view/com/composer/photos/OpenCameraBtn.tsx b/src/view/com/composer/photos/OpenCameraBtn.tsx index 809c41783b..8897394145 100644 --- a/src/view/com/composer/photos/OpenCameraBtn.tsx +++ b/src/view/com/composer/photos/OpenCameraBtn.tsx @@ -5,7 +5,7 @@ import { FontAwesomeIconStyle, } from '@fortawesome/react-native-fontawesome' import {usePalette} from 'lib/hooks/usePalette' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {useStores} from 'state/index' import {s} from 'lib/styles' import {isDesktopWeb} from 'platform/detection' diff --git a/src/view/com/composer/photos/SelectPhotoBtn.tsx b/src/view/com/composer/photos/SelectPhotoBtn.tsx index 9569e08ad0..6e5477752d 100644 --- a/src/view/com/composer/photos/SelectPhotoBtn.tsx +++ b/src/view/com/composer/photos/SelectPhotoBtn.tsx @@ -5,7 +5,7 @@ import { FontAwesomeIconStyle, } from '@fortawesome/react-native-fontawesome' import {usePalette} from 'lib/hooks/usePalette' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {s} from 'lib/styles' import {isDesktopWeb} from 'platform/detection' import {usePhotoLibraryPermission} from 'lib/hooks/usePermissions' diff --git a/src/view/com/modals/ChangeHandle.tsx b/src/view/com/modals/ChangeHandle.tsx index 37bad69573..a0c74b0dcd 100644 --- a/src/view/com/modals/ChangeHandle.tsx +++ b/src/view/com/modals/ChangeHandle.tsx @@ -18,7 +18,7 @@ import {s} from 'lib/styles' import {makeValidHandle, createFullHandle} from 'lib/strings/handles' import {usePalette} from 'lib/hooks/usePalette' import {useTheme} from 'lib/ThemeContext' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {cleanError} from 'lib/strings/errors' export const snapPoints = ['100%'] diff --git a/src/view/com/modals/EditProfile.tsx b/src/view/com/modals/EditProfile.tsx index 0feae3a800..8b1a737835 100644 --- a/src/view/com/modals/EditProfile.tsx +++ b/src/view/com/modals/EditProfile.tsx @@ -21,7 +21,7 @@ import {UserBanner} from '../util/UserBanner' import {UserAvatar} from '../util/UserAvatar' import {usePalette} from 'lib/hooks/usePalette' import {useTheme} from 'lib/ThemeContext' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {cleanError, isNetworkError} from 'lib/strings/errors' export const snapPoints = ['80%'] diff --git a/src/view/com/posts/Feed.tsx b/src/view/com/posts/Feed.tsx index bd07f9b116..23944a08ef 100644 --- a/src/view/com/posts/Feed.tsx +++ b/src/view/com/posts/Feed.tsx @@ -16,7 +16,7 @@ import {FeedSlice} from './FeedSlice' import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' import {OnScrollCb} from 'lib/hooks/useOnMainScroll' import {s} from 'lib/styles' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {usePalette} from 'lib/hooks/usePalette' const LOADING_ITEM = {_reactKey: '__loading__'} diff --git a/src/view/com/posts/FeedItem.tsx b/src/view/com/posts/FeedItem.tsx index c2baa4d4d4..983962f5ed 100644 --- a/src/view/com/posts/FeedItem.tsx +++ b/src/view/com/posts/FeedItem.tsx @@ -22,7 +22,7 @@ import {UserAvatar} from '../util/UserAvatar' import {s} from 'lib/styles' import {useStores} from 'state/index' import {usePalette} from 'lib/hooks/usePalette' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {sanitizeDisplayName} from 'lib/strings/display-names' export const FeedItem = observer(function ({ diff --git a/src/view/com/profile/ProfileHeader.tsx b/src/view/com/profile/ProfileHeader.tsx index e7597608a7..55f194d596 100644 --- a/src/view/com/profile/ProfileHeader.tsx +++ b/src/view/com/profile/ProfileHeader.tsx @@ -29,7 +29,7 @@ import {UserAvatar} from '../util/UserAvatar' import {UserBanner} from '../util/UserBanner' import {ProfileHeaderLabels} from '../util/moderation/ProfileHeaderLabels' import {usePalette} from 'lib/hooks/usePalette' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {NavigationProp} from 'lib/routes/types' import {isAndroid, isDesktopWeb, isIOS} from 'platform/detection' import {FollowState} from 'state/models/cache/my-follows' diff --git a/src/view/com/search/HeaderWithInput.tsx b/src/view/com/search/HeaderWithInput.tsx index cc0b90af75..10a5bede71 100644 --- a/src/view/com/search/HeaderWithInput.tsx +++ b/src/view/com/search/HeaderWithInput.tsx @@ -10,7 +10,7 @@ import {MagnifyingGlassIcon} from 'lib/icons' import {useTheme} from 'lib/ThemeContext' import {usePalette} from 'lib/hooks/usePalette' import {useStores} from 'state/index' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' const MENU_HITSLOP = {left: 10, top: 10, right: 30, bottom: 10} diff --git a/src/view/com/util/ViewHeader.tsx b/src/view/com/util/ViewHeader.tsx index ad0a5a1d2f..3ec475e935 100644 --- a/src/view/com/util/ViewHeader.tsx +++ b/src/view/com/util/ViewHeader.tsx @@ -8,7 +8,7 @@ import {Text} from './text/Text' import {useStores} from 'state/index' import {usePalette} from 'lib/hooks/usePalette' import {useAnimatedValue} from 'lib/hooks/useAnimatedValue' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {NavigationProp} from 'lib/routes/types' import {isDesktopWeb} from 'platform/detection' diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index ae526dea5f..4fb605e3d9 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -15,7 +15,7 @@ import {FAB} from '../com/util/fab/FAB' import {useStores} from 'state/index' import {s} from 'lib/styles' import {useOnMainScroll} from 'lib/hooks/useOnMainScroll' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {ComposeIcon2} from 'lib/icons' import {isDesktopWeb} from 'platform/detection' diff --git a/src/view/screens/Notifications.tsx b/src/view/screens/Notifications.tsx index 3e34a9fabe..ec42cf0a1d 100644 --- a/src/view/screens/Notifications.tsx +++ b/src/view/screens/Notifications.tsx @@ -14,7 +14,7 @@ import {LoadLatestBtn} from 'view/com/util/load-latest/LoadLatestBtn' import {useStores} from 'state/index' import {useOnMainScroll} from 'lib/hooks/useOnMainScroll' import {s} from 'lib/styles' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' type Props = NativeStackScreenProps< NotificationsTabNavigatorParams, diff --git a/src/view/screens/Profile.tsx b/src/view/screens/Profile.tsx index 3b4c47ce19..dbe916e4db 100644 --- a/src/view/screens/Profile.tsx +++ b/src/view/screens/Profile.tsx @@ -19,7 +19,7 @@ import {Text} from '../com/util/text/Text' import {FAB} from '../com/util/fab/FAB' import {s, colors} from 'lib/styles' import {useOnMainScroll} from 'lib/hooks/useOnMainScroll' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {ComposeIcon2} from 'lib/icons' type Props = NativeStackScreenProps diff --git a/src/view/screens/Settings.tsx b/src/view/screens/Settings.tsx index 76a3efa602..b39bb6c09d 100644 --- a/src/view/screens/Settings.tsx +++ b/src/view/screens/Settings.tsx @@ -32,7 +32,7 @@ import {DropdownButton} from 'view/com/util/forms/DropdownButton' import {usePalette} from 'lib/hooks/usePalette' import {useCustomPalette} from 'lib/hooks/useCustomPalette' import {AccountData} from 'state/models/session' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {NavigationProp} from 'lib/routes/types' import {pluralize} from 'lib/strings/helpers' diff --git a/src/view/shell/Drawer.tsx b/src/view/shell/Drawer.tsx index 7128d42132..ee9c2509b4 100644 --- a/src/view/shell/Drawer.tsx +++ b/src/view/shell/Drawer.tsx @@ -33,7 +33,7 @@ import {UserAvatar} from 'view/com/util/UserAvatar' import {Text} from 'view/com/util/text/Text' import {useTheme} from 'lib/ThemeContext' import {usePalette} from 'lib/hooks/usePalette' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {pluralize} from 'lib/strings/helpers' import {getTabState, TabState} from 'lib/routes/helpers' import {NavigationProp} from 'lib/routes/types' diff --git a/src/view/shell/bottom-bar/BottomBar.tsx b/src/view/shell/bottom-bar/BottomBar.tsx index a7d11d81d6..5ac54968f4 100644 --- a/src/view/shell/bottom-bar/BottomBar.tsx +++ b/src/view/shell/bottom-bar/BottomBar.tsx @@ -11,7 +11,7 @@ import {useSafeAreaInsets} from 'react-native-safe-area-context' import {observer} from 'mobx-react-lite' import {Text} from 'view/com/util/text/Text' import {useStores} from 'state/index' -import {useAnalytics} from 'lib/analytics' +import {useAnalytics} from 'lib/analytics/analytics' import {clamp} from 'lib/numbers' import { HomeIcon, @@ -29,6 +29,8 @@ import {styles} from './BottomBarStyles' import {useMinimalShellMode} from 'lib/hooks/useMinimalShellMode' import {useNavigationTabState} from 'lib/hooks/useNavigationTabState' +type TabOptions = 'Home' | 'Search' | 'Notifications' | 'MyProfile' + export const BottomBar = observer(({navigation}: BottomTabBarProps) => { const store = useStores() const pal = usePalette('default') @@ -40,7 +42,7 @@ export const BottomBar = observer(({navigation}: BottomTabBarProps) => { const {footerMinimalShellTransform} = useMinimalShellMode() const onPressTab = React.useCallback( - (tab: string) => { + (tab: TabOptions) => { track(`MobileShell:${tab}ButtonPressed`) const state = navigation.getState() const tabState = getTabState(state, tab)