Skip to content
Source
Sign inSign up

useOpenLinkedThread.ts

35 lines1.3 KB

1import { StackActions, useNavigation, useRoute, type Route } from "@react-navigation/native";
2import { use } from "react";
3import { linkedThreadStep } from "../../lib/android-workspace-navigation";
4import {
5 ThreadInspectorNavigationContext,
6 useOpenThreadInspector,
7} from "./thread-inspector-navigation";
8​
9export function useOpenLinkedThread() {
10 const navigation = useNavigation();
11 const route = useRoute<Route<string, { environmentId?: string; threadId?: string }>>();
12 const openInspector = useOpenThreadInspector();
13 const openInInspector = use(ThreadInspectorNavigationContext);
14 return (target: { readonly environmentId: string; readonly threadId: string }) => {
15 if (openInInspector) {
16 openInInspector({ type: "thread", ...target });
17 return;
18 }
19 const state = navigation.getState();
20 const step = state ? linkedThreadStep(state, target) : "push";
21 if (
22 step === "push" &&
23 route.name === "Thread" &&
24 route.params?.environmentId &&
25 route.params.threadId &&
26 openInspector(
27 { environmentId: route.params.environmentId, threadId: route.params.threadId },
28 { type: "thread", ...target },
29 )
30 )
31 return;
32 if (step === "pop") navigation.dispatch(StackActions.pop());
33 else if (step === "push") navigation.dispatch(StackActions.push("Thread", target));
34 };