From 663656a0905f6f5cf4aafdc687ad4a89412b946d Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 8 Dec 2025 15:27:10 +0200 Subject: [PATCH] lift state up to allow going back freely --- src/components/contacts/FindContactsFlow.tsx | 2 +- .../Onboarding/StepFindContacts/index.tsx | 33 +++++++++++++------ src/screens/Onboarding/index.tsx | 7 +++- src/screens/Onboarding/state.ts | 8 +---- 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/components/contacts/FindContactsFlow.tsx b/src/components/contacts/FindContactsFlow.tsx index 68f969f975..6cd424b6cb 100644 --- a/src/components/contacts/FindContactsFlow.tsx +++ b/src/components/contacts/FindContactsFlow.tsx @@ -12,7 +12,7 @@ export function FindContactsFlow({ context = 'Standalone', }: { state: State - dispatch: React.Dispatch + dispatch: React.ActionDispatch<[Action]> onBack?: () => void onCancel: () => void context: 'Onboarding' | 'Standalone' diff --git a/src/screens/Onboarding/StepFindContacts/index.tsx b/src/screens/Onboarding/StepFindContacts/index.tsx index 001fd6010b..0f4aaff12a 100644 --- a/src/screens/Onboarding/StepFindContacts/index.tsx +++ b/src/screens/Onboarding/StepFindContacts/index.tsx @@ -1,37 +1,50 @@ -import {useCallback} from 'react' +import {useCallback, useState} from 'react' import {LayoutAnimationConfig} from 'react-native-reanimated' import {SafeAreaView} from 'react-native-safe-area-context' import {FindContactsFlow} from '#/components/contacts/FindContactsFlow' -import {useFindContactsFlowState} from '#/components/contacts/state' +import {type Action, type State} from '#/components/contacts/state' import {ScreenTransition} from '#/components/ScreenTransition' import {useOnboardingInternalState} from '../state' -export function StepFindContacts() { - const [fcfState, fcfDispatch] = useFindContactsFlowState() +export function StepFindContacts({ + flowState, + flowDispatch, +}: { + flowState: State + flowDispatch: React.ActionDispatch<[Action]> +}) { const {dispatch} = useOnboardingInternalState() + const [transitionDirection, setTransitionDirection] = useState< + 'Forward' | 'Backward' + >('Forward') + const onSkip = useCallback(() => { dispatch({type: 'next'}) }, [dispatch]) - const canGoBack = fcfState.step === '2: verify number' + const canGoBack = flowState.step === '2: verify number' const onBack = useCallback(() => { if (canGoBack) { - fcfDispatch({type: 'BACK'}) + setTransitionDirection('Backward') + flowDispatch({type: 'BACK'}) + setTimeout(() => { + setTransitionDirection('Forward') + }) } else { dispatch({type: 'prev'}) } - }, [dispatch, fcfDispatch, canGoBack]) + }, [dispatch, flowDispatch, canGoBack]) return ( - + diff --git a/src/screens/Onboarding/index.tsx b/src/screens/Onboarding/index.tsx index ed9f43ec06..676d4d98ea 100644 --- a/src/screens/Onboarding/index.tsx +++ b/src/screens/Onboarding/index.tsx @@ -20,6 +20,7 @@ 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 {useFindContactsFlowState} from '#/components/contacts/state' import {Portal} from '#/components/Portal' import {ScreenTransition} from '#/components/ScreenTransition' import {ENV} from '#/env' @@ -54,6 +55,7 @@ export function Onboarding() { }, createInitialOnboardingState, ) + const [contactsFlowState, contactsFlowDispatch] = useFindContactsFlowState() useEnableKeyboardControllerScreen(true) @@ -70,7 +72,10 @@ export function Onboarding() { style={a.flex_1}> {/* FindContactsFlow cannot be nested in Layout */} {state.activeStep === 'find-contacts' ? ( - + ) : ( {state.activeStep === 'profile' && } diff --git a/src/screens/Onboarding/state.ts b/src/screens/Onboarding/state.ts index 02a4f8a71f..8d66a6d270 100644 --- a/src/screens/Onboarding/state.ts +++ b/src/screens/Onboarding/state.ts @@ -135,13 +135,7 @@ export function reducer( const prevIndex = stepOrder.indexOf(next.activeStep) - 1 const prevStep = stepOrder[prevIndex] if (prevStep) { - // override back behaviour for the find contacts screen - // so returning to the flow takes you to the intro screen - if (prevStep === 'find-contacts') { - next.activeStep = 'find-contacts-intro' - } else { - next.activeStep = prevStep - } + next.activeStep = prevStep } next.stepTransitionDirection = 'Backward' break