Enable gating and experimentation on native, send init event (#3149)

* Add the mobile fork

* Add init event
zio/stable
dan 2024-03-08 04:33:42 +00:00 committed by GitHub
parent 31826633cb
commit dd86d0964d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 74 additions and 6 deletions

View File

@ -78,6 +78,7 @@ import {createNativeStackNavigatorWithAuth} from './view/shell/createNativeStack
import {msg} from '@lingui/macro' import {msg} from '@lingui/macro'
import {i18n, MessageDescriptor} from '@lingui/core' import {i18n, MessageDescriptor} from '@lingui/core'
import HashtagScreen from '#/screens/Hashtag' import HashtagScreen from '#/screens/Hashtag'
import {logEvent} from './lib/statsig/statsig'
const navigationRef = createNavigationContainerRef<AllNavigatorParams>() const navigationRef = createNavigationContainerRef<AllNavigatorParams>()
@ -649,11 +650,14 @@ function logModuleInitTime() {
return return
} }
didInit = true didInit = true
const initMs = Math.round( const initMs = Math.round(
// @ts-ignore Emitted by Metro in the bundle prelude // @ts-ignore Emitted by Metro in the bundle prelude
performance.now() - global.__BUNDLE_START_TIME__, performance.now() - global.__BUNDLE_START_TIME__,
) )
console.log(`Time to first paint: ${initMs} ms`) console.log(`Time to first paint: ${initMs} ms`)
logEvent('init', initMs)
if (__DEV__) { if (__DEV__) {
// This log is noisy, so keep false committed // This log is noisy, so keep false committed
const shouldLog = false const shouldLog = false

View File

@ -1,11 +1,63 @@
import React from 'react' import React from 'react'
import {
Statsig,
StatsigProvider,
useGate as useStatsigGate,
} from 'statsig-react-native-expo'
import {useSession} from '../../state/session'
import {sha256} from 'js-sha256'
export function useGate(_gateName: string) { const statsigOptions = {
// Not enabled for native yet. environment: {
return false tier: process.env.NODE_ENV === 'development' ? 'development' : 'production',
},
// Don't block on waiting for network. The fetched config will kick in on next load.
// This ensures the UI is always consistent and doesn't update mid-session.
// Note this makes cold load (no local storage) and private mode return `false` for all gates.
initTimeoutMs: 1,
}
export function logEvent(
eventName: string,
value?: string | number | null,
metadata?: Record<string, string> | null,
) {
Statsig.logEvent(eventName, value, metadata)
}
export function useGate(gateName: string) {
const {isLoading, value} = useStatsigGate(gateName)
if (isLoading) {
// This should not happen because of waitForInitialization={true}.
console.error('Did not expected isLoading to ever be true.')
}
return value
}
function toStatsigUser(did: string | undefined) {
let userID: string | undefined
if (did) {
userID = sha256(did)
}
return {userID}
} }
export function Provider({children}: {children: React.ReactNode}) { export function Provider({children}: {children: React.ReactNode}) {
// Not enabled for native yet. const {currentAccount} = useSession()
return children const currentStatsigUser = React.useMemo(
() => toStatsigUser(currentAccount?.did),
[currentAccount?.did],
)
return (
<StatsigProvider
sdkKey="client-SXJakO39w9vIhl3D44u8UupyzFl4oZ2qPIkjwcvuPsV"
mountKey={currentStatsigUser.userID}
user={currentStatsigUser}
// This isn't really blocking due to short initTimeoutMs above.
// However, it ensures `isLoading` is always `false`.
waitForInitialization={true}
options={statsigOptions}>
{children}
</StatsigProvider>
)
} }

View File

@ -1,5 +1,9 @@
import React from 'react' import React from 'react'
import {StatsigProvider, useGate as useStatsigGate} from 'statsig-react' import {
Statsig,
StatsigProvider,
useGate as useStatsigGate,
} from 'statsig-react'
import {useSession} from '../../state/session' import {useSession} from '../../state/session'
import {sha256} from 'js-sha256' import {sha256} from 'js-sha256'
@ -13,6 +17,14 @@ const statsigOptions = {
initTimeoutMs: 1, initTimeoutMs: 1,
} }
export function logEvent(
eventName: string,
value?: string | number | null,
metadata?: Record<string, string> | null,
) {
Statsig.logEvent(eventName, value, metadata)
}
export function useGate(gateName: string) { export function useGate(gateName: string) {
const {isLoading, value} = useStatsigGate(gateName) const {isLoading, value} = useStatsigGate(gateName)
if (isLoading) { if (isLoading) {