| 1 | import type { ThreadPullRequestLink } from "@t3tools/contracts"; |
| 2 | |
| 3 | import { resolveThreadCurrentPullRequestLink } from "./threadPullRequests.ts"; |
| 4 | |
| 5 | export interface ThreadReferenceCopyTarget { |
| 6 | readonly kind: "pull-request" | "thread"; |
| 7 | readonly value: string; |
| 8 | readonly clipboardTarget: string; |
| 9 | readonly successTitle: string; |
| 10 | readonly failureTitle: string; |
| 11 | } |
| 12 | |
| 13 | export function resolveThreadReferenceCopyTarget(input: { |
| 14 | readonly threadId: string; |
| 15 | /** Undefined means no PR panel; null means its URL is not available yet. */ |
| 16 | readonly openPanelPullRequestUrl?: string | null | undefined; |
| 17 | readonly pullRequests?: ReadonlyArray<ThreadPullRequestLink> | undefined; |
| 18 | readonly linkedPullRequestUrl?: string | null; |
| 19 | }): ThreadReferenceCopyTarget | null { |
| 20 | if (input.openPanelPullRequestUrl === null) return null; |
| 21 | const pullRequestUrl = |
| 22 | input.openPanelPullRequestUrl ?? |
| 23 | resolveThreadCurrentPullRequestLink(input.pullRequests ?? [])?.url ?? |
| 24 | input.linkedPullRequestUrl; |
| 25 | return pullRequestUrl |
| 26 | ? { |
| 27 | kind: "pull-request", |
| 28 | value: pullRequestUrl, |
| 29 | clipboardTarget: "pull request link", |
| 30 | successTitle: "PR link copied", |
| 31 | failureTitle: "Failed to copy PR link", |
| 32 | } |
| 33 | : { |
| 34 | kind: "thread", |
| 35 | value: input.threadId, |
| 36 | clipboardTarget: "thread ID", |
| 37 | successTitle: "Thread ID copied", |
| 38 | failureTitle: "Failed to copy thread ID", |
| 39 | }; |
| 40 | } |