1import {
2 CommonActions,
3 StackActions,
4 useFocusEffect,
5 useNavigation,
6} from "@react-navigation/native";
7import { useCallback } from "react";
8import { BackHandler, Keyboard, Platform } from "react-native";
9import { androidWorkspaceNavigationState } from "../../lib/android-workspace-navigation";
10import { useWorkspaceTabs } from "./WorkspaceTabsContext";
11import type { WorkspaceTab } from "./workspace-tabs-state";
12
13export function useWorkspaceListNavigation(tab: WorkspaceTab) {
14 const navigation = useNavigation();
15 const dispatch = useWorkspaceTabs()?.dispatch;
16 return useCallback(() => {
17 if (Platform.OS === "android") {
18 dispatch?.({ type: "select", tab });
19 navigation.dispatch((state) => CommonActions.reset(androidWorkspaceNavigationState(state)));
20 } else if (navigation.canGoBack()) navigation.goBack();
21 else navigation.dispatch(StackActions.replace("Home"));
22 }, [navigation, dispatch, tab]);
23}
24
25/** Only base details own this Back handler; focused sheets and nested screens take priority. */
26export function useAndroidWorkspaceBack(tab: WorkspaceTab) {
27 const dispatch = useWorkspaceTabs()?.dispatch;
28 const returnToList = useWorkspaceListNavigation(tab);
29 useFocusEffect(
30 useCallback(() => {
31 if (Platform.OS !== "android") return;
32 dispatch?.({ type: "select", tab });
33 const subscription = BackHandler.addEventListener("hardwareBackPress", () => {
34 if (Keyboard.isVisible()) Keyboard.dismiss();
35 else returnToList();
36 return true;
37 });
38 return () => subscription.remove();
39 }, [returnToList, dispatch, tab]),
40 );
41 return returnToList;
42}