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