Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
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
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { requireNativeView } from "expo";
import { CommonActions, useNavigation } from "@react-navigation/native";
import { useNavigation } from "@react-navigation/native";
import { androidWorkspaceNavigationState } from "../../lib/android-workspace-navigation";
import {
Keyboard,
Expand All @@ -16,6 +16,7 @@ import { androidWorkspaceNavigationColors } from "./android-workspace-navigation
import { useAppearancePreferences } from "../settings/appearance/AppearancePreferencesProvider";
import { useWorkspaceTabs } from "./WorkspaceTabsContext";
import type { WorkspaceTab } from "./workspace-tabs-state";
import { resetAndroidWorkspace } from "./useAndroidWorkspaceSelection";

export const ANDROID_WORKSPACE_RAIL_WIDTH = 80;

Expand Down Expand Up @@ -81,9 +82,7 @@ export function AndroidWorkspaceNavigation(props: {
const tab = event.nativeEvent.tab;
if (tab !== workspace.state.selectedTab) {
workspace.dispatch({ type: "select", tab });
navigation.dispatch((state) =>
CommonActions.reset(androidWorkspaceNavigationState(state)),
);
resetAndroidWorkspace(navigation, (state) => androidWorkspaceNavigationState(state));
}
props.onSelect?.();
}}
Expand Down
32 changes: 29 additions & 3 deletions apps/mobile/src/features/workspace/useAndroidWorkspaceSelection.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import { CommonActions, useNavigation } from "@react-navigation/native";
import {
CommonActions,
useNavigation,
type NavigationAction,
type NavigationState,
} from "@react-navigation/native";
import { useCallback } from "react";
import { Keyboard } from "react-native";
import {
Expand All @@ -7,6 +12,27 @@ import {
} from "../../lib/android-workspace-navigation";
import { useWorkspaceTabs } from "./WorkspaceTabsContext";

/**
* The sidebar and navigation rail sit in the root layout, where a state-callback dispatch goes
* to the focused navigator. While a nested flow such as New thread has focus, that navigator has
* no Home or Thread route and drops the reset, so address the root stack by its key.
*/
interface WorkspaceNavigation {
getParent(): WorkspaceNavigation | undefined;
getState(): NavigationState | undefined;
dispatch(action: NavigationAction): void;
}

export function resetAndroidWorkspace(
navigation: WorkspaceNavigation,
next: (state: NavigationState) => Parameters<typeof CommonActions.reset>[0],
) {
let root = navigation;
for (let parent = root.getParent(); parent; parent = parent.getParent()) root = parent;
const state = root.getState();
if (state) root.dispatch({ ...CommonActions.reset(next(state)), target: state.key });
}

export function useAndroidWorkspaceSelection() {
const navigation = useNavigation();
const dispatch = useWorkspaceTabs()?.dispatch;
Expand All @@ -20,8 +46,8 @@ export function useAndroidWorkspaceSelection() {
type: "select",
tab: destination.name === "Thread" ? "threads" : "pullRequests",
});
navigation.dispatch((state) =>
CommonActions.reset(androidWorkspaceNavigationState(state, destination, reviewers)),
resetAndroidWorkspace(navigation, (state) =>
androidWorkspaceNavigationState(state, destination, reviewers),
);
},
[navigation, dispatch],
Expand Down
Loading