Enable gating and experimentation on native, send init event (#3149)
* Add the mobile fork * Add init eventzio/stable
parent
31826633cb
commit
dd86d0964d
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue