Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions app/components/UI/Ramp/Deposit/Views/Root/Root.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,12 @@ describe('Root Component', () => {
expect(screen.toJSON()).toMatchSnapshot();
});

it('redirects to BUILD_QUOTE immediately when no created orders exist', async () => {
it('redirects to BUILD_QUOTE when no created orders exist after hydrating stored token', async () => {
mockCheckExistingToken.mockResolvedValue(false);
render(Root);
await waitFor(() => {
expect(mockCheckExistingToken).toHaveBeenCalled();
});
await waitFor(() => {
expect(mockReset).toHaveBeenCalledWith({
index: 0,
Expand All @@ -100,7 +104,6 @@ describe('Root Component', () => {
],
});
});
expect(mockCheckExistingToken).not.toHaveBeenCalled();
});

it('calls checkExistingToken when a created order exists', async () => {
Expand Down
58 changes: 34 additions & 24 deletions app/components/UI/Ramp/Deposit/Views/Root/Root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,19 +64,15 @@ const Root = () => {
};

const initializeFlow = async () => {
if (hasCheckedToken.current) return;
hasCheckedToken.current = true;

const createdOrder = orders.find(
(order) => order.state === FIAT_ORDER_STATES.CREATED,
);

if (!createdOrder) {
navigateToDefaultRoute();
// 1. If token has already been checked, do not run again.
if (hasCheckedToken.current) {
return;
}

// 2. Default until vault / SDK hydration succeeds.
let isAuthenticatedFromToken = false;

// 3. Attempt to restore auth from stored token; mark checked after the attempt finishes.
try {
isAuthenticatedFromToken = await withTimeout(
checkExistingToken(),
Expand All @@ -87,11 +83,35 @@ const Root = () => {
error as Error,
'Deposit Root: checkExistingToken failed or timed out',
);
} finally {
hasCheckedToken.current = true;
}

if (!isAuthenticatedFromToken) {
const [routeName, navParams] = createEnterEmailNavDetails({
redirectToRootAfterAuth: true,
// 4. Resume in-progress deposit order if any.
const createdOrder = orders.find(
(order) => order.state === FIAT_ORDER_STATES.CREATED,
);

// 5. Created order: require auth or continue to bank details.
if (createdOrder) {
if (!isAuthenticatedFromToken) {
const [routeName, navParams] = createEnterEmailNavDetails({
redirectToRootAfterAuth: true,
});
navigation.reset({
index: 0,
routes: [
{
name: routeName,
params: { ...navParams, animationEnabled: false },
},
],
});
return;
}

const [routeName, navParams] = createBankDetailsNavDetails({
orderId: createdOrder.id,
});
navigation.reset({
index: 0,
Expand All @@ -105,18 +125,8 @@ const Root = () => {
return;
}

const [routeName, navParams] = createBankDetailsNavDetails({
orderId: createdOrder.id,
});
navigation.reset({
index: 0,
routes: [
{
name: routeName,
params: { ...navParams, animationEnabled: false },
},
],
});
// 6. No created order: default entry (Build Quote); honor deeplink / intent flags when present.
navigateToDefaultRoute();
};

initializeFlow().catch((error) => {
Expand Down
Loading