25a1ed1209
* WIP * Clean up growthbook code, integrate into init and sessions * Move everything out of React * Add metrics client * Move to separate file * Shared metadata cache * Ensure we update metadata when session ID changes * Ensure userMetadata is cleared when logging out * WIP revamp * Integrate feature gates into analytics context * Clean up old code * Fix useMeta util * Some comments and cleanup * Add logger to base analytics context * Refactor current route handling * Rip out LogEvent from navigation * Update tracking endpoint * Migrate toClout * Clear out statsig client * Add todo, reset logger readme * Ope fix statsig noop * Refactor logging in feed-feedback, add debug logging to metrics client * Remove LogEvents alias for Metrics * Prefer root package export * Remove Metrics alias from logger * [APP-1782] Migrate to new analytics APIs (#9735) * Migrate logEvent to useAnalytics * Migrate logger.metric to useAnalytics * Migrate tricky spot, fix types * Migrate remaining tricky spot * Missed one * Remove metric() from logger * Migrate useGate to useAnalytics * Remove all other StatSig mentions * Update event payload * Update logger tests * Mock expo method * Fix session ID bug * Add session ID test * Add test for metrics client * Clarify intent * Clean up core analytics file * Clean up the call once utils * Fix TODO * Fix TODO * Fix TODO * Fix TODO * Fix TODO * Remove debug code * Fix navigation context * OK nav context is not working, todo * Checkpoint: works but feels hacky * Fix navigation context issue * Improve feature API * Improve metric logging * Update logger tests
106 lines
3.9 KiB
TypeScript
106 lines
3.9 KiB
TypeScript
import {useMemo, useReducer} from 'react'
|
|
import {View} from 'react-native'
|
|
import * as bcp47Match from 'bcp-47-match'
|
|
|
|
import {useEnableKeyboardControllerScreen} from '#/lib/hooks/useEnableKeyboardController'
|
|
import {useLanguagePrefs} from '#/state/preferences'
|
|
import {
|
|
Layout,
|
|
OnboardingControls,
|
|
OnboardingHeaderSlot,
|
|
} from '#/screens/Onboarding/Layout'
|
|
import {
|
|
Context,
|
|
createInitialOnboardingState,
|
|
reducer,
|
|
} from '#/screens/Onboarding/state'
|
|
import {StepFinished} from '#/screens/Onboarding/StepFinished'
|
|
import {StepInterests} from '#/screens/Onboarding/StepInterests'
|
|
import {StepProfile} from '#/screens/Onboarding/StepProfile'
|
|
import {atoms as a, useTheme} from '#/alf'
|
|
import {useIsFindContactsFeatureEnabledBasedOnGeolocation} from '#/components/contacts/country-allowlist'
|
|
import {useFindContactsFlowState} from '#/components/contacts/state'
|
|
import {Portal} from '#/components/Portal'
|
|
import {ScreenTransition} from '#/components/ScreenTransition'
|
|
import {useAnalytics} from '#/analytics'
|
|
import {ENV, IS_NATIVE} from '#/env'
|
|
import {StepFindContacts} from './StepFindContacts'
|
|
import {StepFindContactsIntro} from './StepFindContactsIntro'
|
|
import {StepSuggestedAccounts} from './StepSuggestedAccounts'
|
|
import {StepSuggestedStarterpacks} from './StepSuggestedStarterpacks'
|
|
|
|
export function Onboarding() {
|
|
const t = useTheme()
|
|
const ax = useAnalytics()
|
|
|
|
const {contentLanguages} = useLanguagePrefs()
|
|
const probablySpeaksEnglish = useMemo(() => {
|
|
if (contentLanguages.length === 0) return true
|
|
return bcp47Match.basicFilter('en', contentLanguages).length > 0
|
|
}, [contentLanguages])
|
|
|
|
// starter packs screen is currently geared towards english-speaking accounts
|
|
const showSuggestedStarterpacks = ENV !== 'e2e' && probablySpeaksEnglish
|
|
|
|
const findContactsEnabled =
|
|
useIsFindContactsFeatureEnabledBasedOnGeolocation()
|
|
const showFindContacts =
|
|
ENV !== 'e2e' &&
|
|
IS_NATIVE &&
|
|
findContactsEnabled &&
|
|
!ax.features.enabled(ax.features.DisableOnboardingFindContacts)
|
|
|
|
const [state, dispatch] = useReducer(
|
|
reducer,
|
|
{
|
|
starterPacksStepEnabled: showSuggestedStarterpacks,
|
|
findContactsStepEnabled: showFindContacts,
|
|
},
|
|
createInitialOnboardingState,
|
|
)
|
|
const [contactsFlowState, contactsFlowDispatch] = useFindContactsFlowState()
|
|
|
|
useEnableKeyboardControllerScreen(true)
|
|
|
|
return (
|
|
<Portal>
|
|
<View style={[a.absolute, a.inset_0, t.atoms.bg]}>
|
|
<OnboardingControls.Provider>
|
|
<OnboardingHeaderSlot.Provider>
|
|
<Context.Provider
|
|
value={useMemo(() => ({state, dispatch}), [state, dispatch])}>
|
|
<ScreenTransition
|
|
key={state.activeStep}
|
|
direction={state.stepTransitionDirection}
|
|
style={a.flex_1}>
|
|
{/* FindContactsFlow cannot be nested in Layout */}
|
|
{state.activeStep === 'find-contacts' ? (
|
|
<StepFindContacts
|
|
flowState={contactsFlowState}
|
|
flowDispatch={contactsFlowDispatch}
|
|
/>
|
|
) : (
|
|
<Layout>
|
|
{state.activeStep === 'profile' && <StepProfile />}
|
|
{state.activeStep === 'interests' && <StepInterests />}
|
|
{state.activeStep === 'suggested-accounts' && (
|
|
<StepSuggestedAccounts />
|
|
)}
|
|
{state.activeStep === 'suggested-starterpacks' && (
|
|
<StepSuggestedStarterpacks />
|
|
)}
|
|
{state.activeStep === 'find-contacts-intro' && (
|
|
<StepFindContactsIntro />
|
|
)}
|
|
{state.activeStep === 'finished' && <StepFinished />}
|
|
</Layout>
|
|
)}
|
|
</ScreenTransition>
|
|
</Context.Provider>
|
|
</OnboardingHeaderSlot.Provider>
|
|
</OnboardingControls.Provider>
|
|
</View>
|
|
</Portal>
|
|
)
|
|
}
|