Skip to content
Source
Sign inSign up

usePullRequestStack.ts

49 lines2.0 KB

1import { threadPullRequestLinkMode } from "@t3tools/client-runtime/thread-pull-request-compatibility";
2import type { PullRequestDetail } from "@t3tools/contracts";
3import { sourceControlClients } from "@t3tools/client-runtime/source-control-clients";
4import { useMemo } from "react";
5import { useEnvironmentServerConfig, useNavigationThreadShells } from "../../state/entities";
6import { pullRequestStackAtom } from "../../state/pull-requests";
7import { useEnvironmentQuery } from "../../state/query";
8import { savedPullRequestStack } from "./pullRequestStack";
9import { pullRequestTarget, type PullRequestParams } from "./usePullRequestDiff";
10​
11export function usePullRequestStack(params: PullRequestParams, pr: PullRequestDetail | null) {
12 const target = pullRequestTarget(params);
13 const config = useEnvironmentServerConfig(target.environmentId);
14 const threads = useNavigationThreadShells();
15 const supported =
16 threadPullRequestLinkMode(config?.environment.capabilities) === "multiple" &&
17 pr?.capabilities.stacks === true;
18 const reference = useMemo(
19 () => ({
20 ...pullRequestTarget(params).input,
21 host:
22 params.host ??
23 (pr ? sourceControlClients.parseChangeRequestUrl(pr.url)?.link.host : undefined),
24 }),
25 [params, pr],
26 );
27 const saved = useMemo(
28 () =>
29 savedPullRequestStack(
30 threads
31 .filter((thread) => thread.environmentId === target.environmentId)
32 .flatMap((thread) => thread.pullRequests ?? []),
33 reference,
34 ),
35 [threads, target.environmentId, reference],
36 );
37 const query = useEnvironmentQuery(
38 supported ? pullRequestStackAtom({ ...target, input: reference }) : null,
39 );
40 const stack = query.isSuccess ? query.data : (query.data ?? saved);
41 return {
42 ...query,
43 stack,
44 isFresh: supported && query.isSuccess && !query.isPending,
45 supportsStackActions: supported && pr?.capabilities.stackActions === true,
46 };
48​
49export type PullRequestStackState = ReturnType<typeof usePullRequestStack>;